opencode-subagents-sidebar-plugin 0.1.5 → 0.1.6

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.
package/dist/tui.js CHANGED
@@ -10,9 +10,9 @@ import { createElement as _$createElement } from "@opentui/solid";
10
10
  /** @jsxImportSource @opentui/solid */
11
11
 
12
12
  import { Portal, useTerminalDimensions } from "@opentui/solid";
13
- import { elapsedLabel } from "./activity.js";
13
+ import { elapsedLabel, latestAssistantActivity } from "./activity.js";
14
14
  import { placePopover } from "./popover.js";
15
- import { canOpenTaskSession, isTaskPart, isVisibleTask, latestAssistantText, resolveTaskModel, taskAgent, taskDescription, taskModeLabel, taskModelLabel, taskSessionID, taskStatusLabel, taskVariantLabel } from "./tasks.js";
15
+ import { canOpenTaskSession, isTaskPart, isVisibleTask, resolveTaskModel, taskAgent, taskDescription, taskModeLabel, taskModelLabel, taskSessionID, taskStatusLabel, taskVariantLabel } from "./tasks.js";
16
16
  import { createEffect, createMemo, createSignal, For, on, onCleanup, onMount, Show } from "solid-js";
17
17
  const POPOVER_SIZE = {
18
18
  width: 52,
@@ -33,7 +33,6 @@ function TaskPopover(props) {
33
33
  const callID = () => props.ownership().callID;
34
34
  let portalWrapper;
35
35
  let hydrationRequest = 0;
36
- let requestedHydration;
37
36
  const fallback = () => {
38
37
  const known = props.fallbackFor(callID());
39
38
  if (known) return known;
@@ -66,17 +65,14 @@ function TaskPopover(props) {
66
65
  if (!sessionID) return undefined;
67
66
  const messages = props.api.state.session.messages(sessionID);
68
67
  const parts = new Map();
69
- let hasParts = false;
70
68
  for (const message of messages) {
71
69
  const messageParts = props.api.state.part(message.id);
72
70
  parts.set(message.id, messageParts);
73
- if (messageParts.length) hasParts = true;
74
71
  }
75
72
  return {
76
73
  sessionID,
77
74
  messages,
78
- parts,
79
- hasParts
75
+ parts
80
76
  };
81
77
  });
82
78
  const ownsHydration = (token, sessionID, request) => {
@@ -92,34 +88,24 @@ function TaskPopover(props) {
92
88
  throwOnError: true
93
89
  });
94
90
  if (!ownsHydration(token, sessionID, request)) return;
95
- if (liveChildMessages()?.hasParts) return;
96
91
  setHydratedChildMessages({
97
92
  token,
98
93
  sessionID,
99
94
  messages: result.data
100
95
  });
101
- } catch {
102
- if (ownsHydration(token, sessionID, request)) requestedHydration = undefined;
103
- }
96
+ } catch {}
104
97
  };
