@schlessera/brain-ui-react 0.17.0 → 0.19.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 (81) hide show
  1. package/dist/components/activity/activity-page.d.ts +11 -0
  2. package/dist/components/activity/activity-page.d.ts.map +1 -0
  3. package/dist/components/activity/activity-page.js +208 -0
  4. package/dist/components/activity/activity-page.js.map +1 -0
  5. package/dist/components/activity/digest-card.d.ts +10 -0
  6. package/dist/components/activity/digest-card.d.ts.map +1 -0
  7. package/dist/components/activity/digest-card.js +51 -0
  8. package/dist/components/activity/digest-card.js.map +1 -0
  9. package/dist/components/activity/push-toggle.d.ts +2 -0
  10. package/dist/components/activity/push-toggle.d.ts.map +1 -0
  11. package/dist/components/activity/push-toggle.js +82 -0
  12. package/dist/components/activity/push-toggle.js.map +1 -0
  13. package/dist/components/activity/span-bits.d.ts +28 -0
  14. package/dist/components/activity/span-bits.d.ts.map +1 -0
  15. package/dist/components/activity/span-bits.js +43 -0
  16. package/dist/components/activity/span-bits.js.map +1 -0
  17. package/dist/components/chat/chat-page.d.ts.map +1 -1
  18. package/dist/components/chat/chat-page.js +4 -1
  19. package/dist/components/chat/chat-page.js.map +1 -1
  20. package/dist/components/chat/session-drawer.d.ts.map +1 -1
  21. package/dist/components/chat/session-drawer.js +1 -15
  22. package/dist/components/chat/session-drawer.js.map +1 -1
  23. package/dist/components/chat/subagent-view.d.ts +18 -0
  24. package/dist/components/chat/subagent-view.d.ts.map +1 -0
  25. package/dist/components/chat/subagent-view.js +79 -0
  26. package/dist/components/chat/subagent-view.js.map +1 -0
  27. package/dist/components/chat/tool-call-timeline.d.ts.map +1 -1
  28. package/dist/components/chat/tool-call-timeline.js +40 -4
  29. package/dist/components/chat/tool-call-timeline.js.map +1 -1
  30. package/dist/components/chat/tool-views.d.ts +4 -0
  31. package/dist/components/chat/tool-views.d.ts.map +1 -1
  32. package/dist/components/chat/tool-views.js +26 -0
  33. package/dist/components/chat/tool-views.js.map +1 -1
  34. package/dist/components/layout/mobile-tab-bar.d.ts.map +1 -1
  35. package/dist/components/layout/mobile-tab-bar.js +10 -4
  36. package/dist/components/layout/mobile-tab-bar.js.map +1 -1
  37. package/dist/components/layout/side-rail.d.ts.map +1 -1
  38. package/dist/components/layout/side-rail.js +7 -4
  39. package/dist/components/layout/side-rail.js.map +1 -1
  40. package/dist/hooks/use-now.d.ts +8 -0
  41. package/dist/hooks/use-now.d.ts.map +1 -0
  42. package/dist/hooks/use-now.js +32 -0
  43. package/dist/hooks/use-now.js.map +1 -0
  44. package/dist/hooks/use-websocket.d.ts.map +1 -1
  45. package/dist/hooks/use-websocket.js +46 -0
  46. package/dist/hooks/use-websocket.js.map +1 -1
  47. package/dist/index.d.ts +1 -0
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js +1 -0
  50. package/dist/index.js.map +1 -1
  51. package/dist/lib/api-client.d.ts +40 -1
  52. package/dist/lib/api-client.d.ts.map +1 -1
  53. package/dist/lib/api-client.js +28 -0
  54. package/dist/lib/api-client.js.map +1 -1
  55. package/dist/stores/activity-store.d.ts +93 -0
  56. package/dist/stores/activity-store.d.ts.map +1 -0
  57. package/dist/stores/activity-store.js +310 -0
  58. package/dist/stores/activity-store.js.map +1 -0
  59. package/dist/stores/ui-store.d.ts +9 -1
  60. package/dist/stores/ui-store.d.ts.map +1 -1
  61. package/dist/stores/ui-store.js +3 -0
  62. package/dist/stores/ui-store.js.map +1 -1
  63. package/dist/styles.css +1 -1
  64. package/package.json +2 -2
  65. package/src/components/activity/activity-page.tsx +495 -0
  66. package/src/components/activity/digest-card.tsx +101 -0
  67. package/src/components/activity/push-toggle.tsx +128 -0
  68. package/src/components/activity/span-bits.tsx +71 -0
  69. package/src/components/chat/chat-page.tsx +17 -0
  70. package/src/components/chat/session-drawer.tsx +1 -12
  71. package/src/components/chat/subagent-view.tsx +229 -0
  72. package/src/components/chat/tool-call-timeline.tsx +61 -3
  73. package/src/components/chat/tool-views.tsx +22 -0
  74. package/src/components/layout/mobile-tab-bar.tsx +25 -5
  75. package/src/components/layout/side-rail.tsx +17 -0
  76. package/src/hooks/use-now.ts +32 -0
  77. package/src/hooks/use-websocket.ts +44 -0
  78. package/src/index.ts +1 -0
  79. package/src/lib/api-client.ts +75 -0
  80. package/src/stores/activity-store.ts +402 -0
  81. package/src/stores/ui-store.ts +13 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activity-store.d.ts","sourceRoot":"","sources":["../../src/stores/activity-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,310 @@
