@openchambery/web 1.19.12 → 1.19.13-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/dist/assets/{AgentAvatar-CX0a1rKE.js → AgentAvatar-CiQIIM0d.js} +1 -1
  2. package/dist/assets/AssistantView-YmeyxehG.js +2 -0
  3. package/dist/assets/{DiagramView-BeUgp_Y0.js → DiagramView-BpZb-G9P.js} +1 -1
  4. package/dist/assets/{FadeInOnReveal-CTlNE4Hg.js → FadeInOnReveal-nf6-ZCrs.js} +1 -1
  5. package/dist/assets/{Icon-BYM02QyU.js → Icon-CeKHYyKZ.js} +1 -1
  6. package/dist/assets/MarkdownRenderer-wpeGdciL.js +2 -0
  7. package/dist/assets/{MarkdownRendererImpl-DB4Q3kGa.js → MarkdownRendererImpl-Peu0GVSQ.js} +1 -1
  8. package/dist/assets/{MarkstreamRendererImpl-BFdJzxia.js → MarkstreamRendererImpl-B-odd2Gz.js} +1 -1
  9. package/dist/assets/MobileDetailNavigation-CtYke_1C.js +1 -0
  10. package/dist/assets/{MobileShareBridge-UiOLx0-2.js → MobileShareBridge-DIfOl8EZ.js} +3 -3
  11. package/dist/assets/MobileSurface-_KoX75Ff.js +2 -0
  12. package/dist/assets/{MultiRunWindow-C3p3lj3U.js → MultiRunWindow-BT5Dwgzu.js} +1 -1
  13. package/dist/assets/{OnboardingScreen-DS2nugLX.js → OnboardingScreen-BPusUgFG.js} +1 -1
  14. package/dist/assets/{OverlayScrollbar-KUpvYHdv.js → OverlayScrollbar-DUghqFGg.js} +1 -1
  15. package/dist/assets/{SettingsView-BXfKsz0J.js → SettingsView-BwQpbIZl.js} +11 -11
  16. package/dist/assets/{SettingsWindow-8IDuPZA5.js → SettingsWindow-DfEGfyr8.js} +1 -1
  17. package/dist/assets/{TerminalView-BiKCueth.js → TerminalView-8402vpcO.js} +1 -1
  18. package/dist/assets/{ToolOutputDialog-BC2F_Fdl.js → ToolOutputDialog-B5RdkhsG.js} +1 -1
  19. package/dist/assets/{appThemeRegistry-B87OLIgc.js → appThemeRegistry-CIZ-shMD.js} +1 -1
  20. package/dist/assets/{button-C0cth9tl.js → button-DFPOdZ0g.js} +1 -1
  21. package/dist/assets/{clipboard-DJ4nQEuY.js → clipboard-C05anBwU.js} +1 -1
  22. package/dist/assets/{collapsible-DFT9cE80.js → collapsible-oGbEvbe1.js} +1 -1
  23. package/dist/assets/{context-menu-CAp74NfV.js → context-menu-DGz4_2hs.js} +1 -1
  24. package/dist/assets/{desktopHosts-Dc2PS66M.js → desktopHosts-BVJXQq1S.js} +1 -1
  25. package/dist/assets/{desktopRelayRestore-T9y0orqa.js → desktopRelayRestore-RDfuj1M7.js} +1 -1
  26. package/dist/assets/{diagram-BryzMuta.js → diagram-Csk5GpDC.js} +1 -1
  27. package/dist/assets/{dialog-CgbV5ljg.js → dialog-rrqB-H6q.js} +1 -1
  28. package/dist/assets/{es-BHqnSjoZ.js → es-FE0sJ9EC.js} +1 -1
  29. package/dist/assets/{fileQueries-BY-9OWzp.js → fileQueries-BcdWOPlD.js} +1 -1
  30. package/dist/assets/{fr-BfrlJY9i.js → fr-DNDCSfGt.js} +1 -1
  31. package/dist/assets/{gitApi-tTtHQVA3.js → gitApi-_P0FsoXe.js} +1 -1
  32. package/dist/assets/{input-DFLpqjGR.js → input-BO3r20op.js} +1 -1
  33. package/dist/assets/{insertionBoundaries-CCQpZ5zn.js → insertionBoundaries-CWoioTdE.js} +1 -1
  34. package/dist/assets/{ja-DP-7qt-x.js → ja-BDwrk0cM.js} +1 -1
  35. package/dist/assets/{ko-E2B5vGQP.js → ko-BeeU2o4I.js} +1 -1
  36. package/dist/assets/{main-Dkg31fRY.js → main-CLj_WS1o.js} +2 -2
  37. package/dist/assets/{main-C_PUoT3E.js → main-CnSZ89pD.js} +4 -4
  38. package/dist/assets/{markdown-worker-CTsrtpPh.js → markdown-worker-CZWE1F1M.js} +1 -1
  39. package/dist/assets/{markdownHeightCache-CYDlisxr.js → markdownHeightCache-Cdd3hkMl.js} +1 -1
  40. package/dist/assets/{markdownTheme-DyJ4Gfcj.js → markdownTheme-DIB8WVmz.js} +1 -1
  41. package/dist/assets/miniChat-B9c3y2pD.js +2 -0
  42. package/dist/assets/{mobile-Z_X7CbzB.js → mobile-DvbXUfNS.js} +2 -2
  43. package/dist/assets/{multirun-B0V3hdnD.js → multirun-CxhTsmRq.js} +1 -1
  44. package/dist/assets/{persistence-DdUac14I.js → persistence-CVTWFaqe.js} +2 -2
  45. package/dist/assets/{pl-r8X5gRM5.js → pl-BYuzpcI5.js} +1 -1
  46. package/dist/assets/{platform-B4KKLnZ5.js → platform-BY_Gtsqr.js} +1 -1
  47. package/dist/assets/{projectMeta-DRW9MQ4z.js → projectMeta-Dl5iPCB6.js} +1 -1
  48. package/dist/assets/{pt-BR-DcpdXCf5.js → pt-BR-Bn7cwEzv.js} +1 -1
  49. package/dist/assets/{renderElectronMiniChatApp-Dn1Su1dd.js → renderElectronMiniChatApp-CkJ51qCh.js} +2 -2
  50. package/dist/assets/renderMobileApp-DcjQPhWw.js +28 -0
  51. package/dist/assets/{runtimeConfig-C6matIEB.js → runtimeConfig-Bsk2kWsW.js} +1 -1
  52. package/dist/assets/runtimeEndpointReset-BBLFgl85.js +147 -0
  53. package/dist/assets/{sessionChangeSummary-hVby3sJk.js → sessionChangeSummary-DDVT7O5J.js} +1 -1
  54. package/dist/assets/{sessionLookup-B6P_aCun.js → sessionLookup-C8VZn0gJ.js} +1 -1
  55. package/dist/assets/{sortable-tabs-strip-C8_9kHqu.js → sortable-tabs-strip-s7UUxsa6.js} +1 -1
  56. package/dist/assets/src-BpHDMgud.css +2 -0
  57. package/dist/assets/{store-BDFdnk6l.js → store-n94dSb3M.js} +2 -2
  58. package/dist/assets/{terminalApi-947l7Ra3.js → terminalApi-C54_rKEK.js} +1 -1
  59. package/dist/assets/{textarea-Cgo_nWUU.js → textarea-BjX-KhMN.js} +1 -1
  60. package/dist/assets/{tooltip-BifLJ8o0.js → tooltip-CQGqGAG_.js} +1 -1
  61. package/dist/assets/{uk-Di0vl9V-.js → uk-CwpbHEa3.js} +1 -1
  62. package/dist/assets/{url-Pk6tQ1EZ.js → url-BMjqccCo.js} +1 -1
  63. package/dist/assets/{useAppFontEffects-Dmes1chr.js → useAppFontEffects-BIFw36SA.js} +5 -5
  64. package/dist/assets/{useAssistantUIStore-me6s63b2.js → useAssistantUIStore-Cg9bsT4b.js} +1 -1
  65. package/dist/assets/{useDesktopWindowControlsLayout-DuZ6URPR.js → useDesktopWindowControlsLayout-DoygEcN4.js} +1 -1
  66. package/dist/assets/{useEffectiveDirectory-CU2ChP0J.js → useEffectiveDirectory-DJSYYkVp.js} +1 -1
  67. package/dist/assets/{useFontPreferences-BCOBlaAd.js → useFontPreferences-B5_apbBC.js} +1 -1
  68. package/dist/assets/{useMobileNavigationStore-C8_J-qTp.js → useMobileNavigationStore-DuTu0Mzh.js} +5 -5
  69. package/dist/assets/{useSessionAutoCleanup-FOQeu1_T.js → useSessionAutoCleanup-C-L9teva.js} +1 -1
  70. package/dist/assets/{useUIStore-CuaA8-Hp.js → useUIStore-DwpQTjLO.js} +1 -1
  71. package/dist/assets/{useWorkerHighlightedLines-GBqKnki1.js → useWorkerHighlightedLines-DxTfgdEi.js} +1 -1
  72. package/dist/assets/{utils-BiK3tBGM.js → utils-81nUI_xp.js} +1 -1
  73. package/dist/assets/{zh-CN-coFCfeQE.js → zh-CN-BpzFZ-LU.js} +1 -1
  74. package/dist/assets/{zh-TW-oDRZ1-yb.js → zh-TW-Bopgc5Eo.js} +1 -1
  75. package/dist/index.html +9 -9
  76. package/dist/mini-chat.html +9 -9
  77. package/dist/mobile.html +9 -9
  78. package/package.json +1 -1
  79. package/server/index.js +19 -0
  80. package/server/lib/assistants/DOCUMENTATION.md +17 -4
  81. package/server/lib/assistants/assign.js +455 -30
  82. package/server/lib/assistants/assign.test.js +351 -0
  83. package/server/lib/assistants/contact-active-turn.http.test.js +134 -0
  84. package/server/lib/assistants/contact-store.js +64 -0
  85. package/server/lib/assistants/contact-store.test.js +12 -0
  86. package/server/lib/assistants/contact-tools.js +108 -9
  87. package/server/lib/assistants/contact-tools.test.js +111 -0
  88. package/server/lib/assistants/contracts.js +2 -2
  89. package/server/lib/assistants/harness.js +4 -1
  90. package/server/lib/assistants/service.js +320 -27
  91. package/server/lib/assistants/service.test.js +538 -9
  92. package/server/lib/llm/catalog.js +91 -16
  93. package/server/lib/llm/catalog.test.js +152 -11
  94. package/server/lib/notifications/APNS.md +20 -4
  95. package/server/lib/notifications/DOCUMENTATION.md +5 -0
  96. package/server/lib/notifications/apns-runtime.js +136 -18
  97. package/server/lib/notifications/apns-runtime.test.js +128 -0
  98. package/server/lib/notifications/apns-titles.js +21 -1
  99. package/server/lib/notifications/live-activity-refresh-runtime.js +185 -0
  100. package/server/lib/notifications/live-activity-refresh-runtime.test.js +242 -0
  101. package/server/lib/notifications/runtime.js +93 -2
  102. package/server/lib/notifications/runtime.test.js +167 -4
  103. package/server/lib/opencode/settings-helpers.js +12 -0
  104. package/server/lib/opencode/settings-runtime.js +16 -0
  105. package/server/lib/opencode/settings-runtime.test.js +21 -0
  106. package/server/lib/scheduled-tasks/runtime.js +21 -0
  107. package/server/lib/scheduled-tasks/runtime.test.js +24 -0
  108. package/dist/assets/AssistantView-DxIghtun.js +0 -2
  109. package/dist/assets/MarkdownRenderer-C4MGa_kQ.js +0 -2
  110. package/dist/assets/MobileDetailNavigation-B_RwWOwv.js +0 -1
  111. package/dist/assets/MobileSurface-CNChj_dX.js +0 -2
  112. package/dist/assets/miniChat-C9QMj8T8.js +0 -2
  113. package/dist/assets/renderMobileApp-BG1JJt1Q.js +0 -28
  114. package/dist/assets/runtimeEndpointReset-kgwmUJDb.js +0 -147
  115. package/dist/assets/src-B-P5qIBc.css +0 -2
@@ -316,6 +316,34 @@ export const createNotificationTriggerRuntime = (deps) => {
316
316
  return isHiddenFromNavSession(meta);
317
317
  };
318
318
 
