@yadsh/dsh-qa-surface 0.12.0 → 0.14.0
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/README.md +148 -22
- package/compatibility.json +7 -3
- package/lib/access/capability-catalog.js +22 -6
- package/lib/access/capability-catalog.js.map +1 -1
- package/lib/access/model.js +36 -2
- package/lib/access/model.js.map +1 -1
- package/lib/access/service.js +19 -4
- package/lib/access/service.js.map +1 -1
- package/lib/account-remotes.js +4 -0
- package/lib/account-remotes.js.map +1 -1
- package/lib/accounts/database.js +49 -9
- package/lib/accounts/database.js.map +1 -1
- package/lib/accounts/errors.js.map +1 -1
- package/lib/accounts/file.js.map +1 -1
- package/lib/accounts/store.js +53 -8
- package/lib/accounts/store.js.map +1 -1
- package/lib/admin/permissions.js +6 -0
- package/lib/admin/permissions.js.map +1 -1
- package/lib/admin/quality-store.js +95 -19
- package/lib/admin/quality-store.js.map +1 -1
- package/lib/admin/service.js +432 -52
- package/lib/admin/service.js.map +1 -1
- package/lib/cli.js +24 -4
- package/lib/cli.js.map +1 -1
- package/lib/client/QaAccountsController.js +70 -5
- package/lib/client/QaAccountsController.js.map +1 -1
- package/lib/client/QaConfigController.js.map +1 -1
- package/lib/client/QaSessionController.js +626 -63
- package/lib/client/QaSessionController.js.map +1 -1
- package/lib/client/QaSurface.js +279 -43
- package/lib/client/QaSurface.js.map +1 -1
- package/lib/client/QaSurfaceGuard.js +2 -2
- package/lib/client/QaSurfaceGuard.js.map +1 -1
- package/lib/client/QaTranscriptAdapter.js +4 -2
- package/lib/client/QaTranscriptAdapter.js.map +1 -1
- package/lib/client/admin/QaAdmin.js +59 -34
- package/lib/client/admin/QaAdmin.js.map +1 -1
- package/lib/client/admin/pages/Conversations.js +21 -14
- package/lib/client/admin/pages/Conversations.js.map +1 -1
- package/lib/client/admin/pages/ExpertMemory.js +210 -0
- package/lib/client/admin/pages/ExpertMemory.js.map +1 -0
- package/lib/client/admin/pages/Overview.js +5 -5
- package/lib/client/admin/pages/Overview.js.map +1 -1
- package/lib/client/admin/pages/Quality.js +6 -6
- package/lib/client/admin/pages/Quality.js.map +1 -1
- package/lib/client/admin/pages/Review.js +13 -9
- package/lib/client/admin/pages/Review.js.map +1 -1
- package/lib/client/admin/pages/SkillFiles.js +3 -3
- package/lib/client/admin/pages/SkillFiles.js.map +1 -1
- package/lib/client/admin/pages/Users.js +12 -12
- package/lib/client/admin/pages/Users.js.map +1 -1
- package/lib/client/admin/routes.js +4 -0
- package/lib/client/admin/routes.js.map +1 -1
- package/lib/client/admin/shared.js +57 -10
- package/lib/client/admin/shared.js.map +1 -1
- package/lib/client/admin/styles.js +3 -0
- package/lib/client/admin/styles.js.map +1 -1
- package/lib/client/attestation.js +11 -2
- package/lib/client/attestation.js.map +1 -1
- package/lib/client/audit/QaAuditDialog.js +2 -2
- package/lib/client/audit/QaAuditDialog.js.map +1 -1
- package/lib/client/audit/QaAuditRowBadge.js +1 -1
- package/lib/client/audit/QaAuditRowBadge.js.map +1 -1
- package/lib/client/components/Markdown.js +7 -2
- package/lib/client/components/Markdown.js.map +1 -1
- package/lib/client/components/QaAgentsDrawer.js +7 -5
- package/lib/client/components/QaAgentsDrawer.js.map +1 -1
- package/lib/client/components/QaApproval.js +2 -2
- package/lib/client/components/QaApproval.js.map +1 -1
- package/lib/client/components/QaAuthGate.js +6 -6
- package/lib/client/components/QaAuthGate.js.map +1 -1
- package/lib/client/components/QaChangelog.js +87 -0
- package/lib/client/components/QaChangelog.js.map +1 -1
- package/lib/client/components/QaComposer.js +9 -6
- package/lib/client/components/QaComposer.js.map +1 -1
- package/lib/client/components/QaFileAttachment.js +1 -1
- package/lib/client/components/QaFileAttachment.js.map +1 -1
- package/lib/client/components/QaFilesPanel.js +7 -7
- package/lib/client/components/QaFilesPanel.js.map +1 -1
- package/lib/client/components/QaHeader.js +4 -4
- package/lib/client/components/QaHeader.js.map +1 -1
- package/lib/client/components/QaMessage.js +12 -12
- package/lib/client/components/QaMessage.js.map +1 -1
- package/lib/client/components/QaModal.js +11 -2
- package/lib/client/components/QaModal.js.map +1 -1
- package/lib/client/components/QaQuestions.js +4 -4
- package/lib/client/components/QaQuestions.js.map +1 -1
- package/lib/client/components/QaQueueDock.js +137 -0
- package/lib/client/components/QaQueueDock.js.map +1 -0
- package/lib/client/components/QaRequestQueue.js +22 -0
- package/lib/client/components/QaRequestQueue.js.map +1 -0
- package/lib/client/components/QaRightRail.js +2 -2
- package/lib/client/components/QaRightRail.js.map +1 -1
- package/lib/client/components/QaSidebar.js +66 -6
- package/lib/client/components/QaSidebar.js.map +1 -1
- package/lib/client/components/QaSourcesPanel.js +10 -8
- package/lib/client/components/QaSourcesPanel.js.map +1 -1
- package/lib/client/components/QaThemeSwitcher.js +19 -0
- package/lib/client/components/QaThemeSwitcher.js.map +1 -0
- package/lib/client/components/QaTurnNotice.js +40 -0
- package/lib/client/components/QaTurnNotice.js.map +1 -0
- package/lib/client/components/QaTurnRail.js +3 -3
- package/lib/client/components/QaTurnRail.js.map +1 -1
- package/lib/client/components/QaWelcomeNotice.js +2 -6
- package/lib/client/components/QaWelcomeNotice.js.map +1 -1
- package/lib/client/components/QaWidthHandle.js +2 -2
- package/lib/client/components/QaWidthHandle.js.map +1 -1
- package/lib/client/components/QaWorkGroup.js +5 -5
- package/lib/client/components/QaWorkGroup.js.map +1 -1
- package/lib/client/components/QaWorkspaceBrowser.js +10 -10
- package/lib/client/components/QaWorkspaceBrowser.js.map +1 -1
- package/lib/client/components/VariantSwitcher.js +1 -1
- package/lib/client/components/VariantSwitcher.js.map +1 -1
- package/lib/client/failure-copy.js +26 -8
- package/lib/client/failure-copy.js.map +1 -1
- package/lib/client/focus-ring.js +193 -0
- package/lib/client/focus-ring.js.map +1 -0
- package/lib/client/index.js +58 -24
- package/lib/client/index.js.map +1 -1
- package/lib/client/lineage.js +3 -16
- package/lib/client/lineage.js.map +1 -1
- package/lib/client/markdown/CodeBlock.js +2 -2
- package/lib/client/markdown/CodeBlock.js.map +1 -1
- package/lib/client/markdown/blocks.js +118 -31
- package/lib/client/markdown/blocks.js.map +1 -1
- package/lib/client/markdown/math.js +1 -1
- package/lib/client/markdown/math.js.map +1 -1
- package/lib/client/markdown/render.js +32 -12
- package/lib/client/markdown/render.js.map +1 -1
- package/lib/client/markdown/source-chip.js +3 -3
- package/lib/client/markdown/source-chip.js.map +1 -1
- package/lib/client/notifications/notification-dispatcher.js +90 -0
- package/lib/client/notifications/notification-dispatcher.js.map +1 -0
- package/lib/client/notifications/preferences.js +61 -0
- package/lib/client/notifications/preferences.js.map +1 -0
- package/lib/client/notifications/turn-completion-source.js +82 -0
- package/lib/client/notifications/turn-completion-source.js.map +1 -0
- package/lib/client/notifications/use-turn-notifications.js +108 -0
- package/lib/client/notifications/use-turn-notifications.js.map +1 -0
- package/lib/client/panels/PanelHost.js +5 -5
- package/lib/client/panels/PanelHost.js.map +1 -1
- package/lib/client/panels/PanelLauncher.js +2 -2
- package/lib/client/panels/PanelLauncher.js.map +1 -1
- package/lib/client/project-session-state.js +156 -4
- package/lib/client/project-session-state.js.map +1 -1
- package/lib/client/rating-harvest.js +138 -0
- package/lib/client/rating-harvest.js.map +1 -0
- package/lib/client/role/RoleSelector.js +9 -4
- package/lib/client/role/RoleSelector.js.map +1 -1
- package/lib/client/settings/card.js +58 -17
- package/lib/client/settings/card.js.map +1 -1
- package/lib/client/settings/fields.js +11 -10
- package/lib/client/settings/fields.js.map +1 -1
- package/lib/client/settings/format.js +0 -9
- package/lib/client/settings/format.js.map +1 -1
- package/lib/client/settings/sections/access.js +5 -5
- package/lib/client/settings/sections/access.js.map +1 -1
- package/lib/client/settings/sections/accounts.js +10 -10
- package/lib/client/settings/sections/accounts.js.map +1 -1
- package/lib/client/settings/sections/attachments.js +6 -6
- package/lib/client/settings/sections/attachments.js.map +1 -1
- package/lib/client/settings/sections/branding.js +7 -7
- package/lib/client/settings/sections/branding.js.map +1 -1
- package/lib/client/settings/sections/common.js +4 -2
- package/lib/client/settings/sections/common.js.map +1 -1
- package/lib/client/settings/sections/docs.js +4 -3
- package/lib/client/settings/sections/docs.js.map +1 -1
- package/lib/client/settings/sections/embedding.js +2 -2
- package/lib/client/settings/sections/embedding.js.map +1 -1
- package/lib/client/settings/sections/interface.js +12 -12
- package/lib/client/settings/sections/interface.js.map +1 -1
- package/lib/client/settings/sections/lockdown.js +9 -9
- package/lib/client/settings/sections/lockdown.js.map +1 -1
- package/lib/client/settings/sections/notes.js +12 -12
- package/lib/client/settings/sections/notes.js.map +1 -1
- package/lib/client/settings/sections/session.js +15 -12
- package/lib/client/settings/sections/session.js.map +1 -1
- package/lib/client/settings/sections/slash.js +9 -9
- package/lib/client/settings/sections/slash.js.map +1 -1
- package/lib/client/settings/sections/sources.js +26 -26
- package/lib/client/settings/sections/sources.js.map +1 -1
- package/lib/client/settings/sections/status.js +2 -2
- package/lib/client/settings/sections/status.js.map +1 -1
- package/lib/client/settings/styles.js +15 -9
- package/lib/client/settings/styles.js.map +1 -1
- package/lib/client/slash/SlashPalette.js +4 -4
- package/lib/client/slash/SlashPalette.js.map +1 -1
- package/lib/client/styles.js +139 -66
- package/lib/client/styles.js.map +1 -1
- package/lib/client/theme-preference.js +162 -0
- package/lib/client/theme-preference.js.map +1 -0
- package/lib/client/types.js +8 -0
- package/lib/client/types.js.map +1 -1
- package/lib/client/use-session-ui-state.js +7 -5
- package/lib/client/use-session-ui-state.js.map +1 -1
- package/lib/client/user-settings/GeneralSettingsPage.js +6 -6
- package/lib/client/user-settings/GeneralSettingsPage.js.map +1 -1
- package/lib/client/user-settings/IntegrationTokensPage.js +6 -6
- package/lib/client/user-settings/IntegrationTokensPage.js.map +1 -1
- package/lib/client/user-settings/NotificationSettingsPage.js +107 -0
- package/lib/client/user-settings/NotificationSettingsPage.js.map +1 -0
- package/lib/client/user-settings/PasswordSettingsPage.js +1 -1
- package/lib/client/user-settings/PasswordSettingsPage.js.map +1 -1
- package/lib/client/user-settings/ProfileSettingsPage.js +2 -2
- package/lib/client/user-settings/ProfileSettingsPage.js.map +1 -1
- package/lib/client/user-settings/SkillCatalog.js +3 -3
- package/lib/client/user-settings/SkillCatalog.js.map +1 -1
- package/lib/client/user-settings/SkillEditor.js +26 -8
- package/lib/client/user-settings/SkillEditor.js.map +1 -1
- package/lib/client/user-settings/SkillToolPicker.js +3 -3
- package/lib/client/user-settings/SkillToolPicker.js.map +1 -1
- package/lib/client/user-settings/SkillsSettingsPage.js +1 -1
- package/lib/client/user-settings/SkillsSettingsPage.js.map +1 -1
- package/lib/client/user-settings/StartersSettingsPage.js +6 -6
- package/lib/client/user-settings/StartersSettingsPage.js.map +1 -1
- package/lib/client/user-settings/UserSettingsDialog.js +7 -2
- package/lib/client/user-settings/UserSettingsDialog.js.map +1 -1
- package/lib/client/user-settings/copy.js +2 -0
- package/lib/client/user-settings/copy.js.map +1 -1
- package/lib/client/user-settings/draft.js +4 -1
- package/lib/client/user-settings/draft.js.map +1 -1
- package/lib/client/user-settings/fields.js +5 -5
- package/lib/client/user-settings/fields.js.map +1 -1
- package/lib/client.js +7483 -2075
- package/lib/client.js.map +1 -1
- package/lib/config-resolvers/defaults.js +7 -0
- package/lib/config-resolvers/defaults.js.map +1 -1
- package/lib/config-resolvers/lockdown.js +7 -0
- package/lib/config-resolvers/lockdown.js.map +1 -1
- package/lib/config-resolvers/notifications.js +15 -0
- package/lib/config-resolvers/notifications.js.map +1 -0
- package/lib/config-resolvers/session.js +11 -1
- package/lib/config-resolvers/session.js.map +1 -1
- package/lib/config.js +67 -18
- package/lib/config.js.map +1 -1
- package/lib/enforcement/tool-grants.js +6 -6
- package/lib/enforcement/tool-grants.js.map +1 -1
- package/lib/index.js +171 -39
- package/lib/index.js.map +1 -1
- package/lib/integration/answer.js +74 -8
- package/lib/integration/answer.js.map +1 -1
- package/lib/integration/expert-memory.js +39 -0
- package/lib/integration/expert-memory.js.map +1 -0
- package/lib/integration/host-runner.js +26 -14
- package/lib/integration/host-runner.js.map +1 -1
- package/lib/notifications.js +66 -0
- package/lib/notifications.js.map +1 -0
- package/lib/personal-skills/errors.js.map +1 -1
- package/lib/personal-skills/service.js +81 -7
- package/lib/personal-skills/service.js.map +1 -1
- package/lib/prompt-notes.js +2 -10
- package/lib/prompt-notes.js.map +1 -1
- package/lib/provenance/extractors.js +1 -1
- package/lib/provenance/extractors.js.map +1 -1
- package/lib/provenance/host-store.js +5 -1
- package/lib/provenance/host-store.js.map +1 -1
- package/lib/qa-tools/docs-tools.js +64 -11
- package/lib/qa-tools/docs-tools.js.map +1 -1
- package/lib/qa-tools/lifecycle.js +6 -3
- package/lib/qa-tools/lifecycle.js.map +1 -1
- package/lib/request-queue.js +32 -0
- package/lib/request-queue.js.map +1 -0
- package/lib/resolve-config.js +2 -0
- package/lib/resolve-config.js.map +1 -1
- package/lib/secure-session.js +7 -2
- package/lib/secure-session.js.map +1 -1
- package/lib/shared/settings.js +19 -2
- package/lib/shared/settings.js.map +1 -1
- package/lib/turn-failure-log.js +67 -0
- package/lib/turn-failure-log.js.map +1 -0
- package/lib/typert.host.js +1459 -647
- package/lib/typert.remote-client.d.ts +25 -9
- package/lib/typert.remote-client.js +1356 -636
- package/lib/types/access/capability-catalog.d.ts +20 -4
- package/lib/types/access/model.d.ts +23 -0
- package/lib/types/access/service.d.ts +2 -3
- package/lib/types/account-remotes.d.ts +8 -1
- package/lib/types/accounts/database.d.ts +13 -3
- package/lib/types/accounts/errors.d.ts +9 -1
- package/lib/types/accounts/file.d.ts +12 -0
- package/lib/types/accounts/store.d.ts +30 -2
- package/lib/types/admin/quality-store.d.ts +33 -0
- package/lib/types/admin/service.d.ts +119 -9
- package/lib/types/client/QaAccountsController.d.ts +37 -3
- package/lib/types/client/QaConfigController.d.ts +2 -2
- package/lib/types/client/QaSessionController.d.ts +199 -6
- package/lib/types/client/QaSurface.d.ts +6 -1
- package/lib/types/client/admin/pages/ExpertMemory.d.ts +19 -0
- package/lib/types/client/admin/routes.d.ts +3 -1
- package/lib/types/client/admin/shared.d.ts +20 -1
- package/lib/types/client/components/Markdown.d.ts +8 -1
- package/lib/types/client/components/QaHeader.d.ts +3 -1
- package/lib/types/client/components/QaModal.d.ts +7 -0
- package/lib/types/client/components/QaQueueDock.d.ts +27 -0
- package/lib/types/client/components/QaRequestQueue.d.ts +20 -0
- package/lib/types/client/components/QaThemeSwitcher.d.ts +14 -0
- package/lib/types/client/components/QaTurnNotice.d.ts +55 -0
- package/lib/types/client/focus-ring.d.ts +65 -0
- package/lib/types/client/lineage.d.ts +3 -13
- package/lib/types/client/markdown/blocks.d.ts +30 -2
- package/lib/types/client/markdown/render.d.ts +4 -1
- package/lib/types/client/notifications/notification-dispatcher.d.ts +68 -0
- package/lib/types/client/notifications/preferences.d.ts +44 -0
- package/lib/types/client/notifications/turn-completion-source.d.ts +114 -0
- package/lib/types/client/notifications/use-turn-notifications.d.ts +51 -0
- package/lib/types/client/project-session-state.d.ts +35 -1
- package/lib/types/client/rating-harvest.d.ts +49 -0
- package/lib/types/client/role/RoleSelector.d.ts +7 -1
- package/lib/types/client/settings/card.d.ts +36 -5
- package/lib/types/client/settings/fields.d.ts +24 -0
- package/lib/types/client/settings/format.d.ts +0 -5
- package/lib/types/client/settings/sections/common.d.ts +3 -1
- package/lib/types/client/settings/sections/session.d.ts +2 -1
- package/lib/types/client/settings/styles.d.ts +9 -4
- package/lib/types/client/settings-extensions/user-session.d.ts +1 -1
- package/lib/types/client/theme-preference.d.ts +69 -0
- package/lib/types/client/types.d.ts +36 -5
- package/lib/types/client/use-session-ui-state.d.ts +6 -4
- package/lib/types/client/user-settings/GeneralSettingsPage.d.ts +5 -5
- package/lib/types/client/user-settings/NotificationSettingsPage.d.ts +40 -0
- package/lib/types/client/user-settings/UserSettingsDialog.d.ts +12 -2
- package/lib/types/client/user-settings/draft.d.ts +4 -1
- package/lib/types/client/user-settings/fields.d.ts +7 -0
- package/lib/types/config-resolvers/notifications.d.ts +10 -0
- package/lib/types/config-resolvers/session.d.ts +6 -0
- package/lib/types/config.d.ts +20 -1
- package/lib/types/index.d.ts +70 -10
- package/lib/types/integration/answer.d.ts +27 -0
- package/lib/types/integration/expert-memory.d.ts +49 -0
- package/lib/types/notifications.d.ts +32 -0
- package/lib/types/personal-skills/errors.d.ts +1 -1
- package/lib/types/personal-skills/service.d.ts +6 -0
- package/lib/types/prompt-notes.d.ts +17 -4
- package/lib/types/qa-tools/docs-tools.d.ts +2 -2
- package/lib/types/request-queue.d.ts +32 -0
- package/lib/types/shared/settings.d.ts +19 -2
- package/lib/types/turn-failure-log.d.ts +18 -0
- package/lib/types/types.d.ts +200 -4
- package/package.json +64 -62
- package/scripts/attach-workspace-sessions.mjs +24 -5
- package/scripts/repair-session-events.mjs +25 -5
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/** Body text of every desktop notice: the fact, never the content. */
|
|
2
|
+
export const QA_TURN_NOTICE_BODY = "Ход завершён";
|
|
3
|
+
/**
|
|
4
|
+
* Decide what one finished turn is worth, if anything.
|
|
5
|
+
*
|
|
6
|
+
* A notice exists to say "this happened where you were not looking". The chat
|
|
7
|
+
* on screen answers itself — the reply arrives in front of the reader — so it
|
|
8
|
+
* gets nothing, while a background chat that settles under their eyes still
|
|
9
|
+
* gets the in-app line. Each channel then needs its own two answers: the
|
|
10
|
+
* deployment's and the reader's. The desktop additionally needs the browser's
|
|
11
|
+
* permission, which neither of those can grant on its behalf.
|
|
12
|
+
*/
|
|
13
|
+
export function planTurnNotice(completion, context) {
|
|
14
|
+
const { switches, channels, activeSessionId } = context;
|
|
15
|
+
if (!switches.enabled)
|
|
16
|
+
return null;
|
|
17
|
+
const onScreen = completion.sessionId === activeSessionId;
|
|
18
|
+
if (context.focused && onScreen)
|
|
19
|
+
return null;
|
|
20
|
+
const desktop = !context.focused &&
|
|
21
|
+
switches.allowOs &&
|
|
22
|
+
channels.desktop &&
|
|
23
|
+
context.permission === "granted";
|
|
24
|
+
if (!channels.inApp && !desktop)
|
|
25
|
+
return null;
|
|
26
|
+
return {
|
|
27
|
+
item: {
|
|
28
|
+
key: `${completion.sessionId}:${completion.at}`,
|
|
29
|
+
sessionId: completion.sessionId,
|
|
30
|
+
title: completion.title,
|
|
31
|
+
},
|
|
32
|
+
inApp: channels.inApp,
|
|
33
|
+
desktop,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Whether the person is looking at this page. A hidden tab and a visible tab
|
|
38
|
+
* behind another window both count as away: the notice is for the difference
|
|
39
|
+
* between "watching" and "not watching", not for the tab's own state.
|
|
40
|
+
*/
|
|
41
|
+
export function isPageFocused(documentState = document, hasFocus = () => document.hasFocus()) {
|
|
42
|
+
return documentState.visibilityState === "visible" && hasFocus();
|
|
43
|
+
}
|
|
44
|
+
/** The desktop channel's current answer, or `unsupported` off a secure context. */
|
|
45
|
+
export function readNotificationPermission() {
|
|
46
|
+
if (typeof Notification === "undefined")
|
|
47
|
+
return "unsupported";
|
|
48
|
+
return Notification.permission;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Ask the browser for the desktop channel. Only ever called from a click: the
|
|
52
|
+
* permission prompt is the user's decision about this origin, and a page that
|
|
53
|
+
* asks on load — or once per finished turn — spends it on the wrong moment.
|
|
54
|
+
*/
|
|
55
|
+
export async function requestNotificationPermission() {
|
|
56
|
+
if (typeof Notification === "undefined")
|
|
57
|
+
return "unsupported";
|
|
58
|
+
if (Notification.permission !== "default")
|
|
59
|
+
return Notification.permission;
|
|
60
|
+
try {
|
|
61
|
+
return await Notification.requestPermission();
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return "denied";
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/** Live desktop notices; an unreferenced one is closed by the browser at once. */
|
|
68
|
+
const retainedNotices = new Set();
|
|
69
|
+
/**
|
|
70
|
+
* Hand one finished turn to the desktop. Returns false when the platform
|
|
71
|
+
* refuses: a notification that cannot be raised costs the reader nothing, and
|
|
72
|
+
* the in-app line is already on its way.
|
|
73
|
+
*/
|
|
74
|
+
export function raiseDesktopNotice(completion) {
|
|
75
|
+
if (typeof Notification === "undefined")
|
|
76
|
+
return false;
|
|
77
|
+
try {
|
|
78
|
+
const notice = new Notification(completion.title, {
|
|
79
|
+
body: QA_TURN_NOTICE_BODY,
|
|
80
|
+
});
|
|
81
|
+
notice.onclick = () => window.focus();
|
|
82
|
+
retainedNotices.add(notice);
|
|
83
|
+
notice.addEventListener("close", () => retainedNotices.delete(notice));
|
|
84
|
+
return true;
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=notification-dispatcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notification-dispatcher.js","sourceRoot":"","sources":["../../../src/client/notifications/notification-dispatcher.ts"],"names":[],"mappings":"AAkCA,sEAAsE;AACtE,MAAM,CAAC,MAAM,mBAAmB,GAAG,cAAc,CAAC;AAElD;;;;;;;;;GASG;AACH,MAAM,UAAU,cAAc,CAC5B,UAA4B,EAC5B,OAAwB;IAExB,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC;IACxD,IAAI,CAAC,QAAQ,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IACnC,MAAM,QAAQ,GAAG,UAAU,CAAC,SAAS,KAAK,eAAe,CAAC;IAC1D,IAAI,OAAO,CAAC,OAAO,IAAI,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC7C,MAAM,OAAO,GACX,CAAC,OAAO,CAAC,OAAO;QAChB,QAAQ,CAAC,OAAO;QAChB,QAAQ,CAAC,OAAO;QAChB,OAAO,CAAC,UAAU,KAAK,SAAS,CAAC;IACnC,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC7C,OAAO;QACL,IAAI,EAAE;YACJ,GAAG,EAAE,GAAG,UAAU,CAAC,SAAS,IAAI,UAAU,CAAC,EAAE,EAAE;YAC/C,SAAS,EAAE,UAAU,CAAC,SAAS;YAC/B,KAAK,EAAE,UAAU,CAAC,KAAK;SACxB;QACD,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,OAAO;KACR,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAC3B,aAAa,GAAiD,QAAQ,EACtE,QAAQ,GAAkB,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE;IAEnD,OAAO,aAAa,CAAC,eAAe,KAAK,SAAS,IAAI,QAAQ,EAAE,CAAC;AACnE,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,0BAA0B;IACxC,IAAI,OAAO,YAAY,KAAK,WAAW;QAAE,OAAO,aAAa,CAAC;IAC9D,OAAO,YAAY,CAAC,UAAU,CAAC;AACjC,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,6BAA6B;IACjD,IAAI,OAAO,YAAY,KAAK,WAAW;QAAE,OAAO,aAAa,CAAC;IAC9D,IAAI,YAAY,CAAC,UAAU,KAAK,SAAS;QAAE,OAAO,YAAY,CAAC,UAAU,CAAC;IAC1E,IAAI,CAAC;QACH,OAAO,MAAM,YAAY,CAAC,iBAAiB,EAAE,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,QAAQ,CAAC;IAClB,CAAC;AACH,CAAC;AAED,kFAAkF;AAClF,MAAM,eAAe,GAAG,IAAI,GAAG,EAAgB,CAAC;AAEhD;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,UAA4B;IAC7D,IAAI,OAAO,YAAY,KAAK,WAAW;QAAE,OAAO,KAAK,CAAC;IACtD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,UAAU,CAAC,KAAK,EAAE;YAChD,IAAI,EAAE,mBAAmB;SAC1B,CAAC,CAAC;QACH,MAAM,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACtC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC5B,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QACvE,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
export const QA_NOTIFICATION_DEFAULT_PREFS = Object.freeze({
|
|
2
|
+
osEnabled: false,
|
|
3
|
+
osOffered: false,
|
|
4
|
+
});
|
|
5
|
+
/**
|
|
6
|
+
* Read the stored choice; a denied, full or foreign-shaped store falls back to
|
|
7
|
+
* the silent default rather than raising notices nobody asked for.
|
|
8
|
+
*
|
|
9
|
+
* What is left in this browser is what belongs to a browser: the answer to the
|
|
10
|
+
* desktop offer, and the desktop choice itself for as long as there is no
|
|
11
|
+
* account to hold it. Signed in, the account's {@link QaAccountNotifications}
|
|
12
|
+
* wins — see {@link resolveNoticeChannels} — because a preference that follows
|
|
13
|
+
* the person is the point of storing it on the account at all.
|
|
14
|
+
*/
|
|
15
|
+
export function readNotificationPrefs(storage, key) {
|
|
16
|
+
try {
|
|
17
|
+
const raw = storage?.getItem(key);
|
|
18
|
+
if (raw === null || raw === undefined)
|
|
19
|
+
return QA_NOTIFICATION_DEFAULT_PREFS;
|
|
20
|
+
const parsed = JSON.parse(raw);
|
|
21
|
+
if (typeof parsed !== "object" || parsed === null) {
|
|
22
|
+
return QA_NOTIFICATION_DEFAULT_PREFS;
|
|
23
|
+
}
|
|
24
|
+
const { osEnabled, osOffered } = parsed;
|
|
25
|
+
return {
|
|
26
|
+
osEnabled: osEnabled === true,
|
|
27
|
+
osOffered: osOffered === true,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return QA_NOTIFICATION_DEFAULT_PREFS;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/** Persist the choice. A store that refuses only costs it across reloads. */
|
|
35
|
+
export function writeNotificationPrefs(storage, key, prefs) {
|
|
36
|
+
try {
|
|
37
|
+
storage?.setItem(key, JSON.stringify(prefs));
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
// The in-memory state already carries the choice for this page.
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Which channels this reader may use for a finished turn.
|
|
45
|
+
*
|
|
46
|
+
* The account's answer wins once it exists, so the choice follows the person to
|
|
47
|
+
* another browser or another laptop. Without an account the browser's own
|
|
48
|
+
* answer stands: an anonymous stand is the common shape of a QA deployment, and
|
|
49
|
+
* a mute switch that only appeared once signed in would leave it with no switch
|
|
50
|
+
* at all. The in-page line has no browser-level switch of its own — a stand that
|
|
51
|
+
* wants it gone has `notifications.enabled`, and the offer this page makes is
|
|
52
|
+
* only ever about the desktop channel.
|
|
53
|
+
*/
|
|
54
|
+
export function resolveNoticeChannels(input) {
|
|
55
|
+
const { account, prefs } = input;
|
|
56
|
+
if (account !== undefined) {
|
|
57
|
+
return { inApp: account.inApp, desktop: account.desktop };
|
|
58
|
+
}
|
|
59
|
+
return { inApp: true, desktop: prefs.osEnabled };
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=preferences.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preferences.js","sourceRoot":"","sources":["../../../src/client/notifications/preferences.ts"],"names":[],"mappings":"AAiBA,MAAM,CAAC,MAAM,6BAA6B,GAAwB,MAAM,CAAC,MAAM,CAC7E;IACE,SAAS,EAAE,KAAK;IAChB,SAAS,EAAE,KAAK;CACjB,CACF,CAAC;AAEF;;;;;;;;;GASG;AACH,MAAM,UAAU,qBAAqB,CACnC,OAAgC,EAChC,GAAW;IAEX,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS;YAAE,OAAO,6BAA6B,CAAC;QAC5E,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACxC,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YAClD,OAAO,6BAA6B,CAAC;QACvC,CAAC;QACD,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,MAAsC,CAAC;QACxE,OAAO;YACL,SAAS,EAAE,SAAS,KAAK,IAAI;YAC7B,SAAS,EAAE,SAAS,KAAK,IAAI;SAC9B,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,6BAA6B,CAAC;IACvC,CAAC;AACH,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,sBAAsB,CACpC,OAAgC,EAChC,GAAW,EACX,KAA0B;IAE1B,IAAI,CAAC;QACH,OAAO,EAAE,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,gEAAgE;IAClE,CAAC;AACH,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAGrC;IACC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;IACjC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;IAC5D,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC;AACnD,CAAC"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Report the turns that ended since the previous observation of `chats`.
|
|
3
|
+
*
|
|
4
|
+
* The input is this reader's own rows — see {@link scopeNoticesToOwnChats},
|
|
5
|
+
* which is what keeps an admin's shared history out of them — because a notice
|
|
6
|
+
* is an outward report about the chat it names. The host list is the whole
|
|
7
|
+
* deployment's, so anything wider than these rows would tell one user that
|
|
8
|
+
* another user's turn had stopped.
|
|
9
|
+
*
|
|
10
|
+
* `seen` is the caller's per-page map of the last reading, and a chat is
|
|
11
|
+
* reported only when a `watched` run is seen ending in a frame the browser
|
|
12
|
+
* could vouch for. So the notice always tells the reader about a turn they were
|
|
13
|
+
* waiting for, and never about one that was already under way when they could
|
|
14
|
+
* not see it: a chat found running on the page's first frame, or in the frames
|
|
15
|
+
* around a reconnect, is `unwatched`, and its end passes in silence. Nor does a
|
|
16
|
+
* gap the page was shown spare a run it lands inside: the paused frame takes
|
|
17
|
+
* back the evidence that this page watched that run begin, because while the
|
|
18
|
+
* link was down the chat may have run another turn and the rows that come back
|
|
19
|
+
* name neither. The first run to end after a gap passes in silence too, in a
|
|
20
|
+
* chat whose row never moved across it — the only idle this page holds for that
|
|
21
|
+
* chat was read through the gap, and a run that began inside the gap would look
|
|
22
|
+
* exactly like it. That reading arms nothing until the chat's own row moves, and
|
|
23
|
+
* the move that arms it is a run ending: the very one this page then keeps
|
|
24
|
+
* silent about. So a turn is reported only when no gap falls between the idle
|
|
25
|
+
* reading that armed this page and the frame that sees the run end, which is why
|
|
26
|
+
* a run begun and finished on the recovered link can still pass unreported, and
|
|
27
|
+
* why a gap the page was shown costs a chat one turn — or two, where a turn
|
|
28
|
+
* ended inside the gap. A gap that reached no committed frame hands this function
|
|
29
|
+
* nothing to go silent about, and §12 of
|
|
30
|
+
* `docs/specs/owner-scoped-notifications.md` owns that case. The turn that a link
|
|
31
|
+
* which held carries from an armed idle to its end is the page's own, so a page
|
|
32
|
+
* that stays open notifies again once the turn paying for the gap has ended —
|
|
33
|
+
* once per turn from there.
|
|
34
|
+
*/
|
|
35
|
+
export function settleTurnCompletions(seen, chats, options = {}) {
|
|
36
|
+
const { paused = false, now = Date.now() } = options;
|
|
37
|
+
const listed = new Set(chats.map((chat) => chat.id));
|
|
38
|
+
for (const id of seen.keys()) {
|
|
39
|
+
if (!listed.has(id))
|
|
40
|
+
seen.delete(id);
|
|
41
|
+
}
|
|
42
|
+
const completions = [];
|
|
43
|
+
for (const chat of chats) {
|
|
44
|
+
const previous = seen.get(chat.id);
|
|
45
|
+
if (!paused && !chat.running && previous === "watched") {
|
|
46
|
+
completions.push({ sessionId: chat.id, title: chat.title, at: now });
|
|
47
|
+
}
|
|
48
|
+
seen.set(chat.id, readSighting(previous, chat.running, paused));
|
|
49
|
+
}
|
|
50
|
+
return completions;
|
|
51
|
+
}
|
|
52
|
+
function readSighting(previous, running, paused) {
|
|
53
|
+
// A frame the browser cannot vouch for settles neither fact, but which way it
|
|
54
|
+
// pointed decides what this page is waiting for.
|
|
55
|
+
if (paused)
|
|
56
|
+
return running ? "unwatched" : "stale";
|
|
57
|
+
if (!running) {
|
|
58
|
+
// The same row the gap left behind is not new information about now.
|
|
59
|
+
return previous === "stale" ? "stale" : "idle";
|
|
60
|
+
}
|
|
61
|
+
return previous === "idle" || previous === "watched"
|
|
62
|
+
? "watched"
|
|
63
|
+
: "unwatched";
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Keep the rows a notice may be raised for: the sidebar's rows down to the
|
|
67
|
+
* chats this account owns outright.
|
|
68
|
+
*
|
|
69
|
+
* The sidebar is a *read* surface, and an admin's shared view is deliberately
|
|
70
|
+
* wider than ownership — the same opt-in that shows another account's chat
|
|
71
|
+
* must not decide whose activity this browser reports outward. A notice is
|
|
72
|
+
* that outward report, and it names a chat by title, so it takes the narrow
|
|
73
|
+
* list. `undefined` is the deployment with no accounts, where the browser's own
|
|
74
|
+
* index already is the owned set and there is nothing narrower to ask for.
|
|
75
|
+
*/
|
|
76
|
+
export function scopeNoticesToOwnChats(chats, ownIds) {
|
|
77
|
+
if (ownIds === undefined)
|
|
78
|
+
return chats;
|
|
79
|
+
const owned = new Set(ownIds);
|
|
80
|
+
return chats.filter((chat) => owned.has(chat.id));
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=turn-completion-source.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"turn-completion-source.js","sourceRoot":"","sources":["../../../src/client/notifications/turn-completion-source.ts"],"names":[],"mappings":"AAsEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,MAAM,UAAU,qBAAqB,CACnC,IAAiC,EACjC,KAAgC,EAChC,OAAO,GAA4B,EAAE;IAErC,MAAM,EAAE,MAAM,GAAG,KAAK,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC;IACrD,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IACrD,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;QAC7B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACvC,CAAC;IACD,MAAM,WAAW,GAAuB,EAAE,CAAC;IAC3C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YACvD,WAAW,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;QACvE,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,SAAS,YAAY,CACnB,QAAoC,EACpC,OAAgB,EAChB,MAAe;IAEf,8EAA8E;IAC9E,iDAAiD;IACjD,IAAI,MAAM;QAAE,OAAO,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC;IACnD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,qEAAqE;QACrE,OAAO,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;IACjD,CAAC;IACD,OAAO,QAAQ,KAAK,MAAM,IAAI,QAAQ,KAAK,SAAS;QAClD,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,WAAW,CAAC;AAClB,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,sBAAsB,CACpC,KAAgC,EAChC,MAAqC;IAErC,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACvC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;IAC9B,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;AACpD,CAAC"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
2
|
+
import { isPageFocused, planTurnNotice, raiseDesktopNotice, readNotificationPermission, requestNotificationPermission, } from "./notification-dispatcher.js";
|
|
3
|
+
import { readNotificationPrefs, resolveNoticeChannels, writeNotificationPrefs, } from "./preferences.js";
|
|
4
|
+
import { scopeNoticesToOwnChats, settleTurnCompletions, } from "./turn-completion-source.js";
|
|
5
|
+
/** Lines the stack holds; an older one is dropped rather than pushed away. */
|
|
6
|
+
const MAX_NOTICES = 3;
|
|
7
|
+
/**
|
|
8
|
+
* Turn-completion notices for the chats this reader owns. Of the rows the
|
|
9
|
+
* sidebar shows, only the ones this account owns outright are watched, and when
|
|
10
|
+
* one of them stops running after this page watched that run begin, the reader
|
|
11
|
+
* is told in the channels they and the deployment allow.
|
|
12
|
+
*/
|
|
13
|
+
export function useQaTurnNotifications(input) {
|
|
14
|
+
const { chats, ownChatIds, notifications, storage, storageKey, account, paused, activeSessionId, onSwitch, } = input;
|
|
15
|
+
const seen = useRef(new Map());
|
|
16
|
+
const [items, setItems] = useState([]);
|
|
17
|
+
const [prefs, setPrefs] = useState(() => readNotificationPrefs(storage, storageKey));
|
|
18
|
+
// Memoized because the watcher below re-runs on any change to it, and a fresh
|
|
19
|
+
// object per render would have it re-reading the chat list on every keystroke.
|
|
20
|
+
const channels = useMemo(() => resolveNoticeChannels({ account: account?.notifications, prefs }), [account, prefs]);
|
|
21
|
+
// Also memoized for the watcher's sake: the rows are the sidebar's, so a
|
|
22
|
+
// render that changed nothing about them must not read the list again.
|
|
23
|
+
const ownedChats = useMemo(() => scopeNoticesToOwnChats(chats, ownChatIds), [chats, ownChatIds]);
|
|
24
|
+
const savePrefs = useCallback((next) => {
|
|
25
|
+
setPrefs(next);
|
|
26
|
+
writeNotificationPrefs(storage, storageKey, next);
|
|
27
|
+
}, [storage, storageKey]);
|
|
28
|
+
useEffect(() => {
|
|
29
|
+
const completions = settleTurnCompletions(seen.current, ownedChats, {
|
|
30
|
+
paused,
|
|
31
|
+
});
|
|
32
|
+
if (completions.length === 0)
|
|
33
|
+
return;
|
|
34
|
+
const focused = isPageFocused();
|
|
35
|
+
const permission = readNotificationPermission();
|
|
36
|
+
const added = [];
|
|
37
|
+
for (const completion of completions) {
|
|
38
|
+
const planned = planTurnNotice(completion, {
|
|
39
|
+
switches: notifications,
|
|
40
|
+
channels,
|
|
41
|
+
permission,
|
|
42
|
+
focused,
|
|
43
|
+
activeSessionId,
|
|
44
|
+
});
|
|
45
|
+
if (planned === null)
|
|
46
|
+
continue;
|
|
47
|
+
if (planned.desktop)
|
|
48
|
+
raiseDesktopNotice(completion);
|
|
49
|
+
if (planned.inApp)
|
|
50
|
+
added.push(planned.item);
|
|
51
|
+
}
|
|
52
|
+
if (added.length === 0)
|
|
53
|
+
return;
|
|
54
|
+
setItems((previous) => [...added.reverse(), ...previous].slice(0, MAX_NOTICES));
|
|
55
|
+
}, [channels, activeSessionId, ownedChats, notifications, paused]);
|
|
56
|
+
// Opening a chat by any other means is an answer to its notice.
|
|
57
|
+
useEffect(() => {
|
|
58
|
+
if (activeSessionId === null)
|
|
59
|
+
return;
|
|
60
|
+
setItems((previous) => previous.some((item) => item.sessionId === activeSessionId)
|
|
61
|
+
? previous.filter((item) => item.sessionId !== activeSessionId)
|
|
62
|
+
: previous);
|
|
63
|
+
}, [activeSessionId]);
|
|
64
|
+
const open = useCallback((sessionId) => {
|
|
65
|
+
setItems((previous) => previous.some((item) => item.sessionId === sessionId)
|
|
66
|
+
? previous.filter((item) => item.sessionId !== sessionId)
|
|
67
|
+
: previous);
|
|
68
|
+
onSwitch(sessionId);
|
|
69
|
+
}, [onSwitch]);
|
|
70
|
+
// The offer is a single question per browser: asked when the desktop channel
|
|
71
|
+
// is still allowed by the deployment, unanswered, and the browser has not
|
|
72
|
+
// decided yet.
|
|
73
|
+
const offered = notifications.enabled &&
|
|
74
|
+
notifications.allowOs &&
|
|
75
|
+
!prefs.osOffered &&
|
|
76
|
+
readNotificationPermission() === "default";
|
|
77
|
+
// Waving a notice off while the offer is on screen is the answer to the
|
|
78
|
+
// offer too: it never returns to ask a second time.
|
|
79
|
+
const dismiss = useCallback((key) => {
|
|
80
|
+
setItems((previous) => previous.filter((item) => item.key !== key));
|
|
81
|
+
if (offered)
|
|
82
|
+
savePrefs({ ...prefs, osOffered: true });
|
|
83
|
+
}, [offered, prefs, savePrefs]);
|
|
84
|
+
// Answering the offer writes the choice where it belongs: on the account once
|
|
85
|
+
// there is one, so it survives into another browser, and in this browser's own
|
|
86
|
+
// store otherwise. The browser keeps its own copy either way — what it decides
|
|
87
|
+
// is that the question has been asked here, which is a fact about this
|
|
88
|
+
// browser's permission prompt rather than about the person.
|
|
89
|
+
const enableDesktop = useCallback(() => {
|
|
90
|
+
void requestNotificationPermission().then((permission) => {
|
|
91
|
+
const granted = permission === "granted";
|
|
92
|
+
savePrefs({ ...prefs, osEnabled: granted, osOffered: true });
|
|
93
|
+
if (account === undefined)
|
|
94
|
+
return;
|
|
95
|
+
void account.onSave({
|
|
96
|
+
inApp: account.notifications.inApp,
|
|
97
|
+
desktop: granted,
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
}, [account, prefs, savePrefs]);
|
|
101
|
+
return {
|
|
102
|
+
items,
|
|
103
|
+
onOpen: open,
|
|
104
|
+
onDismiss: dismiss,
|
|
105
|
+
...(offered ? { onEnableDesktop: enableDesktop } : {}),
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=use-turn-notifications.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-turn-notifications.js","sourceRoot":"","sources":["../../../src/client/notifications/use-turn-notifications.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,13 +21,13 @@ class PanelErrorBoundary extends Component {
|
|
|
21
21
|
}
|
|
22
22
|
render() {
|
|
23
23
|
if (this.state.failed) {
|
|
24
|
-
return (_jsxs("div", { className: "dsh-qa-extension-panel__fallback", role: "alert", children: ["\u041F\u0430\u043D\u0435\u043B\u044C \u00AB", this.props.definition.kind, "\u00BB \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0430 (id:", " ", this.props.definition.id, ")."] }));
|
|
24
|
+
return (_jsxs("div", { className: "dsh-qa-extension-panel__fallback", "data-testid": "qa-panel-error", role: "alert", children: ["\u041F\u0430\u043D\u0435\u043B\u044C \u00AB", this.props.definition.kind, "\u00BB \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0430 (id:", " ", this.props.definition.id, ")."] }));
|
|
25
25
|
}
|
|
26
26
|
return this.props.children;
|
|
27
27
|
}
|
|
28
28
|
}
|
|
29
29
|
function MissingPanel({ definition, }) {
|
|
30
|
-
return (_jsxs("div", { className: "dsh-qa-extension-panel__fallback", role: "status", children: ["\u041F\u0430\u043D\u0435\u043B\u044C \u00AB", definition.kind, "\u00BB \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0430 (id: ", definition.id, ")."] }));
|
|
30
|
+
return (_jsxs("div", { className: "dsh-qa-extension-panel__fallback", "data-testid": "qa-panel-missing", role: "status", children: ["\u041F\u0430\u043D\u0435\u043B\u044C \u00AB", definition.kind, "\u00BB \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0430 (id: ", definition.id, ")."] }));
|
|
31
31
|
}
|
|
32
32
|
function PanelSlotBody({ definition, owner, renderSlot, }) {
|
|
33
33
|
return renderSlot("qa.surface.panel", owner, {
|
|
@@ -168,7 +168,7 @@ export function QaPanelHost({ panels, sessionId, qaToken = "", renderSlot, }) {
|
|
|
168
168
|
return;
|
|
169
169
|
event.preventDefault();
|
|
170
170
|
};
|
|
171
|
-
return (_jsxs(_Fragment, { children: [presentation === "side" ? (_jsx("div", { className: "dsh-qa-extension-panel__resizer", role: "separator", "aria-label": "\u0418\u0437\u043C\u0435\u043D\u0438\u0442\u044C \u0448\u0438\u0440\u0438\u043D\u0443 \u043F\u0430\u043D\u0435\u043B\u0438", "aria-orientation": "vertical", "aria-valuemin": QA_PANEL_MIN_PX, "aria-valuemax": clampQaPanelWidth(Number.POSITIVE_INFINITY, available), "aria-valuenow": width, tabIndex: 0, onPointerDown: handlePointerDown, onPointerMove: handlePointerMove, onPointerUp: handlePointerEnd, onPointerCancel: handlePointerEnd, onKeyDown: handleSeparatorKey })) : null, _jsxs("aside", { ref: root, className: `dsh-qa-extension-panel dsh-qa-extension-panel--${presentation}`, "data-presentation": presentation, "aria-label": `Панель: ${panelTitle(active)}`, tabIndex: -1, style: presentation === "side"
|
|
171
|
+
return (_jsxs(_Fragment, { children: [presentation === "side" ? (_jsx("div", { className: "dsh-qa-extension-panel__resizer", "data-testid": "qa-panel-resizer", role: "separator", "aria-label": "\u0418\u0437\u043C\u0435\u043D\u0438\u0442\u044C \u0448\u0438\u0440\u0438\u043D\u0443 \u043F\u0430\u043D\u0435\u043B\u0438", "aria-orientation": "vertical", "aria-valuemin": QA_PANEL_MIN_PX, "aria-valuemax": clampQaPanelWidth(Number.POSITIVE_INFINITY, available), "aria-valuenow": width, tabIndex: 0, onPointerDown: handlePointerDown, onPointerMove: handlePointerMove, onPointerUp: handlePointerEnd, onPointerCancel: handlePointerEnd, onKeyDown: handleSeparatorKey })) : null, _jsxs("aside", { ref: root, className: `dsh-qa-extension-panel dsh-qa-extension-panel--${presentation}`, "data-testid": "qa-panel", "data-presentation": presentation, "aria-label": `Панель: ${panelTitle(active)}`, tabIndex: -1, style: presentation === "side"
|
|
172
172
|
? { width: `${width}px` }
|
|
173
173
|
: undefined, onKeyDown: (event) => {
|
|
174
174
|
if (presentation === "fullscreen" &&
|
|
@@ -177,7 +177,7 @@ export function QaPanelHost({ panels, sessionId, qaToken = "", renderSlot, }) {
|
|
|
177
177
|
event.stopPropagation();
|
|
178
178
|
panels.close({ reason: "user" });
|
|
179
179
|
}
|
|
180
|
-
}, children: [_jsxs("header", { className: "dsh-qa-extension-panel__header", children: [_jsx("h2", { children: panelTitle(active) }), _jsx("button", { type: "button", className: "dsh-qa-extension-panel__close", "aria-label": `Закрыть панель: ${panelTitle(active)}`, onClick: () => panels.close({ reason: "user" }), children: _jsx("svg", { viewBox: "0 0 14 14", "aria-hidden": "true", children: _jsx("path", { d: "m3.5 3.5 7 7m0-7-7 7" }) }) })] }), _jsx("div", { className: "dsh-qa-extension-panel__bodies", children: snapshot.definitions.map((definition) => {
|
|
180
|
+
}, children: [_jsxs("header", { className: "dsh-qa-extension-panel__header", "data-testid": "qa-panel-header", children: [_jsx("h2", { "data-testid": "qa-panel-title", children: panelTitle(active) }), _jsx("button", { type: "button", className: "dsh-qa-extension-panel__close", "data-testid": "qa-panel-close", "aria-label": `Закрыть панель: ${panelTitle(active)}`, onClick: () => panels.close({ reason: "user" }), children: _jsx("svg", { viewBox: "0 0 14 14", "aria-hidden": "true", children: _jsx("path", { d: "m3.5 3.5 7 7m0-7-7 7" }) }) })] }), _jsx("div", { className: "dsh-qa-extension-panel__bodies", children: snapshot.definitions.map((definition) => {
|
|
181
181
|
const visible = definition.kind === snapshot.activeKind;
|
|
182
182
|
if (!visible &&
|
|
183
183
|
(!definition.keepMounted || !mounted.current.has(definition.id))) {
|
|
@@ -203,7 +203,7 @@ export function QaPanelHost({ panels, sessionId, qaToken = "", renderSlot, }) {
|
|
|
203
203
|
},
|
|
204
204
|
signal,
|
|
205
205
|
};
|
|
206
|
-
return (_jsx("div", { className: "dsh-qa-extension-panel__body", hidden: !visible, "aria-hidden": !visible, children: _jsx(PanelErrorBoundary, { definition: definition, children: _jsx(PanelSlotBody, { definition: definition, owner: owner, renderSlot: renderSlot }) }) }, definition.id));
|
|
206
|
+
return (_jsx("div", { className: "dsh-qa-extension-panel__body", "data-testid": "qa-panel-body", hidden: !visible, "aria-hidden": !visible, children: _jsx(PanelErrorBoundary, { definition: definition, children: _jsx(PanelSlotBody, { definition: definition, owner: owner, renderSlot: renderSlot }) }) }, definition.id));
|
|
207
207
|
}) })] })] }));
|
|
208
208
|
}
|
|
209
209
|
//# sourceMappingURL=PanelHost.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PanelHost.js","sourceRoot":"","sources":["../../../src/client/panels/PanelHost.tsx"],"names":[],"mappings":";AAAA,OAAO,EACL,SAAS,EACT,SAAS,EACT,eAAe,EACf,MAAM,EACN,QAAQ,EACR,oBAAoB,GAKrB,MAAM,OAAO,CAAC;AASf,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,CAAC;AAC3C,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,CAAC;AACnC,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,CAAC;AAClC,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,CAAC;AACtC,MAAM,CAAC,MAAM,6BAA6B,GAAG,GAAG,CAAC;AACjD,MAAM,UAAU,GAAG,CAAC,CAAC;AAIrB,MAAM,UAAU,iBAAiB,CAAC,KAAa,EAAE,SAAiB;IAChE,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,SAAS,GAAG,kBAAkB,CAAC,CAAC;IAC3E,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CACtB,eAAe,EACf,SAAS,GAAG,cAAc,GAAG,UAAU,CACxC,CAAC;IACF,OAAO,IAAI,CAAC,KAAK,CACf,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,eAAe,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,CAC9D,CAAC;AACJ,CAAC;AAED,MAAM,kBAAmB,SAAQ,SAMhC;IACC,KAAK,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAE1B,MAAM,CAAC,wBAAwB;QAC7B,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAC1B,CAAC;IAED,iBAAiB,CAAC,KAAc;QAC9B,OAAO,CAAC,KAAK,CACX,0BAA0B,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,UAAU,EAC9D,KAAK,CACN,CAAC;IACJ,CAAC;IAED,MAAM;QACJ,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YACtB,OAAO,CACL,
|
|
1
|
+
{"version":3,"file":"PanelHost.js","sourceRoot":"","sources":["../../../src/client/panels/PanelHost.tsx"],"names":[],"mappings":"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"}
|
|
@@ -30,10 +30,10 @@ export function QaPanelLauncher({ panels, }) {
|
|
|
30
30
|
const visible = snapshot.definitions.filter((definition) => definition.userVisible !== false);
|
|
31
31
|
if (visible.length === 0)
|
|
32
32
|
return null;
|
|
33
|
-
return (_jsx("nav", { className: "dsh-qa-panel-launcher", "aria-label": "\u041F\u0430\u043D\u0435\u043B\u0438 QA", children: visible.map((definition) => {
|
|
33
|
+
return (_jsx("nav", { className: "dsh-qa-panel-launcher", "data-testid": "qa-panel-launcher", "aria-label": "\u041F\u0430\u043D\u0435\u043B\u0438 QA", children: visible.map((definition) => {
|
|
34
34
|
const label = title(definition);
|
|
35
35
|
const active = snapshot.activeKind === definition.kind;
|
|
36
|
-
return (_jsx("button", { type: "button", className: "dsh-qa-panel-launcher__button", "aria-label": `${active ? "Закрыть" : "Открыть"} панель: ${label}`, "aria-pressed": active, title: label, onClick: () => panels.toggle(definition.kind), children: _jsx("svg", { viewBox: "0 0 16 16", "aria-hidden": "true", children: _jsx(PanelIcon, { token: definition.icon }) }) }, definition.id));
|
|
36
|
+
return (_jsx("button", { type: "button", className: "dsh-qa-panel-launcher__button", "data-testid": "qa-panel-launcher-button", "aria-label": `${active ? "Закрыть" : "Открыть"} панель: ${label}`, "aria-pressed": active, title: label, onClick: () => panels.toggle(definition.kind), children: _jsx("svg", { viewBox: "0 0 16 16", "aria-hidden": "true", children: _jsx(PanelIcon, { token: definition.icon }) }) }, definition.id));
|
|
37
37
|
}) }));
|
|
38
38
|
}
|
|
39
39
|
//# sourceMappingURL=PanelLauncher.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PanelLauncher.js","sourceRoot":"","sources":["../../../src/client/panels/PanelLauncher.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAI7C,SAAS,KAAK,CAAC,UAAoC;IACjD,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC;QACxC,OAAO,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,UAAU,CAAC,IAAI,CAAC;IACzB,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,EAAE,KAAK,EAA0C;IAClE,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,SAAS;YACZ,OAAO,eAAM,CAAC,EAAC,oDAAoD,GAAG,CAAC;QACzE,KAAK,WAAW;YACd,OAAO,eAAM,CAAC,EAAC,8CAA8C,GAAG,CAAC;QACnE,KAAK,MAAM;YACT,OAAO,eAAM,CAAC,EAAC,mCAAmC,GAAG,CAAC;QACxD,KAAK,UAAU;YACb,OAAO,eAAM,CAAC,EAAC,iCAAiC,GAAG,CAAC;QACtD,KAAK,UAAU;YACb,OAAO,eAAM,CAAC,EAAC,gCAAgC,GAAG,CAAC;QACrD;YACE,OAAO,CACL,eAAM,CAAC,EAAC,mEAAmE,GAAG,CAC/E,CAAC;IACN,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,EAC9B,MAAM,GAGP;IACC,MAAM,QAAQ,GAAG,oBAAoB,CACnC,MAAM,CAAC,SAAS,EAChB,MAAM,CAAC,WAAW,EAClB,MAAM,CAAC,WAAW,CACnB,CAAC;IACF,MAAM,OAAO,GAAG,QAAQ,CAAC,WAAW,CAAC,MAAM,CACzC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,WAAW,KAAK,KAAK,CACjD,CAAC;IACF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACtC,OAAO,CACL,
|
|
1
|
+
{"version":3,"file":"PanelLauncher.js","sourceRoot":"","sources":["../../../src/client/panels/PanelLauncher.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAI7C,SAAS,KAAK,CAAC,UAAoC;IACjD,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC;QACxC,OAAO,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,UAAU,CAAC,IAAI,CAAC;IACzB,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,EAAE,KAAK,EAA0C;IAClE,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,SAAS;YACZ,OAAO,eAAM,CAAC,EAAC,oDAAoD,GAAG,CAAC;QACzE,KAAK,WAAW;YACd,OAAO,eAAM,CAAC,EAAC,8CAA8C,GAAG,CAAC;QACnE,KAAK,MAAM;YACT,OAAO,eAAM,CAAC,EAAC,mCAAmC,GAAG,CAAC;QACxD,KAAK,UAAU;YACb,OAAO,eAAM,CAAC,EAAC,iCAAiC,GAAG,CAAC;QACtD,KAAK,UAAU;YACb,OAAO,eAAM,CAAC,EAAC,gCAAgC,GAAG,CAAC;QACrD;YACE,OAAO,CACL,eAAM,CAAC,EAAC,mEAAmE,GAAG,CAC/E,CAAC;IACN,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,EAC9B,MAAM,GAGP;IACC,MAAM,QAAQ,GAAG,oBAAoB,CACnC,MAAM,CAAC,SAAS,EAChB,MAAM,CAAC,WAAW,EAClB,MAAM,CAAC,WAAW,CACnB,CAAC;IACF,MAAM,OAAO,GAAG,QAAQ,CAAC,WAAW,CAAC,MAAM,CACzC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,WAAW,KAAK,KAAK,CACjD,CAAC;IACF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACtC,OAAO,CACL,cACE,SAAS,EAAC,uBAAuB,iBACrB,mBAAmB,gBACpB,yCAAW,YAErB,OAAO,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE;YAC1B,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC;YAChC,MAAM,MAAM,GAAG,QAAQ,CAAC,UAAU,KAAK,UAAU,CAAC,IAAI,CAAC;YACvD,OAAO,CACL,iBAEE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,+BAA+B,iBAC7B,0BAA0B,gBAC1B,GAAG,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,YAAY,KAAK,EAAE,kBAClD,MAAM,EACpB,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,YAE7C,cAAK,OAAO,EAAC,WAAW,iBAAa,MAAM,YACzC,KAAC,SAAS,IAAC,KAAK,EAAE,UAAU,CAAC,IAAI,GAAI,GACjC,IAXD,UAAU,CAAC,EAAE,CAYX,CACV,CAAC;QACJ,CAAC,CAAC,GACE,CACP,CAAC;AACJ,CAAC"}
|