1
+ import { create } from "zustand";
2
+ import { api } from "../lib/api-client.js";
3
+ import { registerDevHandle } from "../config.js";
4
+ /** How many finished runs' details are fetched when a session opens. */
5
+ const HISTORY_RUN_LIMIT = 10;
6
+ /** Bound on the mirror: how many TERMINAL runs stay held. Live runs never count. */
7
+ const MAX_TERMINAL_RUNS = 50;
8
+ export const useActivityStore = create((set, get) => ({
9
+ supported: false,
10
+ subscribed: {},
11
+ connectionEpoch: 0,
12
+ spans: {},
13
+ events: {},
14
+ highWater: {},
15
+ deltaSeq: {},
16
+ spanRun: {},
17
+ inbox: [],
18
+ loadInbox: async () => {
19
+ try {
20
+ const { intents } = await api.activityInbox();
21
+ set({ inbox: intents });
22
+ }
23
+ catch {
24
+ // Badge absence over a crash — the inbox is reachable from Activity.
25
+ }
26
+ },
27
+ acknowledgeIntent: async (id) => {
28
+ set((s) => ({ inbox: s.inbox.filter((i) => i.id !== id) }));
29
+ try {
30
+ await api.activityInboxAck(id);
31
+ }
32
+ catch {
33
+ // Optimistic removal stands; the next load re-syncs.
34
+ }
35
+ },
36
+ acknowledgeAllIntents: async () => {
37
+ set({ inbox: [] });
38
+ try {
39
+ await api.activityInboxAckAll();
40
+ }
41
+ catch {
42
+ // Same optimistic policy.
43
+ }
44
+ },
45
+ setSupported: (supported) => {
46
+ set({ supported });
47
+ if (supported)
48
+ startInboxPolling();
49
+ },
50
+ resetSubscriptions: () => set({ subscribed: {} }),
51
+ bumpConnectionEpoch: () => set((s) => ({ connectionEpoch: s.connectionEpoch + 1 })),
52
+ markSubscribed: (sessionId) => set((s) => ({ subscribed: { ...s.subscribed, [sessionId]: true } })),
53
+ applySnapshot: (msg) => {
54
+ set((s) => {
55
+ const maps = {
56
+ spans: { ...s.spans },
57
+ events: { ...s.events },
58
+ highWater: { ...s.highWater },
59
+ deltaSeq: { ...s.deltaSeq },
60
+ spanRun: { ...s.spanRun },
61
+ };
62
+ // Staleness guard: a run whose incoming high-water is strictly below
63
+ // what is held (snapshot floor or an applied delta) carries older
64
+ // state than what already applied — skip its spans/events. Equal
65
+ // still applies (chunked append frames).
66
+ const stale = new Set();
67
+ for (const [runId, seq] of Object.entries(msg.highWaterSeq)) {
68
+ const held = Math.max(maps.highWater[runId] ?? 0, maps.deltaSeq[runId] ?? 0);
69
+ if (seq < held)
70
+ stale.add(runId);
71
+ else
72
+ maps.highWater[runId] = seq;
73
+ }
74
+ for (const span of msg.spans) {
75
+ if (stale.has(span.runId))
76
+ continue;
77
+ maps.spans[span.runId] = { ...(maps.spans[span.runId] ?? {}), [span.spanId]: span };
78
+ maps.spanRun[span.spanId] = span.runId;
79
+ }
80
+ for (const event of msg.events) {
81
+ const runId = maps.spanRun[event.spanId];
82
+ if (runId !== undefined && stale.has(runId))
83
+ continue;
84
+ maps.events[event.spanId] = insertEvent(maps.events[event.spanId], event);
85
+ }
86
+ // Scope eviction: a fresh session/index snapshot is authoritative for
87
+ // its scope. A held run that still looks live but is absent from the
88
+ // frame's high-water map is a ghost — the server says it is not
89
+ // running any more (its REST history remains fetchable).
90
+ if (!msg.append && (msg.view === "session" || msg.view === "index")) {
91
+ for (const [runId, byId] of Object.entries(maps.spans)) {
92
+ if (runId in msg.highWaterSeq)
93
+ continue;
94
+ const root = rootSpanOf(byId);
95
+ if (!root || root.outcome !== undefined)
96
+ continue;
97
+ const inScope = msg.view === "index" || root.sessionId === msg.sessionId;
98
+ if (inScope)
99
+ evictRun(maps, runId);
100
+ }
101
+ }
102
+ pruneTerminalRuns(maps);
103
+ return maps;
104
+ });
105
+ },
106
+ applyDelta: (msg) => {
107
+ const s = get();
108
+ if (msg.seq <= (s.highWater[msg.runId] ?? 0))
109
+ return;
110
+ if (msg.span) {
111
+ const span = msg.span;
112
+ set((prev) => ({
113
+ spans: {
114
+ ...prev.spans,
115
+ [msg.runId]: { ...(prev.spans[msg.runId] ?? {}), [span.spanId]: span },
116
+ },
117
+ // Recording the applied seq keeps the snapshot staleness guard
118
+ // honest: a snapshot frame older than this delta must not roll it back.
119
+ deltaSeq: {
120
+ ...prev.deltaSeq,
121
+ [msg.runId]: Math.max(prev.deltaSeq[msg.runId] ?? 0, msg.seq),
122
+ },
123
+ // The mapping is almost always already present — re-spreading it on
124
+ // every delta would churn a large object for nothing.
125
+ ...(prev.spanRun[span.spanId] === msg.runId
126
+ ? {}
127
+ : { spanRun: { ...prev.spanRun, [span.spanId]: msg.runId } }),
128
+ }));
129
+ // A root span closing may push the mirror past the terminal-run cap.
130
+ if (span.parentSpanId === undefined && span.outcome !== undefined) {
131
+ const prev = get();
132
+ const maps = {
133
+ spans: { ...prev.spans },
134
+ events: { ...prev.events },
135
+ highWater: { ...prev.highWater },
136
+ deltaSeq: { ...prev.deltaSeq },
137
+ spanRun: { ...prev.spanRun },
138
+ };
139
+ if (pruneTerminalRuns(maps))
140
+ set(maps);
141
+ }
142
+ }
143
+ else if (msg.event) {
144
+ const event = msg.event;
145
+ set((prev) => ({
146
+ events: { ...prev.events, [event.spanId]: insertEvent(prev.events[event.spanId], event) },
147
+ deltaSeq: {
148
+ ...prev.deltaSeq,
149
+ [msg.runId]: Math.max(prev.deltaSeq[msg.runId] ?? 0, msg.seq),
150
+ },
151
+ ...(prev.spanRun[event.spanId] !== undefined
152
+ ? {}
153
+ : { spanRun: { ...prev.spanRun, [event.spanId]: msg.runId } }),
154
+ }));
155
+ }
156
+ },
157
+ clear: () => set({ spans: {}, events: {}, highWater: {}, deltaSeq: {}, spanRun: {} }),
158
+ }));
159
+ /** One badge poller per page lifetime — the inbox is cheap and the badge
160
+ * must be honest even when the Activity surface never opens. */
161
+ let inboxPoller = null;
162
+ function startInboxPolling() {
163
+ if (inboxPoller)
164
+ return;
165
+ void useActivityStore.getState().loadInbox();
166
+ inboxPoller = setInterval(() => {
167
+ void useActivityStore.getState().loadInbox();
168
+ }, 60_000);
169
+ }
170
+ /** Runs whose history has been fetched already (per page lifetime). */
171
+ const loadedHistorySessions = new Set();
172
+ /**
173
+ * Pull a session's recent FINISHED runs from the REST activity API into the
174
+ * store. The live subscription's snapshot carries open runs only; this is
175
+ * what makes duration badges on history-loaded messages real (AE2) — span
176
+ * ids are tool-use ids, so the timeline's timing lookup starts hitting.
177
+ * Fire-and-forget; a failure just leaves badges absent, as before.
178
+ */
179
+ export async function loadSessionActivityHistory(sessionId) {
180
+ if (loadedHistorySessions.has(sessionId))
181
+ return;
182
+ loadedHistorySessions.add(sessionId);
183
+ try {
184
+ const { history } = await api.activityRuns({ session: sessionId, limit: HISTORY_RUN_LIMIT });
185
+ const store = useActivityStore.getState();
186
+ const details = await Promise.all(history
187
+ .slice(0, HISTORY_RUN_LIMIT)
188
+ .filter((run) => !run.detailPruned)
189
+ .map((run) => api.activityRun(run.runId)));
190
+ for (const detail of details) {
191
+ if (detail.detailPruned || !detail.spans)
192
+ continue;
193
+ store.applySnapshot({
194
+ type: "activity_snapshot",
195
+ view: "run",
196
+ runId: detail.runId,
197
+ spans: detail.spans,
198
+ events: detail.events ?? [],
199
+ highWaterSeq: { [detail.runId]: detail.highWaterSeq ?? 0 },
200
+ });
201
+ }
202
+ }
203
+ catch {
204
+ // History timing is an enhancement; the transcript renders without it.
205
+ loadedHistorySessions.delete(sessionId);
206
+ }
207
+ }
208
+ function rootSpanOf(byId) {
209
+ return Object.values(byId).find((span) => span.parentSpanId === undefined);
210
+ }
211
+ /** Drop a whole run from the mirror — spans, events, high-water, reverse index. */
212
+ function evictRun(maps, runId) {
213
+ for (const spanId of Object.keys(maps.spans[runId] ?? {})) {
214
+ delete maps.events[spanId];
215
+ delete maps.spanRun[spanId];
216
+ }
217
+ delete maps.spans[runId];
218
+ delete maps.highWater[runId];
219
+ delete maps.deltaSeq[runId];
220
+ }
221
+ /**
222
+ * Enforce the terminal-run bound in place. Returns whether anything was
223
+ * evicted. Runs whose root span is still open (or unknown) are never touched.
224
+ */
225
+ function pruneTerminalRuns(maps) {
226
+ const terminal = [];
227
+ for (const [runId, byId] of Object.entries(maps.spans)) {
228
+ const root = rootSpanOf(byId);
229
+ if (root && root.outcome !== undefined) {
230
+ terminal.push({ runId, startedAt: root.startedAt });
231
+ }
232
+ }
233
+ if (terminal.length <= MAX_TERMINAL_RUNS)
234
+ return false;
235
+ terminal.sort((a, b) => a.startedAt - b.startedAt);
236
+ for (const { runId } of terminal.slice(0, terminal.length - MAX_TERMINAL_RUNS)) {
237
+ evictRun(maps, runId);
238
+ }
239
+ return true;
240
+ }
241
+ function insertEvent(list, event) {
242
+ const existing = list ?? [];
243
+ if (existing.some((e) => e.eventIndex === event.eventIndex))
244
+ return existing;
245
+ const next = [...existing, event];
246
+ next.sort((a, b) => a.eventIndex - b.eventIndex);
247
+ return next;
248
+ }
249
+ // --- Selectors (plain functions over the state, like activeChat) ---
250
+ /** All spans of a run, roots first, then by start time. */
251
+ export function runSpans(state, runId) {
252
+ const byId = state.spans[runId];
253
+ if (!byId)
254
+ return [];
255
+ return Object.values(byId).sort((a, b) => (a.parentSpanId ? 1 : 0) - (b.parentSpanId ? 1 : 0) || a.startedAt - b.startedAt);
256
+ }
257
+ /** Direct children of a span (e.g. the tool calls inside a subagent). */
258
+ export function childSpans(state, parentSpanId) {
259
+ const runId = state.spanRun[parentSpanId];
260
+ if (!runId)
261
+ return [];
262
+ return Object.values(state.spans[runId] ?? {})
263
+ .filter((s) => s.parentSpanId === parentSpanId)
264
+ .sort((a, b) => a.startedAt - b.startedAt);
265
+ }
266
+ /** The subagent spans spawned by a turn's Agent tool calls, live status included. */
267
+ export function subagentSpans(state, sessionId) {
268
+ const out = [];
269
+ for (const byId of Object.values(state.spans)) {
270
+ for (const span of Object.values(byId)) {
271
+ if (span.kind === "subagent" && span.sessionId === sessionId)
272
+ out.push(span);
273
+ }
274
+ }
275
+ return out.sort((a, b) => a.startedAt - b.startedAt);
276
+ }
277
+ /** Stable empty result for `eventsFor` — a fresh `[]` per call would defeat
278
+ * reference-equality checks in zustand selectors. */
279
+ export const EMPTY_EVENTS = Object.freeze([]);
280
+ /** Ordered events of a span; the shared frozen empty array when none. */
281
+ export function eventsFor(state, spanId) {
282
+ return state.events[spanId] ?? EMPTY_EVENTS;
283
+ }
284
+ /** The span behind one tool call (span ids ARE toolUseIds), if streamed. */
285
+ export function spanForTool(state, toolUseId) {
286
+ const runId = state.spanRun[toolUseId];
287
+ return runId ? (state.spans[runId]?.[toolUseId] ?? null) : null;
288
+ }
289
+ /**
290
+ * Server-stamped timing for a tool call. One clock for live and reloaded
291
+ * views: when the activity stream carries the span, its timestamps win over
292
+ * client stamps (AE2 — live and revisit must render identical timings).
293
+ * `waitUntil` marks the approval-wait/execution boundary.
294
+ */
295
+ export function timingFor(state, toolUseId) {
296
+ const span = spanForTool(state, toolUseId);
297
+ if (!span)
298
+ return null;
299
+ return {
300
+ startedAt: span.waitUntil ?? span.startedAt,
301
+ ...(span.endedAt !== undefined ? { endedAt: span.endedAt } : {}),
302
+ };
303
+ }
304
+ registerDevHandle(() => {
305
+ if (typeof window === "undefined")
306
+ return;
307
+ window.__activityStore =
308
+ useActivityStore;
309
+ });
310
+ //# sourceMappingURL=activity-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activity-store.js","sourceRoot":"","sources":["../../src/stores/activity-store.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,17 @@
1
1
  /** Which tab the settings panel opens on. */
