@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
package/dist/index.js ADDED
@@ -0,0 +1,1774 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/index.ts
31
+ var index_exports = {};
32
+ __export(index_exports, {
33
+ AgentAvatar: () => AgentAvatar,
34
+ ApprovalCard: () => ApprovalCard,
35
+ AttachmentCard: () => AttachmentCard,
36
+ CodeBlock: () => CodeBlock,
37
+ ContextPanel: () => ContextPanel,
38
+ DiffViewer: () => DiffViewer,
39
+ FeedbackButtons: () => FeedbackButtons,
40
+ MessageBubble: () => MessageBubble,
41
+ PlanCard: () => PlanCard,
42
+ RecoveryBanner: () => RecoveryBanner,
43
+ RunProgress: () => RunProgress,
44
+ SourcePanel: () => SourcePanel,
45
+ StepTimeline: () => StepTimeline,
46
+ StreamingText: () => StreamingText,
47
+ SurfaceRenderer: () => SurfaceRenderer,
48
+ ThinkingIndicator: () => ThinkingIndicator,
49
+ TokenUsageIndicator: () => TokenUsageIndicator,
50
+ ToolCallCard: () => ToolCallCard
51
+ });
52
+ module.exports = __toCommonJS(index_exports);
53
+
54
+ // src/run-progress/index.tsx
55
+ var React = __toESM(require("react"));
56
+ var import_ui_react = require("@axis-ds/ui-react");
57
+
58
+ // src/constants/a11y-labels.ts
59
+ var STATUS_LABELS = {
60
+ pending: "\uB300\uAE30 \uC911",
61
+ running: "\uC2E4\uD589 \uC911",
62
+ complete: "\uC644\uB8CC",
63
+ success: "\uC131\uACF5",
64
+ error: "\uC624\uB958",
65
+ skipped: "\uAC74\uB108\uB700",
66
+ idle: "\uB300\uAE30 \uC911"
67
+ };
68
+ var SEVERITY_LABELS = {
69
+ info: "\uC815\uBCF4",
70
+ warning: "\uC8FC\uC758",
71
+ error: "\uC624\uB958"
72
+ };
73
+ var AGENT_STATUS_LABELS = {
74
+ online: "\uC628\uB77C\uC778",
75
+ busy: "\uC0AC\uC6A9 \uC911",
76
+ offline: "\uC624\uD504\uB77C\uC778"
77
+ };
78
+ var SOURCE_TYPE_LABELS = {
79
+ web: "\uC6F9 \uD398\uC774\uC9C0",
80
+ file: "\uD30C\uC77C",
81
+ database: "\uB370\uC774\uD130\uBCA0\uC774\uC2A4",
82
+ api: "API"
83
+ };
84
+ var MESSAGE_ROLE_LABELS = {
85
+ user: "\uC0AC\uC6A9\uC790",
86
+ assistant: "\uC5B4\uC2DC\uC2A4\uD134\uD2B8",
87
+ system: "\uC2DC\uC2A4\uD15C"
88
+ };
89
+ var FEEDBACK_LABELS = {
90
+ like: "\uC88B\uC544\uC694",
91
+ dislike: "\uC2EB\uC5B4\uC694",
92
+ none: "\uD53C\uB4DC\uBC31 \uC5C6\uC74C"
93
+ };
94
+ var ATTACHMENT_TYPE_LABELS = {
95
+ image: "\uC774\uBBF8\uC9C0",
96
+ document: "\uBB38\uC11C",
97
+ code: "\uCF54\uB4DC",
98
+ archive: "\uC555\uCD95 \uD30C\uC77C",
99
+ other: "\uAE30\uD0C0 \uD30C\uC77C"
100
+ };
101
+ var DIFF_LABELS = {
102
+ added: "\uCD94\uAC00\uB428",
103
+ removed: "\uC0AD\uC81C\uB428",
104
+ unchanged: "\uBCC0\uACBD \uC5C6\uC74C"
105
+ };
106
+ var PLAN_STATUS_LABELS = {
107
+ draft: "\uCD08\uC548",
108
+ pending: "\uC2B9\uC778 \uB300\uAE30",
109
+ approved: "\uC2B9\uC778\uB428",
110
+ rejected: "\uAC70\uC808\uB428",
111
+ executing: "\uC2E4\uD589 \uC911",
112
+ completed: "\uC644\uB8CC"
113
+ };
114
+
115
+ // src/run-progress/index.tsx
116
+ var import_jsx_runtime = require("react/jsx-runtime");
117
+ var statusColors = {
118
+ pending: "bg-[var(--axis-color-gray-300)]",
119
+ running: "bg-[var(--axis-color-blue-500)] animate-pulse",
120
+ complete: "bg-[var(--axis-color-green-500)]",
121
+ error: "bg-[var(--axis-color-red-500)]"
122
+ };
123
+ var statusIcons = {
124
+ pending: null,
125
+ running: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("svg", { className: "w-3 h-3 animate-spin", viewBox: "0 0 24 24", fill: "none", children: [
126
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }),
127
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { className: "opacity-75", fill: "currentColor", d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z" })
128
+ ] }),
129
+ complete: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", { className: "w-3 h-3", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M5 13l4 4L19 7" }) }),
130
+ error: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", { className: "w-3 h-3", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M6 18L18 6M6 6l12 12" }) })
131
+ };
132
+ function RunProgress({
133
+ status,
134
+ steps,
135
+ currentStep,
136
+ onCancel,
137
+ onRetry,
138
+ className
139
+ }) {
140
+ const progressPercent = React.useMemo(() => {
141
+ const completed = steps.filter((s) => s.status === "complete").length;
142
+ return Math.round(completed / steps.length * 100);
143
+ }, [steps]);
144
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
145
+ "div",
146
+ {
147
+ className: (0, import_ui_react.cn)(
148
+ "rounded-lg border p-4",
149
+ "bg-[var(--axis-surface-default)] border-[var(--axis-border-default)]",
150
+ className
151
+ ),
152
+ children: [
153
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center justify-between mb-4", children: [
154
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center gap-2", children: [
155
+ status === "running" && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "w-2 h-2 rounded-full bg-[var(--axis-color-blue-500)] animate-pulse" }),
156
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { className: "text-sm font-medium text-[var(--axis-text-primary)]", children: [
157
+ status === "idle" && "\uB300\uAE30 \uC911",
158
+ status === "running" && "\uC2E4\uD589 \uC911",
159
+ status === "complete" && "\uC644\uB8CC",
160
+ status === "error" && "\uC624\uB958 \uBC1C\uC0DD"
161
+ ] })
162
+ ] }),
163
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { className: "text-xs text-[var(--axis-text-secondary)]", children: [
164
+ progressPercent,
165
+ "%"
166
+ ] })
167
+ ] }),
168
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
169
+ "div",
170
+ {
171
+ role: "progressbar",
172
+ "aria-valuenow": progressPercent,
173
+ "aria-valuemin": 0,
174
+ "aria-valuemax": 100,
175
+ "aria-label": `\uC2E4\uD589 \uC9C4\uD589\uB960 ${progressPercent}%`,
176
+ className: "w-full h-1.5 rounded-full bg-[var(--axis-surface-secondary)] mb-4",
177
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
178
+ "div",
179
+ {
180
+ className: "h-full rounded-full bg-[var(--axis-color-blue-500)] transition-all duration-300",
181
+ style: { width: `${progressPercent}%` }
182
+ }
183
+ )
184
+ }
185
+ ),
186
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { role: "list", "aria-label": "\uC2E4\uD589 \uB2E8\uACC4", className: "space-y-2", children: steps.map((step, index) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
187
+ "div",
188
+ {
189
+ role: "listitem",
190
+ "aria-current": currentStep === index ? "step" : void 0,
191
+ className: (0, import_ui_react.cn)(
192
+ "flex items-center gap-3 p-2 rounded-md transition-colors",
193
+ currentStep === index && "bg-[var(--axis-surface-secondary)]"
194
+ ),
195
+ children: [
196
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
197
+ "div",
198
+ {
199
+ className: (0, import_ui_react.cn)(
200
+ "w-5 h-5 rounded-full flex items-center justify-center text-white text-xs",
201
+ statusColors[step.status]
202
+ ),
203
+ "aria-hidden": "true",
204
+ children: statusIcons[step.status] || index + 1
205
+ }
206
+ ),
207
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex-1 min-w-0", children: [
208
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { className: "sr-only", children: [
209
+ STATUS_LABELS[step.status],
210
+ ":"
211
+ ] }),
212
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-sm font-medium text-[var(--axis-text-primary)] truncate", children: step.label }),
213
+ step.description && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-xs text-[var(--axis-text-secondary)] truncate", children: step.description })
214
+ ] })
215
+ ]
216
+ },
217
+ step.id
218
+ )) }),
219
+ (onCancel || onRetry) && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex justify-end gap-2 mt-4 pt-4 border-t border-[var(--axis-border-default)]", children: [
220
+ status === "running" && onCancel && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
221
+ "button",
222
+ {
223
+ onClick: onCancel,
224
+ 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)]",
225
+ children: "\uCDE8\uC18C"
226
+ }
227
+ ),
228
+ status === "error" && onRetry && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
229
+ "button",
230
+ {
231
+ onClick: onRetry,
232
+ 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)]",
233
+ children: "\uC7AC\uC2DC\uB3C4"
234
+ }
235
+ )
236
+ ] })
237
+ ]
238
+ }
239
+ );
240
+ }
241
+
242
+ // src/step-timeline/index.tsx
243
+ var import_ui_react2 = require("@axis-ds/ui-react");
244
+ var import_jsx_runtime2 = require("react/jsx-runtime");
245
+ function StepTimeline({
246
+ steps,
247
+ orientation = "vertical",
248
+ className
249
+ }) {
250
+ const isVertical = orientation === "vertical";
251
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
252
+ "div",
253
+ {
254
+ role: "list",
255
+ "aria-label": "\uC791\uC5C5 \uD0C0\uC784\uB77C\uC778",
256
+ className: (0, import_ui_react2.cn)(
257
+ isVertical ? "flex flex-col gap-4" : "flex items-center gap-2",
258
+ className
259
+ ),
260
+ children: steps.map((step, index) => /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
261
+ "div",
262
+ {
263
+ role: "listitem",
264
+ "aria-current": step.status === "running" ? "step" : void 0,
265
+ className: (0, import_ui_react2.cn)(
266
+ "relative flex",
267
+ isVertical ? "items-start gap-3" : "flex-col items-center"
268
+ ),
269
+ children: [
270
+ index < steps.length - 1 && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
271
+ "div",
272
+ {
273
+ "aria-hidden": "true",
274
+ className: (0, import_ui_react2.cn)(
275
+ "absolute bg-[var(--axis-border-default)]",
276
+ 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"
277
+ )
278
+ }
279
+ ),
280
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
281
+ "div",
282
+ {
283
+ "aria-hidden": "true",
284
+ className: (0, import_ui_react2.cn)(
285
+ "relative z-10 w-5 h-5 rounded-full flex items-center justify-center",
286
+ step.status === "complete" && "bg-[var(--axis-color-green-500)]",
287
+ step.status === "running" && "bg-[var(--axis-color-blue-500)] animate-pulse",
288
+ step.status === "error" && "bg-[var(--axis-color-red-500)]",
289
+ step.status === "skipped" && "bg-[var(--axis-color-gray-300)]",
290
+ step.status === "pending" && "bg-[var(--axis-color-gray-300)]"
291
+ ),
292
+ children: step.status === "complete" && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("svg", { className: "w-3 h-3 text-white", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 3, d: "M5 13l4 4L19 7" }) })
293
+ }
294
+ ),
295
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: (0, import_ui_react2.cn)(isVertical ? "flex-1" : "text-center mt-2"), children: [
296
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("span", { className: "sr-only", children: [
297
+ STATUS_LABELS[step.status],
298
+ ":"
299
+ ] }),
300
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-sm font-medium text-[var(--axis-text-primary)]", children: step.label }),
301
+ step.description && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-xs text-[var(--axis-text-secondary)]", children: step.description }),
302
+ step.timestamp && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "text-xs text-[var(--axis-text-tertiary)]", children: step.timestamp.toLocaleTimeString() })
303
+ ] })
304
+ ]
305
+ },
306
+ step.id
307
+ ))
308
+ }
309
+ );
310
+ }
311
+
312
+ // src/thinking-indicator/index.tsx
313
+ var import_ui_react3 = require("@axis-ds/ui-react");
314
+ var import_jsx_runtime3 = require("react/jsx-runtime");
315
+ var sizeStyles = {
316
+ sm: "text-xs gap-1",
317
+ md: "text-sm gap-1.5",
318
+ lg: "text-base gap-2"
319
+ };
320
+ var dotSizes = {
321
+ sm: "w-1 h-1",
322
+ md: "w-1.5 h-1.5",
323
+ lg: "w-2 h-2"
324
+ };
325
+ function ThinkingIndicator({
326
+ text = "\uC0DD\uAC01 \uC911",
327
+ size = "md",
328
+ className
329
+ }) {
330
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
331
+ "div",
332
+ {
333
+ role: "status",
334
+ "aria-live": "polite",
335
+ "aria-label": text,
336
+ className: (0, import_ui_react3.cn)(
337
+ "flex items-center text-[var(--axis-text-secondary)]",
338
+ sizeStyles[size],
339
+ className
340
+ ),
341
+ children: [
342
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { children: text }),
343
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "flex gap-0.5", "aria-hidden": "true", children: [0, 1, 2].map((i) => /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
344
+ "div",
345
+ {
346
+ className: (0, import_ui_react3.cn)(
347
+ "rounded-full bg-current animate-bounce",
348
+ dotSizes[size]
349
+ ),
350
+ style: { animationDelay: `${i * 150}ms` }
351
+ },
352
+ i
353
+ )) })
354
+ ]
355
+ }
356
+ );
357
+ }
358
+
359
+ // src/approval-card/index.tsx
360
+ var React2 = __toESM(require("react"));
361
+ var import_ui_react4 = require("@axis-ds/ui-react");
362
+ var import_jsx_runtime4 = require("react/jsx-runtime");
363
+ var severityStyles = {
364
+ info: {
365
+ border: "border-l-[var(--axis-color-blue-500)]",
366
+ icon: "text-[var(--axis-color-blue-500)]",
367
+ bg: "bg-[var(--axis-surface-info)]"
368
+ },
369
+ warning: {
370
+ border: "border-l-[var(--axis-color-yellow-500)]",
371
+ icon: "text-[var(--axis-color-yellow-500)]",
372
+ bg: "bg-[var(--axis-surface-warning)]"
373
+ },
374
+ error: {
375
+ border: "border-l-[var(--axis-color-red-500)]",
376
+ icon: "text-[var(--axis-color-red-500)]",
377
+ bg: "bg-[var(--axis-surface-error)]"
378
+ }
379
+ };
380
+ var severityIcons = {
381
+ info: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("svg", { className: "w-5 h-5", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z" }) }),
382
+ warning: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("svg", { className: "w-5 h-5", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, 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" }) }),
383
+ error: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("svg", { className: "w-5 h-5", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z" }) })
384
+ };
385
+ var actionVariantStyles = {
386
+ default: "bg-[var(--axis-button-bg-default)] text-white hover:bg-[var(--axis-button-bg-hover)]",
387
+ secondary: "bg-[var(--axis-button-secondary-bg-default)] text-[var(--axis-text-primary)] hover:bg-[var(--axis-button-secondary-bg-hover)]",
388
+ ghost: "bg-transparent text-[var(--axis-text-primary)] hover:bg-[var(--axis-surface-secondary)]",
389
+ destructive: "bg-[var(--axis-button-destructive-bg-default)] text-white hover:bg-[var(--axis-button-destructive-bg-hover)]"
390
+ };
391
+ function ApprovalCard({
392
+ id,
393
+ title,
394
+ description,
395
+ severity = "info",
396
+ actions,
397
+ children,
398
+ className
399
+ }) {
400
+ const styles = severityStyles[severity];
401
+ const generatedId = React2.useId();
402
+ const baseId = id || generatedId;
403
+ const titleId = `${baseId}-title`;
404
+ const descId = `${baseId}-desc`;
405
+ const severityLabel = SEVERITY_LABELS[severity];
406
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
407
+ "div",
408
+ {
409
+ role: "region",
410
+ "aria-labelledby": titleId,
411
+ "aria-describedby": description ? descId : void 0,
412
+ className: (0, import_ui_react4.cn)(
413
+ "rounded-lg border border-l-4 p-4",
414
+ "bg-[var(--axis-surface-default)] border-[var(--axis-border-default)]",
415
+ styles.border,
416
+ className
417
+ ),
418
+ children: /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "flex items-start gap-3", children: [
419
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: (0, import_ui_react4.cn)("flex-shrink-0 mt-0.5", styles.icon), "aria-hidden": "true", children: severityIcons[severity] }),
420
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "flex-1 min-w-0", children: [
421
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("span", { className: "sr-only", children: [
422
+ severityLabel,
423
+ " \uC54C\uB9BC:"
424
+ ] }),
425
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("h4", { id: titleId, className: "text-sm font-semibold text-[var(--axis-text-primary)]", children: title }),
426
+ description && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("p", { id: descId, className: "mt-1 text-sm text-[var(--axis-text-secondary)]", children: description }),
427
+ children && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "mt-3", children }),
428
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "flex flex-wrap gap-2 mt-4", children: actions.map((action, index) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
429
+ "button",
430
+ {
431
+ onClick: action.onClick,
432
+ className: (0, import_ui_react4.cn)(
433
+ "px-3 py-1.5 text-sm font-medium rounded-md transition-colors",
434
+ actionVariantStyles[action.variant || "default"]
435
+ ),
436
+ children: action.label
437
+ },
438
+ index
439
+ )) })
440
+ ] })
441
+ ] })
442
+ }
443
+ );
444
+ }
445
+
446
+ // src/source-panel/index.tsx
447
+ var React3 = __toESM(require("react"));
448
+ var import_ui_react5 = require("@axis-ds/ui-react");
449
+ var import_jsx_runtime5 = require("react/jsx-runtime");
450
+ var sourceIcons = {
451
+ web: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("svg", { className: "w-4 h-4", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M21 12a9 9 0 01-9 9m9-9a9 9 0 00-9-9m9 9H3m9 9a9 9 0 01-9-9m9 9c1.657 0 3-4.03 3-9s-1.343-9-3-9m0 18c-1.657 0-3-4.03-3-9s1.343-9 3-9m-9 9a9 9 0 019-9" }) }),
452
+ file: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("svg", { className: "w-4 h-4", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z" }) }),
453
+ database: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("svg", { className: "w-4 h-4", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M4 7v10c0 2.21 3.582 4 8 4s8-1.79 8-4V7M4 7c0 2.21 3.582 4 8 4s8-1.79 8-4M4 7c0-2.21 3.582-4 8-4s8 1.79 8 4" }) }),
454
+ api: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("svg", { className: "w-4 h-4", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M8 9l3 3-3 3m5 0h3M5 20h14a2 2 0 002-2V6a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z" }) })
455
+ };
456
+ function SourcePanel({
457
+ sources,
458
+ expandable = true,
459
+ defaultExpanded = false,
460
+ maxItems = 5,
461
+ className
462
+ }) {
463
+ const [isExpanded, setIsExpanded] = React3.useState(defaultExpanded);
464
+ const displayedSources = isExpanded ? sources : sources.slice(0, maxItems);
465
+ const hasMore = sources.length > maxItems;
466
+ const listId = React3.useId();
467
+ if (sources.length === 0) return null;
468
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
469
+ "div",
470
+ {
471
+ className: (0, import_ui_react5.cn)(
472
+ "rounded-lg border p-3",
473
+ "bg-[var(--axis-surface-secondary)] border-[var(--axis-border-default)]",
474
+ className
475
+ ),
476
+ children: [
477
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("h4", { className: "text-xs font-medium text-[var(--axis-text-secondary)] mb-2", children: [
478
+ "\uCD9C\uCC98 (",
479
+ sources.length,
480
+ "\uAC1C)"
481
+ ] }),
482
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { id: listId, role: "list", "aria-label": "\uCD9C\uCC98 \uBAA9\uB85D", className: "space-y-2", children: displayedSources.map((source) => /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
483
+ "div",
484
+ {
485
+ role: "listitem",
486
+ className: "flex items-start gap-2 p-2 rounded-md bg-[var(--axis-surface-default)]",
487
+ children: [
488
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "text-[var(--axis-icon-secondary)] mt-0.5", "aria-hidden": "true", children: sourceIcons[source.type] }),
489
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { className: "flex-1 min-w-0", children: [
490
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("span", { className: "sr-only", children: [
491
+ SOURCE_TYPE_LABELS[source.type],
492
+ ":"
493
+ ] }),
494
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "text-sm font-medium text-[var(--axis-text-primary)] truncate", children: source.url ? /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
495
+ "a",
496
+ {
497
+ href: source.url,
498
+ target: "_blank",
499
+ rel: "noopener noreferrer",
500
+ className: "hover:underline",
501
+ "aria-label": `${source.title} (\uC0C8 \uCC3D\uC5D0\uC11C \uC5F4\uB9BC)`,
502
+ children: [
503
+ source.title,
504
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "sr-only", children: ", \uC0C8 \uCC3D\uC5D0\uC11C \uC5F4\uB9BC" })
505
+ ]
506
+ }
507
+ ) : source.title }),
508
+ source.snippet && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("p", { className: "text-xs text-[var(--axis-text-secondary)] line-clamp-2 mt-0.5", children: source.snippet }),
509
+ source.path && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("code", { className: "text-xs text-[var(--axis-text-tertiary)]", children: source.path })
510
+ ] }),
511
+ source.relevance !== void 0 && /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("span", { className: "text-xs text-[var(--axis-text-tertiary)]", children: [
512
+ Math.round(source.relevance * 100),
513
+ "%"
514
+ ] })
515
+ ]
516
+ },
517
+ source.id
518
+ )) }),
519
+ expandable && hasMore && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
520
+ "button",
521
+ {
522
+ onClick: () => setIsExpanded(!isExpanded),
523
+ "aria-expanded": isExpanded,
524
+ "aria-controls": listId,
525
+ className: "mt-2 text-xs text-[var(--axis-text-brand)] hover:underline",
526
+ children: isExpanded ? "\uC811\uAE30" : `${sources.length - maxItems}\uAC1C \uB354 \uBCF4\uAE30`
527
+ }
528
+ )
529
+ ]
530
+ }
531
+ );
532
+ }
533
+
534
+ // src/streaming-text/index.tsx
535
+ var React4 = __toESM(require("react"));
536
+ var import_ui_react6 = require("@axis-ds/ui-react");
537
+ var import_jsx_runtime6 = require("react/jsx-runtime");
538
+ function StreamingText({
539
+ text,
540
+ speed = 20,
541
+ isComplete = false,
542
+ showCursor = true,
543
+ onComplete,
544
+ "aria-live": ariaLive,
545
+ "aria-label": ariaLabel,
546
+ className
547
+ }) {
548
+ const [displayedText, setDisplayedText] = React4.useState("");
549
+ const [isStreaming, setIsStreaming] = React4.useState(false);
550
+ const prevTextRef = React4.useRef("");
551
+ React4.useEffect(() => {
552
+ if (isComplete) {
553
+ setDisplayedText(text);
554
+ setIsStreaming(false);
555
+ return;
556
+ }
557
+ if (text.length > prevTextRef.current.length && text.startsWith(prevTextRef.current)) {
558
+ const newText = text.slice(prevTextRef.current.length);
559
+ let charIndex = 0;
560
+ setIsStreaming(true);
561
+ const interval = setInterval(() => {
562
+ if (charIndex < newText.length) {
563
+ setDisplayedText((prev) => prev + newText[charIndex]);
564
+ charIndex++;
565
+ } else {
566
+ clearInterval(interval);
567
+ setIsStreaming(false);
568
+ if (onComplete) onComplete();
569
+ }
570
+ }, speed);
571
+ prevTextRef.current = text;
572
+ return () => clearInterval(interval);
573
+ } else if (text !== prevTextRef.current) {
574
+ setDisplayedText("");
575
+ prevTextRef.current = "";
576
+ }
577
+ }, [text, speed, isComplete, onComplete]);
578
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
579
+ "div",
580
+ {
581
+ role: "region",
582
+ "aria-label": ariaLabel || "AI \uC751\uB2F5",
583
+ "aria-live": ariaLive ?? "polite",
584
+ "aria-busy": isStreaming,
585
+ className: (0, import_ui_react6.cn)("relative", className),
586
+ children: [
587
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "text-[var(--axis-text-primary)] whitespace-pre-wrap", children: displayedText }),
588
+ showCursor && isStreaming && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "inline-block w-0.5 h-4 ml-0.5 bg-[var(--axis-text-primary)] animate-pulse", "aria-hidden": "true" })
589
+ ]
590
+ }
591
+ );
592
+ }
593
+
594
+ // src/tool-call-card/index.tsx
595
+ var React5 = __toESM(require("react"));
596
+ var import_ui_react7 = require("@axis-ds/ui-react");
597
+ var import_jsx_runtime7 = require("react/jsx-runtime");
598
+ var statusConfig = {
599
+ pending: {
600
+ color: "text-[var(--axis-color-gray-400)]",
601
+ icon: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("svg", { className: "w-4 h-4", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("circle", { cx: "12", cy: "12", r: "10", strokeWidth: 2 }) })
602
+ },
603
+ running: {
604
+ color: "text-[var(--axis-color-blue-500)]",
605
+ icon: /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("svg", { className: "w-4 h-4 animate-spin", viewBox: "0 0 24 24", fill: "none", children: [
606
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }),
607
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("path", { className: "opacity-75", fill: "currentColor", d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z" })
608
+ ] })
609
+ },
610
+ success: {
611
+ color: "text-[var(--axis-color-green-500)]",
612
+ icon: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("svg", { className: "w-4 h-4", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M5 13l4 4L19 7" }) })
613
+ },
614
+ error: {
615
+ color: "text-[var(--axis-color-red-500)]",
616
+ icon: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("svg", { className: "w-4 h-4", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M6 18L18 6M6 6l12 12" }) })
617
+ }
618
+ };
619
+ function ToolCallCard({
620
+ toolName,
621
+ description,
622
+ status,
623
+ input,
624
+ output,
625
+ error,
626
+ duration,
627
+ defaultExpanded = false,
628
+ "aria-label": ariaLabel,
629
+ className
630
+ }) {
631
+ const [isExpanded, setIsExpanded] = React5.useState(defaultExpanded);
632
+ const config = statusConfig[status];
633
+ const contentId = React5.useId();
634
+ const statusLabel = STATUS_LABELS[status] || status;
635
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
636
+ "div",
637
+ {
638
+ className: (0, import_ui_react7.cn)(
639
+ "rounded-lg border overflow-hidden",
640
+ "bg-[var(--axis-surface-default)] border-[var(--axis-border-default)]",
641
+ className
642
+ ),
643
+ children: [
644
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
645
+ "button",
646
+ {
647
+ onClick: () => setIsExpanded(!isExpanded),
648
+ "aria-expanded": isExpanded,
649
+ "aria-controls": contentId,
650
+ "aria-label": ariaLabel || `${toolName} - ${statusLabel}`,
651
+ className: "w-full flex items-center justify-between p-3 hover:bg-[var(--axis-surface-secondary)] transition-colors",
652
+ children: [
653
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "flex items-center gap-2", children: [
654
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", { className: config.color, "aria-hidden": "true", children: config.icon }),
655
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("code", { className: "text-sm font-mono text-[var(--axis-text-primary)]", children: toolName }),
656
+ description && /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("span", { className: "text-xs text-[var(--axis-text-secondary)]", children: [
657
+ "\u2014 ",
658
+ description
659
+ ] })
660
+ ] }),
661
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "flex items-center gap-2", children: [
662
+ duration !== void 0 && /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("span", { className: "text-xs text-[var(--axis-text-tertiary)]", children: [
663
+ duration,
664
+ "ms"
665
+ ] }),
666
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
667
+ "svg",
668
+ {
669
+ className: (0, import_ui_react7.cn)(
670
+ "w-4 h-4 text-[var(--axis-text-secondary)] transition-transform",
671
+ isExpanded && "rotate-180"
672
+ ),
673
+ fill: "none",
674
+ stroke: "currentColor",
675
+ viewBox: "0 0 24 24",
676
+ children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M19 9l-7 7-7-7" })
677
+ }
678
+ )
679
+ ] })
680
+ ]
681
+ }
682
+ ),
683
+ isExpanded && /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { id: contentId, className: "border-t border-[var(--axis-border-default)] p-3 space-y-3", children: [
684
+ input && /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { children: [
685
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("h5", { className: "text-xs font-medium text-[var(--axis-text-secondary)] mb-1", children: "\uC785\uB825" }),
686
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("pre", { className: "text-xs p-2 rounded bg-[var(--axis-surface-secondary)] overflow-x-auto", children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("code", { className: "text-[var(--axis-text-primary)]", children: JSON.stringify(input, null, 2) }) })
687
+ ] }),
688
+ output !== void 0 && /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { children: [
689
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("h5", { className: "text-xs font-medium text-[var(--axis-text-secondary)] mb-1", children: "\uCD9C\uB825" }),
690
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("pre", { className: "text-xs p-2 rounded bg-[var(--axis-surface-secondary)] overflow-x-auto", children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("code", { className: "text-[var(--axis-text-primary)]", children: typeof output === "string" ? output : JSON.stringify(output, null, 2) }) })
691
+ ] }),
692
+ error && /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { children: [
693
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("h5", { className: "text-xs font-medium text-[var(--axis-text-error)] mb-1", children: "\uC5D0\uB7EC" }),
694
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("pre", { className: "text-xs p-2 rounded bg-[var(--axis-surface-error)] overflow-x-auto", children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("code", { className: "text-[var(--axis-text-error)]", children: error }) })
695
+ ] })
696
+ ] })
697
+ ]
698
+ }
699
+ );
700
+ }
701
+
702
+ // src/surface-renderer/index.tsx
703
+ var import_ui_react8 = require("@axis-ds/ui-react");
704
+ var import_jsx_runtime8 = require("react/jsx-runtime");
705
+ function SurfaceRenderer({
706
+ surface,
707
+ renderCustom,
708
+ className
709
+ }) {
710
+ const renderContent = () => {
711
+ switch (surface.type) {
712
+ case "text":
713
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { className: "prose prose-sm max-w-none text-[var(--axis-text-primary)]", children: String(surface.content) });
714
+ case "code":
715
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("pre", { className: "p-3 rounded-md bg-[var(--axis-surface-secondary)] overflow-x-auto", children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("code", { className: "text-sm font-mono text-[var(--axis-text-primary)]", children: String(surface.content) }) });
716
+ case "table":
717
+ const tableData = surface.content;
718
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { className: "overflow-x-auto", children: /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("table", { role: "table", className: "w-full text-sm", children: [
719
+ surface.title && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("caption", { className: "sr-only", children: surface.title }),
720
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("thead", { children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("tr", { className: "border-b border-[var(--axis-border-default)]", children: tableData.headers.map((header, i) => /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
721
+ "th",
722
+ {
723
+ scope: "col",
724
+ className: "px-3 py-2 text-left font-medium text-[var(--axis-text-secondary)]",
725
+ children: header
726
+ },
727
+ i
728
+ )) }) }),
729
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("tbody", { children: tableData.rows.map((row, i) => /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
730
+ "tr",
731
+ {
732
+ className: "border-b border-[var(--axis-border-default)] last:border-0",
733
+ children: row.map((cell, j) => /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
734
+ "td",
735
+ {
736
+ className: "px-3 py-2 text-[var(--axis-text-primary)]",
737
+ children: cell
738
+ },
739
+ j
740
+ ))
741
+ },
742
+ i
743
+ )) })
744
+ ] }) });
745
+ case "chart":
746
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { className: "p-4 text-center text-[var(--axis-text-secondary)]", children: [
747
+ "[\uCC28\uD2B8: ",
748
+ surface.title || "\uB370\uC774\uD130 \uC2DC\uAC01\uD654",
749
+ "]"
750
+ ] });
751
+ case "form":
752
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)("div", { className: "p-4 text-center text-[var(--axis-text-secondary)]", children: [
753
+ "[\uD3FC: ",
754
+ surface.title || "\uC785\uB825 \uC591\uC2DD",
755
+ "]"
756
+ ] });
757
+ case "custom":
758
+ if (renderCustom) {
759
+ return renderCustom(surface);
760
+ }
761
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { className: "p-4 text-center text-[var(--axis-text-secondary)]", children: "[\uCEE4\uC2A4\uD140 Surface]" });
762
+ default:
763
+ return null;
764
+ }
765
+ };
766
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
767
+ "div",
768
+ {
769
+ className: (0, import_ui_react8.cn)(
770
+ "rounded-lg border p-4",
771
+ "bg-[var(--axis-surface-default)] border-[var(--axis-border-default)]",
772
+ className
773
+ ),
774
+ children: [
775
+ surface.title && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("h4", { className: "text-sm font-medium text-[var(--axis-text-primary)] mb-3", children: surface.title }),
776
+ renderContent()
777
+ ]
778
+ }
779
+ );
780
+ }
781
+
782
+ // src/recovery-banner/index.tsx
783
+ var React6 = __toESM(require("react"));
784
+ var import_ui_react9 = require("@axis-ds/ui-react");
785
+ var import_jsx_runtime9 = require("react/jsx-runtime");
786
+ function RecoveryBanner({
787
+ message,
788
+ description,
789
+ onRetry,
790
+ onDismiss,
791
+ className
792
+ }) {
793
+ const titleId = React6.useId();
794
+ const descId = React6.useId();
795
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(
796
+ "div",
797
+ {
798
+ className: (0, import_ui_react9.cn)(
799
+ "flex items-start gap-3 p-4 rounded-lg border",
800
+ "bg-[var(--axis-surface-error)] border-[var(--axis-color-red-200)]",
801
+ className
802
+ ),
803
+ role: "alert",
804
+ "aria-labelledby": titleId,
805
+ "aria-describedby": description ? descId : void 0,
806
+ children: [
807
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
808
+ "svg",
809
+ {
810
+ className: "w-5 h-5 text-[var(--axis-color-red-500)] flex-shrink-0 mt-0.5",
811
+ fill: "none",
812
+ stroke: "currentColor",
813
+ viewBox: "0 0 24 24",
814
+ "aria-hidden": "true",
815
+ children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
816
+ "path",
817
+ {
818
+ strokeLinecap: "round",
819
+ strokeLinejoin: "round",
820
+ strokeWidth: 2,
821
+ 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"
822
+ }
823
+ )
824
+ }
825
+ ),
826
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: "flex-1 min-w-0", children: [
827
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("p", { id: titleId, className: "text-sm font-medium text-[var(--axis-text-error)]", children: message }),
828
+ description && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("p", { id: descId, className: "mt-1 text-sm text-[var(--axis-text-secondary)]", children: description }),
829
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: "flex gap-2 mt-3", children: [
830
+ onRetry && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
831
+ "button",
832
+ {
833
+ onClick: onRetry,
834
+ "aria-describedby": descId,
835
+ 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",
836
+ children: "\uC7AC\uC2DC\uB3C4"
837
+ }
838
+ ),
839
+ onDismiss && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
840
+ "button",
841
+ {
842
+ onClick: onDismiss,
843
+ 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",
844
+ children: "\uBB34\uC2DC"
845
+ }
846
+ )
847
+ ] })
848
+ ] })
849
+ ]
850
+ }
851
+ );
852
+ }
853
+
854
+ // src/agent-avatar/index.tsx
855
+ var import_ui_react10 = require("@axis-ds/ui-react");
856
+ var import_jsx_runtime10 = require("react/jsx-runtime");
857
+ var sizeStyles2 = {
858
+ sm: "w-6 h-6 text-xs",
859
+ md: "w-8 h-8 text-sm",
860
+ lg: "w-10 h-10 text-base",
861
+ xl: "w-12 h-12 text-lg"
862
+ };
863
+ var statusStyles = {
864
+ online: "bg-[var(--axis-color-green-500)]",
865
+ busy: "bg-[var(--axis-color-yellow-500)]",
866
+ offline: "bg-[var(--axis-color-gray-400)]"
867
+ };
868
+ var typeColors = {
869
+ assistant: "bg-[var(--axis-color-purple-500)]",
870
+ tool: "bg-[var(--axis-color-blue-500)]",
871
+ system: "bg-[var(--axis-color-gray-600)]"
872
+ };
873
+ function AgentAvatar({
874
+ name,
875
+ src,
876
+ size = "md",
877
+ status,
878
+ type = "assistant",
879
+ className
880
+ }) {
881
+ const initials = name.split(" ").map((n) => n[0]).join("").slice(0, 2).toUpperCase();
882
+ const statusLabel = status ? AGENT_STATUS_LABELS[status] : "";
883
+ const ariaLabel = `${name}${statusLabel ? `, ${statusLabel}` : ""}`;
884
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(
885
+ "div",
886
+ {
887
+ role: "img",
888
+ "aria-label": ariaLabel,
889
+ className: (0, import_ui_react10.cn)("relative inline-flex", className),
890
+ children: [
891
+ src ? /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
892
+ "img",
893
+ {
894
+ src,
895
+ alt: "",
896
+ "aria-hidden": "true",
897
+ className: (0, import_ui_react10.cn)(
898
+ "rounded-full object-cover",
899
+ sizeStyles2[size]
900
+ )
901
+ }
902
+ ) : /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
903
+ "div",
904
+ {
905
+ "aria-hidden": "true",
906
+ className: (0, import_ui_react10.cn)(
907
+ "rounded-full flex items-center justify-center font-medium text-white",
908
+ sizeStyles2[size],
909
+ typeColors[type]
910
+ ),
911
+ children: initials
912
+ }
913
+ ),
914
+ status && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
915
+ "span",
916
+ {
917
+ "aria-hidden": "true",
918
+ className: (0, import_ui_react10.cn)(
919
+ "absolute bottom-0 right-0 rounded-full border-2 border-[var(--axis-surface-default)]",
920
+ size === "sm" ? "w-2 h-2" : "w-3 h-3",
921
+ statusStyles[status]
922
+ )
923
+ }
924
+ )
925
+ ]
926
+ }
927
+ );
928
+ }
929
+
930
+ // src/message-bubble/index.tsx
931
+ var import_ui_react11 = require("@axis-ds/ui-react");
932
+ var import_jsx_runtime11 = require("react/jsx-runtime");
933
+ var roleStyles = {
934
+ user: {
935
+ container: "flex-row-reverse",
936
+ bubble: "bg-[var(--axis-color-blue-500)] text-white rounded-br-sm"
937
+ },
938
+ assistant: {
939
+ container: "flex-row",
940
+ bubble: "bg-[var(--axis-surface-secondary)] text-[var(--axis-text-primary)] rounded-bl-sm"
941
+ },
942
+ system: {
943
+ container: "justify-center",
944
+ bubble: "bg-[var(--axis-surface-tertiary)] text-[var(--axis-text-secondary)] text-xs italic"
945
+ }
946
+ };
947
+ var statusIcons2 = {
948
+ sending: /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("svg", { className: "w-3 h-3 animate-spin", viewBox: "0 0 24 24", fill: "none", children: [
949
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }),
950
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("path", { className: "opacity-75", fill: "currentColor", d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z" })
951
+ ] }),
952
+ sent: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("svg", { className: "w-3 h-3", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M5 13l4 4L19 7" }) }),
953
+ error: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("svg", { className: "w-3 h-3", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M12 8v4m0 4h.01" }) })
954
+ };
955
+ function MessageBubble({
956
+ role,
957
+ content,
958
+ timestamp,
959
+ avatar,
960
+ status,
961
+ actions,
962
+ metadata,
963
+ className
964
+ }) {
965
+ const roleLabel = MESSAGE_ROLE_LABELS[role];
966
+ const renderAvatar = () => {
967
+ if (!avatar) return null;
968
+ if (typeof avatar === "string") {
969
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
970
+ "img",
971
+ {
972
+ src: avatar,
973
+ alt: "",
974
+ "aria-hidden": "true",
975
+ className: "w-8 h-8 rounded-full object-cover flex-shrink-0"
976
+ }
977
+ );
978
+ }
979
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { className: "flex-shrink-0", children: avatar });
980
+ };
981
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
982
+ "div",
983
+ {
984
+ role: "article",
985
+ "aria-label": `${roleLabel} \uBA54\uC2DC\uC9C0`,
986
+ className: (0, import_ui_react11.cn)("flex items-start gap-2", roleStyles[role].container, className),
987
+ children: [
988
+ role !== "system" && renderAvatar(),
989
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { className: (0, import_ui_react11.cn)("max-w-[80%]", role === "system" && "max-w-full"), children: [
990
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
991
+ "div",
992
+ {
993
+ className: (0, import_ui_react11.cn)(
994
+ "rounded-lg px-3 py-2",
995
+ roleStyles[role].bubble
996
+ ),
997
+ children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { className: "text-sm whitespace-pre-wrap", children: content })
998
+ }
999
+ ),
1000
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)("div", { className: "flex items-center gap-2 mt-1 px-1", children: [
1001
+ timestamp && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
1002
+ "time",
1003
+ {
1004
+ dateTime: timestamp.toISOString(),
1005
+ className: "text-xs text-[var(--axis-text-tertiary)]",
1006
+ children: timestamp.toLocaleTimeString("ko-KR", { hour: "2-digit", minute: "2-digit" })
1007
+ }
1008
+ ),
1009
+ metadata && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { className: "text-xs text-[var(--axis-text-tertiary)]", children: metadata }),
1010
+ status && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
1011
+ "span",
1012
+ {
1013
+ className: (0, import_ui_react11.cn)(
1014
+ "text-[var(--axis-text-tertiary)]",
1015
+ status === "error" && "text-[var(--axis-text-error)]"
1016
+ ),
1017
+ "aria-label": status === "sending" ? "\uC804\uC1A1 \uC911" : status === "sent" ? "\uC804\uC1A1\uB428" : "\uC804\uC1A1 \uC2E4\uD328",
1018
+ children: statusIcons2[status]
1019
+ }
1020
+ )
1021
+ ] }),
1022
+ actions && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { className: "mt-1", children: actions })
1023
+ ] })
1024
+ ]
1025
+ }
1026
+ );
1027
+ }
1028
+
1029
+ // src/feedback-buttons/index.tsx
1030
+ var React7 = __toESM(require("react"));
1031
+ var import_ui_react12 = require("@axis-ds/ui-react");
1032
+ var import_jsx_runtime12 = require("react/jsx-runtime");
1033
+ var sizeStyles3 = {
1034
+ sm: "p-1",
1035
+ md: "p-1.5"
1036
+ };
1037
+ var iconSizes = {
1038
+ sm: "w-3.5 h-3.5",
1039
+ md: "w-4 h-4"
1040
+ };
1041
+ function FeedbackButtons({
1042
+ messageId,
1043
+ initialFeedback = "none",
1044
+ onFeedback,
1045
+ size = "sm",
1046
+ className
1047
+ }) {
1048
+ const [feedback, setFeedback] = React7.useState(initialFeedback);
1049
+ const handleFeedback = (type) => {
1050
+ const newFeedback = feedback === type ? "none" : type;
1051
+ setFeedback(newFeedback);
1052
+ onFeedback?.(messageId, newFeedback);
1053
+ };
1054
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
1055
+ "div",
1056
+ {
1057
+ role: "group",
1058
+ "aria-label": "\uBA54\uC2DC\uC9C0 \uD53C\uB4DC\uBC31",
1059
+ className: (0, import_ui_react12.cn)("inline-flex items-center gap-1", className),
1060
+ children: [
1061
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
1062
+ "button",
1063
+ {
1064
+ onClick: () => handleFeedback("like"),
1065
+ "aria-pressed": feedback === "like",
1066
+ "aria-label": FEEDBACK_LABELS.like,
1067
+ className: (0, import_ui_react12.cn)(
1068
+ "rounded-md transition-colors",
1069
+ sizeStyles3[size],
1070
+ feedback === "like" ? "text-[var(--axis-color-green-500)] bg-[var(--axis-color-green-500)]/10" : "text-[var(--axis-text-tertiary)] hover:text-[var(--axis-text-secondary)] hover:bg-[var(--axis-surface-secondary)]"
1071
+ ),
1072
+ children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("svg", { className: iconSizes[size], fill: feedback === "like" ? "currentColor" : "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M14 9V5a3 3 0 00-3-3l-4 9v11h11.28a2 2 0 002-1.7l1.38-9a2 2 0 00-2-2.3H14zm-9 11H3a2 2 0 01-2-2v-7a2 2 0 012-2h2" }) })
1073
+ }
1074
+ ),
1075
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
1076
+ "button",
1077
+ {
1078
+ onClick: () => handleFeedback("dislike"),
1079
+ "aria-pressed": feedback === "dislike",
1080
+ "aria-label": FEEDBACK_LABELS.dislike,
1081
+ className: (0, import_ui_react12.cn)(
1082
+ "rounded-md transition-colors",
1083
+ sizeStyles3[size],
1084
+ feedback === "dislike" ? "text-[var(--axis-color-red-500)] bg-[var(--axis-color-red-500)]/10" : "text-[var(--axis-text-tertiary)] hover:text-[var(--axis-text-secondary)] hover:bg-[var(--axis-surface-secondary)]"
1085
+ ),
1086
+ children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("svg", { className: iconSizes[size], fill: feedback === "dislike" ? "currentColor" : "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M10 15V19a3 3 0 003 3l4-9V2H5.72a2 2 0 00-2 1.7l-1.38 9a2 2 0 002 2.3H10zm9-13h2a2 2 0 012 2v7a2 2 0 01-2 2h-2" }) })
1087
+ }
1088
+ )
1089
+ ]
1090
+ }
1091
+ );
1092
+ }
1093
+
1094
+ // src/code-block/index.tsx
1095
+ var React8 = __toESM(require("react"));
1096
+ var import_ui_react13 = require("@axis-ds/ui-react");
1097
+ var import_jsx_runtime13 = require("react/jsx-runtime");
1098
+ function CodeBlock({
1099
+ code,
1100
+ language,
1101
+ filename,
1102
+ showLineNumbers = false,
1103
+ onCopy,
1104
+ maxHeight,
1105
+ className
1106
+ }) {
1107
+ const [copied, setCopied] = React8.useState(false);
1108
+ const handleCopy = async () => {
1109
+ try {
1110
+ await navigator.clipboard.writeText(code);
1111
+ setCopied(true);
1112
+ onCopy?.(code);
1113
+ setTimeout(() => setCopied(false), 2e3);
1114
+ } catch {
1115
+ }
1116
+ };
1117
+ const lines = code.split("\n");
1118
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
1119
+ "div",
1120
+ {
1121
+ className: (0, import_ui_react13.cn)(
1122
+ "rounded-lg border overflow-hidden",
1123
+ "bg-[var(--axis-surface-default)] border-[var(--axis-border-default)]",
1124
+ className
1125
+ ),
1126
+ children: [
1127
+ /* @__PURE__ */ (0, import_jsx_runtime13.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: [
1128
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "flex items-center gap-2 min-w-0", children: [
1129
+ filename && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("code", { className: "text-xs font-mono text-[var(--axis-text-primary)] truncate", children: filename }),
1130
+ language && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "text-xs px-1.5 py-0.5 rounded bg-[var(--axis-surface-tertiary)] text-[var(--axis-text-tertiary)]", children: language })
1131
+ ] }),
1132
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
1133
+ "button",
1134
+ {
1135
+ onClick: handleCopy,
1136
+ "aria-label": copied ? "\uBCF5\uC0AC\uB428" : "\uCF54\uB4DC \uBCF5\uC0AC",
1137
+ className: "flex items-center gap-1 px-2 py-1 text-xs rounded-md text-[var(--axis-text-secondary)] hover:bg-[var(--axis-surface-tertiary)] transition-colors",
1138
+ children: copied ? /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(import_jsx_runtime13.Fragment, { children: [
1139
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("svg", { className: "w-3.5 h-3.5 text-[var(--axis-color-green-500)]", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M5 13l4 4L19 7" }) }),
1140
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { children: "\uBCF5\uC0AC\uB428" })
1141
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(import_jsx_runtime13.Fragment, { children: [
1142
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("svg", { className: "w-3.5 h-3.5", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z" }) }),
1143
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { children: "\uBCF5\uC0AC" })
1144
+ ] })
1145
+ }
1146
+ )
1147
+ ] }),
1148
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
1149
+ "div",
1150
+ {
1151
+ className: "overflow-auto",
1152
+ style: maxHeight ? { maxHeight } : void 0,
1153
+ children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("pre", { className: "p-3 text-sm leading-relaxed", children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("code", { className: "text-[var(--axis-text-primary)] font-mono", children: showLineNumbers ? /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("table", { className: "border-collapse w-full", role: "presentation", children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("tbody", { children: lines.map((line, i) => /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("tr", { children: [
1154
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
1155
+ "td",
1156
+ {
1157
+ className: "select-none text-right pr-4 text-[var(--axis-text-tertiary)] w-8",
1158
+ "aria-hidden": "true",
1159
+ children: i + 1
1160
+ }
1161
+ ),
1162
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("td", { className: "whitespace-pre", children: line })
1163
+ ] }, i)) }) }) : code }) })
1164
+ }
1165
+ )
1166
+ ]
1167
+ }
1168
+ );
1169
+ }
1170
+
1171
+ // src/diff-viewer/index.tsx
1172
+ var React9 = __toESM(require("react"));
1173
+ var import_ui_react14 = require("@axis-ds/ui-react");
1174
+ var import_jsx_runtime14 = require("react/jsx-runtime");
1175
+ function computeDiff(before, after) {
1176
+ const oldLines = before.split("\n");
1177
+ const newLines = after.split("\n");
1178
+ const m = oldLines.length;
1179
+ const n = newLines.length;
1180
+ const dp = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0));
1181
+ for (let i2 = 1; i2 <= m; i2++) {
1182
+ for (let j2 = 1; j2 <= n; j2++) {
1183
+ if (oldLines[i2 - 1] === newLines[j2 - 1]) {
1184
+ dp[i2][j2] = dp[i2 - 1][j2 - 1] + 1;
1185
+ } else {
1186
+ dp[i2][j2] = Math.max(dp[i2 - 1][j2], dp[i2][j2 - 1]);
1187
+ }
1188
+ }
1189
+ }
1190
+ const result = [];
1191
+ let i = m;
1192
+ let j = n;
1193
+ while (i > 0 || j > 0) {
1194
+ if (i > 0 && j > 0 && oldLines[i - 1] === newLines[j - 1]) {
1195
+ result.unshift({ type: "unchanged", content: oldLines[i - 1], oldLineNumber: i, newLineNumber: j });
1196
+ i--;
1197
+ j--;
1198
+ } else if (j > 0 && (i === 0 || dp[i][j - 1] >= dp[i - 1][j])) {
1199
+ result.unshift({ type: "added", content: newLines[j - 1], newLineNumber: j });
1200
+ j--;
1201
+ } else if (i > 0) {
1202
+ result.unshift({ type: "removed", content: oldLines[i - 1], oldLineNumber: i });
1203
+ i--;
1204
+ }
1205
+ }
1206
+ return result;
1207
+ }
1208
+ var lineTypeStyles = {
1209
+ added: "bg-[var(--axis-color-green-500)]/10",
1210
+ removed: "bg-[var(--axis-color-red-500)]/10",
1211
+ unchanged: ""
1212
+ };
1213
+ var lineTypeTextStyles = {
1214
+ added: "text-[var(--axis-color-green-600)]",
1215
+ removed: "text-[var(--axis-color-red-600)]",
1216
+ unchanged: "text-[var(--axis-text-primary)]"
1217
+ };
1218
+ var lineTypeSymbols = {
1219
+ added: "+",
1220
+ removed: "-",
1221
+ unchanged: " "
1222
+ };
1223
+ function DiffViewer({
1224
+ before,
1225
+ after,
1226
+ filename,
1227
+ viewMode = "unified",
1228
+ className
1229
+ }) {
1230
+ const [mode, setMode] = React9.useState(viewMode);
1231
+ const diffLines = React9.useMemo(() => computeDiff(before, after), [before, after]);
1232
+ const addedCount = diffLines.filter((l) => l.type === "added").length;
1233
+ const removedCount = diffLines.filter((l) => l.type === "removed").length;
1234
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
1235
+ "div",
1236
+ {
1237
+ role: "region",
1238
+ "aria-label": filename ? `${filename} \uBCC0\uACBD\uC0AC\uD56D` : "\uCF54\uB4DC \uBCC0\uACBD\uC0AC\uD56D",
1239
+ className: (0, import_ui_react14.cn)(
1240
+ "rounded-lg border overflow-hidden",
1241
+ "bg-[var(--axis-surface-default)] border-[var(--axis-border-default)]",
1242
+ className
1243
+ ),
1244
+ children: [
1245
+ /* @__PURE__ */ (0, import_jsx_runtime14.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: [
1246
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: "flex items-center gap-2 min-w-0", children: [
1247
+ /* @__PURE__ */ (0, import_jsx_runtime14.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__ */ (0, import_jsx_runtime14.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M4 6h16M4 12h16M4 18h7" }) }),
1248
+ filename && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("code", { className: "text-xs font-mono text-[var(--axis-text-primary)] truncate", children: filename }),
1249
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("span", { className: "text-xs text-[var(--axis-color-green-500)]", "aria-label": `${addedCount}\uC904 ${DIFF_LABELS.added}`, children: [
1250
+ "+",
1251
+ addedCount
1252
+ ] }),
1253
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("span", { className: "text-xs text-[var(--axis-color-red-500)]", "aria-label": `${removedCount}\uC904 ${DIFF_LABELS.removed}`, children: [
1254
+ "-",
1255
+ removedCount
1256
+ ] })
1257
+ ] }),
1258
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: "flex items-center gap-1 bg-[var(--axis-surface-tertiary)] rounded-md p-0.5", children: [
1259
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1260
+ "button",
1261
+ {
1262
+ onClick: () => setMode("unified"),
1263
+ "aria-pressed": mode === "unified",
1264
+ className: (0, import_ui_react14.cn)(
1265
+ "px-2 py-0.5 text-xs rounded transition-colors",
1266
+ 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)]"
1267
+ ),
1268
+ children: "\uD1B5\uD569"
1269
+ }
1270
+ ),
1271
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1272
+ "button",
1273
+ {
1274
+ onClick: () => setMode("split"),
1275
+ "aria-pressed": mode === "split",
1276
+ className: (0, import_ui_react14.cn)(
1277
+ "px-2 py-0.5 text-xs rounded transition-colors",
1278
+ 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)]"
1279
+ ),
1280
+ children: "\uBD84\uD560"
1281
+ }
1282
+ )
1283
+ ] })
1284
+ ] }),
1285
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { className: "overflow-auto", children: mode === "unified" ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(UnifiedView, { lines: diffLines }) : /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(SplitView, { lines: diffLines }) })
1286
+ ]
1287
+ }
1288
+ );
1289
+ }
1290
+ function UnifiedView({ lines }) {
1291
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("table", { className: "w-full text-xs font-mono border-collapse", role: "presentation", children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("tbody", { children: lines.map((line, i) => /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("tr", { className: lineTypeStyles[line.type], children: [
1292
+ /* @__PURE__ */ (0, import_jsx_runtime14.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 ?? "" }),
1293
+ /* @__PURE__ */ (0, import_jsx_runtime14.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 ?? "" }),
1294
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("td", { className: (0, import_ui_react14.cn)("select-none w-4 text-center py-0.5", lineTypeTextStyles[line.type]), children: lineTypeSymbols[line.type] }),
1295
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("td", { className: (0, import_ui_react14.cn)("px-2 py-0.5 whitespace-pre", lineTypeTextStyles[line.type]), children: line.content })
1296
+ ] }, i)) }) });
1297
+ }
1298
+ function SplitView({ lines }) {
1299
+ const leftLines = [];
1300
+ const rightLines = [];
1301
+ for (const line of lines) {
1302
+ if (line.type === "unchanged") {
1303
+ leftLines.push(line);
1304
+ rightLines.push(line);
1305
+ } else if (line.type === "removed") {
1306
+ leftLines.push(line);
1307
+ rightLines.push(null);
1308
+ } else {
1309
+ leftLines.push(null);
1310
+ rightLines.push(line);
1311
+ }
1312
+ }
1313
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("table", { className: "w-full text-xs font-mono border-collapse", role: "presentation", children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("tbody", { children: leftLines.map((leftLine, i) => {
1314
+ const rightLine = rightLines[i];
1315
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("tr", { children: [
1316
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("td", { className: (0, import_ui_react14.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 ?? "" }),
1317
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("td", { className: (0, import_ui_react14.cn)("select-none w-4 text-center py-0.5", leftLine ? lineTypeTextStyles[leftLine.type] : ""), children: leftLine ? lineTypeSymbols[leftLine.type] : "" }),
1318
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("td", { className: (0, import_ui_react14.cn)("px-2 py-0.5 whitespace-pre w-1/2 border-r border-[var(--axis-border-default)]", leftLine ? (0, import_ui_react14.cn)(lineTypeStyles[leftLine.type], lineTypeTextStyles[leftLine.type]) : ""), children: leftLine?.content ?? "" }),
1319
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("td", { className: (0, import_ui_react14.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 ?? "" }),
1320
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("td", { className: (0, import_ui_react14.cn)("select-none w-4 text-center py-0.5", rightLine ? lineTypeTextStyles[rightLine.type] : ""), children: rightLine ? lineTypeSymbols[rightLine.type] : "" }),
1321
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("td", { className: (0, import_ui_react14.cn)("px-2 py-0.5 whitespace-pre w-1/2", rightLine ? (0, import_ui_react14.cn)(lineTypeStyles[rightLine.type], lineTypeTextStyles[rightLine.type]) : ""), children: rightLine?.content ?? "" })
1322
+ ] }, i);
1323
+ }) }) });
1324
+ }
1325
+
1326
+ // src/plan-card/index.tsx
1327
+ var React10 = __toESM(require("react"));
1328
+ var import_ui_react15 = require("@axis-ds/ui-react");
1329
+ var import_jsx_runtime15 = require("react/jsx-runtime");
1330
+ var planStatusStyles = {
1331
+ draft: {
1332
+ border: "border-l-[var(--axis-color-gray-400)]",
1333
+ badge: "bg-[var(--axis-color-gray-100)] text-[var(--axis-color-gray-600)]"
1334
+ },
1335
+ pending: {
1336
+ border: "border-l-[var(--axis-color-yellow-500)]",
1337
+ badge: "bg-[var(--axis-color-yellow-500)]/10 text-[var(--axis-color-yellow-600)]"
1338
+ },
1339
+ approved: {
1340
+ border: "border-l-[var(--axis-color-green-500)]",
1341
+ badge: "bg-[var(--axis-color-green-500)]/10 text-[var(--axis-color-green-600)]"
1342
+ },
1343
+ rejected: {
1344
+ border: "border-l-[var(--axis-color-red-500)]",
1345
+ badge: "bg-[var(--axis-color-red-500)]/10 text-[var(--axis-color-red-600)]"
1346
+ },
1347
+ executing: {
1348
+ border: "border-l-[var(--axis-color-blue-500)]",
1349
+ badge: "bg-[var(--axis-color-blue-500)]/10 text-[var(--axis-color-blue-600)]"
1350
+ },
1351
+ completed: {
1352
+ border: "border-l-[var(--axis-color-green-500)]",
1353
+ badge: "bg-[var(--axis-color-green-500)]/10 text-[var(--axis-color-green-600)]"
1354
+ }
1355
+ };
1356
+ var stepStatusIcons = {
1357
+ pending: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("svg", { className: "w-4 h-4 text-[var(--axis-color-gray-400)]", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("circle", { cx: "12", cy: "12", r: "10", strokeWidth: 2 }) }),
1358
+ running: /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("svg", { className: "w-4 h-4 text-[var(--axis-color-blue-500)] animate-spin", viewBox: "0 0 24 24", fill: "none", children: [
1359
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }),
1360
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("path", { className: "opacity-75", fill: "currentColor", d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z" })
1361
+ ] }),
1362
+ complete: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("svg", { className: "w-4 h-4 text-[var(--axis-color-green-500)]", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M5 13l4 4L19 7" }) }),
1363
+ error: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("svg", { className: "w-4 h-4 text-[var(--axis-color-red-500)]", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M6 18L18 6M6 6l12 12" }) }),
1364
+ skipped: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("svg", { className: "w-4 h-4 text-[var(--axis-color-gray-400)]", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M13 5l7 7-7 7M5 5l7 7-7 7" }) })
1365
+ };
1366
+ function PlanCard({
1367
+ title,
1368
+ steps,
1369
+ status = "pending",
1370
+ onApprove,
1371
+ onEdit,
1372
+ onReject,
1373
+ className
1374
+ }) {
1375
+ const styles = planStatusStyles[status];
1376
+ const titleId = React10.useId();
1377
+ const statusLabel = PLAN_STATUS_LABELS[status];
1378
+ const completedCount = steps.filter((s) => s.status === "complete").length;
1379
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(
1380
+ "div",
1381
+ {
1382
+ role: "region",
1383
+ "aria-labelledby": titleId,
1384
+ className: (0, import_ui_react15.cn)(
1385
+ "rounded-lg border border-l-4 overflow-hidden",
1386
+ "bg-[var(--axis-surface-default)] border-[var(--axis-border-default)]",
1387
+ styles.border,
1388
+ className
1389
+ ),
1390
+ children: [
1391
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "p-4", children: [
1392
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "flex items-center justify-between mb-2", children: [
1393
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "flex items-center gap-2", children: [
1394
+ /* @__PURE__ */ (0, import_jsx_runtime15.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__ */ (0, import_jsx_runtime15.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2" }) }),
1395
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("h4", { id: titleId, className: "text-sm font-semibold text-[var(--axis-text-primary)]", children: title })
1396
+ ] }),
1397
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { className: (0, import_ui_react15.cn)("text-xs px-2 py-0.5 rounded-full font-medium", styles.badge), children: statusLabel })
1398
+ ] }),
1399
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "flex items-center gap-2 text-xs text-[var(--axis-text-tertiary)]", children: [
1400
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("span", { children: [
1401
+ completedCount,
1402
+ "/",
1403
+ steps.length,
1404
+ " \uB2E8\uACC4"
1405
+ ] }),
1406
+ steps.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { className: "flex-1 h-1 rounded-full bg-[var(--axis-surface-secondary)] overflow-hidden", children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
1407
+ "div",
1408
+ {
1409
+ className: "h-full rounded-full bg-[var(--axis-color-green-500)] transition-all",
1410
+ style: { width: `${completedCount / steps.length * 100}%` },
1411
+ "aria-hidden": "true"
1412
+ }
1413
+ ) })
1414
+ ] })
1415
+ ] }),
1416
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { role: "list", "aria-label": "\uC2E4\uD589 \uB2E8\uACC4", className: "border-t border-[var(--axis-border-default)] divide-y divide-[var(--axis-border-default)]", children: steps.map((step) => {
1417
+ const stepStatusLabel = STATUS_LABELS[step.status] || step.status;
1418
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(
1419
+ "div",
1420
+ {
1421
+ role: "listitem",
1422
+ "aria-current": step.status === "running" ? "step" : void 0,
1423
+ className: "flex items-start gap-3 px-4 py-2.5",
1424
+ children: [
1425
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { "aria-hidden": "true", className: "mt-0.5 flex-shrink-0", children: stepStatusIcons[step.status] }),
1426
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "flex-1 min-w-0", children: [
1427
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("span", { className: "sr-only", children: [
1428
+ stepStatusLabel,
1429
+ ":"
1430
+ ] }),
1431
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("p", { className: "text-sm text-[var(--axis-text-primary)]", children: step.label }),
1432
+ step.description && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("p", { className: "text-xs text-[var(--axis-text-secondary)] mt-0.5", children: step.description })
1433
+ ] })
1434
+ ]
1435
+ },
1436
+ step.id
1437
+ );
1438
+ }) }),
1439
+ (status === "pending" || status === "draft") && (onApprove || onEdit || onReject) && /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("div", { className: "flex gap-2 p-3 border-t border-[var(--axis-border-default)] bg-[var(--axis-surface-secondary)]", children: [
1440
+ onApprove && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
1441
+ "button",
1442
+ {
1443
+ onClick: onApprove,
1444
+ className: "px-3 py-1.5 text-xs font-medium rounded-md bg-[var(--axis-color-green-500)] text-white hover:bg-[var(--axis-color-green-600)] transition-colors",
1445
+ children: "\uC2B9\uC778"
1446
+ }
1447
+ ),
1448
+ onEdit && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
1449
+ "button",
1450
+ {
1451
+ onClick: onEdit,
1452
+ className: "px-3 py-1.5 text-xs font-medium rounded-md bg-[var(--axis-button-secondary-bg-default)] text-[var(--axis-text-primary)] hover:bg-[var(--axis-button-secondary-bg-hover)] transition-colors",
1453
+ children: "\uC218\uC815"
1454
+ }
1455
+ ),
1456
+ onReject && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
1457
+ "button",
1458
+ {
1459
+ onClick: onReject,
1460
+ className: "px-3 py-1.5 text-xs font-medium rounded-md text-[var(--axis-color-red-500)] hover:bg-[var(--axis-color-red-500)]/10 transition-colors",
1461
+ children: "\uAC70\uC808"
1462
+ }
1463
+ )
1464
+ ] })
1465
+ ]
1466
+ }
1467
+ );
1468
+ }
1469
+
1470
+ // src/context-panel/index.tsx
1471
+ var React11 = __toESM(require("react"));
1472
+ var import_ui_react16 = require("@axis-ds/ui-react");
1473
+ var import_jsx_runtime16 = require("react/jsx-runtime");
1474
+ function ContextPanel({
1475
+ modelInfo,
1476
+ systemPrompt,
1477
+ attachedFiles,
1478
+ settings,
1479
+ collapsible = true,
1480
+ defaultExpanded = false,
1481
+ className
1482
+ }) {
1483
+ const [isExpanded, setIsExpanded] = React11.useState(defaultExpanded);
1484
+ const contentId = React11.useId();
1485
+ const hasContent = modelInfo || systemPrompt || attachedFiles && attachedFiles.length > 0 || settings && Object.keys(settings).length > 0;
1486
+ if (!hasContent) return null;
1487
+ const header = /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { className: "flex items-center gap-2", children: [
1488
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("svg", { className: "w-4 h-4 text-[var(--axis-icon-secondary)]", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", "aria-hidden": "true", children: [
1489
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.066 2.573c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.573 1.066c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.066-2.573c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z" }),
1490
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M15 12a3 3 0 11-6 0 3 3 0 016 0z" })
1491
+ ] }),
1492
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { className: "text-xs font-medium text-[var(--axis-text-secondary)]", children: "\uCEE8\uD14D\uC2A4\uD2B8" })
1493
+ ] });
1494
+ const content = /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { id: contentId, className: "space-y-3 mt-2", children: [
1495
+ modelInfo && /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { children: [
1496
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("h5", { className: "text-xs font-medium text-[var(--axis-text-secondary)] mb-1", children: "\uBAA8\uB378" }),
1497
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { className: "flex items-center gap-2", children: [
1498
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("code", { className: "text-sm font-mono text-[var(--axis-text-primary)]", children: modelInfo.name }),
1499
+ modelInfo.provider && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { className: "text-xs text-[var(--axis-text-tertiary)]", children: modelInfo.provider }),
1500
+ modelInfo.version && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { className: "text-xs px-1.5 py-0.5 rounded bg-[var(--axis-surface-tertiary)] text-[var(--axis-text-tertiary)]", children: modelInfo.version })
1501
+ ] })
1502
+ ] }),
1503
+ systemPrompt && /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { children: [
1504
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("h5", { className: "text-xs font-medium text-[var(--axis-text-secondary)] mb-1", children: "\uC2DC\uC2A4\uD15C \uD504\uB86C\uD504\uD2B8" }),
1505
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("p", { className: "text-xs text-[var(--axis-text-primary)] p-2 rounded bg-[var(--axis-surface-secondary)] line-clamp-3 whitespace-pre-wrap", children: systemPrompt })
1506
+ ] }),
1507
+ attachedFiles && attachedFiles.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { children: [
1508
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("h5", { className: "text-xs font-medium text-[var(--axis-text-secondary)] mb-1", children: [
1509
+ "\uCCA8\uBD80 \uD30C\uC77C (",
1510
+ attachedFiles.length,
1511
+ ")"
1512
+ ] }),
1513
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("div", { className: "space-y-1", children: attachedFiles.map((file, i) => /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { className: "flex items-center gap-1.5 text-xs text-[var(--axis-text-primary)]", children: [
1514
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("svg", { className: "w-3 h-3 text-[var(--axis-icon-secondary)]", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", "aria-hidden": "true", children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M15.172 7l-6.586 6.586a2 2 0 102.828 2.828l6.414-6.586a4 4 0 00-5.656-5.656l-6.415 6.585a6 6 0 108.486 8.486L20.5 13" }) }),
1515
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { className: "truncate", children: file })
1516
+ ] }, i)) })
1517
+ ] }),
1518
+ settings && Object.keys(settings).length > 0 && /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { children: [
1519
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("h5", { className: "text-xs font-medium text-[var(--axis-text-secondary)] mb-1", children: "\uC124\uC815" }),
1520
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("div", { className: "space-y-1", children: Object.entries(settings).map(([key, value]) => /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { className: "flex items-center justify-between text-xs", children: [
1521
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { className: "text-[var(--axis-text-secondary)]", children: key }),
1522
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("code", { className: "font-mono text-[var(--axis-text-primary)]", children: value })
1523
+ ] }, key)) })
1524
+ ] })
1525
+ ] });
1526
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
1527
+ "div",
1528
+ {
1529
+ className: (0, import_ui_react16.cn)(
1530
+ "rounded-lg border p-3",
1531
+ "bg-[var(--axis-surface-secondary)] border-[var(--axis-border-default)]",
1532
+ className
1533
+ ),
1534
+ children: collapsible ? /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(import_jsx_runtime16.Fragment, { children: [
1535
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
1536
+ "button",
1537
+ {
1538
+ onClick: () => setIsExpanded(!isExpanded),
1539
+ "aria-expanded": isExpanded,
1540
+ "aria-controls": contentId,
1541
+ className: "w-full flex items-center justify-between hover:opacity-80 transition-opacity",
1542
+ children: [
1543
+ header,
1544
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
1545
+ "svg",
1546
+ {
1547
+ className: (0, import_ui_react16.cn)(
1548
+ "w-4 h-4 text-[var(--axis-text-secondary)] transition-transform",
1549
+ isExpanded && "rotate-180"
1550
+ ),
1551
+ fill: "none",
1552
+ stroke: "currentColor",
1553
+ viewBox: "0 0 24 24",
1554
+ "aria-hidden": "true",
1555
+ children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M19 9l-7 7-7-7" })
1556
+ }
1557
+ )
1558
+ ]
1559
+ }
1560
+ ),
1561
+ isExpanded && content
1562
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(import_jsx_runtime16.Fragment, { children: [
1563
+ header,
1564
+ content
1565
+ ] })
1566
+ }
1567
+ );
1568
+ }
1569
+
1570
+ // src/token-usage-indicator/index.tsx
1571
+ var import_ui_react17 = require("@axis-ds/ui-react");
1572
+ var import_jsx_runtime17 = require("react/jsx-runtime");
1573
+ function TokenUsageIndicator({
1574
+ current,
1575
+ max,
1576
+ cost,
1577
+ warningThreshold = 0.8,
1578
+ compact = false,
1579
+ className
1580
+ }) {
1581
+ const ratio = max > 0 ? current / max : 0;
1582
+ const percentage = Math.min(Math.round(ratio * 100), 100);
1583
+ const getColor = () => {
1584
+ if (ratio >= 1) return "bg-[var(--axis-color-red-500)]";
1585
+ if (ratio >= warningThreshold) return "bg-[var(--axis-color-yellow-500)]";
1586
+ return "bg-[var(--axis-color-green-500)]";
1587
+ };
1588
+ const getTextColor = () => {
1589
+ if (ratio >= 1) return "text-[var(--axis-color-red-500)]";
1590
+ if (ratio >= warningThreshold) return "text-[var(--axis-color-yellow-500)]";
1591
+ return "text-[var(--axis-text-secondary)]";
1592
+ };
1593
+ const formatNumber = (n) => n >= 1e3 ? `${(n / 1e3).toFixed(1)}k` : String(n);
1594
+ if (compact) {
1595
+ return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
1596
+ "span",
1597
+ {
1598
+ role: "meter",
1599
+ "aria-valuenow": current,
1600
+ "aria-valuemin": 0,
1601
+ "aria-valuemax": max,
1602
+ "aria-label": `\uD1A0\uD070 \uC0AC\uC6A9\uB7C9: ${current} / ${max}`,
1603
+ className: (0, import_ui_react17.cn)("inline-flex items-center gap-1 text-xs", getTextColor(), className),
1604
+ children: [
1605
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("svg", { className: "w-3 h-3", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M13 10V3L4 14h7v7l9-11h-7z" }) }),
1606
+ formatNumber(current),
1607
+ "/",
1608
+ formatNumber(max),
1609
+ cost !== void 0 && /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("span", { className: "text-[var(--axis-text-tertiary)]", children: [
1610
+ "($",
1611
+ cost.toFixed(4),
1612
+ ")"
1613
+ ] })
1614
+ ]
1615
+ }
1616
+ );
1617
+ }
1618
+ return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
1619
+ "div",
1620
+ {
1621
+ role: "meter",
1622
+ "aria-valuenow": current,
1623
+ "aria-valuemin": 0,
1624
+ "aria-valuemax": max,
1625
+ "aria-label": `\uD1A0\uD070 \uC0AC\uC6A9\uB7C9: ${current} / ${max} (${percentage}%)`,
1626
+ className: (0, import_ui_react17.cn)("space-y-1", className),
1627
+ children: [
1628
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "flex items-center justify-between text-xs", children: [
1629
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: "text-[var(--axis-text-secondary)]", children: "\uD1A0\uD070 \uC0AC\uC6A9\uB7C9" }),
1630
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("span", { className: getTextColor(), children: [
1631
+ formatNumber(current),
1632
+ " / ",
1633
+ formatNumber(max)
1634
+ ] })
1635
+ ] }),
1636
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { className: "h-1.5 rounded-full bg-[var(--axis-surface-secondary)] overflow-hidden", children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
1637
+ "div",
1638
+ {
1639
+ className: (0, import_ui_react17.cn)("h-full rounded-full transition-all", getColor()),
1640
+ style: { width: `${percentage}%` },
1641
+ "aria-hidden": "true"
1642
+ }
1643
+ ) }),
1644
+ cost !== void 0 && /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "text-xs text-[var(--axis-text-tertiary)] text-right", children: [
1645
+ "$",
1646
+ cost.toFixed(4)
1647
+ ] })
1648
+ ]
1649
+ }
1650
+ );
1651
+ }
1652
+
1653
+ // src/attachment-card/index.tsx
1654
+ var import_ui_react18 = require("@axis-ds/ui-react");
1655
+ var import_jsx_runtime18 = require("react/jsx-runtime");
1656
+ var typeIcons = {
1657
+ image: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("svg", { className: "w-5 h-5", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z" }) }),
1658
+ document: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("svg", { className: "w-5 h-5", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z" }) }),
1659
+ code: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("svg", { className: "w-5 h-5", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4" }) }),
1660
+ archive: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("svg", { className: "w-5 h-5", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M5 8h14M5 8a2 2 0 110-4h14a2 2 0 110 4M5 8v10a2 2 0 002 2h10a2 2 0 002-2V8m-9 4h4" }) }),
1661
+ other: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("svg", { className: "w-5 h-5", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M7 21h10a2 2 0 002-2V9.414a1 1 0 00-.293-.707l-5.414-5.414A1 1 0 0012.586 3H7a2 2 0 00-2 2v14a2 2 0 002 2z" }) })
1662
+ };
1663
+ var formatFileSize = (bytes) => {
1664
+ if (bytes < 1024) return `${bytes} B`;
1665
+ if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;
1666
+ return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
1667
+ };
1668
+ function AttachmentCard({
1669
+ type,
1670
+ name,
1671
+ size,
1672
+ url,
1673
+ thumbnail,
1674
+ status = "complete",
1675
+ progress,
1676
+ onRemove,
1677
+ className
1678
+ }) {
1679
+ const typeLabel = ATTACHMENT_TYPE_LABELS[type];
1680
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
1681
+ "div",
1682
+ {
1683
+ role: "article",
1684
+ "aria-label": `${typeLabel}: ${name}`,
1685
+ className: (0, import_ui_react18.cn)(
1686
+ "flex items-center gap-3 rounded-lg border p-3",
1687
+ "bg-[var(--axis-surface-default)] border-[var(--axis-border-default)]",
1688
+ status === "error" && "border-[var(--axis-color-red-500)]/30",
1689
+ className
1690
+ ),
1691
+ children: [
1692
+ thumbnail ? /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
1693
+ "img",
1694
+ {
1695
+ src: thumbnail,
1696
+ alt: "",
1697
+ "aria-hidden": "true",
1698
+ className: "w-10 h-10 rounded object-cover flex-shrink-0"
1699
+ }
1700
+ ) : /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
1701
+ "div",
1702
+ {
1703
+ className: "w-10 h-10 rounded flex items-center justify-center flex-shrink-0 bg-[var(--axis-surface-secondary)] text-[var(--axis-icon-secondary)]",
1704
+ "aria-hidden": "true",
1705
+ children: typeIcons[type]
1706
+ }
1707
+ ),
1708
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "flex-1 min-w-0", children: [
1709
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("p", { className: "text-sm font-medium text-[var(--axis-text-primary)] truncate", children: url ? /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
1710
+ "a",
1711
+ {
1712
+ href: url,
1713
+ target: "_blank",
1714
+ rel: "noopener noreferrer",
1715
+ className: "hover:underline",
1716
+ "aria-label": `${name} (\uC0C8 \uCC3D\uC5D0\uC11C \uC5F4\uB9BC)`,
1717
+ children: name
1718
+ }
1719
+ ) : name }),
1720
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "flex items-center gap-2 text-xs text-[var(--axis-text-tertiary)]", children: [
1721
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { children: typeLabel }),
1722
+ size !== void 0 && /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(import_jsx_runtime18.Fragment, { children: [
1723
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { "aria-hidden": "true", children: "\xB7" }),
1724
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { children: formatFileSize(size) })
1725
+ ] }),
1726
+ status === "error" && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { className: "text-[var(--axis-text-error)]", children: "\uC5C5\uB85C\uB4DC \uC2E4\uD328" })
1727
+ ] }),
1728
+ status === "uploading" && progress !== void 0 && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { className: "mt-1.5 h-1 rounded-full bg-[var(--axis-surface-secondary)] overflow-hidden", children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
1729
+ "div",
1730
+ {
1731
+ className: "h-full rounded-full bg-[var(--axis-color-blue-500)] transition-all",
1732
+ style: { width: `${progress}%` },
1733
+ role: "progressbar",
1734
+ "aria-valuenow": progress,
1735
+ "aria-valuemin": 0,
1736
+ "aria-valuemax": 100,
1737
+ "aria-label": "\uC5C5\uB85C\uB4DC \uC9C4\uD589\uB960"
1738
+ }
1739
+ ) })
1740
+ ] }),
1741
+ onRemove && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
1742
+ "button",
1743
+ {
1744
+ onClick: onRemove,
1745
+ "aria-label": `${name} \uC0AD\uC81C`,
1746
+ className: "flex-shrink-0 p-1 rounded-md text-[var(--axis-text-tertiary)] hover:text-[var(--axis-text-secondary)] hover:bg-[var(--axis-surface-secondary)] transition-colors",
1747
+ children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("svg", { className: "w-4 h-4", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M6 18L18 6M6 6l12 12" }) })
1748
+ }
1749
+ )
1750
+ ]
1751
+ }
1752
+ );
1753
+ }
1754
+ // Annotate the CommonJS export names for ESM import in node:
1755
+ 0 && (module.exports = {
1756
+ AgentAvatar,
1757
+ ApprovalCard,
1758
+ AttachmentCard,
1759
+ CodeBlock,
1760
+ ContextPanel,
1761
+ DiffViewer,
1762
+ FeedbackButtons,
1763
+ MessageBubble,
1764
+ PlanCard,
1765
+ RecoveryBanner,
1766
+ RunProgress,
1767
+ SourcePanel,
1768
+ StepTimeline,
1769
+ StreamingText,
1770
+ SurfaceRenderer,
1771
+ ThinkingIndicator,
1772
+ TokenUsageIndicator,
1773
+ ToolCallCard
1774
+ });