@yadsh/dsh-qa-surface 0.1.1 → 0.3.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.
Files changed (192) hide show
  1. package/CHANGELOG.md +151 -0
  2. package/README.md +239 -16
  3. package/SPEC-dsh-qa-surface.md +600 -96
  4. package/capability-policy.json +5 -0
  5. package/compatibility.json +18 -4
  6. package/cordis.patch.yml +11 -0
  7. package/docs/ARCHITECTURE.md +50 -8
  8. package/docs/COMPATIBILITY.md +5 -4
  9. package/docs/CONFIGURATION.md +184 -3
  10. package/docs/SOURCES-MIGRATION.md +28 -0
  11. package/docs/SOURCES-PROVENANCE-AUDIT.md +88 -0
  12. package/docs/SPEC-dsh-qa-surface-accounts.md +219 -0
  13. package/docs/SPEC-dsh-qa-surface-sources-provenance.md +1692 -0
  14. package/lib/accounts/index.js +2 -0
  15. package/lib/accounts/index.js.map +1 -0
  16. package/lib/accounts/store.js +478 -0
  17. package/lib/accounts/store.js.map +1 -0
  18. package/lib/attestation.js +10 -0
  19. package/lib/attestation.js.map +1 -0
  20. package/lib/cli.js +143 -0
  21. package/lib/cli.js.map +1 -0
  22. package/lib/client/QaAccountsController.js +329 -0
  23. package/lib/client/QaAccountsController.js.map +1 -0
  24. package/lib/client/QaConfigController.js +111 -4
  25. package/lib/client/QaConfigController.js.map +1 -1
  26. package/lib/client/QaSessionController.js +621 -163
  27. package/lib/client/QaSessionController.js.map +1 -1
  28. package/lib/client/QaSurface.js +303 -24
  29. package/lib/client/QaSurface.js.map +1 -1
  30. package/lib/client/QaTranscriptAdapter.js +324 -49
  31. package/lib/client/QaTranscriptAdapter.js.map +1 -1
  32. package/lib/client/attestation.js +66 -0
  33. package/lib/client/attestation.js.map +1 -0
  34. package/lib/client/chat-index.js +86 -0
  35. package/lib/client/chat-index.js.map +1 -0
  36. package/lib/client/components/Markdown.js +124 -13
  37. package/lib/client/components/Markdown.js.map +1 -1
  38. package/lib/client/components/QaAgentsDrawer.js +40 -0
  39. package/lib/client/components/QaAgentsDrawer.js.map +1 -0
  40. package/lib/client/components/QaAuthGate.js +40 -0
  41. package/lib/client/components/QaAuthGate.js.map +1 -0
  42. package/lib/client/components/QaChangelog.js +112 -0
  43. package/lib/client/components/QaChangelog.js.map +1 -0
  44. package/lib/client/components/QaComposer.js +132 -15
  45. package/lib/client/components/QaComposer.js.map +1 -1
  46. package/lib/client/components/QaMessage.js +214 -10
  47. package/lib/client/components/QaMessage.js.map +1 -1
  48. package/lib/client/components/QaSidebar.js +167 -0
  49. package/lib/client/components/QaSidebar.js.map +1 -0
  50. package/lib/client/components/QaSourcesDrawer.js +127 -0
  51. package/lib/client/components/QaSourcesDrawer.js.map +1 -0
  52. package/lib/client/components/QaTurnRail.js +281 -0
  53. package/lib/client/components/QaTurnRail.js.map +1 -0
  54. package/lib/client/components/QaWelcomeNotice.js +125 -0
  55. package/lib/client/components/QaWelcomeNotice.js.map +1 -0
  56. package/lib/client/components/QaWidthHandle.js +142 -0
  57. package/lib/client/components/QaWidthHandle.js.map +1 -0
  58. package/lib/client/components/QaWorkGroup.js +135 -0
  59. package/lib/client/components/QaWorkGroup.js.map +1 -0
  60. package/lib/client/components/VariantSwitcher.js +29 -0
  61. package/lib/client/components/VariantSwitcher.js.map +1 -0
  62. package/lib/client/components/format.js +48 -0
  63. package/lib/client/components/format.js.map +1 -0
  64. package/lib/client/components/source-refs.js +78 -0
  65. package/lib/client/components/source-refs.js.map +1 -0
  66. package/lib/client/create-session.js +51 -0
  67. package/lib/client/create-session.js.map +1 -0
  68. package/lib/client/index.js +166 -35
  69. package/lib/client/index.js.map +1 -1
  70. package/lib/client/project-session-state.js +78 -0
  71. package/lib/client/project-session-state.js.map +1 -0
  72. package/lib/client/session-admission.js +38 -0
  73. package/lib/client/session-admission.js.map +1 -0
  74. package/lib/client/session-assets.js +52 -0
  75. package/lib/client/session-assets.js.map +1 -0
  76. package/lib/client/session-sources.js +61 -0
  77. package/lib/client/session-sources.js.map +1 -0
  78. package/lib/client/settlement.js +24 -0
  79. package/lib/client/settlement.js.map +1 -0
  80. package/lib/client/styles.js +450 -43
  81. package/lib/client/styles.js.map +1 -1
  82. package/lib/client/tool-presentation.js +102 -0
  83. package/lib/client/tool-presentation.js.map +1 -0
  84. package/lib/client/turn-sources.js +98 -0
  85. package/lib/client/turn-sources.js.map +1 -0
  86. package/lib/client/types.js +15 -0
  87. package/lib/client/types.js.map +1 -0
  88. package/lib/client/use-session-ui-state.js +68 -0
  89. package/lib/client/use-session-ui-state.js.map +1 -0
  90. package/lib/client/use-transcript-view.js +44 -0
  91. package/lib/client/use-transcript-view.js.map +1 -0
  92. package/lib/client/wait-for.js +49 -0
  93. package/lib/client/wait-for.js.map +1 -0
  94. package/lib/client.js +12551 -918
  95. package/lib/client.js.map +1 -1
  96. package/lib/config.js +226 -58
  97. package/lib/config.js.map +1 -1
  98. package/lib/entry-redirect.js +44 -0
  99. package/lib/entry-redirect.js.map +1 -0
  100. package/lib/host-route.js +25 -1
  101. package/lib/host-route.js.map +1 -1
  102. package/lib/index.js +354 -72
  103. package/lib/index.js.map +1 -1
  104. package/lib/launch-token.js +42 -0
  105. package/lib/launch-token.js.map +1 -0
  106. package/lib/lockdown-policy.js +20 -0
  107. package/lib/lockdown-policy.js.map +1 -0
  108. package/lib/provenance/collector.js +40 -0
  109. package/lib/provenance/collector.js.map +1 -0
  110. package/lib/provenance/connectors.js +147 -0
  111. package/lib/provenance/connectors.js.map +1 -0
  112. package/lib/provenance/dedupe.js +89 -0
  113. package/lib/provenance/dedupe.js.map +1 -0
  114. package/lib/provenance/extractors.js +340 -0
  115. package/lib/provenance/extractors.js.map +1 -0
  116. package/lib/provenance/file-preview.js +39 -0
  117. package/lib/provenance/file-preview.js.map +1 -0
  118. package/lib/provenance/host-store.js +387 -0
  119. package/lib/provenance/host-store.js.map +1 -0
  120. package/lib/provenance/index.js +9 -0
  121. package/lib/provenance/index.js.map +1 -0
  122. package/lib/provenance/normalize.js +128 -0
  123. package/lib/provenance/normalize.js.map +1 -0
  124. package/lib/provenance/reported.js +53 -0
  125. package/lib/provenance/reported.js.map +1 -0
  126. package/lib/provenance/types.js +2 -0
  127. package/lib/provenance/types.js.map +1 -0
  128. package/lib/resolve-config.js +283 -10
  129. package/lib/resolve-config.js.map +1 -1
  130. package/lib/secure-session.js +212 -0
  131. package/lib/secure-session.js.map +1 -0
  132. package/lib/typert.host.d.ts +3 -0
  133. package/lib/typert.host.js +784 -0
  134. package/lib/typert.remote-client.d.ts +40 -0
  135. package/lib/typert.remote-client.js +597 -0
  136. package/lib/types/accounts/index.d.ts +2 -0
  137. package/lib/types/accounts/store.d.ts +121 -0
  138. package/lib/types/attestation.d.ts +17 -0
  139. package/lib/types/cli.d.ts +9 -0
  140. package/lib/types/client/QaAccountsController.d.ts +95 -0
  141. package/lib/types/client/QaConfigController.d.ts +35 -3
  142. package/lib/types/client/QaSessionController.d.ts +146 -20
  143. package/lib/types/client/QaSurface.d.ts +11 -5
  144. package/lib/types/client/QaTranscriptAdapter.d.ts +13 -3
  145. package/lib/types/client/attestation.d.ts +25 -0
  146. package/lib/types/client/chat-index.d.ts +28 -0
  147. package/lib/types/client/components/Markdown.d.ts +17 -3
  148. package/lib/types/client/components/QaAgentsDrawer.d.ts +25 -0
  149. package/lib/types/client/components/QaAuthGate.d.ts +15 -0
  150. package/lib/types/client/components/QaChangelog.d.ts +21 -0
  151. package/lib/types/client/components/QaComposer.d.ts +12 -2
  152. package/lib/types/client/components/QaMessage.d.ts +22 -2
  153. package/lib/types/client/components/QaSidebar.d.ts +69 -0
  154. package/lib/types/client/components/QaSourcesDrawer.d.ts +20 -0
  155. package/lib/types/client/components/QaTurnRail.d.ts +59 -0
  156. package/lib/types/client/components/QaWelcomeNotice.d.ts +27 -0
  157. package/lib/types/client/components/QaWidthHandle.d.ts +36 -0
  158. package/lib/types/client/components/QaWorkGroup.d.ts +19 -0
  159. package/lib/types/client/components/VariantSwitcher.d.ts +19 -0
  160. package/lib/types/client/components/format.d.ts +9 -0
  161. package/lib/types/client/components/source-refs.d.ts +16 -0
  162. package/lib/types/client/create-session.d.ts +16 -0
  163. package/lib/types/client/index.d.ts +2 -5
  164. package/lib/types/client/project-session-state.d.ts +30 -0
  165. package/lib/types/client/session-admission.d.ts +23 -0
  166. package/lib/types/client/session-assets.d.ts +20 -0
  167. package/lib/types/client/session-sources.d.ts +28 -0
  168. package/lib/types/client/settlement.d.ts +6 -0
  169. package/lib/types/client/tool-presentation.d.ts +6 -0
  170. package/lib/types/client/turn-sources.d.ts +14 -0
  171. package/lib/types/client/types.d.ts +93 -0
  172. package/lib/types/client/use-session-ui-state.d.ts +35 -0
  173. package/lib/types/client/use-transcript-view.d.ts +20 -0
  174. package/lib/types/client/wait-for.d.ts +11 -0
  175. package/lib/types/entry-redirect.d.ts +20 -0
  176. package/lib/types/host-route.d.ts +14 -1
  177. package/lib/types/index.d.ts +67 -7
  178. package/lib/types/launch-token.d.ts +21 -0
  179. package/lib/types/lockdown-policy.d.ts +18 -0
  180. package/lib/types/provenance/collector.d.ts +26 -0
  181. package/lib/types/provenance/connectors.d.ts +11 -0
  182. package/lib/types/provenance/dedupe.d.ts +6 -0
  183. package/lib/types/provenance/extractors.d.ts +14 -0
  184. package/lib/types/provenance/file-preview.d.ts +10 -0
  185. package/lib/types/provenance/host-store.d.ts +54 -0
  186. package/lib/types/provenance/index.d.ts +10 -0
  187. package/lib/types/provenance/normalize.d.ts +13 -0
  188. package/lib/types/provenance/reported.d.ts +5 -0
  189. package/lib/types/provenance/types.d.ts +78 -0
  190. package/lib/types/secure-session.d.ts +31 -0
  191. package/lib/types/types.d.ts +304 -1
  192. package/package.json +70 -27