2
2
  export type SettingsTab = "models" | "security";
3
3
  /** Full-screen surface currently shown inside the AppShell. */
4
- export type ActiveView = "chat" | "graph";
4
+ export type ActiveView = "chat" | "graph" | "activity";
5
5
  interface UIState {
6
6
  activeView: ActiveView;
7
+ /**
8
+ * Drill-in stack of open subagent views (Agent tool-call span ids). A
9
+ * nested subagent pushes; back pops. Kept here rather than component state
10
+ * so the Activity surface and the chat timeline share one drill-in.
11
+ */
12
+ subagentStack: string[];
13
+ pushSubagentView: (spanId: string) => void;
14
+ popSubagentView: () => void;
7
15
  sessionPanelOpen: boolean;
8
16
  syncPanelOpen: boolean;
9
17
  whatsupPanelOpen: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"ui-store.d.ts","sourceRoot":"","sources":["../../src/stores/ui-store.ts"],"names":[],"mappings":"AAEA,6CAA6C;AAC7C,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,UAAU,CAAC;AAEhD,+DAA+D;AAC/D,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,OAAO,CAAC;AAE1C,UAAU,OAAO;IACf,UAAU,EAAE,UAAU,CAAC;IACvB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,aAAa,EAAE,OAAO,CAAC;IACvB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,eAAe,EAAE,OAAO,CAAC;IACzB,YAAY,EAAE,OAAO,CAAC;IACtB,aAAa,EAAE,OAAO,CAAC;IACvB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,WAAW,EAAE,WAAW,CAAC;IACzB,uFAAuF;IACvF,aAAa,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,IAAI,CAAC;IAC1C,kBAAkB,EAAE,MAAM,IAAI,CAAC;IAC/B,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,kBAAkB,EAAE,MAAM,IAAI,CAAC;IAC/B,iBAAiB,EAAE,MAAM,IAAI,CAAC;IAC9B,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,mBAAmB,EAAE,MAAM,IAAI,CAAC;IAChC,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,gBAAgB,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC1C,mBAAmB,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7C,kBAAkB,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC5C,eAAe,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACzC,mBAAmB,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7C,gBAAgB,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC1C,oBAAoB,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC9C,oEAAoE;IACpE,YAAY,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,IAAI,CAAC;IACzC,cAAc,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,IAAI,CAAC;CAC5C;AAYD,eAAO,MAAM,UAAU,sEA8BpB,CAAC"}
