@openchambery/web 1.17.1-beta.13 → 1.17.1-beta.15

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 (104) hide show
  1. package/dist/assets/{AgentAvatar-Coq-zdWI.js → AgentAvatar-Bms-mdYQ.js} +1 -1
  2. package/dist/assets/AssistantView-CUtQUcwu.js +1 -0
  3. package/dist/assets/{ChatContainer-BJGlptbG.js → ChatContainer-lJeTcl1C.js} +40 -40
  4. package/dist/assets/DiagramView-CY75x4V5.js +1 -0
  5. package/dist/assets/{FadeInOnReveal-1KpYuooP.js → FadeInOnReveal-EV5Qh80w.js} +1 -1
  6. package/dist/assets/{Icon-Vc-aDche.js → Icon-DFt6p0LW.js} +1 -1
  7. package/dist/assets/{MarkdownRendererImpl-B9Bv95Vd.js → MarkdownRendererImpl-Y_pR99z4.js} +2 -2
  8. package/dist/assets/MobileDetailNavigation-Chbop9JV.js +1 -0
  9. package/dist/assets/MobileShareBridge-DCeId7D-.js +4 -0
  10. package/dist/assets/MobileSurface-8zukJPC-.js +2 -0
  11. package/dist/assets/MultiRunWindow-BXk-ri0E.js +1 -0
  12. package/dist/assets/OnboardingScreen-Ce44652u.js +1 -0
  13. package/dist/assets/OverlayScrollbar-B7g5G5ND.js +1 -0
  14. package/dist/assets/SettingsView-Xx4UAq8J.js +25 -0
  15. package/dist/assets/SettingsWindow-CPP20IXh.js +1 -0
  16. package/dist/assets/TerminalView-BTh2Fr_z.js +8 -0
  17. package/dist/assets/{ToolOutputDialog-_Qzdo46T.js → ToolOutputDialog-DtR9RaL5.js} +1 -1
  18. package/dist/assets/appThemeRegistry-DuuP4ywp.js +2 -0
  19. package/dist/assets/{button-rDAIP5kY.js → button-TdqFSeGV.js} +1 -1
  20. package/dist/assets/clipboard-DZE4HSCz.js +1 -0
  21. package/dist/assets/{collapsible-nLeZm1kw.js → collapsible-BcmzZNos.js} +1 -1
  22. package/dist/assets/{context-menu-DeJdA9F6.js → context-menu-Q7z2QbNe.js} +1 -1
  23. package/dist/assets/desktopHosts-Ch7nWzqq.js +1 -0
  24. package/dist/assets/desktopRelayRestore-BhKR5E2i.js +1 -0
  25. package/dist/assets/{diagram-C7qK82ZL.js → diagram-DPzoxeQp.js} +1 -1
  26. package/dist/assets/dialog-D9nDFQe9.js +1 -0
  27. package/dist/assets/{fileQueries-D8m3PQr0.js → fileQueries-DO24BEHy.js} +1 -1
  28. package/dist/assets/{gitApi-DV6F5KKI.js → gitApi-Fpd9P1fY.js} +1 -1
  29. package/dist/assets/{gitApiHttp-BswZXfrf.js → gitApiHttp-gCfEig4j.js} +1 -1
  30. package/dist/assets/{input-CxulMZ9j.js → input-CRIOZS4l.js} +1 -1
  31. package/dist/assets/insertionBoundaries-BHlyukUf.js +1 -0
  32. package/dist/assets/main-CkMol2De.js +172 -0
  33. package/dist/assets/main-DFTaw6D9.js +2 -0
  34. package/dist/assets/{markdown-worker-DmBYud1m.js → markdown-worker-Cdsb6HMC.js} +1 -1
  35. package/dist/assets/{markdownTheme-CNJf24L-.js → markdownTheme-DXrASRAr.js} +1 -1
  36. package/dist/assets/miniChat-BuEgPrFf.js +2 -0
  37. package/dist/assets/mobile-CsVNQcOc.js +2 -0
  38. package/dist/assets/multirun-ChIqqmtD.js +4 -0
  39. package/dist/assets/{persistence-CFtygeYy.js → persistence-Dx4t3MFT.js} +1 -1
  40. package/dist/assets/projectMeta-D05KGl1X.js +3 -0
  41. package/dist/assets/radio-bGd9JnqX.js +1 -0
  42. package/dist/assets/renderElectronMiniChatApp-_ugbw2x1.js +2 -0
  43. package/dist/assets/renderMobileApp-44aa9xko.js +23 -0
  44. package/dist/assets/{runtimeConfig-D4ETkuTj.js → runtimeConfig-B2uR3gVz.js} +1 -1
  45. package/dist/assets/runtimeEndpointReset-DwFpDiRP.js +145 -0
  46. package/dist/assets/sortable-tabs-strip-BqyQrsum.js +1 -0
  47. package/dist/assets/{terminalApi-MQ285A_s.js → terminalApi-DeRDgtLC.js} +1 -1
  48. package/dist/assets/{tooltip-CbxKYhKv.js → tooltip-L0UVzQuU.js} +1 -1
  49. package/dist/assets/{url-BSalv2ov.js → url-DNSNOUnB.js} +1 -1
  50. package/dist/assets/useAppFontEffects-D1Jk_var.js +7 -0
  51. package/dist/assets/{useAssistantUIStore-DGtjM827.js → useAssistantUIStore-CKpKMQ7k.js} +1 -1
  52. package/dist/assets/useDesktopWindowControlsLayout-BCwk_-QK.js +1 -0
  53. package/dist/assets/useEffectiveDirectory-BrFuN2US.js +1 -0
  54. package/dist/assets/{useFontPreferences-C7FEHFns.js → useFontPreferences-DkEh4AWh.js} +1 -1
  55. package/dist/assets/useMobileNavigationStore-BY-JlQ1a.js +475 -0
  56. package/dist/assets/useSessionAutoCleanup-DV8RhbfX.js +1 -0
  57. package/dist/assets/{useUIStore-WQV8IuFw.js → useUIStore-CZy3uiW5.js} +1 -1
  58. package/dist/assets/{useWorkerHighlightedLines-C74ZKDtw.js → useWorkerHighlightedLines-C-mUlcw2.js} +1 -1
  59. package/dist/assets/{utils-Cwlw2GM0.js → utils-DD0PVWqD.js} +1 -1
  60. package/dist/index.html +8 -8
  61. package/dist/mini-chat.html +8 -8
  62. package/dist/mobile.html +8 -8
  63. package/package.json +1 -1
  64. package/server/index.d.ts +2 -0
  65. package/server/index.js +3 -0
  66. package/server/lib/desktop-hosts/routes.js +7 -2
  67. package/server/lib/desktop-hosts/routes.test.js +33 -0
  68. package/server/lib/opencode/DOCUMENTATION.md +1 -1
  69. package/server/lib/opencode/bootstrap-runtime.js +2 -0
  70. package/server/lib/opencode/openchamber-routes.js +2 -0
  71. package/server/lib/opencode/settings-runtime.js +1 -1
  72. package/dist/assets/AssistantView-BXLxZXL5.js +0 -1
  73. package/dist/assets/DiagramView-Czx_DVw0.js +0 -1
  74. package/dist/assets/MobileDetailNavigation-RupyXzPu.js +0 -1
  75. package/dist/assets/MobileShareBridge-LVT1_q5C.js +0 -4
  76. package/dist/assets/MobileSurface-BVwSEqn4.js +0 -2
  77. package/dist/assets/MultiRunWindow-C7hbEpv9.js +0 -1
  78. package/dist/assets/OnboardingScreen-CrekVj31.js +0 -1
  79. package/dist/assets/OverlayScrollbar-vZXoSFA9.js +0 -1
  80. package/dist/assets/SettingsView-C1sYcHr1.js +0 -25
  81. package/dist/assets/SettingsWindow-MtcqpoiN.js +0 -1
  82. package/dist/assets/TerminalView-DXQZlHNA.js +0 -8
  83. package/dist/assets/appThemeRegistry-Chv6_pxq.js +0 -2
  84. package/dist/assets/desktopHosts-RE7NIkeq.js +0 -1
  85. package/dist/assets/desktopRelayRestore-BzyaU7-i.js +0 -1
  86. package/dist/assets/dialog-DlUK6mj-.js +0 -1
  87. package/dist/assets/i18n-BAqcSln8.js +0 -1
  88. package/dist/assets/insertionBoundaries-7-TvMfgn.js +0 -1
  89. package/dist/assets/main-CADHVH9Y.js +0 -172
  90. package/dist/assets/main-q1V-_wWx.js +0 -2
  91. package/dist/assets/miniChat-VXuyA8mS.js +0 -2
  92. package/dist/assets/mobile-CaKZM4y3.js +0 -2
  93. package/dist/assets/multirun-QqMnIbXa.js +0 -4
  94. package/dist/assets/projectMeta-WJhNyk90.js +0 -3
  95. package/dist/assets/radio-C1riLnF0.js +0 -1
  96. package/dist/assets/renderElectronMiniChatApp-CnmMV1o9.js +0 -2
  97. package/dist/assets/renderMobileApp-Bhe41b2q.js +0 -23
  98. package/dist/assets/runtimeEndpointReset-GtJt8YhT.js +0 -145
  99. package/dist/assets/sortable-tabs-strip-Fiq5nrkF.js +0 -1
  100. package/dist/assets/ui-D5j3JxkE.js +0 -475
  101. package/dist/assets/useAppFontEffects-CaGwli-K.js +0 -7
  102. package/dist/assets/useDesktopWindowControlsLayout-DCZXksMp.js +0 -1
  103. package/dist/assets/useEffectiveDirectory-CssNtlqg.js +0 -1
  104. package/dist/assets/useSessionAutoCleanup-B_mSwN7n.js +0 -1
package/dist/mobile.html CHANGED
@@ -63,22 +63,22 @@
63
63
  })();
64
64
  </script>
65
65
 
66
- <script type="module" crossorigin src="/assets/mobile-CaKZM4y3.js"></script>
66
+ <script type="module" crossorigin src="/assets/mobile-CsVNQcOc.js"></script>
67
67
  <link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-C0FnF6B9.js">
68
68
  <link rel="modulepreload" crossorigin href="/assets/vendor-base-ui-CnHfUmDN.js">
69
69
  <link rel="modulepreload" crossorigin href="/assets/vendor-zustand-B4dlGEM2.js">
70
- <link rel="modulepreload" crossorigin href="/assets/useUIStore-WQV8IuFw.js">
70
+ <link rel="modulepreload" crossorigin href="/assets/useUIStore-CZy3uiW5.js">
71
71
  <link rel="modulepreload" crossorigin href="/assets/vendor-pathe-vBmvQE8f.js">
72
72
  <link rel="modulepreload" crossorigin href="/assets/vendor-react-DLPElpoQ.js">
73
73
  <link rel="modulepreload" crossorigin href="/assets/vendor-tanstack-query-core-BWz0ose6.js">
74
- <link rel="modulepreload" crossorigin href="/assets/persistence-CFtygeYy.js">
75
- <link rel="modulepreload" crossorigin href="/assets/desktopHosts-RE7NIkeq.js">
76
- <link rel="modulepreload" crossorigin href="/assets/desktopRelayRestore-BzyaU7-i.js">
74
+ <link rel="modulepreload" crossorigin href="/assets/persistence-Dx4t3MFT.js">
75
+ <link rel="modulepreload" crossorigin href="/assets/desktopHosts-Ch7nWzqq.js">
76
+ <link rel="modulepreload" crossorigin href="/assets/desktopRelayRestore-BhKR5E2i.js">
77
77
  <link rel="modulepreload" crossorigin href="/assets/vendor-opencode-sdk-C07HQypa.js">
78
78
  <link rel="modulepreload" crossorigin href="/assets/vendor-aparajita-capacitor-secure-storage-CjQdwfjS.js">
79
- <link rel="modulepreload" crossorigin href="/assets/gitApiHttp-BswZXfrf.js">
80
- <link rel="modulepreload" crossorigin href="/assets/terminalApi-MQ285A_s.js">
81
- <link rel="modulepreload" crossorigin href="/assets/runtimeConfig-D4ETkuTj.js">
79
+ <link rel="modulepreload" crossorigin href="/assets/gitApiHttp-gCfEig4j.js">
80
+ <link rel="modulepreload" crossorigin href="/assets/terminalApi-DeRDgtLC.js">
81
+ <link rel="modulepreload" crossorigin href="/assets/runtimeConfig-B2uR3gVz.js">
82
82
  <link rel="stylesheet" crossorigin href="/assets/src-DrgsP0XF.css">
83
83
  </head>
84
84
  <body class="h-full bg-background text-foreground">
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openchambery/web",
3
- "version": "1.17.1-beta.13",
3
+ "version": "1.17.1-beta.15",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "main": "./server/index.js",
package/server/index.d.ts CHANGED
@@ -23,6 +23,8 @@ export interface StartWebUiServerOptions {
23
23
  messageQueueAttachmentRoot?: string | null;
24
24
  /** Live SSH local-forward ports for relay target-port routing (Electron). */
25
25
  getSshRoutingTable?: () => { id: string; localPort: number }[];
26
+ /** Mint a stored SSH host clientToken for a ready session (Electron). */
27
+ mintSshHostToken?: (hostId: string) => Promise<string>;
26
28
  }
27
29
 
28
30
  export declare function startWebUiServer(
package/server/index.js CHANGED
@@ -1471,6 +1471,9 @@ async function main(options = {}) {
1471
1471
  sessionIndexSyncRuntime,
1472
1472
  transcriptCacheService,
1473
1473
  getSshRoutingTable,
1474
+ mintSshHostToken: typeof options.mintSshHostToken === 'function'
1475
+ ? options.mintSshHostToken
1476
+ : undefined,
1474
1477
  getPairingSession: (id) => clientPairingRuntime.getPairingSession(id),
1475
1478
  });
1476
1479
  uiAuthController = bootstrapResult.uiAuthController;
@@ -1,13 +1,14 @@
1
1
  // Desktop SSH host listing + short-lived token mint for mobile-over-relay.
2
2
  // Protected by the global /api UI auth gate (registerAuthAndAccessRoutes).
3
3
  // Never returns clientToken from the list endpoint; token is only issued via
4
- // POST /ssh-host-token for SSH instance hosts that already store one.
4
+ // POST /ssh-host-token. Tokenless ready hosts may mint on demand.
5
5
 
