@stigmer/react 0.0.52 → 0.0.53

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 (71) hide show
  1. package/deployment-mode.d.ts +35 -0
  2. package/deployment-mode.d.ts.map +1 -0
  3. package/deployment-mode.js +41 -0
  4. package/deployment-mode.js.map +1 -0
  5. package/execution/ApprovalCard.d.ts +8 -6
  6. package/execution/ApprovalCard.d.ts.map +1 -1
  7. package/execution/ApprovalCard.js +34 -96
  8. package/execution/ApprovalCard.js.map +1 -1
  9. package/execution/McpToolDetail.d.ts +48 -0
  10. package/execution/McpToolDetail.d.ts.map +1 -0
  11. package/execution/McpToolDetail.js +159 -0
  12. package/execution/McpToolDetail.js.map +1 -0
  13. package/execution/ToolArgsView.d.ts +41 -0
  14. package/execution/ToolArgsView.d.ts.map +1 -0
  15. package/execution/ToolArgsView.js +132 -0
  16. package/execution/ToolArgsView.js.map +1 -0
  17. package/execution/ToolCallDetail.d.ts +11 -4
  18. package/execution/ToolCallDetail.d.ts.map +1 -1
  19. package/execution/ToolCallDetail.js +30 -101
  20. package/execution/ToolCallDetail.js.map +1 -1
  21. package/execution/ToolCallGroup.d.ts.map +1 -1
  22. package/execution/ToolCallGroup.js +3 -2
  23. package/execution/ToolCallGroup.js.map +1 -1
  24. package/execution/ToolCallItem.d.ts +2 -0
  25. package/execution/ToolCallItem.d.ts.map +1 -1
  26. package/execution/ToolCallItem.js +6 -2
  27. package/execution/ToolCallItem.js.map +1 -1
  28. package/execution/index.d.ts +7 -1
  29. package/execution/index.d.ts.map +1 -1
  30. package/execution/index.js +4 -1
  31. package/execution/index.js.map +1 -1
  32. package/execution/tool-categories.d.ts +35 -8
  33. package/execution/tool-categories.d.ts.map +1 -1
  34. package/execution/tool-categories.js +76 -10
  35. package/execution/tool-categories.js.map +1 -1
  36. package/execution/tool-rendering-primitives.d.ts +61 -0
  37. package/execution/tool-rendering-primitives.d.ts.map +1 -0
  38. package/execution/tool-rendering-primitives.js +106 -0
  39. package/execution/tool-rendering-primitives.js.map +1 -0
  40. package/index.d.ts +5 -2
  41. package/index.d.ts.map +1 -1
  42. package/index.js +5 -1
  43. package/index.js.map +1 -1
  44. package/internal/CloudFeatureNotice.d.ts +19 -0
  45. package/internal/CloudFeatureNotice.d.ts.map +1 -0
  46. package/internal/CloudFeatureNotice.js +21 -0
  47. package/internal/CloudFeatureNotice.js.map +1 -0
  48. package/mcp-server/McpServerDetailView.d.ts +15 -1
  49. package/mcp-server/McpServerDetailView.d.ts.map +1 -1
  50. package/mcp-server/McpServerDetailView.js +11 -3
  51. package/mcp-server/McpServerDetailView.js.map +1 -1
  52. package/package.json +4 -4
  53. package/provider.d.ts +14 -2
  54. package/provider.d.ts.map +1 -1
  55. package/provider.js +3 -2
  56. package/provider.js.map +1 -1
  57. package/src/deployment-mode.ts +46 -0
  58. package/src/execution/ApprovalCard.tsx +130 -283
  59. package/src/execution/McpToolDetail.tsx +283 -0
  60. package/src/execution/ToolArgsView.tsx +277 -0
  61. package/src/execution/ToolCallDetail.tsx +51 -219
  62. package/src/execution/ToolCallGroup.tsx +3 -2
  63. package/src/execution/ToolCallItem.tsx +14 -2
  64. package/src/execution/index.ts +25 -0
  65. package/src/execution/tool-categories.ts +89 -9
  66. package/src/execution/tool-rendering-primitives.tsx +253 -0
  67. package/src/index.ts +13 -0
  68. package/src/internal/CloudFeatureNotice.tsx +60 -0
  69. package/src/mcp-server/McpServerDetailView.tsx +24 -2
  70. package/src/provider.tsx +18 -2
  71. package/styles.css +1 -1
