@axis-ds/agentic-ui 1.1.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 (116) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +31 -0
  3. package/dist/agent-avatar/index.d.mts +22 -0
  4. package/dist/agent-avatar/index.d.ts +22 -0
  5. package/dist/agent-avatar/index.js +112 -0
  6. package/dist/agent-avatar/index.mjs +7 -0
  7. package/dist/approval-card/index.d.mts +31 -0
  8. package/dist/approval-card/index.d.ts +31 -0
  9. package/dist/approval-card/index.js +133 -0
  10. package/dist/approval-card/index.mjs +7 -0
  11. package/dist/attachment-card/index.d.mts +30 -0
  12. package/dist/attachment-card/index.d.ts +30 -0
  13. package/dist/attachment-card/index.js +140 -0
  14. package/dist/attachment-card/index.mjs +7 -0
  15. package/dist/chunk-2BWCQQLU.mjs +136 -0
  16. package/dist/chunk-3TH7GFBD.mjs +83 -0
  17. package/dist/chunk-4PCJFQHQ.mjs +66 -0
  18. package/dist/chunk-657RY6MM.mjs +106 -0
  19. package/dist/chunk-7UGSLEYG.mjs +75 -0
  20. package/dist/chunk-D6GHMPBC.mjs +76 -0
  21. package/dist/chunk-DPENLPBM.mjs +105 -0
  22. package/dist/chunk-DPLGRVNQ.mjs +95 -0
  23. package/dist/chunk-EF4MECAI.mjs +81 -0
  24. package/dist/chunk-ENIWC4WX.mjs +94 -0
  25. package/dist/chunk-ETFET3LT.mjs +72 -0
  26. package/dist/chunk-FAJF5RCY.mjs +115 -0
  27. package/dist/chunk-FPOHPDZ2.mjs +109 -0
  28. package/dist/chunk-FYAMA32G.mjs +50 -0
  29. package/dist/chunk-GQYOOLDL.mjs +63 -0
  30. package/dist/chunk-H6VXOP7U.mjs +86 -0
  31. package/dist/chunk-HLW7VEFF.mjs +47 -0
  32. package/dist/chunk-HWISMHCP.mjs +33 -0
  33. package/dist/chunk-KH4OXDEV.mjs +83 -0
  34. package/dist/chunk-KJVPVBET.mjs +103 -0
  35. package/dist/chunk-LZKOCELQ.mjs +136 -0
  36. package/dist/chunk-MGQ7AEYE.mjs +94 -0
  37. package/dist/chunk-MVBXXDZB.mjs +83 -0
  38. package/dist/chunk-NRBIHROX.mjs +162 -0
  39. package/dist/chunk-O5VXD6C3.mjs +114 -0
  40. package/dist/chunk-O5WFJCWK.mjs +63 -0
  41. package/dist/chunk-OOFM7NNH.mjs +68 -0
  42. package/dist/chunk-PAKLXPHD.mjs +115 -0
  43. package/dist/chunk-PWKN5UHT.mjs +152 -0
  44. package/dist/chunk-RGBY6EEU.mjs +80 -0
  45. package/dist/chunk-RGPKTWK4.mjs +77 -0
  46. package/dist/chunk-S3HVRSN2.mjs +95 -0
  47. package/dist/chunk-SCZ4BQ2G.mjs +68 -0
  48. package/dist/chunk-TCCZL2D5.mjs +51 -0
  49. package/dist/chunk-TKUAT5WE.mjs +105 -0
  50. package/dist/chunk-UG4H7RIP.mjs +77 -0
  51. package/dist/chunk-VKLPWFAI.mjs +79 -0
  52. package/dist/code-block/index.d.mts +24 -0
  53. package/dist/code-block/index.d.ts +24 -0
  54. package/dist/code-block/index.js +114 -0
  55. package/dist/code-block/index.mjs +6 -0
  56. package/dist/context-panel/index.d.mts +32 -0
  57. package/dist/context-panel/index.d.ts +32 -0
  58. package/dist/context-panel/index.js +137 -0
  59. package/dist/context-panel/index.mjs +6 -0
  60. package/dist/diff-viewer/index.d.mts +21 -0
  61. package/dist/diff-viewer/index.d.ts +21 -0
  62. package/dist/diff-viewer/index.js +201 -0
  63. package/dist/diff-viewer/index.mjs +7 -0
  64. package/dist/feedback-buttons/index.d.mts +21 -0
  65. package/dist/feedback-buttons/index.d.ts +21 -0
  66. package/dist/feedback-buttons/index.js +111 -0
  67. package/dist/feedback-buttons/index.mjs +7 -0
  68. package/dist/index.d.mts +20 -0
  69. package/dist/index.d.ts +20 -0
  70. package/dist/index.js +1774 -0
  71. package/dist/index.mjs +75 -0
  72. package/dist/message-bubble/index.d.mts +29 -0
  73. package/dist/message-bubble/index.d.ts +29 -0
  74. package/dist/message-bubble/index.js +135 -0
  75. package/dist/message-bubble/index.mjs +7 -0
  76. package/dist/plan-card/index.d.mts +32 -0
  77. package/dist/plan-card/index.d.ts +32 -0
  78. package/dist/plan-card/index.js +202 -0
  79. package/dist/plan-card/index.mjs +7 -0
  80. package/dist/recovery-banner/index.d.mts +20 -0
  81. package/dist/recovery-banner/index.d.ts +20 -0
  82. package/dist/recovery-banner/index.js +109 -0
  83. package/dist/recovery-banner/index.mjs +6 -0
  84. package/dist/run-progress/index.d.mts +29 -0
  85. package/dist/run-progress/index.d.ts +29 -0
  86. package/dist/run-progress/index.js +179 -0
  87. package/dist/run-progress/index.mjs +7 -0
  88. package/dist/source-panel/index.d.mts +25 -0
  89. package/dist/source-panel/index.d.ts +25 -0
  90. package/dist/source-panel/index.js +135 -0
  91. package/dist/source-panel/index.mjs +7 -0
  92. package/dist/step-timeline/index.d.mts +21 -0
  93. package/dist/step-timeline/index.d.ts +21 -0
  94. package/dist/step-timeline/index.js +110 -0
  95. package/dist/step-timeline/index.mjs +7 -0
  96. package/dist/streaming-text/index.d.mts +27 -0
  97. package/dist/streaming-text/index.d.ts +27 -0
  98. package/dist/streaming-text/index.js +97 -0
  99. package/dist/streaming-text/index.mjs +6 -0
  100. package/dist/surface-renderer/index.d.mts +22 -0
  101. package/dist/surface-renderer/index.d.ts +22 -0
  102. package/dist/surface-renderer/index.js +107 -0
  103. package/dist/surface-renderer/index.mjs +6 -0
  104. package/dist/thinking-indicator/index.d.mts +16 -0
  105. package/dist/thinking-indicator/index.d.ts +16 -0
  106. package/dist/thinking-indicator/index.js +74 -0
  107. package/dist/thinking-indicator/index.mjs +6 -0
  108. package/dist/token-usage-indicator/index.d.mts +22 -0
  109. package/dist/token-usage-indicator/index.d.ts +22 -0
  110. package/dist/token-usage-indicator/index.js +110 -0
  111. package/dist/token-usage-indicator/index.mjs +6 -0
  112. package/dist/tool-call-card/index.d.mts +31 -0
  113. package/dist/tool-call-card/index.d.ts +31 -0
  114. package/dist/tool-call-card/index.js +158 -0
  115. package/dist/tool-call-card/index.mjs +7 -0
  116. package/package.json +130 -0
