@runtypelabs/persona 4.21.1 → 4.22.1

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 (129) hide show
  1. package/dist/animations/glyph-cycle.d.cts +1 -1
  2. package/dist/animations/glyph-cycle.d.ts +1 -1
  3. package/dist/animations/{types-B_JdVK9o.d.cts → types-9Vxm-PPz.d.cts} +136 -6
  4. package/dist/animations/{types-B_JdVK9o.d.ts → types-9Vxm-PPz.d.ts} +136 -6
  5. package/dist/animations/wipe.d.cts +1 -1
  6. package/dist/animations/wipe.d.ts +1 -1
  7. package/dist/animations-extra.d.cts +136 -6
  8. package/dist/animations-extra.d.ts +136 -6
  9. package/dist/{approval-ui-RNNBR5R3.js → approval-ui-K7R5Q5OC.js} +1 -1
  10. package/dist/approval-ui.cjs +2 -2
  11. package/dist/approval-ui.d.cts +221 -16
  12. package/dist/approval-ui.d.ts +221 -16
  13. package/dist/approval-ui.js +2 -2
  14. package/dist/artifacts-ui-F4N6VMKF.js +7 -0
  15. package/dist/artifacts-ui.cjs +1 -1
  16. package/dist/artifacts-ui.d.cts +221 -16
  17. package/dist/artifacts-ui.d.ts +221 -16
  18. package/dist/artifacts-ui.js +1 -1
  19. package/dist/chunk-NQLDCJAP.js +4 -0
  20. package/dist/codegen.cjs +1 -1
  21. package/dist/codegen.js +1 -1
  22. package/dist/context-mentions.d.cts +221 -16
  23. package/dist/context-mentions.d.ts +221 -16
  24. package/dist/event-stream-view-GL3ADRY2.js +1 -0
  25. package/dist/event-stream-view.cjs +1 -1
  26. package/dist/event-stream-view.d.cts +221 -16
  27. package/dist/event-stream-view.d.ts +221 -16
  28. package/dist/event-stream-view.js +1 -1
  29. package/dist/forms-ui.d.cts +234 -25
  30. package/dist/forms-ui.d.ts +234 -25
  31. package/dist/history-view.d.cts +136 -6
  32. package/dist/history-view.d.ts +136 -6
  33. package/dist/index.cjs +70 -70
  34. package/dist/index.cjs.map +1 -1
  35. package/dist/index.d.cts +302 -32
  36. package/dist/index.d.ts +302 -32
  37. package/dist/index.global.js +54 -54
  38. package/dist/index.global.js.map +1 -1
  39. package/dist/index.js +69 -69
  40. package/dist/index.js.map +1 -1
  41. package/dist/launcher.global.js +2 -2
  42. package/dist/launcher.global.js.map +1 -1
  43. package/dist/session-reconnect.d.cts +221 -16
  44. package/dist/session-reconnect.d.ts +221 -16
  45. package/dist/smart-dom-reader.d.cts +221 -16
  46. package/dist/smart-dom-reader.d.ts +221 -16
  47. package/dist/testing.cjs +3 -3
  48. package/dist/testing.d.cts +3 -4
  49. package/dist/testing.d.ts +3 -4
  50. package/dist/testing.js +3 -3
  51. package/dist/theme-editor-preview.cjs +73 -73
  52. package/dist/theme-editor-preview.d.cts +221 -16
  53. package/dist/theme-editor-preview.d.ts +221 -16
  54. package/dist/theme-editor-preview.js +51 -51
  55. package/dist/theme-editor.cjs +4 -4
  56. package/dist/theme-editor.d.cts +221 -16
  57. package/dist/theme-editor.d.ts +221 -16
  58. package/dist/theme-editor.js +2 -2
  59. package/dist/theme-reference.cjs +1 -1
  60. package/dist/theme-reference.d.cts +65 -1
  61. package/dist/theme-reference.d.ts +65 -1
  62. package/dist/theme-reference.js +1 -1
  63. package/dist/voice-runtime.d.cts +6 -2
  64. package/dist/voice-runtime.d.ts +6 -2
  65. package/dist/webmcp-polyfill.js +1 -4
  66. package/dist/webmcp-runtime-JI7T4QYF.js +6 -0
  67. package/dist/webmcp-runtime.cjs +2 -2
  68. package/dist/webmcp-runtime.d.cts +34 -2
  69. package/dist/webmcp-runtime.d.ts +34 -2
  70. package/dist/webmcp-runtime.js +2 -2
  71. package/package.json +2 -2
  72. package/src/ask-user-question-tool.ts +1 -1
  73. package/src/client-history-rest.test.ts +2 -1
  74. package/src/client-visitor-history.test.ts +20 -4
  75. package/src/client.composer-options.test.ts +1 -1
  76. package/src/client.interrupt.test.ts +2 -2
  77. package/src/client.test.ts +477 -915
  78. package/src/client.ts +134 -494
  79. package/src/client.unified-tools.test.ts +76 -0
  80. package/src/components/artifact-preview.ts +5 -0
  81. package/src/components/event-stream-badge-theming.test.ts +162 -0
  82. package/src/components/event-stream-view.test.ts +76 -76
  83. package/src/components/event-stream-view.ts +55 -20
  84. package/src/components/tool-bubble.test.ts +12 -0
  85. package/src/components/tool-bubble.ts +13 -2
  86. package/src/event-stream-view-bundle.test.ts +2 -2
  87. package/src/generated/runtype-openapi-contract.ts +137 -1
  88. package/src/index-core.ts +2 -0
  89. package/src/internal/runtype-history-provider.test.ts +2 -2
  90. package/src/runtime/init.registry.test.ts +56 -0
  91. package/src/runtime/init.ts +17 -0
  92. package/src/session-history.test.ts +1 -1
  93. package/src/session.quote.test.ts +1 -1
  94. package/src/session.resubmit-from.test.ts +1 -1
  95. package/src/session.test.ts +5 -5
  96. package/src/session.ts +95 -36
  97. package/src/suggest-replies-tool.ts +1 -1
  98. package/src/testing/mock-stream.test.ts +37 -16
  99. package/src/testing/mock-stream.ts +14 -9
  100. package/src/types/theme.ts +41 -1
  101. package/src/types.ts +57 -15
  102. package/src/ui.ask-user-question-plugin.test.ts +7 -7
  103. package/src/ui.composer-defer-one.test.ts +6 -34
  104. package/src/ui.composer-draft-persistence.test.ts +1 -1
  105. package/src/ui.composer-quote.test.ts +1 -1
  106. package/src/ui.message-history-actions.test.ts +1 -1
  107. package/src/ui.reasoning-display.test.ts +136 -2
  108. package/src/ui.streaming-coalescing.test.ts +10 -13
  109. package/src/ui.ts +101 -35
  110. package/src/ui.typing-indicator.test.ts +216 -0
  111. package/src/ui.voice-custom-provider.test.ts +211 -0
  112. package/src/utils/__snapshots__/tokens-parity.test.ts.snap +1740 -0
  113. package/src/utils/event-stream-buffer.test.ts +13 -13
  114. package/src/utils/event-stream-capture.test.ts +20 -20
  115. package/src/utils/formatting.ts +22 -0
  116. package/src/utils/theme.ts +16 -0
  117. package/src/utils/throughput-tracker.test.ts +100 -142
  118. package/src/utils/throughput-tracker.ts +18 -132
  119. package/src/utils/tokens.ts +59 -0
  120. package/src/utils/voice-support.ts +18 -1
  121. package/src/voice/voice-turn-tracker.ts +18 -0
  122. package/src/webmcp-bridge.test.ts +132 -23
  123. package/src/webmcp-bridge.ts +27 -3
  124. package/src/webmcp-runtime-entry.ts +71 -11
  125. package/dist/artifacts-ui-J6AKUGTS.js +0 -7
  126. package/dist/chunk-HBE7LFNT.js +0 -4
  127. package/dist/event-stream-view-73NWKWVQ.js +0 -1
  128. package/dist/webmcp-runtime-P3CHZRHF.js +0 -6
  129. package/src/utils/__fixtures__/unified-translator.oracle.ts +0 -717
