@yadsh/dsh-qa-surface 0.2.0 → 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 (161) hide show
  1. package/CHANGELOG.md +84 -1
  2. package/README.md +87 -12
  3. package/compatibility.json +11 -3
  4. package/docs/ARCHITECTURE.md +1 -1
  5. package/docs/COMPATIBILITY.md +1 -1
  6. package/docs/CONFIGURATION.md +88 -1
  7. package/docs/SOURCES-MIGRATION.md +28 -0
  8. package/docs/SOURCES-PROVENANCE-AUDIT.md +88 -0
  9. package/docs/SPEC-dsh-qa-surface-accounts.md +219 -0
  10. package/docs/SPEC-dsh-qa-surface-sources-provenance.md +1692 -0
  11. package/lib/accounts/index.js +2 -0
  12. package/lib/accounts/index.js.map +1 -0
  13. package/lib/accounts/store.js +478 -0
  14. package/lib/accounts/store.js.map +1 -0
  15. package/lib/attestation.js.map +1 -1
  16. package/lib/cli.js +143 -0
  17. package/lib/cli.js.map +1 -0
  18. package/lib/client/QaAccountsController.js +329 -0
  19. package/lib/client/QaAccountsController.js.map +1 -0
  20. package/lib/client/QaSessionController.js +203 -127
  21. package/lib/client/QaSessionController.js.map +1 -1
  22. package/lib/client/QaSurface.js +234 -72
  23. package/lib/client/QaSurface.js.map +1 -1
  24. package/lib/client/QaTranscriptAdapter.js +27 -241
  25. package/lib/client/QaTranscriptAdapter.js.map +1 -1
  26. package/lib/client/attestation.js +6 -0
  27. package/lib/client/attestation.js.map +1 -1
  28. package/lib/client/components/Markdown.js +54 -13
  29. package/lib/client/components/Markdown.js.map +1 -1
  30. package/lib/client/components/QaAuthGate.js +40 -0
  31. package/lib/client/components/QaAuthGate.js.map +1 -0
  32. package/lib/client/components/QaChangelog.js +112 -0
  33. package/lib/client/components/QaChangelog.js.map +1 -0
  34. package/lib/client/components/QaMessage.js +47 -17
  35. package/lib/client/components/QaMessage.js.map +1 -1
  36. package/lib/client/components/QaSidebar.js +63 -20
  37. package/lib/client/components/QaSidebar.js.map +1 -1
  38. package/lib/client/components/QaSourcesDrawer.js +113 -32
  39. package/lib/client/components/QaSourcesDrawer.js.map +1 -1
  40. package/lib/client/components/QaTurnRail.js +281 -0
  41. package/lib/client/components/QaTurnRail.js.map +1 -0
  42. package/lib/client/components/QaWelcomeNotice.js +125 -0
  43. package/lib/client/components/QaWelcomeNotice.js.map +1 -0
  44. package/lib/client/components/QaWidthHandle.js +142 -0
  45. package/lib/client/components/QaWidthHandle.js.map +1 -0
  46. package/lib/client/components/source-refs.js +78 -0
  47. package/lib/client/components/source-refs.js.map +1 -0
  48. package/lib/client/create-session.js +51 -0
  49. package/lib/client/create-session.js.map +1 -0
  50. package/lib/client/index.js +100 -12
  51. package/lib/client/index.js.map +1 -1
  52. package/lib/client/project-session-state.js +78 -0
  53. package/lib/client/project-session-state.js.map +1 -0
  54. package/lib/client/session-admission.js +38 -0
  55. package/lib/client/session-admission.js.map +1 -0
  56. package/lib/client/session-assets.js +52 -0
  57. package/lib/client/session-assets.js.map +1 -0
  58. package/lib/client/session-sources.js +61 -0
  59. package/lib/client/session-sources.js.map +1 -0
  60. package/lib/client/settlement.js +24 -0
  61. package/lib/client/settlement.js.map +1 -0
  62. package/lib/client/styles.js +151 -9
  63. package/lib/client/styles.js.map +1 -1
  64. package/lib/client/tool-presentation.js +102 -0
  65. package/lib/client/tool-presentation.js.map +1 -0
  66. package/lib/client/turn-sources.js +98 -0
  67. package/lib/client/turn-sources.js.map +1 -0
  68. package/lib/client/types.js +2 -0
  69. package/lib/client/types.js.map +1 -1
  70. package/lib/client/use-session-ui-state.js +68 -0
  71. package/lib/client/use-session-ui-state.js.map +1 -0
  72. package/lib/client/use-transcript-view.js +44 -0
  73. package/lib/client/use-transcript-view.js.map +1 -0
  74. package/lib/client.js +4649 -861
  75. package/lib/client.js.map +1 -1
  76. package/lib/config.js +218 -102
  77. package/lib/config.js.map +1 -1
  78. package/lib/entry-redirect.js +44 -0
  79. package/lib/entry-redirect.js.map +1 -0
  80. package/lib/host-route.js +25 -1
  81. package/lib/host-route.js.map +1 -1
  82. package/lib/index.js +209 -23
  83. package/lib/index.js.map +1 -1
  84. package/lib/launch-token.js +42 -0
  85. package/lib/launch-token.js.map +1 -0
  86. package/lib/provenance/collector.js +40 -0
  87. package/lib/provenance/collector.js.map +1 -0
  88. package/lib/provenance/connectors.js +147 -0
  89. package/lib/provenance/connectors.js.map +1 -0
  90. package/lib/provenance/dedupe.js +89 -0
  91. package/lib/provenance/dedupe.js.map +1 -0
  92. package/lib/provenance/extractors.js +340 -0
  93. package/lib/provenance/extractors.js.map +1 -0
  94. package/lib/provenance/file-preview.js +39 -0
  95. package/lib/provenance/file-preview.js.map +1 -0
  96. package/lib/provenance/host-store.js +387 -0
  97. package/lib/provenance/host-store.js.map +1 -0
  98. package/lib/provenance/index.js +9 -0
  99. package/lib/provenance/index.js.map +1 -0
  100. package/lib/provenance/normalize.js +128 -0
  101. package/lib/provenance/normalize.js.map +1 -0
  102. package/lib/provenance/reported.js +53 -0
  103. package/lib/provenance/reported.js.map +1 -0
  104. package/lib/provenance/types.js +2 -0
  105. package/lib/provenance/types.js.map +1 -0
  106. package/lib/resolve-config.js +161 -0
  107. package/lib/resolve-config.js.map +1 -1
  108. package/lib/secure-session.js +50 -8
  109. package/lib/secure-session.js.map +1 -1
  110. package/lib/typert.host.js +599 -6
  111. package/lib/typert.remote-client.d.ts +19 -3
  112. package/lib/typert.remote-client.js +471 -3
  113. package/lib/types/accounts/index.d.ts +2 -0
  114. package/lib/types/accounts/store.d.ts +121 -0
  115. package/lib/types/attestation.d.ts +1 -1
  116. package/lib/types/cli.d.ts +9 -0
  117. package/lib/types/client/QaAccountsController.d.ts +95 -0
  118. package/lib/types/client/QaConfigController.d.ts +1 -1
  119. package/lib/types/client/QaSessionController.d.ts +46 -7
  120. package/lib/types/client/QaSurface.d.ts +8 -3
  121. package/lib/types/client/QaTranscriptAdapter.d.ts +5 -10
  122. package/lib/types/client/components/Markdown.d.ts +11 -1
  123. package/lib/types/client/components/QaAgentsDrawer.d.ts +1 -1
  124. package/lib/types/client/components/QaAuthGate.d.ts +15 -0
  125. package/lib/types/client/components/QaChangelog.d.ts +21 -0
  126. package/lib/types/client/components/QaMessage.d.ts +10 -3
  127. package/lib/types/client/components/QaSidebar.d.ts +30 -2
  128. package/lib/types/client/components/QaSourcesDrawer.d.ts +15 -3
  129. package/lib/types/client/components/QaTurnRail.d.ts +59 -0
  130. package/lib/types/client/components/QaWelcomeNotice.d.ts +27 -0
  131. package/lib/types/client/components/QaWidthHandle.d.ts +36 -0
  132. package/lib/types/client/components/source-refs.d.ts +16 -0
  133. package/lib/types/client/create-session.d.ts +16 -0
  134. package/lib/types/client/index.d.ts +1 -0
  135. package/lib/types/client/project-session-state.d.ts +30 -0
  136. package/lib/types/client/session-admission.d.ts +23 -0
  137. package/lib/types/client/session-assets.d.ts +20 -0
  138. package/lib/types/client/session-sources.d.ts +28 -0
  139. package/lib/types/client/settlement.d.ts +6 -0
  140. package/lib/types/client/tool-presentation.d.ts +6 -0
  141. package/lib/types/client/turn-sources.d.ts +14 -0
  142. package/lib/types/client/types.d.ts +73 -9
  143. package/lib/types/client/use-session-ui-state.d.ts +35 -0
  144. package/lib/types/client/use-transcript-view.d.ts +20 -0
  145. package/lib/types/entry-redirect.d.ts +20 -0
  146. package/lib/types/host-route.d.ts +14 -1
  147. package/lib/types/index.d.ts +47 -3
  148. package/lib/types/launch-token.d.ts +21 -0
  149. package/lib/types/provenance/collector.d.ts +26 -0
  150. package/lib/types/provenance/connectors.d.ts +11 -0
  151. package/lib/types/provenance/dedupe.d.ts +6 -0
  152. package/lib/types/provenance/extractors.d.ts +14 -0
  153. package/lib/types/provenance/file-preview.d.ts +10 -0
  154. package/lib/types/provenance/host-store.d.ts +54 -0
  155. package/lib/types/provenance/index.d.ts +10 -0
  156. package/lib/types/provenance/normalize.d.ts +13 -0
  157. package/lib/types/provenance/reported.d.ts +5 -0
  158. package/lib/types/provenance/types.d.ts +78 -0
  159. package/lib/types/secure-session.d.ts +11 -2
  160. package/lib/types/types.d.ts +167 -11
  161. package/package.json +58 -41
