@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.
Files changed (120) hide show
  1. package/README.md +34 -11
  2. package/dist/browser/session-sync/session-sync-registry.d.ts +39 -0
  3. package/dist/browser/session-sync/session-sync-registry.d.ts.map +1 -0
  4. package/dist/browser/session-sync/session-sync-registry.js +146 -0
  5. package/dist/browser/session-sync/session-sync-registry.js.map +1 -0
  6. package/dist/core/client/kortix.d.ts +20 -4
  7. package/dist/core/client/kortix.d.ts.map +1 -1
  8. package/dist/core/client/kortix.js +35 -3
  9. package/dist/core/client/kortix.js.map +1 -1
  10. package/dist/core/http/api-client.d.ts +9 -0
  11. package/dist/core/http/api-client.d.ts.map +1 -1
  12. package/dist/core/http/api-client.js +27 -1
  13. package/dist/core/http/api-client.js.map +1 -1
  14. package/dist/core/http/config.d.ts +1 -0
  15. package/dist/core/http/config.d.ts.map +1 -1
  16. package/dist/core/http/config.js.map +1 -1
  17. package/dist/core/http/feature-flags.d.ts +1 -0
  18. package/dist/core/http/feature-flags.d.ts.map +1 -1
  19. package/dist/core/http/feature-flags.js +2 -13
  20. package/dist/core/http/feature-flags.js.map +1 -1
  21. package/dist/core/rest/projects-client/connectors.d.ts +37 -0
  22. package/dist/core/rest/projects-client/connectors.d.ts.map +1 -1
  23. package/dist/core/rest/projects-client/connectors.js +9 -0
  24. package/dist/core/rest/projects-client/connectors.js.map +1 -1
  25. package/dist/core/rest/projects-client/github.d.ts +30 -1
  26. package/dist/core/rest/projects-client/github.d.ts.map +1 -1
  27. package/dist/core/rest/projects-client/github.js +12 -1
  28. package/dist/core/rest/projects-client/github.js.map +1 -1
  29. package/dist/core/rest/projects-client/model-defaults.d.ts +1 -1
  30. package/dist/core/rest/projects-client/model-defaults.d.ts.map +1 -1
  31. package/dist/core/rest/projects-client/model-defaults.js.map +1 -1
  32. package/dist/core/rest/projects-client/projects.d.ts +135 -14
  33. package/dist/core/rest/projects-client/projects.d.ts.map +1 -1
  34. package/dist/core/rest/projects-client/projects.js +18 -6
  35. package/dist/core/rest/projects-client/projects.js.map +1 -1
  36. package/dist/core/rest/projects-client/session-sandbox.d.ts +10 -3
  37. package/dist/core/rest/projects-client/session-sandbox.d.ts.map +1 -1
  38. package/dist/core/rest/projects-client/session-sandbox.js +48 -10
  39. package/dist/core/rest/projects-client/session-sandbox.js.map +1 -1
  40. package/dist/core/rest/projects-client/sessions.d.ts +46 -2
  41. package/dist/core/rest/projects-client/sessions.d.ts.map +1 -1
  42. package/dist/core/rest/projects-client/sessions.js +3 -2
  43. package/dist/core/rest/projects-client/sessions.js.map +1 -1
  44. package/dist/core/rest/projects-client/triggers.d.ts +43 -11
  45. package/dist/core/rest/projects-client/triggers.d.ts.map +1 -1
  46. package/dist/core/rest/projects-client/triggers.js.map +1 -1
  47. package/dist/core/session-sync/session-sync-controller.d.ts +89 -0
  48. package/dist/core/session-sync/session-sync-controller.d.ts.map +1 -0
  49. package/dist/core/session-sync/session-sync-controller.js +248 -0
  50. package/dist/core/session-sync/session-sync-controller.js.map +1 -0
  51. package/dist/index.d.ts +2 -1
  52. package/dist/index.d.ts.map +1 -1
  53. package/dist/index.js +1 -0
  54. package/dist/index.js.map +1 -1
  55. package/dist/kortix.esm.min.js +31 -31
  56. package/dist/kortix.global.js +31 -31
  57. package/dist/node/server.d.ts +0 -21
  58. package/dist/node/server.d.ts.map +1 -1
  59. package/dist/node/server.js +23 -1
  60. package/dist/node/server.js.map +1 -1
  61. package/dist/react/index.d.ts +1 -0
  62. package/dist/react/index.d.ts.map +1 -1
  63. package/dist/react/index.js +5 -0
  64. package/dist/react/index.js.map +1 -1
  65. package/dist/react/model-flatten.d.ts.map +1 -1
  66. package/dist/react/model-flatten.js +4 -0
  67. package/dist/react/model-flatten.js.map +1 -1
  68. package/dist/react/provider-selection.d.ts.map +1 -1
  69. package/dist/react/provider-selection.js +3 -2
  70. package/dist/react/provider-selection.js.map +1 -1
  71. package/dist/react/pty-query-state.d.ts +3 -0
  72. package/dist/react/pty-query-state.d.ts.map +1 -0
  73. package/dist/react/pty-query-state.js +7 -0
  74. package/dist/react/pty-query-state.js.map +1 -0
  75. package/dist/react/session-start-stash.d.ts.map +1 -1
  76. package/dist/react/session-start-stash.js +17 -4
  77. package/dist/react/session-start-stash.js.map +1 -1
  78. package/dist/react/use-model-store.d.ts +16 -0
  79. package/dist/react/use-model-store.d.ts.map +1 -1
  80. package/dist/react/use-model-store.js +6 -7
  81. package/dist/react/use-model-store.js.map +1 -1
  82. package/dist/react/use-opencode-events/handle-event.d.ts +2 -0
  83. package/dist/react/use-opencode-events/handle-event.d.ts.map +1 -1
  84. package/dist/react/use-opencode-events/handle-event.js +13 -28
  85. package/dist/react/use-opencode-events/handle-event.js.map +1 -1
  86. package/dist/react/use-opencode-events/index.d.ts.map +1 -1
  87. package/dist/react/use-opencode-events/index.js +7 -13
  88. package/dist/react/use-opencode-events/index.js.map +1 -1
  89. package/dist/react/use-opencode-local.d.ts +6 -7
  90. package/dist/react/use-opencode-local.d.ts.map +1 -1
  91. package/dist/react/use-opencode-local.js +18 -32
  92. package/dist/react/use-opencode-local.js.map +1 -1
  93. package/dist/react/use-opencode-pty.d.ts +2 -0
  94. package/dist/react/use-opencode-pty.d.ts.map +1 -1
  95. package/dist/react/use-opencode-pty.js +15 -7
  96. package/dist/react/use-opencode-pty.js.map +1 -1
  97. package/dist/react/use-opencode-sessions/no-compaction-model-error.d.ts +31 -0
  98. package/dist/react/use-opencode-sessions/no-compaction-model-error.d.ts.map +1 -0
  99. package/dist/react/use-opencode-sessions/no-compaction-model-error.js +34 -0
  100. package/dist/react/use-opencode-sessions/no-compaction-model-error.js.map +1 -0
  101. package/dist/react/use-opencode-sessions/sessions.d.ts.map +1 -1
  102. package/dist/react/use-opencode-sessions/sessions.js +12 -2
  103. package/dist/react/use-opencode-sessions/sessions.js.map +1 -1
  104. package/dist/react/use-session-prefetch.d.ts +4 -14
  105. package/dist/react/use-session-prefetch.d.ts.map +1 -1
  106. package/dist/react/use-session-prefetch.js +13 -73
  107. package/dist/react/use-session-prefetch.js.map +1 -1
  108. package/dist/react/use-session-send.d.ts +1 -0
  109. package/dist/react/use-session-send.d.ts.map +1 -1
  110. package/dist/react/use-session-send.js +2 -1
  111. package/dist/react/use-session-send.js.map +1 -1
  112. package/dist/react/use-session-sync.d.ts +10 -8
  113. package/dist/react/use-session-sync.d.ts.map +1 -1
  114. package/dist/react/use-session-sync.js +39 -327
  115. package/dist/react/use-session-sync.js.map +1 -1
  116. package/dist/transcript.d.ts +30 -1
  117. package/dist/transcript.d.ts.map +1 -1
  118. package/dist/transcript.js +13 -16
  119. package/dist/transcript.js.map +1 -1
  120. package/package.json +4 -2
