@yadsh/dsh-qa-surface 0.13.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 +178 -0
- 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 +52 -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 +12 -12
- 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 +4 -4
- package/lib/client/admin/pages/Overview.js.map +1 -1
- package/lib/client/admin/pages/Quality.js +5 -5
- package/lib/client/admin/pages/Quality.js.map +1 -1
- package/lib/client/admin/pages/Review.js +5 -5
- 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 +15 -6
- 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 +64 -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 +40 -20
- 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 -16
- 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/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 +133 -83
- 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 +7228 -4002
- 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 +145 -30
- 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/qa-tools/docs-tools.js +1 -1
- 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 +1398 -651
- package/lib/typert.remote-client.d.ts +15 -1
- package/lib/typert.remote-client.js +1315 -645
- 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 +60 -1
- package/lib/types/client/QaAccountsController.d.ts +25 -2
- 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 +4 -0
- 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/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 +25 -1
- 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 +53 -5
- 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/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 +180 -4
- package/package.json +64 -63
- package/scripts/attach-workspace-sessions.mjs +24 -5
- package/scripts/repair-session-events.mjs +25 -5
- package/lib/client/markdown/MermaidBlock.js +0 -80
- package/lib/client/markdown/MermaidBlock.js.map +0 -1
- package/lib/types/client/markdown/MermaidBlock.d.ts +0 -6
|
@@ -1,13 +1,26 @@
|
|
|
1
1
|
import type { Context } from "@deepseek-ai/cordis";
|
|
2
|
+
import type { ContextSnapshotSection } from "@deepseek-ai/dsh-llm";
|
|
2
3
|
import type { PluginLogger } from "@yadsh/dsh-plugin-log";
|
|
3
4
|
import type { QaAccounts } from "./accounts/store.js";
|
|
4
5
|
import type { QaAccountIdentityField, QaAccountProfile, ResolvedQaSurfaceConfig } from "./types.js";
|
|
5
6
|
/**
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
7
|
+
* This plugin's own producer source kind. The `@deepseek-ai/dsh-llm` source map
|
|
8
|
+
* is merge-extensible and ships no catch-all `plugin` kind, so a producer names
|
|
9
|
+
* itself here. The chat projection turns a `qa-notes`-sourced user message into
|
|
10
|
+
* injected context rather than a chat bubble, and the QA transcript keeps
|
|
11
|
+
* exactly those hidden.
|
|
9
12
|
*/
|
|
10
|
-
export
|
|
13
|
+
export interface QaNotesMessageSource {
|
|
14
|
+
readonly kind: "qa-notes";
|
|
15
|
+
/** Every note is superseded by the next one this plugin injects. */
|
|
16
|
+
readonly form: "snapshot";
|
|
17
|
+
readonly sections: readonly ContextSnapshotSection[];
|
|
18
|
+
}
|
|
19
|
+
declare module "@deepseek-ai/dsh-llm" {
|
|
20
|
+
interface MessageSourceMap {
|
|
21
|
+
"qa-notes": QaNotesMessageSource;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
11
24
|
/** Note name carrying who the assistant is talking to. */
|
|
12
25
|
export declare const QA_IDENTITY_NOTE = "dsh-qa-surface:user-identity";
|
|
13
26
|
/** Note name carrying the deployment's rule about source provenance. */
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { Agent } from "@deepseek-ai/dsh-agent";
|
|
2
|
+
import type { QaQueueStatus } from "./types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Chat turns the stand is answering right now.
|
|
5
|
+
*
|
|
6
|
+
* `running` is the harness's own definition of an active request: an agent
|
|
7
|
+
* enters it when waking input starts the driver and leaves it when the driver
|
|
8
|
+
* retires, which is what `agent/status` reports. Reading the live agents rather
|
|
9
|
+
* than counting the plugin's own sends is what keeps the places honest — a
|
|
10
|
+
* browser that closes mid-answer, an answer started through the HTTP API and a
|
|
11
|
+
* turn resumed by another surface all occupy a place, and none of them has to
|
|
12
|
+
* report it here. Only top-level agents count: a delegated expert's requests
|
|
13
|
+
* belong to the chat turn that delegated them, so charging both would bill one
|
|
14
|
+
* conversation twice.
|
|
15
|
+
*
|
|
16
|
+
* The count is of the model's load, not of this plugin's traffic: a turn the
|
|
17
|
+
* native assistant runs occupies a place exactly like a QA question does,
|
|
18
|
+
* because the ceiling exists for the card that is busy either way.
|
|
19
|
+
*/
|
|
20
|
+
export declare function qaActiveRequests(agents: readonly {
|
|
21
|
+
readonly status: Agent["status"];
|
|
22
|
+
}[]): number;
|
|
23
|
+
/**
|
|
24
|
+
* Judge the live count against the deployment's ceiling. A ceiling of 0 sets no
|
|
25
|
+
* limit, so the stand is never full and nobody waits.
|
|
26
|
+
*
|
|
27
|
+
* There is deliberately no "ahead of you" number: `active` includes this
|
|
28
|
+
* visitor's own turns, and a stand that cannot say which place belongs to whom
|
|
29
|
+
* should not pretend to know who is waiting behind whom.
|
|
30
|
+
*/
|
|
31
|
+
export declare function qaQueueStatus(limit: number, active: number): QaQueueStatus;
|
|
32
|
+
//# sourceMappingURL=request-queue.d.ts.map
|
|
@@ -5,6 +5,23 @@
|
|
|
5
5
|
* browser build must not pull the Host config surface (schemastery) into the
|
|
6
6
|
* page just to learn the namespace name.
|
|
7
7
|
*/
|
|
8
|
-
/**
|
|
9
|
-
|
|
8
|
+
/**
|
|
9
|
+
* Settings namespace the QA surface owns and its card binds to.
|
|
10
|
+
*
|
|
11
|
+
* The namespace is the profile entry id the bundle declares in
|
|
12
|
+
* `cordis.patch.yml`, not a name this plugin picks: the Host derives the
|
|
13
|
+
* configuration form of every entry from its volatile `Config` fields and serves
|
|
14
|
+
* it under that id.
|
|
15
|
+
*/
|
|
16
|
+
export declare const QA_SURFACE_SETTINGS_NAMESPACE = "dsh-qa-surface";
|
|
17
|
+
/**
|
|
18
|
+
* The key of the seat this card takes on the Host's Plugins page.
|
|
19
|
+
*
|
|
20
|
+
* `plugins.row.config` is keyed `<package name>#<row id>`, so the two names the
|
|
21
|
+
* page joins are this bundle's `package.json.name` and the profile entry id
|
|
22
|
+
* above. Neither is a name this plugin picks: a key that drifts from that pair
|
|
23
|
+
* leaves the row without its configure control and the card off the page, with
|
|
24
|
+
* nothing said about it.
|
|
25
|
+
*/
|
|
26
|
+
export declare const QA_SURFACE_ROW_CONFIG_KEY = "@yadsh/dsh-qa-surface#dsh-qa-surface";
|
|
10
27
|
//# sourceMappingURL=settings.d.ts.map
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Context } from "@deepseek-ai/cordis";
|
|
2
|
+
import type { PluginLogger } from "@yadsh/dsh-plugin-log";
|
|
3
|
+
/**
|
|
4
|
+
* Write a failed turn where the operator of the stand reads it.
|
|
5
|
+
*
|
|
6
|
+
* The chat row of a failed turn carries the failure code and nothing else: the
|
|
7
|
+
* provider's own message is deliberately kept out of the browser, and the
|
|
8
|
+
* session journal that holds it is a zstd archive nobody reads over an
|
|
9
|
+
* operator's shoulder. So a stand whose provider adapters never registered —
|
|
10
|
+
* every turn ending `NO_ADAPTER` — shows its tester «Помощнику не удалось
|
|
11
|
+
* завершить ответ.» and stays undiagnosable until someone decodes frames by
|
|
12
|
+
* hand. This listener puts the facts an operator needs — the chat, the session
|
|
13
|
+
* that died inside it, the turn, the code, and the provider the Host was asked
|
|
14
|
+
* to route to — into the plugin's own daily log, which is mirrored to the
|
|
15
|
+
* container's stdout from `warn` up.
|
|
16
|
+
*/
|
|
17
|
+
export declare function registerTurnFailureLog(ctx: Context, logger: PluginLogger, resolveChat: (sessionId: string) => string | undefined): () => void;
|
|
18
|
+
//# sourceMappingURL=turn-failure-log.d.ts.map
|
package/lib/types/types.d.ts
CHANGED
|
@@ -44,7 +44,14 @@ export type QaAccountRole = "user" | "reviewer" | "admin";
|
|
|
44
44
|
/** Administrative permissions a role grants; see `admin/permissions.ts`. */
|
|
45
45
|
export type QaPermission = "users.read" | "users.manage" | "roles.read" | "roles.manage" | "conversations.read.all" | "conversations.read.own" | "conversations.delete" | "reviews.read" | "reviews.write" | "analytics.read" | "audit.read" | "settings.manage"
|
|
46
46
|
/** Write access to skill files, personal and deployment-wide. */
|
|
47
|
-
| "skills.manage"
|
|
47
|
+
| "skills.manage"
|
|
48
|
+
/**
|
|
49
|
+
* What the domain experts wrote into their durable memory. Reading is split
|
|
50
|
+
* from correcting because a reviewer is the one who notices a remembered
|
|
51
|
+
* inaccuracy in an answer, and an answer the expert keeps getting wrong is
|
|
52
|
+
* the reviewer's business even though the fix is not.
|
|
53
|
+
*/
|
|
54
|
+
| "memory.read" | "memory.manage";
|
|
48
55
|
/**
|
|
49
56
|
* Tools split by how they become available. `always` is visible from the first
|
|
50
57
|
* model step; `skillGrantable` is a ceiling — the tool only appears once an
|
|
@@ -217,7 +224,9 @@ export interface QaEffectiveCapabilityPolicy {
|
|
|
217
224
|
readonly skills: readonly string[];
|
|
218
225
|
/**
|
|
219
226
|
* Visible skills a person may invoke with `/name`, including skills that
|
|
220
|
-
* opted out of model invocation and therefore stay out of the catalog.
|
|
227
|
+
* opted out of model invocation and therefore stay out of the catalog. The
|
|
228
|
+
* skills this account owns are here for it without a role grant, unless an
|
|
229
|
+
* administrator has withdrawn the name outright.
|
|
221
230
|
*/
|
|
222
231
|
readonly userSkills: readonly string[];
|
|
223
232
|
readonly sources: {
|
|
@@ -290,6 +299,8 @@ export interface QaAccountUserPublic {
|
|
|
290
299
|
readonly profile: QaAccountProfile;
|
|
291
300
|
/** The account's own starter buttons; empty until customized. */
|
|
292
301
|
readonly starters: QaAccountStarters;
|
|
302
|
+
/** Which channels a finished turn may use for this reader. */
|
|
303
|
+
readonly notifications: QaAccountNotifications;
|
|
293
304
|
}
|
|
294
305
|
/** One external system the deployment collects a handle for. */
|
|
295
306
|
export interface QaAccountIdentityField {
|
|
@@ -339,6 +350,31 @@ export interface QaAccountStartersInput {
|
|
|
339
350
|
readonly items: readonly QaAccountStarter[];
|
|
340
351
|
readonly hideDefaults: boolean;
|
|
341
352
|
}
|
|
353
|
+
/**
|
|
354
|
+
* What one account allows a finished turn to do to it. Pure UI preferences:
|
|
355
|
+
* unlike the profile, none of this reaches the agent prompt, and unlike the
|
|
356
|
+
* starter buttons, none of it is content — it is two switches over the
|
|
357
|
+
* channels the plugin already knows how to raise.
|
|
358
|
+
*
|
|
359
|
+
* The deployment's `config.notifications` sits above these: a channel the stand
|
|
360
|
+
* closed stays closed whatever an account asks for, which is the operator's
|
|
361
|
+
* answer to a laptop more than one person signs in on.
|
|
362
|
+
*/
|
|
363
|
+
export interface QaAccountNotifications {
|
|
364
|
+
/** Show the in-page line naming the chat whose turn ended. */
|
|
365
|
+
readonly inApp: boolean;
|
|
366
|
+
/**
|
|
367
|
+
* Hand the same fact to the operating system while this page is hidden or
|
|
368
|
+
* behind another window. Needs the browser's permission as well: without it
|
|
369
|
+
* the line stays inside the page and nothing asks a second time.
|
|
370
|
+
*/
|
|
371
|
+
readonly desktop: boolean;
|
|
372
|
+
}
|
|
373
|
+
/** Full-replace notifications write: both channels are always sent. */
|
|
374
|
+
export interface QaAccountNotificationsInput {
|
|
375
|
+
readonly inApp: boolean;
|
|
376
|
+
readonly desktop: boolean;
|
|
377
|
+
}
|
|
342
378
|
/** One successful login/registration: the bearer token plus the user. */
|
|
343
379
|
export interface QaAccountSession {
|
|
344
380
|
readonly token: string;
|
|
@@ -425,7 +461,7 @@ export interface QaOwnershipEntry {
|
|
|
425
461
|
* Why one skill draft cannot be saved, or why it saves with a caveat. Codes
|
|
426
462
|
* stay stable on the wire; the browser owns the Russian copy.
|
|
427
463
|
*/
|
|
428
|
-
export type QaSkillDiagnosticCode = "name-required" | "name-invalid" | "name-mismatch" | "description-required" | "description-too-long" | "when-to-use-too-long" | "field-type-invalid" | "invocation-never" | "invocation-invalid" | "invocation-legacy-key" | "allowed-tools-invalid" | "tool-name-invalid" | "tool-unavailable" | "tools-too-many" | "file-too-large" | "frontmatter-missing" | "skill-file-missing" | "frontmatter-invalid" | "unknown-field" | "resource-unsupported";
|
|
464
|
+
export type QaSkillDiagnosticCode = "name-required" | "name-invalid" | "name-mismatch" | "description-required" | "description-too-long" | "when-to-use-too-long" | "field-type-invalid" | "invocation-never" | "invocation-invalid" | "invocation-legacy-key" | "allowed-tools-invalid" | "tool-name-invalid" | "tool-unavailable" | "tools-too-many" | "file-too-large" | "frontmatter-missing" | "skill-file-missing" | "skill-file-truncated" | "frontmatter-invalid" | "unknown-field" | "resource-unsupported";
|
|
429
465
|
/** One finding about a skill file or an editor draft. */
|
|
430
466
|
export interface QaSkillDiagnostic {
|
|
431
467
|
readonly code: QaSkillDiagnosticCode;
|
|
@@ -482,6 +518,40 @@ export interface QaAdminSkillsView {
|
|
|
482
518
|
/** Absolute directory this scope reads and writes, rendered read-only. */
|
|
483
519
|
readonly rootPath: string;
|
|
484
520
|
}
|
|
521
|
+
/**
|
|
522
|
+
* One memory namespace as the console lists it: which expert it belongs to and
|
|
523
|
+
* whether it takes writes. `access` comes from the expert's own definition, so
|
|
524
|
+
* a shared carrier shows up as what its owner declared rather than as whatever
|
|
525
|
+
* the browser guessed.
|
|
526
|
+
*/
|
|
527
|
+
export interface QaExpertMemoryScope {
|
|
528
|
+
readonly domainId: string;
|
|
529
|
+
readonly domainName: string;
|
|
530
|
+
readonly namespace: string;
|
|
531
|
+
readonly access: "read-write" | "read-only";
|
|
532
|
+
readonly records: number;
|
|
533
|
+
}
|
|
534
|
+
/** One line an expert recorded. */
|
|
535
|
+
export interface QaExpertMemoryRecord {
|
|
536
|
+
readonly namespace: string;
|
|
537
|
+
readonly key: string;
|
|
538
|
+
readonly text: string;
|
|
539
|
+
readonly tags: readonly string[];
|
|
540
|
+
readonly createdAt: number;
|
|
541
|
+
readonly updatedAt: number;
|
|
542
|
+
}
|
|
543
|
+
/** One page of a namespace, with the count the filter matched. */
|
|
544
|
+
export interface QaExpertMemoryPage {
|
|
545
|
+
readonly records: readonly QaExpertMemoryRecord[];
|
|
546
|
+
readonly total: number;
|
|
547
|
+
readonly offset: number;
|
|
548
|
+
readonly limit: number;
|
|
549
|
+
}
|
|
550
|
+
/** What an operator says a record should hold. The key never moves. */
|
|
551
|
+
export interface QaExpertMemoryDraft {
|
|
552
|
+
readonly text: string;
|
|
553
|
+
readonly tags: readonly string[];
|
|
554
|
+
}
|
|
485
555
|
export interface QaSkillSummary {
|
|
486
556
|
readonly name: string;
|
|
487
557
|
readonly description: string;
|
|
@@ -516,6 +586,12 @@ export interface QaSkillDocument extends QaSkillSummary {
|
|
|
516
586
|
readonly sourcePath: string;
|
|
517
587
|
/** The canonical file the serializer writes, built from the parsed content. */
|
|
518
588
|
readonly preview: string;
|
|
589
|
+
/**
|
|
590
|
+
* True when the stored file is larger than the Host's read ceiling, so `body`
|
|
591
|
+
* and `preview` describe its head only. A save over such a document erases
|
|
592
|
+
* the unread tail, and the Host refuses it until the client confirms.
|
|
593
|
+
*/
|
|
594
|
+
readonly truncated: boolean;
|
|
519
595
|
}
|
|
520
596
|
/** One tool the picker can offer, with this deployment's availability. */
|
|
521
597
|
export interface QaSkillToolDescriptor {
|
|
@@ -535,6 +611,13 @@ export interface QaSkillDraftInput {
|
|
|
535
611
|
readonly body: string;
|
|
536
612
|
/** Echo of the revision the editor read; a stale one is refused. */
|
|
537
613
|
readonly expectedRevision: string | null;
|
|
614
|
+
/**
|
|
615
|
+
* The client's acknowledgement that it is saving from an incomplete copy: the
|
|
616
|
+
* stored `SKILL.md` is over the read ceiling, so the draft carries the head
|
|
617
|
+
* of the file and a save would drop everything the read never loaded. A write
|
|
618
|
+
* without it is refused.
|
|
619
|
+
*/
|
|
620
|
+
readonly confirmPartialOverwrite?: boolean;
|
|
538
621
|
}
|
|
539
622
|
/**
|
|
540
623
|
* The Host's answer about one unsaved draft: the file a save would write and
|
|
@@ -666,6 +749,14 @@ export interface QaSurfaceConfig {
|
|
|
666
749
|
readonly provider?: string | null;
|
|
667
750
|
readonly model?: string | null;
|
|
668
751
|
readonly reasoningEffort?: string | null;
|
|
752
|
+
/**
|
|
753
|
+
* How many chat turns the deployment answers at once. A ceiling is what a
|
|
754
|
+
* locally hosted model needs: the card runs out long before the queue does,
|
|
755
|
+
* and a third request makes every answer on the stand slower instead of
|
|
756
|
+
* adding capacity. 0 leaves the count unbounded, which is the default
|
|
757
|
+
* because a hosted model has no such ceiling.
|
|
758
|
+
*/
|
|
759
|
+
readonly maxActiveRequests?: number;
|
|
669
760
|
};
|
|
670
761
|
readonly ui?: {
|
|
671
762
|
readonly showHeader?: boolean;
|
|
@@ -840,6 +931,17 @@ export interface QaSurfaceConfig {
|
|
|
840
931
|
/** Cookie-less /qa navigations go through the one-time ?token= exchange. */
|
|
841
932
|
readonly cookieBootstrap?: boolean;
|
|
842
933
|
};
|
|
934
|
+
/** Notices for a turn that ended in one of this browser's own chats. */
|
|
935
|
+
readonly notifications?: {
|
|
936
|
+
/** Master switch: with it off no channel raises anything. */
|
|
937
|
+
readonly enabled?: boolean;
|
|
938
|
+
/**
|
|
939
|
+
* Allow the desktop (operating-system) channel on this stand at all.
|
|
940
|
+
* A reader's own choice only applies while this is on: it is the answer
|
|
941
|
+
* for a shared laptop, where a personal notice is everybody's notice.
|
|
942
|
+
*/
|
|
943
|
+
readonly allowOs?: boolean;
|
|
944
|
+
};
|
|
843
945
|
readonly sources?: QaSourcesConfig;
|
|
844
946
|
readonly attachments?: QaAttachmentsConfig;
|
|
845
947
|
readonly notes?: QaNotesConfig;
|
|
@@ -923,6 +1025,7 @@ export interface ResolvedQaSurfaceConfig {
|
|
|
923
1025
|
readonly provider: string | null;
|
|
924
1026
|
readonly model: string | null;
|
|
925
1027
|
readonly reasoningEffort: string | null;
|
|
1028
|
+
readonly maxActiveRequests: number;
|
|
926
1029
|
};
|
|
927
1030
|
readonly ui: {
|
|
928
1031
|
readonly showHeader: boolean;
|
|
@@ -1007,6 +1110,11 @@ export interface ResolvedQaSurfaceConfig {
|
|
|
1007
1110
|
readonly redirectNonLoopback: boolean;
|
|
1008
1111
|
readonly cookieBootstrap: boolean;
|
|
1009
1112
|
};
|
|
1113
|
+
/** Channels a finished turn of this browser's own chats may use. */
|
|
1114
|
+
readonly notifications: {
|
|
1115
|
+
readonly enabled: boolean;
|
|
1116
|
+
readonly allowOs: boolean;
|
|
1117
|
+
};
|
|
1010
1118
|
readonly tools: {
|
|
1011
1119
|
readonly dynamicActivation: boolean;
|
|
1012
1120
|
readonly activationSkill: string;
|
|
@@ -1530,9 +1638,55 @@ export interface QaPendingQuestion {
|
|
|
1530
1638
|
readonly questions: readonly QaPendingQuestionItem[];
|
|
1531
1639
|
readonly createdAt: number;
|
|
1532
1640
|
}
|
|
1641
|
+
/**
|
|
1642
|
+
* One message that waits for the agent's next turn. Rows the Host already
|
|
1643
|
+
* admitted carry their durable occurrence id, which is what a queue operation
|
|
1644
|
+
* addresses; a row still in flight carries a browser id and edits nothing.
|
|
1645
|
+
*/
|
|
1646
|
+
export interface QaQueueRow {
|
|
1647
|
+
readonly id: string;
|
|
1648
|
+
/** Short single-line text for the strip; newlines are folded away. */
|
|
1649
|
+
readonly preview: string;
|
|
1650
|
+
/** Full text to edit, or null when the row is not plain text. */
|
|
1651
|
+
readonly text: string | null;
|
|
1652
|
+
/** Attachments the row carries besides its text. */
|
|
1653
|
+
readonly attachments: number;
|
|
1654
|
+
/** Set for a local row the Host queue has not echoed back yet. */
|
|
1655
|
+
readonly sending: boolean;
|
|
1656
|
+
}
|
|
1657
|
+
/** What the queue strip may ask the Host to do with one waiting message. */
|
|
1658
|
+
export type QaQueueOperation = "edit" | "remove" | "steer";
|
|
1659
|
+
/**
|
|
1660
|
+
* What `qaSurface/queueStatus` answers: how much of the deployment's request
|
|
1661
|
+
* ceiling is in use right now. The Host counts the chats whose agent is running
|
|
1662
|
+
* a turn, so the load is read where the whole of it is visible rather than
|
|
1663
|
+
* guessed from one browser's view of the stand.
|
|
1664
|
+
*/
|
|
1665
|
+
export interface QaQueueStatus {
|
|
1666
|
+
/** The configured ceiling; 0 means the deployment sets none. */
|
|
1667
|
+
readonly limit: number;
|
|
1668
|
+
/**
|
|
1669
|
+
* Turns answering at the moment of the read, this visitor's own included —
|
|
1670
|
+
* the stand cannot tell a place it owes someone from one it owes you.
|
|
1671
|
+
*/
|
|
1672
|
+
readonly active: number;
|
|
1673
|
+
/** Whether one more turn fits; false while no ceiling is set. */
|
|
1674
|
+
readonly full: boolean;
|
|
1675
|
+
}
|
|
1533
1676
|
export interface QaSessionState {
|
|
1534
1677
|
readonly phase: QaSessionPhase;
|
|
1535
1678
|
readonly sessionId: string | null;
|
|
1679
|
+
/**
|
|
1680
|
+
* Identity of the chat the surface is showing. Unique across every chat the
|
|
1681
|
+
* page has opened — a controller that is re-created for a new chat is handed
|
|
1682
|
+
* a new identity, so a component keyed by it cannot carry one chat's composer
|
|
1683
|
+
* text into another. It is taken only when the chat changes: a draft that
|
|
1684
|
+
* creates its session on the first prompt keeps its key, because the composer
|
|
1685
|
+
* holds an unsent question in component state, and remounting it on the new
|
|
1686
|
+
* session id would throw that text away before the Host has accepted
|
|
1687
|
+
* anything. `0` means no chat — see `QA_SESSION_IDLE_STATE`.
|
|
1688
|
+
*/
|
|
1689
|
+
readonly chatKey: number;
|
|
1536
1690
|
readonly messages: readonly QaMessage[];
|
|
1537
1691
|
/** Immediate send feedback, kept outside the durable transcript. */
|
|
1538
1692
|
readonly pendingMessage: QaPendingUserMessage | null;
|
|
@@ -1545,6 +1699,14 @@ export interface QaSessionState {
|
|
|
1545
1699
|
readonly compatibilityReadOnly?: boolean;
|
|
1546
1700
|
readonly canSend: boolean;
|
|
1547
1701
|
readonly canStop: boolean;
|
|
1702
|
+
/**
|
|
1703
|
+
* Messages waiting for the next turn, oldest first. Sending while the agent
|
|
1704
|
+
* runs lands here instead of in the transcript, so the strip beside the
|
|
1705
|
+
* composer is the only place the user can still see them.
|
|
1706
|
+
*/
|
|
1707
|
+
readonly queue: readonly QaQueueRow[];
|
|
1708
|
+
/** Whether a queue operation may be issued on this binding right now. */
|
|
1709
|
+
readonly canEditQueue: boolean;
|
|
1548
1710
|
/** Bumped whenever this browser's chat index changes (add/forget). */
|
|
1549
1711
|
readonly chatsRevision: number;
|
|
1550
1712
|
/** Tool-derived sources of the current chat (web targets and files read). */
|
|
@@ -1557,6 +1719,14 @@ export interface QaSessionState {
|
|
|
1557
1719
|
readonly approvals: readonly QaPendingApproval[];
|
|
1558
1720
|
/** Question requests parked for the operator's answer, oldest first. */
|
|
1559
1721
|
readonly questions: readonly QaPendingQuestion[];
|
|
1722
|
+
/**
|
|
1723
|
+
* Set when a send was held back because the stand is already answering as
|
|
1724
|
+
* many questions as it allows. The question never left the browser, so this
|
|
1725
|
+
* is the whole of what the visitor is told about it; the surface answers with
|
|
1726
|
+
* the request-ceiling dialog and the composer keeps the draft. Named apart
|
|
1727
|
+
* from `queue`, which is the same chat's list of waiting messages.
|
|
1728
|
+
*/
|
|
1729
|
+
readonly requestQueue: QaQueueStatus | null;
|
|
1560
1730
|
/** Slash palette state, keyed to the chat this snapshot describes. */
|
|
1561
1731
|
readonly slash: QaSlashView;
|
|
1562
1732
|
}
|
|
@@ -1666,7 +1836,13 @@ export interface QaReviewQueueItem {
|
|
|
1666
1836
|
/** Administrative actions recorded in the audit trail. */
|
|
1667
1837
|
export type QaAdminAuditAction = "user.created" | "user.updated" | "user.enabled" | "user.disabled"
|
|
1668
1838
|
/** An operator set a new password for an account that had requested one. */
|
|
1669
|
-
| "user.password-reset" | "authorization.changed" | "subrole.assignment.changed" | "subrole.created" | "subrole.updated" | "subrole.deleted" | "common_capabilities.updated" | "conversation.reviewed" | "conversation.deleted" | "review.updated" | "review.queued" | "admin.settings.updated" | "skill.created" | "skill.updated" | "skill.deleted"
|
|
1839
|
+
| "user.password-reset" | "authorization.changed" | "subrole.assignment.changed" | "subrole.created" | "subrole.updated" | "subrole.deleted" | "common_capabilities.updated" | "conversation.reviewed" | "conversation.deleted" | "review.updated" | "review.queued" | "admin.settings.updated" | "skill.created" | "skill.updated" | "skill.deleted"
|
|
1840
|
+
/** An operator rewrote a line an expert had remembered. */
|
|
1841
|
+
| "memory.corrected"
|
|
1842
|
+
/** One or several remembered lines were deleted; the count is in the target. */
|
|
1843
|
+
| "memory.deleted"
|
|
1844
|
+
/** A whole namespace was emptied. */
|
|
1845
|
+
| "memory.wiped";
|
|
1670
1846
|
export interface QaAdminAuditEvent {
|
|
1671
1847
|
readonly id: string;
|
|
1672
1848
|
readonly timestamp: string;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yadsh/dsh-qa-surface",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.14.0",
|
|
4
4
|
"description": "A focused end-user QA surface backed by native DeepSeek Harness sessions",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -61,12 +61,12 @@
|
|
|
61
61
|
"inject": [
|
|
62
62
|
"@deepseek-ai/dsh-api-gateway",
|
|
63
63
|
"@deepseek-ai/dsh-api-session-controller",
|
|
64
|
-
"@deepseek-ai/dsh-agent-
|
|
64
|
+
"@deepseek-ai/dsh-agent-preset-registry",
|
|
65
65
|
"@deepseek-ai/dsh-client-connection",
|
|
66
66
|
"@deepseek-ai/dsh-client-file-upload",
|
|
67
67
|
"@deepseek-ai/dsh-client-ui-layout",
|
|
68
|
+
"@deepseek-ai/dsh-client-ui-plugin-manager",
|
|
68
69
|
"@deepseek-ai/dsh-client-ui-settings",
|
|
69
|
-
"@deepseek-ai/dsh-client-ui-settings-plugins",
|
|
70
70
|
"@deepseek-ai/dsh-client-ui-theme"
|
|
71
71
|
],
|
|
72
72
|
"platform": "web"
|
|
@@ -101,78 +101,78 @@
|
|
|
101
101
|
"node": "^22.19.0 || >=24.0.0"
|
|
102
102
|
},
|
|
103
103
|
"peerDependencies": {
|
|
104
|
-
"@deepseek-ai/cordis": "^4.0.
|
|
105
|
-
"@deepseek-ai/dsh-agent": ">=0.1.
|
|
106
|
-
"@deepseek-ai/dsh-agent-
|
|
107
|
-
"@deepseek-ai/dsh-api-gateway": ">=0.1.
|
|
108
|
-
"@deepseek-ai/dsh-api-session-controller": ">=0.1.
|
|
109
|
-
"@deepseek-ai/dsh-api-workspace-controller": ">=0.1.
|
|
110
|
-
"@deepseek-ai/dsh-client-connection": ">=0.1.
|
|
111
|
-
"@deepseek-ai/dsh-client-ui-chat": ">=0.1.
|
|
112
|
-
"@deepseek-ai/dsh-client-ui-conversation": ">=0.1.
|
|
113
|
-
"@deepseek-ai/dsh-client-ui-layout": ">=0.1.
|
|
114
|
-
"@deepseek-ai/dsh-client-ui-
|
|
115
|
-
"@deepseek-ai/dsh-client-ui-
|
|
116
|
-
"@deepseek-ai/dsh-client-ui-settings
|
|
117
|
-
"@deepseek-ai/dsh-client-ui-slots": ">=0.1.
|
|
118
|
-
"@deepseek-ai/dsh-client-ui-theme": ">=0.1.
|
|
119
|
-
"@deepseek-ai/dsh-host-webserver": ">=0.1.
|
|
120
|
-
"@deepseek-ai/dsh-llm": ">=0.1.
|
|
121
|
-
"@deepseek-ai/dsh-permission-presets": ">=0.1.
|
|
122
|
-
"@deepseek-ai/dsh-session": ">=0.1.
|
|
123
|
-
"@deepseek-ai/dsh-settings": ">=0.1.
|
|
124
|
-
"@deepseek-ai/dsh-skill": ">=0.1.
|
|
125
|
-
"@deepseek-ai/dsh-system-prompt": ">=0.1.
|
|
126
|
-
"@deepseek-ai/dsh-tools": ">=0.1.
|
|
127
|
-
"@deepseek-ai/dsh-typert-protocol": ">=0.1.
|
|
128
|
-
"@deepseek-ai/dsh-workspace": ">=0.1.
|
|
129
|
-
"@deepseek-ai/schemastery": "^3.18.
|
|
104
|
+
"@deepseek-ai/cordis": "^4.0.4",
|
|
105
|
+
"@deepseek-ai/dsh-agent": ">=0.1.7-rc.2 <0.2.0",
|
|
106
|
+
"@deepseek-ai/dsh-agent-preset-registry": ">=0.1.7-rc.2 <0.2.0",
|
|
107
|
+
"@deepseek-ai/dsh-api-gateway": ">=0.1.7-rc.2 <0.2.0",
|
|
108
|
+
"@deepseek-ai/dsh-api-session-controller": ">=0.1.7-rc.2 <0.2.0",
|
|
109
|
+
"@deepseek-ai/dsh-api-workspace-controller": ">=0.1.7-rc.2 <0.2.0",
|
|
110
|
+
"@deepseek-ai/dsh-client-connection": ">=0.1.7-rc.2 <0.2.0",
|
|
111
|
+
"@deepseek-ai/dsh-client-ui-chat": ">=0.1.7-rc.2 <0.2.0",
|
|
112
|
+
"@deepseek-ai/dsh-client-ui-conversation": ">=0.1.7-rc.2 <0.2.0",
|
|
113
|
+
"@deepseek-ai/dsh-client-ui-layout": ">=0.1.7-rc.2 <0.2.0",
|
|
114
|
+
"@deepseek-ai/dsh-client-ui-plugin-manager": ">=0.1.7-rc.2 <0.2.0",
|
|
115
|
+
"@deepseek-ai/dsh-client-ui-renderer": ">=0.1.7-rc.2 <0.2.0",
|
|
116
|
+
"@deepseek-ai/dsh-client-ui-settings": ">=0.1.7-rc.2 <0.2.0",
|
|
117
|
+
"@deepseek-ai/dsh-client-ui-slots": ">=0.1.7-rc.2 <0.2.0",
|
|
118
|
+
"@deepseek-ai/dsh-client-ui-theme": ">=0.1.7-rc.2 <0.2.0",
|
|
119
|
+
"@deepseek-ai/dsh-host-webserver": ">=0.1.7-rc.2 <0.2.0",
|
|
120
|
+
"@deepseek-ai/dsh-llm": ">=0.1.7-rc.2 <0.2.0",
|
|
121
|
+
"@deepseek-ai/dsh-permission-presets": ">=0.1.7-rc.2 <0.2.0",
|
|
122
|
+
"@deepseek-ai/dsh-session": ">=0.1.7-rc.2 <0.2.0",
|
|
123
|
+
"@deepseek-ai/dsh-settings": ">=0.1.7-rc.2 <0.2.0",
|
|
124
|
+
"@deepseek-ai/dsh-skill": ">=0.1.7-rc.2 <0.2.0",
|
|
125
|
+
"@deepseek-ai/dsh-system-prompt": ">=0.1.7-rc.2 <0.2.0",
|
|
126
|
+
"@deepseek-ai/dsh-tools": ">=0.1.7-rc.2 <0.2.0",
|
|
127
|
+
"@deepseek-ai/dsh-typert-protocol": ">=0.1.7-rc.2 <0.2.0",
|
|
128
|
+
"@deepseek-ai/dsh-workspace": ">=0.1.7-rc.2 <0.2.0",
|
|
129
|
+
"@deepseek-ai/schemastery": "^3.18.4",
|
|
130
130
|
"react": "^18.2.0",
|
|
131
131
|
"react-dom": "^18.2.0"
|
|
132
132
|
},
|
|
133
133
|
"dependencies": {
|
|
134
|
-
"mermaid": "^11.12.2",
|
|
135
134
|
"yaml": "^2.9.0",
|
|
136
135
|
"zod": "^4.4.3",
|
|
137
|
-
"@yadsh/dsh-audit-
|
|
138
|
-
"@yadsh/dsh-audit-
|
|
139
|
-
"@yadsh/dsh-
|
|
140
|
-
"@yadsh/dsh-
|
|
141
|
-
"@yadsh/dsh-plugin-log": "^0.4.
|
|
136
|
+
"@yadsh/dsh-audit-ui": "^0.1.2",
|
|
137
|
+
"@yadsh/dsh-audit-core": "^0.1.1",
|
|
138
|
+
"@yadsh/dsh-plugin-kit": "^0.5.0",
|
|
139
|
+
"@yadsh/dsh-documents": "^0.6.0",
|
|
140
|
+
"@yadsh/dsh-plugin-log": "^0.4.1"
|
|
142
141
|
},
|
|
143
142
|
"devDependencies": {
|
|
144
|
-
"@deepseek-ai/cordis": "4.0.
|
|
145
|
-
"@deepseek-ai/dsh-agent": "0.1.
|
|
146
|
-
"@deepseek-ai/dsh-agent-
|
|
147
|
-
"@deepseek-ai/dsh-api-gateway": "0.1.
|
|
148
|
-
"@deepseek-ai/dsh-api-session-controller": "0.1.
|
|
149
|
-
"@deepseek-ai/dsh-api-workspace-controller": "0.1.
|
|
150
|
-
"@deepseek-ai/dsh-client-connection": "0.1.
|
|
151
|
-
"@deepseek-ai/dsh-client-ui-chat": "0.1.
|
|
152
|
-
"@deepseek-ai/dsh-client-ui-conversation": "0.1.
|
|
153
|
-
"@deepseek-ai/dsh-client-ui-layout": "0.1.
|
|
154
|
-
"@deepseek-ai/dsh-client-ui-
|
|
155
|
-
"@deepseek-ai/dsh-client-ui-
|
|
156
|
-
"@deepseek-ai/dsh-client-ui-settings
|
|
157
|
-
"@deepseek-ai/dsh-client-ui-slots": "0.1.
|
|
158
|
-
"@deepseek-ai/dsh-client-ui-theme": "0.1.
|
|
159
|
-
"@deepseek-ai/dsh-host-webserver": "0.1.
|
|
160
|
-
"@deepseek-ai/dsh-llm": "0.1.
|
|
161
|
-
"@deepseek-ai/dsh-permission-presets": "0.1.
|
|
162
|
-
"@deepseek-ai/dsh-scope": "0.1.
|
|
163
|
-
"@deepseek-ai/dsh-session": "0.1.
|
|
164
|
-
"@deepseek-ai/dsh-settings": "0.1.
|
|
165
|
-
"@deepseek-ai/dsh-skill": "0.1.
|
|
166
|
-
"@deepseek-ai/dsh-system-prompt": "0.1.
|
|
167
|
-
"@deepseek-ai/dsh-tools": "0.1.
|
|
168
|
-
"@deepseek-ai/dsh-typert-generator": "0.1.
|
|
169
|
-
"@deepseek-ai/dsh-typert-protocol": "0.1.
|
|
170
|
-
"@deepseek-ai/dsh-workspace": "0.1.
|
|
171
|
-
"@deepseek-ai/schemastery": "3.18.
|
|
143
|
+
"@deepseek-ai/cordis": "4.0.4",
|
|
144
|
+
"@deepseek-ai/dsh-agent": "0.1.7-rc.2",
|
|
145
|
+
"@deepseek-ai/dsh-agent-preset-registry": "0.1.7-rc.2",
|
|
146
|
+
"@deepseek-ai/dsh-api-gateway": "0.1.7-rc.2",
|
|
147
|
+
"@deepseek-ai/dsh-api-session-controller": "0.1.7-rc.2",
|
|
148
|
+
"@deepseek-ai/dsh-api-workspace-controller": "0.1.7-rc.2",
|
|
149
|
+
"@deepseek-ai/dsh-client-connection": "0.1.7-rc.2",
|
|
150
|
+
"@deepseek-ai/dsh-client-ui-chat": "0.1.7-rc.2",
|
|
151
|
+
"@deepseek-ai/dsh-client-ui-conversation": "0.1.7-rc.2",
|
|
152
|
+
"@deepseek-ai/dsh-client-ui-layout": "0.1.7-rc.2",
|
|
153
|
+
"@deepseek-ai/dsh-client-ui-plugin-manager": "0.1.7-rc.2",
|
|
154
|
+
"@deepseek-ai/dsh-client-ui-renderer": "0.1.7-rc.2",
|
|
155
|
+
"@deepseek-ai/dsh-client-ui-settings": "0.1.7-rc.2",
|
|
156
|
+
"@deepseek-ai/dsh-client-ui-slots": "0.1.7-rc.2",
|
|
157
|
+
"@deepseek-ai/dsh-client-ui-theme": "0.1.7-rc.2",
|
|
158
|
+
"@deepseek-ai/dsh-host-webserver": "0.1.7-rc.2",
|
|
159
|
+
"@deepseek-ai/dsh-llm": "0.1.7-rc.2",
|
|
160
|
+
"@deepseek-ai/dsh-permission-presets": "0.1.7-rc.2",
|
|
161
|
+
"@deepseek-ai/dsh-scope": "0.1.7-rc.2",
|
|
162
|
+
"@deepseek-ai/dsh-session": "0.1.7-rc.2",
|
|
163
|
+
"@deepseek-ai/dsh-settings": "0.1.7-rc.2",
|
|
164
|
+
"@deepseek-ai/dsh-skill": "0.1.7-rc.2",
|
|
165
|
+
"@deepseek-ai/dsh-system-prompt": "0.1.7-rc.2",
|
|
166
|
+
"@deepseek-ai/dsh-tools": "0.1.7-rc.2",
|
|
167
|
+
"@deepseek-ai/dsh-typert-generator": "0.1.7-rc.2",
|
|
168
|
+
"@deepseek-ai/dsh-typert-protocol": "0.1.7-rc.2",
|
|
169
|
+
"@deepseek-ai/dsh-workspace": "0.1.7-rc.2",
|
|
170
|
+
"@deepseek-ai/schemastery": "3.18.4",
|
|
172
171
|
"@testing-library/react": "^16.3.0",
|
|
173
172
|
"@types/node": "^26.4.0",
|
|
174
173
|
"@types/react": "18.3.28",
|
|
175
174
|
"@types/react-dom": "18.3.7",
|
|
175
|
+
"@vitest/coverage-v8": "^4.1.8",
|
|
176
176
|
"eslint": "10.9.1",
|
|
177
177
|
"jsdom": "^26.1.0",
|
|
178
178
|
"katex": "^0.16.47",
|
|
@@ -195,6 +195,7 @@
|
|
|
195
195
|
"lint": "eslint src tests scripts tsdown.config.ts",
|
|
196
196
|
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
197
197
|
"test": "vitest run",
|
|
198
|
+
"test:coverage": "vitest run --coverage",
|
|
198
199
|
"verify:package": "node scripts/verify-package.mjs",
|
|
199
200
|
"verify": "pnpm run verify:package && pnpm run verify:consumer",
|
|
200
201
|
"verify:consumer": "tsc -p scripts/fixtures/tsconfig.json --noEmit",
|
|
@@ -42,7 +42,7 @@ import {
|
|
|
42
42
|
} from "node:fs";
|
|
43
43
|
import os from "node:os";
|
|
44
44
|
import path from "node:path";
|
|
45
|
-
import {
|
|
45
|
+
import { fileURLToPath } from "node:url";
|
|
46
46
|
import { zstdDecompressSync } from "node:zlib";
|
|
47
47
|
|
|
48
48
|
/** Storage file holding every Workspace record and its membership. */
|
|
@@ -459,10 +459,29 @@ export function main(argv = process.argv.slice(2)) {
|
|
|
459
459
|
return 0;
|
|
460
460
|
}
|
|
461
461
|
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
)
|
|
462
|
+
/**
|
|
463
|
+
* Was this file started as the process entry point, however the launcher spelled
|
|
464
|
+
* it? Node resolves the entry with `fs.realpath`, so a package-manager bin link
|
|
465
|
+
* (`node_modules/.bin/qa-attach-sessions` pointing at this file) reaches the
|
|
466
|
+
* process as a path that never equals `import.meta.url`. Comparing the paths as
|
|
467
|
+
* spelled left such a run executing the module body without ever calling `main`:
|
|
468
|
+
* no output, no error, exit 0. Resolving both sides makes a link behave like the
|
|
469
|
+
* file it links.
|
|
470
|
+
*/
|
|
471
|
+
function startedAsEntry() {
|
|
472
|
+
const entry = process.argv[1];
|
|
473
|
+
if (entry === undefined) return false;
|
|
474
|
+
try {
|
|
475
|
+
return (
|
|
476
|
+
realpathSync(path.resolve(entry)) ===
|
|
477
|
+
realpathSync(fileURLToPath(import.meta.url))
|
|
478
|
+
);
|
|
479
|
+
} catch {
|
|
480
|
+
return false;
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
if (startedAsEntry()) {
|
|
466
485
|
try {
|
|
467
486
|
process.exitCode = main();
|
|
468
487
|
} catch (error) {
|