@@ -0,0 +1,35 @@
1
+ import type { DeploymentMode } from "@stigmer/sdk";
2
+ import { ApiResourceKind } from "@stigmer/sdk";
3
+ /**
4
+ * React context for the current deployment mode.
5
+ *
6
+ * Separated from the provider to mirror the `StigmerContext` / `context.ts`
7
+ * pattern and avoid circular imports.
8
+ *
9
+ * Defaults to `"cloud"` so existing consumers who don't pass
10
+ * `deploymentMode` to `StigmerProvider` see all features enabled.
11
+ */
12
+ export declare const DeploymentModeContext: import("react").Context<DeploymentMode>;
13
+ /**
14
+ * Read the deployment mode from the nearest `StigmerProvider`.
15
+ *
16
+ * Returns `"local"` when connected to the local Go CLI server (OSS)
17
+ * and `"cloud"` when connected to Stigmer Cloud.
18
+ */
19
+ export declare function useDeploymentMode(): DeploymentMode;
20
+ /**
21
+ * Check whether a given {@link ApiResourceKind} is available in the
22
+ * current deployment mode.
23
+ *
24
+ * Combines the deployment mode from context with the proto-derived
25
+ * tier metadata via {@link isResourceAvailable}.
26
+ *
27
+ * @example
28
+ * ```tsx
29
+ * const available = useResourceAvailable(ApiResourceKind.api_key);
30
+ * if (!available) return <CloudFeatureNotice>...</CloudFeatureNotice>;
31
+ * ```
32
+ */
33
+ export declare function useResourceAvailable(kind: ApiResourceKind): boolean;
34
+ export { type DeploymentMode, ApiResourceKind };
35
+ //# sourceMappingURL=deployment-mode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deployment-mode.d.ts","sourceRoot":"","sources":["../src/deployment-mode.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAuB,eAAe,EAAE,MAAM,cAAc,CAAC;AAEpE;;;;;;;;GAQG;AACH,eAAO,MAAM,qBAAqB,yCAAyC,CAAC;AAE5E;;;;;GAKG;AACH,wBAAgB,iBAAiB,IAAI,cAAc,CAElD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAGnE;AAED,OAAO,EAAE,KAAK,cAAc,EAAE,eAAe,EAAE,CAAC"}
@@ -0,0 +1,41 @@
1
+ "use client";
2
+ import { createContext, useContext } from "react";
3
+ import { isResourceAvailable, ApiResourceKind } from "@stigmer/sdk";
4
+ /**
5
+ * React context for the current deployment mode.
6
+ *
7
+ * Separated from the provider to mirror the `StigmerContext` / `context.ts`
8
+ * pattern and avoid circular imports.
9
+ *
10
+ * Defaults to `"cloud"` so existing consumers who don't pass
11
+ * `deploymentMode` to `StigmerProvider` see all features enabled.
12
+ */
13
+ export const DeploymentModeContext = createContext("cloud");
14
+ /**
15
+ * Read the deployment mode from the nearest `StigmerProvider`.
16
+ *
17
+ * Returns `"local"` when connected to the local Go CLI server (OSS)
18
+ * and `"cloud"` when connected to Stigmer Cloud.
19
+ */
20
+ export function useDeploymentMode() {
21
+ return useContext(DeploymentModeContext);
22
+ }
23
+ /**
24
+ * Check whether a given {@link ApiResourceKind} is available in the
25
+ * current deployment mode.
26
+ *
27
+ * Combines the deployment mode from context with the proto-derived
28
+ * tier metadata via {@link isResourceAvailable}.
29
+ *
30
+ * @example
31
+ * ```tsx
32
+ * const available = useResourceAvailable(ApiResourceKind.api_key);
33
+ * if (!available) return <CloudFeatureNotice>...</CloudFeatureNotice>;
34
+ * ```
35
+ */
36
+ export function useResourceAvailable(kind) {
37
+ const mode = useDeploymentMode();
38
+ return isResourceAvailable(kind, mode);
39
+ }
40
+ export { ApiResourceKind };
41
+ //# sourceMappingURL=deployment-mode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deployment-mode.js","sourceRoot":"","sources":["../src/deployment-mode.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAElD,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAEpE;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,aAAa,CAAiB,OAAO,CAAC,CAAC;AAE5E;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,UAAU,CAAC,qBAAqB,CAAC,CAAC;AAC3C,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAqB;IACxD,MAAM,IAAI,GAAG,iBAAiB,EAAE,CAAC;IACjC,OAAO,mBAAmB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACzC,CAAC;AAED,OAAO,EAAuB,eAAe,EAAE,CAAC"}
@@ -14,13 +14,15 @@ export interface ApprovalCardProps {
14
14
  readonly className?: string;
15
15
  }