package/lib/index.js CHANGED
@@ -33,36 +33,69 @@ var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn,
33
33
  done = true;
34
34
  };
35
35
  import { Remote, TypertRemoteService } from "@deepseek-ai/dsh-typert-protocol";
36
- import { installSettingsSection, settingsNamespace, } from "@deepseek-ai/dsh-settings";
37
36
  import { createHostLoggerSink, getPluginLogger, } from "@yadsh/dsh-plugin-log";
38
37
  import { ConfigSchema, resolveConfig } from "./config.js";
38
+ import { QaAccounts, QaAccountsError, defaultAccountsFilePath, } from "./accounts/store.js";
39
39
  import { QaAttestationError } from "./attestation.js";
40
+ import { entryRedirectRow } from "./entry-redirect.js";
40
41
  import { registerQaNavigationRoute } from "./host-route.js";
42
+ import { makeLaunchTokenSource } from "./launch-token.js";
41
43
  import { QaPolicyAdmission } from "./secure-session.js";
44
+ import { QaProvenanceHost } from "./provenance/host-store.js";
45
+ import { readSourceFilePreview } from "./provenance/file-preview.js";
42
46
  export const name = "qa-surface";
43
47
  export const inject = [
44
48
  "agents",
49
+ "sessions",
45
50
  "agentPresets",
46
51
  "permissionPresets",
47
52
  "tools",
53
+ "systemPrompt",
48
54
  "workspaceRegistry",
49
55
  ];
