basalt-ui 1.10.0 → 1.11.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 (88) hide show
  1. package/AGENTS.md +2 -2
  2. package/CHANGELOG.md +10 -0
  3. package/dist/agent/ai-sdk-transport.d.ts +3 -52
  4. package/dist/agent/ai-sdk-transport.d.ts.map +1 -1
  5. package/dist/agent/ai-sdk-transport.js +108 -24
  6. package/dist/agent/coalesce.d.ts +26 -0
  7. package/dist/agent/coalesce.d.ts.map +1 -0
  8. package/dist/agent/coalesce.js +69 -0
  9. package/dist/agent/foreign.d.ts +97 -0
  10. package/dist/agent/foreign.d.ts.map +1 -0
  11. package/dist/agent/foreign.js +18 -0
  12. package/dist/agent/history.d.ts +2 -0
  13. package/dist/agent/history.d.ts.map +1 -1
  14. package/dist/agent/id.d.ts +35 -0
  15. package/dist/agent/id.d.ts.map +1 -0
  16. package/dist/agent/id.js +14 -0
  17. package/dist/agent/index.d.ts +9 -4
  18. package/dist/agent/index.d.ts.map +1 -1
  19. package/dist/agent/index.js +15 -3
  20. package/dist/agent/merge.d.ts +8 -0
  21. package/dist/agent/merge.d.ts.map +1 -0
  22. package/dist/agent/merge.js +23 -0
  23. package/dist/agent/part-list.d.ts.map +1 -1
  24. package/dist/agent/part-list.js +16 -6
  25. package/dist/agent/parts.d.ts +100 -21
  26. package/dist/agent/parts.d.ts.map +1 -1
  27. package/dist/agent/parts.js +128 -11
  28. package/dist/agent/transport.d.ts +39 -3
  29. package/dist/agent/transport.d.ts.map +1 -1
  30. package/dist/agent/transport.js +20 -17
  31. package/dist/agent/use-agent-stream.d.ts +2 -1
  32. package/dist/agent/use-agent-stream.d.ts.map +1 -1
  33. package/dist/agent/use-agent-stream.js +5 -2
  34. package/dist/agent/use-agent-thread-runs.d.ts +9 -3
  35. package/dist/agent/use-agent-thread-runs.d.ts.map +1 -1
  36. package/dist/agent/use-agent-thread-runs.js +75 -23
  37. package/dist/agent-chat/index.d.ts +2 -0
  38. package/dist/agent-chat/index.d.ts.map +1 -1
  39. package/dist/agent-chat/index.js +2 -0
  40. package/dist/agent-chat/thread-message.d.ts +24 -7
  41. package/dist/agent-chat/thread-message.d.ts.map +1 -1
  42. package/dist/agent-chat/thread-message.js +102 -43
  43. package/dist/agent-chat/tool-chip.d.ts +21 -0
  44. package/dist/agent-chat/tool-chip.d.ts.map +1 -0
  45. package/dist/agent-chat/tool-chip.js +120 -0
  46. package/dist/guard/index.d.ts.map +1 -1
  47. package/dist/guard/index.js +1 -3
  48. package/dist/index.d.ts +2 -2
  49. package/dist/index.d.ts.map +1 -1
  50. package/dist/index.js +3 -1
  51. package/dist/surfaces.d.ts +2 -2
  52. package/dist/surfaces.js +2 -2
  53. package/llms.txt +4 -4
  54. package/package.json +1 -1
  55. package/src/agent/ai-sdk-transport.test.ts +338 -40
  56. package/src/agent/ai-sdk-transport.ts +206 -53
  57. package/src/agent/coalesce.test.ts +194 -0
  58. package/src/agent/coalesce.ts +118 -0
  59. package/src/agent/foreign.test.ts +47 -0
  60. package/src/agent/foreign.ts +140 -0
  61. package/src/agent/history.ts +2 -0
  62. package/src/agent/id.test.ts +71 -0
  63. package/src/agent/id.ts +43 -0
  64. package/src/agent/index.ts +26 -3
  65. package/src/agent/merge.test.ts +119 -0
  66. package/src/agent/merge.ts +67 -0
  67. package/src/agent/part-list.test.tsx +82 -0
  68. package/src/agent/part-list.tsx +31 -6
  69. package/src/agent/parts.test.ts +401 -59
  70. package/src/agent/parts.ts +262 -32
  71. package/src/agent/transport.test.ts +70 -0
  72. package/src/agent/transport.ts +72 -20
  73. package/src/agent/use-agent-stream.test.tsx +47 -17
  74. package/src/agent/use-agent-stream.ts +13 -3
  75. package/src/agent/use-agent-thread-runs.foreign.test.tsx +133 -0
  76. package/src/agent/use-agent-thread-runs.resume.test.tsx +34 -6
  77. package/src/agent/use-agent-thread-runs.test.tsx +397 -14
  78. package/src/agent/use-agent-thread-runs.ts +170 -26
  79. package/src/agent/use-agent-thread-runs.wedge.test.tsx +4 -2
  80. package/src/agent-chat/index.ts +4 -0
  81. package/src/agent-chat/thread-message.test.tsx +211 -0
  82. package/src/agent-chat/thread-message.tsx +235 -62
  83. package/src/agent-chat/tool-chip.test.tsx +139 -0
  84. package/src/agent-chat/tool-chip.tsx +219 -0
  85. package/src/guard/check-source.test.ts +8 -4
  86. package/src/guard/index.ts +1 -3
  87. package/src/index.ts +2 -0
  88. package/src/surfaces.ts +2 -2
