@kortix/sdk 0.10.12 → 0.10.14
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 +34 -11
- package/dist/browser/session-sync/session-sync-registry.d.ts +39 -0
- package/dist/browser/session-sync/session-sync-registry.d.ts.map +1 -0
- package/dist/browser/session-sync/session-sync-registry.js +146 -0
- package/dist/browser/session-sync/session-sync-registry.js.map +1 -0
- package/dist/core/client/kortix.d.ts +20 -4
- package/dist/core/client/kortix.d.ts.map +1 -1
- package/dist/core/client/kortix.js +35 -3
- package/dist/core/client/kortix.js.map +1 -1
- package/dist/core/http/api-client.d.ts +9 -0
- package/dist/core/http/api-client.d.ts.map +1 -1
- package/dist/core/http/api-client.js +27 -1
- package/dist/core/http/api-client.js.map +1 -1
- package/dist/core/http/config.d.ts +1 -0
- package/dist/core/http/config.d.ts.map +1 -1
- package/dist/core/http/config.js.map +1 -1
- package/dist/core/http/feature-flags.d.ts +1 -0
- package/dist/core/http/feature-flags.d.ts.map +1 -1
- package/dist/core/http/feature-flags.js +2 -13
- package/dist/core/http/feature-flags.js.map +1 -1
- package/dist/core/rest/projects-client/connectors.d.ts +37 -0
- package/dist/core/rest/projects-client/connectors.d.ts.map +1 -1
- package/dist/core/rest/projects-client/connectors.js +9 -0
- package/dist/core/rest/projects-client/connectors.js.map +1 -1
- package/dist/core/rest/projects-client/github.d.ts +30 -1
- package/dist/core/rest/projects-client/github.d.ts.map +1 -1
- package/dist/core/rest/projects-client/github.js +12 -1
- package/dist/core/rest/projects-client/github.js.map +1 -1
- package/dist/core/rest/projects-client/model-defaults.d.ts +1 -1
- package/dist/core/rest/projects-client/model-defaults.d.ts.map +1 -1
- package/dist/core/rest/projects-client/model-defaults.js.map +1 -1
- package/dist/core/rest/projects-client/projects.d.ts +135 -14
- package/dist/core/rest/projects-client/projects.d.ts.map +1 -1
- package/dist/core/rest/projects-client/projects.js +18 -6
- package/dist/core/rest/projects-client/projects.js.map +1 -1
- package/dist/core/rest/projects-client/session-sandbox.d.ts +10 -3
- package/dist/core/rest/projects-client/session-sandbox.d.ts.map +1 -1
- package/dist/core/rest/projects-client/session-sandbox.js +48 -10
- package/dist/core/rest/projects-client/session-sandbox.js.map +1 -1
- package/dist/core/rest/projects-client/sessions.d.ts +46 -2
- package/dist/core/rest/projects-client/sessions.d.ts.map +1 -1
- package/dist/core/rest/projects-client/sessions.js +3 -2
- package/dist/core/rest/projects-client/sessions.js.map +1 -1
- package/dist/core/rest/projects-client/triggers.d.ts +43 -11
- package/dist/core/rest/projects-client/triggers.d.ts.map +1 -1
- package/dist/core/rest/projects-client/triggers.js.map +1 -1
- package/dist/core/session-sync/session-sync-controller.d.ts +89 -0
- package/dist/core/session-sync/session-sync-controller.d.ts.map +1 -0
- package/dist/core/session-sync/session-sync-controller.js +248 -0
- package/dist/core/session-sync/session-sync-controller.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/kortix.esm.min.js +31 -31
- package/dist/kortix.global.js +31 -31
- package/dist/node/server.d.ts +0 -21
- package/dist/node/server.d.ts.map +1 -1
- package/dist/node/server.js +23 -1
- package/dist/node/server.js.map +1 -1
- package/dist/react/index.d.ts +1 -0
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +5 -0
- package/dist/react/index.js.map +1 -1
- package/dist/react/model-flatten.d.ts.map +1 -1
- package/dist/react/model-flatten.js +4 -0
- package/dist/react/model-flatten.js.map +1 -1
- package/dist/react/provider-selection.d.ts.map +1 -1
- package/dist/react/provider-selection.js +3 -2
- package/dist/react/provider-selection.js.map +1 -1
- package/dist/react/pty-query-state.d.ts +3 -0
- package/dist/react/pty-query-state.d.ts.map +1 -0
- package/dist/react/pty-query-state.js +7 -0
- package/dist/react/pty-query-state.js.map +1 -0
- package/dist/react/session-start-stash.d.ts.map +1 -1
- package/dist/react/session-start-stash.js +17 -4
- package/dist/react/session-start-stash.js.map +1 -1
- package/dist/react/use-model-store.d.ts +16 -0
- package/dist/react/use-model-store.d.ts.map +1 -1
- package/dist/react/use-model-store.js +6 -7
- package/dist/react/use-model-store.js.map +1 -1
- package/dist/react/use-opencode-events/handle-event.d.ts +2 -0
- package/dist/react/use-opencode-events/handle-event.d.ts.map +1 -1
- package/dist/react/use-opencode-events/handle-event.js +13 -28
- package/dist/react/use-opencode-events/handle-event.js.map +1 -1
- package/dist/react/use-opencode-events/index.d.ts.map +1 -1
- package/dist/react/use-opencode-events/index.js +7 -13
- package/dist/react/use-opencode-events/index.js.map +1 -1
- package/dist/react/use-opencode-local.d.ts +6 -7
- package/dist/react/use-opencode-local.d.ts.map +1 -1
- package/dist/react/use-opencode-local.js +18 -32
- package/dist/react/use-opencode-local.js.map +1 -1
- package/dist/react/use-opencode-pty.d.ts +2 -0
- package/dist/react/use-opencode-pty.d.ts.map +1 -1
- package/dist/react/use-opencode-pty.js +15 -7
- package/dist/react/use-opencode-pty.js.map +1 -1
- package/dist/react/use-opencode-sessions/no-compaction-model-error.d.ts +31 -0
- package/dist/react/use-opencode-sessions/no-compaction-model-error.d.ts.map +1 -0
- package/dist/react/use-opencode-sessions/no-compaction-model-error.js +34 -0
- package/dist/react/use-opencode-sessions/no-compaction-model-error.js.map +1 -0
- package/dist/react/use-opencode-sessions/sessions.d.ts.map +1 -1
- package/dist/react/use-opencode-sessions/sessions.js +12 -2
- package/dist/react/use-opencode-sessions/sessions.js.map +1 -1
- package/dist/react/use-session-prefetch.d.ts +4 -14
- package/dist/react/use-session-prefetch.d.ts.map +1 -1
- package/dist/react/use-session-prefetch.js +13 -73
- package/dist/react/use-session-prefetch.js.map +1 -1
- package/dist/react/use-session-send.d.ts +1 -0
- package/dist/react/use-session-send.d.ts.map +1 -1
- package/dist/react/use-session-send.js +2 -1
- package/dist/react/use-session-send.js.map +1 -1
- package/dist/react/use-session-sync.d.ts +10 -8
- package/dist/react/use-session-sync.d.ts.map +1 -1
- package/dist/react/use-session-sync.js +39 -327
- package/dist/react/use-session-sync.js.map +1 -1
- package/dist/transcript.d.ts +30 -1
- package/dist/transcript.d.ts.map +1 -1
- package/dist/transcript.js +13 -16
- package/dist/transcript.js.map +1 -1
- package/package.json +4 -2
|
@@ -1,36 +1,16 @@
|
|
|
1
|
-
|
|
2
|
-
import { useEffect,
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
|
|
1
|
+
'use client';
|
|
2
|
+
import { useEffect, useSyncExternalStore } from 'react';
|
|
3
|
+
import { getSessionSyncController, loadSessionTranscriptMessages, retainSessionSyncController, } from '../browser/session-sync/session-sync-registry.js';
|
|
4
|
+
import { useSandboxConnectionStore } from '../browser/stores/sandbox-connection-store.js';
|
|
5
|
+
import { useSyncStore } from '../browser/stores/sync-store.js';
|
|
6
|
+
import { canQueryOpenCodeSession } from './use-opencode-sessions/index.js';
|
|
7
|
+
export { loadSessionTranscriptMessages };
|
|
8
8
|
const EMPTY_MESSAGES = [];
|
|
9
9
|
const EMPTY_DIFFS = [];
|
|
10
10
|
const EMPTY_TODOS = [];
|
|
11
|
-
const IDLE_STATUS = { type:
|
|
12
|
-
const MESSAGE_POLL_INTERVAL_MS = 10_000;
|
|
13
|
-
const NETWORK_REVALIDATE_COOLDOWN_MS = 60_000;
|
|
14
|
-
/**
|
|
15
|
-
* Build MessageWithParts[] with reference caching.
|
|
16
|
-
* Returns the same array reference if nothing relevant changed.
|
|
17
|
-
* This is a module-level cache keyed by sessionId so multiple components
|
|
18
|
-
* using the same sessionId share the cache (e.g. SessionLayout + SessionChat).
|
|
19
|
-
*/
|
|
11
|
+
const IDLE_STATUS = { type: 'idle' };
|
|
20
12
|
const MESSAGE_CACHE_MAX = 20;
|
|
21
13
|
const messageCache = new Map();
|
|
22
|
-
const inFlightInitialLoads = new Map();
|
|
23
|
-
const lastNetworkLoadAttemptAt = new Map();
|
|
24
|
-
const pollInFlightSessions = new Set();
|
|
25
|
-
function markNetworkLoadAttempt(sessionId) {
|
|
26
|
-
lastNetworkLoadAttemptAt.delete(sessionId);
|
|
27
|
-
lastNetworkLoadAttemptAt.set(sessionId, Date.now());
|
|
28
|
-
if (lastNetworkLoadAttemptAt.size > MESSAGE_CACHE_MAX) {
|
|
29
|
-
const oldest = lastNetworkLoadAttemptAt.keys().next().value;
|
|
30
|
-
if (oldest)
|
|
31
|
-
lastNetworkLoadAttemptAt.delete(oldest);
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
14
|
function touchMessageCache(sessionId) {
|
|
35
15
|
const entry = messageCache.get(sessionId);
|
|
36
16
|
if (entry) {
|
|
@@ -48,326 +28,58 @@ function buildMessages(sessionId, msgs, parts) {
|
|
|
48
28
|
return EMPTY_MESSAGES;
|
|
49
29
|
const cached = messageCache.get(sessionId);
|
|
50
30
|
if (cached && cached.msgs === msgs) {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
if (same) {
|
|
54
|
-
for (let i = 0; i < msgs.length; i++) {
|
|
55
|
-
if (parts[msgs[i].id] !== cached.partRefs[i]) {
|
|
56
|
-
same = false;
|
|
57
|
-
break;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
}
|
|
31
|
+
const same = cached.partRefs.length === msgs.length &&
|
|
32
|
+
msgs.every((message, index) => Object.is(parts[message.id], cached.partRefs[index]));
|
|
61
33
|
if (same)
|
|
62
34
|
return cached.result;
|
|
63
35
|
}
|
|
64
|
-
|
|
65
|
-
const
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
partRefs.push(pa);
|
|
70
|
-
result.push({ info, parts: pa ?? [] });
|
|
71
|
-
}
|
|
36
|
+
const partRefs = msgs.map((message) => parts[message.id]);
|
|
37
|
+
const result = msgs.map((info) => ({
|
|
38
|
+
info,
|
|
39
|
+
parts: parts[info.id] ?? [],
|
|
40
|
+
}));
|
|
72
41
|
messageCache.set(sessionId, { msgs, partRefs, result });
|
|
73
42
|
touchMessageCache(sessionId);
|
|
74
43
|
return result;
|
|
75
44
|
}
|
|
76
45
|
/**
|
|
77
|
-
*
|
|
78
|
-
*
|
|
79
|
-
*
|
|
80
|
-
* On first access, fetches messages from the server and populates the store.
|
|
81
|
-
* After that, SSE events keep the store updated in real time.
|
|
46
|
+
* Returns the current session tail and explicit history-loading state.
|
|
47
|
+
* Network synchronization lives in the framework-free SessionSyncController.
|
|
82
48
|
*/
|
|
83
49
|
export function useSessionSync(sessionId) {
|
|
84
|
-
const
|
|
85
|
-
const
|
|
86
|
-
|
|
87
|
-
// On failure, retries with backoff (500ms, 1s, 2s) up to 3 times.
|
|
88
|
-
// Without retry, a transient failure (server not ready on page refresh)
|
|
89
|
-
// permanently prevents messages from loading because fetchedRef blocks re-fetch.
|
|
50
|
+
const runtimeHealthy = useSandboxConnectionStore((state) => state.healthy === true);
|
|
51
|
+
const controller = getSessionSyncController(sessionId);
|
|
52
|
+
const sync = useSyncExternalStore(controller.subscribe, controller.getSnapshot, controller.getSnapshot);
|
|
90
53
|
useEffect(() => {
|
|
91
|
-
if (!canQueryOpenCodeSession(sessionId))
|
|
54
|
+
if (!canQueryOpenCodeSession(sessionId) || !runtimeHealthy)
|
|
92
55
|
return;
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
// NOTE: We intentionally do NOT skip the fetch when the store already
|
|
98
|
-
// has messages from SSE. SSE only delivers events from the connection
|
|
99
|
-
// point forward — it doesn't replay history. If the agent is actively
|
|
100
|
-
// streaming when the user navigates to a session, SSE stub messages
|
|
101
|
-
// would be the only messages in the store, missing the full thread
|
|
102
|
-
// history. Always fetch and let hydrate() merge safely.
|
|
103
|
-
let cancelled = false;
|
|
104
|
-
// Phase 2: Hydrate from IndexedDB cache FIRST for instant display.
|
|
105
|
-
// Server fetch still runs in background to revalidate.
|
|
106
|
-
const hydrateFromCache = async () => {
|
|
107
|
-
const existing = useSyncStore.getState().messages[sessionId];
|
|
108
|
-
if (existing && existing.length > 0)
|
|
109
|
-
return;
|
|
110
|
-
try {
|
|
111
|
-
const cached = await loadSessionFromIDB(sessionId);
|
|
112
|
-
if (cancelled)
|
|
113
|
-
return;
|
|
114
|
-
if (cached && cached.messages.length > 0) {
|
|
115
|
-
const current = useSyncStore.getState().messages[sessionId];
|
|
116
|
-
if (!current || current.length === 0) {
|
|
117
|
-
useSyncStore.getState().hydrate(sessionId, cached.messages.map((info) => ({
|
|
118
|
-
info,
|
|
119
|
-
parts: cached.parts[info.id] ?? [],
|
|
120
|
-
})));
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
catch {
|
|
125
|
-
// IDB unavailable — fall through to network fetch
|
|
126
|
-
}
|
|
127
|
-
};
|
|
128
|
-
hydrateFromCache();
|
|
129
|
-
if (!runtimeHealthy) {
|
|
130
|
-
fetchedRef.current = null;
|
|
131
|
-
return () => {
|
|
132
|
-
cancelled = true;
|
|
133
|
-
messageCache.delete(sessionId);
|
|
134
|
-
};
|
|
135
|
-
}
|
|
136
|
-
const existingMessages = useSyncStore.getState().messages[sessionId];
|
|
137
|
-
const lastNetworkLoad = lastNetworkLoadAttemptAt.get(sessionId) ?? 0;
|
|
138
|
-
if (existingMessages &&
|
|
139
|
-
existingMessages.length > 0 &&
|
|
140
|
-
Date.now() - lastNetworkLoad < NETWORK_REVALIDATE_COOLDOWN_MS) {
|
|
141
|
-
return () => {
|
|
142
|
-
cancelled = true;
|
|
143
|
-
fetchedRef.current = null;
|
|
144
|
-
messageCache.delete(sessionId);
|
|
145
|
-
};
|
|
146
|
-
}
|
|
147
|
-
// IMPORTANT: do NOT short-circuit hydrate on `cancelled`. The
|
|
148
|
-
// store is keyed by sessionID — writing into it is always safe
|
|
149
|
-
// even if this effect's component has unmounted. Strict Mode
|
|
150
|
-
// fires effect → cleanup (cancelled=true) → effect, and the
|
|
151
|
-
// in-flight dedup map below would otherwise drop the only fetch
|
|
152
|
-
// because the cancelled first run bails before hydrating.
|
|
153
|
-
const fetchWithRetry = async (attempt = 0) => {
|
|
154
|
-
try {
|
|
155
|
-
const res = await getClient().session.messages({
|
|
156
|
-
sessionID: sessionId,
|
|
157
|
-
});
|
|
158
|
-
const data = res.data ?? [];
|
|
159
|
-
if (data.length === 0) {
|
|
160
|
-
const freshState = useSyncStore.getState();
|
|
161
|
-
const existingMsgs = freshState.messages[sessionId];
|
|
162
|
-
if (existingMsgs && existingMsgs.length > 0) {
|
|
163
|
-
return;
|
|
164
|
-
}
|
|
165
|
-
// Mark session as loaded (empty) immediately so
|
|
166
|
-
// isLoading becomes false — no extra round-trip.
|
|
167
|
-
// If the session is busy (agent running), SSE events
|
|
168
|
-
// will deliver messages as they arrive.
|
|
169
|
-
freshState.clearSession(sessionId);
|
|
170
|
-
return;
|
|
171
|
-
}
|
|
172
|
-
if (res.data) {
|
|
173
|
-
useSyncStore.getState().hydrate(sessionId, res.data);
|
|
174
|
-
// Persist to IDB for next cold load
|
|
175
|
-
const state = useSyncStore.getState();
|
|
176
|
-
const msgs = state.messages[sessionId] ?? [];
|
|
177
|
-
if (msgs.length > 0) {
|
|
178
|
-
saveSessionToIDB(sessionId, msgs, state.parts);
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
catch {
|
|
183
|
-
// Stop retrying ONLY if the effect has been torn down
|
|
184
|
-
// (no live consumer wants this data anymore). Don't gate
|
|
185
|
-
// the success-path hydrate on `cancelled` — see comment
|
|
186
|
-
// above the function.
|
|
187
|
-
if (cancelled)
|
|
188
|
-
return;
|
|
189
|
-
if (attempt < 3) {
|
|
190
|
-
const delay = 500 * 2 ** attempt;
|
|
191
|
-
setTimeout(() => fetchWithRetry(attempt + 1), delay);
|
|
192
|
-
}
|
|
193
|
-
else {
|
|
194
|
-
// All retries exhausted — unblock the UI by marking
|
|
195
|
-
// the session as loaded (empty). Without this,
|
|
196
|
-
// isLoading stays true forever on cold boot when the
|
|
197
|
-
// sandbox isn't ready yet.
|
|
198
|
-
fetchedRef.current = null;
|
|
199
|
-
const state = useSyncStore.getState();
|
|
200
|
-
if (!(sessionId in state.messages)) {
|
|
201
|
-
state.clearSession(sessionId);
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
};
|
|
206
|
-
const startFetch = () => {
|
|
207
|
-
const loadPromise = fetchWithRetry().finally(() => {
|
|
208
|
-
markNetworkLoadAttempt(sessionId);
|
|
209
|
-
inFlightInitialLoads.delete(sessionId);
|
|
210
|
-
});
|
|
211
|
-
inFlightInitialLoads.set(sessionId, loadPromise);
|
|
212
|
-
return loadPromise;
|
|
213
|
-
};
|
|
214
|
-
const existingLoad = inFlightInitialLoads.get(sessionId);
|
|
215
|
-
if (existingLoad) {
|
|
216
|
-
// A prior mount fired the fetch. In Strict Mode that prior run
|
|
217
|
-
// may have been cancelled mid-flight and skipped hydrate.
|
|
218
|
-
// Await it, then verify the store actually has data — re-fire
|
|
219
|
-
// if it doesn't.
|
|
220
|
-
existingLoad
|
|
221
|
-
.catch(() => {
|
|
222
|
-
// Error handling is already performed by the owner.
|
|
223
|
-
})
|
|
224
|
-
.then(() => {
|
|
225
|
-
if (cancelled)
|
|
226
|
-
return;
|
|
227
|
-
const after = useSyncStore.getState().messages[sessionId];
|
|
228
|
-
if (after === undefined && !inFlightInitialLoads.has(sessionId)) {
|
|
229
|
-
startFetch();
|
|
230
|
-
}
|
|
231
|
-
});
|
|
232
|
-
}
|
|
233
|
-
else {
|
|
234
|
-
startFetch();
|
|
235
|
-
}
|
|
56
|
+
const release = retainSessionSyncController(sessionId);
|
|
57
|
+
// Cached messages render immediately. Revalidate one bounded tail so
|
|
58
|
+
// events produced while this route was inactive are not skipped.
|
|
59
|
+
void controller.reconcile('initial');
|
|
236
60
|
return () => {
|
|
237
|
-
|
|
238
|
-
// Allow a future real remount/navigation to fetch again while still
|
|
239
|
-
// relying on the module-level in-flight map to dedupe Strict Mode.
|
|
240
|
-
fetchedRef.current = null;
|
|
241
|
-
// Evict stale cache entry to prevent unbounded memory growth
|
|
61
|
+
release();
|
|
242
62
|
messageCache.delete(sessionId);
|
|
243
63
|
};
|
|
244
|
-
}, [
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
const pollTimerRef = useRef(null);
|
|
252
|
-
const lastPartCountRef = useRef(0);
|
|
253
|
-
const pollInFlightRef = useRef(false);
|
|
64
|
+
}, [controller, runtimeHealthy, sessionId]);
|
|
65
|
+
const messages = useSyncStore((state) => buildMessages(sessionId, state.messages[sessionId], state.parts));
|
|
66
|
+
const status = useSyncStore((state) => state.sessionStatus[sessionId] ?? IDLE_STATUS);
|
|
67
|
+
const diffs = useSyncStore((state) => state.diffs[sessionId]);
|
|
68
|
+
const todos = useSyncStore((state) => state.todos[sessionId]);
|
|
69
|
+
const isBusy = status.type === 'busy' || status.type === 'retry';
|
|
70
|
+
const isLoading = !useSyncStore((state) => sessionId in state.messages);
|
|
254
71
|
useEffect(() => {
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
if (!runtimeHealthy) {
|
|
258
|
-
if (pollTimerRef.current) {
|
|
259
|
-
clearInterval(pollTimerRef.current);
|
|
260
|
-
pollTimerRef.current = null;
|
|
261
|
-
}
|
|
262
|
-
return;
|
|
263
|
-
}
|
|
264
|
-
const state = useSyncStore.getState();
|
|
265
|
-
const currentStatus = state.sessionStatus[sessionId];
|
|
266
|
-
const isBusyNow = currentStatus?.type === "busy" || currentStatus?.type === "retry";
|
|
267
|
-
if (isBusyNow) {
|
|
268
|
-
// Start polling if not already active
|
|
269
|
-
if (!pollTimerRef.current) {
|
|
270
|
-
// Track part count to detect SSE liveness — if parts are
|
|
271
|
-
// growing between polls, SSE is working and we skip the fetch.
|
|
272
|
-
const countParts = () => {
|
|
273
|
-
const s = useSyncStore.getState();
|
|
274
|
-
const msgs = s.messages[sessionId] ?? [];
|
|
275
|
-
let count = 0;
|
|
276
|
-
for (const m of msgs) {
|
|
277
|
-
const parts = s.parts[m.id];
|
|
278
|
-
if (parts)
|
|
279
|
-
count += parts.length;
|
|
280
|
-
}
|
|
281
|
-
return count;
|
|
282
|
-
};
|
|
283
|
-
lastPartCountRef.current = countParts();
|
|
284
|
-
pollTimerRef.current = setInterval(async () => {
|
|
285
|
-
const s = useSyncStore.getState();
|
|
286
|
-
const st = s.sessionStatus[sessionId];
|
|
287
|
-
if (st?.type !== "busy" && st?.type !== "retry") {
|
|
288
|
-
// Session went idle — stop polling
|
|
289
|
-
if (pollTimerRef.current) {
|
|
290
|
-
clearInterval(pollTimerRef.current);
|
|
291
|
-
pollTimerRef.current = null;
|
|
292
|
-
}
|
|
293
|
-
return;
|
|
294
|
-
}
|
|
295
|
-
// Skip fetch if SSE is delivering data (part count grew)
|
|
296
|
-
const currentCount = countParts();
|
|
297
|
-
if (currentCount > lastPartCountRef.current) {
|
|
298
|
-
lastPartCountRef.current = currentCount;
|
|
299
|
-
return;
|
|
300
|
-
}
|
|
301
|
-
if (pollInFlightRef.current || pollInFlightSessions.has(sessionId))
|
|
302
|
-
return;
|
|
303
|
-
// SSE appears stalled — fetch messages AND session status
|
|
304
|
-
pollInFlightRef.current = true;
|
|
305
|
-
pollInFlightSessions.add(sessionId);
|
|
306
|
-
try {
|
|
307
|
-
const [msgRes, statusRes] = await Promise.all([
|
|
308
|
-
getClient().session.messages({ sessionID: sessionId }),
|
|
309
|
-
getClient().session.status().catch(() => null),
|
|
310
|
-
]);
|
|
311
|
-
if (msgRes.data) {
|
|
312
|
-
useSyncStore.getState().hydrate(sessionId, msgRes.data);
|
|
313
|
-
}
|
|
314
|
-
// Update session status from server — without this,
|
|
315
|
-
// a dead SSE means session.idle never arrives and the
|
|
316
|
-
// UI stays stuck on "busy" forever.
|
|
317
|
-
if (statusRes?.data) {
|
|
318
|
-
const statuses = statusRes.data;
|
|
319
|
-
const serverStatus = statuses[sessionId];
|
|
320
|
-
if (serverStatus) {
|
|
321
|
-
useSyncStore.getState().setStatus(sessionId, serverStatus);
|
|
322
|
-
}
|
|
323
|
-
else {
|
|
324
|
-
// Session not in busy statuses map → it's idle
|
|
325
|
-
useSyncStore.getState().setStatus(sessionId, { type: "idle" });
|
|
326
|
-
}
|
|
327
|
-
}
|
|
328
|
-
}
|
|
329
|
-
catch {
|
|
330
|
-
// Silently ignore — will retry on next interval
|
|
331
|
-
}
|
|
332
|
-
finally {
|
|
333
|
-
pollInFlightRef.current = false;
|
|
334
|
-
pollInFlightSessions.delete(sessionId);
|
|
335
|
-
lastPartCountRef.current = countParts();
|
|
336
|
-
}
|
|
337
|
-
}, MESSAGE_POLL_INTERVAL_MS);
|
|
338
|
-
}
|
|
339
|
-
}
|
|
340
|
-
else {
|
|
341
|
-
// Session is idle — stop polling
|
|
342
|
-
if (pollTimerRef.current) {
|
|
343
|
-
clearInterval(pollTimerRef.current);
|
|
344
|
-
pollTimerRef.current = null;
|
|
345
|
-
}
|
|
346
|
-
}
|
|
347
|
-
});
|
|
348
|
-
// Cleanup polling on unmount
|
|
349
|
-
useEffect(() => {
|
|
350
|
-
return () => {
|
|
351
|
-
if (pollTimerRef.current) {
|
|
352
|
-
clearInterval(pollTimerRef.current);
|
|
353
|
-
pollTimerRef.current = null;
|
|
354
|
-
}
|
|
355
|
-
};
|
|
356
|
-
}, []);
|
|
357
|
-
// Single selector that derives MessageWithParts[] with reference caching.
|
|
358
|
-
// The buildMessages function returns the same array reference if nothing
|
|
359
|
-
// relevant to this session changed — preventing unnecessary re-renders.
|
|
360
|
-
const messages = useSyncStore((s) => buildMessages(sessionId, s.messages[sessionId], s.parts));
|
|
361
|
-
const status = useSyncStore((s) => s.sessionStatus[sessionId] ?? IDLE_STATUS);
|
|
362
|
-
const diffs = useSyncStore((s) => s.diffs[sessionId]);
|
|
363
|
-
const todos = useSyncStore((s) => s.todos[sessionId]);
|
|
364
|
-
const isBusy = status?.type === "busy" || status?.type === "retry";
|
|
365
|
-
const isLoading = !useSyncStore((s) => sessionId in s.messages);
|
|
72
|
+
controller.setBusy(runtimeHealthy && isBusy);
|
|
73
|
+
}, [controller, isBusy, runtimeHealthy]);
|
|
366
74
|
return {
|
|
367
75
|
messages,
|
|
368
76
|
status,
|
|
77
|
+
freshness: sync.freshness,
|
|
369
78
|
isBusy,
|
|
370
79
|
isLoading,
|
|
80
|
+
hasOlder: sync.hasOlder,
|
|
81
|
+
isLoadingOlder: sync.isLoadingOlder,
|
|
82
|
+
loadOlder: controller.loadOlder,
|
|
371
83
|
diffs: diffs ?? EMPTY_DIFFS,
|
|
372
84
|
todos: todos ?? EMPTY_TODOS,
|
|
373
85
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-session-sync.js","sourceRoot":"","sources":["../../src/react/use-session-sync.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"use-session-sync.js","sourceRoot":"","sources":["../../src/react/use-session-sync.ts"],"names":[],"mappings":"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"}
|
package/dist/transcript.d.ts
CHANGED
|
@@ -22,19 +22,48 @@ export interface SessionInfo {
|
|
|
22
22
|
updated: number;
|
|
23
23
|
};
|
|
24
24
|
}
|
|
25
|
+
interface TranscriptMessageInfo {
|
|
26
|
+
id: string;
|
|
27
|
+
role: 'user' | 'assistant';
|
|
28
|
+
agent?: string;
|
|
29
|
+
modelID?: string;
|
|
30
|
+
time?: {
|
|
31
|
+
created?: number;
|
|
32
|
+
completed?: number;
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
interface TranscriptPartState {
|
|
36
|
+
status?: string;
|
|
37
|
+
input?: unknown;
|
|
38
|
+
output?: string;
|
|
39
|
+
error?: string;
|
|
40
|
+
}
|
|
41
|
+
interface TranscriptPart {
|
|
42
|
+
id: string;
|
|
43
|
+
type: string;
|
|
44
|
+
synthetic?: boolean;
|
|
45
|
+
text?: string;
|
|
46
|
+
tool?: string;
|
|
47
|
+
state?: TranscriptPartState;
|
|
48
|
+
}
|
|
25
49
|
export interface MessageWithParts {
|
|
26
50
|
info: Message;
|
|
27
51
|
parts: Part[];
|
|
28
52
|
}
|
|
53
|
+
interface TranscriptMessage {
|
|
54
|
+
info: TranscriptMessageInfo;
|
|
55
|
+
parts: TranscriptPart[];
|
|
56
|
+
}
|
|
29
57
|
export declare const DEFAULT_TRANSCRIPT_OPTIONS: TranscriptOptions;
|
|
30
58
|
/**
|
|
31
59
|
* Format an entire session as a Markdown transcript.
|
|
32
60
|
*/
|
|
33
|
-
export declare function formatTranscript(session: SessionInfo, messages:
|
|
61
|
+
export declare function formatTranscript(session: SessionInfo, messages: TranscriptMessage[], options?: TranscriptOptions): string;
|
|
34
62
|
/**
|
|
35
63
|
* Generate a default filename for the transcript.
|
|
36
64
|
* Always keyed off the session id so the file is stable and unambiguous
|
|
37
65
|
* (e.g. `session-<uuid>.md`) rather than a mutable, collision-prone title slug.
|
|
38
66
|
*/
|
|
39
67
|
export declare function getTranscriptFilename(sessionId: string, _title?: string): string;
|
|
68
|
+
export {};
|
|
40
69
|
//# sourceMappingURL=transcript.d.ts.map
|
package/dist/transcript.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transcript.d.ts","sourceRoot":"","sources":["../src/transcript.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,4BAA4B,CAAC;AAMhE,MAAM,WAAW,iBAAiB;IAChC,2CAA2C;IAC3C,QAAQ,EAAE,OAAO,CAAC;IAClB,8CAA8C;IAC9C,WAAW,EAAE,OAAO,CAAC;IACrB,wDAAwD;IACxD,iBAAiB,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5C;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,IAAI,EAAE,CAAC;CACf;AAED,eAAO,MAAM,0BAA0B,EAAE,iBAIxC,CAAC;
|
|
1
|
+
{"version":3,"file":"transcript.d.ts","sourceRoot":"","sources":["../src/transcript.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,4BAA4B,CAAC;AAMhE,MAAM,WAAW,iBAAiB;IAChC,2CAA2C;IAC3C,QAAQ,EAAE,OAAO,CAAC;IAClB,8CAA8C;IAC9C,WAAW,EAAE,OAAO,CAAC;IACrB,wDAAwD;IACxD,iBAAiB,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5C;AAED,UAAU,qBAAqB;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE;QACL,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;CACH;AAED,UAAU,mBAAmB;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,cAAc;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,mBAAmB,CAAC;CAC7B;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,IAAI,EAAE,CAAC;CACf;AAED,UAAU,iBAAiB;IACzB,IAAI,EAAE,qBAAqB,CAAC;IAC5B,KAAK,EAAE,cAAc,EAAE,CAAC;CACzB;AAED,eAAO,MAAM,0BAA0B,EAAE,iBAIxC,CAAC;AA8GF;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,WAAW,EACpB,QAAQ,EAAE,iBAAiB,EAAE,EAC7B,OAAO,GAAE,iBAA8C,GACtD,MAAM,CAaR;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAEhF"}
|
package/dist/transcript.js
CHANGED
|
@@ -30,36 +30,35 @@ function formatDuration(ms) {
|
|
|
30
30
|
// Format individual parts
|
|
31
31
|
// ============================================================================
|
|
32
32
|
function formatPart(part, options) {
|
|
33
|
-
if (part.type === 'text' && !
|
|
34
|
-
return `${part.text}\n\n`;
|
|
33
|
+
if (part.type === 'text' && !part.synthetic) {
|
|
34
|
+
return `${part.text ?? ''}\n\n`;
|
|
35
35
|
}
|
|
36
36
|
if (part.type === 'reasoning') {
|
|
37
37
|
if (options.thinking) {
|
|
38
|
-
return `> _Thinking:_\n>\n> ${(part.text
|
|
38
|
+
return `> _Thinking:_\n>\n> ${(part.text ?? '').replace(/\n/g, '\n> ')}\n\n`;
|
|
39
39
|
}
|
|
40
40
|
return '';
|
|
41
41
|
}
|
|
42
42
|
if (part.type === 'tool') {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
if (options.toolDetails && toolPart.state?.input) {
|
|
43
|
+
let result = `**Tool: ${part.tool ?? 'unknown'}**\n`;
|
|
44
|
+
if (options.toolDetails && part.state?.input) {
|
|
46
45
|
try {
|
|
47
|
-
const inputStr = typeof
|
|
48
|
-
?
|
|
49
|
-
: JSON.stringify(
|
|
46
|
+
const inputStr = typeof part.state.input === 'string'
|
|
47
|
+
? part.state.input
|
|
48
|
+
: JSON.stringify(part.state.input, null, 2);
|
|
50
49
|
result += `\n<details>\n<summary>Input</summary>\n\n\`\`\`json\n${inputStr}\n\`\`\`\n\n</details>\n`;
|
|
51
50
|
}
|
|
52
51
|
catch {
|
|
53
52
|
// skip malformed input
|
|
54
53
|
}
|
|
55
54
|
}
|
|
56
|
-
if (options.toolDetails &&
|
|
57
|
-
const output =
|
|
55
|
+
if (options.toolDetails && part.state?.status === 'completed' && part.state.output) {
|
|
56
|
+
const output = part.state.output;
|
|
58
57
|
const truncated = output.length > 2000 ? output.slice(0, 2000) + '\n... (truncated)' : output;
|
|
59
58
|
result += `\n<details>\n<summary>Output</summary>\n\n\`\`\`\n${truncated}\n\`\`\`\n\n</details>\n`;
|
|
60
59
|
}
|
|
61
|
-
if (options.toolDetails &&
|
|
62
|
-
result += `\n**Error:**\n\`\`\`\n${
|
|
60
|
+
if (options.toolDetails && part.state?.status === 'error' && part.state.error) {
|
|
61
|
+
result += `\n**Error:**\n\`\`\`\n${part.state.error}\n\`\`\`\n`;
|
|
63
62
|
}
|
|
64
63
|
result += '\n';
|
|
65
64
|
return result;
|
|
@@ -80,9 +79,7 @@ function formatAssistantHeader(msg, includeMetadata) {
|
|
|
80
79
|
duration = formatDuration(msg.time.completed - msg.time.created);
|
|
81
80
|
}
|
|
82
81
|
const meta = [model, duration].filter(Boolean).join(' · ');
|
|
83
|
-
return meta
|
|
84
|
-
? `## ${agent} (${meta})\n\n`
|
|
85
|
-
: `## ${agent}\n\n`;
|
|
82
|
+
return meta ? `## ${agent} (${meta})\n\n` : `## ${agent}\n\n`;
|
|
86
83
|
}
|
|
87
84
|
function formatMessage(msg, parts, options) {
|
|
88
85
|
let result = '';
|
package/dist/transcript.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transcript.js","sourceRoot":"","sources":["../src/transcript.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"transcript.js","sourceRoot":"","sources":["../src/transcript.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kortix/sdk",
|
|
3
|
-
"version": "0.10.
|
|
3
|
+
"version": "0.10.14",
|
|
4
4
|
"description": "Official Kortix frontend TypeScript SDK — one typed client for the Kortix agent platform. Unifies project/session lifecycle and live agent streaming behind a single ergonomic Session handle, so web, mobile, and white-label apps never touch the raw HTTP API or OpenCode semantics.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "Elastic-2.0",
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
],
|
|
21
21
|
"sideEffects": false,
|
|
22
22
|
"dependencies": {
|
|
23
|
-
"@kortix/llm-catalog": "0.10.
|
|
23
|
+
"@kortix/llm-catalog": "0.10.14",
|
|
24
24
|
"@opencode-ai/sdk": "1.17.11",
|
|
25
25
|
"zustand": "^5.0.3"
|
|
26
26
|
},
|
|
@@ -170,7 +170,9 @@
|
|
|
170
170
|
"devDependencies": {
|
|
171
171
|
"@tanstack/react-query": "^5.75.2",
|
|
172
172
|
"@types/react": "^19.1.17",
|
|
173
|
+
"@types/react-dom": "^19.2.3",
|
|
173
174
|
"react": "^19.1.0",
|
|
175
|
+
"react-dom": "^19.1.0",
|
|
174
176
|
"tsc-alias": "^1.8.17",
|
|
175
177
|
"tsup": "^8.5.1",
|
|
176
178
|
"typescript": "^5.4.0"
|