50
- export const QA_SURFACE_SETTINGS_NAMESPACE = settingsNamespace("qa-surface");
56
+ export const QA_SURFACE_SETTINGS_NAMESPACE = "qa-surface";
51
57
  export const Config = ConfigSchema;
52
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;
53
62
  /** Host companion: validates config, owns the admission boundary and the route. */
54
63
  let QaSurface = (() => {
55
64
  let _classSuper = TypertRemoteService;
56
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;
57
72
  let _describe_decorators;
58
73
  let _secureSession_decorators;
74
+ let _sources_decorators;
75
+ let _readSourceFile_decorators;
59
76
  return class QaSurface extends _classSuper {
60
77
  static {
61
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")];
62
85
  _describe_decorators = [Remote("describe")];
63
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);
64
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);
65
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);
66
99
  if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
67
100
  }
68
101
  static inject = inject;
@@ -70,6 +103,10 @@ let QaSurface = (() => {
70
103
  source = __runInitializers(this, _instanceExtraInitializers);
71
104
  logger;
72
105
  admission;
106
+ provenance;
107
+ accounts;
108
+ accountsOptions;
109
+ launchToken;
73
110
  webServer;
74
111
  disposeRoute;
75
112
  routeKey;
@@ -81,25 +118,47 @@ let QaSurface = (() => {
81
118
  pluginId: "dsh-qa-surface",
82
119
  consoleSink: createHostLoggerSink(ctx.logger),
83
120
  });
84
- this.admission = new QaPolicyAdmission(ctx, () => this.getConfig(), this.logger);
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 }));
85
134
  ctx.effect(() => async () => this.logger.close(), "dsh-qa-surface.logger");
86
135
  ctx.effect(() => () => this.admission.dispose(), "dsh-qa-surface.lockdown-policies");
87
- installSettingsSection(ctx, QA_SURFACE_SETTINGS_NAMESPACE, ConfigSchema, entry, {
88
- setSource: (source) => {
89
- this.source = source;
90
- },
91
- onChange: () => {
92
- const config = this.getConfig();
93
- this.refreshRoute();
94
- this.logger.info("config.updated", {
95
- enabled: config.enabled,
96
- route: config.route.path,
97
- sessionPolicy: config.session.policy,
98
- });
99
- },
100
- validate: (value) => {
101
- resolveConfig(value);
102
- },
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
+ });
103
162
  });
