@schlessera/brain-ui-react 0.21.0 → 0.24.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.
Files changed (55) hide show
  1. package/dist/components/chat/message-bubble.js +10 -1
  2. package/dist/components/chat/message-bubble.js.map +1 -1
  3. package/dist/components/chat/renderers/claude-tools.d.ts.map +1 -1
  4. package/dist/components/chat/renderers/claude-tools.js +21 -1
  5. package/dist/components/chat/renderers/claude-tools.js.map +1 -1
  6. package/dist/components/chat/renderers/index.d.ts.map +1 -1
  7. package/dist/components/chat/renderers/index.js +2 -0
  8. package/dist/components/chat/renderers/index.js.map +1 -1
  9. package/dist/components/chat/renderers/pi-tools.d.ts +3 -0
  10. package/dist/components/chat/renderers/pi-tools.d.ts.map +1 -0
  11. package/dist/components/chat/renderers/pi-tools.js +112 -0
  12. package/dist/components/chat/renderers/pi-tools.js.map +1 -0
  13. package/dist/components/chat/risk-hints.d.ts +14 -2
  14. package/dist/components/chat/risk-hints.d.ts.map +1 -1
  15. package/dist/components/chat/risk-hints.js +54 -19
  16. package/dist/components/chat/risk-hints.js.map +1 -1
  17. package/dist/components/chat/tool-call-timeline.d.ts +1 -1
  18. package/dist/components/chat/tool-call-timeline.d.ts.map +1 -1
  19. package/dist/components/chat/tool-call-timeline.js +25 -14
  20. package/dist/components/chat/tool-call-timeline.js.map +1 -1
  21. package/dist/components/settings/models-tab.d.ts.map +1 -1
  22. package/dist/components/settings/models-tab.js +49 -2
  23. package/dist/components/settings/models-tab.js.map +1 -1
  24. package/dist/components/settings/pi-accounts.d.ts +13 -0
  25. package/dist/components/settings/pi-accounts.d.ts.map +1 -0
  26. package/dist/components/settings/pi-accounts.js +151 -0
  27. package/dist/components/settings/pi-accounts.js.map +1 -0
  28. package/dist/hooks/use-websocket.d.ts.map +1 -1
  29. package/dist/hooks/use-websocket.js +26 -2
  30. package/dist/hooks/use-websocket.js.map +1 -1
  31. package/dist/lib/api-client.d.ts +46 -0
  32. package/dist/lib/api-client.d.ts.map +1 -1
  33. package/dist/lib/api-client.js +28 -0
  34. package/dist/lib/api-client.js.map +1 -1
  35. package/dist/lib/tool-names.d.ts.map +1 -1
  36. package/dist/lib/tool-names.js +5 -1
  37. package/dist/lib/tool-names.js.map +1 -1
  38. package/dist/stores/chat-store.d.ts +8 -0
  39. package/dist/stores/chat-store.d.ts.map +1 -1
  40. package/dist/stores/chat-store.js +4 -0
  41. package/dist/stores/chat-store.js.map +1 -1
  42. package/dist/styles.css +1 -1
  43. package/package.json +2 -2
  44. package/src/components/chat/message-bubble.tsx +9 -1
  45. package/src/components/chat/renderers/claude-tools.tsx +32 -1
  46. package/src/components/chat/renderers/index.ts +2 -0
  47. package/src/components/chat/renderers/pi-tools.tsx +144 -0
  48. package/src/components/chat/risk-hints.ts +73 -25
  49. package/src/components/chat/tool-call-timeline.tsx +57 -16
  50. package/src/components/settings/models-tab.tsx +154 -1
  51. package/src/components/settings/pi-accounts.tsx +264 -0
  52. package/src/hooks/use-websocket.ts +29 -2
  53. package/src/lib/api-client.ts +66 -0
  54. package/src/lib/tool-names.ts +6 -1
  55. package/src/stores/chat-store.ts +16 -0
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { uiConfig } from "../../config.js";
3
- import { useRef, useState } from "react";
3
+ import { useEffect, useRef, useState } from "react";
4
4
  import { ChevronDown, Sparkles, Mic, Image as ImageIcon } from "lucide-react";
5
5
  import { ToolCallTimeline } from "./tool-call-timeline.js";
6
6
  import { MarkdownContent } from "./markdown-content.js";