1
+ {"version":3,"file":"ui-store.d.ts","sourceRoot":"","sources":["../../src/stores/ui-store.ts"],"names":[],"mappings":"AAEA,6CAA6C;AAC7C,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,UAAU,CAAC;AAEhD,+DAA+D;AAC/D,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,OAAO,GAAG,UAAU,CAAC;AAEvD,UAAU,OAAO;IACf,UAAU,EAAE,UAAU,CAAC;IACvB;;;;OAIG;IACH,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,gBAAgB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,aAAa,EAAE,OAAO,CAAC;IACvB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,eAAe,EAAE,OAAO,CAAC;IACzB,YAAY,EAAE,OAAO,CAAC;IACtB,aAAa,EAAE,OAAO,CAAC;IACvB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,WAAW,EAAE,WAAW,CAAC;IACzB,uFAAuF;IACvF,aAAa,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,IAAI,CAAC;IAC1C,kBAAkB,EAAE,MAAM,IAAI,CAAC;IAC/B,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,kBAAkB,EAAE,MAAM,IAAI,CAAC;IAC/B,iBAAiB,EAAE,MAAM,IAAI,CAAC;IAC9B,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,mBAAmB,EAAE,MAAM,IAAI,CAAC;IAChC,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,gBAAgB,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC1C,mBAAmB,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7C,kBAAkB,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC5C,eAAe,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACzC,mBAAmB,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7C,gBAAgB,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC1C,oBAAoB,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC9C,oEAAoE;IACpE,YAAY,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,IAAI,CAAC;IACzC,cAAc,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,IAAI,CAAC;CAC5C;AAYD,eAAO,MAAM,UAAU,sEAkCpB,CAAC"}
@@ -12,6 +12,9 @@ export const useUIStore = create((set) => ({
12
12
  ...CLOSED,
13
13
  activeView: "chat",
14
14
  settingsTab: "models",
15
+ subagentStack: [],
16
+ pushSubagentView: (spanId) => set((s) => ({ subagentStack: [...s.subagentStack, spanId] })),
17
+ popSubagentView: () => set((s) => ({ subagentStack: s.subagentStack.slice(0, -1) })),
15
18
  setActiveView: (view) => set({ ...CLOSED, activeView: view }),
16
19
  toggleSessionPanel: () => set((s) => ({ ...CLOSED, sessionPanelOpen: !s.sessionPanelOpen })),
17
20
  toggleSyncPanel: () => set((s) => ({ ...CLOSED, syncPanelOpen: !s.syncPanelOpen })),
@@ -1 +1 @@
1
- {"version":3,"file":"ui-store.js","sourceRoot":"","sources":["../../src/stores/ui-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ui-store.js","sourceRoot":"","sources":["../../src/stores/ui-store.ts"],"names":[],"mappings":"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"}