@schlessera/brain-ui-react 0.18.0 → 0.20.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.
- package/dist/components/activity/activity-page.d.ts +11 -0
- package/dist/components/activity/activity-page.d.ts.map +1 -0
- package/dist/components/activity/activity-page.js +243 -0
- package/dist/components/activity/activity-page.js.map +1 -0
- package/dist/components/activity/digest-card.d.ts +10 -0
- package/dist/components/activity/digest-card.d.ts.map +1 -0
- package/dist/components/activity/digest-card.js +55 -0
- package/dist/components/activity/digest-card.js.map +1 -0
- package/dist/components/activity/push-toggle.d.ts +2 -0
- package/dist/components/activity/push-toggle.d.ts.map +1 -0
- package/dist/components/activity/push-toggle.js +121 -0
- package/dist/components/activity/push-toggle.js.map +1 -0
- package/dist/components/activity/span-bits.d.ts +76 -0
- package/dist/components/activity/span-bits.d.ts.map +1 -0
- package/dist/components/activity/span-bits.js +127 -0
- package/dist/components/activity/span-bits.js.map +1 -0
- package/dist/components/chat/chat-page.d.ts.map +1 -1
- package/dist/components/chat/chat-page.js +4 -1
- package/dist/components/chat/chat-page.js.map +1 -1
- package/dist/components/chat/session-drawer.d.ts.map +1 -1
- package/dist/components/chat/session-drawer.js +1 -15
- package/dist/components/chat/session-drawer.js.map +1 -1
- package/dist/components/chat/subagent-view.d.ts +18 -0
- package/dist/components/chat/subagent-view.d.ts.map +1 -0
- package/dist/components/chat/subagent-view.js +83 -0
- package/dist/components/chat/subagent-view.js.map +1 -0
- package/dist/components/chat/tool-call-timeline.d.ts.map +1 -1
- package/dist/components/chat/tool-call-timeline.js +40 -4
- package/dist/components/chat/tool-call-timeline.js.map +1 -1
- package/dist/components/chat/tool-views.d.ts +4 -0
- package/dist/components/chat/tool-views.d.ts.map +1 -1
- package/dist/components/chat/tool-views.js +26 -0
- package/dist/components/chat/tool-views.js.map +1 -1
- package/dist/components/layout/mobile-tab-bar.d.ts.map +1 -1
- package/dist/components/layout/mobile-tab-bar.js +10 -4
- package/dist/components/layout/mobile-tab-bar.js.map +1 -1
- package/dist/components/layout/side-rail.d.ts.map +1 -1
- package/dist/components/layout/side-rail.js +7 -4
- package/dist/components/layout/side-rail.js.map +1 -1
- package/dist/components/settings/models-tab.d.ts +15 -0
- package/dist/components/settings/models-tab.d.ts.map +1 -1
- package/dist/components/settings/models-tab.js +100 -21
- package/dist/components/settings/models-tab.js.map +1 -1
- package/dist/hooks/use-now.d.ts +8 -0
- package/dist/hooks/use-now.d.ts.map +1 -0
- package/dist/hooks/use-now.js +32 -0
- package/dist/hooks/use-now.js.map +1 -0
- package/dist/hooks/use-websocket.d.ts.map +1 -1
- package/dist/hooks/use-websocket.js +46 -0
- package/dist/hooks/use-websocket.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/api-client.d.ts +67 -1
- package/dist/lib/api-client.d.ts.map +1 -1
- package/dist/lib/api-client.js +41 -0
- package/dist/lib/api-client.js.map +1 -1
- package/dist/stores/activity-store.d.ts +108 -0
- package/dist/stores/activity-store.d.ts.map +1 -0
- package/dist/stores/activity-store.js +359 -0
- package/dist/stores/activity-store.js.map +1 -0
- package/dist/stores/ui-store.d.ts +9 -1
- package/dist/stores/ui-store.d.ts.map +1 -1
- package/dist/stores/ui-store.js +3 -0
- package/dist/stores/ui-store.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +2 -2
- package/src/components/activity/activity-page.tsx +623 -0
- package/src/components/activity/digest-card.tsx +105 -0
- package/src/components/activity/push-toggle.tsx +157 -0
- package/src/components/activity/span-bits.tsx +194 -0
- package/src/components/chat/chat-page.tsx +17 -0
- package/src/components/chat/session-drawer.tsx +1 -12
- package/src/components/chat/subagent-view.tsx +239 -0
- package/src/components/chat/tool-call-timeline.tsx +61 -3
- package/src/components/chat/tool-views.tsx +22 -0
- package/src/components/layout/mobile-tab-bar.tsx +25 -5
- package/src/components/layout/side-rail.tsx +17 -0
- package/src/components/settings/models-tab.tsx +135 -21
- package/src/hooks/use-now.ts +32 -0
- package/src/hooks/use-websocket.ts +44 -0
- package/src/index.ts +1 -0
- package/src/lib/api-client.ts +111 -0
- package/src/stores/activity-store.ts +451 -0
- package/src/stores/ui-store.ts +13 -1
|
@@ -0,0 +1,359 @@
|
|
|
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
|
+
/** Runs whose payload events have been backfilled over REST (per page lifetime). */
|
|
209
|
+
const payloadLoadedRuns = new Set();
|
|
210
|
+
/**
|
|
211
|
+
* Backfill one finished run's tool payload events into the mirror. The
|
|
212
|
+
* history fetch above and the run-list default deliberately skip payload
|
|
213
|
+
* bodies — they exist for duration badges, not drill-ins — so the first
|
|
214
|
+
* expanded payload view of a history span pulls the full detail
|
|
215
|
+
* (`include=payloads`) and merges it. Live runs never need this: their
|
|
216
|
+
* payload events ride the delta stream. The merge is safe because a snapshot
|
|
217
|
+
* at the same high-water still applies and events insert-if-absent.
|
|
218
|
+
*/
|
|
219
|
+
export async function loadSpanPayloads(spanId) {
|
|
220
|
+
const state = useActivityStore.getState();
|
|
221
|
+
const runId = state.spanRun[spanId];
|
|
222
|
+
if (!runId || payloadLoadedRuns.has(runId))
|
|
223
|
+
return;
|
|
224
|
+
const root = rootSpanOf(state.spans[runId] ?? {});
|
|
225
|
+
if (!root || root.outcome === undefined)
|
|
226
|
+
return;
|
|
227
|
+
payloadLoadedRuns.add(runId);
|
|
228
|
+
try {
|
|
229
|
+
const detail = await api.activityRun(runId, { includePayloads: true });
|
|
230
|
+
if (detail.detailPruned || !detail.spans)
|
|
231
|
+
return;
|
|
232
|
+
useActivityStore.getState().applySnapshot({
|
|
233
|
+
type: "activity_snapshot",
|
|
234
|
+
view: "run",
|
|
235
|
+
runId,
|
|
236
|
+
spans: detail.spans,
|
|
237
|
+
events: detail.events ?? [],
|
|
238
|
+
highWaterSeq: { [runId]: detail.highWaterSeq ?? 0 },
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
catch {
|
|
242
|
+
// Payloads are an enhancement; the row keeps its no-payload notice.
|
|
243
|
+
payloadLoadedRuns.delete(runId);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
function rootSpanOf(byId) {
|
|
247
|
+
return Object.values(byId).find((span) => span.parentSpanId === undefined);
|
|
248
|
+
}
|
|
249
|
+
/** Drop a whole run from the mirror — spans, events, high-water, reverse index. */
|
|
250
|
+
function evictRun(maps, runId) {
|
|
251
|
+
for (const spanId of Object.keys(maps.spans[runId] ?? {})) {
|
|
252
|
+
delete maps.events[spanId];
|
|
253
|
+
delete maps.spanRun[spanId];
|
|
254
|
+
}
|
|
255
|
+
delete maps.spans[runId];
|
|
256
|
+
delete maps.highWater[runId];
|
|
257
|
+
delete maps.deltaSeq[runId];
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Enforce the terminal-run bound in place. Returns whether anything was
|
|
261
|
+
* evicted. Runs whose root span is still open (or unknown) are never touched.
|
|
262
|
+
*/
|
|
263
|
+
function pruneTerminalRuns(maps) {
|
|
264
|
+
const terminal = [];
|
|
265
|
+
for (const [runId, byId] of Object.entries(maps.spans)) {
|
|
266
|
+
const root = rootSpanOf(byId);
|
|
267
|
+
if (root && root.outcome !== undefined) {
|
|
268
|
+
terminal.push({ runId, startedAt: root.startedAt });
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
if (terminal.length <= MAX_TERMINAL_RUNS)
|
|
272
|
+
return false;
|
|
273
|
+
terminal.sort((a, b) => a.startedAt - b.startedAt);
|
|
274
|
+
for (const { runId } of terminal.slice(0, terminal.length - MAX_TERMINAL_RUNS)) {
|
|
275
|
+
evictRun(maps, runId);
|
|
276
|
+
}
|
|
277
|
+
return true;
|
|
278
|
+
}
|
|
279
|
+
function insertEvent(list, event) {
|
|
280
|
+
const existing = list ?? [];
|
|
281
|
+
if (existing.some((e) => e.eventIndex === event.eventIndex))
|
|
282
|
+
return existing;
|
|
283
|
+
const next = [...existing, event];
|
|
284
|
+
next.sort((a, b) => a.eventIndex - b.eventIndex);
|
|
285
|
+
return next;
|
|
286
|
+
}
|
|
287
|
+
// --- Selectors (plain functions over the state, like activeChat) ---
|
|
288
|
+
/** All spans of a run, roots first, then by start time. */
|
|
289
|
+
export function runSpans(state, runId) {
|
|
290
|
+
const byId = state.spans[runId];
|
|
291
|
+
if (!byId)
|
|
292
|
+
return [];
|
|
293
|
+
return Object.values(byId).sort((a, b) => (a.parentSpanId ? 1 : 0) - (b.parentSpanId ? 1 : 0) || a.startedAt - b.startedAt);
|
|
294
|
+
}
|
|
295
|
+
/** Direct children of a span (e.g. the tool calls inside a subagent). */
|
|
296
|
+
export function childSpans(state, parentSpanId) {
|
|
297
|
+
const runId = state.spanRun[parentSpanId];
|
|
298
|
+
if (!runId)
|
|
299
|
+
return [];
|
|
300
|
+
return Object.values(state.spans[runId] ?? {})
|
|
301
|
+
.filter((s) => s.parentSpanId === parentSpanId)
|
|
302
|
+
.sort((a, b) => a.startedAt - b.startedAt);
|
|
303
|
+
}
|
|
304
|
+
/** The subagent spans spawned by a turn's Agent tool calls, live status included. */
|
|
305
|
+
export function subagentSpans(state, sessionId) {
|
|
306
|
+
const out = [];
|
|
307
|
+
for (const byId of Object.values(state.spans)) {
|
|
308
|
+
for (const span of Object.values(byId)) {
|
|
309
|
+
if (span.kind === "subagent" && span.sessionId === sessionId)
|
|
310
|
+
out.push(span);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
return out.sort((a, b) => a.startedAt - b.startedAt);
|
|
314
|
+
}
|
|
315
|
+
/** Stable empty result for `eventsFor` — a fresh `[]` per call would defeat
|
|
316
|
+
* reference-equality checks in zustand selectors. */
|
|
317
|
+
export const EMPTY_EVENTS = Object.freeze([]);
|
|
318
|
+
/** Ordered events of a span; the shared frozen empty array when none. */
|
|
319
|
+
export function eventsFor(state, spanId) {
|
|
320
|
+
return state.events[spanId] ?? EMPTY_EVENTS;
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* The recorded input/output payload events of a tool span (AE7). Returns a
|
|
324
|
+
* fresh array per call — subscribe through `useShallow` (like `childSpans`).
|
|
325
|
+
*/
|
|
326
|
+
export function payloadEventsFor(state, spanId) {
|
|
327
|
+
const events = state.events[spanId];
|
|
328
|
+
if (!events)
|
|
329
|
+
return EMPTY_EVENTS;
|
|
330
|
+
const payloads = events.filter((e) => e.eventType === "tool_input" || e.eventType === "tool_output");
|
|
331
|
+
return payloads.length > 0 ? payloads : EMPTY_EVENTS;
|
|
332
|
+
}
|
|
333
|
+
/** The span behind one tool call (span ids ARE toolUseIds), if streamed. */
|
|
334
|
+
export function spanForTool(state, toolUseId) {
|
|
335
|
+
const runId = state.spanRun[toolUseId];
|
|
336
|
+
return runId ? (state.spans[runId]?.[toolUseId] ?? null) : null;
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* Server-stamped timing for a tool call. One clock for live and reloaded
|
|
340
|
+
* views: when the activity stream carries the span, its timestamps win over
|
|
341
|
+
* client stamps (AE2 — live and revisit must render identical timings).
|
|
342
|
+
* `waitUntil` marks the approval-wait/execution boundary.
|
|
343
|
+
*/
|
|
344
|
+
export function timingFor(state, toolUseId) {
|
|
345
|
+
const span = spanForTool(state, toolUseId);
|
|
346
|
+
if (!span)
|
|
347
|
+
return null;
|
|
348
|
+
return {
|
|
349
|
+
startedAt: span.waitUntil ?? span.startedAt,
|
|
350
|
+
...(span.endedAt !== undefined ? { endedAt: span.endedAt } : {}),
|
|
351
|
+
};
|
|
352
|
+
}
|
|
353
|
+
registerDevHandle(() => {
|
|
354
|
+
if (typeof window === "undefined")
|
|
355
|
+
return;
|
|
356
|
+
window.__activityStore =
|
|
357
|
+
useActivityStore;
|
|
358
|
+
});
|
|
359
|
+
//# 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;
|
|
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"}
|
package/dist/stores/ui-store.js
CHANGED
|
@@ -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":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"ui-store.js","sourceRoot":"","sources":["../../src/stores/ui-store.ts"],"names":[],"mappings":"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"}
|