@@ -114,6 +114,15 @@ function AssistantContent({ message, onToolApproval, onAskUserSubmit, onAskUserC
114
114
  }
115
115
  function ThinkingSection({ content, isStreaming, }) {
116
116
  const [expanded, setExpanded] = useState(isStreaming);
117
+ // Auto-collapse when the thinking finishes: the blurb is process, not
118
+ // product — the answer below it is what the reader is waiting for. It stays
119
+ // reopenable via the collapsed "Thought for ~N tokens" button.
120
+ const prevStreaming = useRef(isStreaming);
121
+ useEffect(() => {
122
+ if (prevStreaming.current && !isStreaming)
123
+ setExpanded(false);
124
+ prevStreaming.current = isStreaming;
125
+ }, [isStreaming]);
117
126
  if (!isStreaming && !expanded) {
118
127
  // Collapsed: minimal clickable text
119
128
  const estimatedTokens = Math.round(content.length / 4);
@@ -1 +1 @@
1
- {"version":3,"file":"message-bubble.js","sourceRoot":"","sources":["../../../src/components/chat/message-bubble.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"message-bubble.js","sourceRoot":"","sources":["../../../src/components/chat/message-bubble.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"claude-tools.d.ts","sourceRoot":"","sources":["../../../../src/components/chat/renderers/claude-tools.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAA8B,MAAM,iCAAiC,CAAC;AA4ChG,eAAO,MAAM,cAAc,EAAE,YAG5B,CAAC"}
1
+ {"version":3,"file":"claude-tools.d.ts","sourceRoot":"","sources":["../../../../src/components/chat/renderers/claude-tools.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,YAAY,EAIb,MAAM,iCAAiC,CAAC;AAsEzC,eAAO,MAAM,cAAc,EAAE,YAG5B,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { GET_LOCATION_TOOL_NAME } from "../../../lib/tool-names.js";
3
- import { getToolIcon, getToolSummary, getOutputMeta, ToolInputView, ToolOutputView, } from "../tool-views.js";
3
+ import { getToolIcon, getToolSummary, getOutputMeta, getTouchedFile, ToolInputView, ToolOutputView, } from "../tool-views.js";
4
4
  /** Claude tool names with dedicated iconography / summaries. */
5
5
  const CLAUDE_TOOL_NAMES = [
6
6
  "Bash",
@@ -21,14 +21,34 @@ const CLAUDE_TOOL_NAMES = [
21
21
  // The timeline passes the full ToolCall at runtime, so widening the neutral
22
22
  // ToolCallView back to ToolCall here is safe.
23
23
  const asToolCall = (tool) => tool;
24
+ const str = (v) => (typeof v === "string" ? v : "");
25
+ /** Backend-neutral meaning of Claude's shell tool, for risk advisories. */
26
+ const bashSemantics = {
27
+ command: (tool) => str(tool.input?.command) || null,
28
+ unsandboxed: (tool) => Boolean(tool.input?.dangerouslyDisableSandbox),
29
+ };
30
+ /** Claude's file-writing tools all name their target in the input. */
31
+ const writeSemantics = {
32
+ writePath: (tool) => str(tool.input?.file_path) || str(tool.input?.notebook_path) || null,
33
+ };
34
+ /** Per-tool contract extras beyond the shared switch-based views. */
35
+ const CLAUDE_TOOL_EXTRAS = {
36
+ Bash: { semantics: bashSemantics },
37
+ Edit: { semantics: writeSemantics },
38
+ Write: { semantics: writeSemantics },
39
+ NotebookEdit: { semantics: writeSemantics },
40
+ Agent: { subagentRows: true },
41
+ };
24
42
  function claudeRenderer(name) {
25
43
  return {
26
44
  match: name,
27
45
  icon: getToolIcon(name),
28
46
  summary: (tool) => getToolSummary(asToolCall(tool)),
29
47
  meta: (tool) => getOutputMeta(asToolCall(tool)),
48
+ touchedFile: (tool) => getTouchedFile(asToolCall(tool)),
30
49
  Input: ({ tool }) => _jsx(ToolInputView, { tool: asToolCall(tool) }),
31
50
  Output: ({ tool }) => _jsx(ToolOutputView, { tool: asToolCall(tool) }),
51
+ ...CLAUDE_TOOL_EXTRAS[name],
32
52
  };
33
53
  }
34
54
  export const claudeToolPack = {
@@ -1 +1 @@
1
- {"version":3,"file":"claude-tools.js","sourceRoot":"","sources":["../../../../src/components/chat/renderers/claude-tools.tsx"],"names":[],"mappings":";AAOA,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EACL,WAAW,EACX,cAAc,EACd,aAAa,EACb,aAAa,EACb,cAAc,GACf,MAAM,kBAAkB,CAAC;AAE1B,gEAAgE;AAChE,MAAM,iBAAiB,GAAG;IACxB,MAAM;IACN,MAAM;IACN,OAAO;IACP,MAAM;IACN,MAAM;IACN,MAAM;IACN,WAAW;IACX,UAAU;IACV,OAAO;IACP,OAAO;IACP,cAAc;IACd,KAAK;IACL,sBAAsB;CACvB,CAAC;AAEF,gFAAgF;AAChF,4EAA4E;AAC5E,8CAA8C;AAC9C,MAAM,UAAU,GAAG,CAAC,IAAkB,EAAE,EAAE,CAAC,IAA2B,CAAC;AAEvE,SAAS,cAAc,CAAC,IAAY;IAClC,OAAO;QACL,KAAK,EAAE,IAAI;QACX,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC;QACvB,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACnD,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAC/C,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,KAAC,aAAa,IAAC,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,GAAI;QAC9D,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,KAAC,cAAc,IAAC,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,GAAI;KACjE,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,cAAc,GAAiB;IAC1C,OAAO,EAAE,QAAQ;IACjB,SAAS,EAAE,iBAAiB,CAAC,GAAG,CAAC,cAAc,CAAC;CACjD,CAAC"}
1
+ {"version":3,"file":"claude-tools.js","sourceRoot":"","sources":["../../../../src/components/chat/renderers/claude-tools.tsx"],"names":[],"mappings":";AAYA,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EACL,WAAW,EACX,cAAc,EACd,aAAa,EACb,cAAc,EACd,aAAa,EACb,cAAc,GACf,MAAM,kBAAkB,CAAC;AAE1B,gEAAgE;AAChE,MAAM,iBAAiB,GAAG;IACxB,MAAM;IACN,MAAM;IACN,OAAO;IACP,MAAM;IACN,MAAM;IACN,MAAM;IACN,WAAW;IACX,UAAU;IACV,OAAO;IACP,OAAO;IACP,cAAc;IACd,KAAK;IACL,sBAAsB;CACvB,CAAC;AAEF,gFAAgF;AAChF,4EAA4E;AAC5E,8CAA8C;AAC9C,MAAM,UAAU,GAAG,CAAC,IAAkB,EAAE,EAAE,CAAC,IAA2B,CAAC;AAEvE,MAAM,GAAG,GAAG,CAAC,CAAU,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAE7D,2EAA2E;AAC3E,MAAM,aAAa,GAAkB;IACnC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,IAAI;IACnD,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,yBAAyB,CAAC;CACtE,CAAC;AAEF,sEAAsE;AACtE,MAAM,cAAc,GAAkB;IACpC,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE,CAClB,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,aAAa,CAAC,IAAI,IAAI;CACvE,CAAC;AAEF,qEAAqE;AACrE,MAAM,kBAAkB,GAA0C;IAChE,IAAI,EAAE,EAAE,SAAS,EAAE,aAAa,EAAE;IAClC,IAAI,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE;IACnC,KAAK,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE;IACpC,YAAY,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE;IAC3C,KAAK,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE;CAC9B,CAAC;AAEF,SAAS,cAAc,CAAC,IAAY;IAClC,OAAO;QACL,KAAK,EAAE,IAAI;QACX,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC;QACvB,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACnD,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAC/C,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACvD,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,KAAC,aAAa,IAAC,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,GAAI;QAC9D,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,KAAC,cAAc,IAAC,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,GAAI;QAChE,GAAG,kBAAkB,CAAC,IAAI,CAAC;KAC5B,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,cAAc,GAAiB;IAC1C,OAAO,EAAE,QAAQ;IACjB,SAAS,EAAE,iBAAiB,CAAC,GAAG,CAAC,cAAc,CAAC;CACjD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/chat/renderers/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAmB,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAIjE,qDAAqD;AACrD,wBAAgB,wBAAwB,IAAI,IAAI,CAK/C;AAED,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/chat/renderers/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAmB,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAIjE,qDAAqD;AACrD,wBAAgB,wBAAwB,IAAI,IAAI,CAM/C;AAED,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
@@ -3,6 +3,7 @@
3
3
  // Runtime plugin loading into the compiled PWA is deliberately not supported.
4
4
  import { registerToolRenderers } from "@schlessera/brain-ui-sdk/client";
5
5
  import { claudeToolPack } from "./claude-tools.js";
6
+ import { piToolPack } from "./pi-tools.js";
6
7
  import { genericToolPack, GENERIC_RENDERER } from "./generic.js";
7
8
  let registered = false;
8
9
  /** Register the built-in packs once (idempotent). */
@@ -11,6 +12,7 @@ export function registerBuiltinRenderers() {
11
12
  return;
12
13
  registered = true;
13
14
  registerToolRenderers(claudeToolPack);
15
+ registerToolRenderers(piToolPack);
14
16
  registerToolRenderers(genericToolPack);
15
17
  }
16
18
  export { GENERIC_RENDERER };
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/chat/renderers/index.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,8EAA8E;AAC9E,8EAA8E;AAE9E,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEjE,IAAI,UAAU,GAAG,KAAK,CAAC;AAEvB,qDAAqD;AACrD,MAAM,UAAU,wBAAwB;IACtC,IAAI,UAAU;QAAE,OAAO;IACvB,UAAU,GAAG,IAAI,CAAC;IAClB,qBAAqB,CAAC,cAAc,CAAC,CAAC;IACtC,qBAAqB,CAAC,eAAe,CAAC,CAAC;AACzC,CAAC;AAED,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/chat/renderers/index.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,8EAA8E;AAC9E,8EAA8E;AAE9E,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEjE,IAAI,UAAU,GAAG,KAAK,CAAC;AAEvB,qDAAqD;AACrD,MAAM,UAAU,wBAAwB;IACtC,IAAI,UAAU;QAAE,OAAO;IACvB,UAAU,GAAG,IAAI,CAAC;IAClB,qBAAqB,CAAC,cAAc,CAAC,CAAC;IACtC,qBAAqB,CAAC,UAAU,CAAC,CAAC;IAClC,qBAAqB,CAAC,eAAe,CAAC,CAAC;AACzC,CAAC;AAED,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { RendererPack } from "@schlessera/brain-ui-sdk/client";
2
+ export declare const piToolPack: RendererPack;
3
+ //# sourceMappingURL=pi-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pi-tools.d.ts","sourceRoot":"","sources":["../../../../src/components/chat/renderers/pi-tools.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,YAAY,EAIb,MAAM,iCAAiC,CAAC;AAiIzC,eAAO,MAAM,UAAU,EAAE,YAGxB,CAAC"}
@@ -0,0 +1,112 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { getToolIcon, getOutputMeta, toRepoRelative, EditDiffView, WriteFileView, BashCommandView, KeyValueView, ClampedPre, FileRowsView, } from "../tool-views.js";
3
+ const asToolCall = (tool) => tool;
4
+ const str = (v) => (typeof v === "string" ? v : "");
5
+ /** pi names its path input `path`; the shared views read `file_path`. */
6
+ function withFilePath(tool) {
7
+ const t = asToolCall(tool);
8
+ return str(t.input?.file_path)
9
+ ? t
10
+ : { ...t, input: { ...t.input, file_path: t.input?.path } };
11
+ }
12
+ function pathSummary(tool) {
13
+ const path = str(tool.input?.path);
14
+ return path ? toRepoRelative(path) ?? path : null;
15
+ }
16
+ const writeSemantics = {
17
+ writePath: (tool) => str(tool.input?.path) || null,
18
+ };
19
+ function DefaultOutput({ tool }) {
20
+ if (!tool.output)
21
+ return null;
22
+ return _jsx(ClampedPre, { text: tool.output, isError: tool.isError });
23
+ }
24
+ const PI_RENDERERS = [
25
+ {
26
+ match: "bash",
27
+ icon: getToolIcon("Bash"),
28
+ summary: (tool) => str(tool.input?.command) || null,
29
+ meta: (tool) => getOutputMeta(asToolCall(tool)),
30
+ semantics: { command: (tool) => str(tool.input?.command) || null },
31
+ Input: ({ tool }) => _jsx(BashCommandView, { tool: asToolCall(tool) }),
32
+ Output: DefaultOutput,
33
+ },
34
+ {
35
+ match: "read_file",
36
+ icon: getToolIcon("Read"),
37
+ summary: pathSummary,
38
+ meta: (tool) => getOutputMeta(asToolCall(tool)),
39
+ Input: ({ tool }) => _jsx(KeyValueView, { tool: asToolCall(tool) }),
40
+ Output: DefaultOutput,
41
+ },
42
+ {
43
+ match: "write_file",
44
+ icon: getToolIcon("Write"),
45
+ summary: pathSummary,
46
+ meta: (tool) => getOutputMeta(asToolCall(tool)),
47
+ touchedFile: (tool) => str(tool.input?.path) || null,
48
+ semantics: writeSemantics,
49
+ Input: ({ tool }) => _jsx(WriteFileView, { tool: withFilePath(tool) }),
50
+ Output: DefaultOutput,
51
+ },
52
+ {
53
+ match: "edit_file",
54
+ icon: getToolIcon("Edit"),
55
+ summary: pathSummary,
56
+ meta: (tool) => getOutputMeta(asToolCall(tool)),
57
+ touchedFile: (tool) => str(tool.input?.path) || null,
58
+ semantics: writeSemantics,
59
+ Input: ({ tool }) => _jsx(EditDiffView, { tool: withFilePath(tool) }),
60
+ Output: DefaultOutput,
61
+ },
62
+ {
63
+ match: "grep",
64
+ icon: getToolIcon("Grep"),
65
+ summary: (tool) => {
66
+ const pattern = str(tool.input?.pattern);
67
+ if (!pattern)
68
+ return null;
69
+ const path = str(tool.input?.path);
70
+ return path ? `${pattern} in ${toRepoRelative(path) ?? path}` : pattern;
71
+ },
72
+ meta: (tool) => {
73
+ const t = asToolCall(tool);
74
+ if (t.output && !t.isError && t.output.trim() !== "No matches.") {
75
+ const rows = t.output.split("\n").filter(Boolean).length;
76
+ return `${rows} match${rows === 1 ? "" : "es"}`;
77
+ }
78
+ return getOutputMeta(t);
79
+ },
80
+ Input: ({ tool }) => _jsx(KeyValueView, { tool: asToolCall(tool) }),
81
+ Output: ({ tool }) => tool.output && !tool.isError ? (_jsx(FileRowsView, { output: tool.output })) : (_jsx(DefaultOutput, { tool: tool })),
82
+ },
83
+ {
84
+ match: "brain_search",
85
+ icon: getToolIcon("Grep"),
86
+ summary: (tool) => str(tool.input?.query) || null,
87
+ meta: (tool) => getOutputMeta(asToolCall(tool)),
88
+ Input: ({ tool }) => _jsx(KeyValueView, { tool: asToolCall(tool) }),
89
+ Output: DefaultOutput,
90
+ },
91
+ {
92
+ match: "brain_context",
93
+ icon: getToolIcon("Read"),
94
+ summary: (tool) => str(tool.input?.query) || null,
95
+ meta: (tool) => getOutputMeta(asToolCall(tool)),
96
+ Input: ({ tool }) => _jsx(KeyValueView, { tool: asToolCall(tool) }),
97
+ Output: DefaultOutput,
98
+ },
99
+ {
100
+ match: "brain_add",
101
+ icon: getToolIcon("Write"),
102
+ summary: (tool) => str(tool.input?.title) || str(tool.input?.type) || null,
103
+ meta: (tool) => getOutputMeta(asToolCall(tool)),
104
+ Input: ({ tool }) => _jsx(KeyValueView, { tool: asToolCall(tool) }),
105
+ Output: DefaultOutput,
106
+ },
107
+ ];
108
+ export const piToolPack = {
109
+ backend: "pi",
110
+ renderers: PI_RENDERERS,
111
+ };
112
+ //# sourceMappingURL=pi-tools.js.map
@@ -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: (tool: ToolCall) => boolean;
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;AAU3D;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAOvD;AAMD,MAAM,MAAM,QAAQ,GAAG;IACrB,IAAI,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,OAAO,CAAC;IAClC,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,QAAQ,EA2ChC,CAAC;AAEF,sEAAsE;AACtE,wBAAgB,SAAS,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,EAAE,CAUlD"}
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. Each rule is { test, message } so the list is easy to extend.
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: (t) => t.name === "Bash" && Boolean(t.input?.dangerouslyDisableSandbox),
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: (t) => t.name === "Bash" &&
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: (t) => t.name === "Bash" &&
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: (t) => t.name === "Bash" &&
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: (t) => {
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(tool))
107
+ if (rule.test(sem))
73
108
  hints.push(rule.message);
74
109
  }
75
110
  catch {
76
- // Defensive: never let a malformed input break the approval UI.
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":"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"}
1
+ {"version":3,"file":"risk-hints.js","sourceRoot":"","sources":["../../../src/components/chat/risk-hints.ts"],"names":[],"mappings":"AAGA,+DAA+D;AAC/D,2BAA2B;AAC3B,+DAA+D;AAC/D,EAAE;AACF,6EAA6E;AAC7E,8EAA8E;AAC9E,6EAA6E;AAC7E,6EAA6E;AAC7E,4EAA4E;AAE5E;;;;;;;;;GASG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,IAAI,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,IAAI,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5E,OAAO,IAAI,CAAC;IACd,CAAC;IACD,uDAAuD;IACvD,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1E,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,QAAQ,CAAC,CAAU;IAC1B,OAAO,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACxC,CAAC;AAYD;;;GAGG;AACH,SAAS,cAAc,CAAC,IAAc;IACpC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;IAC/B,MAAM,WAAW,GACf,SAAS,IAAI,KAAK;QAClB,YAAY,IAAI,KAAK;QACrB,YAAY,IAAI,KAAK;QACrB,YAAY,IAAI,KAAK,CAAC;IACxB,OAAO;QACL,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC;QACvD,SAAS,EAAE,WAAW;YACpB,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC;gBACzB,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC;gBAC7B,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;YACtB,CAAC,CAAC,EAAE;QACN,WAAW,EAAE,OAAO,CAAC,KAAK,CAAC,yBAAyB,CAAC;KACtD,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,gBAAgB,CAC9B,IAAc,EACd,SAAyB;IAEzB,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,CAAC,SAAS;QAAE,OAAO,OAAO,CAAC;IAC/B,OAAO;QACL,OAAO,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO;QAC5E,SAAS,EAAE,SAAS,CAAC,SAAS;YAC5B,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE;YACjC,CAAC,CAAC,OAAO,CAAC,SAAS;QACrB,WAAW,EAAE,SAAS,CAAC,WAAW;YAChC,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC;YAC7B,CAAC,CAAC,OAAO,CAAC,WAAW;KACxB,CAAC;AACJ,CAAC;AAOD,MAAM,CAAC,MAAM,UAAU,GAAe;IACpC;QACE,qEAAqE;QACrE,2EAA2E;QAC3E,4EAA4E;QAC5E,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,WAAW;QAC9B,OAAO,EAAE,0BAA0B;KACpC;IACD;QACE,yEAAyE;QACzE,2EAA2E;QAC3E,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CACZ,sDAAsD,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;QAC1E,OAAO,EAAE,oCAAoC;KAC9C;IACD;QACE,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CACZ,6DAA6D,CAAC,IAAI,CAChE,GAAG,CAAC,OAAO,CACZ;QACH,OAAO,EAAE,2BAA2B;KACrC;IACD;QACE,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CACZ,wCAAwC,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;QAC5D,OAAO,EAAE,oCAAoC;KAC9C;IACD;QACE,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC;QAC1E,OAAO,EAAE,+BAA+B;KACzC;CACF,CAAC;AAEF,sEAAsE;AACtE,MAAM,UAAU,SAAS,CAAC,IAAc,EAAE,SAAyB;IACjE,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,GAAsB,CAAC;IAC3B,IAAI,CAAC;QACH,GAAG,GAAG,gBAAgB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,gEAAgE;QAChE,OAAO,KAAK,CAAC;IACf,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;gBAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC/C,CAAC;QAAC,MAAM,CAAC;YACP,+BAA+B;QACjC,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -1,4 +1,4 @@
1
- import type { ToolCall } from "../../stores/chat-store.js";
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,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAqB3D,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,sCAwCA"}
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
- // One backend is active per deployment (v1). The shipped default is the Claude
19
- // backend; renderer resolution is backend-scoped so a future multi-backend
20
- // build can thread the real id through here.
21
- const BACKEND_ID = "claude";
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.map(getTouchedFile).filter(Boolean)).size;
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, BACKEND_ID) ?? GENERIC_RENDERER;
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: getToolLabel(toolCall.name) }), 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 })] })] }), toolCall.name === "Agent" && _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
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))) }));