@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.
- package/dist/assets/{AgentAvatar-DMpOrMIQ.js → AgentAvatar-BceI_qBC.js} +1 -1
- package/dist/assets/{AssistantView-DEZmCJfZ.js → AssistantView-D5uRIhdd.js} +1 -1
- package/dist/assets/{ChatContainer-7xklhgZ-.js → ChatContainer-vRoWqx9I.js} +32 -32
- package/dist/assets/ContextPanel-BsZ6pucf.js +285 -0
- package/dist/assets/{DiagramView-BSMYmwZG.js → DiagramView-tg_cF9bP.js} +1 -1
- package/dist/assets/{FadeInOnReveal-Cy3sf2M5.js → FadeInOnReveal-Cj9ZC3Ab.js} +1 -1
- package/dist/assets/{Icon-BLWVqBee.js → Icon-Du1LX11Q.js} +1 -1
- package/dist/assets/MarkdownRendererImpl-CUbq7MnV.js +7 -0
- package/dist/assets/{MobileDetailNavigation-CROyz_Yw.js → MobileDetailNavigation-C3FPxLXw.js} +1 -1
- package/dist/assets/{MobileShareBridge-CrE7VKlJ.js → MobileShareBridge-CwfVGh1E.js} +2 -2
- package/dist/assets/{MobileSurface-B3dgnpZC.js → MobileSurface-D7DvzqGV.js} +1 -1
- package/dist/assets/{MultiRunWindow-uy0wv612.js → MultiRunWindow-DeM0arSL.js} +1 -1
- package/dist/assets/{OnboardingScreen-DoR_GB8b.js → OnboardingScreen-Czusf7rR.js} +1 -1
- package/dist/assets/{OverlayScrollbar-GQgJusKL.js → OverlayScrollbar-oOLMqq2s.js} +1 -1
- package/dist/assets/{SettingsView-bYtAIupZ.js → SettingsView-3mxG03Kg.js} +6 -6
- package/dist/assets/{SettingsWindow-CyxAWGwL.js → SettingsWindow-CKVr8vEW.js} +1 -1
- package/dist/assets/{TerminalView-CkpXj357.js → TerminalView-B2vNAAGI.js} +1 -1
- package/dist/assets/{ToolOutputDialog-GNBM3JdP.js → ToolOutputDialog-FY1p6ABd.js} +1 -1
- package/dist/assets/{appThemeRegistry-CSmVLXHb.js → appThemeRegistry-CxYhYWfx.js} +2 -2
- package/dist/assets/{button-CeCkEpvn.js → button-p6vbd3r6.js} +1 -1
- package/dist/assets/{clipboard-CadKjjVT.js → clipboard-Ca2PSbr_.js} +1 -1
- package/dist/assets/{collapsible-B-aagADh.js → collapsible-Cimoz0kx.js} +1 -1
- package/dist/assets/{desktopHosts-BrrYPqKq.js → desktopHosts-DceeVBky.js} +1 -1
- package/dist/assets/{desktopRelayRestore-DR60DATT.js → desktopRelayRestore-B0MRdR5y.js} +1 -1
- package/dist/assets/{diagram-Cxma_IKI.js → diagram-DX_MPRs3.js} +1 -1
- package/dist/assets/{dialog-Dz2MBeLn.js → dialog-B2ieeCSR.js} +1 -1
- package/dist/assets/{es-BZlHrH2p.js → es-Bj9HwM-0.js} +1 -1
- package/dist/assets/{fileQueries-BJKLdYos.js → fileQueries-BDld6h3B.js} +1 -1
- package/dist/assets/{fr-Dkw9WDcW.js → fr-BgEHZGug.js} +1 -1
- package/dist/assets/{gitApi-D_n3g-Ox.js → gitApi-CIStyhfQ.js} +3 -3
- package/dist/assets/{input-CyG05w-V.js → input-gaFVNq1P.js} +1 -1
- package/dist/assets/insertionBoundaries-DKaP2akF.js +4 -0
- package/dist/assets/{ja-DW5lcaNV.js → ja-clyxf6re.js} +1 -1
- package/dist/assets/{ko-B9WorSEt.js → ko-BZb3gnuq.js} +1 -1
- package/dist/assets/{main-CvXypdcN.js → main-4AJr41lz.js} +2 -2
- package/dist/assets/main-BXQdBQ0u.js +29 -0
- package/dist/assets/{markdown-worker-C7TuaOUy.js → markdown-worker-CoO82KYF.js} +4 -4
- package/dist/assets/{markdownTheme-H7_7lbuh.js → markdownTheme-St8zxDvJ.js} +1 -1
- package/dist/assets/{miniChat-DGAhFdQF.js → miniChat-xTsSFILb.js} +2 -2
- package/dist/assets/mobile-BCQf1Sdm.js +2 -0
- package/dist/assets/multirun-BGtjVyHw.js +4 -0
- package/dist/assets/{persistence-DE9RnVcA.js → persistence-CLUawIlm.js} +1 -1
- package/dist/assets/{pl-CyKNdwrh.js → pl-CwZzSvrm.js} +1 -1
- package/dist/assets/{platform-MjT8iqKB.js → platform-BrncW9ab.js} +1 -1
- package/dist/assets/{projectMeta-DVNZvZ46.js → projectMeta-DPKKf4Of.js} +2 -2
- package/dist/assets/{pt-BR-Ch6qBc5C.js → pt-BR-6ali2BQX.js} +1 -1
- package/dist/assets/{radio-BMoCQO6a.js → radio-CkwG8Ru_.js} +1 -1
- package/dist/assets/renderElectronMiniChatApp-BLlVyeOM.js +2 -0
- package/dist/assets/renderMobileApp-CCjMtagc.js +25 -0
- package/dist/assets/{runtimeConfig-CeCzxsbJ.js → runtimeConfig-HOGA9fV1.js} +1 -1
- package/dist/assets/runtimeEndpointReset-pH89Ln7s.js +4 -0
- package/dist/assets/{shikiHighlight-H1oY_bZc.js → shikiHighlight-CYGn2J0U.js} +1 -1
- package/dist/assets/{sortable-tabs-strip-xB36tCMU.js → sortable-tabs-strip-CxLE1X9x.js} +1 -1
- package/dist/assets/{src-CD7-ovJ5.css → src-Bd_0IB9v.css} +1 -1
- package/dist/assets/{store-DtS03LqZ.js → store-BvrCRq6U.js} +1 -1
- package/dist/assets/{terminalApi-Bnx0KvaV.js → terminalApi-D2OzR0I3.js} +1 -1
- package/dist/assets/{tooltip-B__x-HDJ.js → tooltip-D1a6rKLA.js} +1 -1
- package/dist/assets/{uk-D1ao_8g2.js → uk-qRqJs4GS.js} +1 -1
- package/dist/assets/{url-CTuw7Rjf.js → url-zwuNq3GS.js} +1 -1
- package/dist/assets/{useAppFontEffects-NG6gPkgZ.js → useAppFontEffects-Bs2vXOZc.js} +4 -4
- package/dist/assets/{useAssistantUIStore-D2K7ksGj.js → useAssistantUIStore-D699Sbdb.js} +1 -1
- package/dist/assets/{useDesktopWindowControlsLayout-DLWjejno.js → useDesktopWindowControlsLayout-BF-8wlNn.js} +1 -1
- package/dist/assets/{useEffectiveDirectory-DA4GhF7a.js → useEffectiveDirectory-VgouJnIr.js} +1 -1
- package/dist/assets/{useFontPreferences-CWZnNRjz.js → useFontPreferences-F2QPNE2V.js} +1 -1
- package/dist/assets/{useMobileNavigationStore-BU5I6tvY.js → useMobileNavigationStore-KGRUWzjR.js} +9 -9
- package/dist/assets/{useSessionAutoCleanup-4ropqZdl.js → useSessionAutoCleanup-Bw0QGMfA.js} +1 -1
- package/dist/assets/{useUIStore-DOxLVeGb.js → useUIStore-BXjMQrel.js} +1 -1
- package/dist/assets/{useWorkerHighlightedLines-IDeqjpbY.js → useWorkerHighlightedLines-CGgUFz01.js} +1 -1
- package/dist/assets/{utils-C2R0YoC5.js → utils-D94hxQYq.js} +1 -1
- package/dist/assets/{zh-CN-BXlKlFLt.js → zh-CN-CwZ0adcY.js} +1 -1
- package/dist/assets/{zh-TW-DJF4ZBft.js → zh-TW-DC0jiCzA.js} +1 -1
- package/dist/index.html +9 -9
- package/dist/mini-chat.html +9 -9
- package/dist/mobile.html +9 -9
- package/package.json +1 -1
- package/server/index.js +0 -3
- package/server/lib/notifications/DOCUMENTATION.md +2 -2
- package/server/lib/notifications/push-runtime.js +4 -14
- package/server/lib/notifications/runtime.js +11 -20
- package/server/lib/notifications/runtime.test.js +4 -6
- package/dist/assets/ContextPanel-BxDa7ise.js +0 -285
- package/dist/assets/MarkdownRendererImpl-nOIABlFe.js +0 -7
- package/dist/assets/insertionBoundaries-BWQFX2-v.js +0 -4
- package/dist/assets/main-D8bG2Z4J.js +0 -29
- package/dist/assets/mobile-yPEbqNoZ.js +0 -2
- package/dist/assets/multirun-BknRCqi_.js +0 -4
- package/dist/assets/renderElectronMiniChatApp-B5xeh2ZJ.js +0 -2
- package/dist/assets/renderMobileApp-CUawlRGR.js +0 -23
- 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
|
|
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.
|
|
282
|
-
//
|
|
283
|
-
//
|
|
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
|
|
72
|
-
//
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
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('
|
|
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(
|
|
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 () => {
|