104
163
  ctx.inject(["webServer"], (webContext) => {
105
164
  this.webServer = webContext.webServer;
@@ -120,6 +179,99 @@ let QaSurface = (() => {
120
179
  getConfig() {
121
180
  return resolveConfig(this.source());
122
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,
197
+ });
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
+ }
123
275
  /**
124
276
  * Serve the effective QA configuration to the browser. The DSH gateway pins
125
277
  * settings RPCs to loopback, so a browser served over the LAN always sees
@@ -131,9 +283,9 @@ let QaSurface = (() => {
131
283
  return this.getConfig();
132
284
  }
133
285
  /** Pin and attest the effective policy. The browser supplies identity only. */
134
- secureSession(sessionId) {
286
+ secureSession(token, sessionId) {
135
287
  try {
136
- return this.admission.secureSession(sessionId);
288
+ return this.admission.secureSession(token, sessionId);
137
289
  }
138
290
  catch (error) {
139
291
  // The carrier empties error.details, so the coarse reason rides the
@@ -141,7 +293,7 @@ let QaSurface = (() => {
141
293
  // stay in this log only.
142
294
  const reason = error instanceof QaAttestationError
143
295
  ? error.reason
144
- : "attestation-failed";
296
+ : (ACCOUNTS_REASON_MARKER.exec(error instanceof Error ? error.message : "")?.at(1) ?? "attestation-failed");
145
297
  this.logger.error("lockdown.rejected", {
146
298
  sessionId,
147
299
  reason,
@@ -152,6 +304,35 @@ let QaSurface = (() => {
152
304
  });
153
305
  }
154
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
+ }
155
336
  refreshRoute() {
156
337
  const config = this.getConfig();
157
338
  const key = config.enabled
@@ -164,7 +345,9 @@ let QaSurface = (() => {
164
345
  this.routeKey = undefined;
165
346
  if (key === undefined || this.webServer === undefined)
166
347
  return;
167
- this.disposeRoute = registerQaNavigationRoute(this.webServer, config);
348
+ this.disposeRoute = registerQaNavigationRoute(this.webServer, config, {
349
+ launchToken: this.launchToken,
350
+ });
168
351
  this.routeKey = key;
169
352
  }
170
353
  };
@@ -172,8 +355,11 @@ let QaSurface = (() => {
172
355
  export { QaSurface };
173
356
  export { ConfigSchema, DEFAULT_QA_SURFACE_CONFIG, normalizeRoutePath, resolveConfig, } from "./config.js";
174
357
  export { QaAttestationError } from "./attestation.js";
358
+ export { QaAccounts, QaAccountsError } from "./accounts/store.js";
359
+ export { entryRedirectRow, entryRedirectScript } from "./entry-redirect.js";
175
360
  export { registerQaNavigationRoute } from "./host-route.js";
176
361
  export { qaToolDenial, qaToolPolicyPlan } from "./lockdown-policy.js";
177
362
  export { QaPolicyAdmission } from "./secure-session.js";
363
+ export * from "./provenance/index.js";
178
364
  export default QaSurface;
179
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,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"}
@@ -0,0 +1,147 @@
1
+ import { canonicalizeUrl } from "./normalize.js";
2
+ function record(value) {
3
+ return typeof value === "object" && value !== null && !Array.isArray(value)
4
+ ? value
5
+ : undefined;
6
+ }
7
+ function records(value, depth = 0) {
8
+ if (depth > 4)
9
+ return [];
10
+ if (Array.isArray(value))
11
+ return value.flatMap((item) => records(item, depth + 1));
12
+ const item = record(value);
13
+ if (item === undefined)
14
+ return [];
15
+ return [
16
+ item,
17
+ ...Object.values(item).flatMap((child) => records(child, depth + 1)),
18
+ ];
19
+ }
20
+ function text(item, ...keys) {
21
+ for (const key of keys) {
22
+ const value = item[key];
23
+ if (typeof value === "string" && value.trim() !== "")
24
+ return value.trim();
25
+ }
26
+ return undefined;
27
+ }
28
+ function contextRecords(context) {
29
+ return [...records(context.presentation), ...records(context.result)];
30
+ }
31
+ function canonicalUri(item, urlOptions) {
32
+ const raw = text(item, "url", "uri", "webUrl", "browseUrl", "self");
33
+ if (raw === undefined)
34
+ return undefined;
35
+ return canonicalizeUrl(raw, urlOptions) ?? undefined;
36
+ }
37
+ export function createJiraExtractor(urlOptions = {}) {
38
+ return {
39
+ id: "structured-jira",
40
+ matches(context) {
41
+ return context.toolName.toLowerCase().includes("jira");
42
+ },
43
+ extract(context) {
44
+ const seen = new Set();
45
+ return contextRecords(context).flatMap((item) => {
46
+ const rawKey = text(item, "key", "issueKey", "issue_key");
47
+ const key = rawKey?.toUpperCase();
48
+ if (key === undefined ||
49
+ !/^[A-Z][A-Z0-9]+-\d+$/u.test(key) ||
50
+ seen.has(key))
51
+ return [];
52
+ seen.add(key);
53
+ const fields = record(item.fields);
54
+ const summary = text(item, "summary", "title") ??
55
+ (fields === undefined ? undefined : text(fields, "summary"));
56
+ const uri = canonicalUri(item, urlOptions);
57
+ return [
58
+ {
59
+ id: `jira:${key}`,
60
+ kind: "jira",
61
+ title: summary === undefined ? key : `${key} — ${summary}`,
62
+ ...(uri === undefined ? {} : { uri }),
63
+ locations: [{ jiraKey: key }],
64
+ evidence: "queried",
65
+ origins: [context.origin],
66
+ score: 90,
67
+ },
68
+ ];
69
+ });
70
+ },
71
+ };
72
+ }
73
+ export function createConfluenceExtractor(urlOptions = {}) {
74
+ return {
75
+ id: "structured-confluence",
76
+ matches(context) {
77
+ return context.toolName.toLowerCase().includes("confluence");
78
+ },
79
+ extract(context) {
80
+ const seen = new Set();
81
+ return contextRecords(context).flatMap((item) => {
82
+ const id = text(item, "pageId", "page_id", "contentId", "content_id") ??
83
+ (text(item, "type") === "page" ? text(item, "id") : undefined);
84
+ const title = text(item, "title", "name");
85
+ if (id === undefined || title === undefined || seen.has(id))
86
+ return [];
87
+ seen.add(id);
88
+ const uri = canonicalUri(item, urlOptions);
89
+ return [
90
+ {
91
+ id: `confluence:${id}`,
92
+ kind: "confluence",
93
+ title,
94
+ ...(uri === undefined ? {} : { uri }),
95
+ locations: [{ confluencePageId: id }],
96
+ evidence: "queried",
97
+ origins: [context.origin],
98
+ score: 90,
99
+ metadata: {
100
+ ...(text(item, "spaceKey", "space_key") === undefined
101
+ ? {}
102
+ : { spaceKey: text(item, "spaceKey", "space_key") ?? "" }),
103
+ },
104
+ },
105
+ ];
106
+ });
107
+ },
108
+ };
109
+ }
110
+ export function createKnowledgeExtractor(urlOptions = {}) {
111
+ return {
112
+ id: "structured-knowledge",
113
+ matches(context) {
114
+ const name = context.toolName.toLowerCase();
115
+ return (name.includes("knowledge") || /(?:^|[_:/.-])kb(?:$|[_:/.-])/u.test(name));
116
+ },
117
+ extract(context) {
118
+ const seen = new Set();
119
+ return contextRecords(context).flatMap((item) => {
120
+ const id = text(item, "documentId", "document_id", "docId", "doc_id");
121
+ const title = text(item, "title", "name");
122
+ if (id === undefined || title === undefined || seen.has(id))
123
+ return [];
124
+ seen.add(id);
125
+ const backend = text(item, "backend", "provider") ?? context.toolName;
126
+ const uri = canonicalUri(item, urlOptions);
127
+ return [
128
+ {
129
+ id: `knowledge:${backend}:${id}`,
130
+ kind: "knowledge",
131
+ title,
132
+ ...(uri === undefined ? {} : { uri }),
133
+ locations: [],
134
+ evidence: "queried",
135
+ origins: [context.origin],
136
+ score: 85,
137
+ metadata: { backend, documentId: id },
138
+ },
139
+ ];
140
+ });
141
+ },
142
+ };
143
+ }
144
+ export const jiraExtractor = createJiraExtractor();
145
+ export const confluenceExtractor = createConfluenceExtractor();
146
+ export const knowledgeExtractor = createKnowledgeExtractor();
147
+ //# sourceMappingURL=connectors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connectors.js","sourceRoot":"","sources":["../../src/provenance/connectors.ts"],"names":[],"mappings":"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"}