@schlessera/brain-ui-react 0.20.0 → 0.23.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/dist/components/activity/activity-page.d.ts.map +1 -1
- package/dist/components/activity/activity-page.js +49 -10
- package/dist/components/activity/activity-page.js.map +1 -1
- package/dist/components/activity/span-bits.d.ts +30 -3
- package/dist/components/activity/span-bits.d.ts.map +1 -1
- package/dist/components/activity/span-bits.js +59 -6
- package/dist/components/activity/span-bits.js.map +1 -1
- package/dist/components/chat/renderers/claude-tools.d.ts.map +1 -1
- package/dist/components/chat/renderers/claude-tools.js +21 -1
- package/dist/components/chat/renderers/claude-tools.js.map +1 -1
- package/dist/components/chat/renderers/index.d.ts.map +1 -1
- package/dist/components/chat/renderers/index.js +2 -0
- package/dist/components/chat/renderers/index.js.map +1 -1
- package/dist/components/chat/renderers/pi-tools.d.ts +3 -0
- package/dist/components/chat/renderers/pi-tools.d.ts.map +1 -0
- package/dist/components/chat/renderers/pi-tools.js +112 -0
- package/dist/components/chat/renderers/pi-tools.js.map +1 -0
- package/dist/components/chat/risk-hints.d.ts +14 -2
- package/dist/components/chat/risk-hints.d.ts.map +1 -1
- package/dist/components/chat/risk-hints.js +54 -19
- package/dist/components/chat/risk-hints.js.map +1 -1
- package/dist/components/chat/tool-call-timeline.d.ts +1 -1
- package/dist/components/chat/tool-call-timeline.d.ts.map +1 -1
- package/dist/components/chat/tool-call-timeline.js +25 -14
- package/dist/components/chat/tool-call-timeline.js.map +1 -1
- package/dist/components/settings/models-tab.d.ts.map +1 -1
- package/dist/components/settings/models-tab.js +2 -1
- package/dist/components/settings/models-tab.js.map +1 -1
- package/dist/components/settings/pi-accounts.d.ts +13 -0
- package/dist/components/settings/pi-accounts.d.ts.map +1 -0
- package/dist/components/settings/pi-accounts.js +146 -0
- package/dist/components/settings/pi-accounts.js.map +1 -0
- package/dist/hooks/use-websocket.d.ts.map +1 -1
- package/dist/hooks/use-websocket.js +26 -2
- package/dist/hooks/use-websocket.js.map +1 -1
- package/dist/lib/api-client.d.ts +42 -0
- package/dist/lib/api-client.d.ts.map +1 -1
- package/dist/lib/api-client.js +18 -0
- package/dist/lib/api-client.js.map +1 -1
- package/dist/lib/tool-names.d.ts.map +1 -1
- package/dist/lib/tool-names.js +5 -1
- package/dist/lib/tool-names.js.map +1 -1
- package/dist/stores/activity-store.d.ts +10 -0
- package/dist/stores/activity-store.d.ts.map +1 -1
- package/dist/stores/activity-store.js +34 -1
- package/dist/stores/activity-store.js.map +1 -1
- package/dist/stores/chat-store.d.ts +8 -0
- package/dist/stores/chat-store.d.ts.map +1 -1
- package/dist/stores/chat-store.js +4 -0
- package/dist/stores/chat-store.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +2 -2
- package/src/components/activity/activity-page.tsx +168 -21
- package/src/components/activity/span-bits.tsx +74 -17
- package/src/components/chat/renderers/claude-tools.tsx +32 -1
- package/src/components/chat/renderers/index.ts +2 -0
- package/src/components/chat/renderers/pi-tools.tsx +144 -0
- package/src/components/chat/risk-hints.ts +73 -25
- package/src/components/chat/tool-call-timeline.tsx +57 -16
- package/src/components/settings/models-tab.tsx +3 -0
- package/src/components/settings/pi-accounts.tsx +258 -0
- package/src/hooks/use-websocket.ts +29 -2
- package/src/lib/api-client.ts +52 -0
- package/src/lib/tool-names.ts +6 -1
- package/src/stores/activity-store.ts +36 -3
- package/src/stores/chat-store.ts +16 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pi-tools.js","sourceRoot":"","sources":["../../../../src/components/chat/renderers/pi-tools.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { ToolSemantics } from "@schlessera/brain-ui-sdk/client";
|
|
1
2
|
import type { ToolCall } from "../../stores/chat-store.js";
|
|
2
3
|
/**
|
|
3
4
|
* Does this path resolve inside the brain repo?
|
|
@@ -10,11 +11,22 @@ import type { ToolCall } from "../../stores/chat-store.js";
|
|
|
10
11
|
* (`~/brain`).
|
|
11
12
|
*/
|
|
12
13
|
export declare function isInsideBrainRepo(path: string): boolean;
|
|
14
|
+
/** The extracted, plain-value meaning risk rules test against. */
|
|
15
|
+
export type ResolvedSemantics = {
|
|
16
|
+
/** Shell command line the call executes, or "". */
|
|
17
|
+
command: string;
|
|
18
|
+
/** Filesystem path the call writes, or "". */
|
|
19
|
+
writePath: string;
|
|
20
|
+
/** Call explicitly opts out of its backend's sandbox. */
|
|
21
|
+
unsandboxed: boolean;
|
|
22
|
+
};
|
|
23
|
+
/** Evaluate a renderer's semantics accessors (each optional) for one call. */
|
|
24
|
+
export declare function resolveSemantics(tool: ToolCall, semantics?: ToolSemantics): ResolvedSemantics;
|
|
13
25
|
export type RiskRule = {
|
|
14
|
-
test: (
|
|
26
|
+
test: (sem: ResolvedSemantics) => boolean;
|
|
15
27
|
message: string;
|
|
16
28
|
};
|
|
17
29
|
export declare const RISK_RULES: RiskRule[];
|
|
18
30
|
/** Advisory messages for every risk rule that fires. Never throws. */
|
|
19
|
-
export declare function riskHints(tool: ToolCall): string[];
|
|
31
|
+
export declare function riskHints(tool: ToolCall, semantics?: ToolSemantics): string[];
|
|
20
32
|
//# sourceMappingURL=risk-hints.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"risk-hints.d.ts","sourceRoot":"","sources":["../../../src/components/chat/risk-hints.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"risk-hints.d.ts","sourceRoot":"","sources":["../../../src/components/chat/risk-hints.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAY3D;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAOvD;AAMD,kEAAkE;AAClE,MAAM,MAAM,iBAAiB,GAAG;IAC9B,mDAAmD;IACnD,OAAO,EAAE,MAAM,CAAC;IAChB,8CAA8C;IAC9C,SAAS,EAAE,MAAM,CAAC;IAClB,yDAAyD;IACzD,WAAW,EAAE,OAAO,CAAC;CACtB,CAAC;AAwBF,8EAA8E;AAC9E,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,QAAQ,EACd,SAAS,CAAC,EAAE,aAAa,GACxB,iBAAiB,CAYnB;AAED,MAAM,MAAM,QAAQ,GAAG;IACrB,IAAI,EAAE,CAAC,GAAG,EAAE,iBAAiB,KAAK,OAAO,CAAC;IAC1C,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,QAAQ,EA+BhC,CAAC;AAEF,sEAAsE;AACtE,wBAAgB,SAAS,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,CAAC,EAAE,aAAa,GAAG,MAAM,EAAE,CAiB7E"}
|
|
@@ -4,7 +4,9 @@
|
|
|
4
4
|
//
|
|
5
5
|
// Non-blocking advisories surfaced in the pending-approval detail so a human
|
|
6
6
|
// notices known-risky shapes before hitting Allow. Detection only — the human
|
|
7
|
-
// still decides.
|
|
7
|
+
// still decides. Rules test backend-neutral SEMANTICS (the command line run,
|
|
8
|
+
// the path written), supplied by the tool's renderer, so a rule written once
|
|
9
|
+
// covers Claude's `Bash`, pi's `bash`, and any future backend's equivalent.
|
|
8
10
|
/**
|
|
9
11
|
* Does this path resolve inside the brain repo?
|
|
10
12
|
*
|
|
@@ -27,53 +29,86 @@ export function isInsideBrainRepo(path) {
|
|
|
27
29
|
function asString(v) {
|
|
28
30
|
return typeof v === "string" ? v : "";
|
|
29
31
|
}
|
|
32
|
+
/**
|
|
33
|
+
* Shape-sniffing fallback for renderers that declare no semantics, so an
|
|
34
|
+
* unknown tool with a recognizable input still gets its advisories.
|
|
35
|
+
*/
|
|
36
|
+
function sniffSemantics(tool) {
|
|
37
|
+
const input = tool.input ?? {};
|
|
38
|
+
const writeSignal = "content" in input ||
|
|
39
|
+
"old_string" in input ||
|
|
40
|
+
"new_string" in input ||
|
|
41
|
+
"new_source" in input;
|
|
42
|
+
return {
|
|
43
|
+
command: asString(input.command) || asString(input.cmd),
|
|
44
|
+
writePath: writeSignal
|
|
45
|
+
? asString(input.file_path) ||
|
|
46
|
+
asString(input.notebook_path) ||
|
|
47
|
+
asString(input.path)
|
|
48
|
+
: "",
|
|
49
|
+
unsandboxed: Boolean(input.dangerouslyDisableSandbox),
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
/** Evaluate a renderer's semantics accessors (each optional) for one call. */
|
|
53
|
+
export function resolveSemantics(tool, semantics) {
|
|
54
|
+
const sniffed = sniffSemantics(tool);
|
|
55
|
+
if (!semantics)
|
|
56
|
+
return sniffed;
|
|
57
|
+
return {
|
|
58
|
+
command: semantics.command ? semantics.command(tool) ?? "" : sniffed.command,
|
|
59
|
+
writePath: semantics.writePath
|
|
60
|
+
? semantics.writePath(tool) ?? ""
|
|
61
|
+
: sniffed.writePath,
|
|
62
|
+
unsandboxed: semantics.unsandboxed
|
|
63
|
+
? semantics.unsandboxed(tool)
|
|
64
|
+
: sniffed.unsandboxed,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
30
67
|
export const RISK_RULES = [
|
|
31
68
|
{
|
|
32
69
|
// Note: the Bash input view already badges this red, so this line is
|
|
33
70
|
// secondary. Kept for consistency so the advisory row reflects every known
|
|
34
71
|
// risk in one place rather than the human having to cross-reference badges.
|
|
35
|
-
test: (
|
|
72
|
+
test: (sem) => sem.unsandboxed,
|
|
36
73
|
message: "runs without the sandbox",
|
|
37
74
|
},
|
|
38
75
|
{
|
|
39
76
|
// Recursive + force in either flag order (-rf, -fr) or as separate flags
|
|
40
77
|
// (rm -r -f). Lookaheads match a `-…r` flag and a `-…f` flag in any order.
|
|
41
|
-
test: (
|
|
42
|
-
/\brm\b(?=[^\n]*\s-[a-zA-Z]*r)(?=[^\n]*\s-[a-zA-Z]*f)/.test(asString(t.input?.command)),
|
|
78
|
+
test: (sem) => /\brm\b(?=[^\n]*\s-[a-zA-Z]*r)(?=[^\n]*\s-[a-zA-Z]*f)/.test(sem.command),
|
|
43
79
|
message: "removes files recursively (rm -rf)",
|
|
44
80
|
},
|
|
45
81
|
{
|
|
46
|
-
test: (
|
|
47
|
-
/git\s+push\b[^\n]*(?:--force\b|--force-with-lease\b|\s-f\b)/.test(asString(t.input?.command)),
|
|
82
|
+
test: (sem) => /git\s+push\b[^\n]*(?:--force\b|--force-with-lease\b|\s-f\b)/.test(sem.command),
|
|
48
83
|
message: "force-pushes a git branch",
|
|
49
84
|
},
|
|
50
85
|
{
|
|
51
|
-
test: (
|
|
52
|
-
/\b(?:curl|wget)\b[^|]*\|\s*(?:ba)?sh\b/.test(asString(t.input?.command)),
|
|
86
|
+
test: (sem) => /\b(?:curl|wget)\b[^|]*\|\s*(?:ba)?sh\b/.test(sem.command),
|
|
53
87
|
message: "pipes a remote script into a shell",
|
|
54
88
|
},
|
|
55
89
|
{
|
|
56
|
-
test: (
|
|
57
|
-
if (t.name !== "Write" && t.name !== "Edit" && t.name !== "NotebookEdit")
|
|
58
|
-
return false;
|
|
59
|
-
const path = asString(t.input?.file_path) || asString(t.input?.notebook_path);
|
|
60
|
-
if (!path)
|
|
61
|
-
return false;
|
|
62
|
-
return !isInsideBrainRepo(path);
|
|
63
|
-
},
|
|
90
|
+
test: (sem) => Boolean(sem.writePath) && !isInsideBrainRepo(sem.writePath),
|
|
64
91
|
message: "writes outside the brain repo",
|
|
65
92
|
},
|
|
66
93
|
];
|
|
67
94
|
/** Advisory messages for every risk rule that fires. Never throws. */
|
|
68
|
-
export function riskHints(tool) {
|
|
95
|
+
export function riskHints(tool, semantics) {
|
|
69
96
|
const hints = [];
|
|
97
|
+
let sem;
|
|
98
|
+
try {
|
|
99
|
+
sem = resolveSemantics(tool, semantics);
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
// Defensive: never let a malformed input break the approval UI.
|
|
103
|
+
return hints;
|
|
104
|
+
}
|
|
70
105
|
for (const rule of RISK_RULES) {
|
|
71
106
|
try {
|
|
72
|
-
if (rule.test(
|
|
107
|
+
if (rule.test(sem))
|
|
73
108
|
hints.push(rule.message);
|
|
74
109
|
}
|
|
75
110
|
catch {
|
|
76
|
-
//
|
|
111
|
+
// Same defensiveness per rule.
|
|
77
112
|
}
|
|
78
113
|
}
|
|
79
114
|
return hints;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"risk-hints.js","sourceRoot":"","sources":["../../../src/components/chat/risk-hints.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"risk-hints.js","sourceRoot":"","sources":["../../../src/components/chat/risk-hints.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type ToolCall } from "../../stores/chat-store.js";
|
|
2
2
|
export declare function ToolCallTimeline({ toolCalls, onApproval, live, }: {
|
|
3
3
|
toolCalls: ToolCall[];
|
|
4
4
|
onApproval: (toolUseId: string, approved: boolean) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-call-timeline.d.ts","sourceRoot":"","sources":["../../../src/components/chat/tool-call-timeline.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"tool-call-timeline.d.ts","sourceRoot":"","sources":["../../../src/components/chat/tool-call-timeline.tsx"],"names":[],"mappings":"AAYA,OAAO,EAAgB,KAAK,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AA6BzE,wBAAgB,gBAAgB,CAAC,EAC/B,SAAS,EACT,UAAU,EACV,IAAY,GACb,EAAE;IACD,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,UAAU,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;IAC3D,+EAA+E;IAC/E,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,sCAkDA"}
|
|
@@ -2,6 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import { useState, useEffect, useRef } from "react";
|
|
3
3
|
import { Check, X, Copy, Layers, ChevronDown, ChevronRight, AlertTriangle, FileText, } from "lucide-react";
|
|
4
4
|
import { resolveToolRenderer } from "@schlessera/brain-ui-sdk/client";
|
|
5
|
+
import { useChatStore } from "../../stores/chat-store.js";
|
|
5
6
|
import { cn } from "../../lib/utils.js";
|
|
6
7
|
import { motion, AnimatePresence } from "framer-motion";
|
|
7
8
|
import { getToolLabel, getTouchedFile, formatDuration, formatTokenCount } from "./tool-views.js";
|
|
@@ -15,14 +16,19 @@ import { SpanStatusDot } from "../activity/span-bits.js";
|
|
|
15
16
|
// Register the built-in renderer packs once. Registration is build-time; this
|
|
16
17
|
// runs on module load.
|
|
17
18
|
registerBuiltinRenderers();
|
|
18
|
-
//
|
|
19
|
-
//
|
|
20
|
-
|
|
21
|
-
|
|
19
|
+
// Sessions that predate backend stamping (old servers, cleared stores) scope
|
|
20
|
+
// to the shipped default backend.
|
|
21
|
+
const DEFAULT_BACKEND_ID = "claude";
|
|
22
|
+
/** Backend owning the session in view, scoping renderer resolution. */
|
|
23
|
+
function useBackendId() {
|
|
24
|
+
return useChatStore((s) => (s.activeSessionId ? s.backendIds[s.activeSessionId] : undefined) ??
|
|
25
|
+
DEFAULT_BACKEND_ID);
|
|
26
|
+
}
|
|
22
27
|
export function ToolCallTimeline({ toolCalls, onApproval, live = false, }) {
|
|
23
28
|
// Collapse the whole run to a summary row once the turn is over. History
|
|
24
29
|
// messages mount collapsed; a live timeline collapses when streaming ends.
|
|
25
30
|
const [collapsed, setCollapsed] = useState(!live);
|
|
31
|
+
const backendId = useBackendId();
|
|
26
32
|
const prevLive = useRef(live);
|
|
27
33
|
useEffect(() => {
|
|
28
34
|
if (prevLive.current && !live)
|
|
@@ -34,13 +40,15 @@ export function ToolCallTimeline({ toolCalls, onApproval, live = false, }) {
|
|
|
34
40
|
const hasPending = toolCalls.some((t) => t.status === "pending_approval");
|
|
35
41
|
const effectiveCollapsed = collapsed && !hasPending && !live;
|
|
36
42
|
if (effectiveCollapsed) {
|
|
37
|
-
return (_jsx(TimelineSummaryRow, { toolCalls: toolCalls, onExpand: () => setCollapsed(false) }));
|
|
43
|
+
return (_jsx(TimelineSummaryRow, { toolCalls: toolCalls, backendId: backendId, onExpand: () => setCollapsed(false) }));
|
|
38
44
|
}
|
|
39
|
-
return (_jsxs("div", { children: [!live && !hasPending && (_jsxs("button", { type: "button", onClick: () => setCollapsed(true), className: "mb-1 flex items-center gap-1.5 text-[11px] text-muted-foreground/50 transition-colors hover:text-muted-foreground", children: [_jsx(ChevronDown, { className: "h-3 w-3" }), "Hide steps"] })), _jsx("div", { className: "relative ml-1 border-l-2 border-border/40 pl-4 space-y-1.5", children: toolCalls.map((tool) => (_jsx(ToolCallEntry, { toolCall: tool, onApproval: onApproval }, tool.id))) })] }));
|
|
45
|
+
return (_jsxs("div", { children: [!live && !hasPending && (_jsxs("button", { type: "button", onClick: () => setCollapsed(true), className: "mb-1 flex items-center gap-1.5 text-[11px] text-muted-foreground/50 transition-colors hover:text-muted-foreground", children: [_jsx(ChevronDown, { className: "h-3 w-3" }), "Hide steps"] })), _jsx("div", { className: "relative ml-1 border-l-2 border-border/40 pl-4 space-y-1.5", children: toolCalls.map((tool) => (_jsx(ToolCallEntry, { toolCall: tool, backendId: backendId, onApproval: onApproval }, tool.id))) })] }));
|
|
40
46
|
}
|
|
41
|
-
function TimelineSummaryRow({ toolCalls, onExpand, }) {
|
|
47
|
+
function TimelineSummaryRow({ toolCalls, backendId, onExpand, }) {
|
|
42
48
|
const steps = toolCalls.length;
|
|
43
|
-
const files = new Set(toolCalls
|
|
49
|
+
const files = new Set(toolCalls
|
|
50
|
+
.map((t) => resolveToolRenderer(t, backendId)?.touchedFile?.(t) ?? getTouchedFile(t))
|
|
51
|
+
.filter(Boolean)).size;
|
|
44
52
|
const errors = toolCalls.filter((t) => t.isError).length;
|
|
45
53
|
const started = Math.min(...toolCalls.map((t) => t.startedAt ?? Infinity));
|
|
46
54
|
const ended = Math.max(...toolCalls.map((t) => t.endedAt ?? -Infinity));
|
|
@@ -49,7 +57,7 @@ function TimelineSummaryRow({ toolCalls, onExpand, }) {
|
|
|
49
57
|
: null;
|
|
50
58
|
return (_jsxs("button", { type: "button", onClick: onExpand, className: "flex items-center gap-2 rounded-md px-2 py-1.5 text-xs text-muted-foreground/70 transition-colors hover:text-foreground", children: [_jsx(Layers, { className: "h-3.5 w-3.5 shrink-0" }), _jsxs("span", { className: "font-[family-name:var(--font-mono)]", children: [steps, " step", steps === 1 ? "" : "s", files > 0 && ` · ${files} file${files === 1 ? "" : "s"} touched`, duration && ` · ${duration}`] }), errors > 0 && (_jsxs("span", { className: "font-[family-name:var(--font-mono)] text-destructive", children: ["\u00B7 ", errors, " failed"] })), _jsx(ChevronRight, { className: "h-3 w-3 shrink-0" })] }));
|
|
51
59
|
}
|
|
52
|
-
function ToolCallEntry({ toolCall, onApproval, }) {
|
|
60
|
+
function ToolCallEntry({ toolCall, backendId, onApproval, }) {
|
|
53
61
|
const [expanded, setExpanded] = useState(toolCall.status === "pending_approval");
|
|
54
62
|
const prevStatus = useRef(toolCall.status);
|
|
55
63
|
// One clock for live and reloaded views: when the activity stream carries
|
|
@@ -67,8 +75,11 @@ function ToolCallEntry({ toolCall, onApproval, }) {
|
|
|
67
75
|
: toolCall;
|
|
68
76
|
// Resolve the renderer for this tool (backend-scoped exact -> global exact ->
|
|
69
77
|
// shape-sniffing predicate). Falls back to the generic renderer.
|
|
70
|
-
const renderer = resolveToolRenderer(toolCall,
|
|
78
|
+
const renderer = resolveToolRenderer(toolCall, backendId) ?? GENERIC_RENDERER;
|
|
71
79
|
const Icon = renderer.icon ?? FileText;
|
|
80
|
+
const label = typeof renderer.label === "function"
|
|
81
|
+
? renderer.label(toolCall)
|
|
82
|
+
: renderer.label ?? getToolLabel(toolCall.name);
|
|
72
83
|
const isPending = toolCall.status === "pending_approval";
|
|
73
84
|
const summary = renderer.summary?.(timed) ?? null;
|
|
74
85
|
const meta = renderer.meta?.(timed) ?? null;
|
|
@@ -91,9 +102,9 @@ function ToolCallEntry({ toolCall, onApproval, }) {
|
|
|
91
102
|
? { animation: "breathe 2s ease-in-out infinite" }
|
|
92
103
|
: undefined }), _jsxs("button", { onClick: () => setExpanded(!expanded), className: cn("flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-xs transition-colors", toolCall.isError
|
|
93
104
|
? "text-destructive/80 hover:text-destructive"
|
|
94
|
-
: "text-muted-foreground hover:text-foreground"), children: [_jsx(Icon, { className: "h-3.5 w-3.5 shrink-0" }), _jsx("span", { className: "font-[family-name:var(--font-mono)] font-medium", children:
|
|
105
|
+
: "text-muted-foreground hover:text-foreground"), children: [_jsx(Icon, { className: "h-3.5 w-3.5 shrink-0" }), _jsx("span", { className: "font-[family-name:var(--font-mono)] font-medium", children: label }), summary && (_jsx("span", { className: cn("truncate", toolCall.isError ? "text-destructive/60" : "text-muted-foreground/70"), children: summary })), _jsxs("span", { className: "ml-auto flex shrink-0 items-center gap-2", children: [meta && (_jsx("span", { className: "font-[family-name:var(--font-mono)] text-[10px] text-muted-foreground/50", children: meta })), _jsx(StatusIndicator, { status: toolCall.status, isError: toolCall.isError })] })] }), renderer.subagentRows && _jsx(SubagentEntryRows, { agentToolUseId: toolCall.id }), _jsx(AnimatePresence, { children: expanded && (_jsx(motion.div, { initial: { height: 0, opacity: 0 }, animate: { height: "auto", opacity: 1 }, exit: { height: 0, opacity: 0 }, transition: { duration: 0.2, ease: "easeOut" }, className: "overflow-hidden", children: _jsxs("div", { className: cn("mt-1 rounded-lg p-3 space-y-2", isPending
|
|
95
106
|
? "border-2 border-primary/40 bg-primary/5"
|
|
96
|
-
: "border border-border-subtle bg-surface"), children: [Input && _jsx(Input, { tool: toolCall }), isPending && _jsx(RiskHints, { toolCall: toolCall }), isPending && (_jsxs("div", { className: "flex gap-2", children: [_jsxs("button", { onClick: () => onApproval(toolCall.id, true), className: "flex items-center gap-1.5 rounded-lg bg-primary px-4 py-1.5 text-xs font-medium text-primary-foreground transition-colors hover:brightness-110", children: [_jsx(Check, { className: "h-3 w-3" }), "Allow"] }), _jsxs("button", { onClick: () => onApproval(toolCall.id, false), className: "flex items-center gap-1.5 rounded-lg border border-destructive/30 px-4 py-1.5 text-xs font-medium text-destructive transition-colors hover:bg-destructive/10", children: [_jsx(X, { className: "h-3 w-3" }), "Deny"] })] })), toolCall.output && Output && (_jsxs("div", { className: "relative", children: [_jsx("button", { onClick: () => navigator.clipboard.writeText(toolCall.output), className: "absolute right-1 top-1 z-10 rounded p-1 text-muted-foreground transition-colors hover:bg-surface-raised hover:text-foreground", title: "Copy output", children: _jsx(Copy, { className: "h-3 w-3" }) }), _jsx(Output, { tool: toolCall })] }))] }) })) })] }));
|
|
107
|
+
: "border border-border-subtle bg-surface"), children: [Input && _jsx(Input, { tool: toolCall }), isPending && (_jsx(RiskHints, { toolCall: toolCall, semantics: renderer.semantics })), isPending && (_jsxs("div", { className: "flex gap-2", children: [_jsxs("button", { onClick: () => onApproval(toolCall.id, true), className: "flex items-center gap-1.5 rounded-lg bg-primary px-4 py-1.5 text-xs font-medium text-primary-foreground transition-colors hover:brightness-110", children: [_jsx(Check, { className: "h-3 w-3" }), "Allow"] }), _jsxs("button", { onClick: () => onApproval(toolCall.id, false), className: "flex items-center gap-1.5 rounded-lg border border-destructive/30 px-4 py-1.5 text-xs font-medium text-destructive transition-colors hover:bg-destructive/10", children: [_jsx(X, { className: "h-3 w-3" }), "Deny"] })] })), toolCall.output && Output && (_jsxs("div", { className: "relative", children: [_jsx("button", { onClick: () => navigator.clipboard.writeText(toolCall.output), className: "absolute right-1 top-1 z-10 rounded p-1 text-muted-foreground transition-colors hover:bg-surface-raised hover:text-foreground", title: "Copy output", children: _jsx(Copy, { className: "h-3 w-3" }) }), _jsx(Output, { tool: toolCall })] }))] }) })) })] }));
|
|
97
108
|
}
|
|
98
109
|
/**
|
|
99
110
|
* Compact live status of one Agent fan-out: what the subagent is, its state,
|
|
@@ -113,8 +124,8 @@ function SubagentEntryRows({ agentToolUseId }) {
|
|
|
113
124
|
const elapsed = formatDuration((span.endedAt ?? now) - span.startedAt);
|
|
114
125
|
return (_jsxs("button", { type: "button", onClick: () => pushSubagentView(agentToolUseId), className: "ml-6 flex w-[calc(100%-1.5rem)] items-center gap-2 rounded-md px-2 py-1 text-[11px] text-muted-foreground/80 transition-colors hover:text-foreground", children: [_jsx(SpanStatusDot, { span: span }), _jsx("span", { className: "truncate", children: description }), _jsxs("span", { className: "ml-auto shrink-0 font-[family-name:var(--font-mono)] text-[10px] text-muted-foreground/50", children: [stepCount > 0 && `${stepCount} step${stepCount === 1 ? "" : "s"} · `, tokens !== null && `${formatTokenCount(tokens)} tok · `, elapsed] }), _jsx(ChevronRight, { className: "h-3 w-3 shrink-0" })] }));
|
|
115
126
|
}
|
|
116
|
-
function RiskHints({ toolCall }) {
|
|
117
|
-
const hints = riskHints(toolCall);
|
|
127
|
+
function RiskHints({ toolCall, semantics, }) {
|
|
128
|
+
const hints = riskHints(toolCall, semantics);
|
|
118
129
|
if (hints.length === 0)
|
|
119
130
|
return null;
|
|
120
131
|
return (_jsx("div", { className: "space-y-0.5 text-[11px] text-amber-400", children: hints.map((hint) => (_jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx(AlertTriangle, { className: "h-3 w-3 shrink-0" }), _jsx("span", { children: hint })] }, hint))) }));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-call-timeline.js","sourceRoot":"","sources":["../../../src/components/chat/tool-call-timeline.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AACpD,OAAO,EACL,KAAK,EACL,CAAC,EACD,IAAI,EACJ,MAAM,EACN,WAAW,EACX,YAAY,EACZ,aAAa,EACb,QAAQ,GACT,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,mBAAmB,
|
|
1
|
+
{"version":3,"file":"tool-call-timeline.js","sourceRoot":"","sources":["../../../src/components/chat/tool-call-timeline.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AACpD,OAAO,EACL,KAAK,EACL,CAAC,EACD,IAAI,EACJ,MAAM,EACN,WAAW,EACX,YAAY,EACZ,aAAa,EACb,QAAQ,GACT,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,mBAAmB,EAAsB,MAAM,iCAAiC,CAAC;AAC1F,OAAO,EAAE,YAAY,EAAiB,MAAM,4BAA4B,CAAC;AACzE,OAAO,EAAE,EAAE,EAAE,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACjG,OAAO,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAClF,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAC3F,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEzD,8EAA8E;AAC9E,uBAAuB;AACvB,wBAAwB,EAAE,CAAC;AAE3B,6EAA6E;AAC7E,kCAAkC;AAClC,MAAM,kBAAkB,GAAG,QAAQ,CAAC;AAEpC,uEAAuE;AACvE,SAAS,YAAY;IACnB,OAAO,YAAY,CACjB,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACjE,kBAAkB,CACrB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,EAC/B,SAAS,EACT,UAAU,EACV,IAAI,GAAG,KAAK,GAMb;IACC,yEAAyE;IACzE,2EAA2E;IAC3E,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;IACjC,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAC9B,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,QAAQ,CAAC,OAAO,IAAI,CAAC,IAAI;YAAE,YAAY,CAAC,IAAI,CAAC,CAAC;QAClD,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC;IAC1B,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAEX,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAExC,MAAM,UAAU,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,kBAAkB,CAAC,CAAC;IAC1E,MAAM,kBAAkB,GAAG,SAAS,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC;IAE7D,IAAI,kBAAkB,EAAE,CAAC;QACvB,OAAO,CACL,KAAC,kBAAkB,IACjB,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,GACnC,CACH,CAAC;IACJ,CAAC;IAED,OAAO,CACL,0BACG,CAAC,IAAI,IAAI,CAAC,UAAU,IAAI,CACvB,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,EACjC,SAAS,EAAC,mHAAmH,aAE7H,KAAC,WAAW,IAAC,SAAS,EAAC,SAAS,GAAG,kBAE5B,CACV,EACD,cAAK,SAAS,EAAC,4DAA4D,YACxE,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACvB,KAAC,aAAa,IAEZ,QAAQ,EAAE,IAAI,EACd,SAAS,EAAE,SAAS,EACpB,UAAU,EAAE,UAAU,IAHjB,IAAI,CAAC,EAAE,CAIZ,CACH,CAAC,GACE,IACF,CACP,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,EAC1B,SAAS,EACT,SAAS,EACT,QAAQ,GAKT;IACC,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC;IAC/B,MAAM,KAAK,GAAG,IAAI,GAAG,CACnB,SAAS;SACN,GAAG,CACF,CAAC,CAAC,EAAE,EAAE,CACJ,mBAAmB,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC,CAC3E;SACA,MAAM,CAAC,OAAO,CAAC,CACnB,CAAC,IAAI,CAAC;IACP,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;IACzD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,IAAI,QAAQ,CAAC,CAAC,CAAC;IAC3E,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IACxE,MAAM,QAAQ,GACZ,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,GAAG,OAAO;QACzC,CAAC,CAAC,cAAc,CAAC,KAAK,GAAG,OAAO,CAAC;QACjC,CAAC,CAAC,IAAI,CAAC;IAEX,OAAO,CACL,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,QAAQ,EACjB,SAAS,EAAC,yHAAyH,aAEnI,KAAC,MAAM,IAAC,SAAS,EAAC,sBAAsB,GAAG,EAC3C,gBAAM,SAAS,EAAC,qCAAqC,aAClD,KAAK,WAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAClC,KAAK,GAAG,CAAC,IAAI,MAAM,KAAK,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,UAAU,EAChE,QAAQ,IAAI,MAAM,QAAQ,EAAE,IACxB,EACN,MAAM,GAAG,CAAC,IAAI,CACb,gBAAM,SAAS,EAAC,sDAAsD,wBACjE,MAAM,eACJ,CACR,EACD,KAAC,YAAY,IAAC,SAAS,EAAC,kBAAkB,GAAG,IACtC,CACV,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,EACrB,QAAQ,EACR,SAAS,EACT,UAAU,GAKX;IACC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CACtC,QAAQ,CAAC,MAAM,KAAK,kBAAkB,CACvC,CAAC;IACF,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC3C,0EAA0E;IAC1E,0EAA0E;IAC1E,wEAAwE;IACxE,uEAAuE;IACvE,qEAAqE;IACrE,MAAM,IAAI,GAAG,gBAAgB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;IAClE,MAAM,KAAK,GAAa,IAAI;QAC1B,CAAC,CAAC;YACE,GAAG,QAAQ;YACX,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS;YAC3C,GAAG,CAAC,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACjE;QACH,CAAC,CAAC,QAAQ,CAAC;IACb,8EAA8E;IAC9E,iEAAiE;IACjE,MAAM,QAAQ,GAAG,mBAAmB,CAAC,QAAQ,EAAE,SAAS,CAAC,IAAI,gBAAgB,CAAC;IAC9E,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC;IACvC,MAAM,KAAK,GACT,OAAO,QAAQ,CAAC,KAAK,KAAK,UAAU;QAClC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC;QAC1B,CAAC,CAAC,QAAQ,CAAC,KAAK,IAAI,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACpD,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,KAAK,kBAAkB,CAAC;IACzD,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC;IAClD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC;IAC5C,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;IAC7B,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;IAE/B,SAAS,CAAC,GAAG,EAAE;QACb,IACE,QAAQ,CAAC,MAAM,KAAK,kBAAkB;YACtC,UAAU,CAAC,OAAO,KAAK,kBAAkB,EACzC,CAAC;YACD,WAAW,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;aAAM,IACL,UAAU,CAAC,OAAO,KAAK,kBAAkB;YACzC,QAAQ,CAAC,MAAM,KAAK,kBAAkB,EACtC,CAAC;YACD,WAAW,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;QACD,UAAU,CAAC,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC;IACvC,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAEtB,OAAO,CACL,eAAK,SAAS,EAAC,UAAU,aAEvB,cACE,SAAS,EAAE,EAAE,CACX,iFAAiF,EACjF,QAAQ,CAAC,MAAM,KAAK,WAAW,IAAI,0BAA0B,EAC7D,QAAQ,CAAC,MAAM,KAAK,kBAAkB;oBACpC,YAAY,EACd,QAAQ,CAAC,MAAM,KAAK,UAAU,IAAI,WAAW,EAC7C,QAAQ,CAAC,MAAM,KAAK,QAAQ,IAAI,gBAAgB,EAChD,QAAQ,CAAC,MAAM,KAAK,UAAU;oBAC5B,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,WAAW,CAAC,EACrD,CAAC,CAAC,WAAW,EAAE,kBAAkB,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,qBAAqB,CACxH,EACD,KAAK,EACH,QAAQ,CAAC,MAAM,KAAK,kBAAkB;oBACpC,CAAC,CAAC,EAAE,SAAS,EAAE,iCAAiC,EAAE;oBAClD,CAAC,CAAC,SAAS,GAEf,EAGF,kBACE,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,EACrC,SAAS,EAAE,EAAE,CACX,iFAAiF,EACjF,QAAQ,CAAC,OAAO;oBACd,CAAC,CAAC,4CAA4C;oBAC9C,CAAC,CAAC,6CAA6C,CAClD,aAED,KAAC,IAAI,IAAC,SAAS,EAAC,sBAAsB,GAAG,EACzC,eAAM,SAAS,EAAC,iDAAiD,YAC9D,KAAK,GACD,EACN,OAAO,IAAI,CACV,eACE,SAAS,EAAE,EAAE,CACX,UAAU,EACV,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,0BAA0B,CACtE,YAEA,OAAO,GACH,CACR,EACD,gBAAM,SAAS,EAAC,0CAA0C,aACvD,IAAI,IAAI,CACP,eAAM,SAAS,EAAC,0EAA0E,YACvF,IAAI,GACA,CACR,EACD,KAAC,eAAe,IAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,GAAI,IAClE,IACA,EAGR,QAAQ,CAAC,YAAY,IAAI,KAAC,iBAAiB,IAAC,cAAc,EAAE,QAAQ,CAAC,EAAE,GAAI,EAG5E,KAAC,eAAe,cACb,QAAQ,IAAI,CACX,KAAC,MAAM,CAAC,GAAG,IACT,OAAO,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,EAClC,OAAO,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,EACvC,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,EAC/B,UAAU,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,EAC9C,SAAS,EAAC,iBAAiB,YAE3B,eACE,SAAS,EAAE,EAAE,CACX,+BAA+B,EAC/B,SAAS;4BACP,CAAC,CAAC,yCAAyC;4BAC3C,CAAC,CAAC,wCAAwC,CAC7C,aAGA,KAAK,IAAI,KAAC,KAAK,IAAC,IAAI,EAAE,QAAQ,GAAI,EAGlC,SAAS,IAAI,CACZ,KAAC,SAAS,IAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,SAAS,GAAI,CACjE,EAGA,SAAS,IAAI,CACZ,eAAK,SAAS,EAAC,YAAY,aACzB,kBACE,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC,EAC5C,SAAS,EAAC,gJAAgJ,aAE1J,KAAC,KAAK,IAAC,SAAS,EAAC,SAAS,GAAG,aAEtB,EACT,kBACE,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC,EAC7C,SAAS,EAAC,8JAA8J,aAExK,KAAC,CAAC,IAAC,SAAS,EAAC,SAAS,GAAG,YAElB,IACL,CACP,EAGA,QAAQ,CAAC,MAAM,IAAI,MAAM,IAAI,CAC5B,eAAK,SAAS,EAAC,UAAU,aACvB,iBACE,OAAO,EAAE,GAAG,EAAE,CACZ,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAO,CAAC,EAEjD,SAAS,EAAC,+HAA+H,EACzI,KAAK,EAAC,aAAa,YAEnB,KAAC,IAAI,IAAC,SAAS,EAAC,SAAS,GAAG,GACrB,EACT,KAAC,MAAM,IAAC,IAAI,EAAE,QAAQ,GAAI,IACtB,CACP,IACG,GACK,CACd,GACe,IACd,CACP,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,SAAS,iBAAiB,CAAC,EAAE,cAAc,EAA8B;IACvE,MAAM,IAAI,GAAG,gBAAgB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC;IACrE,MAAM,SAAS,GAAG,gBAAgB,CAChC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,MAAM,CAAC,CACxD,CAAC;IACF,MAAM,gBAAgB,GAAG,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;IAC/D,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU;QAAE,OAAO,IAAI,CAAC;IAEnD,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,EAAE,WAAW,IAAI,UAAU,CAAC;IAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,WAAW,IAAI,IAAI,CAAC;IAClD,MAAM,OAAO,GAAG,cAAc,CAAC,CAAC,IAAI,CAAC,OAAO,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;IAEvE,OAAO,CACL,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,cAAc,CAAC,EAC/C,SAAS,EAAC,sJAAsJ,aAEhK,KAAC,aAAa,IAAC,IAAI,EAAE,IAAI,GAAI,EAC7B,eAAM,SAAS,EAAC,UAAU,YAAE,WAAW,GAAQ,EAC/C,gBAAM,SAAS,EAAC,2FAA2F,aACxG,SAAS,GAAG,CAAC,IAAI,GAAG,SAAS,QAAQ,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,EACpE,MAAM,KAAK,IAAI,IAAI,GAAG,gBAAgB,CAAC,MAAM,CAAC,SAAS,EACvD,OAAO,IACH,EACP,KAAC,YAAY,IAAC,SAAS,EAAC,kBAAkB,GAAG,IACtC,CACV,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,EACjB,QAAQ,EACR,SAAS,GAIV;IACC,MAAM,KAAK,GAAG,SAAS,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC7C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACpC,OAAO,CACL,cAAK,SAAS,EAAC,wCAAwC,YACpD,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACnB,eAAgB,SAAS,EAAC,2BAA2B,aACnD,KAAC,aAAa,IAAC,SAAS,EAAC,kBAAkB,GAAG,EAC9C,yBAAO,IAAI,GAAQ,KAFX,IAAI,CAGR,CACP,CAAC,GACE,CACP,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,EACvB,MAAM,EACN,OAAO,GAIR;IACC,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,WAAW;YACd,OAAO,CACL,eAAM,SAAS,EAAC,gEAAgE,GAAG,CACpF,CAAC;QACJ,KAAK,kBAAkB;YACrB,OAAO,CACL,eAAM,SAAS,EAAC,0EAA0E,gCAEnF,CACR,CAAC;QACJ,KAAK,UAAU;YACb,OAAO,KAAC,KAAK,IAAC,SAAS,EAAC,qBAAqB,GAAG,CAAC;QACnD,KAAK,QAAQ;YACX,OAAO,KAAC,CAAC,IAAC,SAAS,EAAC,0BAA0B,GAAG,CAAC;QACpD,KAAK,UAAU;YACb,OAAO,OAAO,CAAC,CAAC,CAAC,CACf,KAAC,CAAC,IAAC,SAAS,EAAC,0BAA0B,GAAG,CAC3C,CAAC,CAAC,CAAC,CACF,KAAC,KAAK,IAAC,SAAS,EAAC,kCAAkC,GAAG,CACvD,CAAC;IACN,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"models-tab.d.ts","sourceRoot":"","sources":["../../../src/components/settings/models-tab.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,WAAW,EACX,iBAAiB,EAElB,MAAM,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"models-tab.d.ts","sourceRoot":"","sources":["../../../src/components/settings/models-tab.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,WAAW,EACX,iBAAiB,EAElB,MAAM,mCAAmC,CAAC;AAM3C;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,+BA2MxD;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,IAAI;IAAE,KAAK,EAAE,MAAM,MAAM,OAAO,CAAA;CAAE,CAQlE;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,iBAAiB,EAAE,EAC3B,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,WAAW,GAAG,MAAM,GACzB,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAO7B"}
|
|
@@ -4,6 +4,7 @@ import { Eye, EyeOff, Loader2, RefreshCw } from "lucide-react";
|
|
|
4
4
|
import { api } from "../../lib/api-client.js";
|
|
5
5
|
import { useProviderStore } from "../../stores/provider-store.js";
|
|
6
6
|
import { cn } from "../../lib/utils.js";
|
|
7
|
+
import { PiAccountsSection } from "./pi-accounts.js";
|
|
7
8
|
/**
|
|
8
9
|
* The model picker's contents, and which of them to show.
|
|
9
10
|
*
|
|
@@ -133,7 +134,7 @@ export function ModelsTab({ active }) {
|
|
|
133
134
|
}
|
|
134
135
|
}
|
|
135
136
|
const visibleCount = catalog?.models.filter((m) => !m.hidden).length ?? 0;
|
|
136
|
-
return (_jsxs("div", { className: "flex h-full flex-col", children: [_jsxs("div", { className: "flex-1 overflow-y-auto p-4", children: [_jsx("h3", { className: "text-xs font-medium uppercase tracking-wide text-muted-foreground", children: "Models" }), _jsx("p", { className: "mt-1 text-xs text-muted-foreground", children: "The list is read from the provider and refreshes on its own. Hide the ones you never pick \u2014 running sessions are unaffected." }), loading ? (_jsx("div", { className: "mt-6 flex justify-center", children: _jsx(Loader2, { className: "h-5 w-5 animate-spin text-muted-foreground" }) })) : (_jsxs("ul", { className: "mt-4 flex flex-col gap-2", children: [catalog?.models.map((entry) => (_jsx(ModelRow, { entry: entry, onToggle: () => toggleHidden(entry), onBilling: (next) => changeBilling(entry, next) }, entry.id))), catalog?.models.length === 0 && (_jsx("li", { className: "rounded-lg border border-dashed border-border-subtle p-4 text-center text-xs text-muted-foreground", children: "No models available." }))] })), error && (_jsx("p", { role: "alert", className: "mt-3 text-xs text-destructive", children: error })), catalog?.discovery.error && (_jsxs("p", { className: "mt-3 text-xs text-muted-foreground", children: ["Last refresh failed (", catalog.discovery.error, "). Showing the last known list."] })), catalog && !catalog.discovery.enabled && (_jsx("p", { className: "mt-3 text-xs text-muted-foreground", children: "Discovery is disabled (BRAIN_UI_MODEL_DISCOVERY). Only configured profiles are listed." }))] }), _jsxs("div", { className: "flex items-center justify-between gap-3 border-t border-border p-4", children: [_jsxs("span", { className: "text-[11px] text-muted-foreground", children: [visibleCount, " in picker \u00B7 ", formatRefreshed(catalog?.refreshedAt ?? null)] }), _jsxs("button", { onClick: onRefresh, disabled: refreshing, className: "flex items-center gap-2 rounded-lg border border-border-subtle bg-surface px-3 py-2 text-xs font-medium text-foreground transition-colors hover:border-primary hover:text-primary disabled:opacity-50", children: [_jsx(RefreshCw, { className: cn("h-3.5 w-3.5", refreshing && "animate-spin") }), "Refresh"] })] })] }));
|
|
137
|
+
return (_jsxs("div", { className: "flex h-full flex-col", children: [_jsxs("div", { className: "flex-1 overflow-y-auto p-4", children: [_jsx("h3", { className: "text-xs font-medium uppercase tracking-wide text-muted-foreground", children: "Models" }), _jsx("p", { className: "mt-1 text-xs text-muted-foreground", children: "The list is read from the provider and refreshes on its own. Hide the ones you never pick \u2014 running sessions are unaffected." }), loading ? (_jsx("div", { className: "mt-6 flex justify-center", children: _jsx(Loader2, { className: "h-5 w-5 animate-spin text-muted-foreground" }) })) : (_jsxs("ul", { className: "mt-4 flex flex-col gap-2", children: [catalog?.models.map((entry) => (_jsx(ModelRow, { entry: entry, onToggle: () => toggleHidden(entry), onBilling: (next) => changeBilling(entry, next) }, entry.id))), catalog?.models.length === 0 && (_jsx("li", { className: "rounded-lg border border-dashed border-border-subtle p-4 text-center text-xs text-muted-foreground", children: "No models available." }))] })), error && (_jsx("p", { role: "alert", className: "mt-3 text-xs text-destructive", children: error })), catalog?.discovery.error && (_jsxs("p", { className: "mt-3 text-xs text-muted-foreground", children: ["Last refresh failed (", catalog.discovery.error, "). Showing the last known list."] })), catalog && !catalog.discovery.enabled && (_jsx("p", { className: "mt-3 text-xs text-muted-foreground", children: "Discovery is disabled (BRAIN_UI_MODEL_DISCOVERY). Only configured profiles are listed." })), _jsx(PiAccountsSection, { active: active })] }), _jsxs("div", { className: "flex items-center justify-between gap-3 border-t border-border p-4", children: [_jsxs("span", { className: "text-[11px] text-muted-foreground", children: [visibleCount, " in picker \u00B7 ", formatRefreshed(catalog?.refreshedAt ?? null)] }), _jsxs("button", { onClick: onRefresh, disabled: refreshing, className: "flex items-center gap-2 rounded-lg border border-border-subtle bg-surface px-3 py-2 text-xs font-medium text-foreground transition-colors hover:border-primary hover:text-primary disabled:opacity-50", children: [_jsx(RefreshCw, { className: cn("h-3.5 w-3.5", refreshing && "animate-spin") }), "Refresh"] })] })] }));
|
|
137
138
|
}
|
|
138
139
|
/**
|
|
139
140
|
* Request-ordering guard for optimistic commits: `begin()` claims a token
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"models-tab.js","sourceRoot":"","sources":["../../../src/components/settings/models-tab.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACpD,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAM/D,OAAO,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,EAAE,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"models-tab.js","sourceRoot":"","sources":["../../../src/components/settings/models-tab.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider sign-in for the pi backend's OAuth vendors — most importantly
|
|
3
|
+
* OpenAI (ChatGPT Plus/Pro), whose device-code flow needs no browser callback
|
|
4
|
+
* on the server: the user gets a short code here, enters it at the provider's
|
|
5
|
+
* verification page on ANY device, and the server stores the credential.
|
|
6
|
+
*
|
|
7
|
+
* Renders nothing when the server reports no pi providers (pi not
|
|
8
|
+
* configured), so the Models tab is unchanged for Claude-only deployments.
|
|
9
|
+
*/
|
|
10
|
+
export declare function PiAccountsSection({ active }: {
|
|
11
|
+
active: boolean;
|
|
12
|
+
}): import("react").JSX.Element | null;
|
|
13
|
+
//# sourceMappingURL=pi-accounts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pi-accounts.d.ts","sourceRoot":"","sources":["../../../src/components/settings/pi-accounts.tsx"],"names":[],"mappings":"AAKA;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,sCA0KhE"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useRef, useState } from "react";
|
|
3
|
+
import { Check, ExternalLink, Loader2, LogOut, X } from "lucide-react";
|
|
4
|
+
import { api } from "../../lib/api-client.js";
|
|
5
|
+
import { cn } from "../../lib/utils.js";
|
|
6
|
+
/**
|
|
7
|
+
* Provider sign-in for the pi backend's OAuth vendors — most importantly
|
|
8
|
+
* OpenAI (ChatGPT Plus/Pro), whose device-code flow needs no browser callback
|
|
9
|
+
* on the server: the user gets a short code here, enters it at the provider's
|
|
10
|
+
* verification page on ANY device, and the server stores the credential.
|
|
11
|
+
*
|
|
12
|
+
* Renders nothing when the server reports no pi providers (pi not
|
|
13
|
+
* configured), so the Models tab is unchanged for Claude-only deployments.
|
|
14
|
+
*/
|
|
15
|
+
export function PiAccountsSection({ active }) {
|
|
16
|
+
const [providers, setProviders] = useState([]);
|
|
17
|
+
const [error, setError] = useState(null);
|
|
18
|
+
const [busy, setBusy] = useState(null);
|
|
19
|
+
const [flow, setFlow] = useState(null);
|
|
20
|
+
const pollTimer = useRef(null);
|
|
21
|
+
function stopPolling() {
|
|
22
|
+
if (pollTimer.current) {
|
|
23
|
+
clearTimeout(pollTimer.current);
|
|
24
|
+
pollTimer.current = null;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
async function reload() {
|
|
28
|
+
try {
|
|
29
|
+
const { providers } = await api.piAuthProviders();
|
|
30
|
+
setProviders(providers);
|
|
31
|
+
}
|
|
32
|
+
catch (err) {
|
|
33
|
+
setError(err instanceof Error ? err.message : "Could not load accounts");
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
useEffect(() => {
|
|
37
|
+
if (!active)
|
|
38
|
+
return;
|
|
39
|
+
let cancelled = false;
|
|
40
|
+
api
|
|
41
|
+
.piAuthProviders()
|
|
42
|
+
.then(({ providers }) => {
|
|
43
|
+
if (!cancelled)
|
|
44
|
+
setProviders(providers);
|
|
45
|
+
})
|
|
46
|
+
.catch(() => {
|
|
47
|
+
// A server without the endpoint (older release) just hides the card.
|
|
48
|
+
if (!cancelled)
|
|
49
|
+
setProviders([]);
|
|
50
|
+
});
|
|
51
|
+
return () => {
|
|
52
|
+
cancelled = true;
|
|
53
|
+
};
|
|
54
|
+
}, [active]);
|
|
55
|
+
// Poll the pending flow until it settles. Chained timeouts rather than an
|
|
56
|
+
// interval, so a slow response never stacks requests.
|
|
57
|
+
useEffect(() => {
|
|
58
|
+
if (!flow || flow.status !== "pending")
|
|
59
|
+
return;
|
|
60
|
+
let disposed = false;
|
|
61
|
+
const delayMs = (flow.intervalSeconds ?? 5) * 1000;
|
|
62
|
+
const tick = async () => {
|
|
63
|
+
try {
|
|
64
|
+
const { flow: next } = await api.piAuthFlow(flow.id);
|
|
65
|
+
if (disposed)
|
|
66
|
+
return;
|
|
67
|
+
setFlow(next);
|
|
68
|
+
if (next.status === "success")
|
|
69
|
+
void reload();
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
if (disposed)
|
|
73
|
+
return;
|
|
74
|
+
// Transient poll failure: keep trying until the flow expires.
|
|
75
|
+
pollTimer.current = setTimeout(tick, delayMs);
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
pollTimer.current = setTimeout(tick, delayMs);
|
|
80
|
+
return () => {
|
|
81
|
+
disposed = true;
|
|
82
|
+
stopPolling();
|
|
83
|
+
};
|
|
84
|
+
}, [flow]);
|
|
85
|
+
async function connect(providerId) {
|
|
86
|
+
setBusy(providerId);
|
|
87
|
+
setError(null);
|
|
88
|
+
try {
|
|
89
|
+
const { flow } = await api.piAuthStart(providerId);
|
|
90
|
+
setFlow(flow);
|
|
91
|
+
if (flow.status === "error")
|
|
92
|
+
setError(flow.error ?? "Login failed");
|
|
93
|
+
}
|
|
94
|
+
catch (err) {
|
|
95
|
+
setError(err instanceof Error ? err.message : "Could not start login");
|
|
96
|
+
}
|
|
97
|
+
finally {
|
|
98
|
+
setBusy(null);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
async function cancel() {
|
|
102
|
+
if (!flow)
|
|
103
|
+
return;
|
|
104
|
+
stopPolling();
|
|
105
|
+
try {
|
|
106
|
+
await api.piAuthCancel(flow.id);
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
// The flow record may already be gone; clearing locally is enough.
|
|
110
|
+
}
|
|
111
|
+
setFlow(null);
|
|
112
|
+
}
|
|
113
|
+
async function disconnect(providerId) {
|
|
114
|
+
setBusy(providerId);
|
|
115
|
+
setError(null);
|
|
116
|
+
try {
|
|
117
|
+
await api.piAuthLogout(providerId);
|
|
118
|
+
await reload();
|
|
119
|
+
}
|
|
120
|
+
catch (err) {
|
|
121
|
+
setError(err instanceof Error ? err.message : "Could not disconnect");
|
|
122
|
+
}
|
|
123
|
+
finally {
|
|
124
|
+
setBusy(null);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
if (providers.length === 0)
|
|
128
|
+
return null;
|
|
129
|
+
return (_jsxs("div", { className: "mt-6", children: [_jsx("h3", { className: "text-xs font-medium uppercase tracking-wide text-muted-foreground", children: "Accounts" }), _jsx("p", { className: "mt-1 text-xs text-muted-foreground", children: "Model providers that sign in with an account instead of an API key." }), _jsx("ul", { className: "mt-4 flex flex-col gap-2", children: providers.map((provider) => (_jsxs("li", { className: "rounded-lg border border-border-subtle bg-surface p-3", children: [_jsxs("div", { className: "flex items-center gap-3", children: [_jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("p", { className: "truncate text-sm text-foreground", children: provider.name }), _jsx("p", { className: "truncate text-[11px] text-muted-foreground", children: provider.configured
|
|
130
|
+
? `Connected${provider.source ? ` · ${provider.source}` : ""}`
|
|
131
|
+
: "Not connected" })] }), provider.configured && (_jsx(Check, { className: "h-4 w-4 shrink-0 text-accent" })), provider.oauth && !provider.configured && (_jsx("button", { onClick: () => connect(provider.providerId), disabled: busy !== null || flow?.status === "pending", className: "shrink-0 rounded-lg border border-border-subtle bg-surface px-3 py-1.5 text-xs font-medium text-foreground transition-colors hover:border-primary hover:text-primary disabled:opacity-50", children: busy === provider.providerId ? (_jsx(Loader2, { className: "h-3.5 w-3.5 animate-spin" })) : ("Connect") })), provider.configured && provider.source === "stored" && (_jsx("button", { onClick: () => disconnect(provider.providerId), disabled: busy !== null, title: "Disconnect", className: "flex h-8 w-8 shrink-0 items-center justify-center rounded-lg text-muted-foreground transition-colors hover:bg-surface-raised hover:text-destructive", children: _jsx(LogOut, { className: "h-4 w-4" }) }))] }), flow && flow.providerId === provider.providerId && (_jsx(LoginFlowCard, { flow: flow, onCancel: cancel, onDismiss: () => setFlow(null) }))] }, provider.providerId))) }), error && (_jsx("p", { role: "alert", className: "mt-3 text-xs text-destructive", children: error }))] }));
|
|
132
|
+
}
|
|
133
|
+
function LoginFlowCard({ flow, onCancel, onDismiss, }) {
|
|
134
|
+
if (flow.status === "pending") {
|
|
135
|
+
return (_jsxs("div", { className: "mt-3 rounded-lg border border-primary/40 bg-primary/5 p-3", children: [_jsx("p", { className: "text-xs text-muted-foreground", children: "Enter this code at the provider's device page \u2014 on this or any other device:" }), _jsx("p", { className: "mt-2 select-all text-center font-[family-name:var(--font-mono)] text-xl font-semibold tracking-widest text-foreground", children: flow.userCode ?? "…" }), _jsxs("div", { className: "mt-3 flex items-center justify-center gap-2", children: [flow.verificationUri && (_jsxs("a", { href: flow.verificationUri, target: "_blank", rel: "noreferrer", className: "flex items-center gap-1.5 rounded-lg bg-primary px-3 py-1.5 text-xs font-medium text-primary-foreground transition-colors hover:brightness-110", children: [_jsx(ExternalLink, { className: "h-3 w-3" }), "Open verification page"] })), _jsxs("button", { onClick: onCancel, className: "flex items-center gap-1.5 rounded-lg border border-border-subtle px-3 py-1.5 text-xs font-medium text-muted-foreground transition-colors hover:text-foreground", children: [_jsx(X, { className: "h-3 w-3" }), "Cancel"] })] }), _jsxs("p", { className: "mt-2 flex items-center justify-center gap-1.5 text-center text-[11px] text-muted-foreground", children: [_jsx(Loader2, { className: "h-3 w-3 animate-spin" }), "Waiting for approval\u2026"] })] }));
|
|
136
|
+
}
|
|
137
|
+
const message = flow.status === "success"
|
|
138
|
+
? "Connected."
|
|
139
|
+
: flow.status === "cancelled"
|
|
140
|
+
? "Login cancelled."
|
|
141
|
+
: flow.error ?? "Login failed.";
|
|
142
|
+
return (_jsxs("div", { className: cn("mt-3 flex items-center justify-between rounded-lg border p-3 text-xs", flow.status === "success"
|
|
143
|
+
? "border-border-subtle text-muted-foreground"
|
|
144
|
+
: "border-destructive/30 text-destructive"), children: [_jsx("span", { children: message }), _jsx("button", { onClick: onDismiss, className: "text-muted-foreground transition-colors hover:text-foreground", children: _jsx(X, { className: "h-3.5 w-3.5" }) })] }));
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=pi-accounts.js.map
|