@yadsh/dsh-qa-surface 0.4.0 → 0.6.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 +235 -14
- package/compatibility.json +10 -1
- package/cordis.patch.yml +17 -0
- package/lib/account-remotes.js +10 -0
- package/lib/account-remotes.js.map +1 -1
- package/lib/accounts/credentials.js +12 -4
- package/lib/accounts/credentials.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 +38 -1
- package/lib/accounts/store.js.map +1 -1
- package/lib/approvals.js +179 -0
- package/lib/approvals.js.map +1 -0
- package/lib/cli.js +10 -0
- package/lib/cli.js.map +1 -1
- package/lib/client/QaAccountsController.js +29 -0
- package/lib/client/QaAccountsController.js.map +1 -1
- package/lib/client/QaSessionController.js +261 -48
- package/lib/client/QaSessionController.js.map +1 -1
- package/lib/client/QaSurface.js +138 -56
- package/lib/client/QaSurface.js.map +1 -1
- package/lib/client/QaSurfaceGuard.js +96 -0
- package/lib/client/QaSurfaceGuard.js.map +1 -0
- package/lib/client/QaTranscriptAdapter.js +11 -5
- package/lib/client/QaTranscriptAdapter.js.map +1 -1
- package/lib/client/approvals.js +104 -0
- package/lib/client/approvals.js.map +1 -0
- package/lib/client/attestation.js +3 -0
- package/lib/client/attestation.js.map +1 -1
- package/lib/client/components/QaApproval.js +23 -0
- package/lib/client/components/QaApproval.js.map +1 -0
- package/lib/client/components/QaChangelog.js +55 -0
- package/lib/client/components/QaChangelog.js.map +1 -1
- package/lib/client/components/QaComposer.js +1 -1
- package/lib/client/components/QaComposer.js.map +1 -1
- package/lib/client/components/QaHeader.js +2 -8
- package/lib/client/components/QaHeader.js.map +1 -1
- package/lib/client/components/QaMessage.js +20 -7
- package/lib/client/components/QaMessage.js.map +1 -1
- package/lib/client/components/QaModal.js +24 -6
- package/lib/client/components/QaModal.js.map +1 -1
- package/lib/client/components/QaQuestions.js +96 -0
- package/lib/client/components/QaQuestions.js.map +1 -0
- package/lib/client/components/QaSidebar.js +2 -6
- package/lib/client/components/QaSidebar.js.map +1 -1
- package/lib/client/components/QaSourcesPanel.js +6 -5
- package/lib/client/components/QaSourcesPanel.js.map +1 -1
- package/lib/client/components/QaWidthHandle.js +21 -1
- package/lib/client/components/QaWidthHandle.js.map +1 -1
- package/lib/client/components/surface-utils.js +2 -0
- package/lib/client/components/surface-utils.js.map +1 -1
- package/lib/client/index.js +81 -22
- package/lib/client/index.js.map +1 -1
- package/lib/client/panels/PanelHost.js +209 -0
- package/lib/client/panels/PanelHost.js.map +1 -0
- package/lib/client/panels/PanelLauncher.js +39 -0
- package/lib/client/panels/PanelLauncher.js.map +1 -0
- package/lib/client/panels/contract.js +2 -0
- package/lib/client/panels/contract.js.map +1 -0
- package/lib/client/panels/index.js +2 -0
- package/lib/client/panels/index.js.map +1 -0
- package/lib/client/panels/registry.js +171 -0
- package/lib/client/panels/registry.js.map +1 -0
- package/lib/client/project-session-state.js +8 -3
- package/lib/client/project-session-state.js.map +1 -1
- package/lib/client/questions.js +114 -0
- package/lib/client/questions.js.map +1 -0
- package/lib/client/settings/card.js +2 -2
- package/lib/client/settings/card.js.map +1 -1
- package/lib/client/settings/sections/accounts.js +3 -1
- package/lib/client/settings/sections/accounts.js.map +1 -1
- package/lib/client/settings/sections/documents.js +88 -0
- package/lib/client/settings/sections/documents.js.map +1 -0
- package/lib/client/settings/sections/interface.js +2 -0
- package/lib/client/settings/sections/interface.js.map +1 -1
- package/lib/client/settings/sections/sources.js +2 -0
- package/lib/client/settings/sections/sources.js.map +1 -1
- package/lib/client/settings/sections.js +1 -0
- package/lib/client/settings/sections.js.map +1 -1
- package/lib/client/settings-extensions/contract.js +2 -0
- package/lib/client/settings-extensions/contract.js.map +1 -0
- package/lib/client/settings-extensions/index.js +2 -0
- package/lib/client/settings-extensions/index.js.map +1 -0
- package/lib/client/settings-extensions/registry.js +63 -0
- package/lib/client/settings-extensions/registry.js.map +1 -0
- package/lib/client/settlement.js +51 -5
- package/lib/client/settlement.js.map +1 -1
- package/lib/client/source-preview.js +24 -0
- package/lib/client/source-preview.js.map +1 -0
- package/lib/client/styles.js +199 -32
- package/lib/client/styles.js.map +1 -1
- package/lib/client/subagent-codenames.js +109 -0
- package/lib/client/subagent-codenames.js.map +1 -0
- package/lib/client/types.js +3 -0
- package/lib/client/types.js.map +1 -1
- package/lib/client/user-settings/GeneralSettingsPage.js +13 -0
- package/lib/client/user-settings/GeneralSettingsPage.js.map +1 -0
- package/lib/client/user-settings/ProfileSettingsPage.js +59 -0
- package/lib/client/user-settings/ProfileSettingsPage.js.map +1 -0
- package/lib/client/user-settings/SkillCatalog.js +23 -0
- package/lib/client/user-settings/SkillCatalog.js.map +1 -0
- package/lib/client/user-settings/SkillEditor.js +89 -0
- package/lib/client/user-settings/SkillEditor.js.map +1 -0
- package/lib/client/user-settings/SkillToolPicker.js +58 -0
- package/lib/client/user-settings/SkillToolPicker.js.map +1 -0
- package/lib/client/user-settings/SkillsSettingsPage.js +171 -0
- package/lib/client/user-settings/SkillsSettingsPage.js.map +1 -0
- package/lib/client/user-settings/StartersSettingsPage.js +78 -0
- package/lib/client/user-settings/StartersSettingsPage.js.map +1 -0
- package/lib/client/user-settings/UserSettingsDialog.js +50 -0
- package/lib/client/user-settings/UserSettingsDialog.js.map +1 -0
- package/lib/client/user-settings/copy.js +84 -0
- package/lib/client/user-settings/copy.js.map +1 -0
- package/lib/client/user-settings/draft.js +127 -0
- package/lib/client/user-settings/draft.js.map +1 -0
- package/lib/client/user-settings/fields.js +24 -0
- package/lib/client/user-settings/fields.js.map +1 -0
- package/lib/client.js +6629 -1579
- package/lib/client.js.map +1 -1
- package/lib/config-resolvers/accounts.js +30 -0
- package/lib/config-resolvers/accounts.js.map +1 -1
- package/lib/config-resolvers/basics.js +4 -2
- package/lib/config-resolvers/basics.js.map +1 -1
- package/lib/config-resolvers/defaults.js +27 -0
- package/lib/config-resolvers/defaults.js.map +1 -1
- package/lib/config-resolvers/lockdown.js +11 -0
- package/lib/config-resolvers/lockdown.js.map +1 -1
- package/lib/config-resolvers/session.js +2 -2
- package/lib/config-resolvers/session.js.map +1 -1
- package/lib/config-resolvers/shared.js +9 -0
- package/lib/config-resolvers/shared.js.map +1 -1
- package/lib/config-resolvers/sources.js +2 -0
- package/lib/config-resolvers/sources.js.map +1 -1
- package/lib/config-resolvers/tools.js +37 -0
- package/lib/config-resolvers/tools.js.map +1 -0
- package/lib/config-resolvers/ui.js +2 -0
- package/lib/config-resolvers/ui.js.map +1 -1
- package/lib/config.js +299 -2
- package/lib/config.js.map +1 -1
- package/lib/documents/artifacts/ids.js +43 -0
- package/lib/documents/artifacts/ids.js.map +1 -0
- package/lib/documents/artifacts/manifest.js +66 -0
- package/lib/documents/artifacts/manifest.js.map +1 -0
- package/lib/documents/artifacts/store.js +169 -0
- package/lib/documents/artifacts/store.js.map +1 -0
- package/lib/documents/capabilities.js +93 -0
- package/lib/documents/capabilities.js.map +1 -0
- package/lib/documents/config.js +302 -0
- package/lib/documents/config.js.map +1 -0
- package/lib/documents/defaults.js +78 -0
- package/lib/documents/defaults.js.map +1 -0
- package/lib/documents/errors.js +101 -0
- package/lib/documents/errors.js.map +1 -0
- package/lib/documents/index.js +80 -0
- package/lib/documents/index.js.map +1 -0
- package/lib/documents/inspect/facts.js +161 -0
- package/lib/documents/inspect/facts.js.map +1 -0
- package/lib/documents/inspect/zip.js +108 -0
- package/lib/documents/inspect/zip.js.map +1 -0
- package/lib/documents/markdown/directives.js +135 -0
- package/lib/documents/markdown/directives.js.map +1 -0
- package/lib/documents/markdown/frontmatter.js +35 -0
- package/lib/documents/markdown/frontmatter.js.map +1 -0
- package/lib/documents/markdown/normalize.js +113 -0
- package/lib/documents/markdown/normalize.js.map +1 -0
- package/lib/documents/orchestrator/assets.js +243 -0
- package/lib/documents/orchestrator/assets.js.map +1 -0
- package/lib/documents/orchestrator/convert-document.js +186 -0
- package/lib/documents/orchestrator/convert-document.js.map +1 -0
- package/lib/documents/orchestrator/create-document.js +292 -0
- package/lib/documents/orchestrator/create-document.js.map +1 -0
- package/lib/documents/orchestrator/extract-document.js +162 -0
- package/lib/documents/orchestrator/extract-document.js.map +1 -0
- package/lib/documents/orchestrator/inspect-document.js +89 -0
- package/lib/documents/orchestrator/inspect-document.js.map +1 -0
- package/lib/documents/orchestrator/runtime-deps.js +59 -0
- package/lib/documents/orchestrator/runtime-deps.js.map +1 -0
- package/lib/documents/orchestrator/scope.js +132 -0
- package/lib/documents/orchestrator/scope.js.map +1 -0
- package/lib/documents/providers/docling.js +247 -0
- package/lib/documents/providers/docling.js.map +1 -0
- package/lib/documents/providers/libreoffice.js +130 -0
- package/lib/documents/providers/libreoffice.js.map +1 -0
- package/lib/documents/providers/markitdown.js +89 -0
- package/lib/documents/providers/markitdown.js.map +1 -0
- package/lib/documents/providers/pandoc.js +161 -0
- package/lib/documents/providers/pandoc.js.map +1 -0
- package/lib/documents/providers/process.js +164 -0
- package/lib/documents/providers/process.js.map +1 -0
- package/lib/documents/providers/registry.js +152 -0
- package/lib/documents/providers/registry.js.map +1 -0
- package/lib/documents/providers/shared.js +75 -0
- package/lib/documents/providers/shared.js.map +1 -0
- package/lib/documents/runtime.js +114 -0
- package/lib/documents/runtime.js.map +1 -0
- package/lib/documents/security/file-types.js +188 -0
- package/lib/documents/security/file-types.js.map +1 -0
- package/lib/documents/security/limits.js +78 -0
- package/lib/documents/security/limits.js.map +1 -0
- package/lib/documents/security/mime.js +43 -0
- package/lib/documents/security/mime.js.map +1 -0
- package/lib/documents/security/paths.js +133 -0
- package/lib/documents/security/paths.js.map +1 -0
- package/lib/documents/templates/registry.js +147 -0
- package/lib/documents/templates/registry.js.map +1 -0
- package/lib/documents/templates/resolver.js +59 -0
- package/lib/documents/templates/resolver.js.map +1 -0
- package/lib/documents/tools/convert.js +125 -0
- package/lib/documents/tools/convert.js.map +1 -0
- package/lib/documents/tools/create.js +187 -0
- package/lib/documents/tools/create.js.map +1 -0
- package/lib/documents/tools/index.js +41 -0
- package/lib/documents/tools/index.js.map +1 -0
- package/lib/documents/tools/inspect.js +135 -0
- package/lib/documents/tools/inspect.js.map +1 -0
- package/lib/documents/tools/shared.js +88 -0
- package/lib/documents/tools/shared.js.map +1 -0
- package/lib/documents/tools/to-markdown.js +125 -0
- package/lib/documents/tools/to-markdown.js.map +1 -0
- package/lib/documents/types.js +12 -0
- package/lib/documents/types.js.map +1 -0
- package/lib/index.js +299 -24
- package/lib/index.js.map +1 -1
- package/lib/integration-principals.js +22 -0
- package/lib/integration-principals.js.map +1 -0
- package/lib/lockdown-policy.js +15 -3
- package/lib/lockdown-policy.js.map +1 -1
- package/lib/personal-skills/errors.js +9 -0
- package/lib/personal-skills/errors.js.map +1 -0
- package/lib/personal-skills/host.js +80 -0
- package/lib/personal-skills/host.js.map +1 -0
- package/lib/personal-skills/index.js +10 -0
- package/lib/personal-skills/index.js.map +1 -0
- package/lib/personal-skills/paths.js +127 -0
- package/lib/personal-skills/paths.js.map +1 -0
- package/lib/personal-skills/provider.js +109 -0
- package/lib/personal-skills/provider.js.map +1 -0
- package/lib/personal-skills/remotes.js +40 -0
- package/lib/personal-skills/remotes.js.map +1 -0
- package/lib/personal-skills/service.js +686 -0
- package/lib/personal-skills/service.js.map +1 -0
- package/lib/personal-skills/skill-file.js +278 -0
- package/lib/personal-skills/skill-file.js.map +1 -0
- package/lib/personal-skills/skill-format.js +202 -0
- package/lib/personal-skills/skill-format.js.map +1 -0
- package/lib/personal-skills/watcher.js +96 -0
- package/lib/personal-skills/watcher.js.map +1 -0
- package/lib/profile.js +6 -4
- package/lib/profile.js.map +1 -1
- package/lib/prompt-notes.js +19 -0
- package/lib/prompt-notes.js.map +1 -1
- package/lib/provenance/file-preview.js +68 -21
- package/lib/provenance/file-preview.js.map +1 -1
- package/lib/provenance/host-store.js +69 -20
- package/lib/provenance/host-store.js.map +1 -1
- package/lib/provenance/index.js +1 -0
- package/lib/provenance/index.js.map +1 -1
- package/lib/provenance/normalize.js +3 -1
- package/lib/provenance/normalize.js.map +1 -1
- package/lib/provenance/reported.js +37 -12
- package/lib/provenance/reported.js.map +1 -1
- package/lib/provenance/snapshot-store.js +154 -0
- package/lib/provenance/snapshot-store.js.map +1 -0
- package/lib/qa-tools/activation-detector.js +53 -0
- package/lib/qa-tools/activation-detector.js.map +1 -0
- package/lib/qa-tools/activation-manager.js +111 -0
- package/lib/qa-tools/activation-manager.js.map +1 -0
- package/lib/qa-tools/catalog.js +108 -0
- package/lib/qa-tools/catalog.js.map +1 -0
- package/lib/qa-tools/durable-marker.js +115 -0
- package/lib/qa-tools/durable-marker.js.map +1 -0
- package/lib/qa-tools/index.js +83 -0
- package/lib/qa-tools/index.js.map +1 -0
- package/lib/qa-tools/lifecycle.js +64 -0
- package/lib/qa-tools/lifecycle.js.map +1 -0
- package/lib/qa-tools/types.js +2 -0
- package/lib/qa-tools/types.js.map +1 -0
- package/lib/questions.js +185 -0
- package/lib/questions.js.map +1 -0
- package/lib/resolve-config.js +5 -0
- package/lib/resolve-config.js.map +1 -1
- package/lib/secure-session.js +104 -20
- package/lib/secure-session.js.map +1 -1
- package/lib/session-ownership.js +55 -0
- package/lib/session-ownership.js.map +1 -0
- package/lib/starters.js +117 -0
- package/lib/starters.js.map +1 -0
- package/lib/typert.host.js +1162 -77
- package/lib/typert.remote-client.d.ts +27 -1
- package/lib/typert.remote-client.js +879 -14
- package/lib/types/account-remotes.d.ts +3 -1
- package/lib/types/accounts/credentials.d.ts +6 -0
- package/lib/types/accounts/errors.d.ts +1 -1
- package/lib/types/accounts/file.d.ts +10 -0
- package/lib/types/accounts/store.d.ts +15 -1
- package/lib/types/approvals.d.ts +65 -0
- package/lib/types/client/QaAccountsController.d.ts +7 -1
- package/lib/types/client/QaSessionController.d.ts +50 -1
- package/lib/types/client/QaSurface.d.ts +21 -4
- package/lib/types/client/QaSurfaceGuard.d.ts +27 -0
- package/lib/types/client/QaTranscriptAdapter.d.ts +7 -0
- package/lib/types/client/approvals.d.ts +39 -0
- package/lib/types/client/components/QaApproval.d.ts +13 -0
- package/lib/types/client/components/QaComposer.d.ts +3 -1
- package/lib/types/client/components/QaHeader.d.ts +3 -1
- package/lib/types/client/components/QaModal.d.ts +5 -4
- package/lib/types/client/components/QaQuestions.d.ts +13 -0
- package/lib/types/client/components/QaSidebar.d.ts +8 -11
- package/lib/types/client/components/QaWidthHandle.d.ts +13 -0
- package/lib/types/client/index.d.ts +1 -0
- package/lib/types/client/panels/PanelHost.d.ts +18 -0
- package/lib/types/client/panels/PanelLauncher.d.ts +5 -0
- package/lib/types/client/panels/contract.d.ts +83 -0
- package/lib/types/client/panels/index.d.ts +3 -0
- package/lib/types/client/panels/registry.d.ts +40 -0
- package/lib/types/client/project-session-state.d.ts +13 -1
- package/lib/types/client/questions.d.ts +45 -0
- package/lib/types/client/settings/sections/documents.d.ts +13 -0
- package/lib/types/client/settings/sections.d.ts +1 -0
- package/lib/types/client/settings-extensions/contract.d.ts +32 -0
- package/lib/types/client/settings-extensions/index.d.ts +3 -0
- package/lib/types/client/settings-extensions/registry.d.ts +15 -0
- package/lib/types/client/settlement.d.ts +41 -5
- package/lib/types/client/source-preview.d.ts +8 -0
- package/lib/types/client/styles.d.ts +2 -0
- package/lib/types/client/subagent-codenames.d.ts +18 -0
- package/lib/types/client/types.d.ts +82 -3
- package/lib/types/client/user-settings/GeneralSettingsPage.d.ts +14 -0
- package/lib/types/client/user-settings/ProfileSettingsPage.d.ts +18 -0
- package/lib/types/client/user-settings/SkillCatalog.d.ts +16 -0
- package/lib/types/client/user-settings/SkillEditor.d.ts +42 -0
- package/lib/types/client/user-settings/SkillToolPicker.d.ts +17 -0
- package/lib/types/client/user-settings/SkillsSettingsPage.d.ts +15 -0
- package/lib/types/client/user-settings/StartersSettingsPage.d.ts +14 -0
- package/lib/types/client/user-settings/UserSettingsDialog.d.ts +43 -0
- package/lib/types/client/user-settings/copy.d.ts +25 -0
- package/lib/types/client/user-settings/draft.d.ts +51 -0
- package/lib/types/client/user-settings/fields.d.ts +43 -0
- package/lib/types/config-resolvers/shared.d.ts +7 -0
- package/lib/types/config-resolvers/tools.d.ts +6 -0
- package/lib/types/documents/artifacts/ids.d.ts +14 -0
- package/lib/types/documents/artifacts/manifest.d.ts +32 -0
- package/lib/types/documents/artifacts/store.d.ts +67 -0
- package/lib/types/documents/capabilities.d.ts +32 -0
- package/lib/types/documents/config.d.ts +27 -0
- package/lib/types/documents/defaults.d.ts +161 -0
- package/lib/types/documents/errors.d.ts +42 -0
- package/lib/types/documents/index.d.ts +63 -0
- package/lib/types/documents/inspect/facts.d.ts +43 -0
- package/lib/types/documents/inspect/zip.d.ts +28 -0
- package/lib/types/documents/markdown/directives.d.ts +39 -0
- package/lib/types/documents/markdown/frontmatter.d.ts +15 -0
- package/lib/types/documents/markdown/normalize.d.ts +30 -0
- package/lib/types/documents/orchestrator/assets.d.ts +55 -0
- package/lib/types/documents/orchestrator/convert-document.d.ts +25 -0
- package/lib/types/documents/orchestrator/create-document.d.ts +18 -0
- package/lib/types/documents/orchestrator/extract-document.d.ts +24 -0
- package/lib/types/documents/orchestrator/inspect-document.d.ts +12 -0
- package/lib/types/documents/orchestrator/runtime-deps.d.ts +43 -0
- package/lib/types/documents/orchestrator/scope.d.ts +52 -0
- package/lib/types/documents/providers/docling.d.ts +54 -0
- package/lib/types/documents/providers/libreoffice.d.ts +40 -0
- package/lib/types/documents/providers/markitdown.d.ts +28 -0
- package/lib/types/documents/providers/pandoc.d.ts +42 -0
- package/lib/types/documents/providers/process.d.ts +54 -0
- package/lib/types/documents/providers/registry.d.ts +68 -0
- package/lib/types/documents/providers/shared.d.ts +27 -0
- package/lib/types/documents/runtime.d.ts +59 -0
- package/lib/types/documents/security/file-types.d.ts +39 -0
- package/lib/types/documents/security/limits.d.ts +24 -0
- package/lib/types/documents/security/mime.d.ts +13 -0
- package/lib/types/documents/security/paths.d.ts +38 -0
- package/lib/types/documents/templates/registry.d.ts +50 -0
- package/lib/types/documents/templates/resolver.d.ts +30 -0
- package/lib/types/documents/tools/convert.d.ts +9 -0
- package/lib/types/documents/tools/create.d.ts +14 -0
- package/lib/types/documents/tools/index.d.ts +33 -0
- package/lib/types/documents/tools/inspect.d.ts +9 -0
- package/lib/types/documents/tools/shared.d.ts +77 -0
- package/lib/types/documents/tools/to-markdown.d.ts +12 -0
- package/lib/types/documents/types.d.ts +294 -0
- package/lib/types/index.d.ts +103 -5
- package/lib/types/integration-principals.d.ts +9 -0
- package/lib/types/lockdown-policy.d.ts +12 -2
- package/lib/types/personal-skills/errors.d.ts +11 -0
- package/lib/types/personal-skills/host.d.ts +42 -0
- package/lib/types/personal-skills/index.d.ts +10 -0
- package/lib/types/personal-skills/paths.d.ts +39 -0
- package/lib/types/personal-skills/provider.d.ts +33 -0
- package/lib/types/personal-skills/remotes.d.ts +35 -0
- package/lib/types/personal-skills/service.d.ts +131 -0
- package/lib/types/personal-skills/skill-file.d.ts +64 -0
- package/lib/types/personal-skills/skill-format.d.ts +100 -0
- package/lib/types/personal-skills/watcher.d.ts +39 -0
- package/lib/types/profile.d.ts +13 -0
- package/lib/types/prompt-notes.d.ts +9 -0
- package/lib/types/provenance/file-preview.d.ts +47 -4
- package/lib/types/provenance/host-store.d.ts +7 -1
- package/lib/types/provenance/index.d.ts +1 -0
- package/lib/types/provenance/reported.d.ts +9 -1
- package/lib/types/provenance/snapshot-store.d.ts +23 -0
- package/lib/types/qa-tools/activation-detector.d.ts +29 -0
- package/lib/types/qa-tools/activation-manager.d.ts +47 -0
- package/lib/types/qa-tools/catalog.d.ts +40 -0
- package/lib/types/qa-tools/durable-marker.d.ts +16 -0
- package/lib/types/qa-tools/index.d.ts +40 -0
- package/lib/types/qa-tools/lifecycle.d.ts +44 -0
- package/lib/types/qa-tools/types.d.ts +45 -0
- package/lib/types/questions.d.ts +83 -0
- package/lib/types/secure-session.d.ts +45 -4
- package/lib/types/session-ownership.d.ts +30 -0
- package/lib/types/starters.d.ts +45 -0
- package/lib/types/types.d.ts +282 -7
- package/lib/types/user-workspace.d.ts +5 -1
- package/lib/user-workspace.js +21 -6
- package/lib/user-workspace.js.map +1 -1
- package/package.json +22 -9
- package/scripts/repair-session-events.mjs +260 -0
- package/lib/client/components/QaProfile.js +0 -64
- package/lib/client/components/QaProfile.js.map +0 -1
- package/lib/types/client/components/QaProfile.d.ts +0 -25
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The durable activation marker, read back from the session log.
|
|
3
|
+
*
|
|
4
|
+
* The marker is not an event of its own. `qa-surface` deliberately appends no
|
|
5
|
+
* custom session type: a reader that does not mount this plugin refuses a log
|
|
6
|
+
* containing an unknown non-`ignorable` type, which would make every activated
|
|
7
|
+
* session unreadable in a plain DSH deployment. Instead the activation is
|
|
8
|
+
* derived from the `skill` tool call the model already made — a standard
|
|
9
|
+
* `tool/call` paired with a successful `tool/result`, both of which every
|
|
10
|
+
* harness build understands and neither of which this plugin writes.
|
|
11
|
+
*
|
|
12
|
+
* Consequence: restoration trusts the same fact the live detector does, and a
|
|
13
|
+
* deployment that drops the `skill` tool cannot restore. That is the correct
|
|
14
|
+
* trade — the tool is an operator's deliberate grant, and the log stays
|
|
15
|
+
* portable.
|
|
16
|
+
*/
|
|
17
|
+
/** Rendered `skill` result prefix emitted by `@deepseek-ai/dsh-tool-skill`. */
|
|
18
|
+
const SKILL_CONTENT = /<skill_content name="([^"]*)">/u;
|
|
19
|
+
/** The skill-loader tool whose successful result is the activation marker. */
|
|
20
|
+
const SKILL_TOOL = "skill";
|
|
21
|
+
/** `tool/call` data: the tool name and the call id its result will carry. */
|
|
22
|
+
function toolCallData(data) {
|
|
23
|
+
if (typeof data !== "object" || data === null)
|
|
24
|
+
return undefined;
|
|
25
|
+
const record = data;
|
|
26
|
+
return record.name === SKILL_TOOL && typeof record.callId === "string"
|
|
27
|
+
? { callId: record.callId }
|
|
28
|
+
: undefined;
|
|
29
|
+
}
|
|
30
|
+
/** Every text fragment nested under a model content value, at any depth. */
|
|
31
|
+
function collectTexts(value, into) {
|
|
32
|
+
if (typeof value === "string") {
|
|
33
|
+
into.push(value);
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
if (Array.isArray(value)) {
|
|
37
|
+
for (const item of value)
|
|
38
|
+
collectTexts(item, into);
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
if (typeof value !== "object" || value === null)
|
|
42
|
+
return;
|
|
43
|
+
const record = value;
|
|
44
|
+
if (typeof record.text === "string")
|
|
45
|
+
into.push(record.text);
|
|
46
|
+
if (Array.isArray(record.content))
|
|
47
|
+
collectTexts(record.content, into);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Read one `tool/result` event: the call it answers, the text it carried, and
|
|
51
|
+
* whether it failed. Text is collected recursively because a tool result wraps
|
|
52
|
+
* its blocks in a `tool_result` block whose own `content` holds the text the
|
|
53
|
+
* model saw.
|
|
54
|
+
*/
|
|
55
|
+
function resultBlocks(data) {
|
|
56
|
+
if (typeof data !== "object" || data === null)
|
|
57
|
+
return undefined;
|
|
58
|
+
const message = data.message;
|
|
59
|
+
if (typeof message !== "object" || message === null)
|
|
60
|
+
return undefined;
|
|
61
|
+
const content = message.content;
|
|
62
|
+
if (!Array.isArray(content))
|
|
63
|
+
return undefined;
|
|
64
|
+
const callIds = [];
|
|
65
|
+
const texts = [];
|
|
66
|
+
let isError = false;
|
|
67
|
+
for (const block of content) {
|
|
68
|
+
if (typeof block !== "object" || block === null)
|
|
69
|
+
continue;
|
|
70
|
+
const record = block;
|
|
71
|
+
if (typeof record.callId === "string")
|
|
72
|
+
callIds.push(record.callId);
|
|
73
|
+
if (record.isError === true)
|
|
74
|
+
isError = true;
|
|
75
|
+
collectTexts(record.content, texts);
|
|
76
|
+
}
|
|
77
|
+
return { callIds, texts, isError };
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Whether one session's log shows the configured skill was successfully loaded.
|
|
81
|
+
*
|
|
82
|
+
* Pairs each `tool/call` for the `skill` tool with its `tool/result`, then reads
|
|
83
|
+
* the loaded skill's name from the canonical rendered content. The rendered
|
|
84
|
+
* block is the only record of the returned skill identity that survives to the
|
|
85
|
+
* log — `tool/result` stores the model-facing message, not the tool's canonical
|
|
86
|
+
* value — and the pair closes only on a non-error result, so a refused or
|
|
87
|
+
* failed load never counts.
|
|
88
|
+
* @param session - the live session to inspect.
|
|
89
|
+
* @param skillName - the configured activation skill name.
|
|
90
|
+
* @returns whether that skill was loaded and its result succeeded.
|
|
91
|
+
*/
|
|
92
|
+
export function sessionLoadedSkill(session, skillName) {
|
|
93
|
+
const skillCalls = new Set();
|
|
94
|
+
for (const event of session.snapshotEvents()) {
|
|
95
|
+
if (event.type === "tool/call") {
|
|
96
|
+
const call = toolCallData(event.data);
|
|
97
|
+
if (call !== undefined)
|
|
98
|
+
skillCalls.add(call.callId);
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
if (event.type !== "tool/result")
|
|
102
|
+
continue;
|
|
103
|
+
const blocks = resultBlocks(event.data);
|
|
104
|
+
if (blocks === undefined || blocks.isError)
|
|
105
|
+
continue;
|
|
106
|
+
if (!blocks.callIds.some((callId) => skillCalls.has(callId)))
|
|
107
|
+
continue;
|
|
108
|
+
for (const text of blocks.texts) {
|
|
109
|
+
if (SKILL_CONTENT.exec(text)?.[1] === skillName)
|
|
110
|
+
return true;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return false;
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=durable-marker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"durable-marker.js","sourceRoot":"","sources":["../../src/qa-tools/durable-marker.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;GAeG;AAEH,+EAA+E;AAC/E,MAAM,aAAa,GAAG,iCAAiC,CAAC;AAExD,8EAA8E;AAC9E,MAAM,UAAU,GAAG,OAAO,CAAC;AAE3B,6EAA6E;AAC7E,SAAS,YAAY,CAAC,IAAa;IACjC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IAChE,MAAM,MAAM,GAAG,IAA+B,CAAC;IAC/C,OAAO,MAAM,CAAC,IAAI,KAAK,UAAU,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ;QACpE,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE;QAC3B,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC;AASD,4EAA4E;AAC5E,SAAS,YAAY,CAAC,KAAc,EAAE,IAAc;IAClD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjB,OAAO;IACT,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,KAAK,MAAM,IAAI,IAAI,KAAK;YAAE,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACnD,OAAO;IACT,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO;IACxD,MAAM,MAAM,GAAG,KAAgC,CAAC;IAChD,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ;QAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC5D,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC;QAAE,YAAY,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AACxE,CAAC;AAED;;;;;GAKG;AACH,SAAS,YAAY,CAAC,IAAa;IACjC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IAChE,MAAM,OAAO,GAAI,IAAgC,CAAC,OAAO,CAAC;IAC1D,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IACtE,MAAM,OAAO,GAAI,OAAmC,CAAC,OAAO,CAAC;IAC7D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO,SAAS,CAAC;IAC9C,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;YAAE,SAAS;QAC1D,MAAM,MAAM,GAAG,KAAgC,CAAC;QAChD,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ;YAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACnE,IAAI,MAAM,CAAC,OAAO,KAAK,IAAI;YAAE,OAAO,GAAG,IAAI,CAAC;QAC5C,YAAY,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AACrC,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,kBAAkB,CAChC,OAAwC,EACxC,SAAiB;IAEjB,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IACrC,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC;QAC7C,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAC/B,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACtC,IAAI,IAAI,KAAK,SAAS;gBAAE,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACpD,SAAS;QACX,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa;YAAE,SAAS;QAC3C,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,OAAO;YAAE,SAAS;QACrD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAAE,SAAS;QACvE,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YAChC,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,SAAS;gBAAE,OAAO,IAAI,CAAC;QAC/D,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { QaToolActivationManager } from "./activation-manager.js";
|
|
2
|
+
import { QaToolActivationDetector } from "./activation-detector.js";
|
|
3
|
+
import { createQaToolCatalog, QA_TOOL_CATALOG_VERSION } from "./catalog.js";
|
|
4
|
+
import { sessionLoadedSkill } from "./durable-marker.js";
|
|
5
|
+
import { QaToolActivationLifecycle } from "./lifecycle.js";
|
|
6
|
+
/**
|
|
7
|
+
* The QA tool subsystem: one catalog, one per-agent activation manager, and the
|
|
8
|
+
* two edges that drive it — the skill-result detector and the agent lifecycle.
|
|
9
|
+
*
|
|
10
|
+
* `dsh-qa-surface` owns the tools but never registers them at boot. Nothing in
|
|
11
|
+
* the catalog reaches the model until an agent it belongs to loads the
|
|
12
|
+
* activation skill, so the initial request of a session carries only the
|
|
13
|
+
* composition's own schemas.
|
|
14
|
+
*/
|
|
15
|
+
export class QaTools {
|
|
16
|
+
ctx;
|
|
17
|
+
options;
|
|
18
|
+
manager;
|
|
19
|
+
detector;
|
|
20
|
+
lifecycle;
|
|
21
|
+
catalogTools;
|
|
22
|
+
constructor(ctx, options) {
|
|
23
|
+
this.ctx = ctx;
|
|
24
|
+
this.options = options;
|
|
25
|
+
// The self-check tool answers about whichever agent calls it, so the
|
|
26
|
+
// catalog is built before any agent exists and resolves `exec.agent` at
|
|
27
|
+
// execution time.
|
|
28
|
+
const catalog = createQaToolCatalog({
|
|
29
|
+
catalogVersion: QA_TOOL_CATALOG_VERSION,
|
|
30
|
+
activationMode: options.activationMode,
|
|
31
|
+
catalogTools: () => this.catalogTools,
|
|
32
|
+
activeTools: (agent) => this.manager.activeToolNames(agent),
|
|
33
|
+
skillLoaded: (agent) => sessionLoadedSkill(agent.session, options.activationSkill),
|
|
34
|
+
});
|
|
35
|
+
this.catalogTools = catalog.map((entry) => entry.definition.name);
|
|
36
|
+
this.manager = new QaToolActivationManager({
|
|
37
|
+
catalog,
|
|
38
|
+
catalogVersion: QA_TOOL_CATALOG_VERSION,
|
|
39
|
+
logger: options.logger,
|
|
40
|
+
});
|
|
41
|
+
this.detector = new QaToolActivationDetector(ctx, {
|
|
42
|
+
manager: this.manager,
|
|
43
|
+
logger: options.logger,
|
|
44
|
+
activationSkill: options.activationSkill,
|
|
45
|
+
isManagedAgent: (agent) => this.isManagedAgent(agent),
|
|
46
|
+
});
|
|
47
|
+
this.lifecycle = new QaToolActivationLifecycle(ctx, {
|
|
48
|
+
manager: this.manager,
|
|
49
|
+
logger: options.logger,
|
|
50
|
+
isManagedAgent: (agent) => this.isManagedAgent(agent),
|
|
51
|
+
dynamicActivation: options.dynamicActivation,
|
|
52
|
+
activationSkill: options.activationSkill,
|
|
53
|
+
});
|
|
54
|
+
if (options.activationPresets.length === 0 &&
|
|
55
|
+
this.catalogTools.length > 0) {
|
|
56
|
+
options.logger.warn("qa-tools.unscoped", {
|
|
57
|
+
hint: "tools.activationPresets is empty: any composed agent can unlock the QA tools",
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/** Names currently registered on one agent; the admission guard reads this per call. */
|
|
62
|
+
activeToolNames(agent) {
|
|
63
|
+
return this.manager.activeToolNames(agent);
|
|
64
|
+
}
|
|
65
|
+
dispose() {
|
|
66
|
+
this.detector.disposeListeners();
|
|
67
|
+
this.lifecycle.dispose();
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* The preset gate. An empty `activationPresets` leaves it open, which is only
|
|
71
|
+
* coherent when this plugin serves a single agent composition; naming the QA
|
|
72
|
+
* preset keeps an unrelated DSH agent from unlocking the same catalog by
|
|
73
|
+
* loading a skill of the same name.
|
|
74
|
+
*/
|
|
75
|
+
isManagedAgent(agent) {
|
|
76
|
+
const presets = this.options.activationPresets;
|
|
77
|
+
if (presets.length === 0)
|
|
78
|
+
return true;
|
|
79
|
+
const preset = agent.session?.header?.agentPreset;
|
|
80
|
+
return preset !== undefined && presets.includes(preset);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/qa-tools/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { sessionLoadedSkill } from "./durable-marker.js";
|
|
2
|
+
/**
|
|
3
|
+
* Owns the arrival and departure edges of one agent's QA tool surface.
|
|
4
|
+
*
|
|
5
|
+
* Arrival: in dynamic mode a resumed session is recognized by the durable
|
|
6
|
+
* marker in its own log and gets its current catalog back before the first
|
|
7
|
+
* model step, while a fresh session waits for the detector. In immediate mode
|
|
8
|
+
* every managed agent is served at creation.
|
|
9
|
+
*
|
|
10
|
+
* Departure: the exact registrations this plugin made are unwound when the
|
|
11
|
+
* agent is disposed, so an agent that leaves never leaves a scoped tool behind.
|
|
12
|
+
*/
|
|
13
|
+
export class QaToolActivationLifecycle {
|
|
14
|
+
ctx;
|
|
15
|
+
options;
|
|
16
|
+
disposers = [];
|
|
17
|
+
constructor(ctx, options) {
|
|
18
|
+
this.ctx = ctx;
|
|
19
|
+
this.options = options;
|
|
20
|
+
this.disposers.push(ctx.on("agent/created", ({ agent }) => this.onAgentCreated(agent), {
|
|
21
|
+
global: true,
|
|
22
|
+
}), ctx.on("agent/disposed", ({ agent }) => this.onAgentDisposed(agent), {
|
|
23
|
+
global: true,
|
|
24
|
+
}));
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Restore a resumed activation, or attach immediately in the compatibility
|
|
28
|
+
* mode. A fresh managed session ends this handler inactive by design: the
|
|
29
|
+
* tools arrive when the model loads the activation skill.
|
|
30
|
+
*/
|
|
31
|
+
onAgentCreated(agent) {
|
|
32
|
+
if (!this.options.isManagedAgent(agent))
|
|
33
|
+
return;
|
|
34
|
+
if (!this.options.dynamicActivation) {
|
|
35
|
+
this.attach(agent, "immediate");
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
if (!sessionLoadedSkill(agent.session, this.options.activationSkill))
|
|
39
|
+
return;
|
|
40
|
+
this.options.logger.info("qa-tools.restore-requested", {
|
|
41
|
+
agentId: String(agent.id),
|
|
42
|
+
sessionId: String(agent.session.id),
|
|
43
|
+
skill: this.options.activationSkill,
|
|
44
|
+
});
|
|
45
|
+
this.attach(agent, "restore");
|
|
46
|
+
}
|
|
47
|
+
attach(agent, origin) {
|
|
48
|
+
const result = this.options.manager.activate(agent, origin);
|
|
49
|
+
if (result.status === "activated" && origin === "restore") {
|
|
50
|
+
this.options.logger.info("qa-tools.restored", {
|
|
51
|
+
agentId: String(agent.id),
|
|
52
|
+
tools: result.count,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
onAgentDisposed(agent) {
|
|
57
|
+
this.options.manager.disposeAgent(agent);
|
|
58
|
+
}
|
|
59
|
+
dispose() {
|
|
60
|
+
for (const dispose of this.disposers.splice(0).reverse())
|
|
61
|
+
dispose();
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=lifecycle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../src/qa-tools/lifecycle.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAgBzD;;;;;;;;;;GAUG;AACH,MAAM,OAAO,yBAAyB;IAIjB,GAAG;IACH,OAAO;IAJT,SAAS,GAAmB,EAAE,CAAC;IAEhD,YACmB,GAAY,EACZ,OAAyC;mBADzC,GAAG;uBACH,OAAO;QAExB,IAAI,CAAC,SAAS,CAAC,IAAI,CACjB,GAAG,CAAC,EAAE,CAAC,eAAe,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE;YACjE,MAAM,EAAE,IAAI;SACb,CAAC,EACF,GAAG,CAAC,EAAE,CAAC,gBAAgB,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE;YACnE,MAAM,EAAE,IAAI;SACb,CAAC,CACH,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACK,cAAc,CAAC,KAAY;QACjC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC;YAAE,OAAO;QAChD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC;YACpC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;YAChC,OAAO;QACT,CAAC;QACD,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC;YAClE,OAAO;QACT,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,4BAA4B,EAAE;YACrD,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YACnC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,eAAe;SACpC,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IAChC,CAAC;IAEO,MAAM,CAAC,KAAY,EAAE,MAA+B;QAC1D,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC5D,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YAC1D,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,mBAAmB,EAAE;gBAC5C,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;gBACzB,KAAK,EAAE,MAAM,CAAC,KAAK;aACpB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAEO,eAAe,CAAC,KAAY;QAClC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO;QACL,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE;YAAE,OAAO,EAAE,CAAC;IACtE,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/qa-tools/types.ts"],"names":[],"mappings":""}
|
package/lib/questions.js
ADDED
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
/** What the model reads when the deployment does not answer questions. */
|
|
3
|
+
export const QA_QUESTIONS_UNSUPPORTED = "questions are not answered in this assistant view; ask the user in plain text instead";
|
|
4
|
+
const CANCELLED_MESSAGE = "the user closed the question without answering; ask in plain text instead";
|
|
5
|
+
/**
|
|
6
|
+
* User questions in the QA view.
|
|
7
|
+
*
|
|
8
|
+
* `ask_user_question` reaches the browser through the harness answerer
|
|
9
|
+
* waterfall, and the stock DSH web bundle mounts its own answerer in every
|
|
10
|
+
* page. Behind the QA overlay that answerer is unreachable, so a question asked
|
|
11
|
+
* of a QA chat would sit in front of nobody. This gate claims the request for
|
|
12
|
+
* attested chats before the generic browser bridge sees it:
|
|
13
|
+
*
|
|
14
|
+
* - `interaction.questions: interactive` parks the request until the operator
|
|
15
|
+
* answers or closes it in the QA view, and the answer becomes the waterfall's
|
|
16
|
+
* value.
|
|
17
|
+
* - `unsupported` (default) refuses with a reason the model can act on, rather
|
|
18
|
+
* than letting the turn stall on a card no one can see.
|
|
19
|
+
*
|
|
20
|
+
* Nothing is ever answered on the operator's behalf, and a request from a
|
|
21
|
+
* session this deployment did not attest is handed back to the chain untouched.
|
|
22
|
+
*/
|
|
23
|
+
export class QaQuestionGate {
|
|
24
|
+
ctx;
|
|
25
|
+
interactive;
|
|
26
|
+
ownership;
|
|
27
|
+
logger;
|
|
28
|
+
pending = new Map();
|
|
29
|
+
disposers = [];
|
|
30
|
+
constructor(ctx, interactive, ownership, logger) {
|
|
31
|
+
this.ctx = ctx;
|
|
32
|
+
this.interactive = interactive;
|
|
33
|
+
this.ownership = ownership;
|
|
34
|
+
this.logger = logger;
|
|
35
|
+
}
|
|
36
|
+
/** Claim question requests for the chats this deployment answers. */
|
|
37
|
+
install() {
|
|
38
|
+
this.ownership.install(this.ctx);
|
|
39
|
+
// The event is declared by the harness user-questions package, which this
|
|
40
|
+
// plugin deliberately does not depend on; the listener shape is structural.
|
|
41
|
+
const claim = this.ctx.on.bind(this.ctx);
|
|
42
|
+
this.disposers.push(claim("user-questions/request", (request, next) => this.handle(request, next), { prepend: true }));
|
|
43
|
+
this.disposers.push(this.ctx.on("agent/disposed", ({ agent }) => {
|
|
44
|
+
this.settleOwner(String(agent.session.id));
|
|
45
|
+
}));
|
|
46
|
+
}
|
|
47
|
+
/** Questions of one chat, oldest first: what the QA view renders. */
|
|
48
|
+
list(sessionId) {
|
|
49
|
+
if (!this.interactive())
|
|
50
|
+
return [];
|
|
51
|
+
return [...this.pending.values()]
|
|
52
|
+
.map((entry) => entry.view)
|
|
53
|
+
.filter((view) => view.sessionId === sessionId)
|
|
54
|
+
.sort((left, right) => left.createdAt - right.createdAt);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Apply the operator's answers; an unknown or foreign id is refused. The
|
|
58
|
+
* parked request is authoritative: a label the question never offered is
|
|
59
|
+
* dropped, and a free-text answer replaces the choice in a single-select
|
|
60
|
+
* rather than accompanying it, so the model only ever reads a real answer.
|
|
61
|
+
*/
|
|
62
|
+
answer(sessionId, requestId, answers) {
|
|
63
|
+
const entry = this.pending.get(requestId);
|
|
64
|
+
if (entry === undefined || entry.view.sessionId !== sessionId)
|
|
65
|
+
return false;
|
|
66
|
+
this.logger.info("question.answered", {
|
|
67
|
+
sessionId,
|
|
68
|
+
requestId,
|
|
69
|
+
questions: entry.view.questions.length,
|
|
70
|
+
});
|
|
71
|
+
// Every question of the request is answered here, including the ones the
|
|
72
|
+
// operator skipped, so the model never sees a partial form.
|
|
73
|
+
const byId = new Map(answers.map((answer) => [answer.id, answer]));
|
|
74
|
+
entry.settle({
|
|
75
|
+
kind: "answered",
|
|
76
|
+
answer: {
|
|
77
|
+
answers: entry.view.questions.map((question) => {
|
|
78
|
+
const given = byId.get(question.id);
|
|
79
|
+
// A question the browser omitted is a skip, not a silent choice.
|
|
80
|
+
if (given === undefined)
|
|
81
|
+
return { id: question.id, selected: [] };
|
|
82
|
+
const offered = new Set(question.options.map((option) => option.label));
|
|
83
|
+
const selected = given.selected.filter((label) => offered.has(label));
|
|
84
|
+
const custom = given.custom?.trim() ?? "";
|
|
85
|
+
if (custom === "")
|
|
86
|
+
return { id: question.id, selected };
|
|
87
|
+
return question.multiSelect
|
|
88
|
+
? { id: question.id, selected, custom }
|
|
89
|
+
: { id: question.id, selected: [], custom };
|
|
90
|
+
}),
|
|
91
|
+
},
|
|
92
|
+
});
|
|
93
|
+
return true;
|
|
94
|
+
}
|
|
95
|
+
/** Close a request without answering it. */
|
|
96
|
+
cancel(sessionId, requestId) {
|
|
97
|
+
const entry = this.pending.get(requestId);
|
|
98
|
+
if (entry === undefined || entry.view.sessionId !== sessionId)
|
|
99
|
+
return false;
|
|
100
|
+
this.logger.info("question.cancelled", { sessionId, requestId });
|
|
101
|
+
entry.settle({ kind: "cancelled" });
|
|
102
|
+
return true;
|
|
103
|
+
}
|
|
104
|
+
/** Detach the listener and fail every parked request. Wired as an effect. */
|
|
105
|
+
dispose() {
|
|
106
|
+
for (const entry of [...this.pending.values()])
|
|
107
|
+
entry.settle(CANCELLED_OUTCOME);
|
|
108
|
+
this.pending.clear();
|
|
109
|
+
for (const dispose of this.disposers.splice(0))
|
|
110
|
+
dispose();
|
|
111
|
+
}
|
|
112
|
+
async handle(request, next) {
|
|
113
|
+
const session = request.agent?.session;
|
|
114
|
+
if (session === undefined)
|
|
115
|
+
return next();
|
|
116
|
+
const sessionId = this.ownership.rootOf(String(session.id));
|
|
117
|
+
if (sessionId === undefined)
|
|
118
|
+
return next();
|
|
119
|
+
if (!this.interactive()) {
|
|
120
|
+
this.logger.info("question.unsupported", { sessionId });
|
|
121
|
+
throw new Error(QA_QUESTIONS_UNSUPPORTED);
|
|
122
|
+
}
|
|
123
|
+
const outcome = await this.park(sessionId, String(session.id), request);
|
|
124
|
+
if (outcome.kind === "cancelled")
|
|
125
|
+
throw new Error(CANCELLED_MESSAGE);
|
|
126
|
+
return outcome.answer;
|
|
127
|
+
}
|
|
128
|
+
/** Park one request until the operator answers it, or the turn ends. */
|
|
129
|
+
park(sessionId, ownerSessionId, request) {
|
|
130
|
+
const signal = request.signal;
|
|
131
|
+
if (signal?.aborted === true)
|
|
132
|
+
return Promise.resolve(CANCELLED_OUTCOME);
|
|
133
|
+
return new Promise((resolve) => {
|
|
134
|
+
const id = randomUUID();
|
|
135
|
+
const onAbort = () => finish(CANCELLED_OUTCOME);
|
|
136
|
+
const finish = (outcome) => {
|
|
137
|
+
if (!this.pending.has(id))
|
|
138
|
+
return;
|
|
139
|
+
this.pending.delete(id);
|
|
140
|
+
signal?.removeEventListener("abort", onAbort);
|
|
141
|
+
resolve(outcome);
|
|
142
|
+
};
|
|
143
|
+
this.pending.set(id, {
|
|
144
|
+
ownerSessionId,
|
|
145
|
+
view: {
|
|
146
|
+
id,
|
|
147
|
+
sessionId,
|
|
148
|
+
questions: request.questions.map(normalizeQuestion),
|
|
149
|
+
createdAt: Date.now(),
|
|
150
|
+
},
|
|
151
|
+
settle: finish,
|
|
152
|
+
});
|
|
153
|
+
signal?.addEventListener("abort", onAbort, { once: true });
|
|
154
|
+
this.logger.info("question.pending", {
|
|
155
|
+
sessionId,
|
|
156
|
+
requestId: id,
|
|
157
|
+
questions: request.questions.length,
|
|
158
|
+
});
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
/** Fail the questions one session's agent owns; a disposed agent cannot ask. */
|
|
162
|
+
settleOwner(ownerSessionId) {
|
|
163
|
+
for (const entry of [...this.pending.values()]) {
|
|
164
|
+
if (entry.ownerSessionId === ownerSessionId)
|
|
165
|
+
entry.settle(CANCELLED_OUTCOME);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
const CANCELLED_OUTCOME = Object.freeze({
|
|
170
|
+
kind: "cancelled",
|
|
171
|
+
});
|
|
172
|
+
function normalizeQuestion(question) {
|
|
173
|
+
return {
|
|
174
|
+
id: question.id,
|
|
175
|
+
question: question.question,
|
|
176
|
+
header: question.header ?? null,
|
|
177
|
+
detail: question.detail ?? null,
|
|
178
|
+
multiSelect: question.multiSelect === true,
|
|
179
|
+
options: (question.options ?? []).map((option) => ({
|
|
180
|
+
label: option.label,
|
|
181
|
+
description: option.description ?? null,
|
|
182
|
+
})),
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=questions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"questions.js","sourceRoot":"","sources":["../src/questions.ts"],"names":[],"mappings":"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"}
|
package/lib/resolve-config.js
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { resolveAccounts } from "./config-resolvers/accounts.js";
|
|
2
2
|
import { resolveAttachments } from "./config-resolvers/attachments.js";
|
|
3
|
+
import { resolveDocumentsConfig } from "./documents/config.js";
|
|
3
4
|
import { normalizeRoutePath, resolveBasics, } from "./config-resolvers/basics.js";
|
|
4
5
|
import { DEFAULT_QA_SURFACE_CONFIG } from "./config-resolvers/defaults.js";
|
|
5
6
|
import { resolveLockdown } from "./config-resolvers/lockdown.js";
|
|
6
7
|
import { resolveSession } from "./config-resolvers/session.js";
|
|
7
8
|
import { resolveSources } from "./config-resolvers/sources.js";
|
|
8
9
|
import { uniquePhrases, uniqueQuestions } from "./config-resolvers/shared.js";
|
|
10
|
+
import { resolveTools } from "./config-resolvers/tools.js";
|
|
9
11
|
import { resolveUi } from "./config-resolvers/ui.js";
|
|
10
12
|
export { DEFAULT_QA_SURFACE_CONFIG, normalizeRoutePath };
|
|
11
13
|
/**
|
|
@@ -20,6 +22,7 @@ export function resolveConfig(input = {}) {
|
|
|
20
22
|
const lockdown = resolveLockdown(input, ui);
|
|
21
23
|
const sources = resolveSources(input);
|
|
22
24
|
const attachments = resolveAttachments(input);
|
|
25
|
+
const tools = resolveTools(input);
|
|
23
26
|
const accounts = resolveAccounts(input, { session, lockdown });
|
|
24
27
|
return Object.freeze({
|
|
25
28
|
enabled: basics.enabled,
|
|
@@ -36,6 +39,8 @@ export function resolveConfig(input = {}) {
|
|
|
36
39
|
entry: basics.entry,
|
|
37
40
|
sources,
|
|
38
41
|
attachments,
|
|
42
|
+
documents: resolveDocumentsConfig(input.documents),
|
|
43
|
+
tools,
|
|
39
44
|
});
|
|
40
45
|
}
|
|
41
46
|
//# sourceMappingURL=resolve-config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve-config.js","sourceRoot":"","sources":["../src/resolve-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AACvE,OAAO,EACL,kBAAkB,EAClB,aAAa,GACd,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC9E,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAGrD,OAAO,EAAE,yBAAyB,EAAE,kBAAkB,EAAE,CAAC;AAEzD;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAC3B,KAAK,GAAoB,EAAE;IAE3B,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IACpC,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IACtC,MAAM,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAC5B,MAAM,QAAQ,GAAG,eAAe,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IACtC,MAAM,WAAW,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,eAAe,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC/D,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,OAAO;QACP,EAAE;QACF,kBAAkB,EAAE,eAAe,CACjC,KAAK,CAAC,kBAAkB,IAAI,yBAAyB,CAAC,kBAAkB,CACzE;QACD,eAAe,EAAE,aAAa,CAC5B,KAAK,CAAC,eAAe,IAAI,yBAAyB,CAAC,eAAe,CACnE;QACD,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,QAAQ;QACR,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,QAAQ;QACR,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,OAAO;QACP,WAAW;
|
|
1
|
+
{"version":3,"file":"resolve-config.js","sourceRoot":"","sources":["../src/resolve-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AACvE,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EACL,kBAAkB,EAClB,aAAa,GACd,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAGrD,OAAO,EAAE,yBAAyB,EAAE,kBAAkB,EAAE,CAAC;AAEzD;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAC3B,KAAK,GAAoB,EAAE;IAE3B,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IACpC,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IACtC,MAAM,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAC5B,MAAM,QAAQ,GAAG,eAAe,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IACtC,MAAM,WAAW,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IAClC,MAAM,QAAQ,GAAG,eAAe,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC/D,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,OAAO;QACP,EAAE;QACF,kBAAkB,EAAE,eAAe,CACjC,KAAK,CAAC,kBAAkB,IAAI,yBAAyB,CAAC,kBAAkB,CACzE;QACD,eAAe,EAAE,aAAa,CAC5B,KAAK,CAAC,eAAe,IAAI,yBAAyB,CAAC,eAAe,CACnE;QACD,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,QAAQ;QACR,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,QAAQ;QACR,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,OAAO;QACP,WAAW;QACX,SAAS,EAAE,sBAAsB,CAAC,KAAK,CAAC,SAAS,CAAC;QAClD,KAAK;KACN,CAAC,CAAC;AACL,CAAC"}
|