@@ -112,6 +112,12 @@ const CODE_BLOCK_STYLE = {
112
112
  overflowX: 'auto',
113
113
  } as const
114
114
 
115
+ /** Terminal-state status line (tool-call error/denial) — plain text, no code-block chrome. */
116
+ const STATUS_LINE_STYLE = {
117
+ marginTop: 'var(--vx-space-agent-part-gap-top)',
118
+ color: VX.status.bad,
119
+ } as const
120
+
115
121
  function DefaultText({ part }: { part: TextPart; index: number }): JSX.Element {
116
122
  return (
117
123
  <div
@@ -151,11 +157,30 @@ function DefaultToolCall({ part }: { part: ToolCallPart; index: number }): JSX.E
151
157
  <pre className="basalt-agent-tool-input" style={CODE_BLOCK_STYLE}>
152
158
  {JSON.stringify(part.input, null, 2)}
153
159
  </pre>
154
- {part.output !== undefined && (
160
+ {/* output-error's input never validated — rawInput is the only surviving record of what was
161
+ actually sent, so show it whenever there is no validated input to show instead. */}
162
+ {part.state === 'output-error' && part.input === undefined && part.rawInput !== undefined && (
163
+ <pre className="basalt-agent-tool-raw-input" style={CODE_BLOCK_STYLE}>
164
+ {JSON.stringify(part.rawInput, null, 2)}
165
+ </pre>
166
+ )}
167
+ {part.state === 'output-available' && (
155
168
  <pre className="basalt-agent-tool-output" style={CODE_BLOCK_STYLE}>
156
169
  {JSON.stringify(part.output, null, 2)}
157
170
  </pre>
158
171
  )}
172
+ {/* A failed or denied call must stay visible after the seven-state split — neither carries
173
+ an `output`, so without this the call renders as name+input and nothing else. */}
174
+ {part.state === 'output-error' && (
175
+ <div className="basalt-agent-tool-error" role="alert" style={STATUS_LINE_STYLE}>
176
+ {part.errorText}
177
+ </div>
178
+ )}
179
+ {part.state === 'output-denied' && (
180
+ <div className="basalt-agent-tool-denied" style={STATUS_LINE_STYLE}>
181
+ Denied{part.approval.reason !== undefined ? `: ${part.approval.reason}` : ''}
182
+ </div>
183
+ )}
159
184
  </div>
160
185
  )
161
186
  }
@@ -251,7 +276,7 @@ export function PartList<TPart extends AgentPart = AgentPart>({
251
276
  case 'text': {
252
277
  const Render = renderers.text
253
278
  return (
254
- <Fragment key={index}>
279
+ <Fragment key={part.id}>
255
280
  <Render part={part as Extract<TPart, { type: 'text' }>} index={index} />
256
281
  </Fragment>
257
282
  )
@@ -259,7 +284,7 @@ export function PartList<TPart extends AgentPart = AgentPart>({
259
284
  case 'reasoning': {
260
285
  const Render = renderers.reasoning
261
286
  return (
262
- <Fragment key={index}>
287
+ <Fragment key={part.id}>
263
288
  <Render part={part as Extract<TPart, { type: 'reasoning' }>} index={index} />
264
289
  </Fragment>
265
290
  )
@@ -267,7 +292,7 @@ export function PartList<TPart extends AgentPart = AgentPart>({
267
292
  case 'tool': {
268
293
  const Render = renderers.tool
269
294
  return (
270
- <Fragment key={index}>
295
+ <Fragment key={part.id}>
271
296
  <Render part={part as Extract<TPart, { type: 'tool' }>} index={index} />
272
297
  </Fragment>
273
298
  )
@@ -275,7 +300,7 @@ export function PartList<TPart extends AgentPart = AgentPart>({
275
300
  case 'source': {
276
301
  const Render = renderers.source
277
302
  return (
278
- <Fragment key={index}>
303
+ <Fragment key={part.id}>
279
304
  <Render part={part as Extract<TPart, { type: 'source' }>} index={index} />
280
305
  </Fragment>
281
306
  )
@@ -283,7 +308,7 @@ export function PartList<TPart extends AgentPart = AgentPart>({
283
308
  case 'error': {
284
309
  const Render = renderers.error
285
310
  return (
286
- <Fragment key={index}>
311
+ <Fragment key={part.id}>
287
312
  <Render part={part as Extract<TPart, { type: 'error' }>} index={index} />
288
313
  </Fragment>
289
314
  )