@openchambery/web 1.19.8-beta.1 → 1.19.8-beta.10

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 (74) hide show
  1. package/dist/assets/AssistantView-B3zIR_MP.js +2 -0
  2. package/dist/assets/{DiagramView-C8MZY0fA.js → DiagramView-Dq-d0f14.js} +1 -1
  3. package/dist/assets/FadeInOnReveal-CTlNE4Hg.js +1 -0
  4. package/dist/assets/MarkdownRenderer-E207cTy6.js +2 -0
  5. package/dist/assets/MarkdownRendererImpl-Cr-WDc05.js +7 -0
  6. package/dist/assets/MarkstreamRendererImpl-Cl2KVPKv.js +3 -0
  7. package/dist/assets/MarkstreamRendererImpl-DKhVy3nF.css +1 -0
  8. package/dist/assets/{MobileDetailNavigation-D6ri-ePj.js → MobileDetailNavigation-CZ6KcrPL.js} +1 -1
  9. package/dist/assets/{MobileShareBridge-HRTN71wg.js → MobileShareBridge-DQ2cL0Bs.js} +1 -1
  10. package/dist/assets/MobileSurface-E6GzOicA.js +2 -0
  11. package/dist/assets/{MultiRunWindow-CTRgfYQD.js → MultiRunWindow-CM_Zipu0.js} +1 -1
  12. package/dist/assets/{SettingsView-ImI02YSp.js → SettingsView-C71_t48B.js} +1 -1
  13. package/dist/assets/{SettingsWindow-DWo2lUaN.js → SettingsWindow-DY06QLS6.js} +1 -1
  14. package/dist/assets/{TerminalView-BseZ5dR-.js → TerminalView-CgvaxAlw.js} +1 -1
  15. package/dist/assets/{ToolOutputDialog-BIK3cPqo.js → ToolOutputDialog-BWodV7Tg.js} +2 -2
  16. package/dist/assets/{appThemeRegistry-4_bwYAWt.js → appThemeRegistry-CinNVI2W.js} +1 -1
  17. package/dist/assets/{gitApi-m09MWmzE.js → gitApi-DcPpqAhU.js} +1 -1
  18. package/dist/assets/{insertionBoundaries-B0fzEL22.js → insertionBoundaries-DnE-UyRG.js} +1 -1
  19. package/dist/assets/{main-BYX7_XVg.js → main-BjguLWwd.js} +13 -13
  20. package/dist/assets/{main-BpbNOMNf.js → main-XOb8CpDU.js} +2 -2
  21. package/dist/assets/markdown-worker-CTsrtpPh.js +2 -0
  22. package/dist/assets/{MarkdownLoadingSkeleton-DWs4Jg7b.js → markdownHeightCache-CYDlisxr.js} +1 -1
  23. package/dist/assets/markdownTheme-DyJ4Gfcj.js +2 -0
  24. package/dist/assets/{miniChat-CFBgCVoZ.js → miniChat-Dnbb5G-b.js} +2 -2
  25. package/dist/assets/{mobile-DcZkxRBz.js → mobile-C7SindTf.js} +2 -2
  26. package/dist/assets/{multirun-CBqJQgS2.js → multirun-B7Kutn9Z.js} +1 -1
  27. package/dist/assets/{projectMeta-Ct1qHZhU.js → projectMeta-B4lfdlyn.js} +1 -1
  28. package/dist/assets/{renderElectronMiniChatApp-DxmxYdiE.js → renderElectronMiniChatApp-BL7dbwiC.js} +2 -2
  29. package/dist/assets/renderMobileApp-Dm8AXwBj.js +28 -0
  30. package/dist/assets/{runtimeConfig-CcIqxMFB.js → runtimeConfig-BeO4e7XN.js} +1 -1
  31. package/dist/assets/{runtimeEndpointReset-CU1HhJfC.js → runtimeEndpointReset-CipIZVh0.js} +6 -6
  32. package/dist/assets/sessionChangeSummary-hVby3sJk.js +1 -0
  33. package/dist/assets/{sessionLookup-CNMNR-yh.js → sessionLookup-DyRYhncr.js} +1 -1
  34. package/dist/assets/{src-DasvfkEg.css → src-B-P5qIBc.css} +1 -1
  35. package/dist/assets/{useAppFontEffects-CBLEH9it.js → useAppFontEffects-Bwls3ufZ.js} +44 -44
  36. package/dist/assets/{useDesktopWindowControlsLayout-DMCmF610.js → useDesktopWindowControlsLayout-Bl8iSMoM.js} +1 -1
  37. package/dist/assets/{useEffectiveDirectory-CMvw1bLA.js → useEffectiveDirectory-Co4VOSLW.js} +1 -1
  38. package/dist/assets/{useMobileNavigationStore-Di9IWKfu.js → useMobileNavigationStore-CDx-mkjA.js} +2 -2
  39. package/dist/assets/{useSessionAutoCleanup-DMyMP_xI.js → useSessionAutoCleanup-BR11Ewfa.js} +1 -1
  40. package/dist/assets/useWorkerHighlightedLines-MhxFZaDl.js +7 -0
  41. package/dist/assets/{vendor-markstream-react-C3K8YH0d.js → vendor-markstream-react-DX55XLGO.js} +4 -4
  42. package/dist/index.html +3 -3
  43. package/dist/mini-chat.html +3 -3
  44. package/dist/mobile.html +3 -3
  45. package/package.json +1 -1
  46. package/server/lib/llm/DOCUMENTATION.md +9 -4
  47. package/server/lib/llm/generate.test.js +1 -0
  48. package/server/lib/notifications/DOCUMENTATION.md +1 -1
  49. package/server/lib/notifications/runtime.js +9 -2
  50. package/server/lib/notifications/runtime.test.js +144 -0
  51. package/server/lib/session-index/DOCUMENTATION.md +3 -2
  52. package/server/lib/session-index/service.js +1 -0
  53. package/server/lib/session-index/service.test.js +7 -2
  54. package/server/lib/session-title/DOCUMENTATION.md +4 -3
  55. package/server/lib/session-title/runtime.js +1 -0
  56. package/server/lib/session-title/runtime.test.js +6 -0
  57. package/dist/assets/AssistantView-DkXW9Fzq.js +0 -2
  58. package/dist/assets/FadeInOnReveal-CK4asqVR.js +0 -1
  59. package/dist/assets/MarkdownRenderer-cxYw8-8G.js +0 -2
  60. package/dist/assets/MarkdownRendererImpl-B39nwiZX.js +0 -7
  61. package/dist/assets/MarkstreamRendererImpl-CdYqdejg.js +0 -1
  62. package/dist/assets/MarkstreamRendererImpl-CsNwy1T5.css +0 -1
  63. package/dist/assets/MobileSurface-D2yHjnZw.js +0 -2
  64. package/dist/assets/fileReferenceActions-BJJtX_S5.js +0 -1
  65. package/dist/assets/markdown-worker-BuveaH3O.js +0 -1
  66. package/dist/assets/markdownHeightCache-CvUyZT4q.js +0 -1
  67. package/dist/assets/markdownTheme-CzZm3riB.js +0 -2
  68. package/dist/assets/outsideFileGrants-DnplRxr-.js +0 -1
  69. package/dist/assets/path-utils-jGozTg9d.js +0 -1
  70. package/dist/assets/renderMobileApp-XXw7Fnrr.js +0 -28
  71. package/dist/assets/sessionChangeSummary-DOq8EN_H.js +0 -1
  72. package/dist/assets/toolHelpers-DEvVP9U0.js +0 -2
  73. package/dist/assets/useWorkerHighlightedLines-uNzY5rmU.js +0 -7
  74. package/dist/assets/vendor-markstream-react-CGQrpq8a.css +0 -1
package/dist/index.html CHANGED
@@ -552,7 +552,7 @@
552
552
  opacity: 0.72;
553
553
  }
554
554
  </style>
555
- <script type="module" crossorigin src="/assets/main-BpbNOMNf.js"></script>
555
+ <script type="module" crossorigin src="/assets/main-XOb8CpDU.js"></script>
556
556
  <link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-C0FnF6B9.js">
557
557
  <link rel="modulepreload" crossorigin href="/assets/vendor-base-ui-CnHfUmDN.js">
558
558
  <link rel="modulepreload" crossorigin href="/assets/vendor-zustand-B4dlGEM2.js">
@@ -569,8 +569,8 @@
569
569
  <link rel="modulepreload" crossorigin href="/assets/terminalApi-947l7Ra3.js">
570
570
  <link rel="modulepreload" crossorigin href="/assets/types-BuiqMmh_.js">
571
571
  <link rel="modulepreload" crossorigin href="/assets/capgoAdapter-DCowZ2ab.js">
572
- <link rel="modulepreload" crossorigin href="/assets/runtimeConfig-CcIqxMFB.js">
573
- <link rel="stylesheet" crossorigin href="/assets/src-DasvfkEg.css">
572
+ <link rel="modulepreload" crossorigin href="/assets/runtimeConfig-BeO4e7XN.js">
573
+ <link rel="stylesheet" crossorigin href="/assets/src-B-P5qIBc.css">
574
574
  </head>
575
575
  <body class="h-full bg-background text-foreground">
576
576
  <!-- Keep the startup layer outside #root. React replaces every child of
@@ -74,7 +74,7 @@
74
74
  }
75
75
  </style>
76
76
 
77
- <script type="module" crossorigin src="/assets/miniChat-CFBgCVoZ.js"></script>
77
+ <script type="module" crossorigin src="/assets/miniChat-Dnbb5G-b.js"></script>
78
78
  <link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-C0FnF6B9.js">
79
79
  <link rel="modulepreload" crossorigin href="/assets/vendor-base-ui-CnHfUmDN.js">
80
80
  <link rel="modulepreload" crossorigin href="/assets/vendor-zustand-B4dlGEM2.js">
@@ -91,8 +91,8 @@
91
91
  <link rel="modulepreload" crossorigin href="/assets/terminalApi-947l7Ra3.js">
92
92
  <link rel="modulepreload" crossorigin href="/assets/types-BuiqMmh_.js">
93
93
  <link rel="modulepreload" crossorigin href="/assets/capgoAdapter-DCowZ2ab.js">
94
- <link rel="modulepreload" crossorigin href="/assets/runtimeConfig-CcIqxMFB.js">
95
- <link rel="stylesheet" crossorigin href="/assets/src-DasvfkEg.css">
94
+ <link rel="modulepreload" crossorigin href="/assets/runtimeConfig-BeO4e7XN.js">
95
+ <link rel="stylesheet" crossorigin href="/assets/src-B-P5qIBc.css">
96
96
  </head>
97
97
  <body class="h-full bg-background text-foreground">
98
98
  <div id="root" class="h-full">
package/dist/mobile.html CHANGED
@@ -63,7 +63,7 @@
63
63
  })();
64
64
  </script>
65
65
 
66
- <script type="module" crossorigin src="/assets/mobile-DcZkxRBz.js"></script>
66
+ <script type="module" crossorigin src="/assets/mobile-C7SindTf.js"></script>
67
67
  <link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-C0FnF6B9.js">
68
68
  <link rel="modulepreload" crossorigin href="/assets/vendor-base-ui-CnHfUmDN.js">
69
69
  <link rel="modulepreload" crossorigin href="/assets/vendor-zustand-B4dlGEM2.js">
@@ -80,8 +80,8 @@
80
80
  <link rel="modulepreload" crossorigin href="/assets/terminalApi-947l7Ra3.js">
81
81
  <link rel="modulepreload" crossorigin href="/assets/types-BuiqMmh_.js">
82
82
  <link rel="modulepreload" crossorigin href="/assets/capgoAdapter-DCowZ2ab.js">
83
- <link rel="modulepreload" crossorigin href="/assets/runtimeConfig-CcIqxMFB.js">
84
- <link rel="stylesheet" crossorigin href="/assets/src-DasvfkEg.css">
83
+ <link rel="modulepreload" crossorigin href="/assets/runtimeConfig-BeO4e7XN.js">
84
+ <link rel="stylesheet" crossorigin href="/assets/src-B-P5qIBc.css">
85
85
  </head>
86
86
  <body class="h-full bg-background text-foreground">
87
87
  <div id="root" class="h-full"></div>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openchambery/web",
3
- "version": "1.19.8-beta.1",
3
+ "version": "1.19.8-beta.10",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "main": "./server/index.js",
@@ -41,10 +41,15 @@ The 1.18.4 client exposes `GET /provider`, `GET /config/providers`, and
41
41
  Non-vision models (for example deepseek-v4-flash) keep the `[image: …]`
42
42
  description and any text-file bytes, and skip image data URLs so generate
43
43
  cannot stall on unsupported vision parts. Non-image
44
- text files are also inlined into the flattened prompt. Wait for idle via
45
- `session.status` + `session.messages`, then delete the session. This is a
46
- text generator only — never the contact transcript and never a coding
47
- SessionPrompt loop. Upstream `info.error.message` is forwarded on 502.
44
+ text files are also inlined into the flattened prompt. Wait for idle via
45
+ `session.status` + `session.messages`, then delete the session. Throwaway
46
+ sessions are created with
47
+ `metadata.openchamber.llm.purpose = 'chat-completions'` (and archived
48
+ immediately) so sidebar visibility, session-index, session-title, and
49
+ notification/push fanout treat them as system-owned — same contract as
50
+ non-empty `smallModel.purpose`. This is a text generator only — never the
51
+ contact transcript and never a coding SessionPrompt loop. Upstream
52
+ `info.error.message` is forwarded on 502.
48
53
 