6
6
  /**
7
7
  * @param {import('express').Express} app
8
8
  * @param {{
9
9
  * readSettingsFromDiskMigrated: () => Promise<object>,
10
10
  * getSshRoutingTable?: () => { id: string, localPort: number }[],
11
+ * mintSshHostToken?: (hostId: string) => Promise<string>,
11
12
  * getPairingSession?: (id: string) => Promise<{ id: string, sshHostId?: string | null, usedAt?: string | null } | null>,
12
13
  * express?: typeof import('express'),
13
14
  * logger?: Pick<Console, 'warn' | 'error'>,
@@ -17,6 +18,7 @@ export const registerDesktopHostRoutes = (app, deps) => {
17
18
  const {
18
19
  readSettingsFromDiskMigrated,
19
20
  getSshRoutingTable = () => [],
21
+ mintSshHostToken,
20
22
  getPairingSession,
21
23
  express,
22
24
  logger = console,
@@ -130,7 +132,10 @@ export const registerDesktopHostRoutes = (app, deps) => {
130
132
 
131
133
  const hostsRaw = Array.isArray(settings?.desktopHosts) ? settings.desktopHosts : [];
132
134
  const host = hostsRaw.find((entry) => typeof entry?.id === 'string' && entry.id.trim() === hostId);
133
- const token = typeof host?.clientToken === 'string' ? host.clientToken.trim() : '';
135
+ let token = typeof host?.clientToken === 'string' ? host.clientToken.trim() : '';
136
+ if (!token && typeof mintSshHostToken === 'function') {
137
+ token = String(await mintSshHostToken(hostId) || '').trim();
138
+ }
134
139
  if (!token) {
135
140
  return res.status(404).json({ error: 'host_not_found' });
136
141
  }
@@ -17,6 +17,7 @@ const createApp = ({
17
17
  settings = baseSettings,
18
18
  getSshRoutingTable = () => [],
19
19
  getPairingSession,
20
+ mintSshHostToken,
20
21
  logger = { warn: vi.fn(), error: vi.fn() },
21
22
  } = {}) => {
22
23
  const app = express();
@@ -25,6 +26,7 @@ const createApp = ({
25
26
  readSettingsFromDiskMigrated: async () => settings,
26
27
  getSshRoutingTable,
27
28
  getPairingSession,
29
+ mintSshHostToken,
28
30
  logger,
29
31
  });
30
32
  return { app, logger };
@@ -191,4 +193,35 @@ describe('desktop host routes', () => {
191
193
  .send({ hostId: 'ssh-empty' });
192
194
  expect(noToken.status).toBe(404);
193
195
  });
196
+
197
+ it('mints a token on demand when the stored SSH host is tokenless', async () => {
198
+ const mintSshHostToken = vi.fn(async (hostId) => {
199
+ expect(hostId).toBe('ssh-empty');
200
+ return 'minted-on-demand';
201
+ });
202
+ const { app } = createApp({
203
+ settings: {
204
+ desktopSshInstances: [{ id: 'ssh-empty' }],
205
+ desktopHosts: [{ id: 'ssh-empty' }],
206
+ },
207
+ getSshRoutingTable: () => [{ id: 'ssh-empty', localPort: 41234 }],
208
+ getPairingSession: async () => ({
209
+ id: 'pair_ok',
210
+ sshHostId: 'ssh-empty',
211
+ usedAt: '2026-01-01T00:00:00.000Z',
212
+ }),
213
+ mintSshHostToken,
214
+ });
215
+
216
+ const res = await request(app)
217
+ .post('/api/openchamber/ssh-host-token')
218
+ .send({ hostId: 'ssh-empty', pairingId: 'pair_ok' });
219
+ expect(res.status).toBe(200);
220
+ expect(res.body).toEqual({
221
+ token: 'minted-on-demand',
222
+ localPort: 41234,
223
+ reachable: true,
224
+ });
225
+ expect(mintSshHostToken).toHaveBeenCalledWith('ssh-empty');
226
+ });
194
227
  });
@@ -33,7 +33,7 @@ This module provides OpenCode server integration utilities for the web server ru
33
33
  - `packages/web/server/lib/opencode/tunnel-wiring-runtime.js`: active loopback-port wiring shared by pairing/LAN URLs and the private relay host.
34
34
  - `packages/web/server/lib/opencode/startup-pipeline-runtime.js`: server startup tail orchestration runtime for terminal/proxy/static/start-listen flow.
35
35
  - `packages/web/server/lib/opencode/server-utils-runtime.js`: shared server runtime utilities for OpenCode proxy wiring, OpenCode port/readiness helpers, and snapshot fetchers.
36
- - `packages/web/server/lib/opencode/openchamber-routes.js`: OpenChamber update, models metadata, session-index, and transcript-cache route registration.
36
+ - `packages/web/server/lib/opencode/openchamber-routes.js`: OpenChamber update, models metadata, session-index, transcript-cache, and desktop SSH host-token route registration. Tokenless ready SSH hosts may mint a client token on demand via Electron `mintSshHostToken`, which authenticates to the forwarded remote with the in-memory tunnel UI password.
37
37
  - `packages/web/server/lib/transcript-cache/`: opt-in Electron/local SQLite transcript cache (`/api/openchamber/transcript-cache`); default path is null so remote Web servers do not persist conversation bodies. See `transcript-cache/DOCUMENTATION.md`.
38
38
  - `packages/web/server/lib/opencode/pwa-manifest-routes.js`: PWA manifest route registration with recent-session shortcut resolution and short-lived caching.
39
39
  - `packages/web/server/lib/opencode/project-icon-routes.js`: project icon upload/read/discovery route registration and icon storage orchestration.
@@ -62,6 +62,7 @@ export const createBootstrapRuntime = (dependencies) => {
62
62
  sessionIndexSyncRuntime,
63
63
  transcriptCacheService,
64
64
  getSshRoutingTable,
65
+ mintSshHostToken,
65
66
  getPairingSession,
66
67
  } = options;
67
68
 
@@ -152,6 +153,7 @@ export const createBootstrapRuntime = (dependencies) => {
152
153
  sessionIndexSyncRuntime,
153
154
  transcriptCacheService,
154
155
  getSshRoutingTable,
156
+ mintSshHostToken,
155
157
  getPairingSession,
156
158
  express,
157
159
  });
@@ -17,6 +17,7 @@ export const registerOpenChamberRoutes = (app, dependencies) => {
17
17
  sessionIndexSyncRuntime,
18
18
  transcriptCacheService,
19
19
  getSshRoutingTable,
20
+ mintSshHostToken,
20
21
  getPairingSession,
21
22
  express,
22
23
  } = dependencies;
@@ -26,6 +27,7 @@ export const registerOpenChamberRoutes = (app, dependencies) => {
26
27
  registerDesktopHostRoutes(app, {
27
28
  readSettingsFromDiskMigrated,
28
29
  getSshRoutingTable,
30
+ mintSshHostToken,
29
31
  getPairingSession,
30
32
  express,
31
33
  });
@@ -695,7 +695,7 @@ export const createSettingsRuntime = (deps) => {
695
695
  const next = { ...settings };
696
696
 
697
697
  if (typeof settings.notifyOnSubtasks !== 'boolean') {
698
- next.notifyOnSubtasks = true;
698
+ next.notifyOnSubtasks = false;
699
699
  changed = true;
700
700
  }
701
701
  if (typeof settings.notifyOnCompletion !== 'boolean') {
@@ -1 +0,0 @@
1
- import{o as e,r as t}from"./rolldown-runtime-C0FnF6B9.js";import{D as n,T as r,j as i,t as a}from"./useUIStore-WQV8IuFw.js";import{Ot as o,et as s,rt as c,yt as l}from"./persistence-CFtygeYy.js";import{nt as u,rt as d}from"./vendor-base-ui-CnHfUmDN.js";import{n as f}from"./vendor-react-DLPElpoQ.js";import{r as p}from"./vendor-sonner-DVzioF3d.js";import{n as m}from"./vendor-reactuses-core-DDoDDyM9.js";import{t as h}from"./i18n-BAqcSln8.js";import{Ei as g,La as _,Mi as v,Pa as y,Ur as b,Xi as x,c as S,fi as C,mi as w,mn as T,nn as E,oo as D,qr as O,sn as k,so as A,vn as j,yn as M}from"./ui-D5j3JxkE.js";import{i as N,r as P}from"./useAssistantUIStore-DGtjM827.js";import{a as F,n as I,s as L}from"./MobileShareBridge-LVT1_q5C.js";import{_ as R,a as ee,c as z,d as te,f as ne,g as re,l as ie,n as ae,o as oe,p as se,r as ce,t as B,v as le,x as V,y as ue}from"./MobileDetailNavigation-RupyXzPu.js";import{t as de}from"./AgentAvatar-Coq-zdWI.js";import{t as fe}from"./utils-Cwlw2GM0.js";import{n as pe}from"./Icon-Vc-aDche.js";import{a as H,i as me,n as he,o as U,r as W,t as G}from"./dialog-DlUK6mj-.js";import{t as ge}from"./button-rDAIP5kY.js";import{i as _e}from"./OverlayScrollbar-vZXoSFA9.js";import{I as ve,L as ye,M as be,N as K,q as xe,t as q}from"./ChatContainer-BJGlptbG.js";import{a as Se,i as Ce,n as we,r as Te,t as Ee}from"./context-menu-DeJdA9F6.js";var De=f(),J=e(d(),1),Y=u(),Oe=e=>{let t=(0,De.c)(46),{assistant:n,sessionID:r,warning:i,surface:a,onRevertMessage:o,onEditMessage:s,pendingUserMessages:c,onPendingUserMessagesMaterialized:l}=e,u=n.effectiveWorkspacePath,d;t[0]!==n.sessionGeneration||t[1]!==r?(d={sessionID:r,sessionGeneration:n.sessionGeneration},t[0]=n.sessionGeneration,t[1]=r,t[2]=d):d=t[2];let f=le(n.id,d,a.active);f.data?.pages;let p;t[3]===f.data?.pages?p=t[4]:(p=f.data?.pages??[],t[3]=f.data?.pages,t[4]=p);let h;t[5]===p?h=t[6]:(h=w(p),t[5]=p,t[6]=h);let g=h,_;if(t[7]!==g){_=new Map;for(let e of g){let t=_.get(e.sessionID);_.set(e.sessionID,t===void 0||t===e.directory?e.directory:null)}t[7]=g,t[8]=_}else _=t[8];let v=_,y;t[9]===f?y=t[10]:(y=async()=>{(f.hasNextPage||f.isFetchNextPageError)&&await f.fetchNextPage()},t[9]=f,t[10]=y);let b=m(y),x=n.mode===`continuous`,S=be(),T;t[11]!==u||t[12]!==v||t[13]!==S||t[14]!==r?(T=(e,t)=>{let n=e===r?u:v.get(e);if(!n||n!==t){j(e,`missing-directory`);return}M(e,t,{phoneShell:!!(S&&!C()),switchToChat:!0})},t[11]=u,t[12]=v,t[13]=S,t[14]=r,t[15]=T):T=t[15];let E=m(T),D;t[16]===x?D=t[17]:(D={...K,forkSession:!1,navigateNestedSession:!1,mutateSession:x},t[16]=x,t[17]=D);let O;t[18]===s?O=t[19]:(O=s?{onEditMessage:s}:{},t[18]=s,t[19]=O);let k;t[20]!==u||t[21]!==o||t[22]!==E||t[23]!==r||t[24]!==a.active||t[25]!==a.surfaceID||t[26]!==D||t[27]!==O?(k={kind:`embedded`,surfaceId:a.surfaceID,sessionId:r,directory:u,active:a.active,capabilities:D,onRevertMessage:o,...O,openSourceSession:E},t[20]=u,t[21]=o,t[22]=E,t[23]=r,t[24]=a.active,t[25]=a.surfaceID,t[26]=D,t[27]=O,t[28]=k):k=t[28];let A=k,N=f.isError||f.isSuccess&&!f.hasNextPage,P=f.isLoading||f.isFetchingNextPage,F;t[29]!==b||t[30]!==N||t[31]!==g||t[32]!==P?(F={entries:g,complete:N,loading:P,fetchPrevious:b},t[29]=b,t[30]=N,t[31]=g,t[32]=P,t[33]=F):F=t[33];let I;t[34]!==u||t[35]!==l||t[36]!==o||t[37]!==c||t[38]!==r||t[39]!==A||t[40]!==a||t[41]!==F||t[42]!==i?(I={sessionId:r,directory:u,composerSurface:a,sessionSurface:A,warning:i,pendingUserMessages:c,onPendingUserMessagesMaterialized:l,assistantHistory:F,onRevertMessage:o},t[34]=u,t[35]=l,t[36]=o,t[37]=c,t[38]=r,t[39]=A,t[40]=a,t[41]=F,t[42]=i,t[43]=I):I=t[43];let L=I,R;return t[44]===L?R=t[45]:(R=(0,Y.jsx)(q,{autoOpenDraft:!1,host:L}),t[44]=L,t[45]=R),R},ke=class extends Error{constructor(){super(`assistant_selection_stale`)}},Ae=(e,t)=>e.assistantID===t.assistantID&&e.transportIdentity===t.transportIdentity&&e.runtimeGeneration===t.runtimeGeneration,je=class{onBusyChange;onError;flight=null;authoritativeIdentity=null;constructor(e,t){this.onBusyChange=e,this.onError=t}activate(e){this.authoritativeIdentity&&!Ae(this.authoritativeIdentity,e)&&this.flight&&this.retire(this.flight),this.authoritativeIdentity=e}enqueue(e,t,n){if(!this.isAuthoritative(e))return Promise.reject(new ke);let r=this.flight;r||(r={identity:e,controller:new AbortController,running:!1,desired:null,waiters:[],activeWaiters:[],idleWaiters:[],retired:!1},this.flight=r),r.desired=t;let i=new Promise((e,t)=>{r.waiters.push({resolve:e,reject:t})});return r.running||(r.running=!0,this.onBusyChange(!0),this.run(r,n)),i}async flush(e){if(!this.isAuthoritative(e))throw new ke;let t=this.flight;t?.running&&await new Promise((e,n)=>t.idleWaiters.push({resolve:e,reject:n}))}assertAuthoritative(e){if(!this.isAuthoritative(e))throw new ke}dispose(){this.flight&&this.retire(this.flight),this.authoritativeIdentity=null}async run(e,t){for(;!e.retired&&e.desired;){let n=e.desired;e.desired=null;let r=e.waiters.splice(0);e.activeWaiters=r;try{if(await t({identity:e.identity,selection:n,signal:e.controller.signal}),!e.retired)for(let e of r)e.resolve()}catch(t){if(!e.retired){this.onError(t);for(let e of r)e.reject(t)}}e.activeWaiters=[]}e.running=!1;for(let t of e.idleWaiters.splice(0))t.resolve();this.flight===e&&this.onBusyChange(!1)}retire(e){e.retired=!0,e.controller.abort();let t=new ke;for(let n of e.activeWaiters.splice(0))n.reject(t);for(let n of e.waiters.splice(0))n.reject(t);for(let n of e.idleWaiters.splice(0))n.reject(t);this.flight===e&&(this.flight=null,this.onBusyChange(!1))}isAuthoritative(e){return this.authoritativeIdentity!==null&&Ae(this.authoritativeIdentity,e)}},X=(e,t)=>{let n=t.providerID??e.providerID,r=t.modelID??e.modelID,i=n!==e.providerID||r!==e.modelID;return{enabled:e.enabled,name:e.name,defaultPrompt:e.defaultPrompt,workspacePath:e.workspacePath,providerID:n,modelID:r,agent:t.agent??null,variant:i?null:t.variant??null,mode:e.mode}},Me=async(e,t,n)=>{n.assertAuthoritative();let r=n.readSnapshot()?.assistants.find(t=>t.id===e.assistantID);if(!r)throw Error(`assistant_unavailable`);try{n.assertAuthoritative(),await n.updateAssistant(r,X(r,t)),n.assertAuthoritative()}catch(i){if(n.assertAuthoritative(),n.signal.aborted)throw new ke;if(!(i instanceof V)||i.code!==`revision_conflict`)throw i;if(n.assertAuthoritative(),r=(await n.ensureSnapshot(n.signal)).assistants.find(t=>t.id===e.assistantID),n.assertAuthoritative(),!r)throw new V(`revision_conflict`,409);n.assertAuthoritative(),await n.updateAssistant(r,X(r,t)),n.assertAuthoritative()}};async function Z(e){await ee(e);let t=N.getState().defaultShareAssistant;if(t?.assistantID!==e.id)return;let n=await z();n.serverInstanceID&&t.serverInstanceID===n.serverInstanceID&&N.getState().setDefaultShareAssistant(null)}function Ne({assistant:e,open:t,onOpenChange:n,onDeleted:r}){let{t:i}=h(),[a,o]=J.useState(!1),s=e?F(e.name).displayName||e.name:``,c=m(e=>{a&&!e||n(e)}),l=m(()=>{a||n(!1)}),u=m(async()=>{if(!(!e||a)){o(!0);try{await Z(e),r?.(e.id),n(!1),p.success(i(`assistants.settings.toast.deleted`))}catch{p.error(i(`assistants.settings.toast.deleteFailed`))}finally{o(!1)}}});return(0,Y.jsx)(G,{open:t&&e!==null,onOpenChange:c,children:(0,Y.jsxs)(he,{className:`max-w-md`,children:[(0,Y.jsxs)(H,{children:[(0,Y.jsx)(U,{children:i(`assistants.settings.delete`)}),(0,Y.jsx)(W,{children:i(`assistants.settings.deleteConfirm`,{name:s})})]}),(0,Y.jsxs)(me,{children:[(0,Y.jsx)(ge,{size:`sm`,variant:`ghost`,onClick:l,disabled:a,children:i(`settings.common.actions.cancel`)}),(0,Y.jsx)(ge,{size:`sm`,variant:`destructive`,onClick:u,disabled:a,children:i(`settings.common.actions.delete`)})]})]})})}var Pe=[0,500,1500,4e3],Fe=(e,t,n)=>{let r=!1,i=e.map(e=>e.info.id!==t||e.info.sessionID===n?e:(r=!0,{...e,info:{...e.info,sessionID:n}}));return r?i:e},Ie=e=>{let t=e.refreshDelaysMs??Pe,n=e.sleep??(e=>new Promise(t=>setTimeout(t,e)));(async()=>{for(let r of t){if(r>0&&await n(r),!e.isCurrent())return;try{await e.refresh(e.binding);break}catch{}}})()},Le=e=>`${e.transport}\u0000${e.assistantID}`,Re=e=>({transport:e.transport,assistantID:e.assistantID}),ze=(e,t)=>e.assistantID===t.assistantID&&e.sessionID===t.sessionID&&e.directory===t.directory&&e.sessionGeneration===t.sessionGeneration&&e.transport===t.transport&&e.runtimeGeneration===t.runtimeGeneration,Be=(e,t)=>e.assistantID===t.assistantID&&e.sessionID===t.sessionID&&e.directory===t.directory&&e.sessionGeneration===t.sessionGeneration&&e.messageID===t.messageID&&e.transport===t.transport&&e.runtimeGeneration===t.runtimeGeneration,Ve=()=>{let e=new Map,t=new Map,n=1,r=e=>Le(e),i=async(e,n)=>{let i=r(e),a=t.get(i)??Promise.resolve(),o,s=new Promise(e=>{o=e}),c=a.catch(()=>void 0).then(()=>s);t.set(i,c),await a.catch(()=>void 0);try{return await n()}finally{o(),t.get(i)===c&&t.delete(i)}},a=(t,i)=>{let a=r(Re(t)),o=n++;return e.set(a,{identity:t,rollback:i,token:o}),o},o=t=>e.get(r(t))?.identity,s=t=>e.delete(r(t)),c=async e=>i(e,()=>s(e)),l=async t=>{let n=r(t),i=e.get(n);if(!i)return{kind:`none`};let a=i.token,o=i.identity,s;try{s=await i.rollback()}catch{return{kind:`blocked`,status:`failed`}}let c=e.get(n);return!c||c.token!==a||!Be(c.identity,o)?{kind:`superseded`}:s.status===`rolled-back`||s.status===`conflict`?(e.delete(n),{kind:`cleared`,status:s.status}):{kind:`blocked`,status:s.status}},u=async(t,n)=>{let i=r(t),a=e.get(i);if(!a)return{kind:`none`};if(ze(a.identity,n))return{kind:`match`};let o=a.token,s=a.identity,c=await a.rollback(),l=e.get(i);return!l||l.token!==o||!Be(l.identity,s)?{kind:`superseded`}:c.status===`rolled-back`||c.status===`conflict`?(e.delete(i),{kind:`cleared`,status:c.status}):{kind:`rollback_failed`,retained:!0,status:c.status}};return{register:a,read:o,clear:s,clearExclusive:c,retireCurrent:l,rollbackAndClearIfBindingMismatch:async(e,t)=>i(e,()=>u(e,t)),rollbackAllBestEffort:async t=>{let n=[...e.entries()];await Promise.all(n.map(async([,n])=>{if(t?.excludeTransport!==void 0&&n.identity.transport===t.excludeTransport)return;let a=Re(n.identity);await i(a,async()=>{let t=r(a),i=e.get(t);if(!i||i.token!==n.token)return;let o=i.token,s=i.identity;try{let n=await i.rollback(),r=e.get(t);if(!r||r.token!==o||!Be(r.identity,s))return;(n.status===`rolled-back`||n.status===`conflict`)&&e.delete(t)}catch{}})}))},stageExclusive:async(e,t)=>i(e,async()=>{let n=await l(e);if(n.kind===`blocked`)return{kind:`blocked`,status:n.status};let r=await t();if(!r)return{kind:`skipped`};let i=a(r.identity,r.rollback);return r.protectOnStale?{kind:`stale_protected`,token:i,identity:r.identity}:{kind:`registered`,token:i,identity:r.identity}})}},He=(e,t)=>!e?.attachments?.length||!t?[]:e.attachments.flatMap(e=>{let n=t[e.attachmentRefID];return n?[n]:[]}),Ue=(e,t)=>{let n=t??{};return e.map(e=>({partID:e.partID,text:e.text,...e.synthetic===!0?{synthetic:!0}:{},attachments:e.attachments.flatMap(e=>n[e.attachmentRefID]?[n[e.attachmentRefID]]:[])}))},We=(e,t)=>{if(t.length===0)return[...e];let n=new Map;for(let t of e)n.set(t.partID,t);for(let e of t)n.set(e.partID,e);let r=new Set,i=[];for(let t of e){let e=n.get(t.partID);e&&(i.push(e),r.add(t.partID))}for(let e of t)r.has(e.partID)||(i.push(e),r.add(e.partID));return i},Ge=t({AssistantView:()=>Qe}),Ke={},qe=[],Je=[],Ye=(e,t,n)=>[...e===void 0?[]:[{type:`text`,text:e}],...(t??[]).flatMap(e=>[{type:`text`,text:e.text,...e.synthetic===!0?{synthetic:!0}:{}},...(e.attachments??[]).map(e=>({type:`file`,mime:e.mimeType,url:e.dataUrl}))]),...(n??[]).map(e=>({type:`file`,mime:e.mimeType,url:e.dataUrl}))],Xe=e=>{let t=(0,De.c)(11),{assistant:n,onBack:r}=e,{t:i}=h(),a;t[0]===n?a=t[1]:(a=n?F(n.name):null,t[0]=n,t[1]=a);let o=a,s=n&&o?o.displayName||n.name:``,c;t[2]!==s||t[3]!==i?(c=s||i(`assistants.title`),t[2]=s,t[3]=i,t[4]=c):c=t[4];let l;t[5]===i?l=t[6]:(l=i(`assistants.actions.backToChat`),t[5]=i,t[6]=l);let u;return t[7]!==r||t[8]!==c||t[9]!==l?(u=(0,Y.jsx)(B,{title:c,backAriaLabel:l,onBack:r}),t[7]=r,t[8]=c,t[9]=l,t[10]=u):u=t[10],u},Ze=e=>{let t=(0,De.c)(45),{assistantID:n,displayName:r,avatarEmoji:i,modeLabel:a,selected:o,enabled:s,editLabel:c,deleteLabel:l,onSelect:u,onEdit:d,onDelete:f}=e,[p,h]=J.useState(!1),g;t[0]===u?g=t[1]:(g=()=>u(),t[0]=u,t[1]=g);let _=m(g),v;t[2]===d?v=t[3]:(v=()=>{h(!1),d()},t[2]=d,t[3]=v);let y=m(v),b;t[4]===f?b=t[5]:(b=()=>{h(!1),f()},t[4]=f,t[5]=b);let x=m(b),S;t[6]===Symbol.for(`react.memo_cache_sentinel`)?(S=e=>{e.preventDefault(),h(!0)},t[6]=S):S=t[6];let C=o?`border-border/50 bg-[var(--surface-elevated)]`:`border-transparent hover:bg-interactive-hover`,w=!s&&`opacity-65`,T;t[7]!==C||t[8]!==w?(T=fe(`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,transform,opacity] duration-150 ease-out active:scale-[0.995] 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]!==o||t[12]!==T?(E=(0,Y.jsx)(`button`,{type:`button`,role:`option`,"aria-selected":o,onClick:_,onContextMenu:S,className:T}),t[10]=_,t[11]=o,t[12]=T,t[13]=E):E=t[13];let D;t[14]!==n||t[15]!==i||t[16]!==r?(D=(0,Y.jsx)(de,{name:n,emoji:i,size:24,label:r}),t[14]=n,t[15]=i,t[16]=r,t[17]=D):D=t[17];let O;t[18]===r?O=t[19]:(O=(0,Y.jsx)(`span`,{className:`block truncate typography-ui-label font-medium`,children:r}),t[18]=r,t[19]=O);let k;t[20]===a?k=t[21]:(k=(0,Y.jsx)(`span`,{className:`mt-0.5 block truncate typography-micro text-muted-foreground`,children:a}),t[20]=a,t[21]=k);let A;t[22]!==O||t[23]!==k?(A=(0,Y.jsxs)(`span`,{className:`min-w-0 flex-1`,children:[O,k]}),t[22]=O,t[23]=k,t[24]=A):A=t[24];let j;t[25]!==A||t[26]!==E||t[27]!==D?(j=(0,Y.jsxs)(Se,{render:E,children:[D,A]}),t[25]=A,t[26]=E,t[27]=D,t[28]=j):j=t[28];let M;t[29]===Symbol.for(`react.memo_cache_sentinel`)?(M=(0,Y.jsx)(pe,{name:`edit`,className:`size-4`}),t[29]=M):M=t[29];let N;t[30]!==c||t[31]!==y?(N=(0,Y.jsxs)(Te,{onClick:y,children:[M,c]}),t[30]=c,t[31]=y,t[32]=N):N=t[32];let P;t[33]===Symbol.for(`react.memo_cache_sentinel`)?(P=(0,Y.jsx)(Ce,{}),t[33]=P):P=t[33];let F;t[34]===Symbol.for(`react.memo_cache_sentinel`)?(F=(0,Y.jsx)(pe,{name:`delete-bin`,className:`size-4`}),t[34]=F):F=t[34];let I;t[35]!==l||t[36]!==x?(I=(0,Y.jsxs)(Te,{onClick:x,className:`text-[var(--status-error)] focus:text-[var(--status-error)] data-[highlighted]:text-[var(--status-error)] [&_svg]:text-[var(--status-error)]`,children:[F,l]}),t[35]=l,t[36]=x,t[37]=I):I=t[37];let L;t[38]!==N||t[39]!==I?(L=(0,Y.jsxs)(we,{className:`min-w-[10rem]`,children:[N,P,I]}),t[38]=N,t[39]=I,t[40]=L):L=t[40];let R;return t[41]!==p||t[42]!==j||t[43]!==L?(R=(0,Y.jsxs)(Ee,{open:p,onOpenChange:h,children:[j,L]}),t[41]=p,t[42]=j,t[43]=L,t[44]=R):R=t[44],R},Qe=({activeOverride:e,onMobileBack:t})=>{let{t:u}=h(),{isMobile:d}=_e(),f=be(),C=J.useSyncExternalStore(i,n,n),w=r(),j=a(e=>e.activeMainTab===`assistant`),M=e??j,ee=a(e=>e.isMobile),z=d||ee,B=R(),le=ue(),V=le.data,H=N(e=>e.assistantByTransport[C]??null),me=N(e=>e.selectAssistant),he=N(e=>e.requestCreate),U=V?.assistants.find(e=>e.id===H)??null,W=U?.id??``,G=U?.sessionID??``,K=U?.effectiveWorkspacePath??``,q=J.useMemo(()=>o({transportIdentity:C},`assistant:${W}`),[W,C]),Se=l(q),Ce=v(e=>e.draftAttachmentViews[Se]??Ke),we=v(e=>e.drafts[Se]),Te=J.useMemo(()=>{let e=He(we,Ce);return e.length===0?qe:e},[Ce,we]),Ee=we?.attachments,De=we?.syntheticParts,Ae=J.useMemo(()=>!Ee||!De?``:`${Ee.map(e=>e.attachmentRefID).join(``)}\u0004${De.map(e=>`${e.partID}\u0002${e.attachments.map(e=>e.attachmentRefID).join(``)}`).join(``)}`,[Ee,De]);J.useEffect(()=>{W&&v.getState().hydrateDraftAttachments(q)},[W,q,Ae]);let X=A(K||null,{enabled:!!K&&M}),Z=D(K||null,{enabled:!!K&&M}),Pe=E(G,K||void 0),Le=k(G,K||void 0),ze=T(G),Be=xe(),[Ge,Qe]=J.useState(()=>new Map),$e=J.useRef(0),et=J.useRef(Ve()),tt=Ge.get(W)??Je,[,nt]=J.useState(!1),rt=J.useRef(()=>{});rt.current=()=>{p.error(u(`assistants.composer.selectionSaveFailed`))};let it=J.useRef(null);it.current||=new je(nt,e=>rt.current(e));let at=J.useMemo(()=>({assistantID:W,transportIdentity:C,runtimeGeneration:w}),[W,w,C]),Q=it.current,ot=J.useMemo(()=>({transport:C,assistantID:W}),[W,C]),st=m(async(e,t=C)=>{await et.current.clearExclusive({transport:t,assistantID:e})}),ct=m(e=>{et.current.rollbackAllBestEffort(e).catch(()=>void 0)});J.useEffect(()=>{!H&&V?.assistants[0]&&me(V.assistants[0].id)},[me,H,V?.assistants]),J.useEffect(()=>{le.isSuccess&&H&&!U&&me(V?.assistants[0]?.id??null)},[U,me,H,V?.assistants,le.isSuccess]),J.useEffect(()=>{M&&W&&!G&&oe(W)},[M,W,G]),J.useEffect(()=>{$e.current++,Qe(new Map),ct({excludeTransport:C})},[C,w,ct]),J.useEffect(()=>()=>{$e.current++,ct()},[ct]),J.useEffect(()=>{Q.activate(at)},[Q,at]),J.useEffect(()=>()=>{Q.dispose()},[Q]),J.useEffect(()=>{W&&et.current.rollbackAndClearIfBindingMismatch(ot,{assistantID:W,sessionID:G,directory:K,sessionGeneration:U?.sessionGeneration??-1,transport:C,runtimeGeneration:w}).catch(()=>void 0)},[U?.sessionGeneration,W,K,w,G,ot,C]);let lt=m(e=>at.assistantID?Q.enqueue(at,e,async({identity:e,selection:t,signal:i})=>{await Me(e,t,{readSnapshot:()=>ne(void 0,e.transportIdentity),ensureSnapshot:e=>ie(e),updateAssistant:re,signal:i,assertAuthoritative:()=>{if(Q.assertAuthoritative(e),n()!==e.transportIdentity||r()!==e.runtimeGeneration)throw new ke}})}):Promise.reject(Error(`assistant_unavailable`))),ut=J.useMemo(()=>ye(Z.data),[Z.data]),dt=m(e=>{if(!U)return;let t=y(ut,U.agent??void 0,e);if(t){let e=_({providerID:U.providerID,modelID:U.modelID,agent:U.agent},t,ut,X.data??[]),n=e.providerID===U.providerID&&e.modelID===U.modelID;lt({...e,agent:e.agent??void 0,variant:n?U.variant??void 0:void 0})}}),$=m(async(e,t)=>{e.sessionID&&await Be.ensureSessionRenderable(e.sessionID,{directory:e.directory,...t?.force?{force:!0}:{}})}),ft=U?.sessionGeneration;J.useEffect(()=>{!M||!W||!G||!K||ft===void 0||$({sessionID:G,directory:K,sessionGeneration:ft},{force:!0})},[M,W,K,$,ft,G]);let pt=m((e,t)=>{if(t.length===0)return;let n=new Set(t);Qe(t=>{let r=t.get(e);if(!r?.some(e=>n.has(e.info.id)))return t;let i=new Map(t),a=r.filter(e=>!n.has(e.info.id));return a.length>0?i.set(e,a):i.delete(e),i})}),mt=m((e,t,n)=>{Qe(r=>{let i=r.get(e);if(!i)return r;let a=Fe(i,t,n);if(a===i)return r;let o=new Map(r);return o.set(e,a),o})}),ht=m(e=>{pt(W,e)}),gt=m(async e=>{if(!G||!K)throw Error(`assistant_unavailable`);x(G,K).some(t=>t?.id===e)&&(await b(G,e,{directory:K,draftKey:q,restorePrimaryInput:!1}),await st(W))}),_t=m(async(e,t)=>{if(!U||U.mode!==`continuous`)return;if(!G||!K)throw Error(`assistant_unavailable`);if(!x(G,K).some(t=>t?.id===e))return;if(t.info.id!==e||t.info.sessionID!==G||t.info.role!==`user`)throw Error(`The selected user message is unavailable`);let i={assistantID:U.id,sessionID:G,directory:K,sessionGeneration:U.sessionGeneration,messageID:e,transport:C,runtimeGeneration:w},a=Re(i),o=await et.current.stageExclusive(a,async()=>{let a=await O(G,e,t,{directory:K,draftKey:q}),o=n()===i.transport&&r()===i.runtimeGeneration,s=o?ne(void 0,i.transport)?.assistants.find(e=>e.id===i.assistantID):void 0,c=!!(s&&s.mode===`continuous`&&s.sessionID===i.sessionID&&s.sessionGeneration===i.sessionGeneration&&(s.effectiveWorkspacePath??``)===i.directory);if(o&&c)return{identity:i,rollback:()=>a.rollback()};let l=await a.rollback();return l.status===`failed`||l.status===`skipped`?{identity:i,rollback:()=>a.rollback(),protectOnStale:!0}:null});if(o.kind===`blocked`)throw Error(`assistant_stage_message_edit_prior_blocked`);if(o.kind===`stale_protected`)throw Error(`assistant_stage_message_edit_rollback_failed`)}),vt=J.useMemo(()=>{let e=g(q,()=>v.getState());return{busy:!1,attachments:Te,addAttachment:t=>e.addLocal(t),removeAttachment:t=>e.removeByAttachmentID(t),clearAttachments:()=>e.clearRootAttachments(),restoreAttachments:t=>e.restoreRootAttachments(t),pendingInput:null,consumePendingInput:()=>null,pendingPreset:null,consumePendingPreset:()=>null,consumeSyntheticParts:()=>{let e=v.getState(),t=e.draftAttachmentViews[l(q)]??Ke,n=e.consumeDraftSyntheticParts(q,L);return n?Ue(n,t):null},restoreSyntheticParts:e=>{(async()=>{let t=v.getState(),n=e.map(e=>({partID:e.partID??s(),text:e.text,attachments:[],...e.synthetic===!0?{synthetic:!0}:{}})),r=We(t.getDraft(q)?.syntheticParts??[],n);t.setDraftSyntheticParts(q,r);for(let r=0;r<n.length;r++){let i=n[r].partID;for(let n of e[r]?.attachments??[])n.source===`server`&&n.dataUrl?t.addDraftDurableAttachment(q,{attachmentID:n.id,filename:n.filename,mimeType:n.mimeType,size:n.size,source:`server`,url:n.dataUrl,serverPath:n.serverPath,partID:i}):await t.addDraftLocalAttachment(q,n.file,{attachmentID:n.id,filename:n.filename,source:n.source===`vscode`?`vscode`:`local`,vscodePath:n.vscodePath,vscodeSource:n.vscodeSource===`selection`?`selection`:void 0,partID:i})}})()},inlineDrafts:[],removeInlineDraft:()=>{},restoreInlineDrafts:()=>{},history:ze,captureRuntime:()=>v.getState().captureDraftRuntime(),getDraft:e=>v.getState().getDraft(e),abortPrompt:{sessionID:null,clear:()=>{}}}},[Te,q,ze]),yt=J.useMemo(()=>{let e=(X.data??[]).find(e=>e.id===U?.providerID)?.models?.find(e=>e.id===U?.modelID);return ve(e)},[U?.modelID,U?.providerID,X.data]),bt=Pe.length>0,xt=J.useMemo(()=>{if(!U||!G||!K)return null;let e={sessionID:G,directory:K,sessionGeneration:U.sessionGeneration};return{kind:`secondary`,surfaceID:`assistant:${U.id}`,active:M,sessionID:G,directory:K,draftKey:q,transportIdentity:C,runtimeGeneration:w,deliveryTarget:{kind:`assistant`,assistantID:U.id},resources:vt,...U.mode===`stateless`?{queueSessionID:`assistant:${U.id}`}:{},selection:{value:{providerID:U.providerID,modelID:U.modelID,agent:U.agent??void 0,variant:U.variant??void 0},catalog:{providers:X.data??[],agents:ut,variants:yt,variantsReady:X.isSuccess,ready:X.isSuccess&&Z.isSuccess,loading:X.isPending||Z.isPending,error:X.isError||Z.isError},change:lt,flush:()=>Q.flush(at)},activity:{phase:Le?.type===`busy`?`busy`:Le?.type===`retry`?`retry`:`idle`,canAbort:Le?.type===`busy`||Le?.type===`retry`},commands:{sessionID:G,hasMessages:bt,hasNewDraft:!1},commandPolicy:e=>e.name!==`fork`&&e.name!==`thread`,backend:{send:async t=>{let n;for(let t of x(e.sessionID,e.directory)){let e=typeof t?.id==`string`?t.id:``;/^msg_[0-9a-f]{12}[0-9A-Za-z]{14}$/.test(e)&&(!n||e>n)&&(n=e)}let r=c(`msg`,n);t.options?.commitStagedMessageEdit&&et.current.clear({transport:C,assistantID:U.id});let i=S({messageID:r,sessionID:e.sessionID,providerID:t.providerID??U.providerID,modelID:t.modelID??U.modelID,agent:t.agent??U.agent??void 0,text:t.text,attachments:t.attachments,additionalParts:t.parts});Qe(e=>{let t=new Map(e);return t.set(U.id,[...e.get(U.id)??[],i]),t});let a;try{a=await se(U.id,e,r,Ye(t.text,t.parts,t.attachments))}catch(e){throw pt(U.id,[r]),e}if(B.data?.serverInstanceID){let e=F(U.name);I({serverInstanceID:B.data.serverInstanceID,assistantID:U.id,name:e.displayName||U.name,avatarSeed:U.id,...e.avatarEmoji?{avatarEmoji:e.avatarEmoji}:{}}).catch(()=>void 0)}a.binding.sessionID&&mt(U.id,r,a.binding.sessionID);let o=$e.current;Ie({binding:a.binding,refresh:t=>$(t,{force:t.sessionID!==e.sessionID||t.sessionGeneration!==e.sessionGeneration}),isCurrent:()=>$e.current===o})},sendQueued:async()=>{throw Error(`assistant-server-queue-required`)},create:async()=>{let e=await te(U.id);await st(U.id),await $(e,{force:!0})},compact:async()=>{let t=await ce(U.id,e);await st(U.id),await $(t.binding,{force:!0})},abort:async()=>{await ae(U.id,e)}},shortcuts:{cycle:dt,new:async()=>{let e=await te(U.id);await st(U.id),await $(e,{force:!0})},abort:async()=>{await ae(U.id,e)},submit:()=>{}}}},[M,U,B.data?.serverInstanceID,lt,st,dt,K,q,bt,X.data,X.isError,X.isPending,X.isSuccess,Z.isError,Z.isPending,Z.isSuccess,$,mt,pt,vt,w,Q,at,G,Le,C,yt,ut]),St=m(()=>{if(he(),f){f.openSettings();return}let e=a.getState();e.setSettingsPage(`assistants`),e.setSettingsDialogOpen(!0)}),Ct=m(e=>{P(e,f?{openMobileSettings:f.openSettings}:void 0)}),[wt,Tt]=J.useState(null),Et=m(e=>{Tt(e)}),Dt=m(e=>{e||Tt(null)}),Ot=m(()=>{a.getState().setActiveMainTab(`chat`)}),kt=m(()=>{if(t){t();return}Ot()}),At=(e,t,n,r)=>(0,Y.jsxs)(`div`,{className:`flex h-full min-h-0 flex-col`,children:[z?(0,Y.jsx)(Xe,{assistant:U,onBack:kt}):null,(0,Y.jsxs)(`div`,{className:`flex min-h-0 flex-1 flex-col items-center justify-center px-6 text-center`,children:[(0,Y.jsx)(pe,{name:e,className:`size-6 text-muted-foreground`}),(0,Y.jsx)(`h1`,{className:`mt-4 typography-ui-header font-semibold`,children:t}),n?(0,Y.jsx)(`p`,{className:`mt-2 max-w-md typography-ui text-muted-foreground`,children:n}):null,r?(0,Y.jsx)(`div`,{className:`mt-5`,children:r}):null]})]});if(B.isPending||le.isPending)return At(`ai-agent`,u(`assistants.state.unavailable`));if(B.isError||!B.data?.supported||!B.data.enabled||!V?.enabled)return At(`cloud-off`,u(`assistants.state.unavailable`));if(!V.assistants.length)return At(`ai-agent`,u(`assistants.onboarding.title`),u(`assistants.onboarding.description`),(0,Y.jsx)(ge,{onClick:St,children:u(`assistants.onboarding.action`)}));if(!U)return At(`ai-agent`,u(`assistants.state.unavailable`));if(!xt)return(0,Y.jsxs)(`div`,{className:`flex h-full min-h-0 flex-col bg-background`,children:[z?(0,Y.jsx)(Xe,{assistant:U,onBack:kt}):null,(0,Y.jsxs)(`div`,{className:`flex min-h-0 flex-1 flex-col items-center justify-center gap-3 px-6`,"aria-busy":`true`,"aria-label":u(`assistants.state.unavailable`),children:[(0,Y.jsx)(`div`,{className:`size-10 animate-pulse rounded-xl bg-[var(--surface-muted)] motion-reduce:animate-none`}),(0,Y.jsx)(`div`,{className:`h-3.5 w-36 animate-pulse rounded-md bg-[var(--surface-muted)] motion-reduce:animate-none`})]})]});let jt=F(U.name),Mt=U.enabled?le.isError?u(`assistants.state.staleSnapshot`):null:u(`assistants.state.assistantDisabled`);return(0,Y.jsxs)(`div`,{className:`relative flex h-full min-h-0 overflow-hidden bg-background`,"data-presentation":`workspace`,children:[z?null:(0,Y.jsxs)(`section`,{className:`flex h-full min-h-0 w-[clamp(16rem,22vw,20rem)] shrink-0 flex-col overflow-hidden`,children:[(0,Y.jsx)(`header`,{className:`shrink-0 px-4 pb-3 pt-4 sm:px-5`,children:(0,Y.jsx)(`h1`,{className:`truncate typography-ui-label font-semibold text-foreground`,children:u(`assistants.title`)})}),(0,Y.jsx)(`div`,{className:`min-h-0 flex-1 overflow-y-auto px-3 pb-4 sm:px-4`,role:`listbox`,"aria-label":u(`assistants.listAria`),children:(0,Y.jsx)(`div`,{className:`flex flex-col gap-1 border-t border-border/40 pt-3`,children:V.assistants.map(e=>{let t=e.id===H,n=F(e.name);return(0,Y.jsx)(Ze,{assistantID:e.id,displayName:n.displayName,avatarEmoji:n.avatarEmoji??void 0,modeLabel:e.mode===`stateless`?u(`assistants.mode.stateless`):u(`assistants.mode.continuous`),selected:t,enabled:e.enabled,editLabel:u(`assistants.menu.edit`),deleteLabel:u(`assistants.settings.delete`),onSelect:()=>me(e.id),onEdit:()=>Ct(e.id),onDelete:()=>Et(e)},e.id)})})})]}),(0,Y.jsx)(Ne,{assistant:wt,open:wt!==null,onOpenChange:Dt}),(0,Y.jsxs)(`div`,{className:fe(`flex min-h-0 min-w-0 flex-1 flex-col overflow-hidden bg-background`,!z&&`border-l border-border/60`),children:[z?(0,Y.jsx)(Xe,{assistant:U,onBack:kt}):(0,Y.jsxs)(`header`,{className:`flex h-14 shrink-0 items-center gap-3 border-b border-border/40 px-4 sm:px-5`,children:[(0,Y.jsx)(de,{name:U.id,emoji:jt.avatarEmoji,size:24,label:jt.displayName||U.name}),(0,Y.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,Y.jsx)(`div`,{className:`truncate typography-ui-label font-medium`,children:jt.displayName}),(0,Y.jsx)(`div`,{className:`mt-0.5 truncate typography-micro leading-none text-muted-foreground/70`,children:U.mode===`stateless`?u(`assistants.conversation.statelessHint`):u(`assistants.conversation.continuousHint`)})]})]}),(0,Y.jsx)(Oe,{onRevertMessage:gt,onEditMessage:U.mode===`continuous`?_t:void 0,assistant:U,sessionID:G,warning:Mt,surface:xt,pendingUserMessages:tt,onPendingUserMessagesMaterialized:ht})]})]})};export{Ge as n,Ne as r,Qe as t};
@@ -1 +0,0 @@
1
- import{o as e}from"./rolldown-runtime-C0FnF6B9.js";import{D as t,t as n}from"./useUIStore-WQV8IuFw.js";import{nt as r,rt as i}from"./vendor-base-ui-CnHfUmDN.js";import{l as a}from"./vendor-tanstack-react-query-D7pys_c9.js";import{r as o}from"./vendor-sonner-DVzioF3d.js";import{t as s}from"./i18n-BAqcSln8.js";import{n as c}from"./Icon-Vc-aDche.js";import{n as l}from"./useRuntimeAPIs-DSLXJybW.js";import{n as u}from"./useEffectiveDirectory-CssNtlqg.js";import{n as d,r as f,t as p}from"./fileQueries-D8m3PQr0.js";import{t as m}from"./diagram-C7qK82ZL.js";var h=e(i(),1),g=r();function _(){let{t:e}=s(),{files:r}=l(),i=a(),_=u()??null,v=t(),[y,b]=h.useState(null),[x,S]=h.useState(``),C=h.useRef(null),w=h.useRef(!1),T=h.useRef(null),E=h.useRef(0),D=h.useRef(Promise.resolve()),O=n(e=>e.pendingDiagramFile),k=f({scopeDirectory:_,path:y},{enabled:!!y});if(y&&(T.current?.path!==y||T.current.transport!==v||T.current.scopeDirectory!==_)){let e=E.current+1;E.current=e,T.current={path:y,generation:e,transport:v,scopeDirectory:_}}h.useEffect(()=>(w.current=!0,()=>{w.current=!1,E.current+=1}),[]),h.useEffect(()=>{if(!O)return;let e=n.getState().consumePendingDiagramFile();if(e){let t=E.current+1;E.current=t,T.current={path:e,generation:t,transport:v,scopeDirectory:_},b(e)}},[_,O,v]),h.useEffect(()=>{let e=T.current;if(!(!e||e.path!==y||e.transport!==v||e.scopeDirectory!==_)){if(k.data!==void 0){S(k.data);return}k.isError&&S(``)}},[_,y,k.data,k.isError,v]);let A=h.useCallback(async()=>{let t=C.current?.getXml(),n=T.current,a=r?.writeFile;if(!y||!a||!t||t===x||n?.path!==y)return;let{path:s,generation:c,scopeDirectory:l,transport:u}=n,f=D.current.then(async()=>{try{if(!(await a(s,t))?.success)throw Error(e(`filesView.toast.writeFileFailed`));let n={scopeDirectory:l,path:s};await i.cancelQueries({queryKey:p(n,u),exact:!0}),d(i,n,u,t);let r=T.current;w.current&&r?.path===s&&r.generation===c&&r.transport===u&&r.scopeDirectory===l&&S(t)}catch(t){o.error(t instanceof Error?t.message:e(`filesView.toast.saveFailed`))}});D.current=f.catch(()=>void 0),await f},[y,r,i,e,x]),j=y?y.split(`/`).pop()||y:``;return y?k.isPending?(0,g.jsx)(`div`,{className:`flex h-full items-center justify-center p-3`,children:(0,g.jsx)(c,{name:`loader-4`,className:`size-4 animate-spin`})}):(0,g.jsxs)(`div`,{className:`flex h-full flex-col`,children:[(0,g.jsxs)(`div`,{className:`flex items-center gap-2 border-b border-border/30 px-3 py-1.5`,children:[(0,g.jsx)(c,{name:`file`,className:`size-4 shrink-0 text-muted-foreground`}),(0,g.jsx)(`span`,{className:`typography-ui text-muted-foreground truncate flex-1`,children:j}),(0,g.jsx)(`button`,{type:`button`,onClick:()=>void A(),className:`size-6 flex items-center justify-center rounded-md text-foreground hover:bg-interactive-hover/50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary`,title:e(`filesView.diagram.saveDiagram`),children:(0,g.jsx)(c,{name:`save-3`,className:`size-4`})}),(0,g.jsx)(`button`,{type:`button`,onClick:()=>n.getState().setActiveMainTab(`chat`),className:`size-6 flex items-center justify-center rounded-md text-muted-foreground hover:bg-interactive-hover/50 hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary`,title:e(`filesView.diagram.closeDiagramView`),children:(0,g.jsx)(c,{name:`close`,className:`size-4`})})]}),(0,g.jsx)(`div`,{className:`flex-1 min-h-0`,children:(0,g.jsx)(m,{ref:C,xml:x,className:`h-full`})})]}):(0,g.jsx)(`div`,{className:`flex h-full items-center justify-center p-3`,children:(0,g.jsx)(`div`,{className:`typography-ui text-muted-foreground`,children:e(`filesView.editor.pickFileFromTree`)})})}export{_ as DiagramView};
@@ -1 +0,0 @@
1
- import{o as e}from"./rolldown-runtime-C0FnF6B9.js";import{D as t,T as n}from"./useUIStore-WQV8IuFw.js";import{kn as r,u as i}from"./persistence-CFtygeYy.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,t as l}from"./vendor-tanstack-react-query-D7pys_c9.js";import{Cr as u,_n as d}from"./ui-D5j3JxkE.js";import{t as f}from"./utils-Cwlw2GM0.js";import{n as p}from"./Icon-Vc-aDche.js";import{t as m}from"./button-rDAIP5kY.js";var h=e(o(),1),g=s(),_=class extends Error{code;status;resource;constructor(e,t,n){super(e),this.code=e,this.status=t,this.resource=n}},v=class extends _{operation;constructor(e,t,n){super(e,t,`share_operation`),this.operation=n}},y=(e,t=200)=>{throw new _(`invalid_${e}_response`,t,e)},b=(e,t)=>e&&typeof e==`object`&&!Array.isArray(e)?e:y(t),x=(e,t)=>typeof e==`string`?e:y(t),S=(e,t)=>e===null||typeof e==`string`?e:y(t),C=(e,t)=>typeof e==`number`&&Number.isFinite(e)?e:y(t),w=(e,t)=>e===null?null:C(e,t),T=(e,t)=>typeof e==`boolean`?e:y(t),E=(e,t,n)=>t.includes(e)?e:y(n),D=e=>{let t=b(e,`capability`);return{supported:T(t.supported,`capability`),enabled:T(t.enabled,`capability`),revision:C(t.revision,`capability`),serverInstanceID:S(t.serverInstanceID,`capability`)}},O=e=>{let t=b(e,`assistant`),n=Array.isArray(t.historySessionIDs)?t.historySessionIDs.map(e=>x(e,`assistant`)):[],r=t.historySessionCount===void 0?n.length:C(t.historySessionCount,`assistant`);return!Number.isSafeInteger(r)||r<n.length?y(`assistant`):{id:x(t.id,`assistant`),revision:C(t.revision,`assistant`),enabled:T(t.enabled,`assistant`),name:x(t.name,`assistant`),defaultPrompt:x(t.defaultPrompt,`assistant`),workspacePath:S(t.workspacePath,`assistant`),effectiveWorkspacePath:x(t.effectiveWorkspacePath,`assistant`),managedWorkspacePath:S(t.managedWorkspacePath??null,`assistant`),providerID:x(t.providerID,`assistant`),modelID:x(t.modelID,`assistant`),agent:S(t.agent,`assistant`),variant:S(t.variant??null,`assistant`),mode:E(t.mode,[`continuous`,`stateless`],`assistant`),sessionID:S(t.sessionID,`assistant`),sessionGeneration:C(t.sessionGeneration,`assistant`),historySessionIDs:n,historySessionCount:r,createdAt:w(t.createdAt,`assistant`),updatedAt:C(t.updatedAt,`assistant`),tombstoneAt:w(t.tombstoneAt,`assistant`)}},k=e=>{let t=b(e,`snapshot`);return{revision:C(t.revision,`snapshot`),enabled:T(t.enabled,`snapshot`),assistants:Array.isArray(t.assistants)?t.assistants.map(O):y(`snapshot`)}},A=e=>{let t=b(e,`binding`);return{sessionID:S(t.sessionID,`binding`),directory:x(t.directory,`binding`),sessionGeneration:C(t.sessionGeneration,`binding`)}},j=e=>{let t=b(e,`compact`);return t.summarized===!0?{binding:A(t.binding),summarized:!0}:y(`compact`)},M=e=>{let t=b(e,`message_admission`);return t.admitted===!0?{binding:A(t.binding),messageID:x(t.messageID,`message_admission`),admitted:!0}:y(`message_admission`)},N=e=>{let t=b(e,`share_operation`);return{operationID:x(t.operationID,`share_operation`),assistantID:x(t.assistantID,`share_operation`),sessionID:S(t.sessionID,`share_operation`),messageID:S(t.messageID,`share_operation`),state:E(t.state,[`submitting`,`running`,`completed`,`failed`,`unresolved`],`share_operation`),phase:x(t.phase,`share_operation`),attempt:C(t.attempt,`share_operation`),leaseExpiresAt:w(t.leaseExpiresAt,`share_operation`),errorCode:S(t.errorCode,`share_operation`)}},P=e=>{let t=b(e,`assistant_history`),n=S(t.nextCursor,`assistant_history`),r=T(t.complete,`assistant_history`);return!r&&!n||r&&n||!Array.isArray(t.entries)?y(`assistant_history`):{entries:t.entries.map(e=>{let t=b(e,`assistant_history_entry`),n=x(t.sessionID,`assistant_history_entry`),r=b(t.info,`assistant_history_info`),i=b(r.time,`assistant_history_info`);if(x(r.id,`assistant_history_info`),x(r.sessionID,`assistant_history_info`)!==n||(E(r.role,[`user`,`assistant`,`system`,`tool`],`assistant_history_info`),C(i.created,`assistant_history_info`),!Array.isArray(t.parts)))return y(`assistant_history_entry`);let a=t.parts.map(e=>{let t=b(e,`assistant_history_part`);return x(t.id,`assistant_history_part`),x(t.sessionID,`assistant_history_part`)!==n||x(t.messageID,`assistant_history_part`)!==r.id?y(`assistant_history_part`):(x(t.type,`assistant_history_part`),t)});return{sessionID:n,directory:S(t.directory,`assistant_history_entry`),info:r,parts:a}}),nextCursor:n,complete:r}},F=30,I={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]},L=(e,t,n)=>{if(!e||!t)return;let r=t.queryKey;if(r[0]===n.transport&&r[1]===n.runtimeGeneration&&r[2]===`assistants`&&r[3]===`history`&&r[4]===n.assistantID)return e},R=async(e,t={})=>{let n=await r(e,t),i=await n.json().catch(()=>null);if(!n.ok)throw new _(i&&typeof i==`object`&&`error`in i&&typeof i.error==`string`?i.error:`request_failed`,n.status);return i},z=(e,t)=>({method:e,headers:{"Content-Type":`application/json`},body:t===void 0?void 0:JSON.stringify(t)}),B=(e,r)=>{if(t()!==e||n()!==r)throw new _(`runtime_stale`,409)},V=(e,t,r)=>{i.setQueryData(I.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:I.snapshot(r)}),i.invalidateQueries({queryKey:[r,n(),`assistants`,`history`,e]})},H=(e,t)=>{i.setQueryData(I.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:I.snapshot(t)})},U=(e=t())=>({queryKey:I.snapshot(e),queryFn:async({signal:e})=>k(await R(`/api/openchamber/assistants/snapshot`,{signal:e})),retry:2}),W=()=>{let e=(0,g.c)(5),n,r,a;e[0]===Symbol.for(`react.memo_cache_sentinel`)?(a=t(),n=c,r=U(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:I.snapshot(a),exact:!0});return}if(e.type!==`assistants-changed`)return;let n=i.getQueryData(I.snapshot(a));(!n||e.revision>n.revision)&&i.invalidateQueries({queryKey:I.snapshot(a),exact:!0})}),l=[a],e[3]=s,e[4]=l):(s=e[3],l=e[4]),h.useEffect(s,l),o},G=(e,r,i,a=t(),o=n())=>({queryKey:I.history(e,r,i,a,o),queryFn:async({signal:t,pageParam:n})=>{B(a,o),await d(),B(a,o);let r=new URLSearchParams({limit:String(F)});n&&r.set(`before`,n);let i=P(await R(`/api/openchamber/assistants/${encodeURIComponent(e)}/messages?${r}`,{signal:t}));return B(a,o),i},initialPageParam:null,getNextPageParam:K,placeholderData:(t,n)=>L(t,n,{assistantID:e,transport:a,runtimeGeneration:o}),retry:2}),K=e=>e.complete?void 0:e.nextCursor??void 0,q=(e,t,n)=>{let r=(0,g.c)(7),i=n===void 0||n,a=t.sessionID??``,o;r[0]!==e||r[1]!==t.sessionGeneration||r[2]!==a?(o=G(e,a,t.sessionGeneration),r[0]=e,r[1]=t.sessionGeneration,r[2]=a,r[3]=o):o=r[3];let s=i&&!!(e&&t.sessionID),c;return r[4]!==o||r[5]!==s?(c={...o,enabled:s},r[4]=o,r[5]=s,r[6]=c):c=r[6],l(c)},J=async e=>k(await R(`/api/openchamber/assistants/snapshot`,{signal:e})),Y=(e=t())=>({queryKey:I.capability(e),queryFn:()=>Q(),retry:!1}),X=()=>{let e=(0,g.c)(1),t;return e[0]===Symbol.for(`react.memo_cache_sentinel`)?(t=Y(),e[0]=t):t=e[0],c(t)},Z=(e=i,n=t())=>e.getQueryData(I.snapshot(n)),ee=(e=i,n=t())=>e.fetchQuery(U(n)),te=async(e=i)=>{let r=t(),a=n();await e.invalidateQueries({queryKey:I.snapshot(r),exact:!0}),B(r,a);let o=await e.fetchQuery(U(r));return B(r,a),o},ne=async e=>{let r=t(),i=n();await d(),B(r,i);let a=A(await R(`/api/openchamber/assistants/${encodeURIComponent(e)}/session/ensure`,z(`POST`)));return B(r,i),V(e,a,r),a},re=async e=>{let r=t(),i=n(),a=A(await R(`/api/openchamber/assistants/${encodeURIComponent(e)}/session/new`,z(`POST`)));return B(r,i),V(e,a,r),a},ie=async(e,r)=>{let i=t(),a=n(),o=j(await R(`/api/openchamber/assistants/${encodeURIComponent(e)}/session/compact`,z(`POST`,{sessionID:r.sessionID,sessionGeneration:r.sessionGeneration})));return B(i,a),V(e,o.binding,i),o},ae=async(e,r)=>{let i=t(),a=n();await R(`/api/openchamber/assistants/${encodeURIComponent(e)}/session/abort`,z(`POST`,{sessionID:r.sessionID,sessionGeneration:r.sessionGeneration})),B(i,a)},oe=async(e,r,i,a,o=`composer`)=>{let s=t(),c=n(),l=M(await R(`/api/openchamber/assistants/${encodeURIComponent(e)}/messages`,z(`POST`,{sessionID:r.sessionID,sessionGeneration:r.sessionGeneration,messageID:i,parts:a,source:o})));return B(s,c),V(e,l.binding,s),l},se=async(e,r,i,a,o)=>{let s=t(),c=n(),l=N(await R(`/api/openchamber/assistants/${encodeURIComponent(e)}/share`,z(`POST`,{operationID:r,payload:{messageID:i,parts:a,source:o}})));return B(s,c),l},ce=async(e,r=t(),i=n())=>{B(r,i);let a=N(await R(`/api/openchamber/assistants/share-operations/${encodeURIComponent(e)}`));return B(r,i),a},le=async(e,r=t(),i=n())=>{let a=e;for(let e=0;e<60&&(a.state===`running`||a.state===`submitting`);e+=1)B(r,i),await new Promise(e=>setTimeout(e,750)),a=await ce(a.operationID,r,i);if(B(r,i),a.state===`completed`)return a;throw a.state===`failed`?new v(a.errorCode??`share_failed`,400,a):new v(`share_unresolved`,408,a)},ue=async(e,n)=>{await R(`/api/openchamber/assistants/settings`,z(`PUT`,{enabled:e,expectedRevision:n}));let r=t();await Promise.all([i.invalidateQueries({queryKey:I.snapshot(r),exact:!0}),i.invalidateQueries({queryKey:I.capability(r),exact:!0})])},de=async e=>{let n=t(),r=O(await R(`/api/openchamber/assistants`,z(`POST`,e)));return H(r,n),r},fe=async(e,r)=>{let i=t(),a=n(),o=O(await R(`/api/openchamber/assistants/${encodeURIComponent(e.id)}`,z(`PATCH`,{...r,expectedRevision:e.revision})));return B(i,a),H(o,i),o},pe=async e=>{await R(`/api/openchamber/assistants/${encodeURIComponent(e.id)}`,z(`DELETE`,{expectedRevision:e.revision})),await i.invalidateQueries({queryKey:I.snapshot(t())})},Q=async()=>D(await R(`/api/openchamber/assistants/capability`)),$=a();function me(e){let t=(0,g.c)(32),{title:n,subtitle:r,backAriaLabel:i,onBack:a,backDisabled:o,actions:s,trailing:c,sticky:l,overlay:u,elevated:d}=e,h=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=d!==void 0&&d,S=!!c||v.length>0,C=x||v.some(ge),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=f(`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=f(`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]!==h||t[10]!==a?(A=a?(0,$.jsx)(m,{type:`button`,variant:`mobileGlass`,size:`mobileIcon`,className:`justify-self-start`,onClick:a,disabled:h,"aria-label":i,children:(0,$.jsx)(p,{name:`arrow-left-s`,className:`size-5`})}):(0,$.jsx)(`span`,{"aria-hidden":`true`}),t[8]=i,t[9]=h,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(he),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 he(e,t){return(0,$.jsx)(m,{type:`button`,variant:`mobileGlass`,size:`mobileIcon`,className:f(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)(p,{name:e.icon,className:`size-5`})},`${e.icon}:${t}`)}function ge(e){return e.elevated}export{v as S,X as _,pe as a,le as b,Q as c,re as d,Z as f,fe as g,ue as h,de as i,J as l,se as m,ae as n,ne as o,oe as p,ie as r,ee as s,me as t,te as u,q as v,_ as x,W as y};
@@ -1,4 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/vendor-aparajita-capacitor-secure-storage-CjQdwfjS.js","assets/rolldown-runtime-C0FnF6B9.js","assets/useAssistantUIStore-DGtjM827.js","assets/useUIStore-WQV8IuFw.js","assets/vendor-zustand-B4dlGEM2.js","assets/vendor-base-ui-CnHfUmDN.js"])))=>i.map(i=>d[i]);
2
- import{o as e,r as t}from"./rolldown-runtime-C0FnF6B9.js";import{$ as n,D as r,E as i,J as a,M as o,T as s,Z as c,j as l,w as u}from"./useUIStore-WQV8IuFw.js";import{Ot as d,bt as f,et as p,kn as m,nt as h,yt as g}from"./persistence-CFtygeYy.js";import{g as _}from"./desktopHosts-RE7NIkeq.js";import{n as v}from"./desktopRelayRestore-BzyaU7-i.js";import{nt as y,rt as b}from"./vendor-base-ui-CnHfUmDN.js";import{a as x,n as S,o as ee,t as te}from"./vendor-aparajita-capacitor-secure-storage-CjQdwfjS.js";import{n as ne}from"./vendor-react-DLPElpoQ.js";import{n as C}from"./vendor-reactuses-core-DDoDDyM9.js";import{t as re}from"./i18n-BAqcSln8.js";import{Mi as w,Sn as ie,di as T,fi as ae,t as oe}from"./ui-D5j3JxkE.js";import{i as E,n as se}from"./useAssistantUIStore-DGtjM827.js";import{S as ce,b as le,c as D,m as ue,s as de,t as fe,u as pe}from"./MobileDetailNavigation-RupyXzPu.js";import{t as me}from"./AgentAvatar-Coq-zdWI.js";import{n as he}from"./Icon-Vc-aDche.js";import{n as ge,t as _e}from"./dialog-DlUK6mj-.js";var ve=ne(),O=e(b(),1),ye=`openchamber.mobile.connections.v1`,be=`openchamber.mobile.`,xe=`openchamber.mobile.deviceId`,Se=()=>{try{let e=window.localStorage.getItem(xe);if(e&&e.trim())return e.trim();let t=p();return window.localStorage.setItem(xe,t),t}catch{return p()}},Ce=()=>`mobile:${Se()}`,we=()=>{try{let e=S.getPlatform();return e===`ios`||e===`android`?e:void 0}catch{return}},Te=12,Ee=8e3,De=2500,Oe=3e3,ke=2500,k=e=>{let t=e.trim();if(!t)return``;let n=/^https?:\/\//i.test(t)?t:`http://${t}`,r=new URL(n);return r.hash=``,r.search=``,r.pathname=r.pathname.replace(/\/+$/,``),r.toString().replace(/\/+$/,``)},Ae=e=>{try{return new URL(e).host}catch{return e}},A=e=>{try{return k(e)}catch{return e.trim().replace(/\/+$/g,``)}},je=(e,t)=>A(e)===A(t),Me=e=>`relay:${e.serverId}@${e.relayUrl.trim()}`,Ne=e=>`relay://${e.serverId}`,Pe=e=>e.candidates.filter(e=>e.kind===`direct`),j=e=>{let t=e.candidates.find(e=>e.kind===`relay`);return t&&t.kind===`relay`?t.relay:null},M=e=>{let t=Pe(e)[0];if(t)return t.url;let n=j(e);return n?Ne(n):``},N=e=>{let t=j(e),n=t?Me(t):(()=>{let t=Pe(e)[0];return t?A(t.url):``})(),r=e.sshTarget?.hostId?.trim();return r?`${n}#ssh:${r}`:n},Fe=N,Ie=(e,t)=>{let n=e.find(e=>e.kind===`relay`),r=n&&n.kind===`relay`?n.relay.serverId:null,i=n&&n.kind===`relay`?n.relay.relayUrl.trim():null,a=new Set(e.filter(e=>e.kind===`direct`).map(e=>A(e.url)));return t.some(e=>e.kind===`relay`?r!==null&&e.relay.serverId===r&&e.relay.relayUrl.trim()===i:a.has(A(e.url)))},Le=(e,t)=>{let n=e?.hostId?.trim()||``,r=t?.hostId?.trim()||``;return!n&&!r?!0:!n||!r?!1:n===r&&(e?.desktopServerId?.trim()||``)===(t?.desktopServerId?.trim()||``)},Re=e=>{if(!e||typeof e!=`object`)return;let t=e,n=typeof t.hostId==`string`?t.hostId.trim():``,r=typeof t.desktopServerId==`string`?t.desktopServerId.trim():``,i=typeof t.desktopClientToken==`string`?t.desktopClientToken.trim():``;if(!(!n||!r||!i))return{hostId:n,desktopServerId:r,desktopClientToken:i}},ze=(e,t)=>t.id&&e.id===t.id?!0:Ie(e.candidates,t.candidates)?Le(e.sshTarget,t.sshTarget):!1,Be=e=>{let t=(()=>{try{return k(e)}catch{return``}})();return t?[{kind:`direct`,url:t}]:[]},Ve=e=>{if(e.candidates&&e.candidates.length>0)return e.candidates;let t=[];return typeof e.url==`string`&&e.url.trim()&&!/^relay:\/\//i.test(e.url.trim())&&t.push(...Be(e.url)),e.relay&&t.push({kind:`relay`,relay:e.relay}),t},He=e=>{if(!e||typeof e!=`object`||Array.isArray(e))return null;let t=e;if(typeof t.relayUrl!=`string`||!t.relayUrl.trim()||typeof t.serverId!=`string`||!t.serverId.trim())return null;let n=t.hostEncPubJwk;if(!n||typeof n!=`object`||Array.isArray(n))return null;let r=n;return r.kty!==`EC`||r.crv!==`P-256`||typeof r.x!=`string`||!r.x||typeof r.y!=`string`||!r.y?null:{relayUrl:t.relayUrl,serverId:t.serverId,hostEncPubJwk:{kty:`EC`,crv:`P-256`,x:r.x,y:r.y}}},Ue=e=>{try{return JSON.stringify(e)}catch{return String(e)}},P=(e,t={})=>{Ue(t)},F=(e,t={})=>{Ue(t)},We=e=>{if(typeof e!=`string`)return e;try{return JSON.parse(e)}catch{return e}},Ge=e=>{if(typeof e!=`string`)return e??void 0;try{return JSON.parse(e)}catch{return e}},Ke=async(e,t)=>{if(!T())return null;try{let{CapacitorHttp:n}=await ee(async()=>{let{CapacitorHttp:e}=await import(`./vendor-aparajita-capacitor-secure-storage-CjQdwfjS.js`).then(e=>e.i);return{CapacitorHttp:e}},__vite__mapDeps([0,1])),r=Object.fromEntries(new Headers(t?.headers).entries()),i=await n.request({url:e,method:t?.method||`GET`,headers:r,data:Ge(t?.body)});return{ok:i.status>=200&&i.status<300,status:i.status,source:`native-http`,json:async()=>We(i.data)}}catch(t){return console.warn(`[mobile-connect]`,`native-http failed`,Ue({url:e,error:t instanceof Error?t.message:String(t)})),null}},qe=async(e,t)=>{let n=await fetch(e,t).catch(t=>(console.warn(`[mobile-connect]`,`browser-fetch failed`,Ue({url:e,error:t instanceof Error?t.message:String(t)})),null));return n?{ok:n.ok,status:n.status,source:`browser-fetch`,json:()=>n.json()}:null},I=async(e,t,n)=>{let r,i=new Promise(t=>{r=window.setTimeout(()=>{n?.(),t(null)},e)});try{return await Promise.race([t,i])}catch{return null}finally{r!==void 0&&window.clearTimeout(r)}},L=async(e,t,n)=>{let r=n?.totalTimeoutMs??Ee,i=Date.now(),a=await I(Math.min(De,r),Ke(e,t));if(a)return a;let o=new AbortController;return I(Math.max(500,r-(Date.now()-i)),qe(e,{...t,signal:o.signal}),()=>o.abort())},Je=async e=>{if(!e)return null;let t=await e.json().catch(()=>null);if(!t||typeof t!=`object`)return null;let n=t;return{authenticated:typeof n.authenticated==`boolean`?n.authenticated:void 0,disabled:typeof n.disabled==`boolean`?n.disabled:void 0,scope:typeof n.scope==`string`?n.scope:void 0}},R=15e3,Ye=async(e,t,r,i=R,a)=>{let o=n({relayUrl:e.relayUrl,serverId:e.serverId,hostEncPubJwk:e.hostEncPubJwk,...r?{grant:r}:{}}),s=e=>e===`ok`&&a?.keepTunnel?{outcome:e,tunnel:o}:(o.close(),{outcome:e});try{let e=t?{Authorization:`Bearer ${t}`}:void 0,n=await I(i,o.fetch(`/auth/session`,{headers:e}).catch(()=>null));if(P(`relay:session`,{ok:n?.ok===!0,status:n?.status??null,hasToken:!!t}),!n)return s(`unreachable`);if(n.status===401)return s(t?`auth-failed`:`needs-login`);if(!n.ok&&n.status!==404)return s(`auth-failed`);let r=await Je(n);return r&&r.disabled!==!0&&r.authenticated===!1?s(t?`auth-failed`:`needs-login`):s(`ok`)}catch(e){throw o.close(),e}},Xe=(e,t,n,r,i,s)=>{let c=typeof window<`u`?window.location.origin:``,l={relayUrl:e.relayUrl,serverId:e.serverId,hostEncPubJwk:e.hostEncPubJwk,...n?{grant:n}:{}};i&&a(l,i),o({apiBaseUrl:c,clientToken:t,runtimeKey:r??Me(e),relay:l,requestHeaders:s||null})},Ze=e=>{if(!e||typeof e!=`object`)return null;let t=e;if(t.kind===`direct`)return typeof t.url==`string`&&t.url.trim()?{kind:`direct`,url:t.url}:null;if(t.kind===`relay`){let e=He(t.relay);return e?{kind:`relay`,relay:e}:null}return null},Qe=e=>{if(e.mode===`relay`){let t=He(e.relay);return t?[{kind:`relay`,relay:t}]:[]}return typeof e.url==`string`?Be(e.url):[]},z=()=>{if(typeof window>`u`)return[];let e;try{e=JSON.parse(window.localStorage.getItem(ye)||`[]`)}catch{return[]}if(!Array.isArray(e))return[];let t=T();return e.flatMap(e=>{if(!e||typeof e!=`object`)return[];let n=e;if(typeof n.id!=`string`)return[];let r=Array.isArray(n.candidates)?n.candidates.map(Ze).filter(e=>!!e):Qe(n);if(r.length===0)return[];let i=typeof n.clientToken==`string`&&n.clientToken.trim()?n.clientToken:void 0,a=typeof n.label==`string`&&n.label.trim()?n.label:Ae(M({candidates:r})),o=Re(n.sshTarget),s={id:n.id,label:a,candidates:r,lastUsedAt:typeof n.lastUsedAt==`number`?n.lastUsedAt:0,...o?{sshTarget:o}:{}};return t?[{...s,hasToken:!!n.hasToken||!!i}]:[{...s,clientToken:i,hasToken:!!i}]}).sort((e,t)=>t.lastUsedAt-e.lastUsedAt)},$e=e=>e.kind===`relay`?{kind:`relay`,relay:{relayUrl:e.relay.relayUrl,serverId:e.relay.serverId,hostEncPubJwk:e.relay.hostEncPubJwk}}:{kind:`direct`,url:e.url},et=e=>{if(typeof window>`u`)return;let t=T(),n=e.slice(0,Te).map(e=>{let n={id:e.id,label:e.label,candidates:e.candidates.map($e),lastUsedAt:e.lastUsedAt,...e.sshTarget?{sshTarget:e.sshTarget}:{}};return t?{...n,hasToken:!!(e.hasToken||e.clientToken)}:{...n,clientToken:e.clientToken}});try{window.localStorage.setItem(ye,JSON.stringify(n))}catch(e){console.warn(`[mobile-storage] failed to persist connection metadata`,e)}},tt=(e,t)=>{let n=e.find(e=>ze(e,t)),r=T(),i=t.sshTarget===null?void 0:t.sshTarget??n?.sshTarget,a={id:t.id||n?.id||p(),label:t.label,candidates:t.candidates,lastUsedAt:Date.now(),...i?{sshTarget:i}:{},...r?{hasToken:t.hasToken??(!!t.clientToken||n?.hasToken||!1)}:{clientToken:t.clientToken??n?.clientToken,hasToken:!!(t.clientToken??n?.clientToken)}};return[a,...e.filter(e=>e.id!==a.id&&!ze(e,t))].slice(0,Te)},nt=te,rt=0,it=e=>`${be}token.${encodeURIComponent(e)}`,at=async(e,t)=>{let n,r=new Promise(e=>{n=window.setTimeout(()=>e(t),Oe)});try{return await Promise.race([e.catch(()=>t),r])}finally{n!==void 0&&window.clearTimeout(n)}},ot=async(e,t,n)=>T()?at(t().catch(t=>(console.warn(`[mobile-storage] ${e} failed`,t),n)),n):n,B=async e=>{F(`secure:read-start`,{key:e});let t=await ot(`secure:read`,async()=>(await nt.internalGetItem({prefixedKey:it(e),sync:!1})).data,null),n=typeof t==`string`&&t.trim()?t:void 0;return F(`secure:read`,{key:e,hasToken:!!n}),n},V=async(e,t)=>{F(`secure:write-start`,{key:e});let n=await ot(`secure:write`,async()=>(await nt.internalSetItem({prefixedKey:it(e),data:t,sync:!1,access:rt}),!0),!1);return F(`secure:write`,{key:e,ok:n}),n},st=async e=>{await ot(`secure:delete`,async()=>(await nt.internalRemoveItem({prefixedKey:it(e),sync:!1}),!0),!1)},ct=async()=>{if(typeof window>`u`||!T())return;let e;try{e=JSON.parse(window.localStorage.getItem(ye)||`[]`)}catch{return}if(!Array.isArray(e))return;let t=e.filter(e=>!!e&&typeof e==`object`&&typeof e.url==`string`&&typeof e.clientToken==`string`&&!!e.clientToken.trim());if(t.length!==0){F(`secure:migrate-start`,{count:t.length});for(let{url:e,clientToken:n}of t)await V(A(e),n);et(z()),F(`secure:migrate-done`,{count:t.length})}},lt=async()=>(await ct(),z()),H=async e=>{let t=tt(z(),e);if(et(t),T()&&e.clientToken){let n=t[0];n&&await V(N(n),e.clientToken)}return t},ut=async e=>{let t=z(),n=t.find(t=>t.id===e)??null,r=t.filter(t=>t.id!==e);if(et(r),n&&T()&&await st(N(n)),n){let e=N(n),{useAssistantUIStore:t}=await ee(async()=>{let{useAssistantUIStore:e}=await import(`./useAssistantUIStore-DGtjM827.js`).then(e=>e.a);return{useAssistantUIStore:e}},__vite__mapDeps([2,1,3,4,5]));t.getState().removeCatalogPartition(e);let{publishNativeAssistantCatalog:r}=await ee(async()=>{let{publishNativeAssistantCatalog:e}=await Promise.resolve().then(()=>on);return{publishNativeAssistantCatalog:e}},void 0);await r().catch(()=>void 0)}return r},dt=1500,U=async(e,t,n)=>{let r=n?.fast?{totalTimeoutMs:ke}:void 0,i=j({candidates:e})?.serverId??null,a=e.find(e=>e.kind===`relay`)??null,o=e.filter(e=>e.kind===`direct`),s=async()=>{for(let e of o){let n=k(e.url)||e.url,a=t?{Authorization:`Bearer ${t}`}:void 0,o=await L(`${n}/health`,{method:`GET`},r);if(!o?.ok)continue;if(i){let e=await o.json().catch(()=>null),t=e&&typeof e==`object`?e.serverId:null;if(typeof t==`string`&&t&&t!==i){P(`probe:server-id-mismatch`,{url:n});continue}}let s=await L(`${n}/auth/session`,{method:`GET`,credentials:`include`,headers:a},r);if(s?.status===401)return{status:`needs-login`};if(!s||!s.ok&&s.status!==404)continue;let c=await Je(s);if(c&&c.disabled!==!0&&c.authenticated===!1)return{status:`needs-login`};let l=c?.disabled===!0;return!t&&T()&&!l&&c?.scope!==`client`?{status:`needs-login`}:{status:`ok`,transport:{kind:`direct`,url:n}}}return{status:`unreachable`}},c=async()=>{if(!a)return{status:`unreachable`};let{outcome:e,tunnel:r}=await Ye(a.relay,t,void 0,n?.fast?ke:void 0,{keepTunnel:!0});return e===`ok`?{status:`ok`,transport:{kind:`relay`,relay:a.relay,tunnel:r}}:e===`needs-login`||e===`auth-failed`?{status:`needs-login`}:{status:`unreachable`}};return a?o.length===0?c():new Promise(e=>{let t=!1,n=!1,r,i=null,a=null,o=e=>{e?.status===`ok`&&e.transport.kind===`relay`&&e.transport.tunnel?.close()},l=n=>{t||(t=!0,e(n))},u=()=>{n||t||(r!==void 0&&(window.clearTimeout(r),r=void 0),c().then(e=>{if(a=e,t||n){o(e);return}if(e.status===`ok`||e.status===`needs-login`){l(e);return}i&&l(i)}))};s().then(e=>{if(i=e,!t){if(e.status===`ok`||e.status===`needs-login`){n=!0,r!==void 0&&window.clearTimeout(r),o(a),l(e);return}if(a){l(a);return}u()}}),r=window.setTimeout(u,dt)}):s()},W=(e,t,n)=>{e.kind===`relay`?Xe(e.relay,t,n?.grant,n?.runtimeKey,e.tunnel,n?.requestHeaders):o({apiBaseUrl:e.url,clientToken:t,runtimeKey:n?.runtimeKey,requestHeaders:n?.requestHeaders||null}),n?.requestHeaders?.[`x-openchamber-target-port`]||Et()},ft=()=>{let e=z()[0];return e?.label?.trim()?e.label:null},pt=async()=>{await ct();let e=z()[0];if(!e)return!1;let t;if(T()){if(!e.hasToken||(t=await B(N(e)),!t))return!1}else if(t=e.clientToken,!t)return!1;if(e.sshTarget){let t=await _t(e.candidates);if(!t||t.kind!==`relay`)return!1;try{let n=await _(e.sshTarget.hostId,{fetch:(e,n)=>t.tunnel.fetch(e,n),headers:{Authorization:`Bearer ${e.sshTarget.desktopClientToken}`}});return!n.reachable||typeof n.localPort!=`number`?(t.tunnel.close(),!1):(await H({id:e.id,label:e.label,candidates:e.candidates,clientToken:n.token,sshTarget:e.sshTarget}),v({token:n.token,localPort:n.localPort,runtimeKey:N(e),relay:t.relay,liveTunnel:t.tunnel}),!0)}catch{return t.tunnel.close(),!1}}let n=await U(e.candidates,t);return n.status===`ok`&&(await H({id:e.id,label:e.label,candidates:e.candidates}),W(n.transport,t,{runtimeKey:N(e)}),!0)},mt=async(e,t)=>{let n=(await lt()).find(t=>N(t)===e);if(!n)return`missing`;let r=T()?n.hasToken?await B(e):void 0:n.clientToken;if(!r)return`auth-required`;let i=t?.transportPreference===`relay`?n.candidates.filter(e=>e.kind===`relay`):n.candidates;if(i.length===0)return`offline`;let a=await U(i,r,{fast:!0});return a.status===`needs-login`?`auth-required`:a.status===`ok`?(W(a.transport,r,{runtimeKey:e}),`connected`):`offline`},ht=async(e,t)=>{let n=``;try{n=k(e.url)}catch{return!1}if(!n)return!1;let r=e.clientToken?.trim()||void 0,i=r?{Authorization:`Bearer ${r}`}:void 0,a=t?.fast?{totalTimeoutMs:ke}:void 0;if(!(await L(`${n}/health`,{method:`GET`,headers:i},a))?.ok)return!1;let o=await L(`${n}/auth/session`,{method:`GET`,credentials:`include`,headers:i},a);if(!o||!o.ok&&o.status!==404)return!1;let s=await Je(o);return!(s&&s.disabled!==!0&&s.authenticated===!1)},gt=e=>[...e].sort((e,t)=>{let n=(e.priority??100)-(t.priority??100);if(n!==0)return n;let r=e=>e.type===`relay`?2:+!e.url.startsWith(`https://`);return r(e)-r(t)}).flatMap(e=>{if(e.type===`relay`){let t=He({relayUrl:e.relayUrl,serverId:e.serverId,hostEncPubJwk:e.hostEncPubJwk});return t?[{kind:`relay`,relay:t}]:[]}return Be(e.url)}),_t=async e=>{let t=j({candidates:e})?.serverId??null;for(let r of e){if(r.kind===`relay`){let e=n(r.relay),t=await I(R,e.fetch(`/health`).catch(()=>null));if(P(`establish:relay:health`,{ok:t?.ok===!0,status:t?.status??null}),t?.ok)return{kind:`relay`,relay:r.relay,tunnel:e};e.close();continue}let e=k(r.url)||r.url,i=await L(`${e}/health`,{method:`GET`});if(P(`establish:direct:health`,{ok:i?.ok===!0,status:i?.status??null}),i?.ok){if(t){let n=await i.json().catch(()=>null),r=n&&typeof n==`object`?n.serverId:null;if(typeof r==`string`&&r&&r!==t){P(`establish:server-id-mismatch`,{url:e});continue}}return{kind:`direct`,url:e}}}return null},vt=async(e,t)=>{if(!c())return ht(e,t);let n=await I(t?.fast?ke:R,m(`/auth/session`).then(e=>e).catch(()=>null));if(!n)return!0;if(n.status===401)return!1;if(!n.ok&&n.status!==404)return!0;let r=await Je(n);return!(r&&r.disabled!==!0&&r.authenticated===!1)},yt=e=>e.kind===`relay`?c():!c()&&je(e.url,u()),bt=()=>{let e=i();return e?z().find(t=>N(t)===e)??null:null},xt=e=>{let t=i();return!!t&&N(e)===t},St=async()=>{let e=bt();if(!e)return`no-connection`;let t;if(t=T()?e.hasToken?await B(N(e)):void 0:e.clientToken,!t)return`unreachable`;let n=e.candidates.findIndex(e=>yt(e.kind===`relay`?{kind:`relay`,relay:e.relay}:{kind:`direct`,url:e.url})),r=await U(n>=0?e.candidates.slice(0,n):e.candidates,t,{fast:!0});if(r.status===`ok`)return await H({id:e.id,label:e.label,candidates:e.candidates}),W(r.transport,t,{runtimeKey:N(e)}),`switched`;if(r.status===`needs-login`)return`unreachable`;if(n>=0&&await vt({url:u(),clientToken:t},{fast:!0}))return Et(),`unchanged`;let i=await U(n>=0?e.candidates.slice(n+1):[],t,{fast:!0});return i.status===`ok`?(await H({id:e.id,label:e.label,candidates:e.candidates}),W(i.transport,t,{runtimeKey:N(e)}),`switched`):`unreachable`},Ct=5e3,wt=!1,Tt=async()=>{if(wt)return`skipped`;let e=bt();if(!e)return P(`candidates:refresh-skip`,{reason:`no-active-connection`}),`skipped`;let t=j(e);if(!t)return P(`candidates:refresh-skip`,{reason:`no-relay-candidate`}),`skipped`;wt=!0;try{let n=await I(R,m(`/api/client-auth/connection/candidates`).then(e=>e).catch(()=>null));if(!n?.ok)return P(`candidates:refresh-skip`,{reason:`fetch-failed`,status:n?.status??null}),`skipped`;let r=await n.json().catch(()=>null);if(!r||r.serverId!==t.serverId)return P(`candidates:refresh-skip`,{reason:`server-id-mismatch`}),`skipped`;let i=Array.isArray(r.candidates)?r.candidates:[],a=[];for(let e of i){if(!e||typeof e!=`object`)continue;let t=e;if(t.type===`lan`&&typeof t.url==`string`)try{let e=k(t.url);e&&!a.includes(e)&&a.push(e)}catch{}}if(a.length===0)return P(`candidates:refresh-skip`,{reason:`no-lan-reported`}),`skipped`;let o=Pe(e).filter(e=>e.url.startsWith(`https://`)),s=[...a.map(e=>({kind:`direct`,url:e})),...o,{kind:`relay`,relay:t}];return JSON.stringify(e.candidates.map($e))===JSON.stringify(s.map($e))?`unchanged`:(P(`candidates:refreshed`,{lanCount:a.length}),await H({id:e.id,label:e.label,candidates:s}),`updated`)}finally{wt=!1}},Et=()=>{typeof window>`u`||window.setTimeout(()=>{(async()=>{let e=await Tt().catch(()=>`skipped`);P(`candidates:refresh-result`,{result:e}),e===`updated`&&c()&&await St().catch(()=>null)})()},Ct)},Dt=e=>{let{t}=re(),[n,r]=O.useState(()=>z()),[i,a]=O.useState(null),[o,s]=O.useState(null),[c,l]=O.useState(null),u=O.useRef(n),d=O.useRef(null),f=O.useRef(new Set),m=C(()=>{e(),f.current.forEach(e=>e())}),h=C(e=>(f.current.add(e),()=>f.current.delete(e))),g=C(e=>{u.current=e,r(e)}),y=C(e=>{d.current=e,a(e)}),b=C(e=>{d.current===e&&(d.current=null,a(null))});O.useEffect(()=>{let e=!1;return lt().then(t=>{e||g(t)}),()=>{e=!0}},[g]);let x=C(e=>{let t=tt(u.current,e);return g(t),et(t),t}),S=C(async e=>{s(null),y(`connect`);try{let n=Ve(e);if(n.length===0){s(t(`mobile.connect.error.urlRequired`));return}let r=e.id?u.current.find(t=>t.id===e.id):u.current.find(e=>Ie(e.candidates,n)&&!e.sshTarget),i=e.label?.trim()||r?.label||Ae(M({candidates:n})),a=e.relayGrant,o=r?.sshTarget,c=e.clientToken?.trim()||void 0,d=!!c;if(c||(T()?r?.hasToken&&(c=await B(N(r))):c=r?.clientToken),P(`connect:start`,{candidates:n.map(e=>e.kind),hasToken:!!c,sshHostId:o?.hostId??null}),o){let e=await _t(n);if(!e||e.kind!==`relay`){s(t(`mobile.connect.error.sshNotConnected`));return}let a;try{a=await _(o.hostId,{fetch:(t,n)=>e.tunnel.fetch(t,n),headers:{Authorization:`Bearer ${o.desktopClientToken}`}})}catch{e.tunnel.close(),s(t(`mobile.connect.error.sshNotConnected`));return}if(!a.reachable||typeof a.localPort!=`number`){e.tunnel.close(),s(t(`mobile.connect.error.sshNotConnected`));return}let c=N({candidates:n,sshTarget:o});T()&&await V(c,a.token),x({id:r?.id,label:i,candidates:n,clientToken:a.token,sshTarget:o}),v({token:a.token,localPort:a.localPort,runtimeKey:c,relay:e.relay,liveTunnel:e.tunnel}),m();return}let f=await U(n,c);if(P(`connect:probe`,{status:f.status}),f.status===`unreachable`){s(t(`mobile.connect.error.unreachable`));return}if(f.status===`needs-login`){x({id:r?.id,label:i,candidates:n,sshTarget:null}),l({id:r?.id??p(),label:i,candidates:n,relay:j({candidates:n})??void 0,relayGrant:a});return}let h=N({candidates:n});c&&d&&T()&&await V(h,c),x({id:r?.id,label:i,candidates:n,clientToken:c,sshTarget:null}),W(f.transport,c??null,{runtimeKey:h,grant:a}),m()}catch(e){console.warn(`[mobile-connect] connect threw`,e),s(t(`mobile.connect.error.invalidUrl`))}finally{b(`connect`)}}),ee=C(async e=>{if(d.current===`pairing`)return;s(null),y(`pairing`);let n=gt(e.candidates),r=null,i=!1;try{if(r=await _t(n),!r){s(t(`mobile.connect.error.unreachable`));return}let a={method:`POST`,headers:{"Content-Type":`application/json`,Accept:`application/json`},body:JSON.stringify({pairingId:e.pairingId,secret:e.secret,clientLabel:`OpenChamber Mobile`,clientKind:`mobile`,deviceName:`OpenChamber Mobile`,devicePlatform:we(),dedupeKey:Ce()})},o=r.kind===`relay`?await I(R,r.tunnel.fetch(`/api/client-auth/pairing/redeem`,a).catch(()=>null)):await L(`${r.url}/api/client-auth/pairing/redeem`,a);if(!o?.ok){s(t(`mobile.connect.error.authRequired`));return}let c=await o.json().catch(()=>null),l=typeof c?.clientToken==`string`?c.clientToken.trim():``;if(!l){s(t(`mobile.connect.error.authRequired`));return}let u=typeof c?.server?.label==`string`?c.server.label:``,d=e.label||u||Ae(M({candidates:n})),f=e.sshHostId?.trim()||``,p=r.kind===`relay`?r:null;if(f&&p){try{let r=await _(f,{pairingId:e.pairingId,fetch:(e,t)=>p.tunnel.fetch(e,t),headers:{Authorization:`Bearer ${l}`}});if(r.reachable&&typeof r.localPort==`number`){let e={hostId:f,desktopServerId:p.relay.serverId,desktopClientToken:l},a=N({candidates:n,sshTarget:e});if(T()&&!await V(a,r.token)){s(t(`mobile.connect.error.authRequired`));return}x({label:d,candidates:n,clientToken:r.token,sshTarget:e}),v({token:r.token,localPort:r.localPort,runtimeKey:a,relay:p.relay,liveTunnel:p.tunnel}),i=!0,m();return}}catch{}oe.message(t(`mobile.connect.ssh.fallbackDesktop`))}let h=N({candidates:n});if(T()&&!await V(h,l)){s(t(`mobile.connect.error.authRequired`));return}x({label:d,candidates:n,clientToken:l,sshTarget:null}),W(r.kind===`relay`?{kind:`relay`,relay:r.relay,tunnel:r.tunnel}:{kind:`direct`,url:r.url},l,{runtimeKey:h}),i=r.kind===`relay`,m()}catch(e){console.warn(`[mobile-connect] pairing threw`,e),s(t(`mobile.connect.error.authRequired`))}finally{!i&&r?.kind===`relay`&&r.tunnel.close(),b(`pairing`)}}),te=C(async e=>{if(!c||!e.trim()||d.current===`password`)return;s(null),y(`password`);let{id:n,label:r,candidates:i}=c,a=null,o=!1;try{if(a=await _t(i),!a){s(t(`mobile.connect.error.unreachable`));return}let c={method:`POST`,credentials:`include`,headers:{"Content-Type":`application/json`,Accept:`application/json`},body:JSON.stringify({password:e,trustDevice:!0,issueClientToken:!0,clientLabel:`OpenChamber Mobile`,clientKind:`mobile`,devicePlatform:we(),dedupeKey:Ce()})};P(`password:start`,{transport:a.kind});let u=a.kind===`relay`?await I(R,a.tunnel.fetch(`/auth/session`,c).catch(()=>null)):await L(`${a.url}/auth/session`,c);if(P(`password:done`,{ok:u?.ok===!0,status:u?.status??null}),!u?.ok){s(t(`mobile.connect.error.passwordFailed`));return}let d=await u.json().catch(()=>null),f=typeof d?.clientToken==`string`?d.clientToken.trim():``;if(P(`password:token`,{issued:!!f}),!f){if(a.kind===`direct`&&!T()){x({id:n,label:r,candidates:i}),l(null),W({kind:`direct`,url:a.url},null,{runtimeKey:N({candidates:i})}),m();return}s(t(`mobile.connect.error.authRequired`));return}T()&&await V(N({candidates:i}),f),x({id:n,label:r,candidates:i,clientToken:f}),l(null),W(a.kind===`relay`?{kind:`relay`,relay:a.relay,tunnel:a.tunnel}:{kind:`direct`,url:a.url},f,{runtimeKey:N({candidates:i})}),o=a.kind===`relay`,m()}catch(e){console.warn(`[mobile-connect] password threw`,e),s(t(`mobile.connect.error.passwordFailed`))}finally{!o&&a?.kind===`relay`&&a.tunnel.close(),b(`password`)}}),ne=C(()=>{l(null),s(null)}),w=C(async e=>{s(null);let n=Ve(e),r=e.id?u.current.find(t=>t.id===e.id)??null:null;if(r){let e=n.filter(e=>e.kind===`direct`),t=Pe(r).filter(t=>t.url.startsWith(`https://`)&&!e.some(e=>je(e.url,t.url))),i=j(r);n=[...e,...t,...i?[{kind:`relay`,relay:i}]:[]]}if(n.length===0)return s(t(`mobile.connect.error.urlRequired`)),null;let i=e.clientToken?.trim()||void 0,a=e.label?.trim()||Ae(M({candidates:n}));if(T()){let e=N({candidates:n});if(i)await V(e,i);else if(r?.hasToken){let t=N(r);if(t&&e&&t!==e){let n=await B(t);n&&await V(e,n)}}}return x({id:e.id,label:a,candidates:n,clientToken:i}).find(e=>Ie(e.candidates,n))??null}),ie=C(async e=>{let t=u.current.find(t=>t.id===e)??null,n=await ut(e);return g(n),t});return{connections:n,isBusy:i!==null,isPasswordBusy:i===`password`,error:o,pendingConnection:c,connect:S,redeemPairingConnection:ee,submitPassword:te,cancelPassword:ne,saveConnection:w,removeConnection:ie,subscribeConnected:h,setError:s}},Ot=async(e,t=3)=>{let n;for(let r=0;r<t;r+=1)try{await e();return}catch(e){n=e}throw n},kt=async(e,t,n=2)=>{let r=[...new Map(e.map(e=>[e.operationID,e])).values()],i=0;await Promise.all(Array.from({length:Math.min(Math.max(1,n),r.length)},async()=>{for(;i<r.length;){let e=r[i++];try{e.cleanupPhase&&e.cleanupPhase!==`files-released`?await t.cleanup(e.operationID):await t.deliver(e.operationID)}catch{}}}))},At=e=>!!(e.serverInstanceID&&e.assistantID&&e.name&&e.avatarSeed&&e.serverLabel&&e.connectionKey),jt=`openchamber.mobile-share.draft-handoff.v1`,Mt=`mobile-share-handoff:`,Nt=20971520,Pt=20971520,Ft=e=>`${Mt}${e}`,It=e=>typeof e.partID==`string`&&e.partID.startsWith(`mobile-share-handoff:`),Lt=e=>e??(typeof window>`u`?null:window.localStorage),G=e=>{if(!e)return{};try{let t=JSON.parse(e.getItem(`openchamber.mobile-share.draft-handoff.v1`)||`{}`);return Object.fromEntries(Object.entries(t).flatMap(([e,t])=>{let n=typeof t.assistantID==`string`?t.assistantID:Wt(t),r=typeof t.transportIdentity==`string`?t.transportIdentity:t.targetDraftKey?.transportIdentity;if(!n||typeof t.serverInstanceID!=`string`||typeof t.connectionKey!=`string`||!r)return[];let i=t.phase===`cancelled`?`cancelled`:t.phase===`materialized`?`materialized`:`materializing`;return[[e,{...t,draftID:e,assistantID:n,transportIdentity:r,phase:i}]]}))}catch{return{}}},Rt=(e,t)=>{if(!e)return!1;try{return e.setItem(jt,JSON.stringify(t)),!0}catch{return!1}},zt=(e,t)=>{let n=G(e);if(delete n[t],e)try{e.setItem(jt,JSON.stringify(n))}catch{return}},K=(e,t)=>Rt(e,{...G(e),[t.draftID]:t}),Bt=(e,t)=>`native-share:${e}:${t}`,Vt=(e,t)=>t?e?`${e}\n\n${t}`:t:e,Ht=e=>e.mime.startsWith(`image/`)&&e.byteSize>0&&e.byteSize<=Nt,Ut=(e,t)=>!!t?.syntheticParts.some(t=>t.partID===Ft(e.draftID)&&t.text===``&&t.attachments.length===0&&t.synthetic===!0),Wt=e=>{let t=e.targetDraftKey?.owner;return t?.kind!==`surface`||typeof t.ownerID!=`string`||!t.ownerID.startsWith(`assistant:`)?null:t.ownerID.slice(10)||null},Gt=e=>({draftID:e.draftID,serverInstanceID:e.serverInstanceID,connectionKey:e.connectionKey,assistantID:e.assistantID,transportIdentity:e.transportIdentity}),Kt=async(e,t)=>{let n=Lt(t),r=[];for(let t of Object.values(G(n))){if(t.phase===`cancelled`){r.push(Gt(t));continue}if(t.phase===`materialized`)try{await e(t.draftID);let i={...t,phase:`cancelled`};if(!K(n,i))continue;r.push(Gt(i))}catch{continue}}return r},qt=(e,t)=>{let n=Lt(t),r=G(n)[e.draftID];return!r||r.phase!==`cancelled`||r.serverInstanceID!==e.serverInstanceID||r.connectionKey!==e.connectionKey||r.assistantID!==e.assistantID||r.transportIdentity!==e.transportIdentity?!1:(zt(n,e.draftID),!G(n)[e.draftID])},Jt=async(e,t)=>{let n=d({transportIdentity:e.transportIdentity},`assistant:${e.assistantID}`),r=t.captureDraftRuntime();if(r.transportIdentity!==e.transportIdentity)return!1;let i=t.getDraft(n),a=Ft(e.draftID);try{if(!i||!i.syntheticParts.some(e=>e.partID===a)){await t.flushDraftPersistence();let n=t.captureDraftRuntime();return n.transportIdentity===e.transportIdentity&&n.generation===r.generation}let o=await t.commitDraftSnapshot({key:n,expectedRevision:i.revision,runtime:r,values:new Map,snapshot:{text:i.text,attachments:i.attachments,syntheticParts:i.syntheticParts.filter(e=>e.partID!==a),mentions:i.mentions,...i.composerReferences===void 0?{}:{composerReferences:i.composerReferences}}});if(!o.current||!o.durable)return!1;await t.flushDraftPersistence();let s=t.captureDraftRuntime();return s.transportIdentity===e.transportIdentity&&s.generation===r.generation}catch{return!1}},Yt=async(e,t)=>{if(e.attachments.length>10||!e.attachments.every(Ht)||e.attachments.reduce((e,t)=>e+t.byteSize,0)>Pt)throw Error(`invalid_share_attachment`);let n=Lt(t.storage),r=d({transportIdentity:t.transportIdentity},`assistant:${e.assistantID}`),i=G(n)[e.draftID],a=!1;if(!i||g(i.targetDraftKey)!==g(r)){let a=t.input.getDraft(r);if(i={draftID:e.draftID,serverInstanceID:e.serverInstanceID,connectionKey:e.connectionKey,assistantID:e.assistantID,transportIdentity:t.transportIdentity,targetDraftKey:r,baseRevision:a?.revision??`absent`,resultText:Vt(a?.text??``,e.text),attachmentIDs:e.attachments.map((t,n)=>Bt(e.draftID,n)),phase:`materializing`},!K(n,i))throw Error(`handoff_journal_unavailable`)}if(i.phase===`cancelled`)return{durable:!0,cancelled:!0};(i.phase===`materialized`||Ut(i,t.input.getDraft(r)))&&(a=!0);for(let o=0;!a&&o<3;o++){let o=t.input.getDraft(r),s={...i,baseRevision:o?.revision??`absent`,resultText:Vt(o?.text??``,e.text),phase:`materializing`};if(!K(n,s))throw Error(`handoff_journal_unavailable`);i=s;let c=new Map,l=[];for(let n=0;n<e.attachments.length;n++){let r=e.attachments[n],a=i.attachmentIDs[n],o=f(a),s=await t.readAttachment(r);if(s.size!==r.byteSize)throw Error(`staged_file_unavailable`);c.set(o,s.type===r.mime?s:new Blob([s],{type:r.mime})),l.push({attachmentID:a,attachmentRefID:o,filename:r.originalName,mimeType:r.mime,size:r.byteSize,locator:{kind:`blob`,blobID:a},source:`local`})}let u={partID:Ft(e.draftID),text:``,attachments:[],synthetic:!0},d=o?.syntheticParts??[],p=await t.input.commitDraftSnapshot({key:r,expectedRevision:o?.revision??`absent`,runtime:t.input.captureDraftRuntime(),snapshot:{text:i.resultText,attachments:[...o?.attachments??[],...l],syntheticParts:d.some(e=>e.partID===u.partID)?d:[...d,u],mentions:o?.mentions??[],...o?.composerReferences===void 0?{}:{composerReferences:o.composerReferences}},values:c});if(p.durable&&p.current)a=!0;else if(p.status!==`conflict`)throw Error(`draft_handoff_${p.status}`)}if(!a)throw Error(`draft_handoff_conflict`);if(i.phase!==`materialized`&&(i={...i,phase:`materialized`},!K(n,i)))throw Error(`handoff_journal_unavailable`);try{await t.cancelDraft(e.draftID)}catch{return{durable:!0,cancelled:!1}}if(i={...i,phase:`cancelled`},!K(n,i))throw Error(`handoff_journal_unavailable`);return{durable:!0,cancelled:!0}},Xt=x(`OpenChamberShare`),Zt=null,Qt=(e,t)=>i()===e&&s()===t,$t=e=>{if(ae()){se(e);return}let t=ie.getState();t.setActiveTab(`assistant`),t.openAssistant(e)},en=async()=>{let e=(await Xt.pendingAssistantOpen().catch(()=>null))?.request;if(!e)return!1;let t=await mt(e.connectionKey);if(t===`missing`)return await Xt.ackAssistantOpen({requestID:e.requestID}).catch(()=>void 0),!0;if(t!==`connected`)return!0;let n=s();if(!Qt(e.connectionKey,n))return!0;try{let[t,r]=await Promise.all([D(),pe()]);if(!Qt(e.connectionKey,n))return!0;let i=r.assistants.some(t=>t.id===e.assistantID&&t.enabled);if(!t.supported||!t.enabled||t.serverInstanceID!==e.serverInstanceID||!i)return await Xt.ackAssistantOpen({requestID:e.requestID}),!0;$t(e.assistantID),await Xt.ackAssistantOpen({requestID:e.requestID})}catch{}return!0},q=async()=>S.getPlatform()===`android`?Zt||(Zt=en().finally(()=>{Zt=null}),Zt):!1,tn=new Intl.Segmenter(void 0,{granularity:`grapheme`}),nn=/(?:\p{Extended_Pictographic}|\p{Regional_Indicator}|\u20e3)/u,rn=e=>{let t=tn.segment(e)[Symbol.iterator]().next().value?.segment;return!t||!nn.test(t)?{displayName:e}:{avatarEmoji:t,displayName:e.slice(t.length).trimStart()}},J=y();function an(e){let t=(0,ve.c)(30),{draft:n,entries:r,busy:i,onSelect:a,onCancel:o}=e,{t:s}=re(),c;t[0]!==i||t[1]!==n||t[2]!==o?(c=()=>{n&&!i&&o(n)},t[0]=i,t[1]=n,t[2]=o,t[3]=c):c=t[3];let l=C(c),u;t[4]===l?u=t[5]:(u=e=>{e||l()},t[4]=l,t[5]=u);let d=C(u),f;t[6]!==n||t[7]!==a?(f=e=>{n&&a(n,e)},t[6]=n,t[7]=a,t[8]=f):f=t[8];let p=C(f),m=!!n,h;t[9]===s?h=t[10]:(h=s(`assistants.shareWelcome.example.note.title`),t[9]=s,t[10]=h);let g;t[11]===s?g=t[12]:(g=s(`settings.common.actions.cancel`),t[11]=s,t[12]=g);let _;t[13]!==i||t[14]!==l||t[15]!==h||t[16]!==g?(_=(0,J.jsx)(fe,{title:h,backAriaLabel:g,onBack:l,backDisabled:i,overlay:!0}),t[13]=i,t[14]=l,t[15]=h,t[16]=g,t[17]=_):_=t[17];let v;t[18]!==i||t[19]!==r||t[20]!==p||t[21]!==s?(v=r.length?(0,J.jsx)(`div`,{className:`min-h-0 flex-1 overflow-y-auto px-3 pb-[max(0.75rem,env(safe-area-inset-bottom))] pt-[calc(max(0.25rem,var(--oc-safe-area-top,0px))+var(--oc-mobile-detail-navigation-height,3.5rem)+0.75rem)]`,role:`listbox`,"aria-label":s(`assistants.listAria`),children:r.map(e=>{let t=rn(e.name),n=t.displayName||e.name;return(0,J.jsxs)(`button`,{type:`button`,role:`option`,"aria-selected":`false`,disabled:i,className:`flex w-full items-center gap-3 border-b border-border/60 px-3 py-4 text-left text-foreground transition-colors last:border-b-0 hover:bg-interactive-hover focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-60`,onClick:()=>p(e),children:[(0,J.jsx)(me,{name:e.avatarSeed,emoji:t.avatarEmoji,size:36,label:n}),(0,J.jsxs)(`span`,{className:`min-w-0 flex-1`,children:[(0,J.jsx)(`span`,{className:`block truncate font-semibold`,children:n}),(0,J.jsx)(`span`,{className:`block truncate typography-small text-muted-foreground`,children:e.serverLabel})]}),(0,J.jsx)(he,{name:`arrow-right-s`,className:`size-4 shrink-0 text-muted-foreground`})]},`${e.connectionKey}:${e.assistantID}`)})}):(0,J.jsx)(`p`,{className:`px-5 pb-[max(1.25rem,env(safe-area-inset-bottom))] pt-[calc(max(0.25rem,var(--oc-safe-area-top,0px))+var(--oc-mobile-detail-navigation-height,3.5rem)+0.75rem)] typography-ui text-muted-foreground`,children:s(`assistants.state.unavailable`)}),t[18]=i,t[19]=r,t[20]=p,t[21]=s,t[22]=v):v=t[22];let y;t[23]!==_||t[24]!==v?(y=(0,J.jsxs)(ge,{className:`h-[100dvh] max-h-none w-screen max-w-none gap-0 overflow-hidden rounded-none border-0 bg-background p-0`,containerClassName:`items-stretch p-0`,overlayClassName:`bg-background`,showCloseButton:!1,children:[_,v]}),t[23]=_,t[24]=v,t[25]=y):y=t[25];let b;return t[26]!==d||t[27]!==m||t[28]!==y?(b=(0,J.jsx)(_e,{open:m,onOpenChange:d,children:y}),t[26]=d,t[27]=m,t[28]=y,t[29]=b):b=t[29],b}var on=t({MobileShareBridge:()=>zn,donateNativeAssistantInteraction:()=>On,publishNativeAssistantCatalog:()=>Dn,refreshNativeAssistantCatalog:()=>Q}),Y=x(`OpenChamberShare`),sn=`openchamber.mobile-share.outbox.v1`,cn=()=>S.isNativePlatform(),ln=()=>{try{return JSON.parse(window.localStorage.getItem(sn)||`{}`)}catch{return{}}},un=e=>{try{window.localStorage.setItem(sn,JSON.stringify(e))}catch{}},X=e=>{let t=ln(),n=t[e.envelope.operationID];n&&n.updatedAt>e.updatedAt||(t[e.envelope.operationID]=e,un(t))},Z=(e,t)=>i()===e&&s()===t,dn=new Map,fn=null,pn=null,mn=!1,hn=[],gn=0,_n=new Set,vn=new Map,yn=1,bn=e=>{e.map(e=>e.draftID).join(`
3
- `)!==hn.map(e=>e.draftID).join(`
4
- `)&&(hn=e,gn+=1,_n.forEach(e=>e()))},xn=e=>bn(hn.filter(t=>t.draftID!==e)),Sn=e=>(_n.add(e),()=>_n.delete(e)),Cn=()=>gn,wn=async e=>{if(!e.mime.startsWith(`image/`))throw Error(`unsupported_share_attachment`);let t=e.stagedPath.trim();if(!t)throw Error(`staged_file_unavailable`);let n=/^(?:data:|https?:|content:|file:)/i.test(t)?t:`file://${t}`,r=/^(?:data:|https?:)/i.test(n)?n:S.convertFileSrc(n);return await fetch(r).then(e=>{if(!e.ok)throw Error(`staged_file_unavailable`);return e.blob()})},Tn=async e=>{let t=await wn(e);return await new Promise((e,n)=>{let r=new FileReader;r.onerror=()=>n(Error(`staged_file_unavailable`)),r.onload=()=>typeof r.result==`string`?e(r.result):n(Error(`staged_file_unavailable`)),r.readAsDataURL(t)})},En=async e=>{let t=[];if(e.text?.trim()&&t.push({type:`text`,text:e.text}),e.attachments.length>10)throw Error(`too_many_share_attachments`);for(let n of e.attachments){if(n.byteSize<=0||n.byteSize>20971520)throw Error(`invalid_share_attachment`);t.push({type:`file`,mime:n.mime,url:await Tn(n)})}if(t.length===0)throw Error(`empty_share`);return t},Q=async()=>{if(!cn())return;let e=i(),t=(await lt()).find(t=>Fe(t)===e);if(!t)return;let n=s();try{let[r,i]=await Promise.all([D(),de()]);if(!Z(e,n)||!r.supported||!r.serverInstanceID)return;let a=r.serverInstanceID,o=i.assistants.map(n=>({serverInstanceID:a,assistantID:n.id,name:n.name,avatarSeed:n.id,serverLabel:t.label,connectionKey:e,enabled:r.enabled&&n.enabled,isDefaultShareTarget:!1}));E.getState().replaceCatalogPartition({serverInstanceID:a,connectionKey:e,revision:i.revision,lastLoadedAt:Date.now(),entries:o}),await Dn()}catch{}},Dn=async()=>{if(!cn())return;let e=Object.values(E.getState().assistantCatalogByConnection).flatMap(e=>e.entries).map(e=>{let t=rn(e.name);return{...e,name:t.displayName||e.name,...t.avatarEmoji?{avatarEmoji:t.avatarEmoji}:{}}});await Y.updateCatalog({entries:e})},On=async e=>{S.getPlatform()===`ios`&&await Y.donateAssistantInteraction(e)},kn=e=>{let t=dn.get(e.operationID);if(t)return t;let n=jn(e);return dn.set(e.operationID,n),n.finally(()=>{dn.get(e.operationID)===n&&dn.delete(e.operationID)}).catch(()=>void 0),n},An=async e=>{e.cleanupPhase!==`files-released`&&(e.cleanupPhase===`server-completed`&&(await Ot(()=>Y.ack({operationID:e.envelope.operationID})),e={...e,state:`delivered`,cleanupPhase:`native-acked`,updatedAt:Date.now()},X(e)),e.cleanupPhase===`native-acked`&&(await Ot(()=>Y.releaseFiles({operationID:e.envelope.operationID})),X({...e,state:`delivered`,cleanupPhase:`files-released`,updatedAt:Date.now()})))},jn=async e=>{let t=ln()[e.operationID];if(t?.cleanupPhase){await An(t);return}let n=t?.messageID?t:{envelope:e,messageID:h(`msg`),state:t?.state??`pending`,cleanupPhase:t?.cleanupPhase,updatedAt:Date.now(),error:t?.error};X(n),n={...n,state:`resolving-instance`,updatedAt:Date.now()},X(n);let i=Object.values(E.getState().assistantCatalogByConnection).find(t=>t.serverInstanceID===e.serverInstanceID&&t.entries.some(t=>t.assistantID===e.assistantID));if(!i){X({...n,state:`target-stale`,updatedAt:Date.now()});return}n={...n,state:`connecting`,updatedAt:Date.now()},X(n);let a=await mt(i.connectionKey);if(a===`auth-required`){X({...n,state:`auth-required`,updatedAt:Date.now()});return}if(a!==`connected`){X({...n,state:`offline`,updatedAt:Date.now()});return}let o=s(),c=null;if(Z(i.connectionKey,o)){try{if(await m(`/api/config/settings`).catch(()=>void 0),!Z(i.connectionKey,o))return;let[t,a]=await Promise.all([D(),de()]);if(!Z(i.connectionKey,o)||!t.supported||t.serverInstanceID!==e.serverInstanceID){X({...n,state:`target-stale`,updatedAt:Date.now()});return}let s=a.assistants.find(t=>t.id===e.assistantID&&t.enabled);if(!t.enabled||!s){X({...n,state:`target-stale`,updatedAt:Date.now()});return}n={...n,state:`dispatching`,updatedAt:Date.now()},X(n);let l=await En(e);if(!Z(i.connectionKey,o))return;n={...n,state:`reconciling`,updatedAt:Date.now()},X(n);let u=await ue(s.id,e.operationID,n.messageID,l,e.source),d=await le(u,r(),o),f=await pe().catch(e=>(X({...n,state:`reconciling`,updatedAt:Date.now(),error:e instanceof Error?e.message:`snapshot_refresh_failed`}),null));if(!f)return;if(!Z(i.connectionKey,o)){X({...n,state:`reconciling`,updatedAt:Date.now(),error:`runtime_stale`});return}let p=f.assistants.find(e=>e.id===s.id);if(!p||p.sessionID!==d.sessionID){X({...n,state:`reconciling`,updatedAt:Date.now(),error:`assistant_binding_mismatch`});return}c=p.id}catch(e){if(e instanceof ce&&e.code===`share_unresolved`||e instanceof Error&&e.message===`runtime_stale`){X({...n,state:`reconciling`,updatedAt:Date.now(),error:e instanceof Error?e.message:`share_unresolved`});return}X({...n,state:`failed`,updatedAt:Date.now(),error:e instanceof Error?e.message:`dispatch_failed`});return}n={...n,state:`delivered`,cleanupPhase:`server-completed`,updatedAt:Date.now()},X(n),$t(c),await An(n)}},Mn=async()=>fn||(fn=Nn().finally(()=>{fn=null}),fn),Nn=async()=>{if(!cn())return;let e=await Y.listPending().catch(()=>null),t=new Map((e?.envelopes??[]).map(e=>[e.operationID,e])),n=ln();await kt([...[...t.values()].map(e=>({operationID:e.operationID,cleanupPhase:n[e.operationID]?.cleanupPhase})),...Object.values(n).filter(e=>!t.has(e.envelope.operationID)&&(!!(e.cleanupPhase&&e.cleanupPhase!==`files-released`)||e.state!==`delivered`&&e.state!==`auth-required`&&e.state!==`target-stale`)).map(e=>({operationID:e.envelope.operationID,cleanupPhase:e.cleanupPhase}))],{deliver:async e=>{let r=t.get(e)??n[e]?.envelope;r&&await kn(r)},cleanup:async e=>{let t=ln()[e];t&&await An(t)}},yn)},$=async()=>(mn=!0,pn||(pn=(async()=>{do mn=!1,await Rn();while(mn)})().finally(()=>{pn=null,mn&&$()}),pn)),Pn=async e=>{if(i()!==e.connectionKey&&await mt(e.connectionKey)!==`connected`)return!1;let t=s();if(!Z(e.connectionKey,t)||r()!==e.transportIdentity||(await m(`/api/config/settings`).catch(()=>void 0),!Z(e.connectionKey,t)||r()!==e.transportIdentity)||!await w.getState().hydrateDraftMetadata(e.transportIdentity)||!Z(e.connectionKey,t)||r()!==e.transportIdentity)return!1;let[n,a]=await Promise.all([D(),pe()]);return!Z(e.connectionKey,t)||r()!==e.transportIdentity||!n.supported||!n.enabled||n.serverInstanceID!==e.serverInstanceID||!a.assistants.some(t=>t.id===e.assistantID&&t.enabled)?!1:($t(e.assistantID),!0)},Fn=async e=>{let t=i(),n=s();if(await m(`/api/config/settings`).catch(()=>void 0),!Z(t,n))return null;try{let[i,a]=await Promise.all([D(),pe()]);return!Z(t,n)||!i.supported||!i.enabled||i.serverInstanceID!==e.serverInstanceID||!a.assistants.some(t=>t.id===e.assistantID&&t.enabled)?null:{runtimeKey:t,generation:n,transportIdentity:r()}}catch{return null}},In=async e=>{let t=Object.values(E.getState().assistantCatalogByConnection).find(t=>t.serverInstanceID===e.serverInstanceID&&t.connectionKey===e.connectionKey&&t.entries.some(t=>t.assistantID===e.assistantID));if(!t)return!1;let n=await Fn(e);if(!n&&(await mt(t.connectionKey,{transportPreference:`relay`})!==`connected`||(n=await Fn(e),!n)))return!1;let{runtimeKey:i,generation:a,transportIdentity:o}=n;if(!await w.getState().hydrateDraftMetadata(o)||!Z(i,a)||r()!==o)return!1;let s=await Yt(e,{input:w.getState(),transportIdentity:o,cancelDraft:e=>Y.cancelDraft({draftID:e}),readAttachment:wn});if(!s.durable||!s.cancelled||!Z(i,a)||r()!==o)return!1;let c={draftID:e.draftID,serverInstanceID:e.serverInstanceID,connectionKey:e.connectionKey,assistantID:e.assistantID,transportIdentity:o};return $t(e.assistantID),await Jt(c,w.getState())&&qt(c),!0},Ln=e=>{let t=vn.get(e.draftID);if(t)return t;let n=In(e).catch(()=>!1).finally(()=>{vn.get(e.draftID)===n&&vn.delete(e.draftID)});return vn.set(e.draftID,n),n},Rn=async()=>{if(S.getPlatform()!==`android`)return;let e=await Kt(e=>Y.cancelDraft({draftID:e}));for(let t of e)try{await Pn(t)&&await Jt(t,w.getState())&&qt(t)}catch{}let t=await Y.listDrafts().catch(()=>null);if(!t)return;let n=[...t?.drafts??[]].sort((e,t)=>e.createdAt-t.createdAt);bn(n.filter(e=>!At(e)));for(let e of n)At(e)&&await Ln(e)},zn=()=>{let e=(0,ve.c)(11);O.useSyncExternalStore(Sn,Cn,Cn);let t=E(Bn),[n,r]=O.useState(null),i=O.useRef(null),a;e[0]===t?a=e[1]:(a=Object.values(t).flatMap(Vn).filter(Hn).sort(Un),e[0]=t,e[1]=a);let o=a,s=hn[0]??null,c;e[2]===Symbol.for(`react.memo_cache_sentinel`)?(c=(e,t)=>{i.current||(i.current=e.draftID,r(e.draftID),Ln({...e,serverInstanceID:t.serverInstanceID,assistantID:t.assistantID,name:t.name,avatarSeed:t.avatarSeed,serverLabel:t.serverLabel,connectionKey:t.connectionKey}).then(t=>{t&&xn(e.draftID)}).finally(()=>{i.current===e.draftID&&(i.current=null),r(t=>t===e.draftID?null:t)}))},e[2]=c):c=e[2];let l=C(c),u;e[3]===n?u=e[4]:(u=e=>{n!==e.draftID&&(xn(e.draftID),Y.cancelDraft({draftID:e.draftID}).catch(Wn))},e[3]=n,e[4]=u);let d=C(u),f;e[5]===Symbol.for(`react.memo_cache_sentinel`)?(f=[],e[5]=f):f=e[5],O.useEffect($n,f);let p=n===s?.draftID,m;return e[6]!==d||e[7]!==o||e[8]!==l||e[9]!==p?(m=(0,J.jsx)(an,{draft:s,entries:o,busy:p,onSelect:l,onCancel:d}),e[6]=d,e[7]=o,e[8]=l,e[9]=p,e[10]=m):m=e[10],m};function Bn(e){return e.assistantCatalogByConnection}function Vn(e){return e.entries}function Hn(e){return e.enabled}function Un(e,t){return Number(t.isDefaultShareTarget)-Number(e.isDefaultShareTarget)||e.serverLabel.localeCompare(t.serverLabel)||e.name.localeCompare(t.name)}function Wn(){$()}function Gn(){Q(),$(),q()}function Kn(){Q(),Mn(),$(),q()}function qn(){Mn()}function Jn(){}function Yn(){$()}function Xn(){}function Zn(){q()}function Qn(){}function $n(){if(!cn())return;Q(),Mn(),$(),q();let e=l(Gn),t=Kn;window.addEventListener(`openchamber:system-resume`,t);let n=!1,r=null,i=null,a=null;return Y.addListener(`shareReceived`,qn).then(e=>{n?e.remove():r=e}).catch(Jn),Y.addListener(`shareDraftReceived`,Yn).then(e=>{n?e.remove():i=e}).catch(Xn),Y.addListener(`assistantOpenRequested`,Zn).then(e=>{n?e.remove():a=e}).catch(Qn),()=>{n=!0,e(),window.removeEventListener(`openchamber:system-resume`,t),r&&r.remove(),i&&i.remove(),a&&a.remove()}}export{rn as a,pt as c,xt as d,St as f,Q as i,M as l,On as n,q as o,Dt as p,Dn as r,It as s,zn as t,ft as u};