@openchambery/web 1.19.5-beta.7 → 1.19.5-beta.9

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 (89) hide show
  1. package/dist/assets/{AgentAvatar-DMpOrMIQ.js → AgentAvatar-BceI_qBC.js} +1 -1
  2. package/dist/assets/{AssistantView-DEZmCJfZ.js → AssistantView-D5uRIhdd.js} +1 -1
  3. package/dist/assets/{ChatContainer-7xklhgZ-.js → ChatContainer-vRoWqx9I.js} +32 -32
  4. package/dist/assets/ContextPanel-BsZ6pucf.js +285 -0
  5. package/dist/assets/{DiagramView-BSMYmwZG.js → DiagramView-tg_cF9bP.js} +1 -1
  6. package/dist/assets/{FadeInOnReveal-Cy3sf2M5.js → FadeInOnReveal-Cj9ZC3Ab.js} +1 -1
  7. package/dist/assets/{Icon-BLWVqBee.js → Icon-Du1LX11Q.js} +1 -1
  8. package/dist/assets/MarkdownRendererImpl-CUbq7MnV.js +7 -0
  9. package/dist/assets/{MobileDetailNavigation-CROyz_Yw.js → MobileDetailNavigation-C3FPxLXw.js} +1 -1
  10. package/dist/assets/{MobileShareBridge-CrE7VKlJ.js → MobileShareBridge-CwfVGh1E.js} +2 -2
  11. package/dist/assets/{MobileSurface-B3dgnpZC.js → MobileSurface-D7DvzqGV.js} +1 -1
  12. package/dist/assets/{MultiRunWindow-uy0wv612.js → MultiRunWindow-DeM0arSL.js} +1 -1
  13. package/dist/assets/{OnboardingScreen-DoR_GB8b.js → OnboardingScreen-Czusf7rR.js} +1 -1
  14. package/dist/assets/{OverlayScrollbar-GQgJusKL.js → OverlayScrollbar-oOLMqq2s.js} +1 -1
  15. package/dist/assets/{SettingsView-bYtAIupZ.js → SettingsView-3mxG03Kg.js} +6 -6
  16. package/dist/assets/{SettingsWindow-CyxAWGwL.js → SettingsWindow-CKVr8vEW.js} +1 -1
  17. package/dist/assets/{TerminalView-CkpXj357.js → TerminalView-B2vNAAGI.js} +1 -1
  18. package/dist/assets/{ToolOutputDialog-GNBM3JdP.js → ToolOutputDialog-FY1p6ABd.js} +1 -1
  19. package/dist/assets/{appThemeRegistry-CSmVLXHb.js → appThemeRegistry-CxYhYWfx.js} +2 -2
  20. package/dist/assets/{button-CeCkEpvn.js → button-p6vbd3r6.js} +1 -1
  21. package/dist/assets/{clipboard-CadKjjVT.js → clipboard-Ca2PSbr_.js} +1 -1
  22. package/dist/assets/{collapsible-B-aagADh.js → collapsible-Cimoz0kx.js} +1 -1
  23. package/dist/assets/{desktopHosts-BrrYPqKq.js → desktopHosts-DceeVBky.js} +1 -1
  24. package/dist/assets/{desktopRelayRestore-DR60DATT.js → desktopRelayRestore-B0MRdR5y.js} +1 -1
  25. package/dist/assets/{diagram-Cxma_IKI.js → diagram-DX_MPRs3.js} +1 -1
  26. package/dist/assets/{dialog-Dz2MBeLn.js → dialog-B2ieeCSR.js} +1 -1
  27. package/dist/assets/{es-BZlHrH2p.js → es-Bj9HwM-0.js} +1 -1
  28. package/dist/assets/{fileQueries-BJKLdYos.js → fileQueries-BDld6h3B.js} +1 -1
  29. package/dist/assets/{fr-Dkw9WDcW.js → fr-BgEHZGug.js} +1 -1
  30. package/dist/assets/{gitApi-D_n3g-Ox.js → gitApi-CIStyhfQ.js} +3 -3
  31. package/dist/assets/{input-CyG05w-V.js → input-gaFVNq1P.js} +1 -1
  32. package/dist/assets/insertionBoundaries-DKaP2akF.js +4 -0
  33. package/dist/assets/{ja-DW5lcaNV.js → ja-clyxf6re.js} +1 -1
  34. package/dist/assets/{ko-B9WorSEt.js → ko-BZb3gnuq.js} +1 -1
  35. package/dist/assets/{main-CvXypdcN.js → main-4AJr41lz.js} +2 -2
  36. package/dist/assets/main-BXQdBQ0u.js +29 -0
  37. package/dist/assets/{markdown-worker-C7TuaOUy.js → markdown-worker-CoO82KYF.js} +4 -4
  38. package/dist/assets/{markdownTheme-H7_7lbuh.js → markdownTheme-St8zxDvJ.js} +1 -1
  39. package/dist/assets/{miniChat-DGAhFdQF.js → miniChat-xTsSFILb.js} +2 -2
  40. package/dist/assets/mobile-BCQf1Sdm.js +2 -0
  41. package/dist/assets/multirun-BGtjVyHw.js +4 -0
  42. package/dist/assets/{persistence-DE9RnVcA.js → persistence-CLUawIlm.js} +1 -1
  43. package/dist/assets/{pl-CyKNdwrh.js → pl-CwZzSvrm.js} +1 -1
  44. package/dist/assets/{platform-MjT8iqKB.js → platform-BrncW9ab.js} +1 -1
  45. package/dist/assets/{projectMeta-DVNZvZ46.js → projectMeta-DPKKf4Of.js} +2 -2
  46. package/dist/assets/{pt-BR-Ch6qBc5C.js → pt-BR-6ali2BQX.js} +1 -1
  47. package/dist/assets/{radio-BMoCQO6a.js → radio-CkwG8Ru_.js} +1 -1
  48. package/dist/assets/renderElectronMiniChatApp-BLlVyeOM.js +2 -0
  49. package/dist/assets/renderMobileApp-CCjMtagc.js +25 -0
  50. package/dist/assets/{runtimeConfig-CeCzxsbJ.js → runtimeConfig-HOGA9fV1.js} +1 -1
  51. package/dist/assets/runtimeEndpointReset-pH89Ln7s.js +4 -0
  52. package/dist/assets/{shikiHighlight-H1oY_bZc.js → shikiHighlight-CYGn2J0U.js} +1 -1
  53. package/dist/assets/{sortable-tabs-strip-xB36tCMU.js → sortable-tabs-strip-CxLE1X9x.js} +1 -1
  54. package/dist/assets/{src-CD7-ovJ5.css → src-Bd_0IB9v.css} +1 -1
  55. package/dist/assets/{store-DtS03LqZ.js → store-BvrCRq6U.js} +1 -1
  56. package/dist/assets/{terminalApi-Bnx0KvaV.js → terminalApi-D2OzR0I3.js} +1 -1
  57. package/dist/assets/{tooltip-B__x-HDJ.js → tooltip-D1a6rKLA.js} +1 -1
  58. package/dist/assets/{uk-D1ao_8g2.js → uk-qRqJs4GS.js} +1 -1
  59. package/dist/assets/{url-CTuw7Rjf.js → url-zwuNq3GS.js} +1 -1
  60. package/dist/assets/{useAppFontEffects-NG6gPkgZ.js → useAppFontEffects-Bs2vXOZc.js} +4 -4
  61. package/dist/assets/{useAssistantUIStore-D2K7ksGj.js → useAssistantUIStore-D699Sbdb.js} +1 -1
  62. package/dist/assets/{useDesktopWindowControlsLayout-DLWjejno.js → useDesktopWindowControlsLayout-BF-8wlNn.js} +1 -1
  63. package/dist/assets/{useEffectiveDirectory-DA4GhF7a.js → useEffectiveDirectory-VgouJnIr.js} +1 -1
  64. package/dist/assets/{useFontPreferences-CWZnNRjz.js → useFontPreferences-F2QPNE2V.js} +1 -1
  65. package/dist/assets/{useMobileNavigationStore-BU5I6tvY.js → useMobileNavigationStore-KGRUWzjR.js} +9 -9
  66. package/dist/assets/{useSessionAutoCleanup-4ropqZdl.js → useSessionAutoCleanup-Bw0QGMfA.js} +1 -1
  67. package/dist/assets/{useUIStore-DOxLVeGb.js → useUIStore-BXjMQrel.js} +1 -1
  68. package/dist/assets/{useWorkerHighlightedLines-IDeqjpbY.js → useWorkerHighlightedLines-CGgUFz01.js} +1 -1
  69. package/dist/assets/{utils-C2R0YoC5.js → utils-D94hxQYq.js} +1 -1
  70. package/dist/assets/{zh-CN-BXlKlFLt.js → zh-CN-CwZ0adcY.js} +1 -1
  71. package/dist/assets/{zh-TW-DJF4ZBft.js → zh-TW-DC0jiCzA.js} +1 -1
  72. package/dist/index.html +9 -9
  73. package/dist/mini-chat.html +9 -9
  74. package/dist/mobile.html +9 -9
  75. package/package.json +1 -1
  76. package/server/index.js +0 -3
  77. package/server/lib/notifications/DOCUMENTATION.md +2 -2
  78. package/server/lib/notifications/push-runtime.js +4 -14
  79. package/server/lib/notifications/runtime.js +11 -20
  80. package/server/lib/notifications/runtime.test.js +4 -6
  81. package/dist/assets/ContextPanel-BxDa7ise.js +0 -285
  82. package/dist/assets/MarkdownRendererImpl-nOIABlFe.js +0 -7
  83. package/dist/assets/insertionBoundaries-BWQFX2-v.js +0 -4
  84. package/dist/assets/main-D8bG2Z4J.js +0 -29
  85. package/dist/assets/mobile-yPEbqNoZ.js +0 -2
  86. package/dist/assets/multirun-BknRCqi_.js +0 -4
  87. package/dist/assets/renderElectronMiniChatApp-B5xeh2ZJ.js +0 -2
  88. package/dist/assets/renderMobileApp-CUawlRGR.js +0 -23
  89. package/dist/assets/runtimeEndpointReset-DsyMqEdY.js +0 -4
