@schlessera/brain-ui-react 0.34.0 → 0.34.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.
- package/README.md +5 -0
- package/dist/components/activity/activity-page.d.ts.map +1 -1
- package/dist/components/activity/activity-page.js +8 -149
- package/dist/components/activity/activity-page.js.map +1 -1
- package/dist/components/activity/activity-rollups.d.ts +5 -0
- package/dist/components/activity/activity-rollups.d.ts.map +1 -0
- package/dist/components/activity/activity-rollups.js +39 -0
- package/dist/components/activity/activity-rollups.js.map +1 -0
- package/dist/components/activity/activity-run-detail.d.ts +11 -0
- package/dist/components/activity/activity-run-detail.d.ts.map +1 -0
- package/dist/components/activity/activity-run-detail.js +111 -0
- package/dist/components/activity/activity-run-detail.js.map +1 -0
- package/dist/components/activity/activity-run-list.d.ts +15 -0
- package/dist/components/activity/activity-run-list.d.ts.map +1 -0
- package/dist/components/activity/activity-run-list.js +25 -0
- package/dist/components/activity/activity-run-list.js.map +1 -0
- package/dist/components/chat/brain-markdown-code.d.ts +4 -0
- package/dist/components/chat/brain-markdown-code.d.ts.map +1 -0
- package/dist/components/chat/brain-markdown-code.js +47 -0
- package/dist/components/chat/brain-markdown-code.js.map +1 -0
- package/dist/components/chat/brain-markdown-entities.d.ts +14 -0
- package/dist/components/chat/brain-markdown-entities.d.ts.map +1 -0
- package/dist/components/chat/brain-markdown-entities.js +93 -0
- package/dist/components/chat/brain-markdown-entities.js.map +1 -0
- package/dist/components/chat/brain-markdown-links.d.ts +36 -0
- package/dist/components/chat/brain-markdown-links.d.ts.map +1 -0
- package/dist/components/chat/brain-markdown-links.js +176 -0
- package/dist/components/chat/brain-markdown-links.js.map +1 -0
- package/dist/components/chat/brain-markdown-share.d.ts +15 -0
- package/dist/components/chat/brain-markdown-share.d.ts.map +1 -0
- package/dist/components/chat/brain-markdown-share.js +40 -0
- package/dist/components/chat/brain-markdown-share.js.map +1 -0
- package/dist/components/chat/brain-markdown.d.ts +1 -34
- package/dist/components/chat/brain-markdown.d.ts.map +1 -1
- package/dist/components/chat/brain-markdown.js +9 -402
- package/dist/components/chat/brain-markdown.js.map +1 -1
- package/dist/components/chat/composer.d.ts.map +1 -1
- package/dist/components/chat/composer.js +14 -1
- package/dist/components/chat/composer.js.map +1 -1
- package/dist/components/chat/use-markdown-highlight.d.ts +12 -0
- package/dist/components/chat/use-markdown-highlight.d.ts.map +1 -0
- package/dist/components/chat/use-markdown-highlight.js +56 -0
- package/dist/components/chat/use-markdown-highlight.js.map +1 -0
- package/dist/components/connectivity/connection-gate.d.ts.map +1 -1
- package/dist/components/connectivity/connection-gate.js +41 -7
- package/dist/components/connectivity/connection-gate.js.map +1 -1
- package/dist/components/connectivity/connection-state.d.ts +12 -0
- package/dist/components/connectivity/connection-state.d.ts.map +1 -0
- package/dist/components/connectivity/connection-state.js +23 -0
- package/dist/components/connectivity/connection-state.js.map +1 -0
- package/dist/components/graph/graph-canvas-lazy.d.ts +2 -0
- package/dist/components/graph/graph-canvas-lazy.d.ts.map +1 -0
- package/dist/components/graph/graph-canvas-lazy.js +4 -0
- package/dist/components/graph/graph-canvas-lazy.js.map +1 -0
- package/dist/components/graph/graph-controls.js +4 -1
- package/dist/components/graph/graph-controls.js.map +1 -1
- package/dist/components/graph/graph-maintenance.d.ts +8 -0
- package/dist/components/graph/graph-maintenance.d.ts.map +1 -0
- package/dist/components/graph/graph-maintenance.js +115 -0
- package/dist/components/graph/graph-maintenance.js.map +1 -0
- package/dist/components/graph/graph-page.d.ts.map +1 -1
- package/dist/components/graph/graph-page.js +11 -306
- package/dist/components/graph/graph-page.js.map +1 -1
- package/dist/components/graph/graph-scene.d.ts +8 -0
- package/dist/components/graph/graph-scene.d.ts.map +1 -0
- package/dist/components/graph/graph-scene.js +208 -0
- package/dist/components/graph/graph-scene.js.map +1 -0
- package/dist/components/graph/graph-spinner.d.ts +2 -0
- package/dist/components/graph/graph-spinner.d.ts.map +1 -0
- package/dist/components/graph/graph-spinner.js +6 -0
- package/dist/components/graph/graph-spinner.js.map +1 -0
- package/dist/hooks/use-vpn-status.d.ts +5 -0
- package/dist/hooks/use-vpn-status.d.ts.map +1 -1
- package/dist/hooks/use-vpn-status.js +61 -29
- package/dist/hooks/use-vpn-status.js.map +1 -1
- package/dist/hooks/use-websocket.d.ts +3 -2
- package/dist/hooks/use-websocket.d.ts.map +1 -1
- package/dist/hooks/use-websocket.js +61 -252
- package/dist/hooks/use-websocket.js.map +1 -1
- package/dist/hooks/websocket-handlers/activity.d.ts +5 -0
- package/dist/hooks/websocket-handlers/activity.d.ts.map +1 -0
- package/dist/hooks/websocket-handlers/activity.js +10 -0
- package/dist/hooks/websocket-handlers/activity.js.map +1 -0
- package/dist/hooks/websocket-handlers/chat.d.ts +17 -0
- package/dist/hooks/websocket-handlers/chat.d.ts.map +1 -0
- package/dist/hooks/websocket-handlers/chat.js +175 -0
- package/dist/hooks/websocket-handlers/chat.js.map +1 -0
- package/dist/hooks/websocket-handlers/connection.d.ts +6 -0
- package/dist/hooks/websocket-handlers/connection.d.ts.map +1 -0
- package/dist/hooks/websocket-handlers/connection.js +27 -0
- package/dist/hooks/websocket-handlers/connection.js.map +1 -0
- package/dist/hooks/websocket-handlers/index.d.ts +4 -0
- package/dist/hooks/websocket-handlers/index.d.ts.map +1 -0
- package/dist/hooks/websocket-handlers/index.js +19 -0
- package/dist/hooks/websocket-handlers/index.js.map +1 -0
- package/dist/hooks/websocket-handlers/mask.d.ts +4 -0
- package/dist/hooks/websocket-handlers/mask.d.ts.map +1 -0
- package/dist/hooks/websocket-handlers/mask.js +14 -0
- package/dist/hooks/websocket-handlers/mask.js.map +1 -0
- package/dist/hooks/websocket-handlers/provider.d.ts +4 -0
- package/dist/hooks/websocket-handlers/provider.d.ts.map +1 -0
- package/dist/hooks/websocket-handlers/provider.js +31 -0
- package/dist/hooks/websocket-handlers/provider.js.map +1 -0
- package/dist/hooks/websocket-handlers/types.d.ts +24 -0
- package/dist/hooks/websocket-handlers/types.d.ts.map +1 -0
- package/dist/hooks/websocket-handlers/types.js +2 -0
- package/dist/hooks/websocket-handlers/types.js.map +1 -0
- package/dist/stores/activity-store-helpers.d.ts +50 -0
- package/dist/stores/activity-store-helpers.d.ts.map +1 -0
- package/dist/stores/activity-store-helpers.js +143 -0
- package/dist/stores/activity-store-helpers.js.map +1 -0
- package/dist/stores/activity-store-types.d.ts +48 -0
- package/dist/stores/activity-store-types.d.ts.map +1 -0
- package/dist/stores/activity-store-types.js +2 -0
- package/dist/stores/activity-store-types.js.map +1 -0
- package/dist/stores/activity-store.d.ts +2 -78
- package/dist/stores/activity-store.d.ts.map +1 -1
- package/dist/stores/activity-store.js +22 -142
- package/dist/stores/activity-store.js.map +1 -1
- package/dist/stores/connection-store.d.ts +14 -2
- package/dist/stores/connection-store.d.ts.map +1 -1
- package/dist/stores/connection-store.js +17 -0
- package/dist/stores/connection-store.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +2 -2
- package/src/components/activity/activity-page.tsx +6 -477
- package/src/components/activity/activity-rollups.tsx +94 -0
- package/src/components/activity/activity-run-detail.tsx +301 -0
- package/src/components/activity/activity-run-list.tsx +97 -0
- package/src/components/chat/brain-markdown-code.tsx +60 -0
- package/src/components/chat/brain-markdown-entities.tsx +116 -0
- package/src/components/chat/brain-markdown-links.tsx +247 -0
- package/src/components/chat/brain-markdown-share.ts +47 -0
- package/src/components/chat/brain-markdown.tsx +27 -535
- package/src/components/chat/composer.tsx +14 -1
- package/src/components/chat/use-markdown-highlight.ts +63 -0
- package/src/components/connectivity/connection-gate.tsx +64 -13
- package/src/components/connectivity/connection-state.ts +37 -0
- package/src/components/graph/graph-canvas-lazy.tsx +4 -0
- package/src/components/graph/graph-controls.tsx +4 -1
- package/src/components/graph/graph-maintenance.tsx +304 -0
- package/src/components/graph/graph-page.tsx +11 -840
- package/src/components/graph/graph-scene.tsx +548 -0
- package/src/components/graph/graph-spinner.tsx +9 -0
- package/src/hooks/use-vpn-status.ts +64 -31
- package/src/hooks/use-websocket.ts +70 -273
- package/src/hooks/websocket-handlers/activity.ts +13 -0
- package/src/hooks/websocket-handlers/chat.ts +210 -0
- package/src/hooks/websocket-handlers/connection.ts +30 -0
- package/src/hooks/websocket-handlers/index.ts +59 -0
- package/src/hooks/websocket-handlers/mask.ts +17 -0
- package/src/hooks/websocket-handlers/provider.ts +35 -0
- package/src/hooks/websocket-handlers/types.ts +27 -0
- package/src/stores/activity-store-helpers.ts +164 -0
- package/src/stores/activity-store-types.ts +55 -0
- package/src/stores/activity-store.ts +21 -217
- package/src/stores/connection-store.ts +33 -2
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { activeChat, useChatStore } from "../../stores/chat-store.js";
|
|
2
|
+
import { isAskUserTool } from "../../lib/tool-names.js";
|
|
3
|
+
let historyMessageCounter = 0;
|
|
4
|
+
function historyId() {
|
|
5
|
+
return `hist-${++historyMessageCounter}-${Date.now()}`;
|
|
6
|
+
}
|
|
7
|
+
function convertHistoryMessage(msg) {
|
|
8
|
+
// Fallback for history without chronological parts: synthesize the legacy
|
|
9
|
+
// grouped order (thinking, tools, text).
|
|
10
|
+
const parts = msg.parts ??
|
|
11
|
+
[
|
|
12
|
+
...(msg.thinking ? [{ kind: "thinking", text: msg.thinking }] : []),
|
|
13
|
+
...msg.toolCalls.map((_, i) => ({ kind: "tool", toolIndex: i })),
|
|
14
|
+
...(msg.content ? [{ kind: "text", text: msg.content }] : []),
|
|
15
|
+
];
|
|
16
|
+
const askUserExchanges = reconstructAskUserExchanges(msg.toolCalls);
|
|
17
|
+
return {
|
|
18
|
+
id: historyId(),
|
|
19
|
+
role: msg.role,
|
|
20
|
+
content: msg.content,
|
|
21
|
+
thinking: msg.thinking,
|
|
22
|
+
toolCalls: msg.toolCalls.map((tc) => ({
|
|
23
|
+
id: tc.id,
|
|
24
|
+
name: tc.name,
|
|
25
|
+
input: tc.input,
|
|
26
|
+
inputJson: JSON.stringify(tc.input, null, 2),
|
|
27
|
+
output: tc.output,
|
|
28
|
+
isError: tc.isError,
|
|
29
|
+
status: "complete",
|
|
30
|
+
})),
|
|
31
|
+
parts,
|
|
32
|
+
isStreaming: false,
|
|
33
|
+
timestamp: Date.now(),
|
|
34
|
+
...(askUserExchanges ? { askUserExchanges } : {}),
|
|
35
|
+
...(msg.attachmentCount ? { attachmentCount: msg.attachmentCount } : {}),
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
/** Rebuild ask_user exchanges from a resumed message's tool calls. */
|
|
39
|
+
function isBareAnswersMap(v) {
|
|
40
|
+
return (!!v &&
|
|
41
|
+
typeof v === "object" &&
|
|
42
|
+
!Array.isArray(v) &&
|
|
43
|
+
Object.values(v).every((x) => typeof x === "string"));
|
|
44
|
+
}
|
|
45
|
+
function reconstructAskUserExchanges(toolCalls) {
|
|
46
|
+
const exchanges = [];
|
|
47
|
+
for (const tc of toolCalls) {
|
|
48
|
+
if (!isAskUserTool(tc.name))
|
|
49
|
+
continue;
|
|
50
|
+
const questions = tc.input?.questions ?? [];
|
|
51
|
+
const exchange = { requestId: tc.id, questions };
|
|
52
|
+
if (tc.output) {
|
|
53
|
+
try {
|
|
54
|
+
const payload = JSON.parse(tc.output);
|
|
55
|
+
if (payload && typeof payload === "object" && payload.answers) {
|
|
56
|
+
exchange.answers = payload.answers;
|
|
57
|
+
exchange.annotations = payload.annotations;
|
|
58
|
+
}
|
|
59
|
+
else if (isBareAnswersMap(payload)) {
|
|
60
|
+
// The pi backend persists the bare answers map, without the
|
|
61
|
+
// `{answers}` envelope the Claude tool writes.
|
|
62
|
+
exchange.answers = payload;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
// Non-JSON output means the question was dismissed or errored out.
|
|
67
|
+
exchange.cancelled = true;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
if (tc.isError && !exchange.answers)
|
|
71
|
+
exchange.cancelled = true;
|
|
72
|
+
exchanges.push(exchange);
|
|
73
|
+
}
|
|
74
|
+
return exchanges.length ? exchanges : undefined;
|
|
75
|
+
}
|
|
76
|
+
/** Map a frame to the run-state its session should show in the session list. */
|
|
77
|
+
export function runStateForFrame(msg) {
|
|
78
|
+
if (msg.type === "result" || msg.type === "error")
|
|
79
|
+
return "idle";
|
|
80
|
+
if (msg.type === "status") {
|
|
81
|
+
if (msg.status === "queued")
|
|
82
|
+
return "queued";
|
|
83
|
+
if (msg.status === "idle" || msg.status === "cancelled")
|
|
84
|
+
return "idle";
|
|
85
|
+
}
|
|
86
|
+
return "streaming";
|
|
87
|
+
}
|
|
88
|
+
export const chatFrameHandlers = {
|
|
89
|
+
text_delta: (msg, context) => {
|
|
90
|
+
// Opening the bubble stays immediate — the first token should show a
|
|
91
|
+
// message starting, and every later delta needs isStreaming to be true.
|
|
92
|
+
if (!context.buffer()?.isStreaming) {
|
|
93
|
+
context.state.startAssistantMessage(context.key);
|
|
94
|
+
}
|
|
95
|
+
context.enqueueDelta(context.key, "text", msg.text);
|
|
96
|
+
},
|
|
97
|
+
thinking_delta: (msg, context) => {
|
|
98
|
+
if (!context.buffer()?.isStreaming) {
|
|
99
|
+
context.state.startAssistantMessage(context.key);
|
|
100
|
+
}
|
|
101
|
+
context.enqueueDelta(context.key, "thinking", msg.text);
|
|
102
|
+
},
|
|
103
|
+
tool_use_start: (msg, context) => {
|
|
104
|
+
// A tool call INSIDE a subagent nests under its Agent entry, rendered
|
|
105
|
+
// from the activity stream — putting it in the flat transcript would
|
|
106
|
+
// interleave fan-out work with the main turn's steps.
|
|
107
|
+
if (msg.parentToolUseId)
|
|
108
|
+
return;
|
|
109
|
+
context.state.startToolCall(context.key, msg.toolUseId, msg.toolName);
|
|
110
|
+
},
|
|
111
|
+
tool_input_delta: (msg, context) => {
|
|
112
|
+
context.state.appendToolInput(context.key, msg.partialJson);
|
|
113
|
+
},
|
|
114
|
+
tool_use_complete: (msg, context) => {
|
|
115
|
+
// Subagent tool calls render nested (activity stream), and the flat
|
|
116
|
+
// store's name-based fallback match must never see them.
|
|
117
|
+
if (msg.parentToolUseId)
|
|
118
|
+
return;
|
|
119
|
+
context.state.completeToolCall(context.key, msg.toolUseId, msg.toolName, msg.input);
|
|
120
|
+
},
|
|
121
|
+
tool_approval_request: (msg, context) => {
|
|
122
|
+
context.state.requestToolApproval(context.key, msg.toolUseId, msg.toolName, msg.input, msg.description, msg.kind);
|
|
123
|
+
},
|
|
124
|
+
tool_result: (msg, context) => {
|
|
125
|
+
context.state.setToolResult(context.key, msg.toolUseId, msg.output, msg.isError);
|
|
126
|
+
// Once the agent receives the ask_user tool result, the exchange is
|
|
127
|
+
// complete — drop any leftover ask_user UI state.
|
|
128
|
+
const chat = context.buffer();
|
|
129
|
+
if (chat?.askUser?.answers || chat?.askUser?.cancelled) {
|
|
130
|
+
context.state.clearAskUser(context.key);
|
|
131
|
+
}
|
|
132
|
+
},
|
|
133
|
+
ask_user_request: (msg, context) => {
|
|
134
|
+
context.state.setAskUserRequest(context.key, msg.requestId, msg.questions);
|
|
135
|
+
},
|
|
136
|
+
result: (msg, context) => {
|
|
137
|
+
context.state.finishAssistantMessage(context.key);
|
|
138
|
+
context.resyncIfNeeded(msg.sessionId);
|
|
139
|
+
},
|
|
140
|
+
session_history: (msg, context) => {
|
|
141
|
+
const converted = msg.messages.map(convertHistoryMessage);
|
|
142
|
+
if (msg.append) {
|
|
143
|
+
context.state.appendMessages(context.key, converted);
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
// First (replacing) chunk = fresh authoritative transcript. Cancel any
|
|
147
|
+
// pending reconnect resync so we don't redundantly re-fetch it, and
|
|
148
|
+
// mark this session cold-resumed so idle-status handling doesn't loop.
|
|
149
|
+
context.state.setMessages(context.key, converted);
|
|
150
|
+
context.markHistoryReplaced(context.key);
|
|
151
|
+
}
|
|
152
|
+
},
|
|
153
|
+
status: (msg, context) => {
|
|
154
|
+
// Only finish streaming if this buffer actually started it
|
|
155
|
+
if ((msg.status === "idle" || msg.status === "cancelled") &&
|
|
156
|
+
context.buffer()?.isStreaming) {
|
|
157
|
+
context.state.finishAssistantMessage(context.key);
|
|
158
|
+
}
|
|
159
|
+
// A session that finished while we were offline never delivers its
|
|
160
|
+
// `result` — the idle status on reconnect is the cue to resync. Keyed to
|
|
161
|
+
// THIS frame's session: a background session settling must not consume
|
|
162
|
+
// (or trigger) the active session's pending resync.
|
|
163
|
+
if (msg.status === "idle" || msg.status === "cancelled") {
|
|
164
|
+
const current = useChatStore.getState();
|
|
165
|
+
context.resyncIfNeeded(context.frameSessionId ?? current.activeSessionId);
|
|
166
|
+
// Cold load: we hold a stored session id but an empty transcript and
|
|
167
|
+
// the server is idle (so it sent no snapshot). Fetch the history.
|
|
168
|
+
// Only the active session's own (or an unscoped legacy) idle counts.
|
|
169
|
+
if (!context.frameSessionId || context.frameSessionId === current.activeSessionId) {
|
|
170
|
+
context.coldResumeIfNeeded(current.activeSessionId, activeChat(current).messages.length);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
},
|
|
174
|
+
};
|
|
175
|
+
//# sourceMappingURL=chat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat.js","sourceRoot":"","sources":["../../../src/hooks/websocket-handlers/chat.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare const connectionFrameHandlers: {
|
|
2
|
+
server_hello: (msg: import("@schlessera/brain-ui-sdk/protocol").ServerHello, context: import("./types.js").DispatchContext) => void;
|
|
3
|
+
location_request: (msg: import("@schlessera/brain-ui-sdk/protocol").ServerLocationRequest, context: import("./types.js").DispatchContext) => void;
|
|
4
|
+
error: (msg: import("@schlessera/brain-ui-sdk/protocol").ServerError, context: import("./types.js").DispatchContext) => void;
|
|
5
|
+
};
|
|
6
|
+
//# sourceMappingURL=connection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../../src/hooks/websocket-handlers/connection.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,uBAAuB;;;;CAuBgB,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { useActivityStore } from "../../stores/activity-store.js";
|
|
2
|
+
import { useConnectionStore } from "../../stores/connection-store.js";
|
|
3
|
+
export const connectionFrameHandlers = {
|
|
4
|
+
server_hello: (msg, context) => {
|
|
5
|
+
useActivityStore.getState().setSupported(msg.capabilities?.activity === true);
|
|
6
|
+
// A new hello means a new connection: server-side subscriptions are gone.
|
|
7
|
+
useActivityStore.getState().resetSubscriptions();
|
|
8
|
+
// …and view-owned subscriptions (the Activity index) must re-send too.
|
|
9
|
+
useActivityStore.getState().bumpConnectionEpoch();
|
|
10
|
+
context.ensureActivitySubscription(context.state.activeSessionId);
|
|
11
|
+
},
|
|
12
|
+
location_request: (msg, context) => {
|
|
13
|
+
context.requestBrowserLocation(msg);
|
|
14
|
+
},
|
|
15
|
+
error: (msg, context) => {
|
|
16
|
+
// ALWAYS recorded. Appending to the transcript only works while a
|
|
17
|
+
// message is streaming, and this used to be the whole handler — so an
|
|
18
|
+
// error arriving between turns (a rejected frame, a failed resume) was
|
|
19
|
+
// dropped as silently on the client as it was on the server.
|
|
20
|
+
useConnectionStore.getState().reportError(msg.code, msg.message);
|
|
21
|
+
if (context.buffer()?.isStreaming) {
|
|
22
|
+
context.state.appendText(context.key, `\n\n**Error:** ${msg.message}`);
|
|
23
|
+
context.state.finishAssistantMessage(context.key);
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=connection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../../../src/hooks/websocket-handlers/connection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAKtE,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,YAAY,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE;QAC7B,gBAAgB,CAAC,QAAQ,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,YAAY,EAAE,QAAQ,KAAK,IAAI,CAAC,CAAC;QAC9E,0EAA0E;QAC1E,gBAAgB,CAAC,QAAQ,EAAE,CAAC,kBAAkB,EAAE,CAAC;QACjD,uEAAuE;QACvE,gBAAgB,CAAC,QAAQ,EAAE,CAAC,mBAAmB,EAAE,CAAC;QAClD,OAAO,CAAC,0BAA0B,CAAC,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IACpE,CAAC;IACD,gBAAgB,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE;QACjC,OAAO,CAAC,sBAAsB,CAAC,GAAG,CAAC,CAAC;IACtC,CAAC;IACD,KAAK,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE;QACtB,kEAAkE;QAClE,sEAAsE;QACtE,uEAAuE;QACvE,6DAA6D;QAC7D,kBAAkB,CAAC,QAAQ,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;QACjE,IAAI,OAAO,CAAC,MAAM,EAAE,EAAE,WAAW,EAAE,CAAC;YAClC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,kBAAkB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YACvE,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;CACiD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/hooks/websocket-handlers/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAMvE,OAAO,KAAK,EACV,eAAe,EAGhB,MAAM,YAAY,CAAC;AA2CpB,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,aAAa,EAAE,OAAO,EAAE,eAAe,GAAG,IAAI,CAKxF"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { activityFrameHandlers } from "./activity.js";
|
|
2
|
+
import { chatFrameHandlers } from "./chat.js";
|
|
3
|
+
import { connectionFrameHandlers } from "./connection.js";
|
|
4
|
+
import { maskFrameHandlers } from "./mask.js";
|
|
5
|
+
import { providerFrameHandlers } from "./provider.js";
|
|
6
|
+
const serverMessageHandlers = {
|
|
7
|
+
...chatFrameHandlers,
|
|
8
|
+
...activityFrameHandlers,
|
|
9
|
+
...maskFrameHandlers,
|
|
10
|
+
...providerFrameHandlers,
|
|
11
|
+
...connectionFrameHandlers,
|
|
12
|
+
};
|
|
13
|
+
export function dispatchServerMessage(msg, context) {
|
|
14
|
+
// The mapped type preserves the message/handler correlation. TypeScript
|
|
15
|
+
// loses that correlation at an indexed union access, so restore it only at
|
|
16
|
+
// this single composition boundary.
|
|
17
|
+
serverMessageHandlers[msg.type](msg, context);
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/hooks/websocket-handlers/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAwCtD,MAAM,qBAAqB,GAAG;IAC5B,GAAG,iBAAiB;IACpB,GAAG,qBAAqB;IACxB,GAAG,iBAAiB;IACpB,GAAG,qBAAqB;IACxB,GAAG,uBAAuB;CAC0B,CAAC;AAEvD,MAAM,UAAU,qBAAqB,CAAC,GAAkB,EAAE,OAAwB;IAChF,wEAAwE;IACxE,2EAA2E;IAC3E,oCAAoC;IACpC,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAY,EAAE,OAAO,CAAC,CAAC;AACzD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mask.d.ts","sourceRoot":"","sources":["../../../src/hooks/websocket-handlers/mask.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,iBAAiB;;CAWgB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { useMaskStore } from "../../stores/mask-store.js";
|
|
2
|
+
export const maskFrameHandlers = {
|
|
3
|
+
mask_request: (msg) => {
|
|
4
|
+
// Opens the editor; the answer travels back from the component, because
|
|
5
|
+
// only the user can say which part of the picture they meant.
|
|
6
|
+
useMaskStore.getState().open({
|
|
7
|
+
requestId: msg.requestId,
|
|
8
|
+
imagePath: msg.imagePath,
|
|
9
|
+
...(msg.instruction ? { instruction: msg.instruction } : {}),
|
|
10
|
+
...(msg.turnId ? { turnId: msg.turnId } : {}),
|
|
11
|
+
});
|
|
12
|
+
},
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=mask.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mask.js","sourceRoot":"","sources":["../../../src/hooks/websocket-handlers/mask.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAK1D,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,YAAY,EAAE,CAAC,GAAG,EAAE,EAAE;QACpB,wEAAwE;QACxE,8DAA8D;QAC9D,YAAY,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC;YAC3B,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5D,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9C,CAAC,CAAC;IACL,CAAC;CAC2C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/hooks/websocket-handlers/provider.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,qBAAqB;;CA4BgB,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { useChatStore } from "../../stores/chat-store.js";
|
|
2
|
+
import { useProviderStore } from "../../stores/provider-store.js";
|
|
3
|
+
export const providerFrameHandlers = {
|
|
4
|
+
session_info: (msg, context) => {
|
|
5
|
+
context.ensureActivitySubscription(msg.sessionId);
|
|
6
|
+
// Record backend ownership for renderer scoping — for ANY session, since
|
|
7
|
+
// background sessions keep their own transcript buffers. Older servers
|
|
8
|
+
// omit backendId; derive it from the pinned profile when still possible
|
|
9
|
+
// (fails only for since-hidden profiles, which then use the default).
|
|
10
|
+
const ownerBackendId = msg.backendId ??
|
|
11
|
+
useProviderStore
|
|
12
|
+
.getState()
|
|
13
|
+
.available.find((p) => p.id === msg.providerId)?.backendId;
|
|
14
|
+
if (ownerBackendId) {
|
|
15
|
+
useChatStore.getState().setSessionBackend(msg.sessionId, ownerBackendId);
|
|
16
|
+
}
|
|
17
|
+
// bindDraftSession in the dispatcher handled draft adoption; an info frame
|
|
18
|
+
// may still re-pin the provider picker when it concerns the session in view.
|
|
19
|
+
const current = useChatStore.getState();
|
|
20
|
+
if (context.frameSessionId && context.frameSessionId === current.activeSessionId) {
|
|
21
|
+
useProviderStore.getState().setPinned(msg.providerId ?? null);
|
|
22
|
+
// Reattachment on a fresh connection: enter streaming mode so deltas
|
|
23
|
+
// append to a live assistant message instead of vanishing.
|
|
24
|
+
const chat = current.buffers[context.frameSessionId];
|
|
25
|
+
if (chat && !chat.isStreaming && chat.messages.length === 0) {
|
|
26
|
+
current.startAssistantMessage(context.frameSessionId);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../src/hooks/websocket-handlers/provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAKlE,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,YAAY,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE;QAC7B,OAAO,CAAC,0BAA0B,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAClD,yEAAyE;QACzE,uEAAuE;QACvE,wEAAwE;QACxE,sEAAsE;QACtE,MAAM,cAAc,GAClB,GAAG,CAAC,SAAS;YACb,gBAAgB;iBACb,QAAQ,EAAE;iBACV,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,UAAU,CAAC,EAAE,SAAS,CAAC;QAC/D,IAAI,cAAc,EAAE,CAAC;YACnB,YAAY,CAAC,QAAQ,EAAE,CAAC,iBAAiB,CAAC,GAAG,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;QAC3E,CAAC;QACD,2EAA2E;QAC3E,6EAA6E;QAC7E,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,CAAC;QACxC,IAAI,OAAO,CAAC,cAAc,IAAI,OAAO,CAAC,cAAc,KAAK,OAAO,CAAC,eAAe,EAAE,CAAC;YACjF,gBAAgB,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,IAAI,IAAI,CAAC,CAAC;YAC9D,qEAAqE;YACrE,2DAA2D;YAC3D,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;YACrD,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC5D,OAAO,CAAC,qBAAqB,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;YACxD,CAAC;QACH,CAAC;IACH,CAAC;CAC+C,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { ServerMessage } from "@schlessera/brain-ui-sdk/protocol";
|
|
2
|
+
import type { ChatKey, SessionChat } from "../../stores/chat-store.js";
|
|
3
|
+
import { useChatStore } from "../../stores/chat-store.js";
|
|
4
|
+
export type ServerMessageType = ServerMessage["type"];
|
|
5
|
+
export interface DispatchContext {
|
|
6
|
+
state: ReturnType<typeof useChatStore.getState>;
|
|
7
|
+
frameSessionId: string | undefined;
|
|
8
|
+
key: ChatKey;
|
|
9
|
+
buffer: () => SessionChat | null | undefined;
|
|
10
|
+
enqueueDelta: (key: ChatKey, kind: "text" | "thinking", text: string) => void;
|
|
11
|
+
ensureActivitySubscription: (sessionId: string | null | undefined) => void;
|
|
12
|
+
requestBrowserLocation: (msg: Extract<ServerMessage, {
|
|
13
|
+
type: "location_request";
|
|
14
|
+
}>) => void;
|
|
15
|
+
resyncIfNeeded: (sessionId: string | null) => void;
|
|
16
|
+
coldResumeIfNeeded: (sessionId: string | null, messageCount: number) => void;
|
|
17
|
+
markHistoryReplaced: (key: ChatKey) => void;
|
|
18
|
+
}
|
|
19
|
+
export type ServerMessageHandlerMap<T extends ServerMessageType> = {
|
|
20
|
+
[K in T]: (msg: Extract<ServerMessage, {
|
|
21
|
+
type: K;
|
|
22
|
+
}>, context: DispatchContext) => void;
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/hooks/websocket-handlers/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AACvE,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE1D,MAAM,MAAM,iBAAiB,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;AAEtD,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,QAAQ,CAAC,CAAC;IAChD,cAAc,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,GAAG,EAAE,OAAO,CAAC;IACb,MAAM,EAAE,MAAM,WAAW,GAAG,IAAI,GAAG,SAAS,CAAC;IAC7C,YAAY,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9E,0BAA0B,EAAE,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,KAAK,IAAI,CAAC;IAC3E,sBAAsB,EAAE,CACtB,GAAG,EAAE,OAAO,CAAC,aAAa,EAAE;QAAE,IAAI,EAAE,kBAAkB,CAAA;KAAE,CAAC,KACtD,IAAI,CAAC;IACV,cAAc,EAAE,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IACnD,kBAAkB,EAAE,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,EAAE,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7E,mBAAmB,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAC;CAC7C;AAED,MAAM,MAAM,uBAAuB,CAAC,CAAC,SAAS,iBAAiB,IAAI;KAChE,CAAC,IAAI,CAAC,GAAG,CACR,GAAG,EAAE,OAAO,CAAC,aAAa,EAAE;QAAE,IAAI,EAAE,CAAC,CAAA;KAAE,CAAC,EACxC,OAAO,EAAE,eAAe,KACrB,IAAI;CACV,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/hooks/websocket-handlers/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { ActivitySpan, ActivitySpanEvent } from "@schlessera/brain-ui-sdk/protocol";
|
|
2
|
+
import type { ActivityState, MirrorMaps } from "./activity-store-types.js";
|
|
3
|
+
export declare function rootSpanOf(byId: Record<string, ActivitySpan>): ActivitySpan | undefined;
|
|
4
|
+
/** Drop a whole run from the mirror — spans, events, high-water, reverse index. */
|
|
5
|
+
export declare function evictRun(maps: MirrorMaps, runId: string): void;
|
|
6
|
+
/**
|
|
7
|
+
* Enforce the terminal-run bound in place. Returns whether anything was
|
|
8
|
+
* evicted. Runs whose root span is still open (or unknown) are never touched.
|
|
9
|
+
*/
|
|
10
|
+
export declare function pruneTerminalRuns(maps: MirrorMaps): boolean;
|
|
11
|
+
export declare function insertEvent(list: ActivitySpanEvent[] | undefined, event: ActivitySpanEvent): ActivitySpanEvent[];
|
|
12
|
+
/** All spans of a run, roots first, then by start time. */
|
|
13
|
+
export declare function runSpans(state: ActivityState, runId: string): ActivitySpan[];
|
|
14
|
+
/** Direct children of a span (e.g. the tool calls inside a subagent). */
|
|
15
|
+
export declare function childSpans(state: ActivityState, parentSpanId: string): ActivitySpan[];
|
|
16
|
+
/** The subagent spans spawned by a turn's Agent tool calls, live status included. */
|
|
17
|
+
export declare function subagentSpans(state: ActivityState, sessionId: string): ActivitySpan[];
|
|
18
|
+
/** Stable empty result for `eventsFor` — a fresh `[]` per call would defeat
|
|
19
|
+
* reference-equality checks in zustand selectors. */
|
|
20
|
+
export declare const EMPTY_EVENTS: ActivitySpanEvent[];
|
|
21
|
+
/** Ordered events of a span; the shared frozen empty array when none. */
|
|
22
|
+
export declare function eventsFor(state: ActivityState, spanId: string): ActivitySpanEvent[];
|
|
23
|
+
/**
|
|
24
|
+
* The recorded input/output payload events of a tool span (AE7). Returns a
|
|
25
|
+
* fresh array per call — subscribe through `useShallow` (like `childSpans`).
|
|
26
|
+
*/
|
|
27
|
+
export declare function payloadEventsFor(state: ActivityState, spanId: string): ActivitySpanEvent[];
|
|
28
|
+
/**
|
|
29
|
+
* Everything recorded against a span that is NOT a tool input/output payload:
|
|
30
|
+
* transcript excerpts, job output, and any span-sink event type a producer
|
|
31
|
+
* invents. Rendered as the span's narrative so an unknown type degrades to a
|
|
32
|
+
* labelled block rather than to invisibility.
|
|
33
|
+
*/
|
|
34
|
+
export declare function narrativeEventsFor(state: ActivityState, spanId: string): ActivitySpanEvent[];
|
|
35
|
+
/** Every event recorded under a run, ordered by time — the run detail's
|
|
36
|
+
* narrative stream and the raw-trace dump both read through this. */
|
|
37
|
+
export declare function runEvents(state: ActivityState, runId: string): ActivitySpanEvent[];
|
|
38
|
+
/** The span behind one tool call (span ids ARE toolUseIds), if streamed. */
|
|
39
|
+
export declare function spanForTool(state: ActivityState, toolUseId: string): ActivitySpan | null;
|
|
40
|
+
/**
|
|
41
|
+
* Server-stamped timing for a tool call. One clock for live and reloaded
|
|
42
|
+
* views: when the activity stream carries the span, its timestamps win over
|
|
43
|
+
* client stamps (AE2 — live and revisit must render identical timings).
|
|
44
|
+
* `waitUntil` marks the approval-wait/execution boundary.
|
|
45
|
+
*/
|
|
46
|
+
export declare function timingFor(state: ActivityState, toolUseId: string): {
|
|
47
|
+
startedAt: number;
|
|
48
|
+
endedAt?: number;
|
|
49
|
+
} | null;
|
|
50
|
+
//# sourceMappingURL=activity-store-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"activity-store-helpers.d.ts","sourceRoot":"","sources":["../../src/stores/activity-store-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACzF,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAK3E,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,YAAY,GAAG,SAAS,CAEvF;AAED,mFAAmF;AACnF,wBAAgB,QAAQ,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAQ9D;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAc3D;AAED,wBAAgB,WAAW,CACzB,IAAI,EAAE,iBAAiB,EAAE,GAAG,SAAS,EACrC,KAAK,EAAE,iBAAiB,GACvB,iBAAiB,EAAE,CAMrB;AAID,2DAA2D;AAC3D,wBAAgB,QAAQ,CAAC,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,GAAG,YAAY,EAAE,CAO5E;AAED,yEAAyE;AACzE,wBAAgB,UAAU,CAAC,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,GAAG,YAAY,EAAE,CAMrF;AAED,qFAAqF;AACrF,wBAAgB,aAAa,CAAC,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,GAAG,YAAY,EAAE,CAQrF;AAED;sDACsD;AACtD,eAAO,MAAM,YAAY,EAAE,iBAAiB,EAEpB,CAAC;AAEzB,yEAAyE;AACzE,wBAAgB,SAAS,CAAC,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAEnF;AAOD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAK1F;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,MAAM,GACb,iBAAiB,EAAE,CAKrB;AAED;sEACsE;AACtE,wBAAgB,SAAS,CAAC,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAUlF;AAED,4EAA4E;AAC5E,wBAAgB,WAAW,CAAC,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAGxF;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CACvB,KAAK,EAAE,aAAa,EACpB,SAAS,EAAE,MAAM,GAChB;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAOhD"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/** Bound on the mirror: how many TERMINAL runs stay held. Live runs never count. */
|
|
2
|
+
const MAX_TERMINAL_RUNS = 50;
|
|
3
|
+
export function rootSpanOf(byId) {
|
|
4
|
+
return Object.values(byId).find((span) => span.parentSpanId === undefined);
|
|
5
|
+
}
|
|
6
|
+
/** Drop a whole run from the mirror — spans, events, high-water, reverse index. */
|
|
7
|
+
export function evictRun(maps, runId) {
|
|
8
|
+
for (const spanId of Object.keys(maps.spans[runId] ?? {})) {
|
|
9
|
+
delete maps.events[spanId];
|
|
10
|
+
delete maps.spanRun[spanId];
|
|
11
|
+
}
|
|
12
|
+
delete maps.spans[runId];
|
|
13
|
+
delete maps.highWater[runId];
|
|
14
|
+
delete maps.deltaSeq[runId];
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Enforce the terminal-run bound in place. Returns whether anything was
|
|
18
|
+
* evicted. Runs whose root span is still open (or unknown) are never touched.
|
|
19
|
+
*/
|
|
20
|
+
export function pruneTerminalRuns(maps) {
|
|
21
|
+
const terminal = [];
|
|
22
|
+
for (const [runId, byId] of Object.entries(maps.spans)) {
|
|
23
|
+
const root = rootSpanOf(byId);
|
|
24
|
+
if (root && root.outcome !== undefined) {
|
|
25
|
+
terminal.push({ runId, startedAt: root.startedAt });
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
if (terminal.length <= MAX_TERMINAL_RUNS)
|
|
29
|
+
return false;
|
|
30
|
+
terminal.sort((a, b) => a.startedAt - b.startedAt);
|
|
31
|
+
for (const { runId } of terminal.slice(0, terminal.length - MAX_TERMINAL_RUNS)) {
|
|
32
|
+
evictRun(maps, runId);
|
|
33
|
+
}
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
export function insertEvent(list, event) {
|
|
37
|
+
const existing = list ?? [];
|
|
38
|
+
if (existing.some((e) => e.eventIndex === event.eventIndex))
|
|
39
|
+
return existing;
|
|
40
|
+
const next = [...existing, event];
|
|
41
|
+
next.sort((a, b) => a.eventIndex - b.eventIndex);
|
|
42
|
+
return next;
|
|
43
|
+
}
|
|
44
|
+
// --- Selectors (plain functions over the state, like activeChat) ---
|
|
45
|
+
/** All spans of a run, roots first, then by start time. */
|
|
46
|
+
export function runSpans(state, runId) {
|
|
47
|
+
const byId = state.spans[runId];
|
|
48
|
+
if (!byId)
|
|
49
|
+
return [];
|
|
50
|
+
return Object.values(byId).sort((a, b) => (a.parentSpanId ? 1 : 0) - (b.parentSpanId ? 1 : 0) || a.startedAt - b.startedAt);
|
|
51
|
+
}
|
|
52
|
+
/** Direct children of a span (e.g. the tool calls inside a subagent). */
|
|
53
|
+
export function childSpans(state, parentSpanId) {
|
|
54
|
+
const runId = state.spanRun[parentSpanId];
|
|
55
|
+
if (!runId)
|
|
56
|
+
return [];
|
|
57
|
+
return Object.values(state.spans[runId] ?? {})
|
|
58
|
+
.filter((s) => s.parentSpanId === parentSpanId)
|
|
59
|
+
.sort((a, b) => a.startedAt - b.startedAt);
|
|
60
|
+
}
|
|
61
|
+
/** The subagent spans spawned by a turn's Agent tool calls, live status included. */
|
|
62
|
+
export function subagentSpans(state, sessionId) {
|
|
63
|
+
const out = [];
|
|
64
|
+
for (const byId of Object.values(state.spans)) {
|
|
65
|
+
for (const span of Object.values(byId)) {
|
|
66
|
+
if (span.kind === "subagent" && span.sessionId === sessionId)
|
|
67
|
+
out.push(span);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return out.sort((a, b) => a.startedAt - b.startedAt);
|
|
71
|
+
}
|
|
72
|
+
/** Stable empty result for `eventsFor` — a fresh `[]` per call would defeat
|
|
73
|
+
* reference-equality checks in zustand selectors. */
|
|
74
|
+
export const EMPTY_EVENTS = Object.freeze([]);
|
|
75
|
+
/** Ordered events of a span; the shared frozen empty array when none. */
|
|
76
|
+
export function eventsFor(state, spanId) {
|
|
77
|
+
return state.events[spanId] ?? EMPTY_EVENTS;
|
|
78
|
+
}
|
|
79
|
+
/** Payload event types the tool expander owns — every OTHER type belongs to
|
|
80
|
+
* the narrative stream (`narrativeEventsFor`) so nothing recorded is
|
|
81
|
+
* rendered nowhere. */
|
|
82
|
+
const TOOL_PAYLOAD_TYPES = new Set(["tool_input", "tool_output"]);
|
|
83
|
+
/**
|
|
84
|
+
* The recorded input/output payload events of a tool span (AE7). Returns a
|
|
85
|
+
* fresh array per call — subscribe through `useShallow` (like `childSpans`).
|
|
86
|
+
*/
|
|
87
|
+
export function payloadEventsFor(state, spanId) {
|
|
88
|
+
const events = state.events[spanId];
|
|
89
|
+
if (!events)
|
|
90
|
+
return EMPTY_EVENTS;
|
|
91
|
+
const payloads = events.filter((e) => TOOL_PAYLOAD_TYPES.has(e.eventType));
|
|
92
|
+
return payloads.length > 0 ? payloads : EMPTY_EVENTS;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Everything recorded against a span that is NOT a tool input/output payload:
|
|
96
|
+
* transcript excerpts, job output, and any span-sink event type a producer
|
|
97
|
+
* invents. Rendered as the span's narrative so an unknown type degrades to a
|
|
98
|
+
* labelled block rather than to invisibility.
|
|
99
|
+
*/
|
|
100
|
+
export function narrativeEventsFor(state, spanId) {
|
|
101
|
+
const events = state.events[spanId];
|
|
102
|
+
if (!events)
|
|
103
|
+
return EMPTY_EVENTS;
|
|
104
|
+
const rest = events.filter((e) => !TOOL_PAYLOAD_TYPES.has(e.eventType));
|
|
105
|
+
return rest.length > 0 ? rest : EMPTY_EVENTS;
|
|
106
|
+
}
|
|
107
|
+
/** Every event recorded under a run, ordered by time — the run detail's
|
|
108
|
+
* narrative stream and the raw-trace dump both read through this. */
|
|
109
|
+
export function runEvents(state, runId) {
|
|
110
|
+
const byId = state.spans[runId];
|
|
111
|
+
if (!byId)
|
|
112
|
+
return EMPTY_EVENTS;
|
|
113
|
+
const out = [];
|
|
114
|
+
for (const spanId of Object.keys(byId)) {
|
|
115
|
+
const events = state.events[spanId];
|
|
116
|
+
if (events)
|
|
117
|
+
out.push(...events);
|
|
118
|
+
}
|
|
119
|
+
if (out.length === 0)
|
|
120
|
+
return EMPTY_EVENTS;
|
|
121
|
+
return out.sort((a, b) => a.ts - b.ts || a.eventIndex - b.eventIndex);
|
|
122
|
+
}
|
|
123
|
+
/** The span behind one tool call (span ids ARE toolUseIds), if streamed. */
|
|
124
|
+
export function spanForTool(state, toolUseId) {
|
|
125
|
+
const runId = state.spanRun[toolUseId];
|
|
126
|
+
return runId ? (state.spans[runId]?.[toolUseId] ?? null) : null;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Server-stamped timing for a tool call. One clock for live and reloaded
|
|
130
|
+
* views: when the activity stream carries the span, its timestamps win over
|
|
131
|
+
* client stamps (AE2 — live and revisit must render identical timings).
|
|
132
|
+
* `waitUntil` marks the approval-wait/execution boundary.
|
|
133
|
+
*/
|
|
134
|
+
export function timingFor(state, toolUseId) {
|
|
135
|
+
const span = spanForTool(state, toolUseId);
|
|
136
|
+
if (!span)
|
|
137
|
+
return null;
|
|
138
|
+
return {
|
|
139
|
+
startedAt: span.waitUntil ?? span.startedAt,
|
|
140
|
+
...(span.endedAt !== undefined ? { endedAt: span.endedAt } : {}),
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=activity-store-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"activity-store-helpers.js","sourceRoot":"","sources":["../../src/stores/activity-store-helpers.ts"],"names":[],"mappings":"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"}
|