@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/cli.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,329 @@
1
+ /** The `(reason: <code>)` marker the Host folds into account wire failures. */
2
+ const ACCOUNTS_REASON_MARKER = /\(reason: ([a-z-]+)\)/u;
3
+ /** Union of the own chat ids and every mapped one, own ids first. */
4
+ function mergeOwnershipIds(ownedIds, ownership) {
5
+ if (ownership.length === 0)
6
+ return ownedIds;
7
+ return [
8
+ ...new Set([...ownedIds, ...ownership.map((entry) => entry.sessionId)]),
9
+ ];
10
+ }
11
+ /**
12
+ * Audience-safe copy for the coarse account refusal codes; anything unknown
13
+ * falls back to the generic line.
14
+ */
15
+ export function accountsErrorMessage(code) {
16
+ switch (code) {
17
+ case "invalid-credentials":
18
+ return "Неверный email или пароль.";
19
+ case "admin-required":
20
+ return "Недостаточно прав: действие доступно администратору.";
21
+ case "account-disabled":
22
+ return "Аккаунт отключён администратором.";
23
+ case "email-taken":
24
+ return "Этот email уже зарегистрирован.";
25
+ case "invalid-email":
26
+ return "Введите корректный email.";
27
+ case "weak-password":
28
+ return "Пароль должен быть не короче 8 символов.";
29
+ case "invalid-display-name":
30
+ return "Слишком длинное имя.";
31
+ case "registration-disabled":
32
+ return "Регистрация на этом сервере отключена.";
33
+ case "rate-limited":
34
+ return "Слишком много попыток. Подождите минуту.";
35
+ default:
36
+ return "Не удалось войти. Попробуйте ещё раз.";
37
+ }
38
+ }
39
+ /** Extract the coarse account reason code from a Host wire failure. */
40
+ export function accountsReasonOf(failure) {
41
+ const message = typeof failure === "object" && failure !== null && "message" in failure
42
+ ? String(failure.message ?? "")
43
+ : "";
44
+ return ACCOUNTS_REASON_MARKER.exec(message)?.at(1) ?? null;
45
+ }
46
+ /**
47
+ * Browser-side account lifecycle: token persistence, the checking → gate →
48
+ * authed state machine, and the ownership bookkeeping the sidebar list is
49
+ * built from. Anonymous/failed identity never blocks a deployment with
50
+ * accounts disabled — the caller simply does not mount this controller.
51
+ */
52
+ export class QaAccountsController {
53
+ options;
54
+ listeners = new Set();
55
+ snapshot = { stage: "checking" };
56
+ tokenValue = null;
57
+ disposed = false;
58
+ constructor(options) {
59
+ this.options = options;
60
+ }
61
+ getSnapshot = () => this.snapshot;
62
+ subscribe = (listener) => {
63
+ this.listeners.add(listener);
64
+ return () => this.listeners.delete(listener);
65
+ };
66
+ dispose() {
67
+ this.disposed = true;
68
+ this.listeners.clear();
69
+ }
70
+ /** The bearer token threaded into gated remotes; null while anonymous. */
71
+ /** The bearer token threaded into gated remotes; null while anonymous. */
72
+ token() {
73
+ return this.tokenValue;
74
+ }
75
+ /** Server-owned chat ids (empty until authed); falls back to nothing. */
76
+ ownedIds() {
77
+ return this.snapshot.stage === "authed" ? this.snapshot.ownedIds : [];
78
+ }
79
+ /** Boot probe: restore the stored token and ask the Host who it is. */
80
+ async start() {
81
+ if (this.disposed || this.snapshot.stage !== "checking")
82
+ return;
83
+ this.tokenValue = this.readStoredToken();
84
+ if (this.tokenValue === null) {
85
+ this.publish({ stage: "gate", mode: "login", busy: false, error: null });
86
+ return;
87
+ }
88
+ try {
89
+ const result = await this.options.remote.accountsWhoami(this.tokenValue);
90
+ if (this.disposed)
91
+ return;
92
+ if (result.ok && result.value.authenticated) {
93
+ await this.enterSession(this.tokenValue, result.value.user);
94
+ return;
95
+ }
96
+ if (result.ok) {
97
+ // A definite "not authenticated": the token is stale or rotated.
98
+ this.tokenValue = null;
99
+ this.clearStoredToken();
100
+ }
101
+ }
102
+ catch (error) {
103
+ // The connection is down or the Host refused the round trip; keep the
104
+ // token and the checking stage so a reconnect retries the probe.
105
+ console.warn("dsh-qa-surface: accounts whoami failed", error);
106
+ return;
107
+ }
108
+ if (this.disposed)
109
+ return;
110
+ this.publish({ stage: "gate", mode: "login", busy: false, error: null });
111
+ }
112
+ async login(email, password) {
113
+ await this.authenticate("login", () => this.options.remote.accountsLogin(email, password));
114
+ }
115
+ async register(email, password) {
116
+ if (this.snapshot.stage !== "gate")
117
+ return;
118
+ await this.authenticate("register", () => this.options.remote.accountsRegister(email, password));
119
+ }
120
+ setMode(mode) {
121
+ if (this.snapshot.stage !== "gate" || this.snapshot.busy)
122
+ return;
123
+ this.publish({ ...this.snapshot, mode, error: null });
124
+ }
125
+ /** Drop the token and return to the gate (logout or expired identity). */
126
+ signOut() {
127
+ this.tokenValue = null;
128
+ this.clearStoredToken();
129
+ this.publish({ stage: "gate", mode: "login", busy: false, error: null });
130
+ }
131
+ /** Claim one freshly created chat so the ownership map stays current. */
132
+ async claimNewSession(sessionId) {
133
+ if (this.tokenValue === null || this.disposed)
134
+ return;
135
+ try {
136
+ await this.options.remote.accountsClaimSessions(this.tokenValue, [
137
+ sessionId,
138
+ ]);
139
+ }
140
+ catch (error) {
141
+ console.warn("dsh-qa-surface: session claim failed", error);
142
+ }
143
+ }
144
+ async authenticate(mode, call) {
145
+ if (this.snapshot.stage !== "gate" || this.snapshot.busy || this.disposed) {
146
+ return;
147
+ }
148
+ this.publish({ ...this.snapshot, mode, busy: true, error: null });
149
+ try {
150
+ const result = await call();
151
+ if (this.disposed)
152
+ return;
153
+ if (!result.ok) {
154
+ const reason = accountsReasonOf(result.error);
155
+ // The gate keeps its inputs on a rejection; the copy is coarse.
156
+ this.publish({
157
+ stage: "gate",
158
+ mode,
159
+ busy: false,
160
+ error: accountsErrorMessage(reason),
161
+ });
162
+ return;
163
+ }
164
+ const { token, user } = result.value;
165
+ this.tokenValue = token;
166
+ this.saveStoredToken(token);
167
+ await this.enterSession(token, user);
168
+ }
169
+ catch (error) {
170
+ if (this.disposed)
171
+ return;
172
+ console.warn("dsh-qa-surface: account operation failed", error);
173
+ this.publish({
174
+ stage: "gate",
175
+ mode,
176
+ busy: false,
177
+ error: accountsErrorMessage(null),
178
+ });
179
+ }
180
+ }
181
+ /** Own the account, migrate the legacy index, then project authed. */
182
+ async enterSession(token, user) {
183
+ const migration = this.options.legacyChatIds?.() ?? [];
184
+ let ownedIds = [];
185
+ let ownership = [];
186
+ try {
187
+ const claimed = await this.options.remote.accountsClaimSessions(token, migration);
188
+ // Foreign chats disappear from this browser's index on purpose: their
189
+ // owner claimed them first.
190
+ for (const conflict of claimed.ok ? claimed.value.conflicts : []) {
191
+ this.options.forgetChat?.(conflict);
192
+ }
193
+ const ids = await this.options.remote.accountsOwnedSessions(token);
194
+ ownedIds = ids.ok ? ids.value.ids : [];
195
+ // The cross-user ownership view is a separate operator opt-in. A
196
+ // refusal only costs the grouping, never the admin's own chats.
197
+ if (user.role === "admin" &&
198
+ this.options.config().accounts.showOtherUsersChats) {
199
+ ownership = await this.fetchOwnership(token);
200
+ }
201
+ }
202
+ catch (error) {
203
+ console.warn("dsh-qa-surface: chat migration claim failed", error);
204
+ }
205
+ if (this.disposed)
206
+ return;
207
+ this.publish({
208
+ stage: "authed",
209
+ user,
210
+ ownedIds: mergeOwnershipIds(ownedIds, ownership),
211
+ ownership,
212
+ ownedRevision: 1,
213
+ });
214
+ }
215
+ /** Refresh the owned list after index changes; cheap enough to re-pull. */
216
+ async refreshOwned() {
217
+ if (this.tokenValue === null ||
218
+ this.disposed ||
219
+ this.snapshot.stage !== "authed") {
220
+ return;
221
+ }
222
+ try {
223
+ const ids = await this.options.remote.accountsOwnedSessions(this.tokenValue);
224
+ if (this.disposed || !ids.ok || this.snapshot.stage !== "authed")
225
+ return;
226
+ let ownership = this.snapshot.ownership;
227
+ if (this.snapshot.user.role === "admin" &&
228
+ this.options.config().accounts.showOtherUsersChats) {
229
+ ownership = await this.fetchOwnership(this.tokenValue);
230
+ if (this.disposed || this.snapshot.stage !== "authed")
231
+ return;
232
+ }
233
+ else {
234
+ ownership = [];
235
+ }
236
+ const ownedIds = mergeOwnershipIds(ids.value.ids, ownership);
237
+ if (JSON.stringify(ownedIds) === JSON.stringify(this.snapshot.ownedIds) &&
238
+ JSON.stringify(ownership) === JSON.stringify(this.snapshot.ownership)) {
239
+ return;
240
+ }
241
+ this.publish({
242
+ ...this.snapshot,
243
+ ownedIds,
244
+ ownership,
245
+ ownedRevision: this.snapshot.ownedRevision + 1,
246
+ });
247
+ }
248
+ catch (error) {
249
+ console.warn("dsh-qa-surface: owned sessions refresh failed", error);
250
+ }
251
+ }
252
+ /** The admin cross-user ownership view; failures degrade to an empty map. */
253
+ async fetchOwnership(token) {
254
+ try {
255
+ const listed = await this.options.remote.accountsListOwnership(token);
256
+ return listed.ok ? listed.value.entries : [];
257
+ }
258
+ catch (error) {
259
+ console.warn("dsh-qa-surface: ownership list failed", error);
260
+ return [];
261
+ }
262
+ }
263
+ /** Session id → owner display name; empty unless an admin is signed in. */
264
+ ownerNames() {
265
+ if (this.snapshot.stage !== "authed" ||
266
+ this.snapshot.user.role !== "admin" ||
267
+ !this.options.config().accounts.showOtherUsersChats) {
268
+ return new Map();
269
+ }
270
+ return new Map(this.snapshot.ownership.map((entry) => [
271
+ entry.sessionId,
272
+ entry.displayName,
273
+ ]));
274
+ }
275
+ /**
276
+ * The chat owner's display name for author labels: admins see it on
277
+ * foreign chats only; the owner themself and ordinary accounts see none.
278
+ */
279
+ messageAuthorOf(sessionId) {
280
+ if (this.snapshot.stage !== "authed" ||
281
+ this.snapshot.user.role !== "admin" ||
282
+ !this.options.config().accounts.showOtherUsersChats) {
283
+ return undefined;
284
+ }
285
+ const entry = this.snapshot.ownership.find((candidate) => candidate.sessionId === sessionId);
286
+ if (entry === undefined || entry.userId === this.snapshot.user.id) {
287
+ return undefined;
288
+ }
289
+ return entry.displayName;
290
+ }
291
+ readStoredToken() {
292
+ try {
293
+ const key = this.tokenKey();
294
+ const value = this.options.storage?.getItem(key)?.trim() ?? "";
295
+ return value === "" ? null : value;
296
+ }
297
+ catch {
298
+ return null;
299
+ }
300
+ }
301
+ saveStoredToken(token) {
302
+ try {
303
+ this.options.storage?.setItem(this.tokenKey(), token);
304
+ }
305
+ catch {
306
+ // A denied write only costs the browser its stay-logged-in state.
307
+ }
308
+ }
309
+ clearStoredToken() {
310
+ try {
311
+ this.options.storage?.removeItem(this.tokenKey());
312
+ }
313
+ catch {
314
+ // Harmless: the next whoami reports anonymous.
315
+ }
316
+ }
317
+ tokenKey() {
318
+ const config = this.options.config();
319
+ return `${config.session.storageKey}:v1:${config.route.path}:account-token`;
320
+ }
321
+ publish(snapshot) {
322
+ if (this.disposed)
323
+ return;
324
+ this.snapshot = snapshot;
325
+ for (const listener of this.listeners)
326
+ listener();
327
+ }
328
+ }
329
+ //# sourceMappingURL=QaAccountsController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QaAccountsController.js","sourceRoot":"","sources":["../../src/client/QaAccountsController.ts"],"names":[],"mappings":"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"}
@@ -1,14 +1,29 @@
1
1
  import { DEFAULT_QA_SURFACE_CONFIG, resolveConfig } from "../resolve-config.js";