@@ -221,8 +221,7 @@ export const createPushRuntime = (deps) => {
221
221
  }
222
222
  };
223
223
 
224
- const sendPushToAllUiSessions = async (payload, options = {}) => {
225
- const requireNoSse = options.requireNoSse === true;
224
+ const sendPushToAllUiSessions = async (payload) => {
226
225
  const store = await readPushSubscriptionsFromDisk();
227
226
  const sessions = store.subscriptionsBySession || {};
228
227
  const subscriptionsByEndpoint = new Map();
@@ -239,14 +238,6 @@ export const createPushRuntime = (deps) => {
239
238
  }
240
239
 
241
240
  await Promise.all(Array.from(subscriptionsByEndpoint.values()).map(async (sub) => {
242
- if (requireNoSse) {
243
- // Mobile PWA subscriptions follow the same presence model as native push: suppress only
244
- // when an interactive (desktop/web) client is visible. The phone PWA's own foreground is
245
- // handled in the service worker (focused-client check), so it won't double-notify.
246
- // Non-mobile (desktop/web) subscriptions keep the existing any-visible gate.
247
- const suppressed = isMobilePlatform(sub.platform) ? isAnyInteractiveClientVisible() : isAnyUiVisible();
248
- if (suppressed) return;
249
- }
250
241
  await sendPushToSubscription(sub, payload);
251
242
  }));
252
243
  };
@@ -278,10 +269,9 @@ export const createPushRuntime = (deps) => {
278
269
  return false;
279
270
  };
280
271
 
281
- // True when at least one NON-mobile client (desktop/web/vscode) is currently visible. Used to
282
- // suppress native push to the phone: an active desktop already shows the notification, so the
283
- // phone doesn't need it. Deliberately based on the desktop's visibility (reliable), never the
284
- // phone's own (a backgrounded WKWebView can't report "hidden" before iOS suspends it).
272
+ // True when at least one NON-mobile client (desktop/web/vscode) is currently visible.
273
+ // Not a push gate delivery always fans out. Kept as a visibility query for tests and
274
+ // diagnostics. Deliberately based on the desktop's visibility, never the phone's own.
285
275
  const isAnyInteractiveClientVisible = () => {
286
276
  const now = Date.now();
287
277
  pruneUiVisibility(now);
@@ -12,7 +12,6 @@ export const createNotificationTriggerRuntime = (deps) => {
12
12
  sendPushToAllUiSessions,
13
13
  sendApnsToAllUiSessions,
14
14
  sendLiveActivityEnd,
15
- isAnyInteractiveClientVisible,
16
15
  buildOpenCodeUrl,
17
16
  getOpenCodeAuthHeaders,
18
17
  } = deps;
@@ -68,25 +67,17 @@ export const createNotificationTriggerRuntime = (deps) => {
68
67
  };
69
68
 
70
69
  // Fan a notification out to every delivery channel: browser web-push (full templated
71
- // payload) and native iOS APNs (generic model-based text). Both share the dedup tag and
72
- // `requireNoSse` focus gate; a failure in one channel must not block the other.
73
- const fanoutPush = (payload, options) => {
74
- // Presence-aware routing: if any interactive (non-mobile) client — desktop/web/vscode — is
75
- // currently visible, it already shows the in-app notification, so skip the native push to the
76
- // phone. Gated on the desktop's visibility (reliable), never the phone's own. When we skip we
77
- // also skip toApnsGenericPayload, so the badge isn't incremented for an undelivered push.
78
- const interactiveVisible = isAnyInteractiveClientVisible?.() === true;
79
- return Promise.all([
80
- Promise.resolve(sendPushToAllUiSessions?.(payload, options)).catch((error) => {
81
- console.warn('[Push] web-push fanout failed:', error?.message ?? error);
82
- }),
83
- interactiveVisible
84
- ? Promise.resolve()
85
- : Promise.resolve(sendApnsToAllUiSessions?.(toApnsGenericPayload(payload), options)).catch((error) => {
86
- console.warn('[APNs] fanout failed:', error?.message ?? error);
87
- }),
88
- ]);
89
- };
70
+ // payload) and native iOS APNs (generic model-based text). Both share the dedup tag;
71
+ // a failure in one channel must not block the other. Visibility on any other client
72
+ // never suppresses delivery every subscribed surface gets the push.
73
+ const fanoutPush = (payload, options) => Promise.all([
74
+ Promise.resolve(sendPushToAllUiSessions?.(payload, options)).catch((error) => {
75
+ console.warn('[Push] web-push fanout failed:', error?.message ?? error);
76
+ }),
77
+ Promise.resolve(sendApnsToAllUiSessions?.(toApnsGenericPayload(payload), options)).catch((error) => {
78
+ console.warn('[APNs] fanout failed:', error?.message ?? error);
79
+ }),
80
+ ]);
90
81
 
91
82
  let getIsWindowFocused = typeof deps.getIsWindowFocused === 'function'
92
83
  ? deps.getIsWindowFocused
@@ -28,7 +28,6 @@ const createRuntime = (overrides = {}) => {
28
28
  sendPushToAllUiSessions,
29
29
  sendApnsToAllUiSessions,
30
30
  sendLiveActivityEnd,
31
- isAnyInteractiveClientVisible: () => false,
32
31
  buildOpenCodeUrl: (path) => `http://opencode.test${path}`,
33
32
  getOpenCodeAuthHeaders: () => ({}),
34
33
  getIsWindowFocused: () => false,
@@ -224,14 +223,13 @@ describe('notification trigger live activity end', () => {
224
223
  expect(sendApnsToAllUiSessions).not.toHaveBeenCalled();
225
224
  });
226
225
 
227
- it('ends the live activity even when an interactive client is visible', async () => {
226
+ it('still sends native push when another client is visible', async () => {
228
227
  vi.stubGlobal('fetch', vi.fn(async () => rootSessionResponse()));
229
- const { runtime, sendLiveActivityEnd, sendApnsToAllUiSessions } = createRuntime({
230
- isAnyInteractiveClientVisible: () => true,
231
- });
228
+ const { runtime, sendLiveActivityEnd, sendApnsToAllUiSessions, sendPushToAllUiSessions } = createRuntime();
232
229
  await runtime.maybeSendPushForTrigger(completionPayload());
233
230
  expect(sendLiveActivityEnd).toHaveBeenCalledWith({ sessionId: 'ses_root', status: 'complete' });
234
- expect(sendApnsToAllUiSessions).not.toHaveBeenCalled();
231
+ expect(sendPushToAllUiSessions).toHaveBeenCalledTimes(1);
232
+ expect(sendApnsToAllUiSessions).toHaveBeenCalledTimes(1);
235
233
  });
236
234
 
237
235
  it('suppresses live activity end for child and small-model sessions', async () => {