105
98
  createEffect(() => {
99
+ props.revision();
100
+ props.now();
106
101
  const ownership = props.ownership();
107
102
  const sessionID = childSessionID();
108
- const live = liveChildMessages();
109
- if (!sessionID || live?.hasParts) {
110
- if (requestedHydration) {
111
- requestedHydration = undefined;
112
- hydrationRequest += 1;
113
- }
103
+ if (!sessionID) {
104
+ hydrationRequest += 1;
105
+ setHydratedChildMessages(undefined);
114
106
  return;
115
107
  }
116
- if (requestedHydration?.token === ownership.token && requestedHydration.sessionID === sessionID) return;
117
108
  const request = ++hydrationRequest;
118
- requestedHydration = {
119
- token: ownership.token,
120
- sessionID
121
- };
122
- setHydratedChildMessages(undefined);
123
109
  void hydrateChildMessages(ownership.token, sessionID, request);
124
110
  });
125
111
  const latestResponse = createMemo(() => {
@@ -127,14 +113,17 @@ function TaskPopover(props) {
127
113
  const sessionID = childSessionID();
128
114
  if (!sessionID) return undefined;
129
115
  const live = liveChildMessages();
130
- if (live?.hasParts) return latestAssistantText(live.messages, messageID => live.parts.get(messageID) ?? []);
116
+ const liveActivity = live ? latestAssistantActivity(live.messages, messageID => live.parts.get(messageID) ?? []) : undefined;
117
+ if (liveActivity) return liveActivity;
131
118
  const hydrated = hydratedChildMessages();
132
119
  if (!hydrated || hydrated.token !== ownership.token || hydrated.sessionID !== sessionID) return undefined;
133
120
  const parts = new Map(hydrated.messages.map(message => [message.info.id, message.parts]));
134
- return latestAssistantText(hydrated.messages.map(message => message.info), messageID => parts.get(messageID) ?? []);
121
+ return latestAssistantActivity(hydrated.messages.map(message => message.info), messageID => parts.get(messageID) ?? []);
135
122
  });
136
- const responseLabel = () => latestResponse() ?? (childSessionID() ? "Waiting for assistant response" : "Waiting for child session");
137
- const openSession = () => {
123
+ const responseLabel = () => latestResponse() ?? (childSessionID() ? "Waiting for subagent activity" : "Waiting for child session");
124
+ const stopInside = event => event.stopPropagation();
125
+ const openSession = event => {
126
+ event.stopPropagation();
138
127
  const sessionID = childSessionID();
139
128
  if (!canOpen() || !sessionID) return;
140
129
  props.api.route.navigate("session", {
@@ -142,21 +131,24 @@ function TaskPopover(props) {
142
131
  });
143
132
  props.close();
144
133
  };
145
- const applyPortalPlacement = (next = placement()) => {
134
+ const closePopover = event => {
135
+ event.stopPropagation();
136
+ props.close();
137
+ };
138
+ const applyPortalOverlay = (next = viewport()) => {
146
139
  const wrapper = portalWrapper;
147
140
  if (!wrapper || wrapper.isDestroyed) return;
148
141
  wrapper.position = "absolute";
149
- wrapper.left = next.left;
150
- wrapper.top = next.top;
142
+ wrapper.left = 0;
143
+ wrapper.top = 0;
151
144
  wrapper.width = next.width;
152
145
  wrapper.height = next.height;
153
146
  wrapper.zIndex = POPOVER_Z_INDEX;
154
147
  wrapper.focusable = false;
155
148
  };
156
- createEffect(() => applyPortalPlacement(placement()));
149
+ createEffect(() => applyPortalOverlay(viewport()));
157
150
  onCleanup(() => {
158
151
  hydrationRequest += 1;
159
- requestedHydration = undefined;
160
152
  portalWrapper = undefined;
161
153
  });
162
154
  return _$createComponent(Portal, {
@@ -165,124 +157,138 @@ function TaskPopover(props) {
165
157
  },
166
158
  ref: element => {
167
159
  portalWrapper = element;
168
- applyPortalPlacement();
160
+ applyPortalOverlay();
169
161
  },
170
162
  get children() {
171
163
  var _el$ = _$createElement("box"),
172
- _el$2 = _$createElement("text"),
173
- _el$3 = _$createElement("b"),
174
- _el$5 = _$createElement("text"),
175
- _el$6 = _$createTextNode(`Agent: `),
176
- _el$7 = _$createElement("text"),
177
- _el$8 = _$createTextNode(`Assigned: `),
178
- _el$9 = _$createElement("text"),
179
- _el$0 = _$createTextNode(`Latest: `),
180
- _el$1 = _$createElement("text"),
181
- _el$10 = _$createTextNode(`Status: `),
182
- _el$11 = _$createElement("text"),
183
- _el$12 = _$createTextNode(`Model: `),
184
- _el$13 = _$createTextNode(` · `),
185
- _el$14 = _$createElement("text"),
186
- _el$15 = _$createTextNode(` · `),
187
- _el$16 = _$createElement("text"),
188
- _el$17 = _$createTextNode(`Child: `),
189
- _el$18 = _$createElement("box"),
164
+ _el$2 = _$createElement("box"),
165
+ _el$3 = _$createElement("text"),
166
+ _el$4 = _$createElement("b"),
167
+ _el$6 = _$createElement("text"),
168
+ _el$7 = _$createTextNode(`Agent: `),
169
+ _el$8 = _$createElement("text"),
170
+ _el$9 = _$createTextNode(`Assigned: `),
171
+ _el$0 = _$createElement("text"),
172
+ _el$1 = _$createTextNode(`Current: `),
173
+ _el$10 = _$createElement("text"),
174
+ _el$11 = _$createTextNode(`Status: `),
175
+ _el$12 = _$createElement("text"),
176
+ _el$13 = _$createTextNode(`Model: `),
177
+ _el$14 = _$createTextNode(` · `),
178
+ _el$15 = _$createElement("text"),
179
+ _el$16 = _$createTextNode(` · `),
180
+ _el$17 = _$createElement("text"),
181
+ _el$18 = _$createTextNode(`Child: `),
190
182
  _el$19 = _$createElement("box"),
191
- _el$20 = _$createElement("text"),
192
- _el$21 = _$createElement("b"),
193
- _el$23 = _$createElement("box"),
194
- _el$24 = _$createElement("text"),
195
- _el$25 = _$createElement("b");
183
+ _el$20 = _$createElement("box"),
184
+ _el$21 = _$createElement("text"),
185
+ _el$22 = _$createElement("b"),
186
+ _el$24 = _$createElement("box"),
187
+ _el$25 = _$createElement("text"),
188
+ _el$26 = _$createElement("b");
196
189
  _$insertNode(_el$, _el$2);
197
- _$insertNode(_el$, _el$5);
198
- _$insertNode(_el$, _el$7);
199
- _$insertNode(_el$, _el$9);
200
- _$insertNode(_el$, _el$1);
201
- _$insertNode(_el$, _el$11);
202
- _$insertNode(_el$, _el$14);
203
- _$insertNode(_el$, _el$16);
204
- _$insertNode(_el$, _el$18);
205
190
  _$setProp(_el$, "width", "100%");
206
191
  _$setProp(_el$, "height", "100%");
207
192
  _$setProp(_el$, "focusable", false);
208
- _$setProp(_el$, "live", true);
209
- _$setProp(_el$, "border", true);
210
- _$setProp(_el$, "padding", 1);
211
- _$setProp(_el$, "flexDirection", "column");
212
- _$setProp(_el$, "overflow", "hidden");
213
193
  _$insertNode(_el$2, _el$3);
214
- _$setProp(_el$2, "wrapMode", "none");
215
- _$setProp(_el$2, "truncate", true);
216
- _$insertNode(_el$3, _$createTextNode(`Subagent details`));
217
- _$insertNode(_el$5, _el$6);
218
- _$setProp(_el$5, "wrapMode", "none");
219
- _$setProp(_el$5, "truncate", true);
220
- _$insert(_el$5, () => taskAgent(part() ?? fallback().part), null);
221
- _$insertNode(_el$7, _el$8);
222
- _$setProp(_el$7, "wrapMode", "none");
223
- _$setProp(_el$7, "truncate", true);
224
- _$insert(_el$7, () => taskDescription(part() ?? fallback().part), null);
225
- _$insertNode(_el$9, _el$0);
226
- _$setProp(_el$9, "wrapMode", "none");
227
- _$setProp(_el$9, "truncate", true);
228
- _$insert(_el$9, responseLabel, null);
229
- _$insertNode(_el$1, _el$10);
230
- _$setProp(_el$1, "wrapMode", "none");
231
- _$setProp(_el$1, "truncate", true);
232
- _$insert(_el$1, () => taskStatusLabel(part() ?? fallback().part, childSessionID() ? props.api.state.session.status(childSessionID()) : undefined), null);
233
- _$insertNode(_el$11, _el$12);
234
- _$insertNode(_el$11, _el$13);
235
- _$setProp(_el$11, "wrapMode", "none");
236
- _$setProp(_el$11, "truncate", true);
237
- _$insert(_el$11, () => modelName(props.api, model()), _el$13);
238
- _$insert(_el$11, () => taskVariantLabel(model()) ?? "pending", null);
239
- _$insertNode(_el$14, _el$15);
240
- _$setProp(_el$14, "wrapMode", "none");
241
- _$setProp(_el$14, "truncate", true);
242
- _$insert(_el$14, () => taskModeLabel(part() ?? fallback().part), _el$15);
243
- _$insert(_el$14, () => elapsedLabel(props.now() - props.startedAt(part() ?? fallback().part)), null);
244
- _$insertNode(_el$16, _el$17);
245
- _$setProp(_el$16, "wrapMode", "none");
246
- _$setProp(_el$16, "truncate", true);
247
- _$insert(_el$16, () => childSessionID() ?? "Waiting for child session", null);
248
- _$insertNode(_el$18, _el$19);
249
- _$insertNode(_el$18, _el$23);
250
- _$setProp(_el$18, "flexDirection", "row");
251
- _$setProp(_el$18, "gap", 2);
194
+ _$insertNode(_el$2, _el$6);
195
+ _$insertNode(_el$2, _el$8);
196
+ _$insertNode(_el$2, _el$0);
197
+ _$insertNode(_el$2, _el$10);
198
+ _$insertNode(_el$2, _el$12);
199
+ _$insertNode(_el$2, _el$15);
200
+ _$insertNode(_el$2, _el$17);
201
+ _$insertNode(_el$2, _el$19);
202
+ _$setProp(_el$2, "position", "absolute");
203
+ _$setProp(_el$2, "focusable", false);
204
+ _$setProp(_el$2, "live", true);
205
+ _$setProp(_el$2, "border", true);
206
+ _$setProp(_el$2, "padding", 1);
207
+ _$setProp(_el$2, "flexDirection", "column");
208
+ _$setProp(_el$2, "overflow", "hidden");
209
+ _$setProp(_el$2, "onMouseUp", stopInside);
210
+ _$insertNode(_el$3, _el$4);
211
+ _$setProp(_el$3, "wrapMode", "none");
212
+ _$setProp(_el$3, "truncate", true);
213
+ _$insertNode(_el$4, _$createTextNode(`Subagent details`));
214
+ _$insertNode(_el$6, _el$7);
215
+ _$setProp(_el$6, "wrapMode", "none");
216
+ _$setProp(_el$6, "truncate", true);
217
+ _$insert(_el$6, () => taskAgent(part() ?? fallback().part), null);
218
+ _$insertNode(_el$8, _el$9);
219
+ _$setProp(_el$8, "wrapMode", "none");
220
+ _$setProp(_el$8, "truncate", true);
221
+ _$insert(_el$8, () => taskDescription(part() ?? fallback().part), null);
222
+ _$insertNode(_el$0, _el$1);
223
+ _$setProp(_el$0, "wrapMode", "none");
224
+ _$setProp(_el$0, "truncate", true);
225
+ _$insert(_el$0, responseLabel, null);
226
+ _$insertNode(_el$10, _el$11);
227
+ _$setProp(_el$10, "wrapMode", "none");
228
+ _$setProp(_el$10, "truncate", true);
229
+ _$insert(_el$10, () => taskStatusLabel(part() ?? fallback().part, childSessionID() ? props.api.state.session.status(childSessionID()) : undefined), null);
230
+ _$insertNode(_el$12, _el$13);
231
+ _$insertNode(_el$12, _el$14);
232
+ _$setProp(_el$12, "wrapMode", "none");
233
+ _$setProp(_el$12, "truncate", true);
234
+ _$insert(_el$12, () => modelName(props.api, model()), _el$14);
235
+ _$insert(_el$12, () => taskVariantLabel(model()) ?? "pending", null);
236
+ _$insertNode(_el$15, _el$16);
237
+ _$setProp(_el$15, "wrapMode", "none");
238
+ _$setProp(_el$15, "truncate", true);
239
+ _$insert(_el$15, () => taskModeLabel(part() ?? fallback().part), _el$16);
240
+ _$insert(_el$15, () => elapsedLabel(props.now() - props.startedAt(part() ?? fallback().part)), null);
241
+ _$insertNode(_el$17, _el$18);
242
+ _$setProp(_el$17, "wrapMode", "none");
243
+ _$setProp(_el$17, "truncate", true);
244
+ _$insert(_el$17, () => childSessionID() ?? "Waiting for child session", null);
252
245
  _$insertNode(_el$19, _el$20);
253
- _$setProp(_el$19, "onMouseUp", openSession);
246
+ _$insertNode(_el$19, _el$24);
247
+ _$setProp(_el$19, "flexDirection", "row");
248
+ _$setProp(_el$19, "gap", 2);
254
249
  _$insertNode(_el$20, _el$21);
255
- _$insertNode(_el$21, _$createTextNode(`Open Session`));
256
- _$insertNode(_el$23, _el$24);
250
+ _$setProp(_el$20, "onMouseUp", openSession);
251
+ _$insertNode(_el$21, _el$22);
252
+ _$insertNode(_el$22, _$createTextNode(`Open Session`));
257
253
  _$insertNode(_el$24, _el$25);
258
- _$insertNode(_el$25, _$createTextNode(`Close`));
254
+ _$setProp(_el$24, "onMouseUp", closePopover);
255
+ _$insertNode(_el$25, _el$26);
256
+ _$insertNode(_el$26, _$createTextNode(`Close`));
259
257
  _$effect(_p$ => {
260
- var _v$ = props.api.theme.current.borderActive,
261
- _v$2 = props.api.theme.current.backgroundPanel,
262
- _v$3 = props.api.theme.current.text,
263
- _v$4 = props.api.theme.current.text,
264
- _v$5 = props.api.theme.current.textMuted,
265
- _v$6 = props.api.theme.current.textMuted,
266
- _v$7 = props.api.theme.current.textMuted,
267
- _v$8 = props.api.theme.current.textMuted,
268
- _v$9 = props.api.theme.current.textMuted,
258
+ var _v$ = props.close,
259
+ _v$2 = placement().left,
260
+ _v$3 = placement().top,
261
+ _v$4 = placement().width,
262
+ _v$5 = placement().height,
263
+ _v$6 = props.api.theme.current.borderActive,
264
+ _v$7 = props.api.theme.current.backgroundPanel,
265
+ _v$8 = props.api.theme.current.text,
266
+ _v$9 = props.api.theme.current.text,
269
267
  _v$0 = props.api.theme.current.textMuted,
270
- _v$1 = canOpen() ? props.api.theme.current.primary : props.api.theme.current.textMuted,
271
- _v$10 = props.close,
272
- _v$11 = props.api.theme.current.primary;
273
- _v$ !== _p$.e && (_p$.e = _$setProp(_el$, "borderColor", _v$, _p$.e));
274
- _v$2 !== _p$.t && (_p$.t = _$setProp(_el$, "backgroundColor", _v$2, _p$.t));
275
- _v$3 !== _p$.a && (_p$.a = _$setProp(_el$2, "fg", _v$3, _p$.a));
276
- _v$4 !== _p$.o && (_p$.o = _$setProp(_el$5, "fg", _v$4, _p$.o));
277
- _v$5 !== _p$.i && (_p$.i = _$setProp(_el$7, "fg", _v$5, _p$.i));
278
- _v$6 !== _p$.n && (_p$.n = _$setProp(_el$9, "fg", _v$6, _p$.n));
279
- _v$7 !== _p$.s && (_p$.s = _$setProp(_el$1, "fg", _v$7, _p$.s));
280
- _v$8 !== _p$.h && (_p$.h = _$setProp(_el$11, "fg", _v$8, _p$.h));
281
- _v$9 !== _p$.r && (_p$.r = _$setProp(_el$14, "fg", _v$9, _p$.r));
282
- _v$0 !== _p$.d && (_p$.d = _$setProp(_el$16, "fg", _v$0, _p$.d));
283
- _v$1 !== _p$.l && (_p$.l = _$setProp(_el$20, "fg", _v$1, _p$.l));
284
- _v$10 !== _p$.u && (_p$.u = _$setProp(_el$23, "onMouseUp", _v$10, _p$.u));
285
- _v$11 !== _p$.c && (_p$.c = _$setProp(_el$24, "fg", _v$11, _p$.c));
268
+ _v$1 = props.api.theme.current.textMuted,
269
+ _v$10 = props.api.theme.current.textMuted,
270
+ _v$11 = props.api.theme.current.textMuted,
271
+ _v$12 = props.api.theme.current.textMuted,
272
+ _v$13 = props.api.theme.current.textMuted,
273
+ _v$14 = canOpen() ? props.api.theme.current.primary : props.api.theme.current.textMuted,
274
+ _v$15 = props.api.theme.current.primary;
275
+ _v$ !== _p$.e && (_p$.e = _$setProp(_el$, "onMouseUp", _v$, _p$.e));
276
+ _v$2 !== _p$.t && (_p$.t = _$setProp(_el$2, "left", _v$2, _p$.t));
277
+ _v$3 !== _p$.a && (_p$.a = _$setProp(_el$2, "top", _v$3, _p$.a));
278
+ _v$4 !== _p$.o && (_p$.o = _$setProp(_el$2, "width", _v$4, _p$.o));
279
+ _v$5 !== _p$.i && (_p$.i = _$setProp(_el$2, "height", _v$5, _p$.i));
280
+ _v$6 !== _p$.n && (_p$.n = _$setProp(_el$2, "borderColor", _v$6, _p$.n));
281
+ _v$7 !== _p$.s && (_p$.s = _$setProp(_el$2, "backgroundColor", _v$7, _p$.s));
282
+ _v$8 !== _p$.h && (_p$.h = _$setProp(_el$3, "fg", _v$8, _p$.h));
283
+ _v$9 !== _p$.r && (_p$.r = _$setProp(_el$6, "fg", _v$9, _p$.r));
284
+ _v$0 !== _p$.d && (_p$.d = _$setProp(_el$8, "fg", _v$0, _p$.d));
285
+ _v$1 !== _p$.l && (_p$.l = _$setProp(_el$0, "fg", _v$1, _p$.l));
286
+ _v$10 !== _p$.u && (_p$.u = _$setProp(_el$10, "fg", _v$10, _p$.u));
287
+ _v$11 !== _p$.c && (_p$.c = _$setProp(_el$12, "fg", _v$11, _p$.c));
288
+ _v$12 !== _p$.w && (_p$.w = _$setProp(_el$15, "fg", _v$12, _p$.w));
289
+ _v$13 !== _p$.m && (_p$.m = _$setProp(_el$17, "fg", _v$13, _p$.m));
290
+ _v$14 !== _p$.f && (_p$.f = _$setProp(_el$21, "fg", _v$14, _p$.f));
291
+ _v$15 !== _p$.y && (_p$.y = _$setProp(_el$25, "fg", _v$15, _p$.y));
286
292
  return _p$;
287
293
  }, {
288
294
  e: undefined,
@@ -297,12 +303,90 @@ function TaskPopover(props) {
297
303
  d: undefined,
298
304
  l: undefined,
299
305
  u: undefined,
300
- c: undefined
306
+ c: undefined,
307
+ w: undefined,
308
+ m: undefined,
309
+ f: undefined,
310
+ y: undefined
301
311
  });
302
312
  return _el$;
303
313
  }
304
314
  });
305
315
  }
316
+ function ModelVariant(props) {
317
+ return (() => {
318
+ var _el$28 = _$createElement("box"),
319
+ _el$29 = _$createElement("text");
320
+ _$insertNode(_el$28, _el$29);
321
+ _$setProp(_el$28, "flexShrink", 1);
322
+ _$setProp(_el$28, "minWidth", 0);
323
+ _$setProp(_el$28, "maxWidth", 28);
324
+ _$setProp(_el$28, "marginLeft", 1);
325
+ _$setProp(_el$28, "flexDirection", "row");
326
+ _$setProp(_el$29, "flexGrow", 1);
327
+ _$setProp(_el$29, "flexShrink", 1);
328
+ _$setProp(_el$29, "minWidth", 0);
329
+ _$setProp(_el$29, "wrapMode", "none");
330
+ _$setProp(_el$29, "truncate", true);
331
+ _$insert(_el$29, () => modelName(props.api, props.model()));
332
+ _$insert(_el$28, _$createComponent(Show, {
333
+ get when() {
334
+ return taskVariantLabel(props.model());
335
+ },
336
+ get fallback() {
337
+ return _$createComponent(Show, {
338
+ get when() {
339
+ return props.model();
340
+ },
341
+ get children() {
342
+ return [(() => {
343
+ var _el$30 = _$createElement("text");
344
+ _$insertNode(_el$30, _$createTextNode(`·`));
345
+ _$setProp(_el$30, "flexShrink", 0);
346
+ _$setProp(_el$30, "marginLeft", 1);
347
+ _$setProp(_el$30, "wrapMode", "none");
348
+ _$effect(_$p => _$setProp(_el$30, "fg", props.api.theme.current.textMuted, _$p));
349
+ return _el$30;
350
+ })(), (() => {
351
+ var _el$32 = _$createElement("text"),
352
+ _el$33 = _$createElement("b");
353
+ _$insertNode(_el$32, _el$33);
354
+ _$setProp(_el$32, "flexShrink", 0);
355
+ _$setProp(_el$32, "marginLeft", 1);
356
+ _$setProp(_el$32, "wrapMode", "none");
357
+ _$setProp(_el$32, "truncate", true);
358
+ _$insertNode(_el$33, _$createTextNode(`pending`));
359
+ _$effect(_$p => _$setProp(_el$32, "fg", props.api.theme.current.warning, _$p));
360
+ return _el$32;
361
+ })()];
362
+ }
363
+ });
364
+ },
365
+ children: variant => [(() => {
366
+ var _el$35 = _$createElement("text");
367
+ _$insertNode(_el$35, _$createTextNode(`·`));
368
+ _$setProp(_el$35, "flexShrink", 0);
369
+ _$setProp(_el$35, "marginLeft", 1);
370
+ _$setProp(_el$35, "wrapMode", "none");
371
+ _$effect(_$p => _$setProp(_el$35, "fg", props.api.theme.current.textMuted, _$p));
372
+ return _el$35;
373
+ })(), (() => {
374
+ var _el$37 = _$createElement("text"),
375
+ _el$38 = _$createElement("b");
376
+ _$insertNode(_el$37, _el$38);
377
+ _$setProp(_el$37, "flexShrink", 0);
378
+ _$setProp(_el$37, "marginLeft", 1);
379
+ _$setProp(_el$37, "wrapMode", "none");
380
+ _$setProp(_el$37, "truncate", true);
381
+ _$insert(_el$38, variant);
382
+ _$effect(_$p => _$setProp(_el$37, "fg", props.api.theme.current.warning, _$p));
383
+ return _el$37;
384
+ })()]
385
+ }), null);
386
+ _$effect(_$p => _$setProp(_el$29, "fg", props.api.theme.current.text, _$p));
387
+ return _el$28;
388
+ })();
389
+ }
306
390
  function TaskCard(props) {
307
391
  // The call ID is stable, while the actual ToolPart is re-read after each event.
308
392
  // This prevents cards from retaining a stale part object after a state update.
@@ -355,131 +439,85 @@ function TaskCard(props) {
355
439
  props.openPopup(props.callID, currentAnchor);
356
440
  };
357
441
  return (() => {
358
- var _el$27 = _$createElement("box"),
359
- _el$28 = _$createElement("box"),
360
- _el$29 = _$createElement("text"),
361
- _el$30 = _$createElement("b"),
362
- _el$31 = _$createElement("box"),
363
- _el$32 = _$createElement("text"),
364
- _el$33 = _$createElement("box"),
365
- _el$34 = _$createElement("text"),
366
- _el$35 = _$createElement("box"),
367
- _el$36 = _$createElement("text");
368
- _$insertNode(_el$27, _el$28);
369
- _$insertNode(_el$27, _el$33);
442
+ var _el$39 = _$createElement("box"),
443
+ _el$40 = _$createElement("box"),
444
+ _el$41 = _$createElement("text"),
445
+ _el$42 = _$createElement("b"),
446
+ _el$43 = _$createElement("box"),
447
+ _el$44 = _$createElement("text"),
448
+ _el$45 = _$createElement("box"),
449
+ _el$46 = _$createElement("text");
450
+ _$insertNode(_el$39, _el$40);
451
+ _$insertNode(_el$39, _el$43);
370
452
  _$use(element => {
371
453
  card = element;
372
454
  updateAnchor();
373
- }, _el$27);
374
- _$setProp(_el$27, "onSizeChange", updateAnchor);
375
- _$setProp(_el$27, "renderBefore", updateAnchor);
376
- _$setProp(_el$27, "width", "100%");
377
- _$setProp(_el$27, "height", 2);
378
- _$setProp(_el$27, "flexDirection", "column");
379
- _$setProp(_el$27, "overflow", "hidden");
380
- _$setProp(_el$27, "onMouseUp", openDetails);
381
- _$insertNode(_el$28, _el$29);
382
- _$insertNode(_el$28, _el$31);
383
- _$setProp(_el$28, "width", "100%");
384
- _$setProp(_el$28, "height", 1);
385
- _$setProp(_el$28, "flexDirection", "row");
386
- _$setProp(_el$28, "overflow", "hidden");
387
- _$insertNode(_el$29, _el$30);
388
- _$setProp(_el$29, "flexGrow", 1);
389
- _$setProp(_el$29, "flexShrink", 1);
390
- _$setProp(_el$29, "minWidth", 0);
391
- _$setProp(_el$29, "wrapMode", "none");
392
- _$setProp(_el$29, "truncate", true);
393
- _$insert(_el$30, (() => {
455
+ }, _el$39);
456
+ _$setProp(_el$39, "onSizeChange", updateAnchor);
457
+ _$setProp(_el$39, "renderBefore", updateAnchor);
458
+ _$setProp(_el$39, "width", "100%");
459
+ _$setProp(_el$39, "height", 2);
460
+ _$setProp(_el$39, "flexDirection", "column");
461
+ _$setProp(_el$39, "overflow", "hidden");
462
+ _$setProp(_el$39, "onMouseUp", openDetails);
463
+ _$insertNode(_el$40, _el$41);
464
+ _$setProp(_el$40, "width", "100%");
465
+ _$setProp(_el$40, "height", 1);
466
+ _$setProp(_el$40, "flexDirection", "row");
467
+ _$setProp(_el$40, "overflow", "hidden");
468
+ _$insertNode(_el$41, _el$42);
469
+ _$setProp(_el$41, "flexGrow", 1);
470
+ _$setProp(_el$41, "flexShrink", 1);
471
+ _$setProp(_el$41, "minWidth", 0);
472
+ _$setProp(_el$41, "wrapMode", "none");
473
+ _$setProp(_el$41, "truncate", true);
474
+ _$insert(_el$42, (() => {
394
475
  var _c$ = _$memo(() => !!part());
395
476
  return () => _c$() ? taskAgent(part()) : "subagent";
396
477
  })());
397
- _$insertNode(_el$31, _el$32);
398
- _$setProp(_el$31, "flexShrink", 1);
399
- _$setProp(_el$31, "minWidth", 0);
400
- _$setProp(_el$31, "maxWidth", 28);
401
- _$setProp(_el$31, "marginLeft", 1);
402
- _$setProp(_el$31, "flexDirection", "row");
403
- _$setProp(_el$32, "flexGrow", 1);
404
- _$setProp(_el$32, "flexShrink", 1);
405
- _$setProp(_el$32, "minWidth", 0);
406
- _$setProp(_el$32, "wrapMode", "none");
407
- _$setProp(_el$32, "truncate", true);
408
- _$insert(_el$32, () => modelName(props.api, model()));
409
- _$insert(_el$31, _$createComponent(Show, {
410
- get when() {
411
- return taskVariantLabel(model());
478
+ _$insert(_el$40, _$createComponent(ModelVariant, {
479
+ get api() {
480
+ return props.api;
412
481
  },
413
- get fallback() {
414
- return _$createComponent(Show, {
415
- get when() {
416
- return model();
417
- },
418
- get children() {
419
- var _el$37 = _$createElement("text");
420
- _$insertNode(_el$37, _$createTextNode(`· pending`));
421
- _$setProp(_el$37, "flexShrink", 0);
422
- _$setProp(_el$37, "marginLeft", 1);
423
- _$setProp(_el$37, "wrapMode", "none");
424
- _$setProp(_el$37, "truncate", true);
425
- _$effect(_$p => _$setProp(_el$37, "fg", props.api.theme.current.textMuted, _$p));
426
- return _el$37;
427
- }
428
- });
429
- },
430
- children: variant => (() => {
431
- var _el$39 = _$createElement("text"),
432
- _el$40 = _$createTextNode(`· `);
433
- _$insertNode(_el$39, _el$40);
434
- _$setProp(_el$39, "flexShrink", 0);
435
- _$setProp(_el$39, "marginLeft", 1);
436
- _$setProp(_el$39, "wrapMode", "none");
437
- _$setProp(_el$39, "truncate", true);
438
- _$insert(_el$39, variant, null);
439
- _$effect(_$p => _$setProp(_el$39, "fg", props.api.theme.current.textMuted, _$p));
440
- return _el$39;
441
- })()
482
+ model: model
442
483
  }), null);
443
- _$insertNode(_el$33, _el$34);
444
- _$insertNode(_el$33, _el$35);
445
- _$setProp(_el$33, "width", "100%");
446
- _$setProp(_el$33, "height", 1);
447
- _$setProp(_el$33, "flexDirection", "row");
448
- _$setProp(_el$33, "overflow", "hidden");
449
- _$setProp(_el$34, "flexGrow", 1);
450
- _$setProp(_el$34, "flexShrink", 1);
451
- _$setProp(_el$34, "minWidth", 0);
452
- _$setProp(_el$34, "wrapMode", "none");
453
- _$setProp(_el$34, "truncate", true);
454
- _$insert(_el$34, (() => {
484
+ _$insertNode(_el$43, _el$44);
485
+ _$insertNode(_el$43, _el$45);
486
+ _$setProp(_el$43, "width", "100%");
487
+ _$setProp(_el$43, "height", 1);
488
+ _$setProp(_el$43, "flexDirection", "row");
489
+ _$setProp(_el$43, "overflow", "hidden");
490
+ _$setProp(_el$44, "flexGrow", 1);
491
+ _$setProp(_el$44, "flexShrink", 1);
492
+ _$setProp(_el$44, "minWidth", 0);
493
+ _$setProp(_el$44, "wrapMode", "none");
494
+ _$setProp(_el$44, "truncate", true);
495
+ _$insert(_el$44, (() => {
455
496
  var _c$2 = _$memo(() => !!part());
456
497
  return () => _c$2() ? taskDescription(part()) : "Working";
457
498
  })());
458
- _$insertNode(_el$35, _el$36);
459
- _$setProp(_el$35, "width", 8);
460
- _$setProp(_el$35, "flexShrink", 0);
461
- _$setProp(_el$35, "flexDirection", "row");
462
- _$setProp(_el$35, "justifyContent", "flex-end");
463
- _$setProp(_el$36, "wrapMode", "none");
464
- _$setProp(_el$36, "truncate", true);
465
- _$insert(_el$36, elapsed);
499
+ _$insertNode(_el$45, _el$46);
500
+ _$setProp(_el$45, "width", 8);
501
+ _$setProp(_el$45, "flexShrink", 0);
502
+ _$setProp(_el$45, "flexDirection", "row");
503
+ _$setProp(_el$45, "justifyContent", "flex-end");
504
+ _$setProp(_el$46, "wrapMode", "none");
505
+ _$setProp(_el$46, "truncate", true);
506
+ _$insert(_el$46, elapsed);
466
507
  _$effect(_p$ => {
467
- var _v$12 = props.api.theme.current.text,
468
- _v$13 = props.api.theme.current.textMuted,
469
- _v$14 = props.api.theme.current.textMuted,
470
- _v$15 = props.api.theme.current.textMuted;
471
- _v$12 !== _p$.e && (_p$.e = _$setProp(_el$29, "fg", _v$12, _p$.e));
472
- _v$13 !== _p$.t && (_p$.t = _$setProp(_el$32, "fg", _v$13, _p$.t));
473
- _v$14 !== _p$.a && (_p$.a = _$setProp(_el$34, "fg", _v$14, _p$.a));
474
- _v$15 !== _p$.o && (_p$.o = _$setProp(_el$36, "fg", _v$15, _p$.o));
508
+ var _v$16 = props.api.theme.current.text,
509
+ _v$17 = props.api.theme.current.textMuted,
510
+ _v$18 = props.api.theme.current.textMuted;
511
+ _v$16 !== _p$.e && (_p$.e = _$setProp(_el$41, "fg", _v$16, _p$.e));
512
+ _v$17 !== _p$.t && (_p$.t = _$setProp(_el$44, "fg", _v$17, _p$.t));
513
+ _v$18 !== _p$.a && (_p$.a = _$setProp(_el$46, "fg", _v$18, _p$.a));
475
514
  return _p$;
476
515
  }, {
477
516
  e: undefined,
478
517
  t: undefined,
479
- a: undefined,
480
- o: undefined
518
+ a: undefined
481
519
  });
482
- return _el$27;
520
+ return _el$39;
483
521
  })();
484
522
  }
485
523
  function RunningSubagents(props) {
@@ -644,33 +682,39 @@ function RunningSubagents(props) {
644
682
  setOpenPopup(undefined);
645
683
  });
646
684
  return (() => {
647
- var _el$41 = _$createElement("box"),
648
- _el$42 = _$createElement("text"),
649
- _el$43 = _$createElement("b"),
650
- _el$45 = _$createElement("span");
651
- _$insertNode(_el$41, _el$42);
652
- _$setProp(_el$41, "overflow", "hidden");
653
- _$insertNode(_el$42, _el$43);
654
- _$insertNode(_el$42, _el$45);
655
- _$insertNode(_el$43, _$createTextNode(`Subagents`));
656
- _$insert(_el$45, (() => {
685
+ var _el$47 = _$createElement("box"),
686
+ _el$48 = _$createElement("text"),
687
+ _el$49 = _$createElement("b"),
688
+ _el$51 = _$createElement("span");
689
+ _$insertNode(_el$47, _el$48);
690
+ _$setProp(_el$47, "overflow", "hidden");
691
+ _$setProp(_el$47, "flexDirection", "column");
692
+ _$setProp(_el$47, "gap", 1);
693
+ _$insertNode(_el$48, _el$49);
694
+ _$insertNode(_el$48, _el$51);
695
+ _$insertNode(_el$49, _$createTextNode(`Subagents`));
696
+ _$insert(_el$51, (() => {
657
697
  var _c$3 = _$memo(() => !!visibleTaskParts().length);
658
698
  return () => _c$3() ? ` (${visibleTaskParts().length} running)` : "";
659
699
  })());
660
- _$insert(_el$41, _$createComponent(Show, {
700
+ _$insert(_el$47, _$createComponent(Show, {
661
701
  get when() {
662
702
  return taskCallIDs().length > 0;
663
703
  },
664
704
  get fallback() {
665
705
  return (() => {
666
- var _el$46 = _$createElement("text");
667
- _$insertNode(_el$46, _$createTextNode(`No subagent running`));
668
- _$effect(_$p => _$setProp(_el$46, "fg", props.api.theme.current.textMuted, _$p));
669
- return _el$46;
706
+ var _el$53 = _$createElement("text");
707
+ _$insertNode(_el$53, _$createTextNode(`No subagent running`));
708
+ _$effect(_$p => _$setProp(_el$53, "fg", props.api.theme.current.textMuted, _$p));
709
+ return _el$53;
670
710
  })();
671
711
  },
672
712
  get children() {
673
- return _$createComponent(For, {
713
+ var _el$52 = _$createElement("box");
714
+ _$setProp(_el$52, "width", "100%");
715
+ _$setProp(_el$52, "flexDirection", "column");
716
+ _$setProp(_el$52, "gap", 1);
717
+ _$insert(_el$52, _$createComponent(For, {
674
718
  get each() {
675
719
  return taskCallIDs();
676
720
  },
@@ -688,10 +732,11 @@ function RunningSubagents(props) {
688
732
  openPopup: showPopup,
689
733
  updatePopupAnchor: updatePopupAnchor
690
734
  })
691
- });
735
+ }));
736
+ return _el$52;
692
737
  }
693
738
  }), null);
694
- _$insert(_el$41, _$createComponent(Show, {
739
+ _$insert(_el$47, _$createComponent(Show, {
695
740
  get when() {
696
741
  return openPopup();
697
742
  },
@@ -715,18 +760,18 @@ function RunningSubagents(props) {
715
760
  })
716
761
  }), null);
717
762
  _$effect(_p$ => {
718
- var _v$16 = props.api.theme.current.text,
719
- _v$17 = {
763
+ var _v$19 = props.api.theme.current.text,
764
+ _v$20 = {
720
765
  fg: props.api.theme.current.textMuted
721
766
  };
722
- _v$16 !== _p$.e && (_p$.e = _$setProp(_el$42, "fg", _v$16, _p$.e));
723
- _v$17 !== _p$.t && (_p$.t = _$setProp(_el$45, "style", _v$17, _p$.t));
767
+ _v$19 !== _p$.e && (_p$.e = _$setProp(_el$48, "fg", _v$19, _p$.e));
768
+ _v$20 !== _p$.t && (_p$.t = _$setProp(_el$51, "style", _v$20, _p$.t));
724
769
  return _p$;
725
770
  }, {
726
771
  e: undefined,
727
772
  t: undefined
728
773
  });
729
- return _el$41;
774
+ return _el$47;
730
775
  })();
731
776
  }
732
777
  const tui = async api => {