2
- /** Browser projection of the Host-owned qa-surface settings namespace. */
2
+ /**
3
+ * Browser projection of the Host-owned qa-surface settings namespace.
4
+ *
5
+ * The DSH gateway pins settings RPCs to loopback, so a browser served over the
6
+ * LAN always sees the namespace as `unavailable`. When the caller supplies the
7
+ * `qaSurface/describe` Remote as a fallback, that channel answers instead: the
8
+ * projection waits in `loading` until it settles, then reports the Host-owned
9
+ * configuration as `ready`. A rejected fallback returns the projection to
10
+ * `unavailable`, exactly as when no fallback exists.
11
+ */
3
12
  export class QaConfigController {
4
13
  scope;
5
14
  listeners = new Set();
6
15
  snapshot;
7
16
  unsubscribe;
8
- constructor(scope) {
17
+ fallback;
18
+ fallbackState = "idle";
19
+ fallbackConfig;
20
+ disposed = false;
21
+ constructor(scope, fallback) {
9
22
  this.scope = scope;
23
+ this.fallback = fallback;
10
24
  this.snapshot = this.project();
11
25
  this.unsubscribe = scope.subscribe(() => this.refresh());
26
+ this.refresh();
12
27
  }
13
28
  getSnapshot = () => this.snapshot;
14
29
  subscribe = (listener) => {
@@ -16,6 +31,7 @@ export class QaConfigController {
16
31
  return () => this.listeners.delete(listener);
17
32
  };
18
33
  dispose() {
34
+ this.disposed = true;
19
35
  this.unsubscribe();
20
36
  this.listeners.clear();
21
37
  }
@@ -29,6 +45,22 @@ export class QaConfigController {
29
45
  };
30
46
  }
31
47
  if (settings.status === "unavailable") {
48
+ if ((this.fallbackState === "ready" ||
49
+ this.fallbackState === "refreshing") &&
50
+ this.fallbackConfig !== undefined) {
51
+ return {
52
+ status: "ready",
53
+ config: this.fallbackConfig,
54
+ error: null,
55
+ };
56
+ }
57
+ if (this.fallbackState === "pending") {
58
+ return {
59
+ status: "loading",
60
+ config: DEFAULT_QA_SURFACE_CONFIG,
61
+ error: null,
62
+ };
63
+ }
32
64
  return {
33
65
  status: "unavailable",
34
66
  config: DEFAULT_QA_SURFACE_CONFIG,
@@ -46,12 +78,16 @@ export class QaConfigController {
46
78
  return {
47
79
  status: "error",
48
80
  config: DEFAULT_QA_SURFACE_CONFIG,
49
- error: "The assistant configuration is unavailable.",
81
+ error: "Настройки помощника недоступны.",
50
82
  };
51
83
  }
52
84
  }
53
85
  refresh() {
54
- const next = this.project();
86
+ this.requestFallbackIfNeeded();
87
+ const projected = this.project();
88
+ const next = JSON.stringify(projected.config) === JSON.stringify(this.snapshot.config)
89
+ ? { ...projected, config: this.snapshot.config }
90
+ : projected;
55
91
  if (next.status === this.snapshot.status &&
56
92
  next.config === this.snapshot.config &&
57
93
  next.error === this.snapshot.error) {
@@ -61,5 +97,76 @@ export class QaConfigController {
61
97
  for (const listener of this.listeners)
62
98
  listener();
63
99
  }
100
+ /**
101
+ * Re-read the Host configuration after a Host reconnect. Without this, an
102
+ * open page keeps the configuration it fetched at load time: after the Host
103
+ * restarts with a changed deployment config, the next attestation compares
104
+ * its proof against the stale client copy and refuses. While re-reading,
105
+ * the previous answer stays projected — no loading flicker; the snapshot
106
+ * updates only when the answer actually changed.
107
+ */
108
+ refreshFallback() {
109
+ if (this.disposed ||
110
+ this.fallback === undefined ||
111
+ this.fallbackState === "idle" ||
112
+ this.fallbackState === "pending" ||
113
+ this.scope.getSnapshot().status === "ready") {
114
+ return;
115
+ }
116
+ this.fallbackState = "refreshing";
117
+ void this.fallback().then((config) => {
118
+ if (this.disposed)
119
+ return;
120
+ try {
121
+ this.fallbackConfig = resolveConfig(config);
122
+ }
123
+ catch {
124
+ // A malformed answer must not wipe a working previous one.
125
+ }
126
+ this.fallbackState = "ready";
127
+ // refresh() keeps the old projection when the answer is unchanged.
128
+ this.refresh();
129
+ }, (error) => {
130
+ if (this.disposed)
131
+ return;
132
+ console.warn("dsh-qa-surface: Host configuration refresh failed", error);
133
+ this.fallbackState = "ready";
134
+ });
135
+ }
136
+ /**
137
+ * The fallback trigger rides every refresh: the scope flips to
138
+ * `unavailable` whenever the browser is served over the LAN, which a
139
+ * constructor-time check can miss. The state guard makes repeats a no-op,
140
+ * so one fetch runs per controller lifetime; the recursive refresh lets the
141
+ * pending state surface before the first notification pass.
142
+ */
143
+ requestFallbackIfNeeded() {
144
+ if (this.disposed ||
145
+ this.fallback === undefined ||
146
+ this.fallbackState !== "idle" ||
147
+ this.scope.getSnapshot().status !== "unavailable") {
148
+ return;
149
+ }
150
+ this.fallbackState = "pending";
151
+ this.refresh();
152
+ void this.fallback().then((config) => {
153
+ if (this.disposed)
154
+ return;
155
+ try {
156
+ this.fallbackConfig = resolveConfig(config);
157
+ this.fallbackState = "ready";
158
+ }
159
+ catch {
160
+ this.fallbackState = "failed";
161
+ }
162
+ this.refresh();
163
+ }, (error) => {
164
+ if (this.disposed)
165
+ return;
166
+ console.warn("dsh-qa-surface: Host configuration is unavailable", error);
167
+ this.fallbackState = "failed";
168
+ this.refresh();
169
+ });
170
+ }
64
171
  }
65
172
  //# sourceMappingURL=QaConfigController.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"QaConfigController.js","sourceRoot":"","sources":["../../src/client/QaConfigController.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAShF,0EAA0E;AAC1E,MAAM,OAAO,kBAAkB;IAKA,KAAK;IAJjB,SAAS,GAAG,IAAI,GAAG,EAAc,CAAC;IAC3C,QAAQ,CAAmB;IAClB,WAAW,CAAa;IAEzC,YAA6B,KAAqC;qBAArC,KAAK;QAChC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAC/B,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,WAAW,GAAG,GAAqB,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC;IAEpD,SAAS,GAAG,CAAC,QAAoB,EAAgB,EAAE;QACjD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC7B,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC/C,CAAC,CAAC;IAEF,OAAO;QACL,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;IACzB,CAAC;IAEO,OAAO;QACb,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;QAC1C,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAClC,OAAO;gBACL,MAAM,EAAE,SAAS;gBACjB,MAAM,EAAE,yBAAyB;gBACjC,KAAK,EAAE,IAAI;aACZ,CAAC;QACJ,CAAC;QACD,IAAI,QAAQ,CAAC,MAAM,KAAK,aAAa,EAAE,CAAC;YACtC,OAAO;gBACL,MAAM,EAAE,aAAa;gBACrB,MAAM,EAAE,yBAAyB;gBACjC,KAAK,EAAE,IAAI;aACZ,CAAC;QACJ,CAAC;QACD,IAAI,CAAC;YACH,OAAO;gBACL,MAAM,EAAE,OAAO;gBACf,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC;gBAC3C,KAAK,EAAE,IAAI;aACZ,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;gBACL,MAAM,EAAE,OAAO;gBACf,MAAM,EAAE,yBAAyB;gBACjC,KAAK,EAAE,6CAA6C;aACrD,CAAC;QACJ,CAAC;IACH,CAAC;IAEO,OAAO;QACb,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAC5B,IACE,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,QAAQ,CAAC,MAAM;YACpC,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,QAAQ,CAAC,MAAM;YACpC,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,QAAQ,CAAC,KAAK,EAClC,CAAC;YACD,OAAO;QACT,CAAC;QACD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS;YAAE,QAAQ,EAAE,CAAC;IACpD,CAAC;CACF"}
1
+ {"version":3,"file":"QaConfigController.js","sourceRoot":"","sources":["../../src/client/QaConfigController.ts"],"names":[],"mappings":"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"}