@@ -61,6 +61,11 @@ type RuntypeExecutionStreamEvent = ({
61
61
  iteration?: number;
62
62
  role: "user" | "assistant" | "system";
63
63
  seq: number;
64
+ subagent?: {
65
+ agentName?: string;
66
+ parentToolCallId?: string;
67
+ toolName: string;
68
+ };
64
69
  turnIndex?: number;
65
70
  type: "turn_start";
66
71
  }) | ({
@@ -95,12 +100,61 @@ type RuntypeExecutionStreamEvent = ({
95
100
  role: "user" | "assistant" | "system";
96
101
  seq: number;
97
102
  stopReason?: "end_turn" | "max_tool_calls" | "length" | "content_filter" | "error" | "unknown";
103
+ subagent?: {
104
+ agentName?: string;
105
+ parentToolCallId?: string;
106
+ toolName: string;
107
+ };
98
108
  tokens?: {
99
109
  input: number;
100
110
  output: number;
101
111
  };
102
112
  type: "turn_complete";
103
113
  }) | {
114
+ executionId: string;
115
+ id: string;
116
+ iteration?: number;
117
+ model?: string;
118
+ ordinal: number;
119
+ provider?: string;
120
+ seq: number;
121
+ startedAt?: string;
122
+ stepId?: string;
123
+ subagent?: {
124
+ agentName?: string;
125
+ parentToolCallId?: string;
126
+ toolName: string;
127
+ };
128
+ turnId?: string;
129
+ type: "model_call_start";
130
+ } | {
131
+ completedAt?: string;
132
+ cost?: number;
133
+ durationMs?: number;
134
+ executionId: string;
135
+ finishReason?: string;
136
+ id: string;
137
+ iteration?: number;
138
+ model?: string;
139
+ ordinal: number;
140
+ provider?: string;
141
+ responseModel?: string;
142
+ seq: number;
143
+ subagent?: {
144
+ agentName?: string;
145
+ parentToolCallId?: string;
146
+ toolName: string;
147
+ };
148
+ success?: boolean;
149
+ tokens?: {
150
+ cacheRead?: number;
151
+ cacheWrite?: number;
152
+ input: number;
153
+ output: number;
154
+ };
155
+ turnId?: string;
156
+ type: "model_call_complete";
157
+ } | {
104
158
  executionId: string;
105
159
  id: string;
106
160
  index?: number;
@@ -109,6 +163,11 @@ type RuntypeExecutionStreamEvent = ({
109
163
  seq: number;
110
164
  startedAt?: string;
111
165
  stepType?: string;
166
+ subagent?: {
167
+ agentName?: string;
168
+ parentToolCallId?: string;
169
+ toolName: string;
170
+ };
112
171
  totalSteps?: number;
113
172
  type: "step_start";
114
173
  } | ({
@@ -136,6 +195,11 @@ type RuntypeExecutionStreamEvent = ({
136
195
  seq: number;
137
196
  stepType?: string;
138
197
  stopReason?: "end_turn" | "max_tool_calls" | "length" | "content_filter" | "error" | "unknown";
198
+ subagent?: {
199
+ agentName?: string;
200
+ parentToolCallId?: string;
201
+ toolName: string;
202
+ };
139
203
  success?: boolean;
140
204
  tokensUsed?: number;
141
205
  type: "step_complete";
@@ -158,6 +222,11 @@ type RuntypeExecutionStreamEvent = ({
158
222
  role?: "user" | "assistant" | "system";
159
223
  seq: number;
160
224
  stepId?: string;
225
+ subagent?: {
226
+ agentName?: string;
227
+ parentToolCallId?: string;
228
+ toolName: string;
229
+ };
161
230
  turnId?: string;
162
231
  type: "text_start";
163
232
  }) | {
@@ -165,11 +234,21 @@ type RuntypeExecutionStreamEvent = ({
165
234
  executionId: string;
166
235
  id: string;
167
236
  seq: number;
237
+ subagent?: {
238
+ agentName?: string;
239
+ parentToolCallId?: string;
240
+ toolName: string;
241
+ };
168
242
  type: "text_delta";
169
243
  } | {
170
244
  executionId: string;
171
245
  id: string;
172
246
  seq: number;
247
+ subagent?: {
248
+ agentName?: string;
249
+ parentToolCallId?: string;
250
+ toolName: string;
251
+ };
173
252
  text?: string;
174
253
  type: "text_complete";
175
254
  } | ({
@@ -178,18 +257,33 @@ type RuntypeExecutionStreamEvent = ({
178
257
  parentToolCallId?: string;
179
258
  scope?: "turn" | "loop";
180
259
  seq: number;
260
+ subagent?: {
261
+ agentName?: string;
262
+ parentToolCallId?: string;
263
+ toolName: string;
264
+ };
181
265
  type: "reasoning_start";
182
266
  }) | {
183
267
  delta: string;
184
268
  executionId: string;
185
269
  id: string;
186
270
  seq: number;
271
+ subagent?: {
272
+ agentName?: string;
273
+ parentToolCallId?: string;
274
+ toolName: string;
275
+ };
187
276
  type: "reasoning_delta";
188
277
  } | ({
189
278
  executionId: string;
190
279
  id: string;
191
280
  scope?: "turn" | "loop";
192
281
  seq: number;
282
+ subagent?: {
283
+ agentName?: string;
284
+ parentToolCallId?: string;
285
+ toolName: string;
286
+ };
193
287
  text?: string;
194
288
  type: "reasoning_complete";
195
289
  }) | ({
@@ -282,6 +376,11 @@ type RuntypeExecutionStreamEvent = ({
282
376
  seq: number;
283
377
  startedAt?: string;
284
378
  stepId?: string;
379
+ subagent?: {
380
+ agentName?: string;
381
+ parentToolCallId?: string;
382
+ toolName: string;
383
+ };
285
384
  toolCallId: string;
286
385
  toolName: string;
287
386
  toolType: string;
@@ -290,6 +389,11 @@ type RuntypeExecutionStreamEvent = ({
290
389
  delta: string;
291
390
  executionId: string;
292
391
  seq: number;
392
+ subagent?: {
393
+ agentName?: string;
394
+ parentToolCallId?: string;
395
+ toolName: string;
396
+ };
293
397
  toolCallId: string;
294
398
  type: "tool_input_delta";
295
399
  } | {
@@ -297,6 +401,11 @@ type RuntypeExecutionStreamEvent = ({
297
401
  hiddenParameterNames?: Array<string>;
298
402
  parameters: Record<string, unknown>;
299
403
  seq: number;
404
+ subagent?: {
405
+ agentName?: string;
406
+ parentToolCallId?: string;
407
+ toolName: string;
408
+ };
300
409
  toolCallId: string;
301
410
  toolName?: string;
302
411
  type: "tool_input_complete";
@@ -314,6 +423,11 @@ type RuntypeExecutionStreamEvent = ({
314
423
  result?: unknown;
315
424
  seq: number;
316
425
  stepId?: string;
426
+ subagent?: {
427
+ agentName?: string;
428
+ parentToolCallId?: string;
429
+ toolName: string;
430
+ };
317
431
  success: boolean;
318
432
  toolCallId: string;
319
433
  toolCost?: number;
@@ -393,6 +507,19 @@ type RuntypeExecutionStreamEvent = ({
393
507
  recoverable?: boolean;
394
508
  seq: number;
395
509
  type: "error";
510
+ }) | ({
511
+ epoch: number;
512
+ executionId: string;
513
+ kind: "compaction";
514
+ outcome?: "ok" | "failed" | "gap" | "skipped";
515
+ phase: "start" | "complete";
516
+ reason: "threshold" | "overflow" | "manual" | "surface_policy" | "provider_mismatch";
517
+ seq: number;
518
+ strategy: "provider_native" | "summary";
519
+ tier: number;
520
+ tokensAfter?: number;
521
+ tokensBefore?: number;
522
+ type: "context_notice";
396
523
  }) | {
397
524
  executionId: string;
398
525
  seq: number;
@@ -509,15 +636,15 @@ type AgentMessageMetadata = {
509
636
  */
510
637
  parentStepId?: string;
511
638
  /**
512
- * Set to `true` on a tool-variant message produced from a `step_await`
639
+ * Set to `true` on a tool-variant message produced from an `await`
513
640
  * event (`awaitReason: "local_tool_required"`). Signals to UI code that
514
641
  * the tool call is a LOCAL tool and the server is paused waiting for a
515
642
  * `POST /v1/dispatch/resume` with the user's answer keyed by tool name.
516
643
  */
517
644
  awaitingLocalTool?: boolean;
518
645
  /**
519
- * The provider per-call id (`toolu_…`) carried on the `step_await` /
520
- * `flow_await` events for a LOCAL tool (core#3878). Present only when the
646
+ * The provider per-call id (`toolu_…`) carried on the `await`
647
+ * event for a LOCAL tool (core#3878). Present only when the
521
648
  * server emits it. Two PARALLEL calls to the same tool in one turn share a
522
649
  * `toolName` (and a collapsed `toolId`) but get DISTINCT `webMcpToolCallId`s,
523
650
  * so this is the key the widget batches a single `/resume` on: preferred
@@ -649,7 +776,7 @@ type AgentWidgetReasoning = {
649
776
  /**
650
777
  * Reasoning channel scope (wire spec). `"turn"` is ordinary per-turn
651
778
  * thinking; `"loop"` is a cross-iteration agent reflection (the fold that
652
- * replaced the legacy `agent_reflection` event). Absent for legacy streams.
779
+ * replaced the legacy `agent_reflection` event). Optional when the stream does not specify a scope.
653
780
  */
654
781
  scope?: "turn" | "loop";
655
782
  startedAt?: number;
@@ -663,6 +790,9 @@ type AgentWidgetToolCall = {
663
790
  args?: unknown;
664
791
  chunks?: string[];
665
792
  result?: unknown;
793
+ /** Whether the tool succeeded; failure does not necessarily end the execution. */
794
+ success?: boolean;
795
+ error?: string;
666
796
  duration?: number;
667
797
  startedAt?: number;
668
798
  completedAt?: number;
@@ -693,7 +823,7 @@ type AgentWidgetApproval = {
693
823
  type AgentWidgetMessageVariant = "assistant" | "reasoning" | "tool" | "approval";
694
824
  /**
695
825
  * Per-turn / per-step stop reason emitted by the runtime on
696
- * `agent_turn_complete` and `step_complete` SSE events. The vocabulary is
826
+ * `turn_complete` and `step_complete` SSE events. The vocabulary is
697
827
  * owned by the upstream Runtype API: do not extend without coordination.
698
828
  *
699
829
  * - `end_turn`: natural completion (no affordance needed)
@@ -824,7 +954,7 @@ type AgentWidgetMessage = {
824
954
  */
825
955
  agentMetadata?: AgentMessageMetadata;
826
956
  /**
827
- * Per-turn stop reason reported by the runtime on `agent_turn_complete`
957
+ * Per-turn stop reason reported by the runtime on `turn_complete`
828
958
  * (agent-loop path) or the last `step_complete` for a prompt step
829
959
  * (dispatch / flow path). Absent when the API did not report a value.
830
960
  *
@@ -61,6 +61,11 @@ type RuntypeExecutionStreamEvent = ({
61
61
  iteration?: number;
62
62
  role: "user" | "assistant" | "system";
63
63
  seq: number;
64
+ subagent?: {
65
+ agentName?: string;
66
+ parentToolCallId?: string;
67
+ toolName: string;
68
+ };
64
69
  turnIndex?: number;
65
70
  type: "turn_start";
66
71
  }) | ({
@@ -95,12 +100,61 @@ type RuntypeExecutionStreamEvent = ({
95
100
  role: "user" | "assistant" | "system";
96
101
  seq: number;
97
102
  stopReason?: "end_turn" | "max_tool_calls" | "length" | "content_filter" | "error" | "unknown";
103
+ subagent?: {
104
+ agentName?: string;
105
+ parentToolCallId?: string;
106
+ toolName: string;
107
+ };
98
108
  tokens?: {
99
109
  input: number;
100
110
  output: number;
101
111
  };
102
112
  type: "turn_complete";
103
113
  }) | {
114
+ executionId: string;
115
+ id: string;
116
+ iteration?: number;
117
+ model?: string;
118
+ ordinal: number;
119
+ provider?: string;
120
+ seq: number;
121
+ startedAt?: string;
122
+ stepId?: string;
123
+ subagent?: {
124
+ agentName?: string;
125
+ parentToolCallId?: string;
126
+ toolName: string;
127
+ };
128
+ turnId?: string;
129
+ type: "model_call_start";
130
+ } | {
131
+ completedAt?: string;
132
+ cost?: number;
133
+ durationMs?: number;
134
+ executionId: string;
135
+ finishReason?: string;
136
+ id: string;
137
+ iteration?: number;
138
+ model?: string;
139
+ ordinal: number;
140
+ provider?: string;
141
+ responseModel?: string;
142
+ seq: number;
143
+ subagent?: {
144
+ agentName?: string;
145
+ parentToolCallId?: string;
146
+ toolName: string;
147
+ };
148
+ success?: boolean;
149
+ tokens?: {
150
+ cacheRead?: number;
151
+ cacheWrite?: number;
152
+ input: number;
153
+ output: number;
154
+ };
155
+ turnId?: string;
156
+ type: "model_call_complete";
157
+ } | {
104
158
  executionId: string;
105
159
  id: string;
106
160
  index?: number;
@@ -109,6 +163,11 @@ type RuntypeExecutionStreamEvent = ({
109
163
  seq: number;
110
164
  startedAt?: string;
111
165
  stepType?: string;
166
+ subagent?: {
167
+ agentName?: string;
168
+ parentToolCallId?: string;
169
+ toolName: string;
170
+ };
112
171
  totalSteps?: number;
113
172
  type: "step_start";
114
173
  } | ({
@@ -136,6 +195,11 @@ type RuntypeExecutionStreamEvent = ({
136
195
  seq: number;
137
196
  stepType?: string;
138
197
  stopReason?: "end_turn" | "max_tool_calls" | "length" | "content_filter" | "error" | "unknown";
198
+ subagent?: {
199
+ agentName?: string;
200
+ parentToolCallId?: string;
201
+ toolName: string;
202
+ };
139
203
  success?: boolean;
140
204
  tokensUsed?: number;
141
205
  type: "step_complete";
@@ -158,6 +222,11 @@ type RuntypeExecutionStreamEvent = ({
158
222
  role?: "user" | "assistant" | "system";
159
223
  seq: number;
160
224
  stepId?: string;
225
+ subagent?: {
226
+ agentName?: string;
227
+ parentToolCallId?: string;
228
+ toolName: string;
229
+ };
161
230
  turnId?: string;
162
231
  type: "text_start";
163
232
  }) | {
@@ -165,11 +234,21 @@ type RuntypeExecutionStreamEvent = ({
165
234
  executionId: string;
166
235
  id: string;
167
236
  seq: number;
237
+ subagent?: {
238
+ agentName?: string;
239
+ parentToolCallId?: string;
240
+ toolName: string;
241
+ };
168
242
  type: "text_delta";
169
243
  } | {
170
244
  executionId: string;
171
245
  id: string;
172
246
  seq: number;
247
+ subagent?: {
248
+ agentName?: string;
249
+ parentToolCallId?: string;
250
+ toolName: string;
251
+ };
173
252
  text?: string;
174
253
  type: "text_complete";
175
254
  } | ({
@@ -178,18 +257,33 @@ type RuntypeExecutionStreamEvent = ({
178
257
  parentToolCallId?: string;
179
258
  scope?: "turn" | "loop";
180
259
  seq: number;
260
+ subagent?: {
261
+ agentName?: string;
262
+ parentToolCallId?: string;
263
+ toolName: string;
264
+ };
181
265
  type: "reasoning_start";
182
266
  }) | {
183
267
  delta: string;
184
268
  executionId: string;
185
269
  id: string;
186
270
  seq: number;
271
+ subagent?: {
272
+ agentName?: string;
273
+ parentToolCallId?: string;
274
+ toolName: string;
275
+ };
187
276
  type: "reasoning_delta";
188
277
  } | ({
189
278
  executionId: string;
190
279
  id: string;
191
280
  scope?: "turn" | "loop";
192
281
  seq: number;
282
+ subagent?: {
283
+ agentName?: string;
284
+ parentToolCallId?: string;
285
+ toolName: string;
286
+ };
193
287
  text?: string;
194
288
  type: "reasoning_complete";
195
289
  }) | ({
@@ -282,6 +376,11 @@ type RuntypeExecutionStreamEvent = ({
282
376
  seq: number;
283
377
  startedAt?: string;
284
378
  stepId?: string;
379
+ subagent?: {
380
+ agentName?: string;
381
+ parentToolCallId?: string;
382
+ toolName: string;
383
+ };
285
384
  toolCallId: string;
286
385
  toolName: string;
287
386
  toolType: string;
@@ -290,6 +389,11 @@ type RuntypeExecutionStreamEvent = ({
290
389
  delta: string;
291
390
  executionId: string;
292
391
  seq: number;
392
+ subagent?: {
393
+ agentName?: string;
394
+ parentToolCallId?: string;
395
+ toolName: string;
396
+ };
293
397
  toolCallId: string;
294
398
  type: "tool_input_delta";
295
399
  } | {
@@ -297,6 +401,11 @@ type RuntypeExecutionStreamEvent = ({
297
401
  hiddenParameterNames?: Array<string>;
298
402
  parameters: Record<string, unknown>;
299
403
  seq: number;
404
+ subagent?: {
405
+ agentName?: string;
406
+ parentToolCallId?: string;
407
+ toolName: string;
408
+ };
300
409
  toolCallId: string;
301
410
  toolName?: string;
302
411
  type: "tool_input_complete";
@@ -314,6 +423,11 @@ type RuntypeExecutionStreamEvent = ({
314
423
  result?: unknown;
315
424
  seq: number;
316
425
  stepId?: string;
426
+ subagent?: {
427
+ agentName?: string;
428
+ parentToolCallId?: string;
429
+ toolName: string;
430
+ };
317
431
  success: boolean;
318
432
  toolCallId: string;
319
433
  toolCost?: number;
@@ -393,6 +507,19 @@ type RuntypeExecutionStreamEvent = ({
393
507
  recoverable?: boolean;
394
508
  seq: number;
395
509
  type: "error";
510
+ }) | ({
511
+ epoch: number;
512
+ executionId: string;
513
+ kind: "compaction";
514
+ outcome?: "ok" | "failed" | "gap" | "skipped";
515
+ phase: "start" | "complete";
516
+ reason: "threshold" | "overflow" | "manual" | "surface_policy" | "provider_mismatch";
517
+ seq: number;
518
+ strategy: "provider_native" | "summary";
519
+ tier: number;
520
+ tokensAfter?: number;
521
+ tokensBefore?: number;
522
+ type: "context_notice";
396
523
  }) | {
397
524
  executionId: string;
398
525
  seq: number;
@@ -509,15 +636,15 @@ type AgentMessageMetadata = {
509
636
  */
510
637
  parentStepId?: string;
511
638
  /**
512
- * Set to `true` on a tool-variant message produced from a `step_await`
639
+ * Set to `true` on a tool-variant message produced from an `await`
513
640
  * event (`awaitReason: "local_tool_required"`). Signals to UI code that
514
641
  * the tool call is a LOCAL tool and the server is paused waiting for a
515
642
  * `POST /v1/dispatch/resume` with the user's answer keyed by tool name.
516
643
  */
517
644
  awaitingLocalTool?: boolean;
518
645
  /**
519
- * The provider per-call id (`toolu_…`) carried on the `step_await` /
520
- * `flow_await` events for a LOCAL tool (core#3878). Present only when the
646
+ * The provider per-call id (`toolu_…`) carried on the `await`
647
+ * event for a LOCAL tool (core#3878). Present only when the
521
648
  * server emits it. Two PARALLEL calls to the same tool in one turn share a
522
649
  * `toolName` (and a collapsed `toolId`) but get DISTINCT `webMcpToolCallId`s,
523
650
  * so this is the key the widget batches a single `/resume` on: preferred
@@ -649,7 +776,7 @@ type AgentWidgetReasoning = {
649
776
  /**
650
777
  * Reasoning channel scope (wire spec). `"turn"` is ordinary per-turn
651
778
  * thinking; `"loop"` is a cross-iteration agent reflection (the fold that
652
- * replaced the legacy `agent_reflection` event). Absent for legacy streams.
779
+ * replaced the legacy `agent_reflection` event). Optional when the stream does not specify a scope.
653
780
  */
654
781
  scope?: "turn" | "loop";
655
782
  startedAt?: number;
@@ -663,6 +790,9 @@ type AgentWidgetToolCall = {
663
790
  args?: unknown;
664
791
  chunks?: string[];
665
792
  result?: unknown;
793
+ /** Whether the tool succeeded; failure does not necessarily end the execution. */
794
+ success?: boolean;
795
+ error?: string;
666
796
  duration?: number;
667
797
  startedAt?: number;
668
798
  completedAt?: number;
@@ -693,7 +823,7 @@ type AgentWidgetApproval = {
693
823
  type AgentWidgetMessageVariant = "assistant" | "reasoning" | "tool" | "approval";
694
824
  /**
695
825
  * Per-turn / per-step stop reason emitted by the runtime on
696
- * `agent_turn_complete` and `step_complete` SSE events. The vocabulary is
826
+ * `turn_complete` and `step_complete` SSE events. The vocabulary is
697
827
  * owned by the upstream Runtype API: do not extend without coordination.
698
828
  *
699
829
  * - `end_turn`: natural completion (no affordance needed)
@@ -824,7 +954,7 @@ type AgentWidgetMessage = {
824
954
  */
825
955
  agentMetadata?: AgentMessageMetadata;
826
956
  /**
827
- * Per-turn stop reason reported by the runtime on `agent_turn_complete`
957
+ * Per-turn stop reason reported by the runtime on `turn_complete`
828
958
  * (agent-loop path) or the last `step_complete` for a prompt step
829
959
  * (dispatch / flow path). Absent when the API did not report a value.
830
960
  *
@@ -1 +1 @@
1
- import{a as E,g as P}from"./chunk-HBE7LFNT.js";import{a as x}from"./chunk-7NQ4ZTHF.js";import{b as q,c as $}from"./chunk-Q735PSZL.js";import{a}from"./chunk-76IELU7F.js";var R=()=>{},z=t=>{R=t.webMcpToolTitle},I=t=>R(t);import{ChevronDown as Y,ChevronUp as ee,ShieldAlert as te,ShieldCheck as K,ShieldX as _}from"lucide";var k=new Map,B=t=>{let o=(t.startsWith(E)?t.slice(E.length):t).replace(/([a-z0-9])([A-Z])/g,"$1 $2").split(/[_\-\s.]+/).filter(Boolean);if(o.length===0)return t;let e=o.join(" ").toLowerCase();return e.charAt(0).toUpperCase()+e.slice(1)},F=t=>t?.approval!==!1?t?.approval:void 0,X=(t,r)=>{let o=F(r)?.detailsDisplay??"collapsed";return k.get(t)??o==="expanded"},j=(t,r,o)=>{let e=F(o);t.setAttribute("aria-expanded",r?"true":"false");let u=t.querySelector("[data-approval-details-label]");u&&(u.textContent=r?e?.hideDetailsLabel??"Hide details":e?.showDetailsLabel??"Show details");let i=t.querySelector("[data-approval-details-chevron]");if(i){i.innerHTML="";let g=x(r?ee:Y,14,"currentColor",2);g&&i.appendChild(g)}},V=(t,r,o)=>{let e=r.querySelector('button[data-bubble-type="approval"]'),u=r.querySelector("[data-approval-details]");if(!e||!u)return;let i=X(t,o);j(e,i,o),u.style.display=i?"":"none"};var Z=(t,r)=>{let o=t.approval,e=r?.approval!==!1?r?.approval:void 0,u=o?.status==="pending",i=a("div",["persona-approval-bubble","persona-w-full","persona-rounded-2xl","persona-border","persona-shadow-sm","persona-overflow-hidden"].join(" "));if(i.id=`bubble-${t.id}`,i.setAttribute("data-message-id",t.id),i.style.backgroundColor=e?.backgroundColor??"var(--persona-approval-bg, #fefce8)",i.style.borderColor=e?.borderColor??"var(--persona-approval-border, #fef08a)",i.style.boxShadow=e?.shadow!==void 0?e.shadow.trim()===""?"none":e.shadow:"var(--persona-approval-shadow, 0 5px 15px rgba(15, 23, 42, 0.08))",!o)return i;let g=a("div","persona-flex persona-items-start persona-gap-3 persona-px-4 persona-py-3"),l=a("div","persona-flex-shrink-0 persona-mt-0.5");l.setAttribute("data-approval-icon","true");let v=o.status==="denied"?_:o.status==="timeout"?te:K,C=o.status==="approved"?"var(--persona-feedback-success, #16a34a)":o.status==="denied"?"var(--persona-feedback-error, #dc2626)":o.status==="timeout"?"var(--persona-feedback-warning, #ca8a04)":e?.titleColor??"currentColor",A=x(v,20,C,2);A&&l.appendChild(A);let m=a("div","persona-flex-1 persona-min-w-0"),f=a("div","persona-flex persona-items-center persona-gap-2"),w=a("span","persona-text-sm persona-font-medium persona-text-persona-primary");if(e?.titleColor&&(w.style.color=e.titleColor),w.textContent=e?.title??"Approval Required",f.appendChild(w),!u){let s=a("span","persona-inline-flex persona-items-center persona-px-2 persona-py-0.5 persona-rounded-full persona-text-xs persona-font-medium");s.setAttribute("data-approval-status",o.status),o.status==="approved"?(s.style.backgroundColor="var(--persona-palette-colors-success-100, #dcfce7)",s.style.color="var(--persona-palette-colors-success-700, #15803d)",s.textContent="Approved"):o.status==="denied"?(s.style.backgroundColor="var(--persona-palette-colors-error-100, #fee2e2)",s.style.color="var(--persona-palette-colors-error-700, #b91c1c)",s.textContent="Denied"):o.status==="timeout"&&(s.style.backgroundColor="var(--persona-palette-colors-warning-100, #fef3c7)",s.style.color="var(--persona-palette-colors-warning-700, #b45309)",s.textContent="Timeout"),f.appendChild(s)}m.appendChild(f);let y=o.toolType==="webmcp"||o.toolName.startsWith(E)?I(o.toolName):void 0,N=e?.formatDescription?.({toolName:o.toolName,toolType:o.toolType,description:o.description,parameters:o.parameters,...y?{displayTitle:y}:{},...o.reason?{reason:o.reason}:{}}),D=!o.toolName,H=N||(D?o.description:`The assistant wants to use \u201C${y??B(o.toolName)}\u201D.`),h=a("p","persona-text-sm persona-mt-0.5 persona-text-persona-muted");if(h.setAttribute("data-approval-summary","true"),e?.descriptionColor&&(h.style.color=e.descriptionColor),h.textContent=H,m.appendChild(h),o.reason){let s=a("p","persona-text-sm persona-mt-1 persona-text-persona-muted");s.setAttribute("data-approval-reason","true"),e?.reasonColor?s.style.color=e.reasonColor:e?.descriptionColor&&(s.style.color=e.descriptionColor);let n=a("span","persona-font-medium");n.textContent=`${e?.reasonLabel??"Agent's stated reason:"} `,s.appendChild(n),s.appendChild(document.createTextNode(o.reason)),m.appendChild(s)}let W=e?.detailsDisplay??"collapsed",M=!!o.description&&!D,S=M||!!o.parameters;if(W!=="hidden"&&S){let s=X(t.id,r),n=a("button","persona-inline-flex persona-items-center persona-gap-1 persona-mt-1 persona-p-0 persona-border-none persona-bg-transparent persona-text-xs persona-font-medium persona-cursor-pointer persona-text-persona-muted");n.type="button",n.setAttribute("data-expand-header","true"),n.setAttribute("data-bubble-type","approval"),e?.descriptionColor&&(n.style.color=e.descriptionColor);let p=a("span");p.setAttribute("data-approval-details-label","true");let b=a("span","persona-inline-flex persona-items-center");b.setAttribute("data-approval-details-chevron","true"),n.append(p,b),j(n,s,r),m.appendChild(n);let c=a("div");if(c.setAttribute("data-approval-details","true"),c.style.display=s?"":"none",M){let d=a("p","persona-text-sm persona-mt-1 persona-text-persona-muted");e?.descriptionColor&&(d.style.color=e.descriptionColor),d.textContent=o.description,c.appendChild(d)}if(o.parameters){let d=a("pre","persona-mt-2 persona-text-xs persona-p-2 persona-rounded persona-overflow-x-auto persona-max-h-32 persona-bg-persona-container persona-text-persona-primary");e?.parameterBackgroundColor&&(d.style.backgroundColor=e.parameterBackgroundColor),e?.parameterTextColor&&(d.style.color=e.parameterTextColor),d.style.fontSize="0.75rem",d.style.lineHeight="1rem",d.textContent=P(o.parameters),c.appendChild(d)}m.appendChild(c)}if(u){let s=a("div","persona-flex persona-gap-2 persona-mt-2");s.setAttribute("data-approval-buttons","true");let n=a("button","persona-inline-flex persona-items-center persona-px-3 persona-py-1.5 persona-rounded-md persona-text-xs persona-font-medium persona-border-none persona-cursor-pointer");n.type="button",n.style.backgroundColor=e?.approveButtonColor??"var(--persona-approval-approve-bg, #22c55e)",n.style.color=e?.approveButtonTextColor??"#ffffff",n.setAttribute("data-approval-action","approve");let p=x(K,14,e?.approveButtonTextColor??"#ffffff",2);p&&(p.style.marginRight="4px",n.appendChild(p));let b=document.createTextNode(e?.approveLabel??"Approve");n.appendChild(b);let c=a("button","persona-inline-flex persona-items-center persona-px-3 persona-py-1.5 persona-rounded-md persona-text-xs persona-font-medium persona-cursor-pointer");c.type="button",c.style.backgroundColor=e?.denyButtonColor??"transparent",c.style.color=e?.denyButtonTextColor??"var(--persona-feedback-error, #dc2626)",c.style.border=`1px solid ${e?.denyButtonTextColor?e.denyButtonTextColor:"var(--persona-palette-colors-error-200, #fca5a5)"}`,c.setAttribute("data-approval-action","deny");let d=x(_,14,e?.denyButtonTextColor??"var(--persona-feedback-error, #dc2626)",2);d&&(d.style.marginRight="4px",c.appendChild(d));let L=document.createTextNode(e?.denyLabel??"Deny");c.appendChild(L),s.append(n,c),m.appendChild(s)}return g.append(l,m),i.appendChild(g),i};import{Ban as oe,ChevronDown as G,ShieldCheck as ne}from"lucide";var re=()=>({keyHandlers:new Map,popovers:new Map,pendingOrder:[],latestPendingApprovalId:null}),J=(t,r)=>{let o=t.keyHandlers.get(r);o&&(document.removeEventListener("keydown",o),t.keyHandlers.delete(r));let e=t.popovers.get(r);e&&(e.destroy(),t.popovers.delete(r))},T=(t,r)=>{J(t,r);let o=t.pendingOrder.indexOf(r);o!==-1&&t.pendingOrder.splice(o,1),t.latestPendingApprovalId===r&&(t.latestPendingApprovalId=t.pendingOrder.length?t.pendingOrder[t.pendingOrder.length-1]:null)},ae=t=>t?.approval!==!1?t?.approval:void 0,se=(t,r)=>{let o=r?.detailsDisplay??"collapsed";return k.get(t)??o==="expanded"},U=t=>{let r=a("span","persona-approval-kbd");return r.textContent=t,r},pe=(t,r)=>{let o=a("span","persona-approval-title");r?.titleColor&&(o.style.color=r.titleColor);let u=t.toolType==="webmcp"||t.toolName.startsWith(E)?I(t.toolName):void 0,i=r?.formatDescription?.({toolName:t.toolName,toolType:t.toolType,description:t.description??"",parameters:t.parameters,...u?{displayTitle:u}:{},...t.reason?{reason:t.reason}:{}});if(i)return o.textContent=i,o;let g=u??B(t.toolName),l=t.toolType&&t.toolType!=="webmcp"?t.toolType:null;o.append("The assistant wants to use ");let v=document.createElement("strong");if(v.textContent=g,o.appendChild(v),l){o.append(" from ");let C=document.createElement("strong");C.textContent=l,o.appendChild(C)}return o},le=t=>{let r=a("div","persona-approval-resolved"),o=x(oe,15,"currentColor",2);o&&r.appendChild(o);let e=a("span","persona-approval-resolved-name");return e.textContent=t.toolName?B(t.toolName):"Tool",r.append(e,document.createTextNode(t.status==="timeout"?" timed out":" denied")),r},ie=(t,r,o,e,u,i,g)=>{let l=a("div","persona-approval-card persona-shadow-sm");l.id=`bubble-${r.id}`,l.setAttribute("data-message-id",r.id),l.setAttribute("data-bubble-type","approval"),e?.backgroundColor&&(l.style.background=e.backgroundColor),e?.borderColor&&(l.style.borderColor=e.borderColor),e?.shadow!==void 0&&(l.style.boxShadow=e.shadow.trim()===""?"none":e.shadow);let v=e?.detailsDisplay??"collapsed",C=!!o.description&&v!=="hidden",A=o.parameters!=null&&v!=="hidden",m=C||A,f=m&&se(r.id,e),w=e?.showDetailsLabel??"Show details",O=e?.hideDetailsLabel??"Hide details",y=a("button","persona-approval-head");y.type="button",m?(y.setAttribute("data-action","toggle-params"),y.setAttribute("aria-expanded",f?"true":"false"),y.setAttribute("aria-label",f?O:w)):y.setAttribute("data-static","true");let N=a("span","persona-approval-logo"),D=x(ne,16,"currentColor",2);D&&N.appendChild(D),y.appendChild(N);let H=pe(o,e);if(m){let n=a("span","persona-approval-toggle");n.setAttribute("aria-hidden","true");let p=x(G,14,"currentColor",2);p&&n.appendChild(p),H.append(" "),H.appendChild(n)}y.appendChild(H),l.appendChild(y);let h=a("div","persona-approval-body");if(m){let n=a("div","persona-approval-details");if(n.setAttribute("data-role","params"),n.hidden=!f,C){let p=a("p","persona-approval-desc");e?.descriptionColor&&(p.style.color=e.descriptionColor),p.textContent=o.description,n.appendChild(p)}if(A){let p=a("pre","persona-approval-params");e?.parameterBackgroundColor&&(p.style.background=e.parameterBackgroundColor),e?.parameterTextColor&&(p.style.color=e.parameterTextColor),p.textContent=P(o.parameters),n.appendChild(p)}h.appendChild(n)}if(o.reason){let n=a("p","persona-approval-reason");e?.reasonColor?n.style.color=e.reasonColor:e?.descriptionColor&&(n.style.color=e.descriptionColor);let p=a("span","persona-approval-reason-label");p.textContent=`${e?.reasonLabel??"Agent's stated reason:"} `,n.append(p,document.createTextNode(o.reason)),h.appendChild(n)}let W=a("div","persona-approval-actions"),M=null,S=n=>{e?.approveButtonColor&&(n.style.background=e.approveButtonColor),e?.approveButtonTextColor&&(n.style.color=e.approveButtonTextColor)},s=a("button","persona-approval-deny");if(s.type="button",s.setAttribute("data-action","deny"),e?.denyButtonColor&&(s.style.background=e.denyButtonColor),e?.denyButtonTextColor&&(s.style.color=e.denyButtonTextColor),s.append(e?.denyLabel??"Deny"),g){let n=a("div","persona-approval-split"),p=a("button","persona-approval-primary");p.type="button",p.setAttribute("data-action","always"),S(p),p.append(e?.approveLabel??"Always allow",U("\u23CE"));let b=a("button","persona-approval-caret");b.type="button",b.setAttribute("data-action","toggle-menu"),b.setAttribute("aria-label","More options"),S(b);let c=x(G,15,"currentColor",2);c&&b.appendChild(c),n.append(p,b),W.append(n,s),s.append(U("Esc"));let d=a("div","persona-approval-menu"),L=a("button","persona-approval-menu-item");L.type="button",L.append("Allow once",U("\u2318\u23CE")),d.appendChild(L),M=q({anchor:n,content:d,placement:"bottom-start",matchAnchorWidth:!0}),t.popovers.set(r.id,M),L.addEventListener("click",()=>{T(t,r.id),u()})}else{let n=a("button","persona-approval-primary persona-approval-primary--solo");n.type="button",n.setAttribute("data-action","allow"),S(n),n.append(e?.approveLabel??"Allow"),W.append(n,s)}return h.appendChild(W),l.appendChild(h),l.addEventListener("click",n=>{let p=n.target instanceof Element?n.target.closest("[data-action]"):null;if(!p)return;let b=p.getAttribute("data-action");if(b==="toggle-params"){let c=l.querySelector('[data-role="params"]');if(c){let d=c.hidden;c.hidden=!d,y.setAttribute("aria-expanded",d?"true":"false"),y.setAttribute("aria-label",d?O:w),k.set(r.id,d)}return}if(b==="toggle-menu"){M?.toggle();return}if(b==="always"){T(t,r.id),u({remember:!0});return}if(b==="allow"){T(t,r.id),u();return}if(b==="deny"){T(t,r.id),i();return}}),l},Q=()=>{let t=re();return{plugin:{id:"persona-built-in-approval",renderApproval:({message:e,approve:u,deny:i,config:g})=>{let l=e?.approval;if(!l)return null;let v=ae(g);if(l.status!=="pending"){if(T(t,e.id),l.status==="approved"){let m=document.createElement("div");return m.style.display="none",m}return le(l)}J(t,e.id);let C=v?.enableAlwaysAllow===!0,A=ie(t,e,l,v,u,i,C);if(C){t.pendingOrder.includes(e.id)||t.pendingOrder.push(e.id),t.latestPendingApprovalId=t.pendingOrder[t.pendingOrder.length-1];let m=f=>{$(f)||e.id===t.latestPendingApprovalId&&(f.key!=="Escape"&&f.key!=="Enter"||(f.preventDefault(),f.stopImmediatePropagation(),T(t,e.id),f.key==="Escape"?i():f.metaKey||f.ctrlKey?u():u({remember:!0})))};t.keyHandlers.set(e.id,m),document.addEventListener("keydown",m)}return A}},teardown:()=>{for(let e of[...t.keyHandlers.keys(),...t.popovers.keys()])T(t,e);t.latestPendingApprovalId=null}}};export{k as approvalDetailsExpansionState,Z as createApprovalBubble,Q as createBuiltInApprovalPlugin,B as humanizeToolName,z as initApprovalUi,V as updateApprovalDetailsUI};
1
+ import{a as E,g as P}from"./chunk-NQLDCJAP.js";import{a as x}from"./chunk-7NQ4ZTHF.js";import{b as q,c as $}from"./chunk-Q735PSZL.js";import{a}from"./chunk-76IELU7F.js";var R=()=>{},z=t=>{R=t.webMcpToolTitle},I=t=>R(t);import{ChevronDown as Y,ChevronUp as ee,ShieldAlert as te,ShieldCheck as K,ShieldX as _}from"lucide";var k=new Map,B=t=>{let o=(t.startsWith(E)?t.slice(E.length):t).replace(/([a-z0-9])([A-Z])/g,"$1 $2").split(/[_\-\s.]+/).filter(Boolean);if(o.length===0)return t;let e=o.join(" ").toLowerCase();return e.charAt(0).toUpperCase()+e.slice(1)},F=t=>t?.approval!==!1?t?.approval:void 0,X=(t,r)=>{let o=F(r)?.detailsDisplay??"collapsed";return k.get(t)??o==="expanded"},j=(t,r,o)=>{let e=F(o);t.setAttribute("aria-expanded",r?"true":"false");let u=t.querySelector("[data-approval-details-label]");u&&(u.textContent=r?e?.hideDetailsLabel??"Hide details":e?.showDetailsLabel??"Show details");let i=t.querySelector("[data-approval-details-chevron]");if(i){i.innerHTML="";let g=x(r?ee:Y,14,"currentColor",2);g&&i.appendChild(g)}},V=(t,r,o)=>{let e=r.querySelector('button[data-bubble-type="approval"]'),u=r.querySelector("[data-approval-details]");if(!e||!u)return;let i=X(t,o);j(e,i,o),u.style.display=i?"":"none"};var Z=(t,r)=>{let o=t.approval,e=r?.approval!==!1?r?.approval:void 0,u=o?.status==="pending",i=a("div",["persona-approval-bubble","persona-w-full","persona-rounded-2xl","persona-border","persona-shadow-sm","persona-overflow-hidden"].join(" "));if(i.id=`bubble-${t.id}`,i.setAttribute("data-message-id",t.id),i.style.backgroundColor=e?.backgroundColor??"var(--persona-approval-bg, #fefce8)",i.style.borderColor=e?.borderColor??"var(--persona-approval-border, #fef08a)",i.style.boxShadow=e?.shadow!==void 0?e.shadow.trim()===""?"none":e.shadow:"var(--persona-approval-shadow, 0 5px 15px rgba(15, 23, 42, 0.08))",!o)return i;let g=a("div","persona-flex persona-items-start persona-gap-3 persona-px-4 persona-py-3"),l=a("div","persona-flex-shrink-0 persona-mt-0.5");l.setAttribute("data-approval-icon","true");let v=o.status==="denied"?_:o.status==="timeout"?te:K,C=o.status==="approved"?"var(--persona-feedback-success, #16a34a)":o.status==="denied"?"var(--persona-feedback-error, #dc2626)":o.status==="timeout"?"var(--persona-feedback-warning, #ca8a04)":e?.titleColor??"currentColor",A=x(v,20,C,2);A&&l.appendChild(A);let m=a("div","persona-flex-1 persona-min-w-0"),f=a("div","persona-flex persona-items-center persona-gap-2"),w=a("span","persona-text-sm persona-font-medium persona-text-persona-primary");if(e?.titleColor&&(w.style.color=e.titleColor),w.textContent=e?.title??"Approval Required",f.appendChild(w),!u){let s=a("span","persona-inline-flex persona-items-center persona-px-2 persona-py-0.5 persona-rounded-full persona-text-xs persona-font-medium");s.setAttribute("data-approval-status",o.status),o.status==="approved"?(s.style.backgroundColor="var(--persona-palette-colors-success-100, #dcfce7)",s.style.color="var(--persona-palette-colors-success-700, #15803d)",s.textContent="Approved"):o.status==="denied"?(s.style.backgroundColor="var(--persona-palette-colors-error-100, #fee2e2)",s.style.color="var(--persona-palette-colors-error-700, #b91c1c)",s.textContent="Denied"):o.status==="timeout"&&(s.style.backgroundColor="var(--persona-palette-colors-warning-100, #fef3c7)",s.style.color="var(--persona-palette-colors-warning-700, #b45309)",s.textContent="Timeout"),f.appendChild(s)}m.appendChild(f);let y=o.toolType==="webmcp"||o.toolName.startsWith(E)?I(o.toolName):void 0,N=e?.formatDescription?.({toolName:o.toolName,toolType:o.toolType,description:o.description,parameters:o.parameters,...y?{displayTitle:y}:{},...o.reason?{reason:o.reason}:{}}),D=!o.toolName,H=N||(D?o.description:`The assistant wants to use \u201C${y??B(o.toolName)}\u201D.`),h=a("p","persona-text-sm persona-mt-0.5 persona-text-persona-muted");if(h.setAttribute("data-approval-summary","true"),e?.descriptionColor&&(h.style.color=e.descriptionColor),h.textContent=H,m.appendChild(h),o.reason){let s=a("p","persona-text-sm persona-mt-1 persona-text-persona-muted");s.setAttribute("data-approval-reason","true"),e?.reasonColor?s.style.color=e.reasonColor:e?.descriptionColor&&(s.style.color=e.descriptionColor);let n=a("span","persona-font-medium");n.textContent=`${e?.reasonLabel??"Agent's stated reason:"} `,s.appendChild(n),s.appendChild(document.createTextNode(o.reason)),m.appendChild(s)}let W=e?.detailsDisplay??"collapsed",M=!!o.description&&!D,S=M||!!o.parameters;if(W!=="hidden"&&S){let s=X(t.id,r),n=a("button","persona-inline-flex persona-items-center persona-gap-1 persona-mt-1 persona-p-0 persona-border-none persona-bg-transparent persona-text-xs persona-font-medium persona-cursor-pointer persona-text-persona-muted");n.type="button",n.setAttribute("data-expand-header","true"),n.setAttribute("data-bubble-type","approval"),e?.descriptionColor&&(n.style.color=e.descriptionColor);let p=a("span");p.setAttribute("data-approval-details-label","true");let b=a("span","persona-inline-flex persona-items-center");b.setAttribute("data-approval-details-chevron","true"),n.append(p,b),j(n,s,r),m.appendChild(n);let c=a("div");if(c.setAttribute("data-approval-details","true"),c.style.display=s?"":"none",M){let d=a("p","persona-text-sm persona-mt-1 persona-text-persona-muted");e?.descriptionColor&&(d.style.color=e.descriptionColor),d.textContent=o.description,c.appendChild(d)}if(o.parameters){let d=a("pre","persona-mt-2 persona-text-xs persona-p-2 persona-rounded persona-overflow-x-auto persona-max-h-32 persona-bg-persona-container persona-text-persona-primary");e?.parameterBackgroundColor&&(d.style.backgroundColor=e.parameterBackgroundColor),e?.parameterTextColor&&(d.style.color=e.parameterTextColor),d.style.fontSize="0.75rem",d.style.lineHeight="1rem",d.textContent=P(o.parameters),c.appendChild(d)}m.appendChild(c)}if(u){let s=a("div","persona-flex persona-gap-2 persona-mt-2");s.setAttribute("data-approval-buttons","true");let n=a("button","persona-inline-flex persona-items-center persona-px-3 persona-py-1.5 persona-rounded-md persona-text-xs persona-font-medium persona-border-none persona-cursor-pointer");n.type="button",n.style.backgroundColor=e?.approveButtonColor??"var(--persona-approval-approve-bg, #22c55e)",n.style.color=e?.approveButtonTextColor??"#ffffff",n.setAttribute("data-approval-action","approve");let p=x(K,14,e?.approveButtonTextColor??"#ffffff",2);p&&(p.style.marginRight="4px",n.appendChild(p));let b=document.createTextNode(e?.approveLabel??"Approve");n.appendChild(b);let c=a("button","persona-inline-flex persona-items-center persona-px-3 persona-py-1.5 persona-rounded-md persona-text-xs persona-font-medium persona-cursor-pointer");c.type="button",c.style.backgroundColor=e?.denyButtonColor??"transparent",c.style.color=e?.denyButtonTextColor??"var(--persona-feedback-error, #dc2626)",c.style.border=`1px solid ${e?.denyButtonTextColor?e.denyButtonTextColor:"var(--persona-palette-colors-error-200, #fca5a5)"}`,c.setAttribute("data-approval-action","deny");let d=x(_,14,e?.denyButtonTextColor??"var(--persona-feedback-error, #dc2626)",2);d&&(d.style.marginRight="4px",c.appendChild(d));let L=document.createTextNode(e?.denyLabel??"Deny");c.appendChild(L),s.append(n,c),m.appendChild(s)}return g.append(l,m),i.appendChild(g),i};import{Ban as oe,ChevronDown as G,ShieldCheck as ne}from"lucide";var re=()=>({keyHandlers:new Map,popovers:new Map,pendingOrder:[],latestPendingApprovalId:null}),J=(t,r)=>{let o=t.keyHandlers.get(r);o&&(document.removeEventListener("keydown",o),t.keyHandlers.delete(r));let e=t.popovers.get(r);e&&(e.destroy(),t.popovers.delete(r))},T=(t,r)=>{J(t,r);let o=t.pendingOrder.indexOf(r);o!==-1&&t.pendingOrder.splice(o,1),t.latestPendingApprovalId===r&&(t.latestPendingApprovalId=t.pendingOrder.length?t.pendingOrder[t.pendingOrder.length-1]:null)},ae=t=>t?.approval!==!1?t?.approval:void 0,se=(t,r)=>{let o=r?.detailsDisplay??"collapsed";return k.get(t)??o==="expanded"},U=t=>{let r=a("span","persona-approval-kbd");return r.textContent=t,r},pe=(t,r)=>{let o=a("span","persona-approval-title");r?.titleColor&&(o.style.color=r.titleColor);let u=t.toolType==="webmcp"||t.toolName.startsWith(E)?I(t.toolName):void 0,i=r?.formatDescription?.({toolName:t.toolName,toolType:t.toolType,description:t.description??"",parameters:t.parameters,...u?{displayTitle:u}:{},...t.reason?{reason:t.reason}:{}});if(i)return o.textContent=i,o;let g=u??B(t.toolName),l=t.toolType&&t.toolType!=="webmcp"?t.toolType:null;o.append("The assistant wants to use ");let v=document.createElement("strong");if(v.textContent=g,o.appendChild(v),l){o.append(" from ");let C=document.createElement("strong");C.textContent=l,o.appendChild(C)}return o},le=t=>{let r=a("div","persona-approval-resolved"),o=x(oe,15,"currentColor",2);o&&r.appendChild(o);let e=a("span","persona-approval-resolved-name");return e.textContent=t.toolName?B(t.toolName):"Tool",r.append(e,document.createTextNode(t.status==="timeout"?" timed out":" denied")),r},ie=(t,r,o,e,u,i,g)=>{let l=a("div","persona-approval-card persona-shadow-sm");l.id=`bubble-${r.id}`,l.setAttribute("data-message-id",r.id),l.setAttribute("data-bubble-type","approval"),e?.backgroundColor&&(l.style.background=e.backgroundColor),e?.borderColor&&(l.style.borderColor=e.borderColor),e?.shadow!==void 0&&(l.style.boxShadow=e.shadow.trim()===""?"none":e.shadow);let v=e?.detailsDisplay??"collapsed",C=!!o.description&&v!=="hidden",A=o.parameters!=null&&v!=="hidden",m=C||A,f=m&&se(r.id,e),w=e?.showDetailsLabel??"Show details",O=e?.hideDetailsLabel??"Hide details",y=a("button","persona-approval-head");y.type="button",m?(y.setAttribute("data-action","toggle-params"),y.setAttribute("aria-expanded",f?"true":"false"),y.setAttribute("aria-label",f?O:w)):y.setAttribute("data-static","true");let N=a("span","persona-approval-logo"),D=x(ne,16,"currentColor",2);D&&N.appendChild(D),y.appendChild(N);let H=pe(o,e);if(m){let n=a("span","persona-approval-toggle");n.setAttribute("aria-hidden","true");let p=x(G,14,"currentColor",2);p&&n.appendChild(p),H.append(" "),H.appendChild(n)}y.appendChild(H),l.appendChild(y);let h=a("div","persona-approval-body");if(m){let n=a("div","persona-approval-details");if(n.setAttribute("data-role","params"),n.hidden=!f,C){let p=a("p","persona-approval-desc");e?.descriptionColor&&(p.style.color=e.descriptionColor),p.textContent=o.description,n.appendChild(p)}if(A){let p=a("pre","persona-approval-params");e?.parameterBackgroundColor&&(p.style.background=e.parameterBackgroundColor),e?.parameterTextColor&&(p.style.color=e.parameterTextColor),p.textContent=P(o.parameters),n.appendChild(p)}h.appendChild(n)}if(o.reason){let n=a("p","persona-approval-reason");e?.reasonColor?n.style.color=e.reasonColor:e?.descriptionColor&&(n.style.color=e.descriptionColor);let p=a("span","persona-approval-reason-label");p.textContent=`${e?.reasonLabel??"Agent's stated reason:"} `,n.append(p,document.createTextNode(o.reason)),h.appendChild(n)}let W=a("div","persona-approval-actions"),M=null,S=n=>{e?.approveButtonColor&&(n.style.background=e.approveButtonColor),e?.approveButtonTextColor&&(n.style.color=e.approveButtonTextColor)},s=a("button","persona-approval-deny");if(s.type="button",s.setAttribute("data-action","deny"),e?.denyButtonColor&&(s.style.background=e.denyButtonColor),e?.denyButtonTextColor&&(s.style.color=e.denyButtonTextColor),s.append(e?.denyLabel??"Deny"),g){let n=a("div","persona-approval-split"),p=a("button","persona-approval-primary");p.type="button",p.setAttribute("data-action","always"),S(p),p.append(e?.approveLabel??"Always allow",U("\u23CE"));let b=a("button","persona-approval-caret");b.type="button",b.setAttribute("data-action","toggle-menu"),b.setAttribute("aria-label","More options"),S(b);let c=x(G,15,"currentColor",2);c&&b.appendChild(c),n.append(p,b),W.append(n,s),s.append(U("Esc"));let d=a("div","persona-approval-menu"),L=a("button","persona-approval-menu-item");L.type="button",L.append("Allow once",U("\u2318\u23CE")),d.appendChild(L),M=q({anchor:n,content:d,placement:"bottom-start",matchAnchorWidth:!0}),t.popovers.set(r.id,M),L.addEventListener("click",()=>{T(t,r.id),u()})}else{let n=a("button","persona-approval-primary persona-approval-primary--solo");n.type="button",n.setAttribute("data-action","allow"),S(n),n.append(e?.approveLabel??"Allow"),W.append(n,s)}return h.appendChild(W),l.appendChild(h),l.addEventListener("click",n=>{let p=n.target instanceof Element?n.target.closest("[data-action]"):null;if(!p)return;let b=p.getAttribute("data-action");if(b==="toggle-params"){let c=l.querySelector('[data-role="params"]');if(c){let d=c.hidden;c.hidden=!d,y.setAttribute("aria-expanded",d?"true":"false"),y.setAttribute("aria-label",d?O:w),k.set(r.id,d)}return}if(b==="toggle-menu"){M?.toggle();return}if(b==="always"){T(t,r.id),u({remember:!0});return}if(b==="allow"){T(t,r.id),u();return}if(b==="deny"){T(t,r.id),i();return}}),l},Q=()=>{let t=re();return{plugin:{id:"persona-built-in-approval",renderApproval:({message:e,approve:u,deny:i,config:g})=>{let l=e?.approval;if(!l)return null;let v=ae(g);if(l.status!=="pending"){if(T(t,e.id),l.status==="approved"){let m=document.createElement("div");return m.style.display="none",m}return le(l)}J(t,e.id);let C=v?.enableAlwaysAllow===!0,A=ie(t,e,l,v,u,i,C);if(C){t.pendingOrder.includes(e.id)||t.pendingOrder.push(e.id),t.latestPendingApprovalId=t.pendingOrder[t.pendingOrder.length-1];let m=f=>{$(f)||e.id===t.latestPendingApprovalId&&(f.key!=="Escape"&&f.key!=="Enter"||(f.preventDefault(),f.stopImmediatePropagation(),T(t,e.id),f.key==="Escape"?i():f.metaKey||f.ctrlKey?u():u({remember:!0})))};t.keyHandlers.set(e.id,m),document.addEventListener("keydown",m)}return A}},teardown:()=>{for(let e of[...t.keyHandlers.keys(),...t.popovers.keys()])T(t,e);t.latestPendingApprovalId=null}}};export{k as approvalDetailsExpansionState,Z as createApprovalBubble,Q as createBuiltInApprovalPlugin,B as humanizeToolName,z as initApprovalUi,V as updateApprovalDetailsUI};