@@ -0,0 +1,83 @@
1
+ // src/surface-renderer/index.tsx
2
+ import { cn } from "@axis-ds/ui-react";
3
+ import { jsx, jsxs } from "react/jsx-runtime";
4
+ function SurfaceRenderer({
5
+ surface,
6
+ renderCustom,
7
+ className
8
+ }) {
9
+ const renderContent = () => {
10
+ switch (surface.type) {
11
+ case "text":
12
+ return /* @__PURE__ */ jsx("div", { className: "prose prose-sm max-w-none text-[var(--axis-text-primary)]", children: String(surface.content) });
13
+ case "code":
14
+ return /* @__PURE__ */ jsx("pre", { className: "p-3 rounded-md bg-[var(--axis-surface-secondary)] overflow-x-auto", children: /* @__PURE__ */ jsx("code", { className: "text-sm font-mono text-[var(--axis-text-primary)]", children: String(surface.content) }) });
15
+ case "table":
16
+ const tableData = surface.content;
17
+ return /* @__PURE__ */ jsx("div", { className: "overflow-x-auto", children: /* @__PURE__ */ jsxs("table", { role: "table", className: "w-full text-sm", children: [
18
+ surface.title && /* @__PURE__ */ jsx("caption", { className: "sr-only", children: surface.title }),
19
+ /* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsx("tr", { className: "border-b border-[var(--axis-border-default)]", children: tableData.headers.map((header, i) => /* @__PURE__ */ jsx(
20
+ "th",
21
+ {
22
+ scope: "col",
23
+ className: "px-3 py-2 text-left font-medium text-[var(--axis-text-secondary)]",
24
+ children: header
25
+ },
26
+ i
27
+ )) }) }),
28
+ /* @__PURE__ */ jsx("tbody", { children: tableData.rows.map((row, i) => /* @__PURE__ */ jsx(
29
+ "tr",
30
+ {
31
+ className: "border-b border-[var(--axis-border-default)] last:border-0",
32
+ children: row.map((cell, j) => /* @__PURE__ */ jsx(
33
+ "td",
34
+ {
35
+ className: "px-3 py-2 text-[var(--axis-text-primary)]",
36
+ children: cell
37
+ },
38
+ j
39
+ ))
40
+ },
41
+ i
42
+ )) })
43
+ ] }) });
44
+ case "chart":
45
+ return /* @__PURE__ */ jsxs("div", { className: "p-4 text-center text-[var(--axis-text-secondary)]", children: [
46
+ "[\uCC28\uD2B8: ",
47
+ surface.title || "\uB370\uC774\uD130 \uC2DC\uAC01\uD654",
48
+ "]"
49
+ ] });
50
+ case "form":
51
+ return /* @__PURE__ */ jsxs("div", { className: "p-4 text-center text-[var(--axis-text-secondary)]", children: [
52
+ "[\uD3FC: ",
53
+ surface.title || "\uC785\uB825 \uC591\uC2DD",
54
+ "]"
55
+ ] });
56
+ case "custom":
57
+ if (renderCustom) {
58
+ return renderCustom(surface);
59
+ }
60
+ return /* @__PURE__ */ jsx("div", { className: "p-4 text-center text-[var(--axis-text-secondary)]", children: "[\uCEE4\uC2A4\uD140 Surface]" });
61
+ default:
62
+ return null;
63
+ }
64
+ };
65
+ return /* @__PURE__ */ jsxs(
66
+ "div",
67
+ {
68
+ className: cn(
69
+ "rounded-lg border p-4",
70
+ "bg-[var(--axis-surface-default)] border-[var(--axis-border-default)]",
71
+ className
72
+ ),
73
+ children: [
74
+ surface.title && /* @__PURE__ */ jsx("h4", { className: "text-sm font-medium text-[var(--axis-text-primary)] mb-3", children: surface.title }),
75
+ renderContent()
76
+ ]
77
+ }
78
+ );
79
+ }
80
+
81
+ export {
82
+ SurfaceRenderer
83
+ };
@@ -0,0 +1,162 @@
1
+ import {
2
+ DIFF_LABELS
3
+ } from "./chunk-SCZ4BQ2G.mjs";
4
+
5
+ // src/diff-viewer/index.tsx
6
+ import * as React from "react";
7
+ import { cn } from "@axis-ds/ui-react";
8
+ import { jsx, jsxs } from "react/jsx-runtime";
9
+ function computeDiff(before, after) {
10
+ const oldLines = before.split("\n");
11
+ const newLines = after.split("\n");
12
+ const m = oldLines.length;
13
+ const n = newLines.length;
14
+ const dp = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0));
15
+ for (let i2 = 1; i2 <= m; i2++) {
16
+ for (let j2 = 1; j2 <= n; j2++) {
17
+ if (oldLines[i2 - 1] === newLines[j2 - 1]) {
18
+ dp[i2][j2] = dp[i2 - 1][j2 - 1] + 1;
19
+ } else {
20
+ dp[i2][j2] = Math.max(dp[i2 - 1][j2], dp[i2][j2 - 1]);
21
+ }
22
+ }
23
+ }
24
+ const result = [];
25
+ let i = m;
26
+ let j = n;
27
+ while (i > 0 || j > 0) {
28
+ if (i > 0 && j > 0 && oldLines[i - 1] === newLines[j - 1]) {
29
+ result.unshift({ type: "unchanged", content: oldLines[i - 1], oldLineNumber: i, newLineNumber: j });
30
+ i--;
31
+ j--;
32
+ } else if (j > 0 && (i === 0 || dp[i][j - 1] >= dp[i - 1][j])) {
33
+ result.unshift({ type: "added", content: newLines[j - 1], newLineNumber: j });
34
+ j--;
35
+ } else if (i > 0) {
36
+ result.unshift({ type: "removed", content: oldLines[i - 1], oldLineNumber: i });
37
+ i--;
38
+ }
39
+ }
40
+ return result;
41
+ }
42
+ var lineTypeStyles = {
43
+ added: "bg-[var(--axis-color-green-500)]/10",
44
+ removed: "bg-[var(--axis-color-red-500)]/10",
45
+ unchanged: ""
46
+ };
47
+ var lineTypeTextStyles = {
48
+ added: "text-[var(--axis-color-green-600)]",
49
+ removed: "text-[var(--axis-color-red-600)]",
50
+ unchanged: "text-[var(--axis-text-primary)]"
51
+ };
52
+ var lineTypeSymbols = {
53
+ added: "+",
54
+ removed: "-",
55
+ unchanged: " "
56
+ };
57
+ function DiffViewer({
58
+ before,
59
+ after,
60
+ filename,
61
+ viewMode = "unified",
62
+ className
63
+ }) {
64
+ const [mode, setMode] = React.useState(viewMode);
65
+ const diffLines = React.useMemo(() => computeDiff(before, after), [before, after]);
66
+ const addedCount = diffLines.filter((l) => l.type === "added").length;
67
+ const removedCount = diffLines.filter((l) => l.type === "removed").length;
68
+ return /* @__PURE__ */ jsxs(
69
+ "div",
70
+ {
71
+ role: "region",
72
+ "aria-label": filename ? `${filename} \uBCC0\uACBD\uC0AC\uD56D` : "\uCF54\uB4DC \uBCC0\uACBD\uC0AC\uD56D",
73
+ className: cn(
74
+ "rounded-lg border overflow-hidden",
75
+ "bg-[var(--axis-surface-default)] border-[var(--axis-border-default)]",
76
+ className
77
+ ),
78
+ children: [
79
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between px-3 py-2 border-b border-[var(--axis-border-default)] bg-[var(--axis-surface-secondary)]", children: [
80
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 min-w-0", children: [
81
+ /* @__PURE__ */ jsx("svg", { className: "w-4 h-4 text-[var(--axis-icon-secondary)]", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", "aria-hidden": "true", children: /* @__PURE__ */ jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M4 6h16M4 12h16M4 18h7" }) }),
82
+ filename && /* @__PURE__ */ jsx("code", { className: "text-xs font-mono text-[var(--axis-text-primary)] truncate", children: filename }),
83
+ /* @__PURE__ */ jsxs("span", { className: "text-xs text-[var(--axis-color-green-500)]", "aria-label": `${addedCount}\uC904 ${DIFF_LABELS.added}`, children: [
84
+ "+",
85
+ addedCount
86
+ ] }),
87
+ /* @__PURE__ */ jsxs("span", { className: "text-xs text-[var(--axis-color-red-500)]", "aria-label": `${removedCount}\uC904 ${DIFF_LABELS.removed}`, children: [
88
+ "-",
89
+ removedCount
90
+ ] })
91
+ ] }),
92
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1 bg-[var(--axis-surface-tertiary)] rounded-md p-0.5", children: [
93
+ /* @__PURE__ */ jsx(
94
+ "button",
95
+ {
96
+ onClick: () => setMode("unified"),
97
+ "aria-pressed": mode === "unified",
98
+ className: cn(
99
+ "px-2 py-0.5 text-xs rounded transition-colors",
100
+ mode === "unified" ? "bg-[var(--axis-surface-default)] text-[var(--axis-text-primary)] shadow-sm" : "text-[var(--axis-text-tertiary)] hover:text-[var(--axis-text-secondary)]"
101
+ ),
102
+ children: "\uD1B5\uD569"
103
+ }
104
+ ),
105
+ /* @__PURE__ */ jsx(
106
+ "button",
107
+ {
108
+ onClick: () => setMode("split"),
109
+ "aria-pressed": mode === "split",
110
+ className: cn(
111
+ "px-2 py-0.5 text-xs rounded transition-colors",
112
+ mode === "split" ? "bg-[var(--axis-surface-default)] text-[var(--axis-text-primary)] shadow-sm" : "text-[var(--axis-text-tertiary)] hover:text-[var(--axis-text-secondary)]"
113
+ ),
114
+ children: "\uBD84\uD560"
115
+ }
116
+ )
117
+ ] })
118
+ ] }),
119
+ /* @__PURE__ */ jsx("div", { className: "overflow-auto", children: mode === "unified" ? /* @__PURE__ */ jsx(UnifiedView, { lines: diffLines }) : /* @__PURE__ */ jsx(SplitView, { lines: diffLines }) })
120
+ ]
121
+ }
122
+ );
123
+ }
124
+ function UnifiedView({ lines }) {
125
+ return /* @__PURE__ */ jsx("table", { className: "w-full text-xs font-mono border-collapse", role: "presentation", children: /* @__PURE__ */ jsx("tbody", { children: lines.map((line, i) => /* @__PURE__ */ jsxs("tr", { className: lineTypeStyles[line.type], children: [
126
+ /* @__PURE__ */ jsx("td", { className: "select-none text-right px-2 py-0.5 text-[var(--axis-text-tertiary)] w-10 border-r border-[var(--axis-border-default)]", children: line.oldLineNumber ?? "" }),
127
+ /* @__PURE__ */ jsx("td", { className: "select-none text-right px-2 py-0.5 text-[var(--axis-text-tertiary)] w-10 border-r border-[var(--axis-border-default)]", children: line.newLineNumber ?? "" }),
128
+ /* @__PURE__ */ jsx("td", { className: cn("select-none w-4 text-center py-0.5", lineTypeTextStyles[line.type]), children: lineTypeSymbols[line.type] }),
129
+ /* @__PURE__ */ jsx("td", { className: cn("px-2 py-0.5 whitespace-pre", lineTypeTextStyles[line.type]), children: line.content })
130
+ ] }, i)) }) });
131
+ }
132
+ function SplitView({ lines }) {
133
+ const leftLines = [];
134
+ const rightLines = [];
135
+ for (const line of lines) {
136
+ if (line.type === "unchanged") {
137
+ leftLines.push(line);
138
+ rightLines.push(line);
139
+ } else if (line.type === "removed") {
140
+ leftLines.push(line);
141
+ rightLines.push(null);
142
+ } else {
143
+ leftLines.push(null);
144
+ rightLines.push(line);
145
+ }
146
+ }
147
+ return /* @__PURE__ */ jsx("table", { className: "w-full text-xs font-mono border-collapse", role: "presentation", children: /* @__PURE__ */ jsx("tbody", { children: leftLines.map((leftLine, i) => {
148
+ const rightLine = rightLines[i];
149
+ return /* @__PURE__ */ jsxs("tr", { children: [
150
+ /* @__PURE__ */ jsx("td", { className: cn("select-none text-right px-2 py-0.5 text-[var(--axis-text-tertiary)] w-10 border-r border-[var(--axis-border-default)]", leftLine ? lineTypeStyles[leftLine.type] : ""), children: leftLine?.oldLineNumber ?? "" }),
151
+ /* @__PURE__ */ jsx("td", { className: cn("select-none w-4 text-center py-0.5", leftLine ? lineTypeTextStyles[leftLine.type] : ""), children: leftLine ? lineTypeSymbols[leftLine.type] : "" }),
152
+ /* @__PURE__ */ jsx("td", { className: cn("px-2 py-0.5 whitespace-pre w-1/2 border-r border-[var(--axis-border-default)]", leftLine ? cn(lineTypeStyles[leftLine.type], lineTypeTextStyles[leftLine.type]) : ""), children: leftLine?.content ?? "" }),
153
+ /* @__PURE__ */ jsx("td", { className: cn("select-none text-right px-2 py-0.5 text-[var(--axis-text-tertiary)] w-10 border-r border-[var(--axis-border-default)]", rightLine ? lineTypeStyles[rightLine.type] : ""), children: rightLine?.newLineNumber ?? "" }),
154
+ /* @__PURE__ */ jsx("td", { className: cn("select-none w-4 text-center py-0.5", rightLine ? lineTypeTextStyles[rightLine.type] : ""), children: rightLine ? lineTypeSymbols[rightLine.type] : "" }),
155
+ /* @__PURE__ */ jsx("td", { className: cn("px-2 py-0.5 whitespace-pre w-1/2", rightLine ? cn(lineTypeStyles[rightLine.type], lineTypeTextStyles[rightLine.type]) : ""), children: rightLine?.content ?? "" })
156
+ ] }, i);
157
+ }) }) });
158
+ }
159
+
160
+ export {
161
+ DiffViewer
162
+ };
@@ -0,0 +1,114 @@
1
+ // src/run-progress/index.tsx
2
+ import * as React from "react";
3
+ import { cn } from "@axis-ds/ui-react";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ var statusColors = {
6
+ pending: "bg-[var(--axis-color-gray-300)]",
7
+ running: "bg-[var(--axis-color-blue-500)] animate-pulse",
8
+ complete: "bg-[var(--axis-color-green-500)]",
9
+ error: "bg-[var(--axis-color-red-500)]"
10
+ };
11
+ var statusIcons = {
12
+ pending: null,
13
+ running: /* @__PURE__ */ jsxs("svg", { className: "w-3 h-3 animate-spin", viewBox: "0 0 24 24", fill: "none", children: [
14
+ /* @__PURE__ */ jsx("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }),
15
+ /* @__PURE__ */ jsx("path", { className: "opacity-75", fill: "currentColor", d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z" })
16
+ ] }),
17
+ complete: /* @__PURE__ */ jsx("svg", { className: "w-3 h-3", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M5 13l4 4L19 7" }) }),
18
+ error: /* @__PURE__ */ jsx("svg", { className: "w-3 h-3", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M6 18L18 6M6 6l12 12" }) })
19
+ };
20
+ function RunProgress({
21
+ status,
22
+ steps,
23
+ currentStep,
24
+ onCancel,
25
+ onRetry,
26
+ className
27
+ }) {
28
+ const progressPercent = React.useMemo(() => {
29
+ const completed = steps.filter((s) => s.status === "complete").length;
30
+ return Math.round(completed / steps.length * 100);
31
+ }, [steps]);
32
+ return /* @__PURE__ */ jsxs(
33
+ "div",
34
+ {
35
+ className: cn(
36
+ "rounded-lg border p-4",
37
+ "bg-[var(--axis-surface-default)] border-[var(--axis-border-default)]",
38
+ className
39
+ ),
40
+ children: [
41
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between mb-4", children: [
42
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
43
+ status === "running" && /* @__PURE__ */ jsx("div", { className: "w-2 h-2 rounded-full bg-[var(--axis-color-blue-500)] animate-pulse" }),
44
+ /* @__PURE__ */ jsxs("span", { className: "text-sm font-medium text-[var(--axis-text-primary)]", children: [
45
+ status === "idle" && "\uB300\uAE30 \uC911",
46
+ status === "running" && "\uC2E4\uD589 \uC911",
47
+ status === "complete" && "\uC644\uB8CC",
48
+ status === "error" && "\uC624\uB958 \uBC1C\uC0DD"
49
+ ] })
50
+ ] }),
51
+ /* @__PURE__ */ jsxs("span", { className: "text-xs text-[var(--axis-text-secondary)]", children: [
52
+ progressPercent,
53
+ "%"
54
+ ] })
55
+ ] }),
56
+ /* @__PURE__ */ jsx("div", { className: "w-full h-1.5 rounded-full bg-[var(--axis-surface-secondary)] mb-4", children: /* @__PURE__ */ jsx(
57
+ "div",
58
+ {
59
+ className: "h-full rounded-full bg-[var(--axis-color-blue-500)] transition-all duration-300",
60
+ style: { width: `${progressPercent}%` }
61
+ }
62
+ ) }),
63
+ /* @__PURE__ */ jsx("div", { className: "space-y-2", children: steps.map((step, index) => /* @__PURE__ */ jsxs(
64
+ "div",
65
+ {
66
+ className: cn(
67
+ "flex items-center gap-3 p-2 rounded-md transition-colors",
68
+ currentStep === index && "bg-[var(--axis-surface-secondary)]"
69
+ ),
70
+ children: [
71
+ /* @__PURE__ */ jsx(
72
+ "div",
73
+ {
74
+ className: cn(
75
+ "w-5 h-5 rounded-full flex items-center justify-center text-white text-xs",
76
+ statusColors[step.status]
77
+ ),
78
+ children: statusIcons[step.status] || index + 1
79
+ }
80
+ ),
81
+ /* @__PURE__ */ jsxs("div", { className: "flex-1 min-w-0", children: [
82
+ /* @__PURE__ */ jsx("p", { className: "text-sm font-medium text-[var(--axis-text-primary)] truncate", children: step.label }),
83
+ step.description && /* @__PURE__ */ jsx("p", { className: "text-xs text-[var(--axis-text-secondary)] truncate", children: step.description })
84
+ ] })
85
+ ]
86
+ },
87
+ step.id
88
+ )) }),
89
+ (onCancel || onRetry) && /* @__PURE__ */ jsxs("div", { className: "flex justify-end gap-2 mt-4 pt-4 border-t border-[var(--axis-border-default)]", children: [
90
+ status === "running" && onCancel && /* @__PURE__ */ jsx(
91
+ "button",
92
+ {
93
+ onClick: onCancel,
94
+ className: "px-3 py-1.5 text-sm rounded-md bg-[var(--axis-surface-secondary)] text-[var(--axis-text-primary)] hover:bg-[var(--axis-surface-tertiary)]",
95
+ children: "\uCDE8\uC18C"
96
+ }
97
+ ),
98
+ status === "error" && onRetry && /* @__PURE__ */ jsx(
99
+ "button",
100
+ {
101
+ onClick: onRetry,
102
+ className: "px-3 py-1.5 text-sm rounded-md bg-[var(--axis-color-blue-500)] text-white hover:bg-[var(--axis-color-blue-600)]",
103
+ children: "\uC7AC\uC2DC\uB3C4"
104
+ }
105
+ )
106
+ ] })
107
+ ]
108
+ }
109
+ );
110
+ }
111
+
112
+ export {
113
+ RunProgress
114
+ };
@@ -0,0 +1,63 @@
1
+ // src/step-timeline/index.tsx
2
+ import { cn } from "@axis-ds/ui-react";
3
+ import { jsx, jsxs } from "react/jsx-runtime";
4
+ function StepTimeline({
5
+ steps,
6
+ orientation = "vertical",
7
+ className
8
+ }) {
9
+ const isVertical = orientation === "vertical";
10
+ return /* @__PURE__ */ jsx(
11
+ "div",
12
+ {
13
+ className: cn(
14
+ isVertical ? "flex flex-col gap-4" : "flex items-center gap-2",
15
+ className
16
+ ),
17
+ children: steps.map((step, index) => /* @__PURE__ */ jsxs(
18
+ "div",
19
+ {
20
+ className: cn(
21
+ "relative flex",
22
+ isVertical ? "items-start gap-3" : "flex-col items-center"
23
+ ),
24
+ children: [
25
+ index < steps.length - 1 && /* @__PURE__ */ jsx(
26
+ "div",
27
+ {
28
+ className: cn(
29
+ "absolute bg-[var(--axis-border-default)]",
30
+ isVertical ? "left-2.5 top-6 w-0.5 h-full -translate-x-1/2" : "top-2.5 left-6 h-0.5 w-full"
31
+ )
32
+ }
33
+ ),
34
+ /* @__PURE__ */ jsx(
35
+ "div",
36
+ {
37
+ className: cn(
38
+ "relative z-10 w-5 h-5 rounded-full flex items-center justify-center",
39
+ step.status === "complete" && "bg-[var(--axis-color-green-500)]",
40
+ step.status === "running" && "bg-[var(--axis-color-blue-500)] animate-pulse",
41
+ step.status === "error" && "bg-[var(--axis-color-red-500)]",
42
+ step.status === "skipped" && "bg-[var(--axis-color-gray-300)]",
43
+ step.status === "pending" && "bg-[var(--axis-color-gray-300)]"
44
+ ),
45
+ children: step.status === "complete" && /* @__PURE__ */ jsx("svg", { className: "w-3 h-3 text-white", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 3, d: "M5 13l4 4L19 7" }) })
46
+ }
47
+ ),
48
+ /* @__PURE__ */ jsxs("div", { className: cn(isVertical ? "flex-1" : "text-center mt-2"), children: [
49
+ /* @__PURE__ */ jsx("p", { className: "text-sm font-medium text-[var(--axis-text-primary)]", children: step.label }),
50
+ step.description && /* @__PURE__ */ jsx("p", { className: "text-xs text-[var(--axis-text-secondary)]", children: step.description }),
51
+ step.timestamp && /* @__PURE__ */ jsx("p", { className: "text-xs text-[var(--axis-text-tertiary)]", children: step.timestamp.toLocaleTimeString() })
52
+ ] })
53
+ ]
54
+ },
55
+ step.id
56
+ ))
57
+ }
58
+ );
59
+ }
60
+
61
+ export {
62
+ StepTimeline
63
+ };
@@ -0,0 +1,68 @@
1
+ // src/recovery-banner/index.tsx
2
+ import { cn } from "@axis-ds/ui-react";
3
+ import { jsx, jsxs } from "react/jsx-runtime";
4
+ function RecoveryBanner({
5
+ message,
6
+ description,
7
+ onRetry,
8
+ onDismiss,
9
+ className
10
+ }) {
11
+ return /* @__PURE__ */ jsxs(
12
+ "div",
13
+ {
14
+ className: cn(
15
+ "flex items-start gap-3 p-4 rounded-lg border",
16
+ "bg-[var(--axis-surface-error)] border-[var(--axis-color-red-200)]",
17
+ className
18
+ ),
19
+ role: "alert",
20
+ children: [
21
+ /* @__PURE__ */ jsx(
22
+ "svg",
23
+ {
24
+ className: "w-5 h-5 text-[var(--axis-color-red-500)] flex-shrink-0 mt-0.5",
25
+ fill: "none",
26
+ stroke: "currentColor",
27
+ viewBox: "0 0 24 24",
28
+ children: /* @__PURE__ */ jsx(
29
+ "path",
30
+ {
31
+ strokeLinecap: "round",
32
+ strokeLinejoin: "round",
33
+ strokeWidth: 2,
34
+ d: "M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"
35
+ }
36
+ )
37
+ }
38
+ ),
39
+ /* @__PURE__ */ jsxs("div", { className: "flex-1 min-w-0", children: [
40
+ /* @__PURE__ */ jsx("p", { className: "text-sm font-medium text-[var(--axis-text-error)]", children: message }),
41
+ description && /* @__PURE__ */ jsx("p", { className: "mt-1 text-sm text-[var(--axis-text-secondary)]", children: description }),
42
+ /* @__PURE__ */ jsxs("div", { className: "flex gap-2 mt-3", children: [
43
+ onRetry && /* @__PURE__ */ jsx(
44
+ "button",
45
+ {
46
+ onClick: onRetry,
47
+ className: "px-3 py-1.5 text-sm font-medium rounded-md bg-[var(--axis-color-red-500)] text-white hover:bg-[var(--axis-color-red-600)] transition-colors",
48
+ children: "\uC7AC\uC2DC\uB3C4"
49
+ }
50
+ ),
51
+ onDismiss && /* @__PURE__ */ jsx(
52
+ "button",
53
+ {
54
+ onClick: onDismiss,
55
+ className: "px-3 py-1.5 text-sm font-medium rounded-md bg-transparent text-[var(--axis-text-primary)] hover:bg-[var(--axis-surface-secondary)] transition-colors",
56
+ children: "\uBB34\uC2DC"
57
+ }
58
+ )
59
+ ] })
60
+ ] })
61
+ ]
62
+ }
63
+ );
64
+ }
65
+
66
+ export {
67
+ RecoveryBanner
68
+ };
@@ -0,0 +1,115 @@
1
+ import {
2
+ STATUS_LABELS
3
+ } from "./chunk-HWISMHCP.mjs";
4
+
5
+ // src/tool-call-card/index.tsx
6
+ import * as React from "react";
7
+ import { cn } from "@axis-ds/ui-react";
8
+ import { jsx, jsxs } from "react/jsx-runtime";
9
+ var statusConfig = {
10
+ pending: {
11
+ color: "text-[var(--axis-color-gray-400)]",
12
+ icon: /* @__PURE__ */ jsx("svg", { className: "w-4 h-4", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx("circle", { cx: "12", cy: "12", r: "10", strokeWidth: 2 }) })
13
+ },
14
+ running: {
15
+ color: "text-[var(--axis-color-blue-500)]",
16
+ icon: /* @__PURE__ */ jsxs("svg", { className: "w-4 h-4 animate-spin", viewBox: "0 0 24 24", fill: "none", children: [
17
+ /* @__PURE__ */ jsx("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }),
18
+ /* @__PURE__ */ jsx("path", { className: "opacity-75", fill: "currentColor", d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z" })
19
+ ] })
20
+ },
21
+ success: {
22
+ color: "text-[var(--axis-color-green-500)]",
23
+ icon: /* @__PURE__ */ jsx("svg", { className: "w-4 h-4", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M5 13l4 4L19 7" }) })
24
+ },
25
+ error: {
26
+ color: "text-[var(--axis-color-red-500)]",
27
+ icon: /* @__PURE__ */ jsx("svg", { className: "w-4 h-4", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M6 18L18 6M6 6l12 12" }) })
28
+ }
29
+ };
30
+ function ToolCallCard({
31
+ toolName,
32
+ description,
33
+ status,
34
+ input,
35
+ output,
36
+ error,
37
+ duration,
38
+ defaultExpanded = false,
39
+ "aria-label": ariaLabel,
40
+ className
41
+ }) {
42
+ const [isExpanded, setIsExpanded] = React.useState(defaultExpanded);
43
+ const config = statusConfig[status];
44
+ const contentId = React.useId();
45
+ const statusLabel = STATUS_LABELS[status] || status;
46
+ return /* @__PURE__ */ jsxs(
47
+ "div",
48
+ {
49
+ className: cn(
50
+ "rounded-lg border overflow-hidden",
51
+ "bg-[var(--axis-surface-default)] border-[var(--axis-border-default)]",
52
+ className
53
+ ),
54
+ children: [
55
+ /* @__PURE__ */ jsxs(
56
+ "button",
57
+ {
58
+ onClick: () => setIsExpanded(!isExpanded),
59
+ "aria-expanded": isExpanded,
60
+ "aria-controls": contentId,
61
+ "aria-label": ariaLabel || `${toolName} - ${statusLabel}`,
62
+ className: "w-full flex items-center justify-between p-3 hover:bg-[var(--axis-surface-secondary)] transition-colors",
63
+ children: [
64
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
65
+ /* @__PURE__ */ jsx("span", { className: config.color, "aria-hidden": "true", children: config.icon }),
66
+ /* @__PURE__ */ jsx("code", { className: "text-sm font-mono text-[var(--axis-text-primary)]", children: toolName }),
67
+ description && /* @__PURE__ */ jsxs("span", { className: "text-xs text-[var(--axis-text-secondary)]", children: [
68
+ "\u2014 ",
69
+ description
70
+ ] })
71
+ ] }),
72
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
73
+ duration !== void 0 && /* @__PURE__ */ jsxs("span", { className: "text-xs text-[var(--axis-text-tertiary)]", children: [
74
+ duration,
75
+ "ms"
76
+ ] }),
77
+ /* @__PURE__ */ jsx(
78
+ "svg",
79
+ {
80
+ className: cn(
81
+ "w-4 h-4 text-[var(--axis-text-secondary)] transition-transform",
82
+ isExpanded && "rotate-180"
83
+ ),
84
+ fill: "none",
85
+ stroke: "currentColor",
86
+ viewBox: "0 0 24 24",
87
+ children: /* @__PURE__ */ jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M19 9l-7 7-7-7" })
88
+ }
89
+ )
90
+ ] })
91
+ ]
92
+ }
93
+ ),
94
+ isExpanded && /* @__PURE__ */ jsxs("div", { id: contentId, className: "border-t border-[var(--axis-border-default)] p-3 space-y-3", children: [
95
+ input && /* @__PURE__ */ jsxs("div", { children: [
96
+ /* @__PURE__ */ jsx("h5", { className: "text-xs font-medium text-[var(--axis-text-secondary)] mb-1", children: "\uC785\uB825" }),
97
+ /* @__PURE__ */ jsx("pre", { className: "text-xs p-2 rounded bg-[var(--axis-surface-secondary)] overflow-x-auto", children: /* @__PURE__ */ jsx("code", { className: "text-[var(--axis-text-primary)]", children: JSON.stringify(input, null, 2) }) })
98
+ ] }),
99
+ output !== void 0 && /* @__PURE__ */ jsxs("div", { children: [
100
+ /* @__PURE__ */ jsx("h5", { className: "text-xs font-medium text-[var(--axis-text-secondary)] mb-1", children: "\uCD9C\uB825" }),
101
+ /* @__PURE__ */ jsx("pre", { className: "text-xs p-2 rounded bg-[var(--axis-surface-secondary)] overflow-x-auto", children: /* @__PURE__ */ jsx("code", { className: "text-[var(--axis-text-primary)]", children: typeof output === "string" ? output : JSON.stringify(output, null, 2) }) })
102
+ ] }),
103
+ error && /* @__PURE__ */ jsxs("div", { children: [
104
+ /* @__PURE__ */ jsx("h5", { className: "text-xs font-medium text-[var(--axis-text-error)] mb-1", children: "\uC5D0\uB7EC" }),
105
+ /* @__PURE__ */ jsx("pre", { className: "text-xs p-2 rounded bg-[var(--axis-surface-error)] overflow-x-auto", children: /* @__PURE__ */ jsx("code", { className: "text-[var(--axis-text-error)]", children: error }) })
106
+ ] })
107
+ ] })
108
+ ]
109
+ }
110
+ );
111
+ }
112
+
113
+ export {
114
+ ToolCallCard
115
+ };