package/lib/index.js CHANGED
@@ -1,83 +1,365 @@
1
- import { Service } from "@deepseek-ai/cordis";
2
- import { installSettingsSection, settingsNamespace, } from "@deepseek-ai/dsh-settings";
1
+ var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
2
+ var useValue = arguments.length > 2;
3
+ for (var i = 0; i < initializers.length; i++) {
4
+ value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
5
+ }
6
+ return useValue ? value : void 0;
7
+ };
8
+ var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
9
+ function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
10
+ var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
11
+ var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
12
+ var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
13
+ var _, done = false;
14
+ for (var i = decorators.length - 1; i >= 0; i--) {
15
+ var context = {};
16
+ for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
17
+ for (var p in contextIn.access) context.access[p] = contextIn.access[p];
18
+ context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
19
+ var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
20
+ if (kind === "accessor") {
21
+ if (result === void 0) continue;
22
+ if (result === null || typeof result !== "object") throw new TypeError("Object expected");
23
+ if (_ = accept(result.get)) descriptor.get = _;
24
+ if (_ = accept(result.set)) descriptor.set = _;
25
+ if (_ = accept(result.init)) initializers.unshift(_);
26
+ }
27
+ else if (_ = accept(result)) {
28
+ if (kind === "field") initializers.unshift(_);
29
+ else descriptor[key] = _;
30
+ }
31
+ }
32
+ if (target) Object.defineProperty(target, contextIn.name, descriptor);
33
+ done = true;
34
+ };
35
+ import { Remote, TypertRemoteService } from "@deepseek-ai/dsh-typert-protocol";
3
36
  import { createHostLoggerSink, getPluginLogger, } from "@yadsh/dsh-plugin-log";