319
+ // Live Activity refresh ticks carry no directory, so the cache lookup must
320
+ // match the session under ANY cached directory key before falling back to the
321
+ // directory-less OpenCode session endpoint.
322
+ const lookupSessionMetaAnyDirectory = (sessionId) => {
323
+ const direct = getCachedSessionMeta(sessionId, undefined);
324
+ if (direct) return direct;
325
+ const suffix = `\0${sessionId}`;
326
+ const now = Date.now();
327
+ for (const [key, entry] of sessionMetaCache) {
328
+ if (!key.endsWith(suffix)) continue;
329
+ if (now - entry.at <= SESSION_META_CACHE_TTL_MS) return entry;
330
+ }
331
+ return undefined;
332
+ };
333
+
334
+ // Sidebar candidate for a new Live Activity snapshot row: title + visibility
335
+ // under the same suppression rules as ordinary push. Cache-first; a missing
336
+ // meta resolves as not-visible (hidden sessions must never leak into a push).
337
+ const resolveLiveActivitySessionCandidate = async (sessionId) => {
338
+ const cached = lookupSessionMetaAnyDirectory(sessionId);
339
+ if (cached?.complete) {
340
+ return { title: cached.title ?? '', visible: !isHiddenFromNavSession(cached) };
341
+ }
342
+ const meta = await fetchSessionMeta(sessionId, undefined);
343
+ if (!meta) return null;
344
+ return { title: meta.title ?? '', visible: !isHiddenFromNavSession(meta) };
345
+ };
346
+
319
347
  const extractSessionIdFromPayload = (payload) => {
320
348
  if (!payload || typeof payload !== 'object') return null;
321
349
  const props = payload.properties;
@@ -650,7 +678,7 @@ export const createNotificationTriggerRuntime = (deps) => {
650
678
 
651
679
  const settings = await readSettingsFromDisk();
652
680
 
653
- if (settings.notifyOnQuestion === false) {
681
+ if (settings.notifyOnPermission === false) {
654
682
  return;
655
683
  }
656
684
 
@@ -726,6 +754,8 @@ export const createNotificationTriggerRuntime = (deps) => {
726
754
  // full text; APNs with the generic per-type title and the session name as
727
755
  // body, so the relay never sees content).
728
756
  const sendGoalSettlePush = async ({ sessionId, directory, status, title, body }) => {
757
+ const settings = await readSettingsFromDisk();
758
+ if (settings.notifyOnGoals === false) return;
729
759
  let sessionName = '';
730
760
  try {
731
761
  const base = buildOpenCodeUrl(`/session/${encodeURIComponent(sessionId)}`, '');
@@ -759,6 +789,65 @@ export const createNotificationTriggerRuntime = (deps) => {
759
789
  );
760
790
  };
761
791
 
792
+ // Scheduled task run notification: fired by the scheduled-tasks runtime when
793
+ // a scheduled (non-manual) run settles. Desktop/UI SSE carry the task name
794
+ // and, on failure, the error text; push channels follow the same generic
795
+ // contract as other triggers (APNs title is the localized scenario, body is
796
+ // the task name). Manual runs skip — the user just clicked "run now".
797
+ const sendScheduledTaskRunNotification = async ({
798
+ projectID,
799
+ taskID,
800
+ taskName,
801
+ status,
802
+ sessionId,
803
+ reason,
804
+ errorMessage,
805
+ } = {}) => {
806
+ if (typeof projectID !== 'string' || !projectID) return;
807
+ if (typeof taskID !== 'string' || !taskID) return;
808
+ if (reason === 'manual') return;
809
+ if (status !== 'success' && status !== 'error') return;
810
+ const settings = await readSettingsFromDisk();
811
+ if (settings.notifyOnScheduledTasks === false) return;
812
+
813
+ const name = typeof taskName === 'string' && taskName.trim() ? taskName.trim() : 'Schedule';
814
+ const isError = status === 'error';
815
+ const title = isError ? 'Scheduled task failed' : 'Scheduled task completed';
816
+ const trimmedError = typeof errorMessage === 'string' && errorMessage.trim() ? errorMessage.trim() : '';
817
+ const body = isError && trimmedError ? `${name}: ${trimmedError}` : name;
818
+ const tag = `scheduled-${projectID}-${taskID}`;
819
+
820
+ if (settings.nativeNotificationsEnabled) {
821
+ const notificationPayload = {
822
+ kind: isError ? 'task-error' : 'task-complete',
823
+ title,
824
+ body,
825
+ tag,
826
+ ...(sessionId ? { sessionId } : {}),
827
+ requireHidden: false,
828
+ };
829
+ const desktopNotificationDelivered = emitDesktopNotification(notificationPayload);
830
+ broadcastUiNotification(notificationPayload, { desktopNotificationDelivered });
831
+ }
832
+
833
+ await fanoutPush(
834
+ {
835
+ title,
836
+ body,
837
+ tag,
838
+ data: {
839
+ url: typeof sessionId === 'string' && sessionId
840
+ ? buildSessionDeepLinkUrl(sessionId)
841
+ : '/',
842
+ ...(typeof sessionId === 'string' && sessionId ? { sessionId } : {}),
843
+ sessionName: name,
844
+ type: isError ? 'task_error' : 'task_complete',
845
+ },
846
+ },
847
+ { requireNoSse: true },
848
+ );
849
+ };
850
+
762
851
  const contactNotificationTitle = (name) => {
763
852
  if (typeof name !== 'string' || !name.trim()) return 'Assistant';
764
853
  const stripped = name.replace(/^(?:\p{Extended_Pictographic}|\p{Regional_Indicator}|[\uFE0F\u200D])+\s*/u, '').trim();
@@ -768,7 +857,7 @@ export const createNotificationTriggerRuntime = (deps) => {
768
857
  const sendContactTurnNotification = async ({ assistantID, name, body, status } = {}) => {
769
858
  if (typeof assistantID !== 'string' || !assistantID.trim()) return;
770
859
  const settings = await readSettingsFromDisk();
771
- if (settings.notifyOnCompletion === false) return;
860
+ if (settings.notifyOnAssistants === false) return;
772
861
 
773
862
  const title = contactNotificationTitle(name);
774
863
  const rawBody = typeof body === 'string' ? body : '';
@@ -818,5 +907,7 @@ export const createNotificationTriggerRuntime = (deps) => {
818
907
  clearPendingPushBadge,
819
908
  sendGoalSettlePush,
820
909
  sendContactTurnNotification,
910
+ sendScheduledTaskRunNotification,
911
+ resolveLiveActivitySessionCandidate,
821
912
  };
822
913
  };
@@ -373,8 +373,8 @@ describe('notification trigger runtime llm system-session suppression', () => {
373
373
  });
374
374
  });
375
375
 
376
- const rootSessionResponse = () => jsonResponse({
377
- id: 'ses_root',
376
+ const rootSessionResponse = (sessionId = 'ses_root') => jsonResponse({
377
+ id: sessionId,
378
378
  parentID: null,
379
379
  title: 'Ordinary',
380
380
  metadata: {},
@@ -428,9 +428,9 @@ describe('contact turn notifications', () => {
428
428
  expect(sendApnsToAllUiSessions.mock.calls[0][0].type).toBeUndefined();
429
429
  });
430
430
 
431
- it('skips contact notifications when completion notices are disabled', async () => {
431
+ it('skips contact notifications when assistant notices are disabled', async () => {
432
432
  const { runtime, emitDesktopNotification, sendPushToAllUiSessions } = createRuntime({
433
- readSettingsFromDisk: vi.fn(async () => ({ ...defaultSettings, notifyOnCompletion: false })),
433
+ readSettingsFromDisk: vi.fn(async () => ({ ...defaultSettings, notifyOnAssistants: false })),
434
434
  });
435
435
  await runtime.sendContactTurnNotification({
436
436
  assistantID: 'asst_1',
@@ -441,6 +441,19 @@ describe('contact turn notifications', () => {
441
441
  expect(emitDesktopNotification).not.toHaveBeenCalled();
442
442
  expect(sendPushToAllUiSessions).not.toHaveBeenCalled();
443
443
  });
444
+
445
+ it('keeps contact notifications on when only completion notices are disabled', async () => {
446
+ const { runtime, emitDesktopNotification } = createRuntime({
447
+ readSettingsFromDisk: vi.fn(async () => ({ ...defaultSettings, notifyOnCompletion: false })),
448
+ });
449
+ await runtime.sendContactTurnNotification({
450
+ assistantID: 'asst_1',
451
+ name: '大小白',
452
+ body: 'hi',
453
+ status: 'complete',
454
+ });
455
+ expect(emitDesktopNotification).toHaveBeenCalled();
456
+ });
444
457
  });
445
458
 
446
459
  describe('notification trigger live activity end', () => {
@@ -546,3 +559,153 @@ describe('notification trigger live activity end', () => {
546
559
  expect(sendLiveActivityEnd).toHaveBeenNthCalledWith(2, { sessionId: 'ses_root', status: 'complete' });
547
560
  });
548
561
  });
562
+
563
+ describe('notification event toggles', () => {
564
+ it('skips permission notifications when permission notices are disabled', async () => {
565
+ vi.useFakeTimers();
566
+ vi.stubGlobal('fetch', vi.fn(async () => rootSessionResponse('ses_perm_toggle')));
567
+ const { runtime, emitDesktopNotification, sendPushToAllUiSessions } = createRuntime({
568
+ readSettingsFromDisk: vi.fn(async () => ({ ...defaultSettings, notifyOnPermission: false })),
569
+ });
570
+ await runtime.maybeSendPushForTrigger({
571
+ type: 'permission.asked',
572
+ properties: {
573
+ directory: '/repo',
574
+ sessionID: 'ses_perm_toggle',
575
+ id: 'perm_1',
576
+ permission: 'edit',
577
+ },
578
+ });
579
+ await vi.runAllTimersAsync();
580
+ expect(emitDesktopNotification).not.toHaveBeenCalled();
581
+ expect(sendPushToAllUiSessions).not.toHaveBeenCalled();
582
+ });
583
+
584
+ it('keeps permission notifications independent of the question toggle', async () => {
585
+ vi.useFakeTimers();
586
+ vi.stubGlobal('fetch', vi.fn(async () => rootSessionResponse('ses_perm_indep')));
587
+ const { runtime, emitDesktopNotification } = createRuntime({
588
+ readSettingsFromDisk: vi.fn(async () => ({ ...defaultSettings, notifyOnQuestion: false })),
589
+ });
590
+ await runtime.maybeSendPushForTrigger({
591
+ type: 'permission.asked',
592
+ properties: {
593
+ directory: '/repo',
594
+ sessionID: 'ses_perm_indep',
595
+ id: 'perm_2',
596
+ permission: 'edit',
597
+ },
598
+ });
599
+ await vi.runAllTimersAsync();
600
+ expect(emitDesktopNotification).toHaveBeenCalledTimes(1);
601
+ expect(emitDesktopNotification.mock.calls[0][0]).toMatchObject({ kind: 'permission' });
602
+ });
603
+
604
+ it('skips goal settle push when goal notices are disabled', async () => {
605
+ vi.stubGlobal('fetch', vi.fn(async () => jsonResponse({ id: 'ses_goal', title: 'Goal run' })));
606
+ const { runtime, sendPushToAllUiSessions } = createRuntime({
607
+ readSettingsFromDisk: vi.fn(async () => ({ ...defaultSettings, notifyOnGoals: false })),
608
+ });
609
+ await runtime.sendGoalSettlePush({
610
+ sessionId: 'ses_goal',
611
+ status: 'complete',
612
+ title: 'Goal completed',
613
+ body: 'all done',
614
+ });
615
+ expect(sendPushToAllUiSessions).not.toHaveBeenCalled();
616
+ });
617
+
618
+ it('still sends goal settle push by default', async () => {
619
+ vi.stubGlobal('fetch', vi.fn(async () => jsonResponse({ id: 'ses_goal', title: 'Goal run' })));
620
+ const { runtime, sendPushToAllUiSessions } = createRuntime();
621
+ await runtime.sendGoalSettlePush({
622
+ sessionId: 'ses_goal',
623
+ status: 'complete',
624
+ title: 'Goal completed',
625
+ body: 'all done',
626
+ });
627
+ expect(sendPushToAllUiSessions).toHaveBeenCalledTimes(1);
628
+ expect(sendPushToAllUiSessions.mock.calls[0][0]).toMatchObject({ tag: 'goal-ses_goal' });
629
+ });
630
+ });
631
+
632
+ describe('scheduled task run notifications', () => {
633
+ it('notifies on a scheduled success run across desktop, UI, and push channels', async () => {
634
+ const { runtime, emitDesktopNotification, broadcastUiNotification, sendPushToAllUiSessions, sendApnsToAllUiSessions } = createRuntime();
635
+ await runtime.sendScheduledTaskRunNotification({
636
+ projectID: 'proj_1',
637
+ taskID: 'task_1',
638
+ taskName: 'Nightly digest',
639
+ status: 'success',
640
+ sessionId: 'ses_task',
641
+ reason: 'scheduled',
642
+ });
643
+ expect(emitDesktopNotification).toHaveBeenCalledWith(expect.objectContaining({
644
+ kind: 'task-complete',
645
+ title: 'Scheduled task completed',
646
+ body: 'Nightly digest',
647
+ tag: 'scheduled-proj_1-task_1',
648
+ }));
649
+ expect(broadcastUiNotification).toHaveBeenCalledTimes(1);
650
+ expect(sendPushToAllUiSessions).toHaveBeenCalledWith(expect.objectContaining({
651
+ title: 'Scheduled task completed',
652
+ data: expect.objectContaining({ type: 'task_complete', sessionName: 'Nightly digest', sessionId: 'ses_task' }),
653
+ }), expect.objectContaining({ requireNoSse: true }));
654
+ expect(sendApnsToAllUiSessions).toHaveBeenCalledWith(expect.objectContaining({
655
+ type: 'task_complete',
656
+ sessionName: 'Nightly digest',
657
+ }), expect.objectContaining({ requireNoSse: true }));
658
+ });
659
+
660
+ it('includes the error text on failure for desktop/web push only', async () => {
661
+ const { runtime, emitDesktopNotification, sendPushToAllUiSessions, sendApnsToAllUiSessions } = createRuntime();
662
+ await runtime.sendScheduledTaskRunNotification({
663
+ projectID: 'proj_1',
664
+ taskID: 'task_1',
665
+ taskName: 'Nightly digest',
666
+ status: 'error',
667
+ reason: 'scheduled',
668
+ errorMessage: 'agent aborted',
669
+ });
670
+ expect(emitDesktopNotification).toHaveBeenCalledWith(expect.objectContaining({
671
+ kind: 'task-error',
672
+ body: 'Nightly digest: agent aborted',
673
+ }));
674
+ expect(sendPushToAllUiSessions).toHaveBeenCalledWith(expect.objectContaining({
675
+ title: 'Scheduled task failed',
676
+ body: 'Nightly digest: agent aborted',
677
+ data: expect.objectContaining({ type: 'task_error' }),
678
+ }), expect.anything());
679
+ // APNs keeps the generic contract: scenario title + task name only, no error text.
680
+ expect(sendApnsToAllUiSessions).toHaveBeenCalledWith(expect.objectContaining({
681
+ type: 'task_error',
682
+ sessionName: 'Nightly digest',
683
+ }), expect.anything());
684
+ expect(JSON.stringify(sendApnsToAllUiSessions.mock.calls[0][0])).not.toContain('agent aborted');
685
+ });
686
+
687
+ it('skips manual runs and the disabled toggle', async () => {
688
+ const { runtime, emitDesktopNotification, sendPushToAllUiSessions } = createRuntime();
689
+ await runtime.sendScheduledTaskRunNotification({
690
+ projectID: 'proj_1',
691
+ taskID: 'task_1',
692
+ taskName: 'Nightly digest',
693
+ status: 'success',
694
+ reason: 'manual',
695
+ });
696
+ expect(emitDesktopNotification).not.toHaveBeenCalled();
697
+
698
+ const disabled = createRuntime({
699
+ readSettingsFromDisk: vi.fn(async () => ({ ...defaultSettings, notifyOnScheduledTasks: false })),
700
+ });
701
+ await disabled.runtime.sendScheduledTaskRunNotification({
702
+ projectID: 'proj_1',
703
+ taskID: 'task_1',
704
+ taskName: 'Nightly digest',
705
+ status: 'success',
706
+ reason: 'scheduled',
707
+ });
708
+ expect(disabled.emitDesktopNotification).not.toHaveBeenCalled();
709
+ expect(disabled.sendPushToAllUiSessions).not.toHaveBeenCalled();
710
+ });
711
+ });
@@ -360,6 +360,18 @@ export const createSettingsHelpers = (dependencies) => {
360
360
  if (typeof candidate.notifyOnQuestion === 'boolean') {
361
361
  result.notifyOnQuestion = candidate.notifyOnQuestion;
362
362
  }
363
+ if (typeof candidate.notifyOnPermission === 'boolean') {
364
+ result.notifyOnPermission = candidate.notifyOnPermission;
365
+ }
366
+ if (typeof candidate.notifyOnScheduledTasks === 'boolean') {
367
+ result.notifyOnScheduledTasks = candidate.notifyOnScheduledTasks;
368
+ }
369
+ if (typeof candidate.notifyOnAssistants === 'boolean') {
370
+ result.notifyOnAssistants = candidate.notifyOnAssistants;
371
+ }
372
+ if (typeof candidate.notifyOnGoals === 'boolean') {
373
+ result.notifyOnGoals = candidate.notifyOnGoals;
374
+ }
363
375
  if (candidate.notificationTemplates && typeof candidate.notificationTemplates === 'object') {
364
376
  result.notificationTemplates = candidate.notificationTemplates;
365
377
  }
@@ -760,6 +760,22 @@ export const createSettingsRuntime = (deps) => {
760
760
  next.notifyOnQuestion = true;
761
761
  changed = true;
762
762
  }
763
+ if (typeof settings.notifyOnPermission !== 'boolean') {
764
+ next.notifyOnPermission = true;
765
+ changed = true;
766
+ }
767
+ if (typeof settings.notifyOnScheduledTasks !== 'boolean') {
768
+ next.notifyOnScheduledTasks = true;
769
+ changed = true;
770
+ }
771
+ if (typeof settings.notifyOnAssistants !== 'boolean') {
772
+ next.notifyOnAssistants = true;
773
+ changed = true;
774
+ }
775
+ if (typeof settings.notifyOnGoals !== 'boolean') {
776
+ next.notifyOnGoals = true;
777
+ changed = true;
778
+ }
763
779
 
764
780
  const { templates, changed: templatesChanged } = ensureNotificationTemplateShape(settings.notificationTemplates);
765
781
  if (templatesChanged || !settings.notificationTemplates || typeof settings.notificationTemplates !== 'object') {
@@ -34,6 +34,27 @@ const createRuntime = async () => {
34
34
  };
35
35
 
36
36
  describe('settings runtime', () => {
37
+ it('migrates absent notification toggles to their defaults', async () => {
38
+ const { runtime, settingsFilePath, cleanup } = await createRuntime();
39
+ try {
40
+ // Pre-existing settings with only the legacy toggles — the four new
41
+ // notification switches must default to enabled.
42
+ await fsPromises.writeFile(settingsFilePath, JSON.stringify({
43
+ notifyOnCompletion: false,
44
+ notifyOnQuestion: false,
45
+ }));
46
+ const settings = await runtime.readSettingsFromDiskMigrated();
47
+ expect(settings.notifyOnCompletion).toBe(false);
48
+ expect(settings.notifyOnQuestion).toBe(false);
49
+ expect(settings.notifyOnPermission).toBe(true);
50
+ expect(settings.notifyOnScheduledTasks).toBe(true);
51
+ expect(settings.notifyOnAssistants).toBe(true);
52
+ expect(settings.notifyOnGoals).toBe(true);
53
+ } finally {
54
+ await cleanup();
55
+ }
56
+ });
57
+
37
58
  it('only remaps project plan paths within the migrated storage directory', async () => {
38
59
  const { runtime, settingsFilePath, tempRoot, cleanup } = await createRuntime();
39
60
  try {
@@ -421,6 +421,7 @@ export const createScheduledTasksRuntime = (deps) => {
421
421
  getSmallModelService,
422
422
  waitForOpenCodeReady,
423
423
  emitTaskRunEvent,
424
+ notifyTaskRun,
424
425
  runHistoryStore = null,
425
426
  logger = console,
426
427
  maxGlobalConcurrency = DEFAULT_GLOBAL_CONCURRENCY,
@@ -1487,6 +1488,26 @@ export const createScheduledTasksRuntime = (deps) => {
1487
1488
  } catch {
1488
1489
  }
1489
1490
 
1491
+ // Notification fanout for scheduled (non-manual) runs; the notification
1492
+ // runtime owns every delivery gate (settings toggle, channels).
1493
+ try {
1494
+ await notifyTaskRun?.({
1495
+ projectID,
1496
+ taskID,
1497
+ taskName,
1498
+ status,
1499
+ reason,
1500
+ ...(sessionID ? { sessionId: sessionID } : {}),
1501
+ ...(status === 'error' ? { errorMessage } : {}),
1502
+ });
1503
+ } catch (error) {
1504
+ logger.warn?.('[ScheduledTasks] task-run notification failed', {
1505
+ projectID,
1506
+ taskID,
1507
+ error: safeErrorMessage(error),
1508
+ });
1509
+ }
1510
+
1490
1511
  return {
1491
1512
  ok: status === 'success',
1492
1513
  status,
@@ -148,6 +148,30 @@ describe('scheduled-tasks runtime helpers', () => {
148
148
  });
149
149
 
150
150
  describe('scheduled-tasks runtime cleanup', () => {
151
+ it('notifies the notification runtime when a run settles, without blocking its result', async () => {
152
+ const updateScheduledTaskState = vi.fn(async () => ({ task: scheduledTask }));
153
+ const notifyTaskRun = vi.fn(async () => {
154
+ throw new Error('notification fanout failed');
155
+ });
156
+ const runtime = createRuntime(updateScheduledTaskState, { notifyTaskRun });
157
+ await runtime.syncProject('project-1');
158
+
159
+ const result = await runtime.runNow('project-1', 'task-1');
160
+
161
+ // waitForOpenCodeReady throws in this fixture → the run settles as error.
162
+ expect(result).toMatchObject({ ok: false, status: 'error' });
163
+ expect(notifyTaskRun).toHaveBeenCalledTimes(1);
164
+ expect(notifyTaskRun.mock.calls[0][0]).toMatchObject({
165
+ projectID: 'project-1',
166
+ taskID: 'task-1',
167
+ taskName: 'Task',
168
+ status: 'error',
169
+ reason: 'manual',
170
+ });
171
+ // A failing notification callback must not mark the run failed.
172
+ expect(runtime.getStatus().hasRunningScheduledTasks).toBe(false);
173
+ });
174
+
151
175
  it('releases the running lock after the initial running-state write fails', async () => {
152
176
  let calls = 0;
153
177
  const updateScheduledTaskState = vi.fn(async () => {
@@ -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,r as p,u as m}from"./vendor-reactuses-core-DDoDDyM9.js";import{n as h}from"./clipboard-DJ4nQEuY.js";import{a as g,n as _}from"./MobileShareBridge-UiOLx0-2.js";import{Oo as v,dr as y,qt as b,r as x,vn as S}from"./useMobileNavigationStore-C8_J-qTp.js";import{a as C,b as w,c as T,f as E,h as D,p as O,r as k,t as A,v as j}from"./MobileDetailNavigation-B_RwWOwv.js";import{i as M,n as N,r as P}from"./useAssistantUIStore-me6s63b2.js";import{a as F,i as I,n as L,o as R,r as z,t as B}from"./dialog-CgbV5ljg.js";import{t as V}from"./utils-BiK3tBGM.js";import{t as H}from"./AgentAvatar-CX0a1rKE.js";import{n as U}from"./Icon-BYM02QyU.js";import{t as W}from"./button-C0cth9tl.js";import{i as ee}from"./OverlayScrollbar-KUpvYHdv.js";import{t as te}from"./MarkdownRenderer-C4MGa_kQ.js";import{a as ne,c as re,i as G,n as ie,o as K,p as ae,r as oe,t as se}from"./sessionChangeSummary-hVby3sJk.js";import{a as ce,i as q,n as le,r as ue,t as J}from"./context-menu-CAp74NfV.js";import{t as de}from"./sessionLookup-B6P_aCun.js";var Y=u(),X=e(c(),1),Z=s(),fe=e=>{let t=(0,Y.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}=h(),d=`calc(${c}px * var(--dpt-n, 1))`,f;t[0]===s?f=t[1]:(f=V(`relative inline-block shrink-0 align-middle leading-none`,s),t[0]=s,t[1]=f);let p;t[2]===d?p=t[3]:(p={width:d,height:d},t[2]=d,t[3]=p);let m;t[4]!==r||t[5]!==a||t[6]!==n||t[7]!==c?(m=(0,Z.jsx)(H,{name:n,emoji:r,size:c,label:a,shape:`circle`}),t[4]=r,t[5]=a,t[6]=n,t[7]=c,t[8]=m):m=t[8];let g;t[9]!==u||t[10]!==l?(g=l?(0,Z.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]!==p||t[14]!==m||t[15]!==g?(_=(0,Z.jsxs)(`span`,{className:f,style:p,"data-assistant-working-avatar":``,children:[m,g]}),t[12]=f,t[13]=p,t[14]=m,t[15]=g,t[16]=_):_=t[16],_},pe=o(e=>({workingByID:{},setWorking:(t,n)=>e(e=>({workingByID:{...e.workingByID,[t]:n}}))})),me=({sending:e=!1,processing:t=!1})=>e||t,he=e=>{let t=(0,Y.c)(4),n;t[0]===e?n=t[1]:(n=t=>!!t.workingByID[e],t[0]=e,t[1]=n);let r=pe(n),i;return t[2]===r?i=t[3]:(i=me({processing:r}),t[2]=r,t[3]=i),i},ge=[],_e=e=>e.flatMap(e=>e.type===`text`&&e.text.trim()?[e.text]:[]).join(`
2
- `),ve=(e,t,n,r=Date.now())=>({assistantID:e,messageID:t,parts:n,status:`sending`,createdAt:r}),ye=(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},$=(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:[]}),be=(e,t,n)=>{let r=e.bubbles.filter(e=>!t.has(e.bubbleIndex)).map((t,r)=>$(e,t,n+r,t.done?`complete`:`streaming`));return e.status===`failed`?[...r,$(e,null,n+r.length,`failed`)]:e.status===`admitted`||e.status===`streaming`?[...r,$(e,null,n+r.length,`admitted`)]:r},xe=(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:_e(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=be(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)},Se=(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},Ce=(e,t)=>e.map(e=>e.messageID===t?{...e,status:`admitted`}:e),we=(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}],Te=(e,t)=>we(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}}),Ee=(e,t)=>we(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}:{}}),De=(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},Oe=(e,t,n)=>e.map(e=>e.messageID===t?{...e,status:`failed`,error:n}:e),ke=(e,t)=>{if(e instanceof j){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 w(e)?t.timedOut:t.sendFailed},Ae=()=>{let e=!1;return{tryAcquire:()=>!e&&(e=!0,!0),release:()=>{e=!1}}},je=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:ve(e.assistantID,r,n,e.createdAt)}},Me=e=>e.some(e=>e.status===`sending`),Ne=e=>e.some(e=>e.status===`admitted`||e.status===`streaming`),Pe=[`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(` `),Fe=`${Pe} w-fit max-w-[15rem]`,Ie=`${Pe} w-fit max-w-[20rem]`;function Le(e,t){(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),t())}var Re=e=>{let t=(0,Y.c)(26),{card:n}=e,{t:r}=h(),i=ae(),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,p;t[5]!==n.assistantID||t[6]!==o?(p=()=>{if(o){x.getState().openAssistant(n.assistantID);return}N(n.assistantID)},t[5]=n.assistantID,t[6]=o,t[7]=p):p=t[7];let m=f(p),g;t[8]===m?g=t[9]:(g=e=>{Le(e,m)},t[8]=m,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 y;t[13]===Symbol.for(`react.memo_cache_sentinel`)?(y=(0,Z.jsx)(`span`,{className:`relative inline-block size-6 shrink-0 leading-none`,children:(0,Z.jsx)(`span`,{className:`flex size-6 items-center justify-center rounded-lg bg-[var(--surface-muted)] text-muted-foreground`,children:(0,Z.jsx)(U,{name:`robot-2`,className:`size-3`})})}),t[13]=y):y=t[13];let b;t[14]===s?b=t[15]:(b=(0,Z.jsx)(`h3`,{className:`min-w-0 truncate typography-ui-label font-medium text-foreground`,children:s}),t[14]=s,t[15]=b);let S;t[16]===d?S=t[17]:(S=d.length>0?(0,Z.jsx)(`p`,{className:`truncate typography-micro text-muted-foreground`,children:d.join(` · `)}):null,t[16]=d,t[17]=S);let C;t[18]!==b||t[19]!==S?(C=(0,Z.jsxs)(`div`,{className:`flex items-center gap-2.5`,children:[y,(0,Z.jsxs)(`div`,{className:`min-w-0 flex-1 space-y-1`,children:[b,S]})]}),t[18]=b,t[19]=S,t[20]=C):C=t[20];let w;return t[21]!==_||t[22]!==m||t[23]!==C||t[24]!==v?(w=(0,Z.jsx)(`article`,{className:Fe,role:`button`,tabIndex:0,"aria-label":v,"data-assistant-contact-card":`assistant`,onClick:m,onKeyDown:_,children:C}),t[21]=_,t[22]=m,t[23]=C,t[24]=v,t[25]=w):w=t[25],w},ze=e=>{let t=(0,Y.c)(25),{card:n}=e,{t:r}=h(),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(Be),u;t[7]===l?u=t[8]:(u=e=>{Le(e,l)},t[7]=l,t[8]=u);let d=f(u),p;t[9]!==r||t[10]!==i?(p=r(`assistants.contact.card.schedule.aria`,{name:i}),t[9]=r,t[10]=i,t[11]=p):p=t[11];let m;t[12]===Symbol.for(`react.memo_cache_sentinel`)?(m=(0,Z.jsx)(`span`,{className:`relative inline-block size-6 shrink-0 leading-none`,children:(0,Z.jsx)(`span`,{className:`flex size-6 items-center justify-center rounded-lg bg-[var(--surface-muted)] text-muted-foreground`,children:(0,Z.jsx)(U,{name:`calendar`,className:`size-3`})})}),t[12]=m):m=t[12];let g;t[13]===i?g=t[14]:(g=(0,Z.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,Z.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,Z.jsxs)(`div`,{className:`flex items-center gap-2.5`,children:[m,(0,Z.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]!==p||t[23]!==v?(y=(0,Z.jsx)(`article`,{className:Fe,role:`button`,tabIndex:0,"aria-label":p,"data-assistant-contact-card":`schedule`,onClick:l,onKeyDown:d,children:v}),t[20]=d,t[21]=l,t[22]=p,t[23]=v,t[24]=y):y=t[24],y};function Be(){i.getState().setActiveMainTab(`schedule`),i.getState().setScheduledTasksDialogOpen(!0)}var Ve=(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`,He=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,Ue=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`,We=e=>e.split(/[/\\]/u).filter(Boolean).at(-1)||e,Ge=e=>{let t=(0,Y.c)(35),{card:n}=e,{t:r}=h(),a=ae(),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=y(c),d=b(n.sessionID),p=(typeof u?.title==`string`&&u.title.trim()?u.title.trim():null)||n.title||r(`assistants.contact.card.session.untitled`),m=Ve(d?.type,n.status),g=He(m),_=m===`busy`||m===`retry`,v=We(typeof u?.directory==`string`&&u.directory.trim()?u.directory.trim():n.directory),x=ie(u)||n.branch,C=G(u),w=oe(u),T=se(w),E=[v,C,x].filter(Ke),D;t[4]!==n.directory||t[5]!==n.sessionID||t[6]!==s?(D=()=>{let e=de(n.sessionID)?.directory||n.directory;S(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=>{Le(e,O)},t[8]=O,t[9]=k);let A=f(k),j=Ie,M=r(`assistants.contact.card.session.aria`,{title:p}),N;t[10]===Symbol.for(`react.memo_cache_sentinel`)?(N=(0,Z.jsx)(`span`,{className:`flex size-6 items-center justify-center rounded-lg bg-[var(--surface-muted)] text-muted-foreground`,children:(0,Z.jsx)(U,{name:`chat-3`,className:`size-3`})}),t[10]=N):N=t[10];let P;t[11]===_?P=t[12]:(P=_?(0,Z.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]=_,t[12]=P);let F;t[13]===P?F=t[14]:(F=(0,Z.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]===p?I=t[16]:(I=(0,Z.jsx)(`h3`,{className:`min-w-0 flex-1 truncate typography-ui-label font-medium text-foreground`,children:p}),t[15]=p,t[16]=I);let L=g?(0,Z.jsx)(`span`,{className:V(`shrink-0 rounded-full px-1.5 py-0.5 typography-micro leading-none`,Ue(m)),children:r(g)}):null,R;t[17]!==I||t[18]!==L?(R=(0,Z.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 z;t[20]===E?z=t[21]:(z=E.length>0?(0,Z.jsx)(`p`,{className:`truncate typography-micro text-muted-foreground`,children:E.join(` · `)}):null,t[20]=E,t[21]=z);let B=T||w?.files!==void 0&&w.files>0?(0,Z.jsxs)(`p`,{className:`flex flex-wrap items-baseline gap-x-1.5 typography-micro tabular-nums`,children:[w?.additions===void 0?null:(0,Z.jsxs)(`span`,{className:`text-[var(--status-success)]`,children:[`+`,w.additions]}),w?.deletions===void 0?null:(0,Z.jsxs)(`span`,{className:`text-[var(--status-error)]`,children:[`−`,w.deletions]}),w?.files===void 0?null:(0,Z.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,H;t[22]!==R||t[23]!==z||t[24]!==B?(H=(0,Z.jsxs)(`div`,{className:`min-w-0 flex-1 space-y-1`,children:[R,z,B]}),t[22]=R,t[23]=z,t[24]=B,t[25]=H):H=t[25];let W;t[26]!==F||t[27]!==H?(W=(0,Z.jsxs)(`div`,{className:`flex items-start gap-2.5`,children:[F,H]}),t[26]=F,t[27]=H,t[28]=W):W=t[28];let ee;return t[29]!==A||t[30]!==O||t[31]!==W||t[32]!==j||t[33]!==M?(ee=(0,Z.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]=ee):ee=t[34],ee};function Ke(e){return!!(e&&e.trim())}var qe=2,Je=1500,Ye=e=>({scrollTop:e.scrollTop,scrollHeight:e.scrollHeight,clientHeight:e.clientHeight}),Xe=e=>e.scrollHeight-e.scrollTop-e.clientHeight,Ze=e=>Xe(e)<=qe,Qe=(e,t)=>{let n=t instanceof Element?t:t instanceof Node?t.parentElement:null;for(;n&&n!==e;){if(n instanceof HTMLElement&&n.scrollHeight>n.clientHeight+1&&n.scrollTop+n.clientHeight<n.scrollHeight-1)return!0;n=n.parentElement}return!1},$e=e=>e.altKey||e.ctrlKey||e.metaKey?!1:e.key===`ArrowDown`||e.key===`PageDown`||e.key===`End`,et=({active:e,assistantID:t,contentRevision:n})=>{let r=X.useRef(null),[i,a]=X.useState(null),[o,s]=X.useState(null),c=X.useRef(!0),l=X.useRef(null),u=X.useRef(null),d=X.useRef(0),h=X.useRef(null),g=X.useRef(null),_=X.useRef(e);_.current=e;let v=X.useMemo(()=>e=>{r.current=e,a(t=>t===e?t:e)},[]),y=X.useMemo(()=>e=>{s(t=>t===e?t:e)},[]),b=f(()=>{if(!_.current||!c.current)return!1;let e=r.current;if(!e)return!1;let t=Ye(e),n=Math.min(d.current,Math.max(0,t.scrollHeight-t.clientHeight));return t.scrollTop<n-.5?(c.current=!1,d.current=t.scrollTop,!1):Ze(t)?(d.current=t.scrollTop,!1):(e.scrollTop=e.scrollHeight,d.current=e.scrollTop,!0)}),x=f(e=>{g.current={direction:e,expiresAt:performance.now()+Je}}),S=f(()=>{let e=g.current;return e?performance.now()>e.expiresAt?(g.current=null,null):e.direction:null}),C=f(()=>{c.current=!1}),w=f(()=>{if(!_.current)return;let e=r.current;if(!e)return;let t=Ye(e),n=t.scrollTop>d.current,i=Math.min(d.current,Math.max(0,t.scrollHeight-t.clientHeight));if(d.current=t.scrollTop,c.current){t.scrollTop<i-.5&&C();return}let a=S();n&&Ze(t)&&(a===`down`||a===`scrollbar`)&&(c.current=!0)}),T=f(e=>{let t=r.current;if(!(!t||e.deltaY===0)){if(e.deltaY<0){if(K(t,e.target))return;x(`up`),C();return}Qe(t,e.target)||x(`down`)}}),E=f(e=>{g.current=null;let t=e.touches.item(0);h.current=t?{x:t.clientX,y:t.clientY,deltaX:0,deltaY:0}:null}),D=f(e=>{let t=r.current,n=e.touches.item(0);if(!t||!n){h.current=null;return}let i=h.current;if(!i)return;let a=n.clientY-i.y,o=a*i.deltaY<0,s=(o?0:i.deltaX)+n.clientX-i.x,c=(o?0:i.deltaY)+a;if(h.current={x:n.clientX,y:n.clientY,deltaX:s,deltaY:c},!(Math.abs(s)>=Math.abs(c))){if(c>0&&K(t,e.target)||c<0&&Qe(t,e.target)){h.current.deltaX=0,h.current.deltaY=0;return}x(c>0?`up`:`down`),c>2&&C()}}),O=f(()=>{h.current=null}),k=f(e=>{if(ne(e)){x(`up`),C();return}$e(e)&&x(`down`)}),A=f(e=>{let t=r.current;e.pointerType===`mouse`&&e.target===t&&x(`scrollbar`)});X.useLayoutEffect(()=>{let n=e?t:null,i=r.current;(l.current!==n||u.current!==i)&&(l.current=n,u.current=i,c.current=!0,g.current=null,h.current=null,d.current=i?.scrollTop??0),e&&b()},[e,t,n,i]);let j=X.useMemo(()=>()=>void 0,[]),M=e&&i?i:j,N=X.useMemo(()=>({passive:!0}),[]);p(`scroll`,w,M,N),p(`wheel`,T,M,N),p(`touchstart`,E,M,N),p(`touchmove`,D,M,N),p(`touchend`,O,M,N),p(`touchcancel`,O,M,N),p(`keydown`,k,M),p(`pointerdown`,A,M,N);let P=f(()=>{b()});return m(typeof ResizeObserver<`u`&&e?o:null,P),{scrollRef:v,contentRef:y}},tt=64,nt=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)}),rt=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)},it=e=>Array.from(e?.files||[]),at=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 nt(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}},ot=(e,t)=>[...e,...t].slice(0,tt),st={"oc.settle.complete":`assistants.contact.settle.complete`,"oc.settle.error":`assistants.contact.settle.error`,"oc.settle.question":`assistants.contact.settle.question`},ct=({assistant:e,warning:t,active:n,overlayHeader:r=!1})=>{let{t:o}=h(),s=i(e=>e.isMobile),c=E(),l=D(),u=O(e.id,n),d=g(e.name),p=d.displayName||e.name,m=(e,t)=>{let n=e?l.data?.assistants.find(t=>t.id===e):void 0;return n?g(n.name).displayName||n.name:t||o(`assistants.contact.peer.unknown`)},[y,b]=X.useState(``),[x,S]=X.useState([]),[C,w]=X.useState([]),[k,A]=X.useState([]),[j,M]=X.useState(null),N=X.useMemo(()=>Ae(),[]),P=X.useRef(new Set),F=pe(e=>e.setWorking),I=u.data?.messages??ge,L=ye(C,e.id),R=Q(k,e.id),z=xe(I,L,e.id,R),B=Me(L),H=Ne(R),W=R.reduce((e,t)=>e+t.bubbles.reduce((e,t)=>e+t.text.length,0),0),ee=new Map(R.map(e=>[e.turnID,e])),{scrollRef:ne,contentRef:G}=et({active:n,assistantID:e.id,contentRevision:`${z.length}:${W}`});X.useEffect(()=>{M(null),P.current.clear(),w(t=>ye(t,e.id)),A(t=>Q(t,e.id))},[e.id]),X.useEffect(()=>{w(e=>Se(e,I)),A(e=>De(e,I))},[I]),X.useEffect(()=>{F(e.id,B||H)},[e.id,H,B,F]),X.useEffect(()=>{let t=e.id;return()=>{F(t,!1)}},[e.id,F]);let ie=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=>we(e,t.assistantID,t.turnID,t.occurredAt));return}if(t.type===`contact-bubble-delta`){if(P.current.has(t.turnID))return;A(e=>Te(e,t));return}t.type===`contact-turn-end`&&(P.current.add(t.turnID),A(e=>De(Ee(e,t),I)))}});X.useEffect(()=>{if(n)return v(ie)},[n,e.id]);let K=f(async e=>{let t=await at(e);t.skippedTooLarge>0&&M(o(`assistants.contact.attachment.tooLarge`)),t.attachments.length!==0&&S(e=>ot(e,t.attachments))}),ae=f(e=>{let t=rt(e.clipboardData);t.length!==0&&(e.preventDefault(),K(t))}),oe=f(e=>{Array.from(e.dataTransfer?.types??[]).includes(`Files`)&&(e.preventDefault(),e.dataTransfer.dropEffect=`copy`)}),se=f(e=>{let t=it(e.dataTransfer);t.length!==0&&(e.preventDefault(),K(t))}),ce=f(async()=>{let t=y,n=x,r=e.id,i=je({gate:N,sending:Me(L),text:t,attachments:n,assistantID:r,createMessageID:()=>`oc_contact_${a()}`});if(i.ok){w(e=>[...e,i.turn]),b(``),S([]),M(null);try{await T(r,i.messageID,{parts:i.parts}),w(e=>Ce(e,i.messageID)),P.current.has(i.messageID)||A(e=>we(e,r,i.messageID)),c.data?.serverInstanceID&&_({serverInstanceID:c.data.serverInstanceID,assistantID:r,name:p,avatarSeed:r,...d.avatarEmoji?{avatarEmoji:d.avatarEmoji}:{}}).catch(()=>void 0)}catch(e){let t=ke(e,{noProvider:o(`assistants.contact.noProvider`),sendFailed:o(`assistants.contact.sendFailed`),timedOut:o(`assistants.contact.timedOut`)});w(e=>Oe(e,i.messageID,t))}finally{N.release()}}}),q=u.isError&&z.length===0,le=u.isSuccess&&z.length===0,ue=new Map(L.map(e=>[e.messageID,e]));return(0,Z.jsxs)(`div`,{className:`flex min-h-0 flex-1 flex-col bg-background`,children:[(0,Z.jsxs)(`div`,{ref:ne,className:V(`min-h-0 flex-1 overflow-x-hidden 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`),style:{overflowAnchor:`none`,overscrollBehavior:`contain`,overscrollBehaviorY:`contain`},"data-assistant-contact-transcript":``,children:[t?(0,Z.jsx)(`p`,{className:`mb-3 typography-micro text-[var(--status-warning)]`,children:t}):null,q?(0,Z.jsxs)(`div`,{ref:G,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,Z.jsxs)(`div`,{className:`relative`,children:[(0,Z.jsx)(fe,{name:e.id,emoji:d.avatarEmoji,size:44,label:p}),(0,Z.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,Z.jsx)(U,{name:`error-warning`,className:`size-3`})})]}),(0,Z.jsx)(`p`,{className:`mt-4 typography-ui-label font-medium text-foreground`,children:p}),(0,Z.jsx)(`p`,{className:`mt-1.5 typography-ui leading-6 text-muted-foreground`,children:o(`assistants.contact.loadFailed`)})]}):le?(0,Z.jsxs)(`div`,{ref:G,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,Z.jsx)(fe,{name:e.id,emoji:d.avatarEmoji,size:48,label:p,className:`opacity-90`}),(0,Z.jsx)(`p`,{className:`mt-5 typography-ui-header font-medium tracking-[-0.01em] text-foreground`,children:o(`assistants.conversation.emptyTitle`,{name:p})}),(0,Z.jsx)(`p`,{className:`mt-2 max-w-xs typography-ui leading-6 text-muted-foreground/80`,children:o(`assistants.contact.empty`)})]}):(0,Z.jsx)(`div`,{ref:G,className:`mx-auto flex w-full max-w-[42rem] flex-col`,children:z.map((t,n)=>{let r=n>0?z[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?m(t.fromAssistantID,t.fromAssistantName):p,f=a&&t.fromAssistantID?l.data?.assistants.find(e=>e.id===t.fromAssistantID):e,h=f?g(f.name):null,_=ue.get(t.messageID),v=ee.get(t.turnID),y=t.status===`admitted`&&t.messageID.endsWith(`:preview:admitted`),b=t.status===`failed`&&t.messageID.endsWith(`:preview:failed`);return(0,Z.jsxs)(`div`,{className:V(`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":_?.status??t.status,"data-assistant-contact-run-start":t.role===`assistant`&&!s?``:void 0,children:[i?null:(0,Z.jsx)(`div`,{className:`mr-2.5 flex w-8 shrink-0 justify-center pt-0.5`,children:u?(0,Z.jsx)(fe,{name:f?.id||t.fromAssistantID||e.id,emoji:h?.avatarEmoji,size:28,label:d}):(0,Z.jsx)(`span`,{className:`size-7`,"aria-hidden":!0})}),(0,Z.jsxs)(`div`,{className:V(`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,Z.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,Z.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,Z.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,Z.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,Z.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,Z.jsx)(Ge,{card:e},`${t.messageID}:card:${n}`);if(e.type===`card`&&e.cardType===`assistant`)return(0,Z.jsx)(Re,{card:e},`${t.messageID}:card:${n}`);if(e.type===`card`&&e.cardType===`schedule`)return(0,Z.jsx)(ze,{card:e},`${t.messageID}:card:${n}`);if(e.type===`file`&&e.mime.startsWith(`image/`)&&e.url)return(0,Z.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,Z.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,Z.jsx)(U,{name:`file-text`,className:`size-4 shrink-0 text-muted-foreground`}),(0,Z.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=st[e.text],c=!i&&!r;return(0,Z.jsxs)(`div`,{"aria-label":a?o(`assistants.contact.peer.aria`,{name:d}):void 0,"data-assistant-contact-text":``,className:V(`min-w-0 max-w-full [overflow-wrap:anywhere] rounded-[1.35rem] px-4 py-2.5 typography-ui leading-6`,c?null:`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`:V(`bg-[var(--surface-muted)] text-foreground`,s&&`rounded-tl-lg`)),children:[c?(0,Z.jsx)(te,{content:e.text,messageId:t.messageID,isAnimated:!1,isStreaming:t.status===`streaming`,variant:`assistant`,enableFileReferences:!1,className:`w-full min-w-0 [overflow-wrap:anywhere]`}):r?o(r):e.text,t.status===`streaming`&&n===t.parts.length-1?(0,Z.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}),_?.status===`sending`?(0,Z.jsx)(`p`,{className:`px-1 typography-micro text-muted-foreground/75`,children:o(`assistants.contact.sending`)}):null,_?.status===`failed`?(0,Z.jsx)(`p`,{className:`px-1 typography-micro text-[var(--status-error)]`,children:_.error||o(`assistants.contact.sendFailed`)}):null,b?(0,Z.jsx)(`p`,{className:`px-1 typography-micro text-[var(--status-error)]`,children:v?.error||o(`assistants.contact.sendFailed`)}):null]})]},t.messageID)})})]}),(0,Z.jsxs)(`footer`,{className:`relative z-10 shrink-0 bg-background pt-1`,"data-assistant-contact-composer":``,children:[j?(0,Z.jsx)(`p`,{className:`chat-input-column mb-2 typography-micro text-[var(--status-error)]`,children:j}):null,(0,Z.jsx)(`form`,{className:V(`relative w-full pt-1.5 pb-4`,s&&`bottom-safe-area oc-mobile-composer`),onSubmit:e=>{e.preventDefault(),ce()},onDragOver:oe,onDrop:se,children:(0,Z.jsx)(`div`,{className:`chat-input-column relative overflow-visible`,children:(0,Z.jsx)(re,{layout:`inline`,value:y,attachments:x,pending:!1,isMobile:s,placeholder:o(`assistants.contact.placeholder`,{name:p}),sendLabel:o(`assistants.contact.send`),addFilesLabel:o(`assistants.contact.addFiles`),removeAttachmentLabel:o(`assistants.contact.removeAttachment`),fileAccept:`*/*`,onChange:e=>b(e),onSubmit:()=>{ce()},onAddFiles:e=>{K(e)},onRemoveAttachment:e=>{S(t=>t.filter(t=>t.id!==e))},onPaste:ae,onDragOver:oe,onDrop:se,className:V(`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:p})}})})})]})]})};async function lt(e){await k(e);let t=M.getState().defaultShareAssistant;if(t?.assistantID!==e.id)return;let n=await C();n.serverInstanceID&&t.serverInstanceID===n.serverInstanceID&&M.getState().setDefaultShareAssistant(null)}function ut({assistant:e,open:t,onOpenChange:n,onDeleted:r}){let{t:i}=h(),[a,o]=X.useState(!1),s=e?g(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 lt(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,Z.jsx)(B,{open:t&&e!==null,onOpenChange:c,children:(0,Z.jsxs)(L,{className:`max-w-md`,children:[(0,Z.jsxs)(F,{children:[(0,Z.jsx)(R,{children:i(`assistants.settings.delete`)}),(0,Z.jsx)(z,{children:i(`assistants.settings.deleteConfirm`,{name:s})})]}),(0,Z.jsxs)(I,{children:[(0,Z.jsx)(W,{size:`sm`,variant:`ghost`,onClick:l,disabled:a,children:i(`settings.common.actions.cancel`)}),(0,Z.jsx)(W,{size:`sm`,variant:`destructive`,onClick:u,disabled:a,children:i(`settings.common.actions.delete`)})]})]})})}var dt=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`,ft=t({AssistantView:()=>ht}),pt=e=>{let t=(0,Y.c)(21),{assistant:n,onBack:r}=e,{t:i}=h(),a=ae(),o;t[0]===n?o=t[1]:(o=n?g(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&&P(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,Z.jsxs)(`span`,{className:`inline-flex min-w-0 items-center gap-2.5`,children:[(0,Z.jsx)(fe,{name:n.id,emoji:s?.avatarEmoji,size:28,label:c}),(0,Z.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 p;t[10]===i?p=t[11]:(p=i(`assistants.actions.backToChat`),t[10]=i,t[11]=p);let m;t[12]!==n||t[13]!==u||t[14]!==i?(m=n?[{icon:`settings-3`,ariaLabel:i(`assistants.conversation.openSettings`),onClick:u}]:[],t[12]=n,t[13]=u,t[14]=i,t[15]=m):m=t[15];let _;return t[16]!==r||t[17]!==d||t[18]!==p||t[19]!==m?(_=(0,Z.jsx)(A,{title:d,backAriaLabel:p,onBack:r,actions:m,overlay:!0}),t[16]=r,t[17]=d,t[18]=p,t[19]=m,t[20]=_):_=t[20],_},mt=e=>{let t=(0,Y.c)(41),{assistantID:n,displayName:r,avatarEmoji:i,selected:a,enabled:o,editLabel:s,deleteLabel:c,onSelect:l,onEdit:u,onDelete:d}=e,p=he(n),[m,h]=X.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=V(`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,Z.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,Z.jsx)(fe,{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,Z.jsx)(`span`,{className:`min-w-0 flex-1`,children:(0,Z.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,Z.jsxs)(ce,{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,Z.jsx)(U,{name:`edit`,className:`size-4`}),t[25]=A):A=t[25];let j;t[26]!==s||t[27]!==y?(j=(0,Z.jsxs)(ue,{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,Z.jsx)(q,{}),t[29]=M):M=t[29];let N;t[30]===Symbol.for(`react.memo_cache_sentinel`)?(N=(0,Z.jsx)(U,{name:`delete-bin`,className:`size-4`}),t[30]=N):N=t[30];let P;t[31]!==c||t[32]!==x?(P=(0,Z.jsxs)(ue,{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,Z.jsxs)(le,{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,Z.jsxs)(J,{open:m,onOpenChange:h,children:[k,F]}),t[37]=m,t[38]=k,t[39]=F,t[40]=I):I=t[40],I},ht=e=>{let t=(0,Y.c)(109),{activeOverride:a,onMobileBack:o}=e,{t:s}=h(),{isMobile:c}=ee(),l=ae(),u=X.useSyncExternalStore(n,r,r),d=i(gt),p=a??d,m=i(_t),_=c||m,v=E(),y=D(),b=y.data,x;t[0]===u?x=t[1]:(x=e=>e.assistantByTransport[u]??null,t[0]=u,t[1]=x);let S=M(x),C=M(vt),w=M(yt),T;t[2]!==S||t[3]!==b?.assistants?(T=b?.assistants.find(e=>e.id===S)??null,t[2]=S,t[3]=b?.assistants,t[4]=T):T=t[4];let O=T,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 A=b?.assistants,j;t[9]!==C||t[10]!==S||t[11]!==A?(j=[C,S,A],t[9]=C,t[10]=S,t[11]=A,t[12]=j):j=t[12],X.useEffect(k,j);let N;t[13]!==O||t[14]!==C||t[15]!==S||t[16]!==b?.assistants||t[17]!==y.isSuccess?(N=()=>{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]=N):N=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],X.useEffect(N,I);let L;t[25]!==l||t[26]!==w?(L=()=>{if(w(),l){l.openSettings();return}let e=i.getState();e.setSettingsPage(`assistants`),e.setSettingsDialogOpen(!0)},t[25]=l,t[26]=w,t[27]=L):L=t[27];let R=f(L),z;t[28]===l?z=t[29]:(z=e=>{P(e,l?{openMobileSettings:l.openSettings}:void 0)},t[28]=l,t[29]=z);let B=f(z),H;t[30]!==O||t[31]!==l?(H=()=>{O&&P(O.id,l?{openMobileSettings:l.openSettings}:void 0)},t[30]=O,t[31]=l,t[32]=H):H=t[32];let te=f(H),[ne,re]=X.useState(null),G;t[33]===Symbol.for(`react.memo_cache_sentinel`)?(G=e=>{re(e)},t[33]=G):G=t[33];let ie=f(G),K;t[34]===Symbol.for(`react.memo_cache_sentinel`)?(K=e=>{e||re(null)},t[34]=K):K=t[34];let oe=f(K),se=f(bt),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),le=dt({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}),ue;t[38]!==O||t[39]!==q||t[40]!==_?(ue=(e,t,n,r)=>(0,Z.jsxs)(`div`,{className:`relative flex h-full min-h-0 flex-col`,children:[_?(0,Z.jsx)(pt,{assistant:O,onBack:q}):null,(0,Z.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,Z.jsx)(U,{name:e,className:`size-6 text-muted-foreground`}),(0,Z.jsx)(`h1`,{className:`mt-4 typography-ui-header font-semibold`,children:t}),n?(0,Z.jsx)(`p`,{className:`mt-2 max-w-md typography-ui text-muted-foreground`,children:n}):null,r?(0,Z.jsx)(`div`,{className:`mt-5`,children:r}):null]})]}),t[38]=O,t[39]=q,t[40]=_,t[41]=ue):ue=t[41];let J=ue;if(le===`loading`){let e;t[42]!==O||t[43]!==q||t[44]!==_?(e=_?(0,Z.jsx)(pt,{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,Z.jsx)(U,{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,Z.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,Z.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(le===`unavailable`){let e;return t[54]!==J||t[55]!==s?(e=J(`cloud-off`,s(`assistants.state.unavailable`)),t[54]=J,t[55]=s,t[56]=e):e=t[56],e}if(le===`onboarding`){let e;if(t[57]!==R||t[58]!==J||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,Z.jsx)(W,{onClick:R,children:i}),t[63]=R,t[64]=i,t[65]=a):a=t[65],e=J(`ai-agent`,n,r,a),t[57]=R,t[58]=J,t[59]=s,t[60]=e}else e=t[60];return e}if(!b||!O){let e;return t[66]!==J||t[67]!==s?(e=J(`cloud-off`,s(`assistants.state.unavailable`)),t[66]=J,t[67]=s,t[68]=e):e=t[68],e}let de;t[69]===O.name?de=t[70]:(de=g(O.name),t[69]=O.name,t[70]=de);let pe=de,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,ge;t[75]!==_||t[76]!==B||t[77]!==ie||t[78]!==C||t[79]!==S||t[80]!==b||t[81]!==s?(ge=_?null:(0,Z.jsxs)(`section`,{className:`flex h-full min-h-0 w-[clamp(16rem,22vw,20rem)] shrink-0 flex-col overflow-hidden`,children:[(0,Z.jsx)(`header`,{className:`shrink-0 px-4 pb-3 pt-4 sm:px-5`,children:(0,Z.jsx)(`h1`,{className:`truncate typography-ui-label font-semibold text-foreground`,children:s(`assistants.title`)})}),(0,Z.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,Z.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=g(e.name);return(0,Z.jsx)(mt,{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:()=>B(e.id),onDelete:()=>ie(e)},e.id)})})})]}),t[75]=_,t[76]=B,t[77]=ie,t[78]=C,t[79]=S,t[80]=b,t[81]=s,t[82]=ge):ge=t[82];let _e=ne!==null,ve;t[83]!==ne||t[84]!==oe||t[85]!==_e?(ve=(0,Z.jsx)(ut,{assistant:ne,open:_e,onOpenChange:oe}),t[83]=ne,t[84]=oe,t[85]=_e,t[86]=ve):ve=t[86];let ye=!_&&`border-l border-[var(--surface-subtle)]`,Q;t[87]===ye?Q=t[88]:(Q=V(`relative flex min-h-0 min-w-0 flex-1 flex-col overflow-hidden bg-background`,ye),t[87]=ye,t[88]=Q);let $;t[89]!==O||t[90]!==q||t[91]!==_||t[92]!==te||t[93]!==pe||t[94]!==s?($=_?(0,Z.jsx)(pt,{assistant:O,onBack:q}):(0,Z.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,Z.jsx)(fe,{name:O.id,emoji:pe.avatarEmoji,size:30,label:pe.displayName||O.name}),(0,Z.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,Z.jsx)(`div`,{className:`truncate typography-ui-label font-semibold tracking-[-0.01em] text-foreground`,children:pe.displayName}),(0,Z.jsx)(`div`,{className:`mt-1 truncate typography-micro leading-none text-muted-foreground/55`,children:s(`assistants.conversation.contactHint`)})]}),(0,Z.jsx)(W,{type:`button`,variant:`ghost`,size:`icon`,className:`size-8 shrink-0 rounded-full text-muted-foreground/65 transition-colors hover:text-foreground`,onClick:te,"aria-label":s(`assistants.conversation.openSettings`),children:(0,Z.jsx)(U,{name:`settings-3`,className:`size-4`})})]}),t[89]=O,t[90]=q,t[91]=_,t[92]=te,t[93]=pe,t[94]=s,t[95]=$):$=t[95];let be;t[96]!==p||t[97]!==O||t[98]!==_||t[99]!==he?(be=(0,Z.jsx)(ct,{assistant:O,warning:he,active:p,overlayHeader:_}),t[96]=p,t[97]=O,t[98]=_,t[99]=he,t[100]=be):be=t[100];let xe;t[101]!==Q||t[102]!==$||t[103]!==be?(xe=(0,Z.jsxs)(`div`,{className:Q,children:[$,be]}),t[101]=Q,t[102]=$,t[103]=be,t[104]=xe):xe=t[104];let Se;return t[105]!==ge||t[106]!==ve||t[107]!==xe?(Se=(0,Z.jsxs)(`div`,{className:`relative flex h-full min-h-0 overflow-hidden bg-background`,"data-presentation":`workspace`,children:[ge,ve,xe]}),t[105]=ge,t[106]=ve,t[107]=xe,t[108]=Se):Se=t[108],Se};function gt(e){return e.activeMainTab===`assistant`}function _t(e){return e.isMobile}function vt(e){return e.selectAssistant}function yt(e){return e.requestCreate}function bt(){i.getState().setActiveMainTab(`chat`)}export{fe as a,he as i,ft as n,ut as r,ht as t};
@@ -1,2 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/MarkstreamRendererImpl-BFdJzxia.js","assets/rolldown-runtime-C0FnF6B9.js","assets/vendor-base-ui-CnHfUmDN.js","assets/vendor-react-DLPElpoQ.js","assets/vendor-markstream-react-DX55XLGO.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-reactuses-core-DDoDDyM9.js","assets/vendor-lodash-es-DfLbG5Af.js","assets/vendor-js-cookie-hSOiFTtX.js","assets/useMobileNavigationStore-C8_J-qTp.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-CU2ChP0J.js","assets/markdownHeightCache-CYDlisxr.js","assets/MarkdownRendererImpl-DB4Q3kGa.js","assets/vendor-katex--B5dHUyk.js","assets/markdownTheme-DyJ4Gfcj.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/markdown-worker-CTsrtpPh.js","assets/FadeInOnReveal-CTlNE4Hg.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","assets/MarkstreamRendererImpl-DKhVy3nF.css"])))=>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{a as s,n as c,t as l}from"./markdownHeightCache-CYDlisxr.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.12:${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-BFdJzxia.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,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54])).catch(e=>{throw A=null,e}),A),M=()=>{j().catch(()=>void 0)},N=null,P=()=>(N??=i(()=>import(`./MarkdownRendererImpl-DB4Q3kGa.js`).then(e=>e.n),__vite__mapDeps([34,1,13,14,2,15,16,3,17,18,19,5,35,9,10,11,22,23,12,20,21,24,25,26,27,28,29,36,37,38,39,40,41,42,43,44,45,46,30,31,47,33,32,48,49,50,51,52,53])).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};
@@ -1 +0,0 @@
1
- import{o as e}from"./rolldown-runtime-C0FnF6B9.js";import{E as t,w as n}from"./useUIStore-CuaA8-Hp.js";import{kn as r,u as i}from"./persistence-DdUac14I.js";import{nt as a,rt as o}from"./vendor-base-ui-CnHfUmDN.js";import{n as s}from"./vendor-react-DLPElpoQ.js";import{s as c}from"./vendor-tanstack-react-query-D7pys_c9.js";import{Do as l,Oo as u}from"./useMobileNavigationStore-C8_J-qTp.js";import{t as d}from"./utils-BiK3tBGM.js";import{n as f}from"./Icon-BYM02QyU.js";import{t as p}from"./button-C0cth9tl.js";var m=e(o(),1),h=s(),g=async(e,t)=>{try{let t=await e.json();if(t&&typeof t.error==`string`&&t.error.trim().length>0)return t.error}catch{return t}return t},_=e=>{let t=typeof e==`string`?e.trim():``;if(!t)throw Error(`projectId is required`);return t},v=e=>e===null||typeof e==`string`,y=e=>e===null||typeof e==`number`&&Number.isFinite(e),b=e=>typeof e==`number`&&Number.isFinite(e)&&e>=0&&e<=864e13,x=e=>e===null||b(e),S=e=>{if(!e||typeof e!=`object`||Array.isArray(e))return!1;let t=e;return typeof t.id==`string`&&t.id.length>0&&typeof t.projectId==`string`&&t.projectId.length>0&&typeof t.taskId==`string`&&t.taskId.length>0&&typeof t.taskName==`string`&&(t.trigger===`scheduled`||t.trigger===`manual`)&&(t.status===`running`||t.status===`success`||t.status===`error`)&&v(t.sessionId)&&v(t.directory)&&v(t.error)&&b(t.startedAt)&&x(t.finishedAt)&&y(t.durationMs)&&(t.durationMs===null||t.durationMs>=0)},C=e=>{if(!e||typeof e!=`object`||Array.isArray(e))throw Error(`Malformed scheduled task runs response`);let t=e;if(!Array.isArray(t.runs)||!t.runs.every(S)||!v(t.nextCursor)||typeof t.complete!=`boolean`||t.complete!==(t.nextCursor===null)||t.nextCursor!==null&&t.nextCursor.length===0)throw Error(`Malformed scheduled task runs response`);return{runs:t.runs,nextCursor:t.nextCursor,complete:t.complete}},w=async(e,t)=>{let n=new URLSearchParams;e.before&&n.set(`before`,e.before);let i=e.limit??20;if(!Number.isInteger(i)||i<1)throw Error(`limit must be a positive integer`);n.set(`limit`,String(i)),e.projectId&&n.set(`projectId`,e.projectId),e.taskId&&n.set(`taskId`,e.taskId);let a=await r(`/api/openchamber/scheduled-task-runs?${n.toString()}`,{signal:t});if(!a.ok)throw Error(await g(a,`Failed to load scheduled task history`));return C(await a.json().catch(()=>null))},T=async()=>{let e=await r(`/api/openchamber/scheduled-tasks`);if(!e.ok)throw Error(await g(e,`Failed to load schedules`));let t=await e.json().catch(()=>null);return{tasks:Array.isArray(t?.tasks)?t.tasks:[],failedProjectIds:Array.isArray(t?.failedProjectIds)?t.failedProjectIds.filter(e=>typeof e==`string`):[]}},E=async(e,t)=>{let n=_(e),i=await r(`/api/projects/${encodeURIComponent(n)}/scheduled-tasks`,{method:`PUT`,headers:{"content-type":`application/json`,accept:`application/json`},body:JSON.stringify({task:t})});if(!i.ok)throw Error(await g(i,`Failed to save schedule`));let a=await i.json().catch(()=>null);return!a||!Array.isArray(a.tasks)?[]:a.tasks},D=async(e,t)=>{let n=_(e),i=_(t),a=await r(`/api/projects/${encodeURIComponent(n)}/scheduled-tasks/${encodeURIComponent(i)}`,{method:`DELETE`,headers:{accept:`application/json`}});if(!a.ok)throw Error(await g(a,`Failed to delete schedule`));let o=await a.json().catch(()=>null);return!o||!Array.isArray(o.tasks)?[]:o.tasks},O=async(e,t)=>{let n=_(e),i=_(t),a=await r(`/api/projects/${encodeURIComponent(n)}/scheduled-tasks/${encodeURIComponent(i)}/run`,{method:`POST`,headers:{accept:`application/json`}});if(!a.ok)throw Error(await g(a,`Failed to run schedule`));let o=await a.json().catch(()=>null);return{sessionId:typeof o?.sessionId==`string`&&o.sessionId.length>0?o.sessionId:void 0}},k=class extends Error{code;status;resource;constructor(e,t,n,r){super(typeof r==`string`&&r.trim()?r.trim():e),this.code=e,this.status=t,this.resource=n}},A=e=>{if(!e||typeof e!=`object`)return!1;let t=`name`in e?String(e.name):``;return t===`AbortError`||t===`TimeoutError`},j=class extends k{operation;constructor(e,t,n){super(e,t,`share_operation`),this.operation=n}},M=(e,t=200)=>{throw new k(`invalid_${e}_response`,t,e)},N=(e,t)=>e&&typeof e==`object`&&!Array.isArray(e)?e:M(t),P=(e,t)=>typeof e==`string`?e:M(t),F=(e,t)=>e===null||typeof e==`string`?e:M(t),I=(e,t)=>typeof e==`number`&&Number.isFinite(e)?e:M(t),L=(e,t)=>e===null?null:I(e,t),R=(e,t)=>typeof e==`boolean`?e:M(t),z=(e,t,n)=>t.includes(e)?e:M(n),B=e=>{let t=N(e,`capability`);return{supported:R(t.supported,`capability`),enabled:R(t.enabled,`capability`),revision:I(t.revision,`capability`),serverInstanceID:F(t.serverInstanceID,`capability`)}},V=e=>{let t=N(e,`assistant`),n=Array.isArray(t.historySessionIDs)?t.historySessionIDs.map(e=>P(e,`assistant`)):[],r=t.historySessionCount===void 0?n.length:I(t.historySessionCount,`assistant`);if(!Number.isSafeInteger(r)||r<n.length)return M(`assistant`);let i=Array.isArray(t.assignedSessionIDs)?t.assignedSessionIDs.map(e=>P(e,`assistant`)):[];return{id:P(t.id,`assistant`),revision:I(t.revision,`assistant`),enabled:R(t.enabled,`assistant`),name:P(t.name,`assistant`),defaultPrompt:P(t.defaultPrompt,`assistant`),workspacePath:F(t.workspacePath,`assistant`),effectiveWorkspacePath:P(t.effectiveWorkspacePath,`assistant`),managedWorkspacePath:F(t.managedWorkspacePath??null,`assistant`),providerID:P(t.providerID,`assistant`),modelID:P(t.modelID,`assistant`),agent:F(t.agent,`assistant`),variant:F(t.variant??null,`assistant`),mode:z(t.mode,[`continuous`,`stateless`],`assistant`),sessionID:F(t.sessionID,`assistant`),sessionGeneration:I(t.sessionGeneration,`assistant`),historySessionIDs:n,historySessionCount:r,assignedSessionIDs:i,working:t.working!==void 0&&R(t.working,`assistant`),createdAt:L(t.createdAt,`assistant`),updatedAt:I(t.updatedAt,`assistant`),tombstoneAt:L(t.tombstoneAt,`assistant`)}},ee=e=>{let t=N(e,`snapshot`);return{revision:I(t.revision,`snapshot`),enabled:R(t.enabled,`snapshot`),assistants:Array.isArray(t.assistants)?t.assistants.map(V):M(`snapshot`)}},te=e=>{let t=N(e,`binding`);return{sessionID:F(t.sessionID,`binding`),directory:P(t.directory,`binding`),sessionGeneration:I(t.sessionGeneration,`binding`)}},ne=e=>{let t=N(e,`message_admission`);return t.admitted===!0?{binding:te(t.binding),messageID:P(t.messageID,`message_admission`),admitted:!0}:M(`message_admission`)},H=e=>{let t=N(e,`share_operation`);return{operationID:P(t.operationID,`share_operation`),assistantID:P(t.assistantID,`share_operation`),sessionID:F(t.sessionID,`share_operation`),messageID:F(t.messageID,`share_operation`),state:z(t.state,[`submitting`,`running`,`completed`,`failed`,`unresolved`],`share_operation`),phase:P(t.phase,`share_operation`),attempt:I(t.attempt,`share_operation`),leaseExpiresAt:L(t.leaseExpiresAt,`share_operation`),errorCode:F(t.errorCode,`share_operation`)}},U=e=>{let t=N(e,`assistant_contact_part`);if(t.type===`text`)return{type:`text`,text:P(t.text,`assistant_contact_part`)};if(t.type===`file`){let e=t.filename===void 0||t.filename===null?void 0:P(t.filename,`assistant_contact_part`);return{type:`file`,mime:P(t.mime,`assistant_contact_part`),url:P(t.url,`assistant_contact_part`),...e?{filename:e}:{}}}if(t.type===`card`){let e=z(t.cardType,[`session`,`assistant`,`schedule`],`assistant_contact_part`);return e===`session`?{type:`card`,cardType:`session`,sessionID:P(t.sessionID,`assistant_contact_part`),directory:P(t.directory,`assistant_contact_part`),title:F(t.title??null,`assistant_contact_part`),status:F(t.status??null,`assistant_contact_part`),branch:F(t.branch??null,`assistant_contact_part`)}:e===`assistant`?{type:`card`,cardType:`assistant`,assistantID:P(t.assistantID,`assistant_contact_part`),name:P(t.name,`assistant_contact_part`),providerID:P(t.providerID,`assistant_contact_part`),modelID:P(t.modelID,`assistant_contact_part`),mode:z(t.mode??`continuous`,[`continuous`,`stateless`],`assistant_contact_part`)}:{type:`card`,cardType:`schedule`,taskID:P(t.taskID,`assistant_contact_part`),projectID:P(t.projectID,`assistant_contact_part`),name:P(t.name,`assistant_contact_part`),kind:F(t.kind??null,`assistant_contact_part`),time:F(t.time??null,`assistant_contact_part`),timezone:F(t.timezone??null,`assistant_contact_part`),prompt:F(t.prompt??null,`assistant_contact_part`)}}return M(`assistant_contact_part`)},re=e=>{let t=N(e,`assistant_contact`),n=F(t.nextCursor,`assistant_contact`),r=R(t.complete,`assistant_contact`);return!r&&!n||r&&n||!Array.isArray(t.messages)?M(`assistant_contact`):{messages:t.messages.map(e=>{let t=N(e,`assistant_contact_message`);if(!Array.isArray(t.parts))return M(`assistant_contact_message`);let n=t.parts.map(U);return{messageID:P(t.messageID,`assistant_contact_message`),assistantID:P(t.assistantID,`assistant_contact_message`),role:z(t.role,[`user`,`assistant`,`peer`],`assistant_contact_message`),turnID:P(t.turnID,`assistant_contact_message`),bubbleIndex:I(t.bubbleIndex,`assistant_contact_message`),createdAt:I(t.createdAt,`assistant_contact_message`),ordinal:I(t.ordinal,`assistant_contact_message`),status:P(t.status,`assistant_contact_message`),fromAssistantID:F(t.fromAssistantID??null,`assistant_contact_message`),fromAssistantName:F(t.fromAssistantName??null,`assistant_contact_message`),parts:n,text:typeof t.text==`string`?t.text:n.filter(e=>e.type===`text`).map(e=>e.text).join(``),cards:n.filter(e=>e.type===`card`)}}),nextCursor:n,complete:r}},ie=e=>{let t=N(e,`assistant_scheduled_tasks`);return Array.isArray(t.tasks)?{tasks:t.tasks.map(e=>{let t=N(e,`assistant_scheduled_task`),n=t.task===null||t.task===void 0?null:N(t.task,`assistant_scheduled_task_live`);return{assistantID:P(t.assistantID,`assistant_scheduled_task`),projectID:P(t.projectID,`assistant_scheduled_task`),taskID:P(t.taskID,`assistant_scheduled_task`),createdAt:I(t.createdAt,`assistant_scheduled_task`),projectPath:F(t.projectPath??null,`assistant_scheduled_task`),projectLabel:F(t.projectLabel??null,`assistant_scheduled_task`),task:n}})}:M(`assistant_scheduled_tasks`)},W={snapshot:(e=t())=>[e,`assistants`,`snapshot`],capability:(e=t())=>[e,`assistants`,`capability`],history:(e,r,i,a=t(),o=n())=>[a,o,`assistants`,`history`,e,r,i],contact:(e,r=t(),i=n())=>[r,i,`assistants`,`contact`,e],scheduledTasks:(e,r=t(),i=n())=>[r,i,`assistants`,`scheduled-tasks`,e],globalScheduledTasks:(e=t())=>[e,`scheduled-tasks`]},G=async(e,t={})=>{let n=await r(e,t),i=await n.json().catch(()=>null);if(!n.ok){let e=i&&typeof i==`object`&&`error`in i&&typeof i.error==`string`?i.error:`request_failed`,t=i&&typeof i==`object`&&`message`in i&&typeof i.message==`string`?i.message:void 0;throw new k(e,n.status,void 0,t)}return i},K=(e,t)=>({method:e,headers:{"Content-Type":`application/json`},body:t===void 0?void 0:JSON.stringify(t)}),q=(e,r)=>{if(t()!==e||n()!==r)throw new k(`runtime_stale`,409)},J=(e,t,r)=>{i.setQueryData(W.snapshot(r),n=>n&&{...n,assistants:n.assistants.map(n=>n.id!==e||n.sessionGeneration>t.sessionGeneration?n:{...n,sessionID:t.sessionID,sessionGeneration:t.sessionGeneration,effectiveWorkspacePath:t.directory})}),i.invalidateQueries({queryKey:W.snapshot(r)}),i.invalidateQueries({queryKey:[r,n(),`assistants`,`history`,e]})},Y=(e,t)=>{i.setQueryData(W.snapshot(t),t=>t&&{...t,assistants:t.assistants.some(t=>t.id===e.id)?t.assistants.map(t=>t.id===e.id?e:t):[...t.assistants,e]}),i.invalidateQueries({queryKey:W.snapshot(t)})},X=(e=t())=>({queryKey:W.snapshot(e),queryFn:async({signal:e})=>ee(await G(`/api/openchamber/assistants/snapshot`,{signal:e})),retry:2}),ae=()=>{let e=(0,h.c)(5),n,r,a;e[0]===Symbol.for(`react.memo_cache_sentinel`)?(a=t(),n=c,r=X(a),e[0]=n,e[1]=r,e[2]=a):(n=e[0],r=e[1],a=e[2]);let o=n(r),s,l;return e[3]===Symbol.for(`react.memo_cache_sentinel`)?(s=()=>u(e=>{if(t()!==a)return;if(e.type===`event-stream-ready`){i.invalidateQueries({queryKey:W.snapshot(a),exact:!0});return}if(e.type!==`assistants-changed`)return;let n=i.getQueryData(W.snapshot(a));(!n||e.revision>n.revision)&&i.invalidateQueries({queryKey:W.snapshot(a),exact:!0})}),l=[a],e[3]=s,e[4]=l):(s=e[3],l=e[4]),m.useEffect(s,l),o},oe=(e,r=t(),i=n())=>({queryKey:W.contact(e,r,i),queryFn:async({signal:t})=>{q(r,i),await l(),q(r,i);let n=re(await G(`/api/openchamber/assistants/${encodeURIComponent(e)}/contact/messages?limit=100`,{signal:t}));return q(r,i),n},retry:2}),se=(e,r)=>{let a=(0,h.c)(13),o=r===void 0||r,s,l,d,f;a[0]===e?(s=a[1],l=a[2],d=a[3],f=a[4]):(f=t(),s=n(),d=c,l=oe(e,f,s),a[0]=e,a[1]=s,a[2]=l,a[3]=d,a[4]=f);let p=o&&!!e,g;a[5]!==l||a[6]!==p?(g={...l,enabled:p},a[5]=l,a[6]=p,a[7]=g):g=a[7];let _=d(g),v,y;return a[8]!==e||a[9]!==s||a[10]!==f?(v=()=>u(n=>{t()===f&&(n.type===`assistants-changed`||n.type===`event-stream-ready`)&&i.invalidateQueries({queryKey:W.contact(e,f,s),exact:!0})}),y=[e,s,f],a[8]=e,a[9]=s,a[10]=f,a[11]=v,a[12]=y):(v=a[11],y=a[12]),m.useEffect(v,y),_},ce=(e,r=t(),i=n())=>({queryKey:W.scheduledTasks(e,r,i),queryFn:async({signal:t})=>{q(r,i);let n=ie(await G(`/api/openchamber/assistants/${encodeURIComponent(e)}/scheduled-tasks`,{signal:t}));return q(r,i),n},refetchOnMount:`always`,retry:(e,t)=>!(t instanceof k&&t.status===404)&&e<2}),le=(e,r)=>{let i=(0,h.c)(6),a=r===void 0||r,o,s;if(i[0]!==e){let r=t(),a=n();s=c,o=ce(e,r,a),i[0]=e,i[1]=o,i[2]=s}else o=i[1],s=i[2];let l=a&&!!e,u;return i[3]!==o||i[4]!==l?(u={...o,enabled:l},i[3]=o,i[4]=l,i[5]=u):u=i[5],s(u)},ue=(e=t())=>({queryKey:W.globalScheduledTasks(e),queryFn:T,refetchOnMount:`always`}),de=e=>{let t=(0,h.c)(3),n=e===void 0||e,r;t[0]===Symbol.for(`react.memo_cache_sentinel`)?(r=ue(),t[0]=r):r=t[0];let i;return t[1]===n?i=t[2]:(i={...r,enabled:n},t[1]=n,t[2]=i),c(i)},fe=(e,r=t())=>{i.invalidateQueries({queryKey:[r,n(),`assistants`,`contact`,e]})},pe=(e=t())=>({queryKey:W.capability(e),queryFn:()=>Q(),retry:!1}),me=()=>{let e=(0,h.c)(1),t;return e[0]===Symbol.for(`react.memo_cache_sentinel`)?(t=pe(),e[0]=t):t=e[0],c(t)},he=(e=i,n=t())=>e.getQueryData(W.snapshot(n)),ge=(e=i,n=t())=>e.fetchQuery(X(n)),_e=async(e=i)=>{let r=t(),a=n();await e.invalidateQueries({queryKey:W.snapshot(r),exact:!0}),q(r,a);let o=await e.fetchQuery(X(r));return q(r,a),o},ve=15e3,ye=e=>{throw e instanceof k?e:A(e)?new k(`admission_timeout`,408):e},be=async(e,r,i)=>{let a=t(),o=n(),s=typeof i==`string`?[{type:`text`,text:i}]:Array.isArray(i.parts)&&i.parts.length>0?i.parts:[{type:`text`,text:i.text??``}],c=AbortSignal.timeout(ve);try{let t=ne(await G(`/api/openchamber/assistants/${encodeURIComponent(e)}/messages`,{...K(`POST`,{messageID:r,parts:s}),signal:c}));return q(a,o),J(e,t.binding,a),fe(e,a),t}catch(e){return ye(e)}},xe=async(e,r,i,a,o)=>{let s=t(),c=n(),l=H(await G(`/api/openchamber/assistants/${encodeURIComponent(e)}/share`,K(`POST`,{operationID:r,payload:{messageID:i,parts:a,source:o}})));return q(s,c),l},Se=async(e,r=t(),i=n())=>{q(r,i);let a=H(await G(`/api/openchamber/assistants/share-operations/${encodeURIComponent(e)}`));return q(r,i),a},Z=async(e,r=t(),i=n())=>{let a=e;for(let e=0;e<60&&(a.state===`running`||a.state===`submitting`);e+=1)q(r,i),await new Promise(e=>setTimeout(e,750)),a=await Se(a.operationID,r,i);if(q(r,i),a.state===`completed`)return a;throw a.state===`failed`?new j(a.errorCode??`share_failed`,400,a):new j(`share_unresolved`,408,a)},Ce=async(e,n)=>{await G(`/api/openchamber/assistants/settings`,K(`PUT`,{enabled:e,expectedRevision:n}));let r=t();await Promise.all([i.invalidateQueries({queryKey:W.snapshot(r),exact:!0}),i.invalidateQueries({queryKey:W.capability(r),exact:!0})])},we=async e=>{let n=t(),r=V(await G(`/api/openchamber/assistants`,K(`POST`,e)));return Y(r,n),r},Te=async(e,r)=>{let i=t(),a=n(),o=V(await G(`/api/openchamber/assistants/${encodeURIComponent(e.id)}`,K(`PATCH`,{...r,expectedRevision:e.revision})));return q(i,a),Y(o,i),o},Ee=async e=>{await G(`/api/openchamber/assistants/${encodeURIComponent(e.id)}`,K(`DELETE`,{expectedRevision:e.revision})),await i.invalidateQueries({queryKey:W.snapshot(t())})},Q=async()=>B(await G(`/api/openchamber/assistants/capability`)),$=a();function De(e){let t=(0,h.c)(32),{title:n,subtitle:r,backAriaLabel:i,onBack:a,backDisabled:o,actions:s,trailing:c,sticky:l,overlay:u,elevated:m}=e,g=o!==void 0&&o,_;t[0]===s?_=t[1]:(_=s===void 0?[]:s,t[0]=s,t[1]=_);let v=_,y=l!==void 0&&l,b=u!==void 0&&u,x=m!==void 0&&m,S=!!c||v.length>0,C=x||v.some(ke),w=y&&`oc-mobile-detail-navigation-sticky`,T=b&&`absolute inset-x-0 top-0`,E=C?`z-[60]`:b?`z-30`:void 0,D;t[2]!==w||t[3]!==T||t[4]!==E?(D=d(`oc-mobile-detail-navigation relative shrink-0 pt-[max(0.25rem,var(--oc-safe-area-top,0px))]`,w,T,E),t[2]=w,t[3]=T,t[4]=E,t[5]=D):D=t[5];let O=S&&v.length+ +!!c>1?`grid-cols-[2.75rem_minmax(0,1fr)_auto]`:`grid-cols-[2.75rem_minmax(0,1fr)_2.75rem]`,k;t[6]===O?k=t[7]:(k=d(`oc-mobile-detail-navigation-content grid items-center gap-1 px-4`,O),t[6]=O,t[7]=k);let A;t[8]!==i||t[9]!==g||t[10]!==a?(A=a?(0,$.jsx)(p,{type:`button`,variant:`mobileGlass`,size:`mobileIcon`,className:`justify-self-start`,onClick:a,disabled:g,"aria-label":i,children:(0,$.jsx)(f,{name:`arrow-left-s`,className:`size-5`})}):(0,$.jsx)(`span`,{"aria-hidden":`true`}),t[8]=i,t[9]=g,t[10]=a,t[11]=A):A=t[11];let j;t[12]===n?j=t[13]:(j=(0,$.jsx)(`div`,{className:`oc-mobile-detail-title w-full truncate typography-ui-label font-medium text-foreground`,children:n}),t[12]=n,t[13]=j);let M;t[14]===r?M=t[15]:(M=r?(0,$.jsx)(`div`,{className:`oc-mobile-detail-subtitle w-full truncate text-muted-foreground`,"aria-live":`polite`,children:r}):null,t[14]=r,t[15]=M);let N;t[16]!==j||t[17]!==M?(N=(0,$.jsxs)(`div`,{className:`flex w-full max-w-72 min-w-0 flex-col items-center justify-center justify-self-center px-1`,children:[j,M]}),t[16]=j,t[17]=M,t[18]=N):N=t[18];let P;t[19]===v?P=t[20]:(P=v.map(Oe),t[19]=v,t[20]=P);let F;t[21]!==P||t[22]!==c?(F=(0,$.jsxs)(`div`,{className:`flex min-w-0 items-center justify-end gap-2`,children:[c,P]}),t[21]=P,t[22]=c,t[23]=F):F=t[23];let I;t[24]!==k||t[25]!==A||t[26]!==N||t[27]!==F?(I=(0,$.jsxs)(`div`,{className:k,children:[A,N,F]}),t[24]=k,t[25]=A,t[26]=N,t[27]=F,t[28]=I):I=t[28];let L;return t[29]!==D||t[30]!==I?(L=(0,$.jsx)(`header`,{className:D,children:I}),t[29]=D,t[30]=I,t[31]=L):L=t[31],L}function Oe(e,t){return(0,$.jsx)(p,{type:`button`,variant:`mobileGlass`,size:`mobileIcon`,className:d(e.elevated&&`relative z-[60]`),onClick:e.onClick,disabled:e.disabled,"aria-label":e.ariaLabel,"aria-expanded":e.pressed,title:e.title,children:(0,$.jsx)(f,{name:e.icon,className:`size-5`})},`${e.icon}:${t}`)}function ke(e){return e.elevated}export{w as C,T as S,E as T,Z as _,Q as a,A as b,be as c,Te as d,me as f,de as g,ae as h,ge as i,xe as l,le as m,we as n,_e as o,se as p,Ee as r,he as s,De as t,Ce as u,k as v,O as w,D as x,j as y};