@yadsh/dsh-qa-surface 0.15.7 → 0.17.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 +27 -2
- package/lib/access/capability-catalog.js +11 -4
- package/lib/access/capability-catalog.js.map +1 -1
- package/lib/access/service.js +46 -5
- package/lib/access/service.js.map +1 -1
- package/lib/account-remotes.js +9 -0
- package/lib/account-remotes.js.map +1 -1
- package/lib/accounts/database.js +34 -3
- package/lib/accounts/database.js.map +1 -1
- package/lib/accounts/store.js +22 -2
- package/lib/accounts/store.js.map +1 -1
- package/lib/admin/service.js +4 -2
- package/lib/admin/service.js.map +1 -1
- package/lib/admin/session-log.js +3 -0
- package/lib/admin/session-log.js.map +1 -1
- package/lib/agent-scope.js +9 -0
- package/lib/agent-scope.js.map +1 -0
- package/lib/chat-sharing/native-fence.js +120 -0
- package/lib/chat-sharing/native-fence.js.map +1 -0
- package/lib/chat-sharing/resources.js +57 -0
- package/lib/chat-sharing/resources.js.map +1 -0
- package/lib/chat-sharing/store.js +199 -0
- package/lib/chat-sharing/store.js.map +1 -0
- package/lib/chat-sharing/transport.js +329 -0
- package/lib/chat-sharing/transport.js.map +1 -0
- package/lib/chat-sharing/turn-guard.js +154 -0
- package/lib/chat-sharing/turn-guard.js.map +1 -0
- package/lib/chat-sharing/types.js +2 -0
- package/lib/chat-sharing/types.js.map +1 -0
- package/lib/chat-sharing/uploads.js +55 -0
- package/lib/chat-sharing/uploads.js.map +1 -0
- package/lib/client/QaAccountsController.js +47 -2
- package/lib/client/QaAccountsController.js.map +1 -1
- package/lib/client/QaConfigController.js +7 -12
- package/lib/client/QaConfigController.js.map +1 -1
- package/lib/client/QaSessionController.js +195 -19
- package/lib/client/QaSessionController.js.map +1 -1
- package/lib/client/QaSurface.js +156 -14
- package/lib/client/QaSurface.js.map +1 -1
- package/lib/client/QaSurfaceGuard.js +6 -1
- package/lib/client/QaSurfaceGuard.js.map +1 -1
- package/lib/client/QaTranscriptAdapter.js +28 -5
- package/lib/client/QaTranscriptAdapter.js.map +1 -1
- package/lib/client/account-conversation.js +33 -0
- package/lib/client/account-conversation.js.map +1 -0
- package/lib/client/account-sessions.js +106 -0
- package/lib/client/account-sessions.js.map +1 -0
- package/lib/client/account-upload.js +30 -0
- package/lib/client/account-upload.js.map +1 -0
- package/lib/client/answer-review.js +89 -0
- package/lib/client/answer-review.js.map +1 -0
- package/lib/client/chat-artifacts.js +18 -3
- package/lib/client/chat-artifacts.js.map +1 -1
- package/lib/client/chat-sharing-api.js +2 -0
- package/lib/client/chat-sharing-api.js.map +1 -0
- package/lib/client/components/QaAnswerReviewStatus.js +45 -0
- package/lib/client/components/QaAnswerReviewStatus.js.map +1 -0
- package/lib/client/components/QaChangelog.js +92 -3
- package/lib/client/components/QaChangelog.js.map +1 -1
- package/lib/client/components/QaChatActions.js +52 -0
- package/lib/client/components/QaChatActions.js.map +1 -0
- package/lib/client/components/QaChatSharing.js +95 -0
- package/lib/client/components/QaChatSharing.js.map +1 -0
- package/lib/client/components/QaComposer.js +8 -4
- package/lib/client/components/QaComposer.js.map +1 -1
- package/lib/client/components/QaFileAttachment.js +12 -3
- package/lib/client/components/QaFileAttachment.js.map +1 -1
- package/lib/client/components/QaFilesPanel.js +11 -4
- package/lib/client/components/QaFilesPanel.js.map +1 -1
- package/lib/client/components/QaHeader.js +3 -3
- package/lib/client/components/QaHeader.js.map +1 -1
- package/lib/client/components/QaMarkdownPreview.js +86 -0
- package/lib/client/components/QaMarkdownPreview.js.map +1 -0
- package/lib/client/components/QaMessage.js +41 -10
- package/lib/client/components/QaMessage.js.map +1 -1
- package/lib/client/components/QaModal.js +17 -0
- package/lib/client/components/QaModal.js.map +1 -1
- package/lib/client/components/QaRightRail.js +6 -4
- package/lib/client/components/QaRightRail.js.map +1 -1
- package/lib/client/components/QaRightRailResize.js +129 -0
- package/lib/client/components/QaRightRailResize.js.map +1 -0
- package/lib/client/components/QaSidebar.js +11 -2
- package/lib/client/components/QaSidebar.js.map +1 -1
- package/lib/client/components/QaSourceFilters.js +22 -0
- package/lib/client/components/QaSourceFilters.js.map +1 -0
- package/lib/client/components/QaSourcesPanel.js +66 -14
- package/lib/client/components/QaSourcesPanel.js.map +1 -1
- package/lib/client/components/QaSpreadsheetPreview.js +56 -0
- package/lib/client/components/QaSpreadsheetPreview.js.map +1 -0
- package/lib/client/components/QaWelcomeNotice.js +2 -2
- package/lib/client/components/QaWelcomeNotice.js.map +1 -1
- package/lib/client/components/QaWorkspaceBrowser.js +46 -12
- package/lib/client/components/QaWorkspaceBrowser.js.map +1 -1
- package/lib/client/components/QaZoomImage.js +56 -0
- package/lib/client/components/QaZoomImage.js.map +1 -0
- package/lib/client/components/source-refs.js +57 -24
- package/lib/client/components/source-refs.js.map +1 -1
- package/lib/client/index.js +76 -8
- package/lib/client/index.js.map +1 -1
- package/lib/client/lineage.js +4 -3
- package/lib/client/lineage.js.map +1 -1
- package/lib/client/markdown/SourceImage.js +52 -0
- package/lib/client/markdown/SourceImage.js.map +1 -0
- package/lib/client/markdown/blocks.js +150 -115
- package/lib/client/markdown/blocks.js.map +1 -1
- package/lib/client/markdown/katex-css.js +1 -1
- package/lib/client/markdown/render.js +26 -9
- package/lib/client/markdown/render.js.map +1 -1
- package/lib/client/markdown/source-chip.js +6 -2
- package/lib/client/markdown/source-chip.js.map +1 -1
- package/lib/client/notifications/notification-dispatcher.js +50 -11
- package/lib/client/notifications/notification-dispatcher.js.map +1 -1
- package/lib/client/notifications/use-turn-notifications.js +107 -18
- package/lib/client/notifications/use-turn-notifications.js.map +1 -1
- package/lib/client/project-session-state.js +28 -13
- package/lib/client/project-session-state.js.map +1 -1
- package/lib/client/session-admission.js +9 -1
- package/lib/client/session-admission.js.map +1 -1
- package/lib/client/session-sources.js +44 -3
- package/lib/client/session-sources.js.map +1 -1
- package/lib/client/settings/sections/sources.js +1 -1
- package/lib/client/settings/sections/sources.js.map +1 -1
- package/lib/client/settings/styles.js +18 -28
- package/lib/client/settings/styles.js.map +1 -1
- package/lib/client/slash/useSlashNavigation.js +8 -5
- package/lib/client/slash/useSlashNavigation.js.map +1 -1
- package/lib/client/source-filters-styles.js +11 -0
- package/lib/client/source-filters-styles.js.map +1 -0
- package/lib/client/source-preview.js +1 -1
- package/lib/client/source-preview.js.map +1 -1
- package/lib/client/styles.js +62 -4
- package/lib/client/styles.js.map +1 -1
- package/lib/client/turn-sources.js +2 -1
- package/lib/client/turn-sources.js.map +1 -1
- package/lib/client/types.js.map +1 -1
- package/lib/client/use-right-rail.js +1 -1
- package/lib/client/use-right-rail.js.map +1 -1
- package/lib/client/user-settings/IntegrationTokensPage.js +30 -6
- package/lib/client/user-settings/IntegrationTokensPage.js.map +1 -1
- package/lib/client/workspace-download.js +42 -2
- package/lib/client/workspace-download.js.map +1 -1
- package/lib/client.js +6481 -2234
- package/lib/client.js.map +1 -1
- package/lib/config-resolvers/defaults.js +4 -3
- package/lib/config-resolvers/defaults.js.map +1 -1
- package/lib/config-resolvers/sources.js +2 -0
- package/lib/config-resolvers/sources.js.map +1 -1
- package/lib/config.js +3 -0
- package/lib/config.js.map +1 -1
- package/lib/enforcement/skill-policy.js +29 -4
- package/lib/enforcement/skill-policy.js.map +1 -1
- package/lib/enforcement/skill-resource-paths.js +32 -0
- package/lib/enforcement/skill-resource-paths.js.map +1 -0
- package/lib/enforcement/structured-result.js +38 -0
- package/lib/enforcement/structured-result.js.map +1 -0
- package/lib/enforcement/tool-grants.js +3 -1
- package/lib/enforcement/tool-grants.js.map +1 -1
- package/lib/index.js +447 -17
- package/lib/index.js.map +1 -1
- package/lib/integration/host-runner.js +1 -0
- package/lib/integration/host-runner.js.map +1 -1
- package/lib/integration/question-policy.js +126 -0
- package/lib/integration/question-policy.js.map +1 -0
- package/lib/integration/service.js +2 -0
- package/lib/integration/service.js.map +1 -1
- package/lib/llm-identity.js +27 -0
- package/lib/llm-identity.js.map +1 -0
- package/lib/markdown-frontmatter.js +47 -0
- package/lib/markdown-frontmatter.js.map +1 -0
- package/lib/markdown-images.js +33 -0
- package/lib/markdown-images.js.map +1 -0
- package/lib/prompt-notes.js +19 -2
- package/lib/prompt-notes.js.map +1 -1
- package/lib/provenance/collector.js +15 -1
- package/lib/provenance/collector.js.map +1 -1
- package/lib/provenance/connectors.js +57 -27
- package/lib/provenance/connectors.js.map +1 -1
- package/lib/provenance/dedupe.js +25 -1
- package/lib/provenance/dedupe.js.map +1 -1
- package/lib/provenance/document-preview.js +31 -3
- package/lib/provenance/document-preview.js.map +1 -1
- package/lib/provenance/extractors.js +88 -4
- package/lib/provenance/extractors.js.map +1 -1
- package/lib/provenance/file-download.js +56 -0
- package/lib/provenance/file-download.js.map +1 -0
- package/lib/provenance/file-preview.js +20 -2
- package/lib/provenance/file-preview.js.map +1 -1
- package/lib/provenance/host-store.js +59 -10
- package/lib/provenance/host-store.js.map +1 -1
- package/lib/provenance/integration-extractor.js +62 -0
- package/lib/provenance/integration-extractor.js.map +1 -0
- package/lib/provenance/snapshot-store.js +2 -0
- package/lib/provenance/snapshot-store.js.map +1 -1
- package/lib/provenance/source-content.js +103 -0
- package/lib/provenance/source-content.js.map +1 -0
- package/lib/provenance/source-image.js +57 -0
- package/lib/provenance/source-image.js.map +1 -0
- package/lib/provenance/spreadsheet-preview.js +52 -0
- package/lib/provenance/spreadsheet-preview.js.map +1 -0
- package/lib/qa-tools/docs-tools.js +14 -0
- package/lib/qa-tools/docs-tools.js.map +1 -1
- package/lib/questions.js +6 -1
- package/lib/questions.js.map +1 -1
- package/lib/secure-session.js +9 -3
- package/lib/secure-session.js.map +1 -1
- package/lib/session-fork-host.js +157 -0
- package/lib/session-fork-host.js.map +1 -0
- package/lib/session-fork.js +34 -0
- package/lib/session-fork.js.map +1 -0
- package/lib/session-ownership.js +5 -1
- package/lib/session-ownership.js.map +1 -1
- package/lib/shared/documents.js +12 -0
- package/lib/shared/documents.js.map +1 -1
- package/lib/shared/session-lineage.js +6 -0
- package/lib/shared/session-lineage.js.map +1 -0
- package/lib/slash/draft-target.js +21 -0
- package/lib/slash/draft-target.js.map +1 -0
- package/lib/slash/remotes.js +39 -4
- package/lib/slash/remotes.js.map +1 -1
- package/lib/typert.host.js +1869 -163
- package/lib/typert.remote-client.d.ts +56 -5
- package/lib/typert.remote-client.js +1678 -154
- package/lib/types/access/capability-catalog.d.ts +1 -1
- package/lib/types/access/service.d.ts +7 -0
- package/lib/types/access.js +2 -0
- package/lib/types/access.js.map +1 -0
- package/lib/types/account-remotes.d.ts +3 -0
- package/lib/types/accounts/database.d.ts +5 -0
- package/lib/types/accounts/store.d.ts +7 -2
- package/lib/types/accounts.js +2 -0
- package/lib/types/accounts.js.map +1 -0
- package/lib/types/admin/session-log.d.ts +2 -0
- package/lib/types/admin.js +2 -0
- package/lib/types/admin.js.map +1 -0
- package/lib/types/agent-scope.d.ts +4 -0
- package/lib/types/answer-review.js +2 -0
- package/lib/types/answer-review.js.map +1 -0
- package/lib/types/capability.js +2 -0
- package/lib/types/capability.js.map +1 -0
- package/lib/types/chat-sharing/native-fence.d.ts +11 -0
- package/lib/types/chat-sharing/resources.d.ts +5 -0
- package/lib/types/chat-sharing/store.d.ts +29 -0
- package/lib/types/chat-sharing/transport.d.ts +32 -0
- package/lib/types/chat-sharing/turn-guard.d.ts +21 -0
- package/lib/types/chat-sharing/types.d.ts +25 -0
- package/lib/types/chat-sharing/uploads.d.ts +5 -0
- package/lib/types/client/QaAccountsController.d.ts +4 -0
- package/lib/types/client/QaConfigController.d.ts +3 -2
- package/lib/types/client/QaSessionController.d.ts +17 -3
- package/lib/types/client/QaSurface.d.ts +6 -1
- package/lib/types/client/account-conversation.d.ts +6 -0
- package/lib/types/client/account-sessions.d.ts +7 -0
- package/lib/types/client/account-upload.d.ts +15 -0
- package/lib/types/client/answer-review.d.ts +16 -0
- package/lib/types/client/chat-sharing-api.d.ts +35 -0
- package/lib/types/client/components/QaAnswerReviewStatus.d.ts +8 -0
- package/lib/types/client/components/QaChatActions.d.ts +7 -0
- package/lib/types/client/components/QaChatSharing.d.ts +12 -0
- package/lib/types/client/components/QaComposer.d.ts +2 -0
- package/lib/types/client/components/QaFileAttachment.d.ts +3 -2
- package/lib/types/client/components/QaFilesPanel.d.ts +4 -1
- package/lib/types/client/components/QaMarkdownPreview.d.ts +13 -0
- package/lib/types/client/components/QaMessage.d.ts +5 -2
- package/lib/types/client/components/QaModal.d.ts +9 -0
- package/lib/types/client/components/QaRightRail.d.ts +3 -2
- package/lib/types/client/components/QaRightRailResize.d.ts +9 -0
- package/lib/types/client/components/QaSidebar.d.ts +2 -0
- package/lib/types/client/components/QaSourceFilters.d.ts +12 -0
- package/lib/types/client/components/QaSpreadsheetPreview.d.ts +8 -0
- package/lib/types/client/components/QaWelcomeNotice.d.ts +1 -1
- package/lib/types/client/components/QaWorkspaceBrowser.d.ts +8 -1
- package/lib/types/client/components/QaZoomImage.d.ts +38 -0
- package/lib/types/client/components/source-refs.d.ts +1 -0
- package/lib/types/client/lineage.d.ts +2 -2
- package/lib/types/client/markdown/SourceImage.d.ts +7 -0
- package/lib/types/client/markdown/blocks.d.ts +8 -1
- package/lib/types/client/markdown/render.d.ts +5 -1
- package/lib/types/client/markdown/source-chip.d.ts +1 -0
- package/lib/types/client/notifications/notification-dispatcher.d.ts +10 -6
- package/lib/types/client/notifications/use-turn-notifications.d.ts +4 -0
- package/lib/types/client/project-session-state.d.ts +1 -0
- package/lib/types/client/session-admission.d.ts +2 -0
- package/lib/types/client/session-sources.d.ts +1 -0
- package/lib/types/client/settings/styles.d.ts +2 -5
- package/lib/types/client/source-filters-styles.d.ts +2 -0
- package/lib/types/client/turn-sources.d.ts +1 -1
- package/lib/types/client/types.d.ts +18 -5
- package/lib/types/client/workspace-download.d.ts +9 -1
- package/lib/types/config.js +2 -0
- package/lib/types/config.js.map +1 -0
- package/lib/types/documents.js +2 -0
- package/lib/types/documents.js.map +1 -0
- package/lib/types/enforcement/skill-resource-paths.d.ts +5 -0
- package/lib/types/enforcement/structured-result.d.ts +11 -0
- package/lib/types/expert-memory.js +2 -0
- package/lib/types/expert-memory.js.map +1 -0
- package/lib/types/index.d.ts +42 -3
- package/lib/types/integration/contract.d.ts +1 -0
- package/lib/types/integration/question-policy.d.ts +20 -0
- package/lib/types/integration/service.d.ts +1 -0
- package/lib/types/llm-identity.d.ts +20 -0
- package/lib/types/markdown-frontmatter.d.ts +10 -0
- package/lib/types/markdown-images.d.ts +3 -0
- package/lib/types/policy.js +2 -0
- package/lib/types/policy.js.map +1 -0
- package/lib/types/prompt-notes.d.ts +3 -1
- package/lib/types/provenance/connectors.d.ts +4 -1
- package/lib/types/provenance/document-preview.d.ts +5 -2
- package/lib/types/provenance/extractors.d.ts +2 -0
- package/lib/types/provenance/file-download.d.ts +10 -0
- package/lib/types/provenance/file-preview.d.ts +2 -1
- package/lib/types/provenance/host-store.d.ts +2 -0
- package/lib/types/provenance/integration-extractor.d.ts +5 -0
- package/lib/types/provenance/source-content.d.ts +19 -0
- package/lib/types/provenance/source-image.d.ts +4 -0
- package/lib/types/provenance/spreadsheet-preview.d.ts +5 -0
- package/lib/types/provenance/types.d.ts +5 -0
- package/lib/types/qa-tools/docs-tools.d.ts +2 -0
- package/lib/types/quality.js +7 -0
- package/lib/types/quality.js.map +1 -0
- package/lib/types/questions.d.ts +2 -1
- package/lib/types/session-fork-host.d.ts +27 -0
- package/lib/types/session-fork.d.ts +7 -0
- package/lib/types/session.js +2 -0
- package/lib/types/session.js.map +1 -0
- package/lib/types/shared/documents.d.ts +2 -0
- package/lib/types/shared/session-lineage.d.ts +7 -0
- package/lib/types/skills.js +2 -0
- package/lib/types/skills.js.map +1 -0
- package/lib/types/slash/draft-target.d.ts +7 -0
- package/lib/types/slash/remotes.d.ts +7 -0
- package/lib/types/slash.js +2 -0
- package/lib/types/slash.js.map +1 -0
- package/lib/types/types/access.d.ts +43 -0
- package/lib/types/types/accounts.d.ts +177 -0
- package/lib/types/types/admin.d.ts +286 -0
- package/lib/types/types/answer-review.d.ts +11 -0
- package/lib/types/types/capability.d.ts +230 -0
- package/lib/types/types/config.d.ts +597 -0
- package/lib/types/types/documents.d.ts +34 -0
- package/lib/types/types/expert-memory.d.ts +35 -0
- package/lib/types/types/policy.d.ts +54 -0
- package/lib/types/types/quality.d.ts +100 -0
- package/lib/types/types/session.d.ts +397 -0
- package/lib/types/types/skills.d.ts +143 -0
- package/lib/types/types/slash.d.ts +159 -0
- package/lib/types/types.d.ts +14 -2180
- package/package.json +8 -7
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
export function qaNativeEndpointDenied(endpoint) {
|
|
2
|
+
const normalized = decodeURIComponent(endpoint).replace(/^\//u, "");
|
|
3
|
+
// QA accounts are an application identity, whereas the Host's other APIs
|
|
4
|
+
// authenticate the deployment operator. An unknown endpoint fails closed.
|
|
5
|
+
if (normalized.startsWith("qaIntegrations/")) {
|
|
6
|
+
// These installed integration-card methods resolve the QA token's own
|
|
7
|
+
// principal. Keep the explicit method list so future operator APIs fail closed.
|
|
8
|
+
const method = normalized.slice("qaIntegrations/".length);
|
|
9
|
+
return ![
|
|
10
|
+
"describe",
|
|
11
|
+
"providers",
|
|
12
|
+
"list",
|
|
13
|
+
"managedServiceCredentials",
|
|
14
|
+
"credentialSource",
|
|
15
|
+
"serviceBoundary",
|
|
16
|
+
"serviceHealth",
|
|
17
|
+
...[
|
|
18
|
+
"Bitrix24",
|
|
19
|
+
"Gitlab",
|
|
20
|
+
"Confluence",
|
|
21
|
+
"Teamcity",
|
|
22
|
+
"Jira",
|
|
23
|
+
"Testit",
|
|
24
|
+
"Weblate",
|
|
25
|
+
].flatMap((provider) => [
|
|
26
|
+
`get${provider}`,
|
|
27
|
+
`put${provider}Credential`,
|
|
28
|
+
`test${provider}`,
|
|
29
|
+
`patch${provider}Policy`,
|
|
30
|
+
`disconnect${provider}`,
|
|
31
|
+
]),
|
|
32
|
+
"bitrix24Instances",
|
|
33
|
+
"gitlabInstances",
|
|
34
|
+
"confluenceSites",
|
|
35
|
+
"teamcityServer",
|
|
36
|
+
"jiraSites",
|
|
37
|
+
"testitInstances",
|
|
38
|
+
"weblateInstances",
|
|
39
|
+
].includes(method);
|
|
40
|
+
}
|
|
41
|
+
// Replies to Host-wide waterfalls have no QA identity either. All approval
|
|
42
|
+
// decisions must use the tokenized owner-only QA operations.
|
|
43
|
+
return normalized.split("/")[0] !== "qaSurface";
|
|
44
|
+
}
|
|
45
|
+
/** Native operator APIs carry no QA identity. Accounts use the QA transport. */
|
|
46
|
+
export function installQaNativeFence(ctx, enabled) {
|
|
47
|
+
const gateway = ctx.get("typertGateway");
|
|
48
|
+
if (gateway === undefined)
|
|
49
|
+
throw new Error("QA accounts require the Typert gateway boundary.");
|
|
50
|
+
const invoke = gateway.invoke;
|
|
51
|
+
const stream = gateway.stream;
|
|
52
|
+
const open = gateway.wireStream.open;
|
|
53
|
+
// Only Connection can attest a cookie role and the peer minted from it.
|
|
54
|
+
// Older Hosts without this capability retain the closed account boundary.
|
|
55
|
+
const connection = ctx.get("connection");
|
|
56
|
+
const operatorPeer = (peer) => peer !== undefined && connection?.isOperatorPeer?.(peer) === true;
|
|
57
|
+
const check = (request) => {
|
|
58
|
+
if (enabled() &&
|
|
59
|
+
!operatorPeer(request.peer) &&
|
|
60
|
+
qaNativeEndpointDenied(request.namespace + "/" + request.method))
|
|
61
|
+
throw new Error("QA account authentication is required through the QA chat API.");
|
|
62
|
+
};
|
|
63
|
+
gateway.invoke = async function (request) {
|
|
64
|
+
check(request);
|
|
65
|
+
return invoke.call(this, request);
|
|
66
|
+
};
|
|
67
|
+
gateway.stream = async function (request) {
|
|
68
|
+
check(request);
|
|
69
|
+
return stream.call(this, request);
|
|
70
|
+
};
|
|
71
|
+
const wire = gateway.wireStream;
|
|
72
|
+
wire.open = async function (endpoint, payload, uplink, peer, signal) {
|
|
73
|
+
if (enabled() &&
|
|
74
|
+
!operatorPeer(peer) &&
|
|
75
|
+
endpoint !== "$events" &&
|
|
76
|
+
qaNativeEndpointDenied(endpoint))
|
|
77
|
+
throw new Error("QA account authentication is required through the QA chat API.");
|
|
78
|
+
const source = await open.call(this, endpoint, payload, uplink, peer, signal);
|
|
79
|
+
if (endpoint !== "$events")
|
|
80
|
+
return source;
|
|
81
|
+
return (async function* () {
|
|
82
|
+
for await (const frame of source) {
|
|
83
|
+
// Remote notifications are Host-wide and have no account token. The
|
|
84
|
+
// authenticated QA control/follow streams replace them for this surface.
|
|
85
|
+
if (enabled() && !operatorPeer(peer)) {
|
|
86
|
+
if (typeof frame !== "object" ||
|
|
87
|
+
frame === null ||
|
|
88
|
+
!("type" in frame) ||
|
|
89
|
+
frame.type !== "ready")
|
|
90
|
+
continue;
|
|
91
|
+
yield { ...frame, host: { home: "" } };
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
yield frame;
|
|
95
|
+
}
|
|
96
|
+
})();
|
|
97
|
+
};
|
|
98
|
+
const stopHttp = ctx.on("connection/request", async (request, response, next) => {
|
|
99
|
+
const pathname = decodeURIComponent(new URL(request.url ?? "/", "http://localhost").pathname);
|
|
100
|
+
const api = pathname.indexOf("/api/");
|
|
101
|
+
if (enabled() &&
|
|
102
|
+
connection?.isOperatorRequest?.(request) !== true &&
|
|
103
|
+
api >= 0 &&
|
|
104
|
+
pathname.slice(api + 5) !== "qa-chat-upload" &&
|
|
105
|
+
pathname.slice(api + 5) !== "remote.mux" &&
|
|
106
|
+
qaNativeEndpointDenied(pathname.slice(api + 5))) {
|
|
107
|
+
response.writeHead(403, { "Cache-Control": "no-store" });
|
|
108
|
+
response.end("QA account authentication is required through the QA chat API.");
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
await next();
|
|
112
|
+
});
|
|
113
|
+
return () => {
|
|
114
|
+
stopHttp();
|
|
115
|
+
gateway.invoke = invoke;
|
|
116
|
+
gateway.stream = stream;
|
|
117
|
+
wire.open = open;
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=native-fence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native-fence.js","sourceRoot":"","sources":["../../src/chat-sharing/native-fence.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { SessionId } from "@deepseek-ai/dsh-session/types";
|
|
3
|
+
import { artifactsOfToolResult } from "../client/chat-artifacts.js";
|
|
4
|
+
/** Paths reach recipients only through the chat's sources or reported outputs. */
|
|
5
|
+
export function qaChatPublishedFile(ctx, id, requested, sourceAllowed) {
|
|
6
|
+
const session = ctx.sessions.get(SessionId(id));
|
|
7
|
+
const cwd = session?.header.cwd;
|
|
8
|
+
if (session === undefined || cwd === undefined)
|
|
9
|
+
return false;
|
|
10
|
+
const target = path.resolve(cwd, requested);
|
|
11
|
+
if (sourceAllowed(id, target))
|
|
12
|
+
return true;
|
|
13
|
+
const calls = new Map();
|
|
14
|
+
for (const event of session.snapshotEvents()) {
|
|
15
|
+
if (event.type === "user/message") {
|
|
16
|
+
const attachments = ctx.get("attachments");
|
|
17
|
+
if (event.data.content.some((block) => {
|
|
18
|
+
if (block.type !== "file")
|
|
19
|
+
return false;
|
|
20
|
+
const hostPath = attachments?.fileHostPath?.(block.attachment);
|
|
21
|
+
return (hostPath !== undefined && path.resolve(cwd, hostPath) === target);
|
|
22
|
+
}))
|
|
23
|
+
return true;
|
|
24
|
+
}
|
|
25
|
+
if (event.type === "tool/call")
|
|
26
|
+
calls.set(String(event.data.callId), event.data.name);
|
|
27
|
+
if (event.type !== "tool/result" || event.data.error !== undefined)
|
|
28
|
+
continue;
|
|
29
|
+
const name = calls.get(String(event.data.message.source.callId));
|
|
30
|
+
if (name === undefined)
|
|
31
|
+
continue;
|
|
32
|
+
const output = event.data.message.content
|
|
33
|
+
.map((part) => (part.type === "text" ? part.text : ""))
|
|
34
|
+
.join("\n");
|
|
35
|
+
if (artifactsOfToolResult(name, output).some((file) => path.resolve(cwd, file.path) === target))
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
export function qaChatAttachmentPath(ctx, id, attachmentId) {
|
|
41
|
+
const session = ctx.sessions.get(SessionId(id));
|
|
42
|
+
const attachments = ctx.get("attachments");
|
|
43
|
+
for (const event of session?.snapshotEvents() ?? []) {
|
|
44
|
+
if (event.type !== "user/message")
|
|
45
|
+
continue;
|
|
46
|
+
for (const block of event.data.content) {
|
|
47
|
+
if (block.type !== "file" ||
|
|
48
|
+
String(block.attachment.attachmentId) !== attachmentId)
|
|
49
|
+
continue;
|
|
50
|
+
const filePath = attachments?.fileHostPath?.(block.attachment);
|
|
51
|
+
if (filePath !== undefined)
|
|
52
|
+
return filePath;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
throw new Error("This attachment is unavailable in the chat.");
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=resources.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resources.js","sourceRoot":"","sources":["../../src/chat-sharing/resources.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import { SqliteDatabase } from "@yadsh/dsh-plugin-kit/sqlite";
|
|
2
|
+
/** Separate schema: installing sharing does not upgrade the accounts CLI's DB. */
|
|
3
|
+
export class QaChatSharingStore {
|
|
4
|
+
accounts;
|
|
5
|
+
storage;
|
|
6
|
+
constructor(filePath, accounts) {
|
|
7
|
+
this.accounts = accounts;
|
|
8
|
+
this.storage = new SqliteDatabase(filePath, [
|
|
9
|
+
{
|
|
10
|
+
version: 1,
|
|
11
|
+
up: `
|
|
12
|
+
CREATE TABLE grants (session_id TEXT NOT NULL, owner_id TEXT NOT NULL,
|
|
13
|
+
user_id TEXT NOT NULL, mode TEXT NOT NULL CHECK(mode IN ('read','collaborate')),
|
|
14
|
+
revision INTEGER NOT NULL, PRIMARY KEY(session_id,user_id));
|
|
15
|
+
CREATE TABLE authors (session_id TEXT NOT NULL, request_id TEXT NOT NULL,
|
|
16
|
+
user_id TEXT NOT NULL, display_name TEXT NOT NULL, grant_revision INTEGER,
|
|
17
|
+
PRIMARY KEY(session_id,request_id));
|
|
18
|
+
CREATE TABLE revisions (session_id TEXT PRIMARY KEY, revision INTEGER NOT NULL);
|
|
19
|
+
`,
|
|
20
|
+
},
|
|
21
|
+
]);
|
|
22
|
+
}
|
|
23
|
+
access(token, sessionId) {
|
|
24
|
+
const accounts = this.accounts();
|
|
25
|
+
const actor = accounts.currentUser(token);
|
|
26
|
+
return this.accessForActor(accounts, actor, sessionId);
|
|
27
|
+
}
|
|
28
|
+
accessForActor(accounts, actor, sessionId) {
|
|
29
|
+
const ownerId = accounts.ownerIdOf(sessionId);
|
|
30
|
+
const owner = ownerId === undefined ? undefined : accounts.accountById(ownerId);
|
|
31
|
+
if (owner === undefined)
|
|
32
|
+
throw new Error("Chat access is unavailable.");
|
|
33
|
+
if (actor.id === owner.id)
|
|
34
|
+
return {
|
|
35
|
+
sessionId,
|
|
36
|
+
ownerId: owner.id,
|
|
37
|
+
ownerName: owner.displayName,
|
|
38
|
+
actorId: actor.id,
|
|
39
|
+
mode: "owner",
|
|
40
|
+
revision: 0,
|
|
41
|
+
};
|
|
42
|
+
const grant = this.storage.db
|
|
43
|
+
.prepare("SELECT mode, revision FROM grants WHERE session_id=? AND owner_id=? AND user_id=?")
|
|
44
|
+
.get(sessionId, owner.id, actor.id);
|
|
45
|
+
if (grant === undefined)
|
|
46
|
+
throw new Error("Chat access is unavailable.");
|
|
47
|
+
return {
|
|
48
|
+
sessionId,
|
|
49
|
+
ownerId: owner.id,
|
|
50
|
+
ownerName: owner.displayName,
|
|
51
|
+
actorId: actor.id,
|
|
52
|
+
mode: grant.mode,
|
|
53
|
+
revision: grant.revision,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
owner(token, sessionId) {
|
|
57
|
+
const access = this.access(token, sessionId);
|
|
58
|
+
if (access.mode !== "owner")
|
|
59
|
+
throw new Error("This action requires the chat owner.");
|
|
60
|
+
return access;
|
|
61
|
+
}
|
|
62
|
+
write(token, sessionId) {
|
|
63
|
+
const access = this.access(token, sessionId);
|
|
64
|
+
if (access.mode === "read")
|
|
65
|
+
throw new Error("This chat is read-only.");
|
|
66
|
+
return access;
|
|
67
|
+
}
|
|
68
|
+
/** Exact address lookup after ownership, never an account directory. */
|
|
69
|
+
set(token, sessionId, email, mode) {
|
|
70
|
+
this.storage.transaction(() => {
|
|
71
|
+
const access = this.owner(token, sessionId);
|
|
72
|
+
if (mode !== null && mode !== "read" && mode !== "collaborate")
|
|
73
|
+
throw new Error("Invalid chat access mode.");
|
|
74
|
+
const user = this.accounts().findUser(email);
|
|
75
|
+
if (user === undefined ||
|
|
76
|
+
(mode !== null && this.accounts().accountById(user.id) === undefined) ||
|
|
77
|
+
user.id === access.ownerId)
|
|
78
|
+
throw new Error("The recipient account is unavailable.");
|
|
79
|
+
this.storage.db
|
|
80
|
+
.prepare(`INSERT INTO revisions VALUES (?,1)
|
|
81
|
+
ON CONFLICT(session_id) DO UPDATE SET revision=revision+1`)
|
|
82
|
+
.run(sessionId);
|
|
83
|
+
const { revision } = this.storage.db
|
|
84
|
+
.prepare("SELECT revision FROM revisions WHERE session_id=?")
|
|
85
|
+
.get(sessionId);
|
|
86
|
+
if (mode === null)
|
|
87
|
+
this.storage.db
|
|
88
|
+
.prepare("DELETE FROM grants WHERE session_id=? AND user_id=?")
|
|
89
|
+
.run(sessionId, user.id);
|
|
90
|
+
else
|
|
91
|
+
this.storage.db
|
|
92
|
+
.prepare(`INSERT INTO grants VALUES (?,?,?,?,?)
|
|
93
|
+
ON CONFLICT(session_id,user_id) DO UPDATE SET owner_id=excluded.owner_id,
|
|
94
|
+
mode=excluded.mode, revision=excluded.revision`)
|
|
95
|
+
.run(sessionId, access.ownerId, user.id, mode, revision);
|
|
96
|
+
});
|
|
97
|
+
return this.grants(token, sessionId);
|
|
98
|
+
}
|
|
99
|
+
grants(token, sessionId) {
|
|
100
|
+
const owner = this.owner(token, sessionId);
|
|
101
|
+
const rows = this.storage.db
|
|
102
|
+
.prepare("SELECT user_id,mode FROM grants WHERE session_id=? AND owner_id=?")
|
|
103
|
+
.all(sessionId, owner.ownerId);
|
|
104
|
+
return rows.flatMap((row) => {
|
|
105
|
+
// Ownership was checked above. Disabled recipients stay in the owner's
|
|
106
|
+
// management list so their durable grants can still be revoked.
|
|
107
|
+
const user = this.accounts().accountById(row.user_id, true);
|
|
108
|
+
return user === undefined
|
|
109
|
+
? []
|
|
110
|
+
: [
|
|
111
|
+
{
|
|
112
|
+
userId: user.id,
|
|
113
|
+
email: user.email,
|
|
114
|
+
displayName: user.displayName,
|
|
115
|
+
mode: row.mode,
|
|
116
|
+
},
|
|
117
|
+
];
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
visible(token) {
|
|
121
|
+
// One synchronous authorization batch: refresh the account provider and
|
|
122
|
+
// verify the principal once, while reading every grant from current storage.
|
|
123
|
+
const accounts = this.accounts();
|
|
124
|
+
const actor = accounts.currentUser(token);
|
|
125
|
+
const rows = this.storage.db
|
|
126
|
+
.prepare("SELECT session_id FROM grants WHERE user_id=?")
|
|
127
|
+
.all(actor.id);
|
|
128
|
+
const ids = new Set([
|
|
129
|
+
...accounts.ownedSessionIds(token),
|
|
130
|
+
...rows.map((row) => row.session_id),
|
|
131
|
+
]);
|
|
132
|
+
return [...ids].flatMap((id) => {
|
|
133
|
+
try {
|
|
134
|
+
return [this.accessForActor(accounts, actor, id)];
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
return [];
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
revalidate(token, previous) {
|
|
142
|
+
const current = this.access(token, previous.sessionId);
|
|
143
|
+
if (current.actorId !== previous.actorId ||
|
|
144
|
+
current.ownerId !== previous.ownerId ||
|
|
145
|
+
current.mode !== previous.mode ||
|
|
146
|
+
current.revision !== previous.revision)
|
|
147
|
+
throw new Error("Chat access changed during the operation.");
|
|
148
|
+
return current;
|
|
149
|
+
}
|
|
150
|
+
recordAuthor(token, access, requestId) {
|
|
151
|
+
this.revalidate(token, access);
|
|
152
|
+
const actor = this.accounts().currentUser(token);
|
|
153
|
+
this.storage.db
|
|
154
|
+
.prepare("INSERT INTO authors VALUES (?,?,?,?,?)")
|
|
155
|
+
.run(access.sessionId, requestId, actor.id, actor.displayName, access.mode === "owner" ? null : access.revision);
|
|
156
|
+
}
|
|
157
|
+
authors(token, sessionId) {
|
|
158
|
+
this.access(token, sessionId);
|
|
159
|
+
return this.storage.db
|
|
160
|
+
.prepare(`SELECT request_id AS requestId, user_id AS userId,
|
|
161
|
+
display_name AS displayName FROM authors WHERE session_id=?`)
|
|
162
|
+
.all(sessionId);
|
|
163
|
+
}
|
|
164
|
+
requestActor(sessionId, requestId) {
|
|
165
|
+
return this.storage.db
|
|
166
|
+
.prepare("SELECT user_id AS userId, grant_revision AS revision FROM authors WHERE session_id=? AND request_id=?")
|
|
167
|
+
.get(sessionId, requestId);
|
|
168
|
+
}
|
|
169
|
+
/** Copy only immutable attribution for the native prefix, never memberships. */
|
|
170
|
+
forkAuthors(sourceId, targetId, requests) {
|
|
171
|
+
this.storage.transaction(() => {
|
|
172
|
+
for (const request of new Set(requests))
|
|
173
|
+
this.storage.db
|
|
174
|
+
.prepare(`INSERT INTO authors
|
|
175
|
+
SELECT ?,request_id,user_id,display_name,NULL FROM authors WHERE session_id=? AND request_id=?`)
|
|
176
|
+
.run(targetId, sourceId, request);
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
dropSession(id) {
|
|
180
|
+
this.storage.transaction(() => {
|
|
181
|
+
this.storage.db.prepare("DELETE FROM grants WHERE session_id=?").run(id);
|
|
182
|
+
this.storage.db.prepare("DELETE FROM authors WHERE session_id=?").run(id);
|
|
183
|
+
this.storage.db
|
|
184
|
+
.prepare(`INSERT INTO revisions VALUES (?,1)
|
|
185
|
+
ON CONFLICT(session_id) DO UPDATE SET revision=revision+1`)
|
|
186
|
+
.run(id);
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
actorStillAllowed(sessionId, userId, revision) {
|
|
190
|
+
const ownerId = this.accounts().ownerIdOf(sessionId);
|
|
191
|
+
return (this.accounts().accountById(userId) !== undefined &&
|
|
192
|
+
ownerId !== undefined &&
|
|
193
|
+
this.accounts().accountById(ownerId) !== undefined &&
|
|
194
|
+
this.storage.db
|
|
195
|
+
.prepare("SELECT 1 FROM grants WHERE session_id=? AND owner_id=? AND user_id=? AND mode='collaborate' AND revision=?")
|
|
196
|
+
.get(sessionId, ownerId, userId, revision) !== undefined);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/chat-sharing/store.ts"],"names":[],"mappings":"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"}
|