@@ -1,36 +1,16 @@
1
- "use client";
2
- import { useEffect, useRef } from "react";
3
- import { getClient } from "../core/runtime/client.js";
4
- import { useSyncStore, } from "../browser/stores/sync-store.js";
5
- import { useSandboxConnectionStore } from "../browser/stores/sandbox-connection-store.js";
6
- import { loadSessionFromIDB, saveSessionToIDB } from "../browser/cache/idb-sync-cache.js";
7
- import { canQueryOpenCodeSession } from "./use-opencode-sessions/index.js";
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: "idle" };
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
- // Same message array check if any part arrays changed
52
- let same = cached.partRefs.length === msgs.length;
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
- // Rebuild
65
- const partRefs = [];
66
- const result = [];
67
- for (const info of msgs) {
68
- const pa = parts[info.id];
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
- * Single hook that provides all session data from the sync store.
78
- * Replaces: useOpenCodeMessages + useOpenCodeSessionStatusStore + useOpenCodePendingStore
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 fetchedRef = useRef(null);
85
- const runtimeHealthy = useSandboxConnectionStore((s) => s.healthy === true);
86
- // Fetch messages on first access (or session change).
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
- // Guard against duplicate concurrent fetches for the same session.
94
- if (fetchedRef.current === sessionId)
95
- return;
96
- fetchedRef.current = sessionId;
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
- cancelled = true;
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
- }, [sessionId, runtimeHealthy]);
245
- // ── Polling fallback ──
246
- // When the session is busy, SSE should deliver streaming events. But if
247
- // SSE is broken (502, ERR_QUIC_PROTOCOL_ERROR, etc.), no events arrive
248
- // and the UI is stuck on "Considering next steps..." forever. As a
249
- // fallback, poll for messages while the session is busy.
250
- // The poll stops as soon as the session goes idle or the component unmounts.
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
- if (!sessionId)
256
- return;
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":"AAAA,YAAY,CAAC;AAGb,OAAO,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AACxD,OAAO,EACL,wBAAwB,EACxB,6BAA6B,EAC7B,2BAA2B,GAC5B,MAAM,+CAA+C,CAAC;AACvD,OAAO,EAAE,yBAAyB,EAAE,MAAM,4CAA4C,CAAC;AACvF,OAAO,EAAyB,YAAY,EAAE,MAAM,8BAA8B,CAAC;AACnF,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAElE,OAAO,EAAE,6BAA6B,EAAE,CAAC;AAQzC,MAAM,cAAc,GAAuB,EAAE,CAAC;AAC9C,MAAM,WAAW,GAAe,EAAE,CAAC;AACnC,MAAM,WAAW,GAAW,EAAE,CAAC;AAC/B,MAAM,WAAW,GAAG,EAAE,IAAI,EAAE,MAAM,EAAmB,CAAC;AACtD,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAC7B,MAAM,YAAY,GAAG,IAAI,GAAG,EAOzB,CAAC;AAEJ,SAAS,iBAAiB,CAAC,SAAiB;IAC1C,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC1C,IAAI,KAAK,EAAE,CAAC;QACV,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC/B,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IACrC,CAAC;IACD,IAAI,YAAY,CAAC,IAAI,GAAG,iBAAiB,EAAE,CAAC;QAC1C,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;QAChD,IAAI,MAAM;YAAE,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC1C,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CACpB,SAAiB,EACjB,IAA2B,EAC3B,KAA6B;IAE7B,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,cAAc,CAAC;IAEtD,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC3C,IAAI,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;QACnC,MAAM,IAAI,GACR,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM;YACtC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACvF,IAAI,IAAI;YAAE,OAAO,MAAM,CAAC,MAAM,CAAC;IACjC,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1D,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACjC,IAAI;QACJ,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE;KAC5B,CAAC,CAAC,CAAC;IACJ,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;IACxD,iBAAiB,CAAC,SAAS,CAAC,CAAC;IAC7B,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,SAAiB;IAC9C,MAAM,cAAc,GAAG,yBAAyB,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC;IACpF,MAAM,UAAU,GAAG,wBAAwB,CAAC,SAAS,CAAC,CAAC;IACvD,MAAM,IAAI,GAAG,oBAAoB,CAC/B,UAAU,CAAC,SAAS,EACpB,UAAU,CAAC,WAAW,EACtB,UAAU,CAAC,WAAW,CACvB,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,uBAAuB,CAAC,SAAS,CAAC,IAAI,CAAC,cAAc;YAAE,OAAO;QACnE,MAAM,OAAO,GAAG,2BAA2B,CAAC,SAAS,CAAC,CAAC;QACvD,qEAAqE;QACrE,iEAAiE;QACjE,KAAK,UAAU,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACrC,OAAO,GAAG,EAAE;YACV,OAAO,EAAE,CAAC;YACV,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACjC,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,UAAU,EAAE,cAAc,EAAE,SAAS,CAAC,CAAC,CAAC;IAE5C,MAAM,QAAQ,GAAG,YAAY,CAAC,CAAC,KAAK,EAAE,EAAE,CACtC,aAAa,CAAC,SAAS,EAAE,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CACjE,CAAC;IAEF,MAAM,MAAM,GAAG,YAAY,CACzB,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,WAAW,CACxC,CAAC;IACnB,MAAM,KAAK,GAAG,YAAY,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAA2B,CAAC;IACxF,MAAM,KAAK,GAAG,YAAY,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAuB,CAAC;IAEpF,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,KAAK,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC;IACjE,MAAM,SAAS,GAAG,CAAC,YAAY,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC;IAExE,SAAS,CAAC,GAAG,EAAE;QACb,UAAU,CAAC,OAAO,CAAC,cAAc,IAAI,MAAM,CAAC,CAAC;IAC/C,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;IAEzC,OAAO;QACL,QAAQ;QACR,MAAM;QACN,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,MAAM;QACN,SAAS;QACT,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,cAAc,EAAE,IAAI,CAAC,cAAc;QACnC,SAAS,EAAE,UAAU,CAAC,SAAS;QAC/B,KAAK,EAAE,KAAK,IAAI,WAAW;QAC3B,KAAK,EAAE,KAAK,IAAI,WAAW;KAC5B,CAAC;AACJ,CAAC"}
@@ -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: MessageWithParts[], options?: TranscriptOptions): string;
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
@@ -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;AAgHF;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,WAAW,EACpB,QAAQ,EAAE,gBAAgB,EAAE,EAC5B,OAAO,GAAE,iBAA8C,GACtD,MAAM,CAaR;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAEhF"}
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"}
@@ -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' && !('synthetic' in part && part.synthetic)) {
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 || '').replace(/\n/g, '\n> ')}\n\n`;
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
- const toolPart = part;
44
- let result = `**Tool: ${toolPart.tool}**\n`;
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 toolPart.state.input === 'string'
48
- ? toolPart.state.input
49
- : JSON.stringify(toolPart.state.input, null, 2);
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 && toolPart.state?.status === 'completed' && toolPart.state?.output) {
57
- const output = toolPart.state.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 && toolPart.state?.status === 'error' && toolPart.state?.error) {
62
- result += `\n**Error:**\n\`\`\`\n${toolPart.state.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 = '';
@@ -1 +1 @@
1
- {"version":3,"file":"transcript.js","sourceRoot":"","sources":["../src/transcript.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"transcript.js","sourceRoot":"","sources":["../src/transcript.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA4DH,MAAM,CAAC,MAAM,0BAA0B,GAAsB;IAC3D,QAAQ,EAAE,KAAK;IACf,WAAW,EAAE,IAAI;IACjB,iBAAiB,EAAE,IAAI;CACxB,CAAC;AAEF,+EAA+E;AAC/E,UAAU;AACV,+EAA+E;AAE/E,SAAS,SAAS,CAAC,GAAW;IAC5B,IAAI,CAAC,GAAG;QAAE,OAAO,GAAG,CAAC;IACrB,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACpD,CAAC;AAED,SAAS,cAAc,CAAC,EAAU;IAChC,MAAM,OAAO,GAAG,EAAE,GAAG,IAAI,CAAC;IAC1B,IAAI,OAAO,GAAG,EAAE;QAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IAClD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACzC,MAAM,SAAS,GAAG,OAAO,GAAG,EAAE,CAAC;IAC/B,OAAO,GAAG,OAAO,KAAK,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;AAChD,CAAC;AAED,+EAA+E;AAC/E,0BAA0B;AAC1B,+EAA+E;AAE/E,SAAS,UAAU,CAAC,IAAoB,EAAE,OAA0B;IAClE,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QAC5C,OAAO,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE,MAAM,CAAC;IAClC,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QAC9B,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrB,OAAO,uBAAuB,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC;QAC/E,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QACzB,IAAI,MAAM,GAAG,WAAW,IAAI,CAAC,IAAI,IAAI,SAAS,MAAM,CAAC;QAErD,IAAI,OAAO,CAAC,WAAW,IAAI,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC;YAC7C,IAAI,CAAC;gBACH,MAAM,QAAQ,GACZ,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,QAAQ;oBAClC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK;oBAClB,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;gBAChD,MAAM,IAAI,wDAAwD,QAAQ,0BAA0B,CAAC;YACvG,CAAC;YAAC,MAAM,CAAC;gBACP,uBAAuB;YACzB,CAAC;QACH,CAAC;QAED,IAAI,OAAO,CAAC,WAAW,IAAI,IAAI,CAAC,KAAK,EAAE,MAAM,KAAK,WAAW,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YACnF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;YACjC,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,mBAAmB,CAAC,CAAC,CAAC,MAAM,CAAC;YAC9F,MAAM,IAAI,qDAAqD,SAAS,0BAA0B,CAAC;QACrG,CAAC;QAED,IAAI,OAAO,CAAC,WAAW,IAAI,IAAI,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YAC9E,MAAM,IAAI,yBAAyB,IAAI,CAAC,KAAK,CAAC,KAAK,YAAY,CAAC;QAClE,CAAC;QAED,MAAM,IAAI,IAAI,CAAC;QACf,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,gFAAgF;IAChF,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,+EAA+E;AAC/E,0BAA0B;AAC1B,+EAA+E;AAE/E,SAAS,qBAAqB,CAAC,GAA0B,EAAE,eAAwB;IACjF,IAAI,CAAC,eAAe;QAAE,OAAO,kBAAkB,CAAC;IAEhD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;IAC7D,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;IAChC,IAAI,QAAQ,GAAG,EAAE,CAAC;IAClB,IAAI,GAAG,CAAC,IAAI,EAAE,SAAS,IAAI,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC;QAC7C,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACnE,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3D,OAAO,IAAI,CAAC,CAAC,CAAC,MAAM,KAAK,KAAK,IAAI,OAAO,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC;AAChE,CAAC;AAED,SAAS,aAAa,CACpB,GAA0B,EAC1B,KAAuB,EACvB,OAA0B;IAE1B,IAAI,MAAM,GAAG,EAAE,CAAC;IAEhB,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QACxB,MAAM,IAAI,aAAa,CAAC;IAC1B,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,qBAAqB,CAAC,GAAG,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAClE,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACtC,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,+EAA+E;AAC/E,cAAc;AACd,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,OAAoB,EACpB,QAA6B,EAC7B,UAA6B,0BAA0B;IAEvD,IAAI,UAAU,GAAG,KAAK,OAAO,CAAC,KAAK,IAAI,kBAAkB,MAAM,CAAC;IAChE,UAAU,IAAI,qBAAqB,OAAO,CAAC,EAAE,MAAM,CAAC;IACpD,UAAU,IAAI,gBAAgB,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,cAAc,EAAE,IAAI,CAAC;IAClF,UAAU,IAAI,gBAAgB,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,cAAc,EAAE,MAAM,CAAC;IACpF,UAAU,IAAI,SAAS,CAAC;IAExB,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,UAAU,IAAI,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC1D,UAAU,IAAI,SAAS,CAAC;IAC1B,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,SAAiB,EAAE,MAAe;IACtE,OAAO,WAAW,SAAS,KAAK,CAAC;AACnC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kortix/sdk",
3
- "version": "0.10.12",
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.12",
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"