16
16
  /**
17
- * Renders a pending tool-call approval request as a prominent card
18
- * with Approve, Skip, and Reject action buttons.
17
+ * Renders a pending tool-call approval request with the same visual
18
+ * structure as an expanded {@link ToolCallItem} in the history list.
19
19
  *
20
- * Tool-type-aware: shell tools render the command in a terminal-style
21
- * block, file tools show the path prominently, and destructive tools
22
- * (delete) use warning styling. Falls back to generic JSON args
23
- * display for unrecognized tools.
20
+ * The compact header row matches the ToolCallItem layout:
21
+ * [CategoryIcon] Label primaryArg [⏳ waiting Xm]
22
+ *
23
+ * Arguments are rendered through the shared {@link ToolArgsView}
24
+ * dispatch, ensuring pixel-level parity between the approval
25
+ * preview and the post-execution detail view.
24
26
  *
25
27
  * @example
26
28
  * ```tsx
@@ -1 +1 @@
1
- {"version":3,"file":"ApprovalCard.d.ts","sourceRoot":"","sources":["../../src/execution/ApprovalCard.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kEAAkE,CAAC;AACxG,OAAO,EAAE,cAAc,EAAE,MAAM,8DAA8D,CAAC;AAQ9F,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAC;IAC1C;;;;;OAKG;IACH,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACtE,mEAAmE;IACnE,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAID;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,YAAY,CAAC,EAC3B,eAAe,EACf,QAAQ,EACR,YAAoB,EACpB,SAAS,GACV,EAAE,iBAAiB,2CA4GnB"}
1
+ {"version":3,"file":"ApprovalCard.d.ts","sourceRoot":"","sources":["../../src/execution/ApprovalCard.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kEAAkE,CAAC;AACxG,OAAO,EAAE,cAAc,EAAE,MAAM,8DAA8D,CAAC;AAS9F,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAC;IAC1C;;;;;OAKG;IACH,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACtE,mEAAmE;IACnE,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,YAAY,CAAC,EAC3B,eAAe,EACf,QAAQ,EACR,YAAoB,EACpB,SAAS,GACV,EAAE,iBAAiB,2CAsJnB"}
@@ -4,16 +4,18 @@ import { useCallback, useEffect, useMemo, useState } from "react";
4
4
  import { ApprovalAction } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
5
5
  import { cn } from "@stigmer/theme";
6
6
  import { resolveToolCategory, extractPrimaryArgFromPreview, } from "./tool-categories";
7
- import { FilePathLink } from "./FilePathLink";
8
- const TRUNCATION_LINE_LIMIT = 8;
7
+ import { CATEGORY_ICON } from "./ToolCallItem";
8
+ import { ToolArgsView } from "./ToolArgsView";
9
9
  /**
10
- * Renders a pending tool-call approval request as a prominent card
11
- * with Approve, Skip, and Reject action buttons.
10
+ * Renders a pending tool-call approval request with the same visual
11
+ * structure as an expanded {@link ToolCallItem} in the history list.
12
12
  *
13
- * Tool-type-aware: shell tools render the command in a terminal-style
14
- * block, file tools show the path prominently, and destructive tools
15
- * (delete) use warning styling. Falls back to generic JSON args
16
- * display for unrecognized tools.
13
+ * The compact header row matches the ToolCallItem layout:
14
+ * [CategoryIcon] Label primaryArg [⏳ waiting Xm]
15
+ *
16
+ * Arguments are rendered through the shared {@link ToolArgsView}
17
+ * dispatch, ensuring pixel-level parity between the approval
18
+ * preview and the post-execution detail view.
17
19
  *
18
20
  * @example
19
21
  * ```tsx
@@ -35,86 +37,31 @@ export function ApprovalCard({ pendingApproval, onSubmit, isSubmitting = false,
35
37
  setActiveAction(null);
36
38
  }
37
39
  }, [isSubmitting]);
38
- const categoryInfo = resolveToolCategory(pendingApproval.toolName);
39
- const primaryArg = extractPrimaryArgFromPreview(pendingApproval.toolName, pendingApproval.argsPreview);
40
- const { header, headerIcon, borderClass } = getApprovalHeader(categoryInfo.category, pendingApproval.fromSubAgent);
41
- return (_jsxs("div", { role: "alert", "aria-label": `Approval required for ${pendingApproval.toolName}`, className: cn("rounded-lg border px-4 py-3", borderClass, className), children: [_jsxs("div", { className: "flex items-center gap-2 text-sm font-medium text-warning", children: [headerIcon, _jsx("span", { children: header })] }), pendingApproval.fromSubAgent && pendingApproval.subAgentName && (_jsxs("p", { className: "mt-1.5 text-xs text-muted-foreground", children: ["Sub-agent", " ", _jsx("span", { className: "font-medium text-foreground", children: pendingApproval.subAgentName }), " ", "wants to execute a tool"] })), _jsxs("div", { className: "mt-2 flex items-center gap-2", children: [_jsx("span", { className: "rounded bg-muted px-1.5 py-0.5 font-mono text-xs text-foreground", children: categoryInfo.label }), _jsx(WaitingDuration, { requestedAt: pendingApproval.requestedAt })] }), pendingApproval.message && (_jsx("p", { className: "mt-2 text-sm text-foreground", children: pendingApproval.message })), _jsx("div", { className: "mt-2", children: _jsx(CategoryArgsPreview, { category: categoryInfo.category, primaryArg: primaryArg, argsPreview: pendingApproval.argsPreview }) }), _jsxs("div", { className: "mt-3 flex items-center gap-2", children: [_jsx(ActionButton, { label: "Approve", action: ApprovalAction.APPROVE, activeAction: activeAction, isSubmitting: isSubmitting, onClick: handleAction, variant: "approve" }), _jsx(ActionButton, { label: "Skip", action: ApprovalAction.SKIP, activeAction: activeAction, isSubmitting: isSubmitting, onClick: handleAction, variant: "skip" }), _jsx(ActionButton, { label: "Reject", action: ApprovalAction.REJECT, activeAction: activeAction, isSubmitting: isSubmitting, onClick: handleAction, variant: "reject" })] })] }));
42
- }
43
- // ---------------------------------------------------------------------------
44
- // Category-aware header
45
- // ---------------------------------------------------------------------------
46
- function getApprovalHeader(category, fromSubAgent) {
47
- if (fromSubAgent) {
48
- return {
49
- header: "Sub-agent approval required",
50
- headerIcon: _jsx(ShieldIcon, {}),
51
- borderClass: "border-warning/30 bg-warning/5",
52
- };
53
- }
54
- switch (category) {
55
- case "shell":
56
- return {
57
- header: "Execute command",
58
- headerIcon: _jsx(TerminalApprovalIcon, {}),
59
- borderClass: "border-warning/30 bg-warning/5",
60
- };
61
- case "delete":
62
- return {
63
- header: "Delete file",
64
- headerIcon: _jsx(ShieldIcon, {}),
65
- borderClass: "border-destructive/30 bg-destructive/5",
66
- };
67
- default:
68
- return {
69
- header: "Approval required",
70
- headerIcon: _jsx(ShieldIcon, {}),
71
- borderClass: "border-warning/30 bg-warning/5",
72
- };
73
- }
74
- }
75
- // ---------------------------------------------------------------------------
76
- // Category-specific args preview
77
- // ---------------------------------------------------------------------------
78
- function CategoryArgsPreview({ category, primaryArg, argsPreview, }) {
79
- if (category === "shell" && primaryArg) {
80
- return _jsx(ShellArgsPreview, { command: primaryArg });
81
- }
82
- if ((category === "read" || category === "write" || category === "edit" || category === "delete") && primaryArg) {
83
- return _jsx(FileArgsPreview, { path: primaryArg, argsPreview: argsPreview });
84
- }
85
- if ((category === "search" || category === "list") && primaryArg) {
86
- return _jsx(SearchArgsPreview, { pattern: primaryArg });
87
- }
88
- if (!argsPreview)
89
- return null;
90
- return _jsx(GenericArgsPreview, { content: argsPreview });
91
- }
92
- function ShellArgsPreview({ command }) {
93
- return (_jsx("div", { className: "rounded-md border border-border bg-[var(--stgm-terminal-bg,#1a1a2e)] p-2.5", children: _jsxs("pre", { className: "whitespace-pre-wrap break-words font-mono text-xs text-[var(--stgm-terminal-fg,#e0e0e0)]", children: [_jsx("span", { className: "select-none text-[var(--stgm-terminal-prompt,#6b7280)]", children: "$ " }), command] }) }));
94
- }
95
- function FileArgsPreview({ path, argsPreview, }) {
96
- return (_jsxs("div", { className: "space-y-1.5", children: [_jsxs("div", { className: "flex items-center gap-1.5 text-xs", children: [_jsx(FilePathIcon, {}), _jsx(FilePathLink, { path: path, className: "text-xs" })] }), argsPreview && _jsx(GenericArgsPreview, { content: argsPreview })] }));
97
- }
98
- function SearchArgsPreview({ pattern }) {
99
- return (_jsxs("div", { className: "flex items-center gap-1.5 text-xs", children: [_jsx("span", { className: "text-muted-foreground", children: "Pattern:" }), _jsx("code", { className: "rounded bg-muted px-1.5 py-0.5 font-mono text-foreground", children: pattern })] }));
100
- }
101
- function GenericArgsPreview({ content }) {
102
- const formatted = useMemo(() => {
40
+ const categoryInfo = resolveToolCategory(pendingApproval.toolName, pendingApproval.mcpServerSlug);
41
+ const CategoryIcon = CATEGORY_ICON[categoryInfo.category];
42
+ const primaryArg = useMemo(() => extractPrimaryArgFromPreview(pendingApproval.toolName, pendingApproval.argsPreview, pendingApproval.mcpServerSlug), [
43
+ pendingApproval.toolName,
44
+ pendingApproval.argsPreview,
45
+ pendingApproval.mcpServerSlug,
46
+ ]);
47
+ const parsedArgs = useMemo(() => {
48
+ if (!pendingApproval.argsPreview)
49
+ return null;
103
50
  try {
104
- const parsed = JSON.parse(content);
105
- return JSON.stringify(parsed, null, 2);
51
+ const parsed = JSON.parse(pendingApproval.argsPreview);
52
+ if (typeof parsed === "object" && parsed !== null) {
53
+ return parsed;
54
+ }
55
+ return null;
106
56
  }
107
57
  catch {
108
- return content;
58
+ return null;
109
59
  }
110
- }, [content]);
111
- const lines = formatted.split("\n");
112
- const needsTruncation = lines.length > TRUNCATION_LINE_LIMIT;
113
- const [isExpanded, setIsExpanded] = useState(false);
114
- const displayContent = needsTruncation && !isExpanded
115
- ? lines.slice(0, TRUNCATION_LINE_LIMIT).join("\n") + "\n\u2026"
116
- : formatted;
117
- return (_jsxs("div", { className: "space-y-1", children: [_jsx("span", { className: "text-xs font-medium text-muted-foreground", children: "Arguments" }), _jsx("pre", { className: "max-h-48 overflow-auto whitespace-pre-wrap break-words rounded-md border border-border bg-muted/40 p-2 font-mono text-xs text-foreground", children: displayContent }), needsTruncation && (_jsx("button", { type: "button", onClick: () => setIsExpanded((v) => !v), className: "text-xs font-medium text-primary transition-colors hover:text-primary/80", children: isExpanded ? "Show less" : `Show all ${lines.length} lines` }))] }));
60
+ }, [pendingApproval.argsPreview]);
61
+ const borderClass = categoryInfo.category === "delete"
62
+ ? "border-destructive/30 bg-destructive/5"
63
+ : "border-warning/30 bg-warning/5";
64
+ return (_jsxs("div", { role: "alert", "aria-label": `Approval required for ${pendingApproval.toolName}`, className: cn("rounded-lg border", borderClass, className), children: [_jsxs("div", { className: cn("flex items-center gap-2 px-2.5 py-1.5 text-xs", "border-b border-border/30"), children: [_jsx("span", { className: "shrink-0 text-warning", "aria-hidden": "true", children: _jsx(CategoryIcon, {}) }), _jsxs("span", { className: "min-w-0 flex-1 flex items-baseline gap-1.5 overflow-hidden", children: [_jsx("span", { className: "shrink-0 font-medium text-foreground", children: categoryInfo.label }), primaryArg && (_jsx("span", { className: "min-w-0 truncate font-mono text-muted-foreground", children: primaryArg }))] }), _jsx(WaitingDuration, { requestedAt: pendingApproval.requestedAt }), _jsx("span", { className: "shrink-0 text-warning", "aria-hidden": "true", children: _jsx(ClockIcon, {}) })] }), _jsxs("div", { className: "px-3 py-2.5 space-y-2", children: [pendingApproval.fromSubAgent && pendingApproval.subAgentName && (_jsxs("p", { className: "text-xs text-muted-foreground", children: ["Sub-agent", " ", _jsx("span", { className: "font-medium text-foreground", children: pendingApproval.subAgentName }), " ", "wants to execute this tool"] })), pendingApproval.message && (_jsx("p", { className: "text-xs text-foreground", children: pendingApproval.message })), parsedArgs && (_jsx(ToolArgsView, { toolName: pendingApproval.toolName, args: parsedArgs, mcpServerSlug: pendingApproval.mcpServerSlug })), _jsxs("div", { className: "flex items-center gap-2 pt-1", children: [_jsx(ActionButton, { label: "Approve", action: ApprovalAction.APPROVE, activeAction: activeAction, isSubmitting: isSubmitting, onClick: handleAction, variant: "approve" }), _jsx(ActionButton, { label: "Skip", action: ApprovalAction.SKIP, activeAction: activeAction, isSubmitting: isSubmitting, onClick: handleAction, variant: "skip" }), _jsx(ActionButton, { label: "Reject", action: ApprovalAction.REJECT, activeAction: activeAction, isSubmitting: isSubmitting, onClick: handleAction, variant: "reject" })] })] })] }));
118
65
  }
119
66
  // ---------------------------------------------------------------------------
120
67
  // Internal sub-components
@@ -129,9 +76,6 @@ function ActionButton({ label, action, activeAction, isSubmitting, onClick, vari
129
76
  };
130
77
  return (_jsxs("button", { type: "button", disabled: disabled, onClick: () => onClick(action), "aria-label": label, className: cn("inline-flex items-center justify-center gap-1.5 rounded-md px-3 py-1.5 text-xs font-medium transition-colors", "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2", "disabled:cursor-not-allowed", variantClasses[variant]), children: [isActive && isSubmitting ? _jsx(SpinnerIcon, {}) : null, label] }));
131
78
  }
132
- /**
133
- * Live-ticking elapsed time since the approval was requested.
134
- */
135
79
  function WaitingDuration({ requestedAt }) {
136
80
  const startMs = useMemo(() => {
137
81
  if (!requestedAt)
@@ -153,7 +97,7 @@ function WaitingDuration({ requestedAt }) {
153
97
  }, [startMs]);
154
98
  if (elapsed === null)
155
99
  return null;
156
- return (_jsxs("span", { className: "text-xs text-muted-foreground", children: ["waiting ", formatElapsed(elapsed)] }));
100
+ return (_jsx("span", { className: "shrink-0 text-xs text-muted-foreground", children: formatElapsed(elapsed) }));
157
101
  }
158
102
  function formatElapsed(ms) {
159
103
  if (ms < 1000)
@@ -177,14 +121,8 @@ function formatElapsed(ms) {
177
121
  // ---------------------------------------------------------------------------
178
122
  // Inline SVG icons
179
123
  // ---------------------------------------------------------------------------
180
- function ShieldIcon() {
181
- return (_jsxs("svg", { width: "14", height: "14", viewBox: "0 0 14 14", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: [_jsx("path", { d: "M7 1L2 3.5V6.5C2 9.75 4.1 12.35 7 13C9.9 12.35 12 9.75 12 6.5V3.5L7 1Z" }), _jsx("path", { d: "M7 5V8" }), _jsx("circle", { cx: "7", cy: "10", r: "0.5", fill: "currentColor", stroke: "none" })] }));
182
- }
183
- function TerminalApprovalIcon() {
184
- return (_jsxs("svg", { width: "14", height: "14", viewBox: "0 0 14 14", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: [_jsx("rect", { x: "1", y: "2", width: "12", height: "10", rx: "2" }), _jsx("path", { d: "M4 5.5L6 7.5L4 9.5" }), _jsx("path", { d: "M7.5 9.5H10" })] }));
185
- }
186
- function FilePathIcon() {
187
- return (_jsxs("svg", { width: "10", height: "10", viewBox: "0 0 12 12", fill: "none", stroke: "currentColor", strokeWidth: "1.2", strokeLinecap: "round", strokeLinejoin: "round", className: "shrink-0 text-muted-foreground", "aria-hidden": "true", children: [_jsx("path", { d: "M7 1H3C2.45 1 2 1.45 2 2V10C2 10.55 2.45 11 3 11H9C9.55 11 10 10.55 10 10V4L7 1Z" }), _jsx("path", { d: "M7 1V4H10" })] }));
124
+ function ClockIcon() {
125
+ return (_jsxs("svg", { width: "10", height: "10", viewBox: "0 0 12 12", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", children: [_jsx("circle", { cx: "6", cy: "6", r: "4.5" }), _jsx("path", { d: "M6 3.5V6L7.5 7.5" })] }));
188
126
  }
189
127
  function SpinnerIcon() {
190
128
  return (_jsx("svg", { width: "10", height: "10", viewBox: "0 0 12 12", fill: "none", stroke: "currentColor", strokeWidth: "1.5", className: "animate-spin", "aria-hidden": "true", children: _jsx("path", { d: "M6 1.5A4.5 4.5 0 1 1 1.5 6", strokeLinecap: "round" }) }));
@@ -1 +1 @@
1
- {"version":3,"file":"ApprovalCard.js","sourceRoot":"","sources":["../../src/execution/ApprovalCard.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ApprovalCard.js","sourceRoot":"","sources":["../../src/execution/ApprovalCard.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ import type { ToolCall } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/message_pb";
2
+ export interface McpToolDetailProps {
3
+ readonly toolCall: ToolCall;
4
+ readonly className?: string;
5
+ }
6
+ /**
7
+ * MCP-aware detail renderer for tool calls originating from an MCP
8
+ * server.
9
+ *
10
+ * Replaces the generic "dump args + result as raw JSON" fallback
11
+ * with structured formatting:
12
+ *
13
+ * - **Arguments** are rendered as a labelled key-value list.
14
+ * Scalars display inline; objects/arrays collapse into formatted
15
+ * JSON blocks.
16
+ * - **Results** are parsed through {@link parseMcpResult} which
17
+ * handles MCP content-block arrays, embedded JSON, and Python
18
+ * repr artefacts before rendering.
19
+ *
20
+ * @example
21
+ * ```tsx
22
+ * <McpToolDetail toolCall={toolCall} />
23
+ * ```
24
+ */
25
+ export declare function McpToolDetail({ toolCall, className }: McpToolDetailProps): import("react/jsx-runtime").JSX.Element;
26
+ export declare function McpMetadataRow({ mcpServerSlug, toolName, duration, }: {
27
+ mcpServerSlug: string;
28
+ toolName: string;
29
+ duration: string | null;
30
+ }): import("react/jsx-runtime").JSX.Element | null;
31
+ export declare function McpArgsView({ args }: {
32
+ args: Record<string, unknown>;
33
+ }): import("react/jsx-runtime").JSX.Element | null;
34
+ /**
35
+ * Extracts human-readable content from an MCP tool result string.
36
+ *
37
+ * Handles three common formats that arrive from the backend:
38
+ *
39
+ * 1. **MCP content-block array** — `[{"type":"text","text":"..."}]`.
40
+ * Text parts are extracted and, if they are themselves valid
41
+ * JSON, pretty-printed.
42
+ * 2. **Python repr** — `[{'type': 'text', 'text': '...'}]`. Single
43
+ * quotes are normalised to double quotes before parsing.
44
+ * 3. **Plain JSON / text** — returned formatted when valid JSON,
45
+ * or as-is otherwise.
46
+ */
47
+ export declare function parseMcpResult(result: string): string;
48
+ //# sourceMappingURL=McpToolDetail.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"McpToolDetail.d.ts","sourceRoot":"","sources":["../../src/execution/McpToolDetail.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iEAAiE,CAAC;AAahG,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,kBAAkB,2CAoBxE;AAMD,wBAAgB,cAAc,CAAC,EAC7B,aAAa,EACb,QAAQ,EACR,QAAQ,GACT,EAAE;IACD,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB,kDAiBA;AAMD,wBAAgB,WAAW,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,kDAoCtE;AA2CD;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAoBrD"}
@@ -0,0 +1,159 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { cn } from "@stigmer/theme";
4
+ import { formatDuration } from "./ToolCallDetail";
5
+ import { humanizeToolName } from "./tool-categories";
6
+ import { CollapsiblePre, CollapsibleJsonBlock, McpServerIcon, formatJson, isScalar, humanizeArgKey, } from "./tool-rendering-primitives";
7
+ /**
8
+ * MCP-aware detail renderer for tool calls originating from an MCP
9
+ * server.
10
+ *
11
+ * Replaces the generic "dump args + result as raw JSON" fallback
12
+ * with structured formatting:
13
+ *
14
+ * - **Arguments** are rendered as a labelled key-value list.
15
+ * Scalars display inline; objects/arrays collapse into formatted
16
+ * JSON blocks.
17
+ * - **Results** are parsed through {@link parseMcpResult} which
18
+ * handles MCP content-block arrays, embedded JSON, and Python
19
+ * repr artefacts before rendering.
20
+ *
21
+ * @example
22
+ * ```tsx
23
+ * <McpToolDetail toolCall={toolCall} />
24
+ * ```
25
+ */
26
+ export function McpToolDetail({ toolCall, className }) {
27
+ const duration = formatDuration(toolCall.startedAt, toolCall.completedAt);
28
+ return (_jsxs("div", { className: cn("space-y-3 text-xs", className), children: [_jsx(McpMetadataRow, { mcpServerSlug: toolCall.mcpServerSlug, toolName: toolCall.name, duration: duration }), toolCall.args && Object.keys(toolCall.args).length > 0 && (_jsx(McpArgsView, { args: toolCall.args })), toolCall.result && (_jsx(McpResultView, { result: toolCall.result }))] }));
29
+ }
30
+ // ---------------------------------------------------------------------------
31
+ // Metadata
32
+ // ---------------------------------------------------------------------------
33
+ export function McpMetadataRow({ mcpServerSlug, toolName, duration, }) {
34
+ const hasMetadata = mcpServerSlug || duration;
35
+ if (!hasMetadata)
36
+ return null;
37
+ return (_jsxs("div", { className: "flex flex-wrap items-center gap-x-3 gap-y-1 text-muted-foreground", children: [mcpServerSlug && (_jsxs("span", { className: "inline-flex items-center gap-1.5 rounded bg-muted px-1.5 py-0.5 font-mono", children: [_jsx(McpServerIcon, {}), mcpServerSlug, _jsx("span", { className: "text-muted-foreground/60", children: "/" }), _jsx("span", { className: "text-foreground", children: humanizeToolName(toolName) })] })), duration && _jsx("span", { children: duration })] }));
38
+ }
39
+ // ---------------------------------------------------------------------------
40
+ // Arguments — structured key-value rendering
41
+ // ---------------------------------------------------------------------------
42
+ export function McpArgsView({ args }) {
43
+ const entries = Object.entries(args);
44
+ if (entries.length === 0)
45
+ return null;
46
+ const scalars = [];
47
+ const complex = [];
48
+ for (const [key, value] of entries) {
49
+ if (isScalar(value)) {
50
+ scalars.push([key, String(value)]);
51
+ }
52
+ else {
53
+ complex.push([key, value]);
54
+ }
55
+ }
56
+ return (_jsxs("div", { className: "space-y-2", children: [_jsx("span", { className: "font-medium text-muted-foreground", children: "Arguments" }), scalars.length > 0 && (_jsx("dl", { className: "grid grid-cols-[auto_1fr] gap-x-3 gap-y-1 rounded-md border border-border bg-muted/30 px-2.5 py-2", children: scalars.map(([key, value]) => (_jsx(ScalarRow, { label: key, value: value }, key))) })), complex.map(([key, value]) => (_jsx(CollapsibleJsonBlock, { label: humanizeArgKey(key), content: formatJson(value) }, key)))] }));
57
+ }
58
+ function ScalarRow({ label, value }) {
59
+ const isMultiline = value.includes("\n");
60
+ return (_jsxs(_Fragment, { children: [_jsx("dt", { className: "whitespace-nowrap font-mono text-muted-foreground", children: humanizeArgKey(label) }), isMultiline ? (_jsx("dd", { className: "min-w-0", children: _jsx("pre", { className: "whitespace-pre-wrap break-words rounded border border-border bg-muted/40 px-2 py-1 font-mono text-foreground", children: value }) })) : (_jsx("dd", { className: "min-w-0 truncate font-mono text-foreground", title: value, children: value }))] }));
61
+ }
62
+ // ---------------------------------------------------------------------------
63
+ // Result — intelligent parsing
64
+ // ---------------------------------------------------------------------------
65
+ function McpResultView({ result }) {
66
+ const parsed = parseMcpResult(result);
67
+ return (_jsxs("div", { className: "space-y-1", children: [_jsx("span", { className: "font-medium text-muted-foreground", children: "Result" }), _jsx(CollapsiblePre, { content: parsed, className: "max-h-80 overflow-auto rounded-md border border-border bg-muted/40 p-2 text-foreground" })] }));
68
+ }
69
+ /**
70
+ * Extracts human-readable content from an MCP tool result string.
71
+ *
72
+ * Handles three common formats that arrive from the backend:
73
+ *
74
+ * 1. **MCP content-block array** — `[{"type":"text","text":"..."}]`.
75
+ * Text parts are extracted and, if they are themselves valid
76
+ * JSON, pretty-printed.
77
+ * 2. **Python repr** — `[{'type': 'text', 'text': '...'}]`. Single
78
+ * quotes are normalised to double quotes before parsing.
79
+ * 3. **Plain JSON / text** — returned formatted when valid JSON,
80
+ * or as-is otherwise.
81
+ */
82
+ export function parseMcpResult(result) {
83
+ const trimmed = result.trim();
84
+ // Fast path: try standard JSON parse first.
85
+ const jsonParsed = tryParseJson(trimmed);
86
+ if (jsonParsed !== undefined) {
87
+ const extracted = tryExtractContentBlocks(jsonParsed);
88
+ if (extracted !== null)
89
+ return extracted;
90
+ return JSON.stringify(jsonParsed, null, 2);
91
+ }
92
+ // Attempt to fix Python repr (single-quoted dicts/lists).
93
+ const fixed = tryFixPythonRepr(trimmed);
94
+ if (fixed !== undefined) {
95
+ const extracted = tryExtractContentBlocks(fixed);
96
+ if (extracted !== null)
97
+ return extracted;
98
+ return JSON.stringify(fixed, null, 2);
99
+ }
100
+ return trimmed;
101
+ }
102
+ function isMcpContentBlockArray(val) {
103
+ if (!Array.isArray(val))
104
+ return false;
105
+ if (val.length === 0)
106
+ return false;
107
+ return val.every((item) => typeof item === "object" &&
108
+ item !== null &&
109
+ "type" in item &&
110
+ typeof item.type === "string");
111
+ }
112
+ function tryExtractContentBlocks(parsed) {
113
+ if (!isMcpContentBlockArray(parsed))
114
+ return null;
115
+ const textParts = [];
116
+ for (const block of parsed) {
117
+ if (block.type === "text" && typeof block.text === "string") {
118
+ const innerJson = tryParseJson(block.text.trim());
119
+ if (innerJson !== undefined) {
120
+ textParts.push(JSON.stringify(innerJson, null, 2));
121
+ }
122
+ else {
123
+ textParts.push(block.text);
124
+ }
125
+ }
126
+ }
127
+ return textParts.length > 0 ? textParts.join("\n\n") : null;
128
+ }
129
+ // ---------------------------------------------------------------------------
130
+ // JSON / Python repr helpers
131
+ // ---------------------------------------------------------------------------
132
+ function tryParseJson(str) {
133
+ try {
134
+ return JSON.parse(str);
135
+ }
136
+ catch {
137
+ return undefined;
138
+ }
139
+ }
140
+ /**
141
+ * Attempts to convert a Python repr string (single-quoted
142
+ * dicts/lists with True/False/None) into a parsed JS value.
143
+ *
144
+ * This is intentionally conservative: it only handles the
145
+ * most common patterns and bails on ambiguity.
146
+ */
147
+ function tryFixPythonRepr(str) {
148
+ if (!str.startsWith("[") && !str.startsWith("{"))
149
+ return undefined;
150
+ let fixed = str
151
+ .replace(/'/g, '"')
152
+ .replace(/\bTrue\b/g, "true")
153
+ .replace(/\bFalse\b/g, "false")
154
+ .replace(/\bNone\b/g, "null");
155
+ // Handle trailing commas before ] or } (common in Python repr).
156
+ fixed = fixed.replace(/,\s*([}\]])/g, "$1");
157
+ return tryParseJson(fixed);
158
+ }
159
+ //# sourceMappingURL=McpToolDetail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"McpToolDetail.js","sourceRoot":"","sources":["../../src/execution/McpToolDetail.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ export interface ToolArgsViewProps {
2
+ /**
3
+ * Raw tool name as it appears on the ToolCall or PendingApproval.
4
+ * Used for category resolution and MCP metadata display.
5
+ */
6
+ readonly toolName: string;
7
+ /**
8
+ * Parsed tool arguments — either from `ToolCall.args` or
9
+ * `JSON.parse(PendingApproval.argsPreview)`.
10
+ */
11
+ readonly args: Record<string, unknown> | null;
12
+ /** MCP server slug for MCP tool classification and metadata. */
13
+ readonly mcpServerSlug?: string;
14
+ readonly className?: string;
15
+ }
16
+ /**
17
+ * Unified tool-arguments renderer used by both {@link ApprovalCard}
18
+ * (pre-execution) and {@link ToolCallDetail} (post-execution).
19
+ *
20
+ * Resolves the tool category from `toolName` + `mcpServerSlug`,
21
+ * extracts the relevant primary argument, and dispatches to the
22
+ * appropriate category-specific view:
23
+ *
24
+ * - **Shell** — terminal-style command block
25
+ * - **File (read/write/edit/delete)** — file icon + path + optional content
26
+ * - **Search / List** — pattern display
27
+ * - **MCP** — metadata row + scalar key-value grid + collapsible JSON
28
+ * - **Generic / Unknown** — formatted JSON args
29
+ *
30
+ * @example
31
+ * ```tsx
32
+ * // In approval card (from argsPreview string):
33
+ * const args = JSON.parse(pendingApproval.argsPreview);
34
+ * <ToolArgsView toolName={toolName} args={args} mcpServerSlug={slug} />
35
+ *
36
+ * // In detail view (from ToolCall):
37
+ * <ToolArgsView toolName={tc.name} args={tc.args} mcpServerSlug={tc.mcpServerSlug} />
38
+ * ```
39
+ */
40
+ export declare function ToolArgsView({ toolName, args, mcpServerSlug, className, }: ToolArgsViewProps): import("react/jsx-runtime").JSX.Element;
41
+ //# sourceMappingURL=ToolArgsView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToolArgsView.d.ts","sourceRoot":"","sources":["../../src/execution/ToolArgsView.tsx"],"names":[],"mappings":"AAqBA,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B;;;OAGG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC9C,gEAAgE;IAChE,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,YAAY,CAAC,EAC3B,QAAQ,EACR,IAAI,EACJ,aAAa,EACb,SAAS,GACV,EAAE,iBAAiB,2CAsBnB"}