49
54
  ### Internal token callback (in-process only)
50
55
 
@@ -78,6 +78,7 @@ describe('generateOpenCodeText', () => {
78
78
 
79
79
  expect(create).toHaveBeenCalledWith(expect.objectContaining({
80
80
  title: expect.stringContaining('[openchamber-llm]'),
81
+ metadata: { openchamber: { llm: { purpose: 'chat-completions' } } },
81
82
  }), expect.anything())
82
83
  expect(update).toHaveBeenCalled()
83
84
  expect(promptAsync).toHaveBeenCalledWith(expect.objectContaining({
@@ -47,7 +47,7 @@ This module provides notification message preparation utilities for the web serv
47
47
  - Returned API:
48
48
  - `maybeSendPushForTrigger(payload)`
49
49
  - Owns:
50
- - top-level completion/question/permission trigger routing; completion is the sole task-status notification. Ordinary push is limited to sidebar-visible root sessions. Child/subagent sessions, Assistant bindings (`openchamber.assistant.assistantID` unless `assigned.from === 'contact'`), scheduled-task sessions, small-model system sessions (`metadata.openchamber.smallModel.purpose`), and `smartfetch-secondary` titles are suppressed. Contact-assigned workers stay visible and still notify.
50
+ - top-level completion/question/permission trigger routing; completion is the sole task-status notification. Ordinary push is limited to sidebar-visible root sessions. Child/subagent sessions, Assistant bindings (`openchamber.assistant.assistantID` unless `assigned.from === 'contact'`), scheduled-task sessions, small-model system sessions (`metadata.openchamber.smallModel.purpose`), LLM gateway throwaway sessions (`metadata.openchamber.llm.purpose`), and `smartfetch-secondary` titles are suppressed. Contact-assigned workers stay visible and still notify.
51
51
  - contact-turn notifications (`sendContactTurnNotification`) are a separate SMS-style path: title is the assistant nickname, body is the spoken message text, on desktop / UI SSE / web-push / APNs. APNs does **not** rewrite these into the generic "Task completed" scenario title.
52
52
  - top-level completion/error Live Activity `end` (`sendLiveActivityEnd`), independent of ordinary push settings and UI visibility, with the same hidden-session suppression; duplicate terminal events are idempotent at the token store
53
53
  - session meta cache for sidebar-visibility suppression
@@ -185,6 +185,9 @@ export const createNotificationTriggerRuntime = (deps) => {
185
185
  smallModelPurpose: meta.smallModelPurpose !== undefined
186
186
  ? meta.smallModelPurpose
187
187
  : (previous?.smallModelPurpose ?? null),
188
+ llmPurpose: meta.llmPurpose !== undefined
189
+ ? meta.llmPurpose
190
+ : (previous?.llmPurpose ?? null),
188
191
  assistantID: meta.assistantID !== undefined ? meta.assistantID : (previous?.assistantID ?? null),
189
192
  assignedFrom: meta.assignedFrom !== undefined ? meta.assignedFrom : (previous?.assignedFrom ?? null),
190
193
  scheduledTaskID: meta.scheduledTaskID !== undefined
@@ -202,6 +205,9 @@ export const createNotificationTriggerRuntime = (deps) => {
202
205
  : null;
203
206
  return {
204
207
  smallModelPurpose: normalizeSmallModelPurpose(openchamber?.smallModel?.purpose),
208
+ // Throwaway LLM gateway sessions (`metadata.openchamber.llm.purpose`) share
209
+ // the same sidebar-hidden contract as small-model system sessions.
210
+ llmPurpose: normalizeSmallModelPurpose(openchamber?.llm?.purpose),
205
211
  assistantID: nonEmptySystemID(openchamber?.assistant?.assistantID)
206
212
  ? openchamber.assistant.assistantID
207
213
  : null,
@@ -292,6 +298,7 @@ export const createNotificationTriggerRuntime = (deps) => {
292
298
  if (!meta) return false;
293
299
  if (typeof meta.parentID === 'string' && meta.parentID.length > 0) return true;
294
300
  if (typeof meta.smallModelPurpose === 'string' && meta.smallModelPurpose.length > 0) return true;
301
+ if (typeof meta.llmPurpose === 'string' && meta.llmPurpose.length > 0) return true;
295
302
  if (typeof meta.assistantID === 'string' && meta.assistantID.length > 0 && meta.assignedFrom !== 'contact') {
296
303
  return true;
297
304
  }
@@ -302,8 +309,8 @@ export const createNotificationTriggerRuntime = (deps) => {
302
309
 
303
310
  // Only sessions that can appear as sidebar roots get ordinary push. Child /
304
311
  // subagent sessions, archived Assistant bindings, scheduled-task sessions,
305
- // small-model system sessions, and SmartFetch secondaries are excluded.
306
- // Contact-assigned worker sessions stay visible and still notify.
312
+ // small-model / LLM gateway system sessions, and SmartFetch secondaries are
313
+ // excluded. Contact-assigned worker sessions stay visible and still notify.
307
314
  const shouldSkipSystemSessionNotification = async (sessionId, directory) => {
308
315
  const meta = await fetchSessionMeta(sessionId, directory);
309
316
  return isHiddenFromNavSession(meta);
@@ -229,6 +229,150 @@ describe('notification trigger runtime smallModel suppression', () => {
229
229
  });
230
230
  });
231
231
 
232
+ describe('notification trigger runtime llm system-session suppression', () => {
233
+ const llmSessionResponse = (purpose = 'chat-completions') => jsonResponse({
234
+ id: 'ses_llm',
235
+ parentID: null,
236
+ title: '[openchamber-llm] generate',
237
+ metadata: { openchamber: { llm: { purpose } } },
238
+ });
239
+
240
+ const expectAllOutletsSilent = ({
241
+ emitDesktopNotification,
242
+ broadcastUiNotification,
243
+ sendPushToAllUiSessions,
244
+ sendApnsToAllUiSessions,
245
+ sendLiveActivityEnd,
246
+ }) => {
247
+ expect(emitDesktopNotification).not.toHaveBeenCalled();
248
+ expect(broadcastUiNotification).not.toHaveBeenCalled();
249
+ expect(sendPushToAllUiSessions).not.toHaveBeenCalled();
250
+ expect(sendApnsToAllUiSessions).not.toHaveBeenCalled();
251
+ expect(sendLiveActivityEnd).not.toHaveBeenCalled();
252
+ };
253
+
254
+ it('skips ready notifications for llm sessions fetched by id', async () => {
255
+ vi.stubGlobal('fetch', vi.fn(async () => llmSessionResponse()));
256
+ const outlets = createRuntime();
257
+ await outlets.runtime.maybeSendPushForTrigger(completionPayload('ses_llm'));
258
+ expectAllOutletsSilent(outlets);
259
+ });
260
+
261
+ it('skips ready notifications synthesized from session.idle for llm sessions', async () => {
262
+ vi.stubGlobal('fetch', vi.fn(async () => llmSessionResponse()));
263
+ const outlets = createRuntime();
264
+ await outlets.runtime.maybeSendPushForTrigger({
265
+ type: 'session.idle',
266
+ properties: {
267
+ directory: '/repo',
268
+ sessionID: 'ses_llm',
269
+ },
270
+ });
271
+ expectAllOutletsSilent(outlets);
272
+ });
273
+
274
+ it('skips error notifications and live-activity end for llm sessions', async () => {
275
+ vi.stubGlobal('fetch', vi.fn(async () => llmSessionResponse()));
276
+ const outlets = createRuntime();
277
+ await outlets.runtime.maybeSendPushForTrigger({
278
+ type: 'session.error',
279
+ properties: {
280
+ directory: '/repo',
281
+ sessionID: 'ses_llm',
282
+ error: 'boom',
283
+ },
284
+ });
285
+ expectAllOutletsSilent(outlets);
286
+ });
287
+
288
+ it('skips question notifications for llm sessions', async () => {
289
+ vi.useFakeTimers();
290
+ vi.stubGlobal('fetch', vi.fn(async () => llmSessionResponse()));
291
+ const outlets = createRuntime();
292
+ await outlets.runtime.maybeSendPushForTrigger({
293
+ type: 'question.asked',
294
+ properties: {
295
+ directory: '/repo',
296
+ sessionID: 'ses_llm',
297
+ questions: [{ header: 'Input needed', question: 'Continue?' }],
298
+ },
299
+ });
300
+ await vi.runAllTimersAsync();
301
+ expectAllOutletsSilent(outlets);
302
+ });
303
+
304
+ it('skips permission notifications for llm sessions', async () => {
305
+ vi.useFakeTimers();
306
+ vi.stubGlobal('fetch', vi.fn(async () => llmSessionResponse()));
307
+ const outlets = createRuntime();
308
+ await outlets.runtime.maybeSendPushForTrigger({
309
+ type: 'permission.asked',
310
+ properties: {
311
+ directory: '/repo',
312
+ sessionID: 'ses_llm',
313
+ id: 'perm_llm',
314
+ permission: 'edit',
315
+ },
316
+ });
317
+ await vi.runAllTimersAsync();
318
+ expectAllOutletsSilent(outlets);
319
+ });
320
+
321
+ it('uses session.updated event cache so later idle stays suppressed without llm on fetch', async () => {
322
+ const fetchMock = vi.fn(async () => jsonResponse({
323
+ id: 'ses_llm',
324
+ parentID: null,
325
+ title: 'Ordinary after strip',
326
+ metadata: {},
327
+ }));
328
+ vi.stubGlobal('fetch', fetchMock);
329
+ const outlets = createRuntime();
330
+ await outlets.runtime.maybeSendPushForTrigger({
331
+ type: 'session.updated',
332
+ properties: {
333
+ directory: '/repo',
334
+ info: {
335
+ id: 'ses_llm',
336
+ sessionID: 'ses_llm',
337
+ parentID: null,
338
+ title: '[openchamber-llm] generate',
339
+ metadata: { openchamber: { llm: { purpose: 'chat-completions' } } },
340
+ },
341
+ },
342
+ });
343
+ await outlets.runtime.maybeSendPushForTrigger({
344
+ type: 'session.idle',
345
+ properties: {
346
+ directory: '/repo',
347
+ sessionID: 'ses_llm',
348
+ },
349
+ });
350
+ expect(fetchMock).not.toHaveBeenCalled();
351
+ expectAllOutletsSilent(outlets);
352
+ });
353
+
354
+ it('does not treat empty llm.purpose as a hidden system session', async () => {
355
+ vi.stubGlobal('fetch', vi.fn(async () => jsonResponse({
356
+ id: 'ses_llm_empty',
357
+ parentID: null,
358
+ title: 'Looks like llm',
359
+ metadata: { openchamber: { llm: { purpose: '' } } },
360
+ })));
361
+ const {
362
+ runtime,
363
+ emitDesktopNotification,
364
+ sendPushToAllUiSessions,
365
+ sendApnsToAllUiSessions,
366
+ sendLiveActivityEnd,
367
+ } = createRuntime();
368
+ await runtime.maybeSendPushForTrigger(completionPayload('ses_llm_empty'));
369
+ expect(emitDesktopNotification).toHaveBeenCalledTimes(1);
370
+ expect(sendPushToAllUiSessions).toHaveBeenCalledTimes(1);
371
+ expect(sendApnsToAllUiSessions).toHaveBeenCalledTimes(1);
372
+ expect(sendLiveActivityEnd).toHaveBeenCalledWith({ sessionId: 'ses_llm_empty', status: 'complete' });
373
+ });
374
+ });
375
+
232
376
  const rootSessionResponse = () => jsonResponse({
233
377
  id: 'ses_root',
234
378
  parentID: null,
@@ -18,8 +18,9 @@ the index excludes them from every snapshot and clears prior summaries when a
18
18
  `metadata.openchamber.assistant.assistantID` (unless
19
19
  `metadata.openchamber.assigned.from === 'contact'` — those are visible
20
20
  coding workers the Assistant subscribed to),
21
- `metadata.openchamber.scheduledTask.taskID`, or
22
- `metadata.openchamber.smallModel.purpose`. Title prefixes are human labels and
21
+ `metadata.openchamber.scheduledTask.taskID`,
22
+ `metadata.openchamber.smallModel.purpose`, or
23
+ `metadata.openchamber.llm.purpose`. Title prefixes are human labels and
23
24
  never participate in this filter. Metadata is the ownership/isolation signal;
24
25
  `time.archived` is archive state; `time.pinned` is OpenChamber-owned pin state
25
26
  overlaid from the independent `session_pin` table (also mirrored onto in-window
@@ -20,6 +20,7 @@ const isSystemSession = (session) => {
20
20
  if (nonEmptySystemID(openchamber.assistant?.assistantID) && !isContactAssignedSession(openchamber)) return true;
21
21
  if (nonEmptySystemID(openchamber.scheduledTask?.taskID)) return true;
22
22
  if (nonEmptySystemID(openchamber.smallModel?.purpose)) return true;
23
+ if (nonEmptySystemID(openchamber.llm?.purpose)) return true;
23
24
  return false;
24
25
  };
25
26
 
@@ -68,7 +68,7 @@ describe('Electron session index', () => {
68
68
  service.close();
69
69
  });
70
70
 
71
- it('excludes Assistant, Scheduled, and smallModel system sessions from ordinary sidebar summaries', () => {
71
+ it('excludes Assistant, Scheduled, smallModel, and llm system sessions from ordinary sidebar summaries', () => {
72
72
  const runtimeRef = { value: 'http://runtime-a.test' };
73
73
  const service = createService(runtimeRef);
74
74
  const assistantSession = {
@@ -83,11 +83,15 @@ describe('Electron session index', () => {
83
83
  ...session('ses_small_model', 97),
84
84
  metadata: { openchamber: { smallModel: { purpose: 'session-title' } } },
85
85
  };
86
+ const llmSession = {
87
+ ...session('ses_llm', 96),
88
+ metadata: { openchamber: { llm: { purpose: 'chat-completions' } } },
89
+ };
86
90
  const ordinary = session('ses_ordinary', 98);
87
91
 
88
92
  service.replaceDirectory({
89
93
  directory: '/repo',
90
- sessions: [assistantSession, scheduledSession, smallModelSession, ordinary],
94
+ sessions: [assistantSession, scheduledSession, smallModelSession, llmSession, ordinary],
91
95
  cursor: null,
92
96
  hasMore: false,
93
97
  });
@@ -96,6 +100,7 @@ describe('Electron session index', () => {
96
100
  service.upsert(assistantSession);
97
101
  service.upsert(scheduledSession);
98
102
  service.upsert(smallModelSession);
103
+ service.upsert(llmSession);
99
104
  expect(service.snapshot().directories[0].sessions.map((item) => item.id)).toEqual(['ses_ordinary']);
100
105
  service.close();
101
106
  });
@@ -35,9 +35,10 @@ throttle (`TITLE_THROTTLE_MS`) when a refresh is armed.
35
35
  3. On fire:
36
36
  - Skip when Settings → Chat → session title refresh is off.
37
37
  - Skip system-owned sessions whose metadata carries a non-empty
38
- `openchamber.assistant.assistantID`, `openchamber.scheduledTask.taskID`, or
39
- `openchamber.smallModel.purpose`
40
- (fixed Assistant / scheduled / small-model titles must not be rewritten). Early
38
+ `openchamber.assistant.assistantID`, `openchamber.scheduledTask.taskID`,
39
+ `openchamber.smallModel.purpose`, or `openchamber.llm.purpose`
40
+ (fixed Assistant / scheduled / small-model / LLM gateway titles must not be
41
+ rewritten). Early
41
42
  `session.created` and smart-title request extraction skip the same
42
43
  metadata when present so timers are not armed.
43
44
  - Skip sub-agent sessions (`parentID`), multi-run/fusion structural titles,
@@ -167,6 +167,7 @@ export const isSystemOwnedSession = (sessionOrInfo) => {
167
167
  if (typeof openchamber.assistant?.assistantID === 'string' && openchamber.assistant.assistantID) return true;
168
168
  if (typeof openchamber.scheduledTask?.taskID === 'string' && openchamber.scheduledTask.taskID) return true;
169
169
  if (typeof openchamber.smallModel?.purpose === 'string' && openchamber.smallModel.purpose) return true;
170
+ if (typeof openchamber.llm?.purpose === 'string' && openchamber.llm.purpose) return true;
170
171
  return false;
171
172
  };
172
173
 
@@ -235,6 +235,9 @@ describe('session-title helpers', () => {
235
235
  expect(isSystemOwnedSession({
236
236
  metadata: { openchamber: { smallModel: { purpose: 'session-title' } } },
237
237
  })).toBe(true);
238
+ expect(isSystemOwnedSession({
239
+ metadata: { openchamber: { llm: { purpose: 'chat-completions' } } },
240
+ })).toBe(true);
238
241
  expect(isSystemOwnedSession({
239
242
  title: '[Assistant] Looks system',
240
243
  metadata: { openchamber: { assistant: { name: 'no-id' } } },
@@ -242,6 +245,9 @@ describe('session-title helpers', () => {
242
245
  expect(isSystemOwnedSession({
243
246
  metadata: { openchamber: { smallModel: { purpose: '' } } },
244
247
  })).toBe(false);
248
+ expect(isSystemOwnedSession({
249
+ metadata: { openchamber: { llm: { purpose: '' } } },
250
+ })).toBe(false);
245
251
  expect(isSystemOwnedSession({ title: 'Ordinary' })).toBe(false);
246
252
  expect(isSystemOwnedSession({
247
253
  metadata: { openchamber: { assigned: { from: 'contact', assistantID: 'assistant_1' } } },
@@ -1,2 +0,0 @@
1
- import{o as e,r as t}from"./rolldown-runtime-C0FnF6B9.js";import{A as n,E as r,t as i}from"./useUIStore-CuaA8-Hp.js";import{et as a}from"./persistence-DdUac14I.js";import{a as o}from"./vendor-zustand-B4dlGEM2.js";import{nt as s,rt as c}from"./vendor-base-ui-CnHfUmDN.js";import{r as l}from"./platform-B4KKLnZ5.js";import{n as u}from"./vendor-react-DLPElpoQ.js";import{r as d}from"./vendor-sonner-DVzioF3d.js";import{n as f}from"./vendor-reactuses-core-DDoDDyM9.js";import{n as p}from"./clipboard-DJ4nQEuY.js";import{a as m,n as h}from"./MobileShareBridge-HRTN71wg.js";import{Oo as g,dr as _,qt as v,r as y,vn as b}from"./useMobileNavigationStore-Di9IWKfu.js";import{a as x,b as S,c as C,f as w,h as T,p as E,r as D,t as O,v as k}from"./MobileDetailNavigation-D6ri-ePj.js";import{i as A,n as j,r as M}from"./useAssistantUIStore-me6s63b2.js";import{a as N,i as P,n as F,o as I,r as L,t as R}from"./dialog-CgbV5ljg.js";import{t as z}from"./utils-BiK3tBGM.js";import{t as B}from"./AgentAvatar-CX0a1rKE.js";import{n as V}from"./Icon-BYM02QyU.js";import{t as H}from"./button-C0cth9tl.js";import{i as U}from"./OverlayScrollbar-KUpvYHdv.js";import{t as W}from"./MarkdownRenderer-cxYw8-8G.js";import{a as G,i as ee,n as te,r as ne,t as re,u as K}from"./sessionChangeSummary-DOq8EN_H.js";import{a as ie,i as ae,n as oe,r as se,t as ce}from"./context-menu-CAp74NfV.js";import{t as q}from"./sessionLookup-CNMNR-yh.js";var J=u(),Y=e(c(),1),X=s(),le=e=>{let t=(0,J.c)(17),{name:n,emoji:r,size:i,label:a,working:o,className:s}=e,c=i===void 0?24:i,l=o!==void 0&&o,{t:u}=p(),d=`calc(${c}px * var(--dpt-n, 1))`,f;t[0]===s?f=t[1]:(f=z(`relative inline-block shrink-0 align-middle leading-none`,s),t[0]=s,t[1]=f);let m;t[2]===d?m=t[3]:(m={width:d,height:d},t[2]=d,t[3]=m);let h;t[4]!==r||t[5]!==a||t[6]!==n||t[7]!==c?(h=(0,X.jsx)(B,{name:n,emoji:r,size:c,label:a,shape:`circle`}),t[4]=r,t[5]=a,t[6]=n,t[7]=c,t[8]=h):h=t[8];let g;t[9]!==u||t[10]!==l?(g=l?(0,X.jsx)(`span`,{className:`pointer-events-none absolute right-0 bottom-0 size-2 translate-x-1/4 translate-y-1/4 rounded-full bg-[var(--status-success)] ring-2 ring-background`,"data-assistant-working-dot":``,"aria-label":u(`assistants.contact.working`)}):null,t[9]=u,t[10]=l,t[11]=g):g=t[11];let _;return t[12]!==f||t[13]!==m||t[14]!==h||t[15]!==g?(_=(0,X.jsxs)(`span`,{className:f,style:m,"data-assistant-working-avatar":``,children:[h,g]}),t[12]=f,t[13]=m,t[14]=h,t[15]=g,t[16]=_):_=t[16],_},ue=o(e=>({workingByID:{},setWorking:(t,n)=>e(e=>({workingByID:{...e.workingByID,[t]:n}}))})),de=({sending:e=!1,processing:t=!1})=>e||t,Z=e=>{let t=(0,J.c)(4),n;t[0]===e?n=t[1]:(n=t=>!!t.workingByID[e],t[0]=e,t[1]=n);let r=ue(n),i;return t[2]===r?i=t[3]:(i=de({processing:r}),t[2]=r,t[3]=i),i},fe=[],pe=e=>e.flatMap(e=>e.type===`text`&&e.text.trim()?[e.text]:[]).join(`
2
- `),me=(e,t,n,r=Date.now())=>({assistantID:e,messageID:t,parts:n,status:`sending`,createdAt:r}),he=(e,t)=>{let n=e.filter(e=>e.assistantID===t);return n.length===e.length?e:n},Q=(e,t)=>{let n=e.filter(e=>e.assistantID===t);return n.length===e.length?e:n},ge=(e,t,n,r)=>({messageID:t?`${e.turnID}:preview:${t.bubbleIndex}`:`${e.turnID}:preview:${r}`,assistantID:e.assistantID,role:`assistant`,turnID:e.turnID,bubbleIndex:t?.bubbleIndex??0,createdAt:t?.occurredAt??e.occurredAt,ordinal:n,status:r,fromAssistantID:null,fromAssistantName:null,parts:t?[{type:`text`,text:t.text}]:[],text:t?.text??``,cards:[]}),_e=(e,t,n)=>{let r=e.bubbles.filter(e=>!t.has(e.bubbleIndex)).map((t,r)=>ge(e,t,n+r,t.done?`complete`:`streaming`));return e.status===`failed`?[...r,ge(e,null,n+r.length,`failed`)]:e.status===`admitted`||e.status===`streaming`?[...r,ge(e,null,n+r.length,`admitted`)]:r},ve=(e,t,n,r=[])=>{let i=new Set(e.map(e=>e.messageID)),a=t.flatMap((t,r)=>t.assistantID!==n||i.has(t.messageID)?[]:[{messageID:t.messageID,assistantID:n,role:`user`,turnID:t.messageID,bubbleIndex:0,createdAt:t.createdAt,ordinal:e.length+r,status:t.status,fromAssistantID:null,fromAssistantName:null,parts:[...t.parts],text:pe(t.parts),cards:[]}]),o=a.length===0?e:[...e,...a],s=r.filter(e=>e.assistantID===n);if(s.length===0)return o;let c=new Map,l=new Map;o.forEach((e,t)=>{if(c.set(e.turnID,t),e.role!==`assistant`||e.messageID.includes(`:preview:`))return;let n=l.get(e.turnID)??new Set;n.add(e.bubbleIndex),l.set(e.turnID,n)});let u=new Map,d=[];for(let e of s){let t=_e(e,l.get(e.turnID)??new Set,o.length+d.length);if(t.length===0)continue;let n=c.get(e.turnID);if(n===void 0){d.push(...t);continue}let r=u.get(n)??[];r.push(...t),u.set(n,r)}return u.size===0&&d.length===0?o:o.flatMap((e,t)=>[e,...u.get(t)??[]]).concat(d)},ye=(e,t)=>{let n=new Set(t.map(e=>e.messageID)),r=e.filter(e=>!n.has(e.messageID));return r.length===e.length?e:r},be=(e,t)=>e.map(e=>e.messageID===t?{...e,status:`admitted`}:e),$=(e,t,n,r=Date.now())=>e.some(e=>e.assistantID===t&&e.turnID===n)?e:[...e,{assistantID:t,turnID:n,status:`admitted`,bubbles:[],occurredAt:r}],xe=(e,t)=>$(e,t.assistantID,t.turnID,t.occurredAt).map(e=>{if(e.assistantID!==t.assistantID||e.turnID!==t.turnID||e.status===`failed`||e.status===`complete`)return e;let n=e.bubbles.find(e=>e.bubbleIndex===t.bubbleIndex);if(n?.done)return e;let r=n?{...n,text:`${n.text}${t.delta}`,done:t.done,occurredAt:t.occurredAt}:{bubbleIndex:t.bubbleIndex,text:t.delta,done:t.done,occurredAt:t.occurredAt},i=n?e.bubbles.map(e=>e.bubbleIndex===t.bubbleIndex?r:e):[...e.bubbles,r].sort((e,t)=>e.bubbleIndex-t.bubbleIndex);return{...e,status:`streaming`,bubbles:i}}),Se=(e,t)=>$(e,t.assistantID,t.turnID,t.occurredAt).map(e=>e.assistantID!==t.assistantID||e.turnID!==t.turnID?e:{...e,status:t.status===`error`?`failed`:`complete`,...t.error?{error:t.error}:{}}),Ce=(e,t)=>{let n=new Set(t.flatMap(e=>e.role===`assistant`?[e.turnID]:[])),r=e.filter(e=>e.status!==`complete`||!n.has(e.turnID));return r.length===e.length?e:r},we=(e,t,n)=>e.map(e=>e.messageID===t?{...e,status:`failed`,error:n}:e),Te=(e,t)=>{if(e instanceof k){if(e.code===`no_provider`)return t.noProvider;if(e.code===`admission_timeout`||e.code===`generate_timeout`)return t.timedOut;if(e.message&&e.message!==e.code)return e.message}return S(e)?t.timedOut:t.sendFailed},Ee=()=>{let e=!1;return{tryAcquire:()=>!e&&(e=!0,!0),release:()=>{e=!1}}},De=e=>{let t=e.text.trim();if(e.sending||!t&&e.attachments.length===0||!e.gate.tryAcquire())return{ok:!1};let n=[...t?[{type:`text`,text:t}]:[],...e.attachments.map(e=>({type:`file`,mime:e.mime,url:e.url,filename:e.name}))],r=e.createMessageID();return{ok:!0,messageID:r,parts:n,turn:me(e.assistantID,r,n,e.createdAt)}},Oe=e=>e.some(e=>e.status===`sending`),ke=e=>e.some(e=>e.status===`admitted`||e.status===`streaming`),Ae=[`cursor-pointer rounded-[1.35rem] bg-[var(--surface-elevated)] ring-1 ring-inset ring-[var(--surface-subtle)]`,`px-3.5 py-3 text-left transition-[background-color,box-shadow,transform] duration-200 ease-out motion-reduce:transition-none`,`hover:-translate-y-px hover:bg-interactive-hover/45 hover:shadow-sm active:translate-y-0 motion-reduce:hover:translate-y-0`,`focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--interactive-focus-ring)]`].join(` `),je=`${Ae} w-fit max-w-[15rem]`,Me=`${Ae} w-fit max-w-[20rem]`;function Ne(e,t){(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),t())}var Pe=e=>{let t=(0,J.c)(26),{card:n}=e,{t:r}=p(),i=K(),a;t[0]===i?a=t[1]:(a=i&&!l(),t[0]=i,t[1]=a);let o=!!a,s=n.name,c=`${n.providerID}/${n.modelID}`,u;t[2]!==n.mode||t[3]!==c?(u=[c,n.mode].filter(Boolean),t[2]=n.mode,t[3]=c,t[4]=u):u=t[4];let d=u,m;t[5]!==n.assistantID||t[6]!==o?(m=()=>{if(o){y.getState().openAssistant(n.assistantID);return}j(n.assistantID)},t[5]=n.assistantID,t[6]=o,t[7]=m):m=t[7];let h=f(m),g;t[8]===h?g=t[9]:(g=e=>{Ne(e,h)},t[8]=h,t[9]=g);let _=f(g),v;t[10]!==r||t[11]!==s?(v=r(`assistants.contact.card.assistant.aria`,{name:s}),t[10]=r,t[11]=s,t[12]=v):v=t[12];let b;t[13]===Symbol.for(`react.memo_cache_sentinel`)?(b=(0,X.jsx)(`span`,{className:`relative inline-block size-6 shrink-0 leading-none`,children:(0,X.jsx)(`span`,{className:`flex size-6 items-center justify-center rounded-lg bg-[var(--surface-muted)] text-muted-foreground`,children:(0,X.jsx)(V,{name:`robot-2`,className:`size-3`})})}),t[13]=b):b=t[13];let x;t[14]===s?x=t[15]:(x=(0,X.jsx)(`h3`,{className:`min-w-0 truncate typography-ui-label font-medium text-foreground`,children:s}),t[14]=s,t[15]=x);let S;t[16]===d?S=t[17]:(S=d.length>0?(0,X.jsx)(`p`,{className:`truncate typography-micro text-muted-foreground`,children:d.join(` · `)}):null,t[16]=d,t[17]=S);let C;t[18]!==x||t[19]!==S?(C=(0,X.jsxs)(`div`,{className:`flex items-center gap-2.5`,children:[b,(0,X.jsxs)(`div`,{className:`min-w-0 flex-1 space-y-1`,children:[x,S]})]}),t[18]=x,t[19]=S,t[20]=C):C=t[20];let w;return t[21]!==_||t[22]!==h||t[23]!==C||t[24]!==v?(w=(0,X.jsx)(`article`,{className:je,role:`button`,tabIndex:0,"aria-label":v,"data-assistant-contact-card":`assistant`,onClick:h,onKeyDown:_,children:C}),t[21]=_,t[22]=h,t[23]=C,t[24]=v,t[25]=w):w=t[25],w},Fe=e=>{let t=(0,J.c)(25),{card:n}=e,{t:r}=p(),i=n.name,a;t[0]!==n.kind||t[1]!==n.time||t[2]!==n.timezone?(a=[n.kind,n.time,n.timezone].filter(Boolean),t[0]=n.kind,t[1]=n.time,t[2]=n.timezone,t[3]=a):a=t[3];let o=a.join(` `),s;t[4]!==n.prompt||t[5]!==o?(s=o.trim()||(typeof n.prompt==`string`?n.prompt.trim():``),t[4]=n.prompt,t[5]=o,t[6]=s):s=t[6];let c=s,l=f(Ie),u;t[7]===l?u=t[8]:(u=e=>{Ne(e,l)},t[7]=l,t[8]=u);let d=f(u),m;t[9]!==r||t[10]!==i?(m=r(`assistants.contact.card.schedule.aria`,{name:i}),t[9]=r,t[10]=i,t[11]=m):m=t[11];let h;t[12]===Symbol.for(`react.memo_cache_sentinel`)?(h=(0,X.jsx)(`span`,{className:`relative inline-block size-6 shrink-0 leading-none`,children:(0,X.jsx)(`span`,{className:`flex size-6 items-center justify-center rounded-lg bg-[var(--surface-muted)] text-muted-foreground`,children:(0,X.jsx)(V,{name:`calendar`,className:`size-3`})})}),t[12]=h):h=t[12];let g;t[13]===i?g=t[14]:(g=(0,X.jsx)(`h3`,{className:`min-w-0 truncate typography-ui-label font-medium text-foreground`,children:i}),t[13]=i,t[14]=g);let _;t[15]===c?_=t[16]:(_=c?(0,X.jsx)(`p`,{className:`truncate typography-micro text-muted-foreground`,children:c}):null,t[15]=c,t[16]=_);let v;t[17]!==g||t[18]!==_?(v=(0,X.jsxs)(`div`,{className:`flex items-center gap-2.5`,children:[h,(0,X.jsxs)(`div`,{className:`min-w-0 flex-1 space-y-1`,children:[g,_]})]}),t[17]=g,t[18]=_,t[19]=v):v=t[19];let y;return t[20]!==d||t[21]!==l||t[22]!==m||t[23]!==v?(y=(0,X.jsx)(`article`,{className:je,role:`button`,tabIndex:0,"aria-label":m,"data-assistant-contact-card":`schedule`,onClick:l,onKeyDown:d,children:v}),t[20]=d,t[21]=l,t[22]=m,t[23]=v,t[24]=y):y=t[24],y};function Ie(){i.getState().setActiveMainTab(`schedule`),i.getState().setScheduledTasksDialogOpen(!0)}var Le=(e,t)=>e===`busy`||e===`retry`?e:t===`error`||t===`question`||t===`complete`?t:e===`idle`?`complete`:t===`busy`||t===`retry`||t===`idle`?t:t||`busy`,Re=e=>e===`busy`?`assistants.contact.card.session.status.busy`:e===`retry`?`assistants.contact.card.session.status.retry`:e===`idle`?`assistants.contact.card.session.status.idle`:e===`complete`?`assistants.contact.card.session.status.complete`:e===`error`?`assistants.contact.card.session.status.error`:e===`question`?`assistants.contact.card.session.status.question`:null,ze=e=>e===`busy`?`bg-[var(--status-info)]/10 text-[var(--status-info)]`:e===`retry`||e===`question`?`bg-[var(--status-warning)]/10 text-[var(--status-warning)]`:e===`error`?`bg-[var(--status-error)]/10 text-[var(--status-error)]`:e===`idle`||e===`complete`?`bg-[var(--status-success)]/10 text-[var(--status-success)]`:`bg-[var(--surface-muted)] text-muted-foreground`,Be=e=>e.split(/[/\\]/u).filter(Boolean).at(-1)||e,Ve=e=>{let t=(0,J.c)(35),{card:n}=e,{t:r}=p(),a=K(),o;t[0]===a?o=t[1]:(o=a&&!l(),t[0]=a,t[1]=o);let s=!!o,c;t[2]===n.sessionID?c=t[3]:(c=e=>e.activeSessions.find(e=>e.id===n.sessionID)??e.archivedSessions.find(e=>e.id===n.sessionID)??null,t[2]=n.sessionID,t[3]=c);let u=_(c),d=v(n.sessionID),m=(typeof u?.title==`string`&&u.title.trim()?u.title.trim():null)||n.title||r(`assistants.contact.card.session.untitled`),h=Le(d?.type,n.status),g=Re(h),y=h===`busy`||h===`retry`,x=Be(typeof u?.directory==`string`&&u.directory.trim()?u.directory.trim():n.directory),S=te(u)||n.branch,C=ee(u),w=ne(u),T=re(w),E=[x,C,S].filter(He),D;t[4]!==n.directory||t[5]!==n.sessionID||t[6]!==s?(D=()=>{let e=q(n.sessionID)?.directory||n.directory;b(n.sessionID,e,{phoneShell:s,switchToChat:!0}),s||i.getState().setActiveMainTab(`chat`)},t[4]=n.directory,t[5]=n.sessionID,t[6]=s,t[7]=D):D=t[7];let O=f(D),k;t[8]===O?k=t[9]:(k=e=>{Ne(e,O)},t[8]=O,t[9]=k);let A=f(k),j=Me,M=r(`assistants.contact.card.session.aria`,{title:m}),N;t[10]===Symbol.for(`react.memo_cache_sentinel`)?(N=(0,X.jsx)(`span`,{className:`flex size-6 items-center justify-center rounded-lg bg-[var(--surface-muted)] text-muted-foreground`,children:(0,X.jsx)(V,{name:`chat-3`,className:`size-3`})}),t[10]=N):N=t[10];let P;t[11]===y?P=t[12]:(P=y?(0,X.jsx)(`span`,{className:`pointer-events-none absolute right-0 bottom-0 size-2 translate-x-1/4 translate-y-1/4 rounded-full bg-[var(--status-success)] ring-2 ring-[var(--surface-elevated)]`,"data-assistant-working-dot":``,"aria-hidden":!0}):null,t[11]=y,t[12]=P);let F;t[13]===P?F=t[14]:(F=(0,X.jsxs)(`span`,{className:`relative inline-block size-6 shrink-0 leading-none`,children:[N,P]}),t[13]=P,t[14]=F);let I;t[15]===m?I=t[16]:(I=(0,X.jsx)(`h3`,{className:`min-w-0 flex-1 truncate typography-ui-label font-medium text-foreground`,children:m}),t[15]=m,t[16]=I);let L=g?(0,X.jsx)(`span`,{className:z(`shrink-0 rounded-full px-1.5 py-0.5 typography-micro leading-none`,ze(h)),children:r(g)}):null,R;t[17]!==I||t[18]!==L?(R=(0,X.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[I,L]}),t[17]=I,t[18]=L,t[19]=R):R=t[19];let B;t[20]===E?B=t[21]:(B=E.length>0?(0,X.jsx)(`p`,{className:`truncate typography-micro text-muted-foreground`,children:E.join(` · `)}):null,t[20]=E,t[21]=B);let H=T||w?.files!==void 0&&w.files>0?(0,X.jsxs)(`p`,{className:`flex flex-wrap items-baseline gap-x-1.5 typography-micro tabular-nums`,children:[w?.additions===void 0?null:(0,X.jsxs)(`span`,{className:`text-[var(--status-success)]`,children:[`+`,w.additions]}),w?.deletions===void 0?null:(0,X.jsxs)(`span`,{className:`text-[var(--status-error)]`,children:[`−`,w.deletions]}),w?.files===void 0?null:(0,X.jsx)(`span`,{className:`text-muted-foreground`,children:w.files===1?r(`assistants.contact.card.session.changes.filesSingle`,{count:w.files}):r(`assistants.contact.card.session.changes.filesPlural`,{count:w.files})})]}):null,U;t[22]!==R||t[23]!==B||t[24]!==H?(U=(0,X.jsxs)(`div`,{className:`min-w-0 flex-1 space-y-1`,children:[R,B,H]}),t[22]=R,t[23]=B,t[24]=H,t[25]=U):U=t[25];let W;t[26]!==F||t[27]!==U?(W=(0,X.jsxs)(`div`,{className:`flex items-start gap-2.5`,children:[F,U]}),t[26]=F,t[27]=U,t[28]=W):W=t[28];let G;return t[29]!==A||t[30]!==O||t[31]!==W||t[32]!==j||t[33]!==M?(G=(0,X.jsx)(`article`,{className:j,role:`button`,tabIndex:0,"aria-label":M,"data-assistant-contact-card":`session`,onClick:O,onKeyDown:A,children:W}),t[29]=A,t[30]=O,t[31]=W,t[32]=j,t[33]=M,t[34]=G):G=t[34],G};function He(e){return!!(e&&e.trim())}var Ue=64,We=e=>new Promise((t,n)=>{let r=new FileReader;r.onload=()=>{t(typeof r.result==`string`?r.result:``)},r.onerror=()=>{n(r.error??Error(`read_failed`))},r.readAsDataURL(e)}),Ge=e=>{if(!e)return[];let t=Array.from(e.files||[]);return t.length>0?t:Array.from(e.items||[]).filter(e=>e.kind===`file`).map(e=>e.getAsFile()).filter(e=>e instanceof File)},Ke=e=>Array.from(e?.files||[]),qe=async(e,t=a)=>{let n=[],r=0;for(let i of Array.from(e||[])){if(!i||i.size<=0)continue;if(i.size>52428800){r+=1;continue}let e=await We(i);e.startsWith(`data:`)&&n.push({id:t(),url:e,name:i.name.trim()||`attachment`,mime:i.type.trim()||`application/octet-stream`})}return{attachments:n,skippedTooLarge:r}},Je=(e,t)=>[...e,...t].slice(0,Ue),Ye={"oc.settle.complete":`assistants.contact.settle.complete`,"oc.settle.error":`assistants.contact.settle.error`,"oc.settle.question":`assistants.contact.settle.question`},Xe=({assistant:e,warning:t,active:n,overlayHeader:r=!1})=>{let{t:o}=p(),s=i(e=>e.isMobile),c=w(),l=T(),u=E(e.id,n),d=m(e.name),_=d.displayName||e.name,v=(e,t)=>{let n=e?l.data?.assistants.find(t=>t.id===e):void 0;return n?m(n.name).displayName||n.name:t||o(`assistants.contact.peer.unknown`)},[y,b]=Y.useState(``),[x,S]=Y.useState([]),[D,O]=Y.useState([]),[k,A]=Y.useState([]),[j,M]=Y.useState(null),N=Y.useMemo(()=>Ee(),[]),P=Y.useRef(new Set),F=ue(e=>e.setWorking),I=Y.useRef(null),L=u.data?.messages??fe,R=he(D,e.id),B=Q(k,e.id),H=ve(L,R,e.id,B),U=Oe(R),ee=ke(B),te=B.reduce((e,t)=>e+t.bubbles.reduce((e,t)=>e+t.text.length,0),0),ne=new Map(B.map(e=>[e.turnID,e]));Y.useEffect(()=>{M(null),P.current.clear(),O(t=>he(t,e.id)),A(t=>Q(t,e.id))},[e.id]),Y.useEffect(()=>{O(e=>ye(e,L)),A(e=>Ce(e,L))},[L]),Y.useEffect(()=>{F(e.id,U||ee)},[e.id,ee,U,F]),Y.useEffect(()=>{let t=e.id;return()=>{F(t,!1)}},[e.id,F]);let re=f(t=>{if(!(!(`assistantID`in t)||t.assistantID!==e.id)){if(t.type===`contact-turn-start`){if(P.current.has(t.turnID))return;A(e=>$(e,t.assistantID,t.turnID,t.occurredAt));return}if(t.type===`contact-bubble-delta`){if(P.current.has(t.turnID))return;A(e=>xe(e,t));return}t.type===`contact-turn-end`&&(P.current.add(t.turnID),A(e=>Ce(Se(e,t),L)))}});Y.useEffect(()=>{if(n)return g(re)},[n,e.id]),Y.useEffect(()=>{let e=I.current;e&&(e.scrollTop=e.scrollHeight)},[te,H.length]);let K=f(async e=>{let t=await qe(e);t.skippedTooLarge>0&&M(o(`assistants.contact.attachment.tooLarge`)),t.attachments.length!==0&&S(e=>Je(e,t.attachments))}),ie=f(e=>{let t=Ge(e.clipboardData);t.length!==0&&(e.preventDefault(),K(t))}),ae=f(e=>{Array.from(e.dataTransfer?.types??[]).includes(`Files`)&&(e.preventDefault(),e.dataTransfer.dropEffect=`copy`)}),oe=f(e=>{let t=Ke(e.dataTransfer);t.length!==0&&(e.preventDefault(),K(t))}),se=f(async()=>{let t=y,n=x,r=e.id,i=De({gate:N,sending:Oe(R),text:t,attachments:n,assistantID:r,createMessageID:()=>`oc_contact_${a()}`});if(i.ok){O(e=>[...e,i.turn]),b(``),S([]),M(null);try{await C(r,i.messageID,{parts:i.parts}),O(e=>be(e,i.messageID)),P.current.has(i.messageID)||A(e=>$(e,r,i.messageID)),c.data?.serverInstanceID&&h({serverInstanceID:c.data.serverInstanceID,assistantID:r,name:_,avatarSeed:r,...d.avatarEmoji?{avatarEmoji:d.avatarEmoji}:{}}).catch(()=>void 0)}catch(e){let t=Te(e,{noProvider:o(`assistants.contact.noProvider`),sendFailed:o(`assistants.contact.sendFailed`),timedOut:o(`assistants.contact.timedOut`)});O(e=>we(e,i.messageID,t))}finally{N.release()}}}),ce=u.isError&&H.length===0,q=u.isSuccess&&H.length===0,J=new Map(R.map(e=>[e.messageID,e]));return(0,X.jsxs)(`div`,{className:`flex min-h-0 flex-1 flex-col bg-background`,children:[(0,X.jsxs)(`div`,{ref:I,className:z(`min-h-0 flex-1 overflow-y-auto px-4 pb-9 sm:px-8 sm:pb-12`,r?`pt-[calc(max(0.625rem,var(--oc-safe-area-top,0px))+var(--oc-mobile-detail-navigation-height)+1.25rem)]`:`pt-5 sm:pt-7`),"data-assistant-contact-transcript":``,children:[t?(0,X.jsx)(`p`,{className:`mb-3 typography-micro text-[var(--status-warning)]`,children:t}):null,ce?(0,X.jsxs)(`div`,{className:`mx-auto flex h-full min-h-56 max-w-xs flex-col items-center justify-center pb-16 text-center`,"data-assistant-contact-error":``,children:[(0,X.jsxs)(`div`,{className:`relative`,children:[(0,X.jsx)(le,{name:e.id,emoji:d.avatarEmoji,size:44,label:_}),(0,X.jsx)(`span`,{"aria-hidden":!0,className:`absolute -right-1 -bottom-1 flex size-5 items-center justify-center rounded-full bg-[var(--surface-elevated)] text-[var(--status-error)] ring-2 ring-background`,children:(0,X.jsx)(V,{name:`error-warning`,className:`size-3`})})]}),(0,X.jsx)(`p`,{className:`mt-4 typography-ui-label font-medium text-foreground`,children:_}),(0,X.jsx)(`p`,{className:`mt-1.5 typography-ui leading-6 text-muted-foreground`,children:o(`assistants.contact.loadFailed`)})]}):q?(0,X.jsxs)(`div`,{className:`mx-auto flex h-full min-h-56 max-w-sm flex-col items-center justify-center pb-16 text-center`,"data-assistant-contact-empty":``,children:[(0,X.jsx)(le,{name:e.id,emoji:d.avatarEmoji,size:48,label:_,className:`opacity-90`}),(0,X.jsx)(`p`,{className:`mt-5 typography-ui-header font-medium tracking-[-0.01em] text-foreground`,children:o(`assistants.conversation.emptyTitle`,{name:_})}),(0,X.jsx)(`p`,{className:`mt-2 max-w-xs typography-ui leading-6 text-muted-foreground/80`,children:o(`assistants.contact.empty`)})]}):(0,X.jsx)(`div`,{className:`mx-auto flex w-full max-w-[42rem] flex-col`,children:H.map((t,n)=>{let r=n>0?H[n-1]:null,i=t.role===`user`,a=t.role===`peer`,s=t.role===`assistant`&&r?.role===`assistant`&&r.turnID===t.turnID,c=r?.turnID!==t.turnID,u=!i&&(a||!s),d=a?v(t.fromAssistantID,t.fromAssistantName):_,f=a&&t.fromAssistantID?l.data?.assistants.find(e=>e.id===t.fromAssistantID):e,p=f?m(f.name):null,h=J.get(t.messageID),g=ne.get(t.turnID),y=t.status===`admitted`&&t.messageID.endsWith(`:preview:admitted`),b=t.status===`failed`&&t.messageID.endsWith(`:preview:failed`);return(0,X.jsxs)(`div`,{className:z(`flex w-full`,i?`justify-end`:`justify-start`,c?`mt-6 first:mt-0`:s?`mt-1.5`:`mt-3`),"data-assistant-contact-role":t.role,"data-assistant-contact-turn-status":h?.status??t.status,"data-assistant-contact-run-start":t.role===`assistant`&&!s?``:void 0,children:[i?null:(0,X.jsx)(`div`,{className:`mr-2.5 flex w-8 shrink-0 justify-center pt-0.5`,children:u?(0,X.jsx)(le,{name:f?.id||t.fromAssistantID||e.id,emoji:p?.avatarEmoji,size:28,label:d}):(0,X.jsx)(`span`,{className:`size-7`,"aria-hidden":!0})}),(0,X.jsxs)(`div`,{className:z(`flex min-w-0 flex-col gap-1.5`,i?`max-w-[min(82%,30rem)] items-end`:`max-w-[min(84%,34rem)] items-start`),children:[a?(0,X.jsx)(`span`,{className:`mb-0.5 px-1 typography-micro text-muted-foreground/75`,children:o(`assistants.contact.peer.from`,{name:d})}):null,y?(0,X.jsxs)(`div`,{role:`status`,"aria-label":o(`assistants.contact.processing`),className:`inline-flex w-fit items-center gap-1 rounded-full bg-[var(--surface-muted)] px-3.5 py-2.5 text-muted-foreground/70`,"data-assistant-contact-processing":``,children:[(0,X.jsx)(`span`,{"aria-hidden":!0,className:`size-1.5 animate-pulse rounded-full bg-current [animation-delay:-0.45s] [animation-duration:1.4s] motion-reduce:animate-none`}),(0,X.jsx)(`span`,{"aria-hidden":!0,className:`size-1.5 animate-pulse rounded-full bg-current [animation-delay:-0.22s] [animation-duration:1.4s] motion-reduce:animate-none`}),(0,X.jsx)(`span`,{"aria-hidden":!0,className:`size-1.5 animate-pulse rounded-full bg-current [animation-duration:1.4s] motion-reduce:animate-none`})]}):null,t.parts.map((e,n)=>{if(e.type===`card`&&e.cardType===`session`)return(0,X.jsx)(Ve,{card:e},`${t.messageID}:card:${n}`);if(e.type===`card`&&e.cardType===`assistant`)return(0,X.jsx)(Pe,{card:e},`${t.messageID}:card:${n}`);if(e.type===`card`&&e.cardType===`schedule`)return(0,X.jsx)(Fe,{card:e},`${t.messageID}:card:${n}`);if(e.type===`file`&&e.mime.startsWith(`image/`)&&e.url)return(0,X.jsx)(`img`,{src:e.url,alt:e.filename||o(`assistants.contact.attachment.image`),className:`max-h-72 max-w-full rounded-[1.35rem] border border-border/40 object-contain`,"data-assistant-contact-image":``},`${t.messageID}:file:${n}`);if(e.type===`file`)return(0,X.jsxs)(`div`,{className:`flex max-w-full items-center gap-2.5 rounded-[1.25rem] bg-[var(--surface-muted)] px-3.5 py-2.5 ring-1 ring-inset ring-[var(--surface-subtle)]`,"data-assistant-contact-file":``,children:[(0,X.jsx)(V,{name:`file-text`,className:`size-4 shrink-0 text-muted-foreground`}),(0,X.jsx)(`span`,{className:`min-w-0 truncate typography-ui`,children:e.filename||o(`assistants.contact.attachment.file`)})]},`${t.messageID}:file:${n}`);if(e.type===`text`&&(e.text.trim()||t.status===`streaming`)){let r=Ye[e.text],c=!i&&!r;return(0,X.jsxs)(`div`,{"aria-label":a?o(`assistants.contact.peer.aria`,{name:d}):void 0,className:z(`break-words rounded-[1.35rem] px-4 py-2.5 typography-ui leading-6`,c?`min-w-0`:`whitespace-pre-wrap`,i?`rounded-[1.15rem] rounded-br-lg bg-[var(--primary-base)]/90 text-[var(--primary-foreground)]`:a?`rounded-[1.25rem] border border-dashed border-border/50 bg-[var(--surface-muted)]/70 text-foreground`:z(`bg-[var(--surface-muted)] text-foreground`,s&&`rounded-tl-lg`)),children:[c?(0,X.jsx)(W,{content:e.text,messageId:t.messageID,isAnimated:!1,isStreaming:t.status===`streaming`,variant:`assistant`,enableFileReferences:!1,className:`w-auto max-w-full`}):r?o(r):e.text,t.status===`streaming`&&n===t.parts.length-1?(0,X.jsx)(`span`,{"aria-hidden":!0,className:`ml-0.5 inline-block h-[1em] w-px translate-y-[0.12em] animate-pulse bg-current opacity-45 [animation-duration:1.1s] motion-reduce:animate-none`,"data-assistant-contact-streaming-caret":``}):null]},`${t.messageID}:text:${n}`)}return null}),h?.status===`sending`?(0,X.jsx)(`p`,{className:`px-1 typography-micro text-muted-foreground/75`,children:o(`assistants.contact.sending`)}):null,h?.status===`failed`?(0,X.jsx)(`p`,{className:`px-1 typography-micro text-[var(--status-error)]`,children:h.error||o(`assistants.contact.sendFailed`)}):null,b?(0,X.jsx)(`p`,{className:`px-1 typography-micro text-[var(--status-error)]`,children:g?.error||o(`assistants.contact.sendFailed`)}):null]})]},t.messageID)})})]}),(0,X.jsxs)(`footer`,{className:`relative z-10 shrink-0 bg-background pt-1`,"data-assistant-contact-composer":``,children:[j?(0,X.jsx)(`p`,{className:`chat-input-column mb-2 typography-micro text-[var(--status-error)]`,children:j}):null,(0,X.jsx)(`form`,{className:z(`relative w-full pt-1.5 pb-4`,s&&`bottom-safe-area oc-mobile-composer`),onSubmit:e=>{e.preventDefault(),se()},onDragOver:ae,onDrop:oe,children:(0,X.jsx)(`div`,{className:`chat-input-column relative overflow-visible`,children:(0,X.jsx)(G,{layout:`inline`,value:y,attachments:x,pending:!1,isMobile:s,placeholder:o(`assistants.contact.placeholder`,{name:_}),sendLabel:o(`assistants.contact.send`),addFilesLabel:o(`assistants.contact.addFiles`),removeAttachmentLabel:o(`assistants.contact.removeAttachment`),fileAccept:`*/*`,onChange:e=>b(e),onSubmit:()=>{se()},onAddFiles:e=>{K(e)},onRemoveAttachment:e=>{S(t=>t.filter(t=>t.id!==e))},onPaste:ie,onDragOver:ae,onDrop:oe,className:z(`relative z-10`,s&&`oc-mobile-composer-surface`),style:{borderRadius:`1.5rem`},"data-assistant-contact-composer-surface":``,textareaProps:{"aria-label":o(`assistants.contact.placeholder`,{name:_})}})})})]})]})};async function Ze(e){await D(e);let t=A.getState().defaultShareAssistant;if(t?.assistantID!==e.id)return;let n=await x();n.serverInstanceID&&t.serverInstanceID===n.serverInstanceID&&A.getState().setDefaultShareAssistant(null)}function Qe({assistant:e,open:t,onOpenChange:n,onDeleted:r}){let{t:i}=p(),[a,o]=Y.useState(!1),s=e?m(e.name).displayName||e.name:``,c=f(e=>{a&&!e||n(e)}),l=f(()=>{a||n(!1)}),u=f(async()=>{if(!(!e||a)){o(!0);try{await Ze(e),r?.(e.id),n(!1),d.success(i(`assistants.settings.toast.deleted`))}catch{d.error(i(`assistants.settings.toast.deleteFailed`))}finally{o(!1)}}});return(0,X.jsx)(R,{open:t&&e!==null,onOpenChange:c,children:(0,X.jsxs)(F,{className:`max-w-md`,children:[(0,X.jsxs)(N,{children:[(0,X.jsx)(I,{children:i(`assistants.settings.delete`)}),(0,X.jsx)(L,{children:i(`assistants.settings.deleteConfirm`,{name:s})})]}),(0,X.jsxs)(P,{children:[(0,X.jsx)(H,{size:`sm`,variant:`ghost`,onClick:l,disabled:a,children:i(`settings.common.actions.cancel`)}),(0,X.jsx)(H,{size:`sm`,variant:`destructive`,onClick:u,disabled:a,children:i(`settings.common.actions.delete`)})]})]})})}var $e=e=>e.capabilityPending?`loading`:e.capabilityError||e.supported!==!0||e.capabilityEnabled!==!0?`unavailable`:e.snapshotPending?`loading`:e.snapshotEnabled===!0?e.assistantCount===0?`onboarding`:e.hasAssistant?`ready`:e.snapshotSettled?`unavailable`:`loading`:`unavailable`,et=t({AssistantView:()=>rt}),tt=e=>{let t=(0,J.c)(21),{assistant:n,onBack:r}=e,{t:i}=p(),a=K(),o;t[0]===n?o=t[1]:(o=n?m(n.name):null,t[0]=n,t[1]=o);let s=o,c=n&&s?s.displayName||n.name:``,l;t[2]!==n||t[3]!==a?(l=()=>{n&&M(n.id,a?{openMobileSettings:a.openSettings}:void 0)},t[2]=n,t[3]=a,t[4]=l):l=t[4];let u=f(l),d;t[5]!==n||t[6]!==c||t[7]!==s?.avatarEmoji||t[8]!==i?(d=n?(0,X.jsxs)(`span`,{className:`inline-flex min-w-0 items-center gap-2.5`,children:[(0,X.jsx)(le,{name:n.id,emoji:s?.avatarEmoji,size:28,label:c}),(0,X.jsx)(`span`,{className:`truncate font-medium tracking-[-0.01em]`,children:c||i(`assistants.title`)})]}):c||i(`assistants.title`),t[5]=n,t[6]=c,t[7]=s?.avatarEmoji,t[8]=i,t[9]=d):d=t[9];let h;t[10]===i?h=t[11]:(h=i(`assistants.actions.backToChat`),t[10]=i,t[11]=h);let g;t[12]!==n||t[13]!==u||t[14]!==i?(g=n?[{icon:`settings-3`,ariaLabel:i(`assistants.conversation.openSettings`),onClick:u}]:[],t[12]=n,t[13]=u,t[14]=i,t[15]=g):g=t[15];let _;return t[16]!==r||t[17]!==d||t[18]!==h||t[19]!==g?(_=(0,X.jsx)(O,{title:d,backAriaLabel:h,onBack:r,actions:g,overlay:!0}),t[16]=r,t[17]=d,t[18]=h,t[19]=g,t[20]=_):_=t[20],_},nt=e=>{let t=(0,J.c)(41),{assistantID:n,displayName:r,avatarEmoji:i,selected:a,enabled:o,editLabel:s,deleteLabel:c,onSelect:l,onEdit:u,onDelete:d}=e,p=Z(n),[m,h]=Y.useState(!1),g;t[0]===l?g=t[1]:(g=()=>l(),t[0]=l,t[1]=g);let _=f(g),v;t[2]===u?v=t[3]:(v=()=>{h(!1),u()},t[2]=u,t[3]=v);let y=f(v),b;t[4]===d?b=t[5]:(b=()=>{h(!1),d()},t[4]=d,t[5]=b);let x=f(b),S;t[6]===Symbol.for(`react.memo_cache_sentinel`)?(S=e=>{e.preventDefault(),h(!0)},t[6]=S):S=t[6];let C=a?`border-border/50 bg-[var(--surface-elevated)]`:`border-transparent hover:bg-interactive-hover`,w=!o&&`opacity-65`,T;t[7]!==C||t[8]!==w?(T=z(`flex w-full min-h-11 items-center gap-3 rounded-xl border px-3 py-3 text-left outline-none transition-[background-color,border-color,opacity] duration-150 ease-out active:bg-interactive-active focus-visible:ring-2 focus-visible:ring-[var(--interactive-focus-ring)] motion-reduce:transition-none`,C,w),t[7]=C,t[8]=w,t[9]=T):T=t[9];let E;t[10]!==_||t[11]!==a||t[12]!==T?(E=(0,X.jsx)(`button`,{type:`button`,role:`option`,"aria-selected":a,onClick:_,onContextMenu:S,className:T}),t[10]=_,t[11]=a,t[12]=T,t[13]=E):E=t[13];let D;t[14]!==n||t[15]!==i||t[16]!==r||t[17]!==p?(D=(0,X.jsx)(le,{name:n,emoji:i,size:24,label:r,working:p}),t[14]=n,t[15]=i,t[16]=r,t[17]=p,t[18]=D):D=t[18];let O;t[19]===r?O=t[20]:(O=(0,X.jsx)(`span`,{className:`min-w-0 flex-1`,children:(0,X.jsx)(`span`,{className:`block truncate typography-ui-label font-medium`,children:r})}),t[19]=r,t[20]=O);let k;t[21]!==O||t[22]!==E||t[23]!==D?(k=(0,X.jsxs)(ie,{render:E,children:[D,O]}),t[21]=O,t[22]=E,t[23]=D,t[24]=k):k=t[24];let A;t[25]===Symbol.for(`react.memo_cache_sentinel`)?(A=(0,X.jsx)(V,{name:`edit`,className:`size-4`}),t[25]=A):A=t[25];let j;t[26]!==s||t[27]!==y?(j=(0,X.jsxs)(se,{onClick:y,children:[A,s]}),t[26]=s,t[27]=y,t[28]=j):j=t[28];let M;t[29]===Symbol.for(`react.memo_cache_sentinel`)?(M=(0,X.jsx)(ae,{}),t[29]=M):M=t[29];let N;t[30]===Symbol.for(`react.memo_cache_sentinel`)?(N=(0,X.jsx)(V,{name:`delete-bin`,className:`size-4`}),t[30]=N):N=t[30];let P;t[31]!==c||t[32]!==x?(P=(0,X.jsxs)(se,{onClick:x,className:`text-[var(--status-error)] focus:text-[var(--status-error)] data-[highlighted]:text-[var(--status-error)] [&_svg]:text-[var(--status-error)]`,children:[N,c]}),t[31]=c,t[32]=x,t[33]=P):P=t[33];let F;t[34]!==j||t[35]!==P?(F=(0,X.jsxs)(oe,{className:`min-w-[10rem]`,children:[j,M,P]}),t[34]=j,t[35]=P,t[36]=F):F=t[36];let I;return t[37]!==m||t[38]!==k||t[39]!==F?(I=(0,X.jsxs)(ce,{open:m,onOpenChange:h,children:[k,F]}),t[37]=m,t[38]=k,t[39]=F,t[40]=I):I=t[40],I},rt=e=>{let t=(0,J.c)(109),{activeOverride:a,onMobileBack:o}=e,{t:s}=p(),{isMobile:c}=U(),l=K(),u=Y.useSyncExternalStore(n,r,r),d=i(it),h=a??d,g=i(at),_=c||g,v=w(),y=T(),b=y.data,x;t[0]===u?x=t[1]:(x=e=>e.assistantByTransport[u]??null,t[0]=u,t[1]=x);let S=A(x),C=A(ot),E=A(st),D;t[2]!==S||t[3]!==b?.assistants?(D=b?.assistants.find(e=>e.id===S)??null,t[2]=S,t[3]=b?.assistants,t[4]=D):D=t[4];let O=D,k;t[5]!==C||t[6]!==S||t[7]!==b?(k=()=>{!S&&b?.assistants[0]&&C(b.assistants[0].id)},t[5]=C,t[6]=S,t[7]=b,t[8]=k):k=t[8];let j=b?.assistants,N;t[9]!==C||t[10]!==S||t[11]!==j?(N=[C,S,j],t[9]=C,t[10]=S,t[11]=j,t[12]=N):N=t[12],Y.useEffect(k,N);let P;t[13]!==O||t[14]!==C||t[15]!==S||t[16]!==b?.assistants||t[17]!==y.isSuccess?(P=()=>{y.isSuccess&&S&&!O&&C(b?.assistants[0]?.id??null)},t[13]=O,t[14]=C,t[15]=S,t[16]=b?.assistants,t[17]=y.isSuccess,t[18]=P):P=t[18];let F=b?.assistants,I;t[19]!==O||t[20]!==C||t[21]!==S||t[22]!==y.isSuccess||t[23]!==F?(I=[O,C,S,F,y.isSuccess],t[19]=O,t[20]=C,t[21]=S,t[22]=y.isSuccess,t[23]=F,t[24]=I):I=t[24],Y.useEffect(P,I);let L;t[25]!==l||t[26]!==E?(L=()=>{if(E(),l){l.openSettings();return}let e=i.getState();e.setSettingsPage(`assistants`),e.setSettingsDialogOpen(!0)},t[25]=l,t[26]=E,t[27]=L):L=t[27];let R=f(L),B;t[28]===l?B=t[29]:(B=e=>{M(e,l?{openMobileSettings:l.openSettings}:void 0)},t[28]=l,t[29]=B);let W=f(B),G;t[30]!==O||t[31]!==l?(G=()=>{O&&M(O.id,l?{openMobileSettings:l.openSettings}:void 0)},t[30]=O,t[31]=l,t[32]=G):G=t[32];let ee=f(G),[te,ne]=Y.useState(null),re;t[33]===Symbol.for(`react.memo_cache_sentinel`)?(re=e=>{ne(e)},t[33]=re):re=t[33];let ie=f(re),ae;t[34]===Symbol.for(`react.memo_cache_sentinel`)?(ae=e=>{e||ne(null)},t[34]=ae):ae=t[34];let oe=f(ae),se=f(ct),ce;t[35]!==o||t[36]!==se?(ce=()=>{if(o){o();return}se()},t[35]=o,t[36]=se,t[37]=ce):ce=t[37];let q=f(ce),ue=$e({capabilityPending:v.isPending,snapshotPending:y.isPending,capabilityError:v.isError,supported:v.data?.supported,capabilityEnabled:v.data?.enabled,snapshotEnabled:b?.enabled,snapshotSettled:y.isSuccess,assistantCount:b?.assistants.length??0,hasAssistant:!!O}),de;t[38]!==O||t[39]!==q||t[40]!==_?(de=(e,t,n,r)=>(0,X.jsxs)(`div`,{className:`relative flex h-full min-h-0 flex-col`,children:[_?(0,X.jsx)(tt,{assistant:O,onBack:q}):null,(0,X.jsxs)(`div`,{className:`flex min-h-0 flex-1 flex-col items-center justify-center px-6 pt-[calc(max(0.25rem,var(--oc-safe-area-top,0px))+var(--oc-mobile-detail-navigation-height,3.5rem))] text-center`,children:[(0,X.jsx)(V,{name:e,className:`size-6 text-muted-foreground`}),(0,X.jsx)(`h1`,{className:`mt-4 typography-ui-header font-semibold`,children:t}),n?(0,X.jsx)(`p`,{className:`mt-2 max-w-md typography-ui text-muted-foreground`,children:n}):null,r?(0,X.jsx)(`div`,{className:`mt-5`,children:r}):null]})]}),t[38]=O,t[39]=q,t[40]=_,t[41]=de):de=t[41];let Z=de;if(ue===`loading`){let e;t[42]!==O||t[43]!==q||t[44]!==_?(e=_?(0,X.jsx)(tt,{assistant:O,onBack:q}):null,t[42]=O,t[43]=q,t[44]=_,t[45]=e):e=t[45];let n;t[46]===s?n=t[47]:(n=s(`common.loading`),t[46]=s,t[47]=n);let r;t[48]===Symbol.for(`react.memo_cache_sentinel`)?(r=(0,X.jsx)(V,{name:`loader-4`,className:`size-6 animate-spin text-muted-foreground`}),t[48]=r):r=t[48];let i;t[49]===n?i=t[50]:(i=(0,X.jsx)(`div`,{className:`flex min-h-0 flex-1 flex-col items-center justify-center px-6 pt-[calc(max(0.25rem,var(--oc-safe-area-top,0px))+var(--oc-mobile-detail-navigation-height,3.5rem))] text-center`,"aria-busy":`true`,"aria-label":n,"data-assistant-workspace-loading":``,children:r}),t[49]=n,t[50]=i);let a;return t[51]!==e||t[52]!==i?(a=(0,X.jsxs)(`div`,{className:`relative flex h-full min-h-0 flex-col`,children:[e,i]}),t[51]=e,t[52]=i,t[53]=a):a=t[53],a}if(ue===`unavailable`){let e;return t[54]!==Z||t[55]!==s?(e=Z(`cloud-off`,s(`assistants.state.unavailable`)),t[54]=Z,t[55]=s,t[56]=e):e=t[56],e}if(ue===`onboarding`){let e;if(t[57]!==R||t[58]!==Z||t[59]!==s){let n=s(`assistants.onboarding.title`),r=s(`assistants.onboarding.description`),i;t[61]===s?i=t[62]:(i=s(`assistants.onboarding.action`),t[61]=s,t[62]=i);let a;t[63]!==R||t[64]!==i?(a=(0,X.jsx)(H,{onClick:R,children:i}),t[63]=R,t[64]=i,t[65]=a):a=t[65],e=Z(`ai-agent`,n,r,a),t[57]=R,t[58]=Z,t[59]=s,t[60]=e}else e=t[60];return e}if(!b||!O){let e;return t[66]!==Z||t[67]!==s?(e=Z(`cloud-off`,s(`assistants.state.unavailable`)),t[66]=Z,t[67]=s,t[68]=e):e=t[68],e}let fe;t[69]===O.name?fe=t[70]:(fe=m(O.name),t[69]=O.name,t[70]=fe);let pe=fe,me;t[71]!==O.enabled||t[72]!==y.isError||t[73]!==s?(me=O.enabled?y.isError?s(`assistants.state.staleSnapshot`):null:s(`assistants.state.assistantDisabled`),t[71]=O.enabled,t[72]=y.isError,t[73]=s,t[74]=me):me=t[74];let he=me,Q;t[75]!==_||t[76]!==W||t[77]!==ie||t[78]!==C||t[79]!==S||t[80]!==b||t[81]!==s?(Q=_?null:(0,X.jsxs)(`section`,{className:`flex h-full min-h-0 w-[clamp(16rem,22vw,20rem)] shrink-0 flex-col overflow-hidden`,children:[(0,X.jsx)(`header`,{className:`shrink-0 px-4 pb-3 pt-4 sm:px-5`,children:(0,X.jsx)(`h1`,{className:`truncate typography-ui-label font-semibold text-foreground`,children:s(`assistants.title`)})}),(0,X.jsx)(`div`,{className:`min-h-0 flex-1 overflow-y-auto px-3 pb-4 sm:px-4`,role:`listbox`,"aria-label":s(`assistants.listAria`),children:(0,X.jsx)(`div`,{className:`flex flex-col gap-1 border-t border-border/40 pt-3`,children:b.assistants.map(e=>{let t=e.id===S,n=m(e.name);return(0,X.jsx)(nt,{assistantID:e.id,displayName:n.displayName,avatarEmoji:n.avatarEmoji??void 0,selected:t,enabled:e.enabled,editLabel:s(`assistants.menu.edit`),deleteLabel:s(`assistants.settings.delete`),assignedSessionIDs:e.assignedSessionIDs,serverWorking:e.working,onSelect:()=>C(e.id),onEdit:()=>W(e.id),onDelete:()=>ie(e)},e.id)})})})]}),t[75]=_,t[76]=W,t[77]=ie,t[78]=C,t[79]=S,t[80]=b,t[81]=s,t[82]=Q):Q=t[82];let ge=te!==null,_e;t[83]!==te||t[84]!==oe||t[85]!==ge?(_e=(0,X.jsx)(Qe,{assistant:te,open:ge,onOpenChange:oe}),t[83]=te,t[84]=oe,t[85]=ge,t[86]=_e):_e=t[86];let ve=!_&&`border-l border-[var(--surface-subtle)]`,ye;t[87]===ve?ye=t[88]:(ye=z(`relative flex min-h-0 min-w-0 flex-1 flex-col overflow-hidden bg-background`,ve),t[87]=ve,t[88]=ye);let be;t[89]!==O||t[90]!==q||t[91]!==_||t[92]!==ee||t[93]!==pe||t[94]!==s?(be=_?(0,X.jsx)(tt,{assistant:O,onBack:q}):(0,X.jsxs)(`header`,{className:`flex h-16 shrink-0 items-center gap-3.5 border-b border-[var(--surface-subtle)]/70 px-5 sm:px-7`,children:[(0,X.jsx)(le,{name:O.id,emoji:pe.avatarEmoji,size:30,label:pe.displayName||O.name}),(0,X.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,X.jsx)(`div`,{className:`truncate typography-ui-label font-semibold tracking-[-0.01em] text-foreground`,children:pe.displayName}),(0,X.jsx)(`div`,{className:`mt-1 truncate typography-micro leading-none text-muted-foreground/55`,children:s(`assistants.conversation.contactHint`)})]}),(0,X.jsx)(H,{type:`button`,variant:`ghost`,size:`icon`,className:`size-8 shrink-0 rounded-full text-muted-foreground/65 transition-colors hover:text-foreground`,onClick:ee,"aria-label":s(`assistants.conversation.openSettings`),children:(0,X.jsx)(V,{name:`settings-3`,className:`size-4`})})]}),t[89]=O,t[90]=q,t[91]=_,t[92]=ee,t[93]=pe,t[94]=s,t[95]=be):be=t[95];let $;t[96]!==h||t[97]!==O||t[98]!==_||t[99]!==he?($=(0,X.jsx)(Xe,{assistant:O,warning:he,active:h,overlayHeader:_}),t[96]=h,t[97]=O,t[98]=_,t[99]=he,t[100]=$):$=t[100];let xe;t[101]!==ye||t[102]!==be||t[103]!==$?(xe=(0,X.jsxs)(`div`,{className:ye,children:[be,$]}),t[101]=ye,t[102]=be,t[103]=$,t[104]=xe):xe=t[104];let Se;return t[105]!==Q||t[106]!==_e||t[107]!==xe?(Se=(0,X.jsxs)(`div`,{className:`relative flex h-full min-h-0 overflow-hidden bg-background`,"data-presentation":`workspace`,children:[Q,_e,xe]}),t[105]=Q,t[106]=_e,t[107]=xe,t[108]=Se):Se=t[108],Se};function it(e){return e.activeMainTab===`assistant`}function at(e){return e.isMobile}function ot(e){return e.selectAssistant}function st(e){return e.requestCreate}function ct(){i.getState().setActiveMainTab(`chat`)}export{le as a,Z as i,et as n,Qe as r,rt as t};
@@ -1 +0,0 @@
1
- import{o as e}from"./rolldown-runtime-C0FnF6B9.js";import{nt as t,rt as n}from"./vendor-base-ui-CnHfUmDN.js";import{n as r}from"./vendor-react-DLPElpoQ.js";import{t as i}from"./utils-BiK3tBGM.js";var a=500,o=12,s=(e={})=>{let t=e.delayMs??a,n=(e.moveThresholdPx??o)**2,r=e.schedule??((e,t)=>setTimeout(e,t)),i=e.clear??(e=>clearTimeout(e)),s=null,c=null,l=(t=!1)=>{s&&(i(s.timer),s=null,t||e.onPressedKeyChange?.(null))};return{start:({pointerId:n,key:i,clientX:a,clientY:o,onTrigger:u})=>{l(),e.onPressedKeyChange?.(i),s={pointerId:n,key:i,startX:a,startY:o,timer:r(()=>{!s||s.pointerId!==n||s.key!==i||(s.triggered=!0,c=i,u())},t),triggered:!1}},move:(e,t,r)=>{if(s?.pointerId!==e||s.triggered)return;let i=t-s.startX,a=r-s.startY;i*i+a*a>n&&l()},end:e=>{s?.pointerId===e&&l(s.triggered)},cancel:e=>{s?.pointerId===e&&l()},openFromContextMenu:(t,n)=>{l(),c=t,e.onPressedKeyChange?.(t),n()},consumeClick:e=>c===e&&(c=null,!0),reset:()=>{l(),c=null,e.onPressedKeyChange?.(null)}}},c=`#openchamber-skill:`,l=`#openchamber-agent:`,u=e=>`https://opencode.ai/docs/agents/#${encodeURIComponent(e)}`,d=e=>`${c}${encodeURIComponent(e)}`,f=e=>`${l}${encodeURIComponent(e)}`,p=e=>{if(!e?.startsWith(c))return null;try{return decodeURIComponent(e.slice(19))}catch{return null}},m=e=>{if(!e?.startsWith(l))return null;try{return decodeURIComponent(e.slice(19))}catch{return null}},h=[`user-blocking`,`visible`,`background`],g=e=>{let t={"user-blocking":{head:null,tail:null},visible:{head:null,tail:null},background:{head:null,tail:null}},n=Math.max(1,Math.floor(e.maxTasksPerFrame)),r=Math.max(1,e.frameBudgetMs),i=null,a=!1,o=0,s=e=>{let n=t[e.priority];e.previous=n.tail,n.tail?n.tail.next=e:n.head=e,n.tail=e},c=e=>{let n=t[e.priority];e.previous?e.previous.next=e.next:n.head=e.next,e.next?e.next.previous=e.previous:n.tail=e.previous,e.next=null,e.previous=null},l=()=>{for(let e of h){let n=t[e].head;if(n)return c(n),n.consumed=!0,--o,n}return null},u=()=>{i===null&&o!==0&&(i=e.requestFrame(d))},d=()=>{i=null;let t=e.now(),a=0;for(;o>0&&a<n;){let n=l();if(!n||(n.run(),a+=1,e.now()-t>=r))break}u()},f=()=>{i!==null||a||o===0||(a=!0,i=e.requestFrame(()=>{i=null,a=!1,u()}))};return{enqueue(t,n){let r={cancelled:!1,consumed:!1,next:null,previous:null,priority:n?.priority??`background`,run:t};return s(r),o+=1,!a&&i===null&&f(),()=>{r.cancelled||r.consumed||(r.cancelled=!0,c(r),--o,o===0&&(i!==null&&(e.cancelFrame(i),i=null),a=!1))}},clear(){for(let e of h){let n=t[e],r=n.head;for(;r;){let e=r.next;r.cancelled=!0,r.next=null,r.previous=null,r=e}n.head=null,n.tail=null}o=0,i!==null&&(e.cancelFrame(i),i=null),a=!1}}},_=null,v=()=>typeof window>`u`?null:_||(_=g({requestFrame:e=>window.requestAnimationFrame(e),cancelFrame:e=>window.cancelAnimationFrame(e),now:()=>performance.now(),maxTasksPerFrame:2,frameBudgetMs:6}),_),y=(e,t)=>{let n=v();return n?n.enqueue(e,t):(e(),()=>{})},b={textThrottleMs:20,markdownPaceMs:64},x={textThrottleMs:100,markdownPaceMs:128},S=e=>e===`android`?x:b,C=r(),w=e(n(),1),T=t(),E=w.createContext(!1),D=e=>{let t=(0,C.c)(3),{disabled:n,children:r}=e,i;return t[0]!==r||t[1]!==n?(i=(0,T.jsx)(E.Provider,{value:n,children:r}),t[0]=r,t[1]=n,t[2]=i):i=t[2],i},O=e=>{let t=(0,C.c)(8),{children:n,className:r}=e,[a,o]=w.useState(!1),s,c;t[0]===Symbol.for(`react.memo_cache_sentinel`)?(s=()=>{let e=null,t=()=>o(!0);return typeof window<`u`&&typeof window.requestAnimationFrame==`function`?e=window.requestAnimationFrame(t):t(),()=>{e!==null&&typeof window<`u`&&typeof window.cancelAnimationFrame==`function`&&window.cancelAnimationFrame(e)}},c=[],t[0]=s,t[1]=c):(s=t[0],c=t[1]),w.useEffect(s,c);let l=a?`opacity-100 translate-y-0`:`opacity-0 translate-y-2`,u;t[2]!==r||t[3]!==l?(u=i(`w-full transition-all duration-300 ease-out`,l,r),t[2]=r,t[3]=l,t[4]=u):u=t[4];let d;return t[5]!==n||t[6]!==u?(d=(0,T.jsx)(`div`,{className:u,children:n}),t[5]=n,t[6]=u,t[7]=d):d=t[7],d},k=e=>{let t=(0,C.c)(5),{children:n,className:r,skipAnimation:i,forceAnimation:a,ignoreContextDisabled:o,respectReducedMotion:s}=e,c=a!==void 0&&a,l=o!==void 0&&o,u=s!==void 0&&s,d=w.useContext(E),f=u&&typeof window<`u`&&typeof window.matchMedia==`function`&&window.matchMedia(`(prefers-reduced-motion: reduce)`).matches;if(!c||i||!l&&d||f){let e;return t[0]===n?e=t[1]:(e=(0,T.jsx)(T.Fragment,{children:n}),t[0]=n,t[1]=e),e}let p;return t[2]!==n||t[3]!==r?(p=(0,T.jsx)(O,{className:r,children:n}),t[2]=n,t[3]=r,t[4]=p):p=t[4],p};export{f as a,m as c,y as i,p as l,k as n,u as o,S as r,d as s,D as t,s as u};
@@ -1,2 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/MarkstreamRendererImpl-CdYqdejg.js","assets/rolldown-runtime-C0FnF6B9.js","assets/vendor-base-ui-CnHfUmDN.js","assets/vendor-react-DLPElpoQ.js","assets/vendor-markstream-react-C3K8YH0d.js","assets/vendor-aparajita-capacitor-secure-storage-CjQdwfjS.js","assets/vendor-markstream-core-Cm34iPLL.js","assets/vendor-floating-ui-dom-BHhLtF5l.js","assets/vendor-floating-ui-core-Co1I1lFV.js","assets/vendor-markstream-react-CGQrpq8a.css","assets/vendor-reactuses-core-DDoDDyM9.js","assets/vendor-lodash-es-DfLbG5Af.js","assets/vendor-js-cookie-hSOiFTtX.js","assets/useMobileNavigationStore-Di9IWKfu.js","assets/useUIStore-CuaA8-Hp.js","assets/vendor-zustand-B4dlGEM2.js","assets/persistence-DdUac14I.js","assets/vendor-pathe-vBmvQE8f.js","assets/vendor-tanstack-query-core-BWz0ose6.js","assets/platform-B4KKLnZ5.js","assets/vendor-opencode-sdk-C07HQypa.js","assets/vendor-tanstack-react-query-D7pys_c9.js","assets/vendor-sonner-DVzioF3d.js","assets/clipboard-DJ4nQEuY.js","assets/store-BDFdnk6l.js","assets/useAssistantUIStore-me6s63b2.js","assets/vendor-fuse.js-DB5wDJbI.js","assets/utils-BiK3tBGM.js","assets/vendor-class-variance-authority-BLUaYARZ.js","assets/vendor-tailwind-merge-BicNWLTg.js","assets/useThemeSystem-DMzWVJaW.js","assets/useRuntimeAPIs-DSLXJybW.js","assets/url-Pk6tQ1EZ.js","assets/useEffectiveDirectory-CMvw1bLA.js","assets/markdownHeightCache-CvUyZT4q.js","assets/fileReferenceActions-BJJtX_S5.js","assets/toolHelpers-DEvVP9U0.js","assets/path-utils-jGozTg9d.js","assets/outsideFileGrants-DnplRxr-.js","assets/MarkstreamRendererImpl-CsNwy1T5.css","assets/MarkdownRendererImpl-B39nwiZX.js","assets/vendor-katex--B5dHUyk.js","assets/markdownTheme-CzZm3riB.js","assets/vendor-pierre-diffs-DX7XTPG3.js","assets/vendor-hast-util-to-html-B0p1k5Xa.js","assets/vendor-character-entities-legacy-Wut6vMuj.js","assets/vendor-character-entities-html4-DlN_yAFd.js","assets/vendor-ccount-CyGsA0u7.js","assets/vendor-comma-separated-tokens-B9ouxNNS.js","assets/vendor-oniguruma-to-es-CrHzjjSU.js","assets/vendor-oniguruma-parser-D2DIvhSP.js","assets/vendor-diff-Dq7CZNim.js","assets/vendor-lru_map-DpDied8H.js","assets/FadeInOnReveal-CK4asqVR.js","assets/MarkdownLoadingSkeleton-DWs4Jg7b.js","assets/markdown-worker-BuveaH3O.js","assets/vendor-morphdom-BbKiNDAu.js","assets/vendor-beautiful-mermaid-DykqIK5D.js","assets/vendor-dompurify-CeJNOzik.js","assets/vendor-marked-WVekxjAN.js","assets/vendor-remend-C3cXc-tf.js"])))=>i.map(i=>d[i]);
2
- import{o as e}from"./rolldown-runtime-C0FnF6B9.js";import{a as t}from"./vendor-zustand-B4dlGEM2.js";import{nt as n,rt as r}from"./vendor-base-ui-CnHfUmDN.js";import{o as i}from"./vendor-aparajita-capacitor-secure-storage-CjQdwfjS.js";import{n as a}from"./vendor-react-DLPElpoQ.js";import{t as o}from"./utils-BiK3tBGM.js";import{t as s}from"./MarkdownLoadingSkeleton-DWs4Jg7b.js";import{n as c,t as l}from"./markdownHeightCache-CvUyZT4q.js";var u=a(),d=e(r(),1),f=`openchamber:chunk-import-reload`,p=250,m=3e4,h=[/Importing a module script failed/i,/Failed to fetch dynamically imported module/i,/error loading dynamically imported module/i,/Loading chunk \S+ failed/i,/ChunkLoadError/i];function g(e){if(e instanceof Error)return`${e.name}\n${e.message}\n${e.stack??``}`;if(typeof e==`string`)return e;try{return JSON.stringify(e)}catch{return String(e)}}function _(e){let t=g(e);return h.some(e=>e.test(t))}function v(e){return`1.19.8-beta.1:${g(e).slice(0,500)}`}function y(e){if(typeof window>`u`)return;let t=Date.now(),n=v(e),r=null;try{let e=window.sessionStorage.getItem(f);if(e)try{r=JSON.parse(e)}catch{r=null}}catch{return}let i=typeof r?.timestamp==`number`?r.timestamp:0;if(!(r?.signature===n&&t-i<m)){try{window.sessionStorage.setItem(f,JSON.stringify({signature:n,timestamp:t}))}catch{return}console.error(`[refresh-debug] chunk-import-reload`,{error:g(e).slice(0,1e3)}),window.setTimeout(()=>{window.location.reload()},0)}}async function b(e,t={}){let n=t.retries??1,r;for(let t=0;t<=n;t+=1)try{return await e()}catch(e){if(r=e,!_(e)||t>=n)break;await new Promise(e=>setTimeout(e,p*(t+1)))}throw _(r)&&y(r),r}var x=e=>(0,d.lazy)(()=>b(e)),S=(e,t)=>{try{let n=t??(typeof localStorage>`u`?null:localStorage);return n?n.getItem(e)===`1`:!1}catch{return!1}},C=(e,t)=>{try{let n=t??(typeof localStorage>`u`?null:localStorage);return!n||n.getItem(e)!==`0`}catch{return!0}},w=(e,t)=>{try{typeof localStorage<`u`&&localStorage.setItem(e,t?`1`:`0`)}catch{}},T=`oc:legend-timeline`,E=e=>S(T,e),D=`oc:markstream-react`,O=e=>C(D,e),k=t(e=>({legendTimelineEnabled:E(),setLegendTimelineEnabled:t=>{w(T,t),e({legendTimelineEnabled:t})},markstreamReactEnabled:O(),setMarkstreamReactEnabled:t=>{w(D,t),e({markstreamReactEnabled:t})}})),A=null,j=()=>(A??=i(()=>import(`./MarkstreamRendererImpl-CdYqdejg.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39])).catch(e=>{throw A=null,e}),A),M=()=>{j().catch(()=>void 0)},N=null,P=()=>(N??=i(()=>import(`./MarkdownRendererImpl-B39nwiZX.js`),__vite__mapDeps([40,1,14,15,2,16,17,3,18,19,20,5,41,10,11,12,23,24,13,21,22,25,26,27,28,29,30,42,43,44,45,46,47,48,49,50,51,52,37,31,32,33,53,54,34,55,56,57,58,59,60,35,36,38])).catch(e=>{throw N=null,e}),N),F=()=>{P().catch(()=>void 0),O()&&M()},I=class extends d.Component{state={hasError:!1};static getDerivedStateFromError(){return{hasError:!0}}componentDidCatch(e){console.warn(`[markstream-react] falling back to the current Markdown renderer`,e)}render(){return this.state.hasError?this.props.fallback:this.props.children}},L=d.createContext(!0),R=()=>d.useContext(L),z=n(),B=x(()=>P().then(e=>({default:e.MarkdownRenderer}))),V=x(()=>j().then(e=>({default:e.MarkstreamRenderer}))),H=x(()=>P().then(e=>({default:e.SimpleMarkdownRenderer}))),U=e=>e===`tool`?`markdown-content markdown-tool`:e===`reasoning`?`markdown-content markdown-reasoning`:`markdown-content leading-relaxed`,W=e=>{let t=(0,u.c)(15),n=k(q),r=typeof e.content==`string`?e.content:``,i=typeof e.variant==`string`?e.variant:`assistant`,a;t[0]!==r||t[1]!==n||t[2]!==e.reserveMeasuredHeight||t[3]!==i?(a=e.reserveMeasuredHeight?c(l(r,n?`markstream:${i}`:i)):void 0,t[0]=r,t[1]=n,t[2]=e.reserveMeasuredHeight,t[3]=i,t[4]=a):a=t[4];let d=a,f;t[5]!==e.className||t[6]!==e.variant?(f=o(`relative break-words w-full min-w-0`,U(e.variant),typeof e.className==`string`?e.className:void 0),t[5]=e.className,t[6]=e.variant,t[7]=f):f=t[7];let p;t[8]!==r||t[9]!==e.animated||t[10]!==d?(p=(0,z.jsx)(s,{animated:e.animated,content:r,reservedHeight:d}),t[8]=r,t[9]=e.animated,t[10]=d,t[11]=p):p=t[11];let m;return t[12]!==f||t[13]!==p?(m=(0,z.jsx)(`div`,{className:f,"aria-busy":`true`,"data-markdown-hydration":`deferred`,"data-markdown-ready":`false`,children:p}),t[12]=f,t[13]=p,t[14]=m):m=t[14],m},G=e=>{let t=(0,u.c)(9),n=R(),r=k(J);if(!n&&e.isStreaming!==!0){let n;return t[0]===e?n=t[1]:(n=(0,z.jsx)(W,{...e,animated:!1,reserveMeasuredHeight:!0}),t[0]=e,t[1]=n),n}let i;t[2]===e?i=t[3]:(i=(0,z.jsx)(d.Suspense,{fallback:(0,z.jsx)(W,{...e,reserveMeasuredHeight:!0}),children:(0,z.jsx)(B,{...e})}),t[2]=e,t[3]=i);let a=i;if(!r)return a;let o;t[4]===e?o=t[5]:(o=(0,z.jsx)(d.Suspense,{fallback:(0,z.jsx)(W,{...e,reserveMeasuredHeight:!0}),children:(0,z.jsx)(V,{...e})}),t[4]=e,t[5]=o);let s;return t[6]!==a||t[7]!==o?(s=(0,z.jsx)(I,{fallback:a,children:o}),t[6]=a,t[7]=o,t[8]=s):s=t[8],s},K=e=>{let t=(0,u.c)(4);if(!R()){let n;return t[0]===e?n=t[1]:(n=(0,z.jsx)(W,{...e,animated:!1}),t[0]=e,t[1]=n),n}let n;return t[2]===e?n=t[3]:(n=(0,z.jsx)(d.Suspense,{fallback:(0,z.jsx)(W,{...e}),children:(0,z.jsx)(H,{...e})}),t[2]=e,t[3]=n),n};function q(e){return e.markstreamReactEnabled}function J(e){return e.markstreamReactEnabled}export{k as a,F as i,K as n,x as o,L as r,G as t};