4
37
  import { ConfigSchema, resolveConfig } from "./config.js";
38
+ import { QaAccounts, QaAccountsError, defaultAccountsFilePath, } from "./accounts/store.js";
39
+ import { QaAttestationError } from "./attestation.js";
40
+ import { entryRedirectRow } from "./entry-redirect.js";
5
41
  import { registerQaNavigationRoute } from "./host-route.js";
42
+ import { makeLaunchTokenSource } from "./launch-token.js";
43
+ import { QaPolicyAdmission } from "./secure-session.js";
44
+ import { QaProvenanceHost } from "./provenance/host-store.js";
45
+ import { readSourceFilePreview } from "./provenance/file-preview.js";
6
46
  export const name = "qa-surface";
7
- export const inject = [];
8
- export const QA_SURFACE_SETTINGS_NAMESPACE = settingsNamespace("qa-surface");
47
+ export const inject = [
48
+ "agents",
49
+ "sessions",
50
+ "agentPresets",
51
+ "permissionPresets",
52
+ "tools",
53
+ "systemPrompt",
54
+ "workspaceRegistry",
55
+ ];
56
+ export const QA_SURFACE_SETTINGS_NAMESPACE = "qa-surface";
9
57
  export const Config = ConfigSchema;
10
- /** Small Host companion: validates config and exposes it through DSH settings. */
11
- export class QaSurface extends Service {
12
- static inject = inject;
13
- static Config = ConfigSchema;
14
- source;
15
- logger;
16
- webServer;
17
- disposeRoute;
18
- routeKey;
19
- constructor(ctx, entry = {}) {
20
- super(ctx, "qaSurface");
21
- const resolvedEntry = resolveConfig(entry);
22
- this.source = () => resolvedEntry;
23
- this.logger = getPluginLogger({
24
- pluginId: "dsh-qa-surface",
25
- consoleSink: createHostLoggerSink(ctx.logger),
26
- });
27
- ctx.effect(() => async () => this.logger.close(), "dsh-qa-surface.logger");
28
- installSettingsSection(ctx, QA_SURFACE_SETTINGS_NAMESPACE, ConfigSchema, entry, {
29
- setSource: (source) => {
30
- this.source = source;
31
- },
32
- onChange: () => {
33
- const config = this.getConfig();
58
+ const CONFIGURATION_ERROR = "Assistant configuration is unavailable.";
59
+ const ACCOUNTS_DISABLED_ERROR = "QA accounts are not enabled on this deployment.";
60
+ /** The `(reason: <code>)` marker contract shared with the attestation path. */
61
+ const ACCOUNTS_REASON_MARKER = /\(reason: ([a-z-]+)\)/u;
62
+ /** Host companion: validates config, owns the admission boundary and the route. */
63
+ let QaSurface = (() => {
64
+ let _classSuper = TypertRemoteService;
65
+ let _instanceExtraInitializers = [];
66
+ let _accountsRegister_decorators;
67
+ let _accountsLogin_decorators;
68
+ let _accountsWhoami_decorators;
69
+ let _accountsClaimSessions_decorators;
70
+ let _accountsOwnedSessions_decorators;
71
+ let _accountsListOwnership_decorators;
72
+ let _describe_decorators;
73
+ let _secureSession_decorators;
74
+ let _sources_decorators;
75
+ let _readSourceFile_decorators;
76
+ return class QaSurface extends _classSuper {
77
+ static {
78
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
79
+ _accountsRegister_decorators = [Remote("accountsRegister")];
80
+ _accountsLogin_decorators = [Remote("accountsLogin")];
81
+ _accountsWhoami_decorators = [Remote("accountsWhoami")];
82
+ _accountsClaimSessions_decorators = [Remote("accountsClaimSessions")];
83
+ _accountsOwnedSessions_decorators = [Remote("accountsOwnedSessions")];
84
+ _accountsListOwnership_decorators = [Remote("accountsListOwnership")];
85
+ _describe_decorators = [Remote("describe")];
86
+ _secureSession_decorators = [Remote("secureSession")];
87
+ _sources_decorators = [Remote("sources")];
88
+ _readSourceFile_decorators = [Remote("readSourceFile")];
89
+ __esDecorate(this, null, _accountsRegister_decorators, { kind: "method", name: "accountsRegister", static: false, private: false, access: { has: obj => "accountsRegister" in obj, get: obj => obj.accountsRegister }, metadata: _metadata }, null, _instanceExtraInitializers);
90
+ __esDecorate(this, null, _accountsLogin_decorators, { kind: "method", name: "accountsLogin", static: false, private: false, access: { has: obj => "accountsLogin" in obj, get: obj => obj.accountsLogin }, metadata: _metadata }, null, _instanceExtraInitializers);
91
+ __esDecorate(this, null, _accountsWhoami_decorators, { kind: "method", name: "accountsWhoami", static: false, private: false, access: { has: obj => "accountsWhoami" in obj, get: obj => obj.accountsWhoami }, metadata: _metadata }, null, _instanceExtraInitializers);
92
+ __esDecorate(this, null, _accountsClaimSessions_decorators, { kind: "method", name: "accountsClaimSessions", static: false, private: false, access: { has: obj => "accountsClaimSessions" in obj, get: obj => obj.accountsClaimSessions }, metadata: _metadata }, null, _instanceExtraInitializers);
93
+ __esDecorate(this, null, _accountsOwnedSessions_decorators, { kind: "method", name: "accountsOwnedSessions", static: false, private: false, access: { has: obj => "accountsOwnedSessions" in obj, get: obj => obj.accountsOwnedSessions }, metadata: _metadata }, null, _instanceExtraInitializers);
94
+ __esDecorate(this, null, _accountsListOwnership_decorators, { kind: "method", name: "accountsListOwnership", static: false, private: false, access: { has: obj => "accountsListOwnership" in obj, get: obj => obj.accountsListOwnership }, metadata: _metadata }, null, _instanceExtraInitializers);
95
+ __esDecorate(this, null, _describe_decorators, { kind: "method", name: "describe", static: false, private: false, access: { has: obj => "describe" in obj, get: obj => obj.describe }, metadata: _metadata }, null, _instanceExtraInitializers);
96
+ __esDecorate(this, null, _secureSession_decorators, { kind: "method", name: "secureSession", static: false, private: false, access: { has: obj => "secureSession" in obj, get: obj => obj.secureSession }, metadata: _metadata }, null, _instanceExtraInitializers);
97
+ __esDecorate(this, null, _sources_decorators, { kind: "method", name: "sources", static: false, private: false, access: { has: obj => "sources" in obj, get: obj => obj.sources }, metadata: _metadata }, null, _instanceExtraInitializers);
98
+ __esDecorate(this, null, _readSourceFile_decorators, { kind: "method", name: "readSourceFile", static: false, private: false, access: { has: obj => "readSourceFile" in obj, get: obj => obj.readSourceFile }, metadata: _metadata }, null, _instanceExtraInitializers);
99
+ if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
100
+ }
101
+ static inject = inject;
102
+ static Config = ConfigSchema;
103
+ source = __runInitializers(this, _instanceExtraInitializers);
104
+ logger;
105
+ admission;
106
+ provenance;
107
+ accounts;
108
+ accountsOptions;
109
+ launchToken;
110
+ webServer;
111
+ disposeRoute;
112
+ routeKey;
113
+ constructor(ctx, entry = {}) {
114
+ super(ctx, "qaSurface", { namespace: "qaSurface" });
115
+ const resolvedEntry = resolveConfig(entry);
116
+ this.source = () => resolvedEntry;
117
+ this.logger = getPluginLogger({
118
+ pluginId: "dsh-qa-surface",
119
+ consoleSink: createHostLoggerSink(ctx.logger),
120
+ });
121
+ this.admission = new QaPolicyAdmission(ctx, () => this.getConfig(), this.logger,
122
+ // Identity half of admission; no-ops while accounts stay disabled.
123
+ {
124
+ enforceSessionAccess: (token, sessionId) => {
125
+ this.accountsFor(this.getConfig())?.ensureSessionAccess(token, sessionId);
126
+ },
127
+ });
128
+ this.provenance = new QaProvenanceHost(ctx, () => this.getConfig());
129
+ // The /qa route hands cookie-less browsers to the one-time host token
130
+ // exchange; the proxy in the deploy kit does the same and either alone
131
+ // suffices. Resolved lazily and once per process; unavailable bridges
132
+ // warn once and leave the old marker hand-off in place.
133
+ this.launchToken = makeLaunchTokenSource(() => ctx.get("connection"), (message) => this.logger.warn("entry.token-bridge", { message }));
134
+ ctx.effect(() => async () => this.logger.close(), "dsh-qa-surface.logger");
135
+ ctx.effect(() => () => this.admission.dispose(), "dsh-qa-surface.lockdown-policies");
136
+ ctx.effect(() => () => this.provenance.dispose(), "dsh-qa-surface.provenance");
137
+ // The root index gains one head script: non-loopback hostnames continue
138
+ // into /qa, the loopback operator keeps the full harness UI.
139
+ ctx.on("webserver/index-inject", (table) => {
140
+ const row = entryRedirectRow(this.getConfig());
141
+ if (row !== undefined)
142
+ table.push(row);
143
+ });
144
+ ctx.inject(["settings"], (settingsCtx) => {
145
+ settingsCtx.settings.installSection(ctx, QA_SURFACE_SETTINGS_NAMESPACE, ConfigSchema, entry, {
146
+ setSource: (source) => {
147
+ this.source = source;
148
+ },
149
+ onChange: () => {
150
+ const config = this.getConfig();
151
+ this.refreshRoute();
152
+ this.logger.info("config.updated", {
153
+ enabled: config.enabled,
154
+ route: config.route.path,
155
+ sessionPolicy: config.session.policy,
156
+ });
157
+ },
158
+ validate: (value) => {
159
+ resolveConfig(value);
160
+ },
161
+ });
162
+ });
163
+ ctx.inject(["webServer"], (webContext) => {
164
+ this.webServer = webContext.webServer;
34
165
  this.refreshRoute();
35
- this.logger.info("config.updated", {
36
- enabled: config.enabled,
37
- route: config.route.path,
38
- sessionPolicy: config.session.policy,
166
+ webContext.effect(() => () => {
167
+ this.disposeRoute?.();
168
+ this.disposeRoute = undefined;
169
+ this.routeKey = undefined;
170
+ this.webServer = undefined;
171
+ }, "dsh-qa-surface.navigation-route");
172
+ });
173
+ this.logger.info("plugin.ready", {
174
+ enabled: resolvedEntry.enabled,
175
+ route: resolvedEntry.route.path,
176
+ sessionPolicy: resolvedEntry.session.policy,
177
+ });
178
+ }
179
+ getConfig() {
180
+ return resolveConfig(this.source());
181
+ }
182
+ /**
183
+ * The accounts store behind the runtime toggle. Rebuilt only when the
184
+ * account-affecting options change; the file is shared across rebuilds.
185
+ */
186
+ accountsFor(config) {
187
+ if (!config.accounts.enabled)
188
+ return undefined;
189
+ const options = JSON.stringify([
190
+ config.accounts.sessionTtlDays,
191
+ config.accounts.allowRegistration,
192
+ ]);
193
+ if (this.accounts === undefined || this.accountsOptions !== options) {
194
+ this.accounts = new QaAccounts(defaultAccountsFilePath(), {
195
+ sessionTtlDays: config.accounts.sessionTtlDays,
196
+ allowRegistration: config.accounts.allowRegistration,
39
197
  });
40
- },
41
- validate: (value) => {
42
- resolveConfig(value);
43
- },
44
- });
45
- ctx.inject(["webServer"], (webContext) => {
46
- this.webServer = webContext.webServer;
47
- this.refreshRoute();
48
- webContext.effect(() => () => {
49
- this.disposeRoute?.();
50
- this.disposeRoute = undefined;
51
- this.routeKey = undefined;
52
- this.webServer = undefined;
53
- }, "dsh-qa-surface.navigation-route");
54
- });
55
- this.logger.info("plugin.ready", {
56
- enabled: resolvedEntry.enabled,
57
- route: resolvedEntry.route.path,
58
- sessionPolicy: resolvedEntry.session.policy,
59
- });
60
- }
61
- getConfig() {
62
- return resolveConfig(this.source());
63
- }
64
- refreshRoute() {
65
- const config = this.getConfig();
66
- const key = config.enabled
67
- ? `${config.route.path}:${config.route.matchChildren}`
68
- : undefined;
69
- if (key === this.routeKey)
70
- return;
71
- this.disposeRoute?.();
72
- this.disposeRoute = undefined;
73
- this.routeKey = undefined;
74
- if (key === undefined || this.webServer === undefined)
75
- return;
76
- this.disposeRoute = registerQaNavigationRoute(this.webServer, config);
77
- this.routeKey = key;
78
- }
79
- }
198
+ this.accountsOptions = options;
199
+ }
200
+ return this.accounts;
201
+ }
202
+ /** The accounts store, or the disabled refusal the browser maps to copy. */
203
+ requireAccounts() {
204
+ const accounts = this.accountsFor(this.getConfig());
205
+ if (accounts === undefined) {
206
+ throw new Error(ACCOUNTS_DISABLED_ERROR);
207
+ }
208
+ return accounts;
209
+ }
210
+ /** Account failures ride the shared `(reason: <code>)` wire marker. */
211
+ accountsRemote(operation, sessionIdForLog) {
212
+ try {
213
+ return operation();
214
+ }
215
+ catch (error) {
216
+ if (error instanceof QaAccountsError) {
217
+ this.logger.warn("accounts.rejected", {
218
+ reason: error.reason,
219
+ sessionId: sessionIdForLog,
220
+ });
221
+ throw new Error(`QA accounts refused the request (reason: ${error.reason})`, {
222
+ cause: error,
223
+ });
224
+ }
225
+ throw error;
226
+ }
227
+ }
228
+ /**
229
+ * Self-service signup; the first account ever created becomes admin. The
230
+ * display name derives from the email: the generated client enforces exact
231
+ * wire arity, so an optional name parameter would still be required.
232
+ */
233
+ accountsRegister(email, password) {
234
+ const accounts = this.requireAccounts();
235
+ return this.accountsRemote(() => accounts.register(email, password));
236
+ }
237
+ accountsLogin(email, password) {
238
+ const accounts = this.requireAccounts();
239
+ return this.accountsRemote(() => accounts.login(email, password));
240
+ }
241
+ /** Identity probe; safe to call with an empty or expired token. */
242
+ accountsWhoami(token) {
243
+ if (!this.getConfig().accounts.enabled)
244
+ return { authenticated: false };
245
+ const accounts = this.requireAccounts();
246
+ return this.accountsRemote(() => accounts.whoami(token));
247
+ }
248
+ /** Migrate a browser's local chat index into server-side ownership. */
249
+ accountsClaimSessions(token, sessionIds) {
250
+ const accounts = this.requireAccounts();
251
+ return this.accountsRemote(() => accounts.claimSessions(token, sessionIds));
252
+ }
253
+ /** The token user's owned session ids; the sidebar list authority. */
254
+ accountsOwnedSessions(token) {
255
+ if (!this.getConfig().accounts.enabled)
256
+ return { ids: [] };
257
+ const accounts = this.requireAccounts();
258
+ return this.accountsRemote(() => ({
259
+ ids: accounts.ownedSessionIds(token),
260
+ }));
261
+ }
262
+ /**
263
+ * Every chat-ownership entry with owner display names; the cross-user view
264
+ * admin browsers group the sidebar by. Ordinary accounts are refused with
265
+ * the dedicated reason, anonymous ones with auth-required.
266
+ */
267
+ accountsListOwnership(token) {
268
+ if (!this.getConfig().accounts.enabled)
269
+ return { entries: [] };
270
+ const accounts = this.requireAccounts();
271
+ return this.accountsRemote(() => ({
272
+ entries: accounts.listOwnership(token),
273
+ }));
274
+ }
275
+ /**
276
+ * Serve the effective QA configuration to the browser. The DSH gateway pins
277
+ * settings RPCs to loopback, so a browser served over the LAN always sees
278
+ * the settings namespace as unavailable; this method is the config channel
279
+ * such a browser falls back to. It is read-only projection — the admission
280
+ * boundary stays in {@link secureSession}.
281
+ */
282
+ describe() {
283
+ return this.getConfig();
284
+ }
285
+ /** Pin and attest the effective policy. The browser supplies identity only. */
286
+ secureSession(token, sessionId) {
287
+ try {
288
+ return this.admission.secureSession(token, sessionId);
289
+ }
290
+ catch (error) {
291
+ // The carrier empties error.details, so the coarse reason rides the
292
+ // wire message for the browser console; the specific mismatch facts
293
+ // stay in this log only.
294
+ const reason = error instanceof QaAttestationError
295
+ ? error.reason
296
+ : (ACCOUNTS_REASON_MARKER.exec(error instanceof Error ? error.message : "")?.at(1) ?? "attestation-failed");
297
+ this.logger.error("lockdown.rejected", {
298
+ sessionId,
299
+ reason,
300
+ error: error instanceof Error ? error.message : String(error),
301
+ });
302
+ throw new Error(`${CONFIGURATION_ERROR} (reason: ${reason})`, {
303
+ cause: error,
304
+ });
305
+ }
306
+ }
307
+ /** Return canonical Host snapshots; replay is rebuilt from qa/sources events. */
308
+ sources(token, sessionId) {
309
+ this.admission.secureSession(token, sessionId);
310
+ return this.provenance.bundles(sessionId);
311
+ }
312
+ /** Narrow read-only preview capability for files already present as sources. */
313
+ async readSourceFile(token, sessionId, sourcePath) {
314
+ this.admission.secureSession(token, sessionId);
315
+ const config = this.getConfig().sources.filePreview;
316
+ if (!config.enabled ||
317
+ !this.provenance.sourceAllowed(sessionId, sourcePath)) {
318
+ throw new Error("Source preview is unavailable.");
319
+ }
320
+ const agent = this.ctx.agents.get((await import("@deepseek-ai/dsh-session/types")).SessionId(sessionId));
321
+ const root = agent?.session.header.cwd;
322
+ if (root === undefined)
323
+ throw new Error("Source preview is unavailable.");
324
+ try {
325
+ return await readSourceFilePreview({
326
+ root,
327
+ sourcePath,
328
+ maxBytes: config.maxBytes,
329
+ maxMarkdownRenderBytes: config.maxMarkdownRenderBytes,
330
+ });
331
+ }
332
+ catch {
333
+ throw new Error("Source preview is unavailable.");
334
+ }
335
+ }
336
+ refreshRoute() {
337
+ const config = this.getConfig();
338
+ const key = config.enabled
339
+ ? `${config.route.path}:${config.route.matchChildren}`
340
+ : undefined;
341
+ if (key === this.routeKey)
342
+ return;
343
+ this.disposeRoute?.();
344
+ this.disposeRoute = undefined;
345
+ this.routeKey = undefined;
346
+ if (key === undefined || this.webServer === undefined)
347
+ return;
348
+ this.disposeRoute = registerQaNavigationRoute(this.webServer, config, {
349
+ launchToken: this.launchToken,
350
+ });
351
+ this.routeKey = key;
352
+ }
353
+ };
354
+ })();
355
+ export { QaSurface };
80
356
  export { ConfigSchema, DEFAULT_QA_SURFACE_CONFIG, normalizeRoutePath, resolveConfig, } from "./config.js";
357
+ export { QaAttestationError } from "./attestation.js";
358
+ export { QaAccounts, QaAccountsError } from "./accounts/store.js";
359
+ export { entryRedirectRow, entryRedirectScript } from "./entry-redirect.js";
81
360
  export { registerQaNavigationRoute } from "./host-route.js";
361
+ export { qaToolDenial, qaToolPolicyPlan } from "./lockdown-policy.js";
362
+ export { QaPolicyAdmission } from "./secure-session.js";
363
+ export * from "./provenance/index.js";
82
364
  export default QaSurface;
83
365
  //# sourceMappingURL=index.js.map
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Resolve the launch token once per process (it is stable for the process
3
+ * lifetime); a missing connection service or an unusable answer warns once
4
+ * and permanently disables the bridge instead of retrying per request.
5
+ */
6
+ export function makeLaunchTokenSource(getConnection, warn) {
7
+ let cached = null;
8
+ let warned = false;
9
+ const warnOnce = (message) => {
10
+ if (warned)
11
+ return;
12
+ warned = true;
13
+ warn(message);
14
+ };
15
+ return () => {
16
+ if (cached !== null)
17
+ return cached;
18
+ try {
19
+ const connection = getConnection();
20
+ if (connection === undefined ||
21
+ typeof connection.authenticatedUrl !== "function") {
22
+ warnOnce("launch-token bridge inactive: no connection.authenticatedUrl on the host");
23
+ cached = undefined;
24
+ return cached;
25
+ }
26
+ // The loopback base only feeds the URL parsing; host/scheme are dropped.
27
+ const token = new URL(connection.authenticatedUrl("http://127.0.0.1")).searchParams.get("token");
28
+ if (token === null || token === "") {
29
+ warnOnce("launch-token bridge inactive: authenticatedUrl carries no token");
30
+ cached = undefined;
31
+ return cached;
32
+ }
33
+ cached = token;
34
+ }
35
+ catch (error) {
36
+ warnOnce(`launch-token bridge failed: ${error instanceof Error ? error.message : String(error)}`);
37
+ cached = undefined;
38
+ }
39
+ return cached;
40
+ };
41
+ }
42
+ //# sourceMappingURL=launch-token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launch-token.js","sourceRoot":"","sources":["../src/launch-token.ts"],"names":[],"mappings":"AAeA;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CACnC,aAAqD,EACrD,IAA+B;IAE/B,IAAI,MAAM,GAA8B,IAAI,CAAC;IAC7C,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,MAAM,QAAQ,GAAG,CAAC,OAAe,EAAQ,EAAE;QACzC,IAAI,MAAM;YAAE,OAAO;QACnB,MAAM,GAAG,IAAI,CAAC;QACd,IAAI,CAAC,OAAO,CAAC,CAAC;IAChB,CAAC,CAAC;IACF,OAAO,GAAG,EAAE;QACV,IAAI,MAAM,KAAK,IAAI;YAAE,OAAO,MAAM,CAAC;QACnC,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;YACnC,IACE,UAAU,KAAK,SAAS;gBACxB,OAAO,UAAU,CAAC,gBAAgB,KAAK,UAAU,EACjD,CAAC;gBACD,QAAQ,CACN,0EAA0E,CAC3E,CAAC;gBACF,MAAM,GAAG,SAAS,CAAC;gBACnB,OAAO,MAAM,CAAC;YAChB,CAAC;YACD,yEAAyE;YACzE,MAAM,KAAK,GAAG,IAAI,GAAG,CACnB,UAAU,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,CAChD,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC5B,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;gBACnC,QAAQ,CACN,iEAAiE,CAClE,CAAC;gBACF,MAAM,GAAG,SAAS,CAAC;gBACnB,OAAO,MAAM,CAAC;YAChB,CAAC;YACD,MAAM,GAAG,KAAK,CAAC;QACjB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,QAAQ,CACN,+BAA+B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACxF,CAAC;YACF,MAAM,GAAG,SAAS,CAAC;QACrB,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,20 @@
1
+ const TOOL_DENIAL = "This tool is not available in the QA execution profile.";
2
+ /**
3
+ * Validate an allow-list against the complete agent-scoped view.
4
+ *
5
+ * Preset tools live on an ancestor scope, not necessarily in the global tool
6
+ * layer. The restriction must therefore retain the configured names verbatim;
7
+ * deriving it from the global view would hide every preset-owned tool after a
8
+ * successful first attestation and make the next attestation fail.
9
+ */
10
+ export function qaToolPolicyPlan(allow, isMounted) {
11
+ return {
12
+ allow: [...allow],
13
+ unknown: allow.filter((toolName) => !isMounted(toolName)),
14
+ };
15
+ }
16
+ /** Monotonic execution decision shared by inherited, scoped and transport tools. */
17
+ export function qaToolDenial(allowed, toolName) {
18
+ return allowed.has(toolName) ? undefined : TOOL_DENIAL;
19
+ }
20
+ //# sourceMappingURL=lockdown-policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lockdown-policy.js","sourceRoot":"","sources":["../src/lockdown-policy.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,GAAG,yDAAyD,CAAC;AAS9E;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAC9B,KAAwB,EACxB,SAAwC;IAExC,OAAO;QACL,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC;QACjB,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;KAC1D,CAAC;AACJ,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,YAAY,CAC1B,OAA4B,EAC5B,QAAgB;IAEhB,OAAO,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC;AACzD,CAAC"}
@@ -0,0 +1,40 @@
1
+ import { dedupeAndRankSources } from "./dedupe.js";
2
+ /** Mutable turn-local accumulator; snapshots are immutable plain data. */
3
+ export class QaSourceCollector {
4
+ options;
5
+ collected = [];
6
+ incompleteOrigins = [];
7
+ threshold;
8
+ constructor(options) {
9
+ this.options = options;
10
+ this.threshold = options.displayScoreThreshold ?? 50;
11
+ }
12
+ observe(context) {
13
+ this.collected.push(...this.options.registry.extract(context));
14
+ }
15
+ add(sources) {
16
+ this.collected.push(...sources);
17
+ }
18
+ markIncomplete(origin) {
19
+ this.incompleteOrigins.push({ ...origin });
20
+ }
21
+ snapshot() {
22
+ const ranked = dedupeAndRankSources(this.collected, this.options.mergeFileRanges === undefined
23
+ ? {}
24
+ : { mergeFileRanges: this.options.mergeFileRanges });
25
+ const sources = ranked.filter((source) => source.evidence !== "discovered" && source.score >= this.threshold);
26
+ const discovered = ranked.filter((source) => !sources.includes(source));
27
+ return {
28
+ version: 1,
29
+ sessionId: this.options.sessionId,
30
+ turn: this.options.turn,
31
+ sources,
32
+ ...(discovered.length === 0 ? {} : { discovered }),
33
+ complete: this.incompleteOrigins.length === 0,
34
+ ...(this.incompleteOrigins.length === 0
35
+ ? {}
36
+ : { incompleteOrigins: [...this.incompleteOrigins] }),
37
+ };
38
+ }
39
+ }
40
+ //# sourceMappingURL=collector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collector.js","sourceRoot":"","sources":["../../src/provenance/collector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAgBnD,0EAA0E;AAC1E,MAAM,OAAO,iBAAiB;IASC,OAAO;IARnB,SAAS,GAAwB,EAAE,CAAC;IACpC,iBAAiB,GAI5B,EAAE,CAAC;IACQ,SAAS,CAAS;IAEnC,YAA6B,OAAiC;uBAAjC,OAAO;QAClC,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,qBAAqB,IAAI,EAAE,CAAC;IACvD,CAAC;IAED,OAAO,CAAC,OAA+B;QACrC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;IACjE,CAAC;IAED,GAAG,CAAC,OAAqC;QACvC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC;IAClC,CAAC;IAED,cAAc,CAAC,MAId;QACC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,QAAQ;QACN,MAAM,MAAM,GAAG,oBAAoB,CACjC,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,OAAO,CAAC,eAAe,KAAK,SAAS;YACxC,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,EAAE,eAAe,EAAE,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CACtD,CAAC;QACF,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAC3B,CAAC,MAAM,EAAE,EAAE,CACT,MAAM,CAAC,QAAQ,KAAK,YAAY,IAAI,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,SAAS,CACrE,CAAC;QACF,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QACxE,OAAO;YACL,OAAO,EAAE,CAAC;YACV,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS;YACjC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI;YACvB,OAAO;YACP,GAAG,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC;YAClD,QAAQ,EAAE,IAAI,CAAC,iBAAiB,CAAC,MAAM,KAAK,CAAC;YAC7C,GAAG,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAM,KAAK,CAAC;gBACrC,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,EAAE,iBAAiB,EAAE,CAAC,GAAG,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC;SACxD,CAAC;IACJ,CAAC;CACF"}