MCPcopy Create free account
hub / github.com/UsefulSoftwareCo/executor / ToolTreeBody

Function ToolTreeBody

packages/react/src/components/tool-tree.tsx:466–573  ·  view source on GitHub ↗
(props: {
  tools: readonly ToolSummary[];
  selectedToolId: string | null;
  onSelect: (toolId: string) => void;
  onSetPolicy?: (pattern: string, action: ToolPolicyAction) => void;
  onClearPolicy?: (pattern: string) => void;
  patternForDisplay: (displayPattern: string) => string;
  exactPatterns: ReadonlyMap<string, ToolPolicyAction>;
  search: string;
  terms: readonly string[];
  selectedRowRef: React.Ref<HTMLButtonElement>;
})

Source from the content-addressed store, hash-verified

464// ---------------------------------------------------------------------------
465
466function ToolTreeBody(props: {
467 tools: readonly ToolSummary[];
468 selectedToolId: string | null;
469 onSelect: (toolId: string) => void;
470 onSetPolicy?: (pattern: string, action: ToolPolicyAction) => void;
471 onClearPolicy?: (pattern: string) => void;
472 patternForDisplay: (displayPattern: string) => string;
473 exactPatterns: ReadonlyMap<string, ToolPolicyAction>;
474 search: string;
475 terms: readonly string[];
476 selectedRowRef: React.Ref<HTMLButtonElement>;
477}) {
478 const {
479 tools,
480 selectedToolId,
481 onSelect,
482 onSetPolicy,
483 onClearPolicy,
484 patternForDisplay,
485 exactPatterns,
486 search,
487 terms,
488 selectedRowRef,
489 } = props;
490 const [manualOpen, setManualOpen] = useState<Set<string>>(() => new Set());
491
492 const tree = useMemo(() => buildTree(tools), [tools]);
493
494 // When searching, expand everything so matches are visible.
495 // Also auto-expand groups that contain the selected tool.
496 const openSet = useMemo(() => {
497 if (terms.length > 0) {
498 const all = new Set<string>();
499 collectGroupPaths(tree, all);
500 return all;
501 }
502 const set = new Set(manualOpen);
503 if (selectedToolId) {
504 const parts = selectedToolId.split(".");
505 // Progressively add ancestor paths (best-effort, based on dotted name).
506 let acc = "";
507 for (let i = 0; i < parts.length - 1; i++) {
508 acc = acc ? `${acc}.${parts[i]}` : parts[i]!;
509 set.add(acc);
510 }
511 }
512 return set;
513 }, [tree, manualOpen, selectedToolId, terms.length]);
514
515 const rows = useMemo(() => {
516 const acc: Row[] = [];
517 flattenTree(tree, 0, openSet, acc);
518 return acc;
519 }, [tree, openSet]);
520
521 const toggleGroup = (path: string) => {
522 setManualOpen((prev) => {
523 const next = new Set(prev);

Callers

nothing calls this directly

Calls 6

trackEventFunction · 0.90
buildTreeFunction · 0.85
collectGroupPathsFunction · 0.85
flattenTreeFunction · 0.85
toggleGroupFunction · 0.85
getMethod · 0.65

Tested by

no test coverage detected