@yadsh/dsh-qa-surface 0.3.0 → 0.4.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 (245) hide show
  1. package/README.md +153 -12
  2. package/lib/account-remotes.js +100 -0
  3. package/lib/account-remotes.js.map +1 -0
  4. package/lib/accounts/credentials.js +27 -0
  5. package/lib/accounts/credentials.js.map +1 -0
  6. package/lib/accounts/errors.js +9 -0
  7. package/lib/accounts/errors.js.map +1 -0
  8. package/lib/accounts/file.js +101 -0
  9. package/lib/accounts/file.js.map +1 -0
  10. package/lib/accounts/store.js +144 -161
  11. package/lib/accounts/store.js.map +1 -1
  12. package/lib/accounts/token.js +61 -0
  13. package/lib/accounts/token.js.map +1 -0
  14. package/lib/attachment-rules.js +111 -0
  15. package/lib/attachment-rules.js.map +1 -0
  16. package/lib/cli.js +122 -9
  17. package/lib/cli.js.map +1 -1
  18. package/lib/client/QaAccountsController.js +32 -2
  19. package/lib/client/QaAccountsController.js.map +1 -1
  20. package/lib/client/QaSessionController.js +47 -65
  21. package/lib/client/QaSessionController.js.map +1 -1
  22. package/lib/client/QaSurface.js +121 -107
  23. package/lib/client/QaSurface.js.map +1 -1
  24. package/lib/client/QaTranscriptAdapter.js +71 -6
  25. package/lib/client/QaTranscriptAdapter.js.map +1 -1
  26. package/lib/client/attachments.js +150 -0
  27. package/lib/client/attachments.js.map +1 -0
  28. package/lib/client/attestation.js +1 -1
  29. package/lib/client/attestation.js.map +1 -1
  30. package/lib/client/base64.js +16 -0
  31. package/lib/client/base64.js.map +1 -0
  32. package/lib/client/chat-files.js +48 -0
  33. package/lib/client/chat-files.js.map +1 -0
  34. package/lib/client/components/Markdown.js +1 -1
  35. package/lib/client/components/Markdown.js.map +1 -1
  36. package/lib/client/components/QaChangelog.js +38 -19
  37. package/lib/client/components/QaChangelog.js.map +1 -1
  38. package/lib/client/components/QaComposer.js +56 -74
  39. package/lib/client/components/QaComposer.js.map +1 -1
  40. package/lib/client/components/QaFileAttachment.js +19 -0
  41. package/lib/client/components/QaFileAttachment.js.map +1 -0
  42. package/lib/client/components/QaFilesPanel.js +45 -0
  43. package/lib/client/components/QaFilesPanel.js.map +1 -0
  44. package/lib/client/components/QaHeader.js +34 -0
  45. package/lib/client/components/QaHeader.js.map +1 -0
  46. package/lib/client/components/QaMessage.js +17 -4
  47. package/lib/client/components/QaMessage.js.map +1 -1
  48. package/lib/client/components/QaModal.js +31 -0
  49. package/lib/client/components/QaModal.js.map +1 -0
  50. package/lib/client/components/QaProfile.js +64 -0
  51. package/lib/client/components/QaProfile.js.map +1 -0
  52. package/lib/client/components/QaRightRail.js +15 -0
  53. package/lib/client/components/QaRightRail.js.map +1 -0
  54. package/lib/client/components/QaSidebar.js +6 -1
  55. package/lib/client/components/QaSidebar.js.map +1 -1
  56. package/lib/client/components/{QaSourcesDrawer.js → QaSourcesPanel.js} +3 -3
  57. package/lib/client/components/QaSourcesPanel.js.map +1 -0
  58. package/lib/client/components/QaTurnRail.js +15 -0
  59. package/lib/client/components/QaTurnRail.js.map +1 -1
  60. package/lib/client/components/QaWidthHandle.js +25 -20
  61. package/lib/client/components/QaWidthHandle.js.map +1 -1
  62. package/lib/client/components/QaWorkGroup.js +19 -20
  63. package/lib/client/components/QaWorkGroup.js.map +1 -1
  64. package/lib/client/components/surface-utils.js +28 -0
  65. package/lib/client/components/surface-utils.js.map +1 -0
  66. package/lib/client/components/thinking-phrases.js +24 -0
  67. package/lib/client/components/thinking-phrases.js.map +1 -0
  68. package/lib/client/create-session.js +7 -32
  69. package/lib/client/create-session.js.map +1 -1
  70. package/lib/client/failure-copy.js +63 -0
  71. package/lib/client/failure-copy.js.map +1 -0
  72. package/lib/client/index.js +38 -7
  73. package/lib/client/index.js.map +1 -1
  74. package/lib/client/prompt-content.js +54 -0
  75. package/lib/client/prompt-content.js.map +1 -0
  76. package/lib/client/settings/card.js +143 -0
  77. package/lib/client/settings/card.js.map +1 -0
  78. package/lib/client/settings/fields.js +145 -0
  79. package/lib/client/settings/fields.js.map +1 -0
  80. package/lib/client/settings/format.js +255 -0
  81. package/lib/client/settings/format.js.map +1 -0
  82. package/lib/client/settings/sections/access.js +25 -0
  83. package/lib/client/settings/sections/access.js.map +1 -0
  84. package/lib/client/settings/sections/accounts.js +47 -0
  85. package/lib/client/settings/sections/accounts.js.map +1 -0
  86. package/lib/client/settings/sections/attachments.js +46 -0
  87. package/lib/client/settings/sections/attachments.js.map +1 -0
  88. package/lib/client/settings/sections/branding.js +28 -0
  89. package/lib/client/settings/sections/branding.js.map +1 -0
  90. package/lib/client/settings/sections/common.js +20 -0
  91. package/lib/client/settings/sections/common.js.map +1 -0
  92. package/lib/client/settings/sections/embedding.js +19 -0
  93. package/lib/client/settings/sections/embedding.js.map +1 -0
  94. package/lib/client/settings/sections/interface.js +60 -0
  95. package/lib/client/settings/sections/interface.js.map +1 -0
  96. package/lib/client/settings/sections/lockdown.js +82 -0
  97. package/lib/client/settings/sections/lockdown.js.map +1 -0
  98. package/lib/client/settings/sections/session.js +53 -0
  99. package/lib/client/settings/sections/session.js.map +1 -0
  100. package/lib/client/settings/sections/sources.js +72 -0
  101. package/lib/client/settings/sections/sources.js.map +1 -0
  102. package/lib/client/settings/sections/status.js +37 -0
  103. package/lib/client/settings/sections/status.js.map +1 -0
  104. package/lib/client/settings/sections.js +23 -0
  105. package/lib/client/settings/sections.js.map +1 -0
  106. package/lib/client/settings/styles.js +57 -0
  107. package/lib/client/settings/styles.js.map +1 -0
  108. package/lib/client/stream-publisher.js +47 -0
  109. package/lib/client/stream-publisher.js.map +1 -0
  110. package/lib/client/styles.js +85 -19
  111. package/lib/client/styles.js.map +1 -1
  112. package/lib/client/types.js.map +1 -1
  113. package/lib/client/use-right-rail.js +96 -0
  114. package/lib/client/use-right-rail.js.map +1 -0
  115. package/lib/client/use-session-ui-state.js +26 -19
  116. package/lib/client/use-session-ui-state.js.map +1 -1
  117. package/lib/client.js +4788 -869
  118. package/lib/client.js.map +1 -1
  119. package/lib/config-resolvers/accounts.js +60 -0
  120. package/lib/config-resolvers/accounts.js.map +1 -0
  121. package/lib/config-resolvers/attachments.js +28 -0
  122. package/lib/config-resolvers/attachments.js.map +1 -0
  123. package/lib/config-resolvers/basics.js +59 -0
  124. package/lib/config-resolvers/basics.js.map +1 -0
  125. package/lib/config-resolvers/defaults.js +132 -0
  126. package/lib/config-resolvers/defaults.js.map +1 -0
  127. package/lib/config-resolvers/lockdown.js +79 -0
  128. package/lib/config-resolvers/lockdown.js.map +1 -0
  129. package/lib/config-resolvers/session.js +42 -0
  130. package/lib/config-resolvers/session.js.map +1 -0
  131. package/lib/config-resolvers/shared.js +42 -0
  132. package/lib/config-resolvers/shared.js.map +1 -0
  133. package/lib/config-resolvers/sources.js +81 -0
  134. package/lib/config-resolvers/sources.js.map +1 -0
  135. package/lib/config-resolvers/ui.js +20 -0
  136. package/lib/config-resolvers/ui.js.map +1 -0
  137. package/lib/config.js +65 -4
  138. package/lib/config.js.map +1 -1
  139. package/lib/entry-redirect.js +2 -1
  140. package/lib/entry-redirect.js.map +1 -1
  141. package/lib/index.js +123 -74
  142. package/lib/index.js.map +1 -1
  143. package/lib/profile.js +214 -0
  144. package/lib/profile.js.map +1 -0
  145. package/lib/prompt-notes.js +231 -0
  146. package/lib/prompt-notes.js.map +1 -0
  147. package/lib/resolve-config.js +35 -410
  148. package/lib/resolve-config.js.map +1 -1
  149. package/lib/secure-session.js +82 -16
  150. package/lib/secure-session.js.map +1 -1
  151. package/lib/shared/session-key.js +18 -0
  152. package/lib/shared/session-key.js.map +1 -0
  153. package/lib/shared/settings.js +10 -0
  154. package/lib/shared/settings.js.map +1 -0
  155. package/lib/thinking-phrases.js +68 -0
  156. package/lib/thinking-phrases.js.map +1 -0
  157. package/lib/typert.host.js +162 -17
  158. package/lib/typert.remote-client.d.ts +5 -1
  159. package/lib/typert.remote-client.js +132 -13
  160. package/lib/types/account-remotes.d.ts +42 -0
  161. package/lib/types/accounts/credentials.d.ts +14 -0
  162. package/lib/types/accounts/errors.d.ts +11 -0
  163. package/lib/types/accounts/file.d.ts +82 -0
  164. package/lib/types/accounts/store.d.ts +66 -43
  165. package/lib/types/accounts/token.d.ts +31 -0
  166. package/lib/types/attachment-rules.d.ts +44 -0
  167. package/lib/types/cli.d.ts +2 -2
  168. package/lib/types/client/QaAccountsController.d.ts +8 -1
  169. package/lib/types/client/QaSessionController.d.ts +16 -16
  170. package/lib/types/client/QaSurface.d.ts +7 -1
  171. package/lib/types/client/attachments.d.ts +54 -0
  172. package/lib/types/client/base64.d.ts +10 -0
  173. package/lib/types/client/chat-files.d.ts +30 -0
  174. package/lib/types/client/components/QaChangelog.d.ts +1 -1
  175. package/lib/types/client/components/QaComposer.d.ts +8 -4
  176. package/lib/types/client/components/QaFileAttachment.d.ts +14 -0
  177. package/lib/types/client/components/QaFilesPanel.d.ts +15 -0
  178. package/lib/types/client/components/QaHeader.d.ts +41 -0
  179. package/lib/types/client/components/QaMessage.d.ts +3 -1
  180. package/lib/types/client/components/QaModal.d.ts +26 -0
  181. package/lib/types/client/components/QaProfile.d.ts +25 -0
  182. package/lib/types/client/components/QaRightRail.d.ts +23 -0
  183. package/lib/types/client/components/QaSidebar.d.ts +14 -0
  184. package/lib/types/client/components/{QaSourcesDrawer.d.ts → QaSourcesPanel.d.ts} +7 -4
  185. package/lib/types/client/components/QaTurnRail.d.ts +6 -0
  186. package/lib/types/client/components/QaWidthHandle.d.ts +14 -7
  187. package/lib/types/client/components/QaWorkGroup.d.ts +5 -3
  188. package/lib/types/client/components/surface-utils.d.ts +11 -0
  189. package/lib/types/client/components/thinking-phrases.d.ts +9 -0
  190. package/lib/types/client/create-session.d.ts +6 -9
  191. package/lib/types/client/failure-copy.d.ts +19 -0
  192. package/lib/types/client/prompt-content.d.ts +30 -0
  193. package/lib/types/client/settings/card.d.ts +23 -0
  194. package/lib/types/client/settings/fields.d.ts +139 -0
  195. package/lib/types/client/settings/format.d.ts +108 -0
  196. package/lib/types/client/settings/sections/access.d.ts +9 -0
  197. package/lib/types/client/settings/sections/accounts.d.ts +9 -0
  198. package/lib/types/client/settings/sections/attachments.d.ts +15 -0
  199. package/lib/types/client/settings/sections/branding.d.ts +8 -0
  200. package/lib/types/client/settings/sections/common.d.ts +28 -0
  201. package/lib/types/client/settings/sections/embedding.d.ts +8 -0
  202. package/lib/types/client/settings/sections/interface.d.ts +9 -0
  203. package/lib/types/client/settings/sections/lockdown.d.ts +9 -0
  204. package/lib/types/client/settings/sections/session.d.ts +9 -0
  205. package/lib/types/client/settings/sections/sources.d.ts +9 -0
  206. package/lib/types/client/settings/sections/status.d.ts +22 -0
  207. package/lib/types/client/settings/sections.d.ts +25 -0
  208. package/lib/types/client/settings/styles.d.ts +8 -0
  209. package/lib/types/client/stream-publisher.d.ts +28 -0
  210. package/lib/types/client/types.d.ts +29 -1
  211. package/lib/types/client/use-right-rail.d.ts +56 -0
  212. package/lib/types/client/use-session-ui-state.d.ts +13 -7
  213. package/lib/types/config-resolvers/accounts.d.ts +15 -0
  214. package/lib/types/config-resolvers/attachments.d.ts +6 -0
  215. package/lib/types/config-resolvers/basics.d.ts +8 -0
  216. package/lib/types/config-resolvers/defaults.d.ts +4 -0
  217. package/lib/types/config-resolvers/lockdown.d.ts +10 -0
  218. package/lib/types/config-resolvers/session.d.ts +6 -0
  219. package/lib/types/config-resolvers/shared.d.ts +16 -0
  220. package/lib/types/config-resolvers/sources.d.ts +6 -0
  221. package/lib/types/config-resolvers/ui.d.ts +6 -0
  222. package/lib/types/index.d.ts +20 -13
  223. package/lib/types/profile.d.ts +76 -0
  224. package/lib/types/prompt-notes.d.ts +110 -0
  225. package/lib/types/resolve-config.d.ts +8 -3
  226. package/lib/types/secure-session.d.ts +26 -1
  227. package/lib/types/shared/session-key.d.ts +23 -0
  228. package/lib/types/shared/settings.d.ts +10 -0
  229. package/lib/types/thinking-phrases.d.ts +17 -0
  230. package/lib/types/types.d.ts +123 -5
  231. package/lib/types/user-workspace.d.ts +38 -0
  232. package/lib/user-workspace.js +231 -0
  233. package/lib/user-workspace.js.map +1 -0
  234. package/package.json +14 -7
  235. package/CHANGELOG.md +0 -176
  236. package/SPEC-dsh-qa-surface.md +0 -2425
  237. package/docs/ARCHITECTURE.md +0 -66
  238. package/docs/COMPATIBILITY.md +0 -14
  239. package/docs/CONFIGURATION.md +0 -199
  240. package/docs/EMBEDDING.md +0 -13
  241. package/docs/SOURCES-MIGRATION.md +0 -28
  242. package/docs/SOURCES-PROVENANCE-AUDIT.md +0 -88
  243. package/docs/SPEC-dsh-qa-surface-accounts.md +0 -219
  244. package/docs/SPEC-dsh-qa-surface-sources-provenance.md +0 -1692
  245. package/lib/client/components/QaSourcesDrawer.js.map +0 -1
package/CHANGELOG.md DELETED
@@ -1,176 +0,0 @@
1
- ## 0.3.0 (2026-09-12)
2
-
3
- ### 🚀 Features
4
-
5
- - Optional QA accounts and entry routing. `accounts.enabled` mounts a ([dc2f582](https://github.com/xarleyn/dsh-plugins/commit/dc2f582))
6
- full-frame login/registration gate (email + password, coarse audience-safe
7
- refusals, per-store rate limiting, self-registration toggle) backed by
8
- `$DSH_HOME/qa-accounts.json`: scrypt password hashes, a persisted HMAC secret
9
- for stateful-expiry account tokens, and a session ownership map. Ownership is
10
- first come, first served - attesting or bulk-claiming an unowned session binds
11
- it to the caller (the migration path for existing per-browser chats on first
12
- login); sessions owned by another user refuse attestation with
13
- `session-owned-elsewhere` and stay hidden from the sidebar, admins are not
14
- refused. The identity rides as an explicit token argument into the gated
15
- `qaSurface` remotes (the typert carrier never exposes HTTP requests), the
16
- policy admission checks it before any session fact is revealed
17
- (`auth-required` reopens the gate on expiry), and the account chip with
18
- logout lives in the sidebar footer. `entry.redirectNonLoopback` injects a
19
- guarded head script through the `webserver/index-inject` event that continues
20
- non-loopback hostnames into the QA route - the navigation-marker hand-off is
21
- never redirected (no loops), `/?ui=admin` persists an operator bypass and
22
- `/?ui=qa` clears it. Accounts are an identity layer for the QA surface, not a
23
- harness boundary: QA users still hold the shared host launch-token cookie.
24
-
25
- Follow-ups adopted from a review of the independent dsh-auth-gate plugin: a
26
- proxy-side deny list for the privileged config-plane RPC methods behind the
27
- deploy proxy's Host/Origin rewrite, a plugin-side launch-token bridge
28
- (`entry.cookieBootstrap`) that performs the one-time host-cookie exchange on
29
- the `/qa` route itself, a `qa-accounts` bin CLI (list/add/set-role/disable/
30
- enable/revoke) so account administration never requires hand-editing the
31
- JSON file, and per-account state — a `disabled` flag refusing logins with
32
- `account-disabled` plus a `tokenVersion` burned into tokens that
33
- `disable`/`revoke` bump, making logout and lockout server-side facts.
34
-
35
- Admins get cross-user views over the same ownership map:
36
- `qaSurface/accountsListOwnership` (admin-only, `admin-required` refusal
37
- otherwise) returns every chat with its owner's resolved display name, the
38
- admin sidebar switches to per-owner sections ordered by their freshest chat
39
- (unclaimed chats trail under "Без владельца"), and user messages in foreign
40
- chats carry an `author` byline naming the chat owner. Ordinary accounts and
41
- deployments with accounts disabled keep the flat sidebar and unlabeled
42
- messages.
43
-
44
- - The chat-history sidebar gained a footer version button that opens an ([d9d5868](https://github.com/xarleyn/dsh-plugins/commit/d9d5868))
45
- end-user changelog dialog: a curated per-version summary (new features and
46
- fixes in Russian) rendered in a themed modal with Escape/backdrop close.
47
- The bundled version and entries are pinned to package.json and the release
48
- CHANGELOG by a unit test, so a release cannot ship a stale dialog.
49
-
50
- - Rebuild the client on the 0.1.5 surfaces: the transcript projects from the ([458b9c2](https://github.com/xarleyn/dsh-plugins/commit/458b9c2))
51
- ui-chat conversation view's legacy slice, chat/model pinning moves to the
52
- wire remotes (`agentPresets.select` on the still-blank session, then
53
- `session.selectModel`) with the attestation ordering preserved, and
54
- history reads go through the session-v3 surface. The supported host range
55
- moves to `>=0.1.5-rc.2 <0.2.0`, dropping 0.1.1-rc.2.
56
-
57
- - Harden the gated QA experience and make cross-user history explicitly ([2ed2024](https://github.com/xarleyn/dsh-plugins/commit/2ed2024))
58
- opt-in. A new `accounts.showOtherUsersChats` setting defaults to `false`, so
59
- administrators only see their own chats unless the deployment enables the
60
- shared ownership view. Account storage now follows external CLI updates and
61
- uses process-scoped temporary writes, while session admission and client state
62
- handling avoid stale async results and reset session-bound assets reliably.
63
-
64
- The QA client now presents a dedicated test-interface disclosure, improves
65
- chat search and owner matching, keeps row actions from disturbing result
66
- layout, distinguishes administrator roles, and removes decorative middle-dot
67
- separators from the sidebar, messages, and source details. Its curated 0.3.0
68
- history entry is prepared in advance, while the current-version marker is
69
- injected from package.json at build time so the release bump promotes it
70
- without another source edit.
71
-
72
- ### ❤️ Thank You
73
-
74
- - xarleyn @xarleyn
75
-
76
- ## 0.2.0 (2026-09-10)
77
-
78
- - Added DSH-style symmetric transcript/composer width handles with adaptive
79
- defaults, viewport clamping, and per-route browser persistence.
80
- - Added Host-owned structured source provenance for parent and delegated turns,
81
- replayable `qa/sources` snapshots, dedupe/ranking, opaque-provider reporting,
82
- grouped source UI, and safe rendered/raw file previews.
83
- - Updated packed Host/browser smoke coverage for browser authentication,
84
- revisioned client batches, scoped Remote injection, and current Typert RPC
85
- envelopes.
86
-
87
- ### 🚀 Features
88
-
89
- - Make the QA surface a complete end-user assistant shell: image attachments ([b9af082](https://github.com/xarleyn/dsh-plugins/commit/b9af082))
90
- (drag & drop, paste, and a picker with removable previews; base64 prompt
91
- parts the Host promotes to durable attachments, rendered back as clickable
92
- thumbnails), subagent delegation presentation (launch work items with the
93
- durable child id, settlement notices collapsed into titled expandable rows,
94
- an agents panel listing the chat's subagents, and live read-only subagent
95
- transcripts with a one-click return), source cards with a full-output detail
96
- pane, clickable links and an open action, answer regeneration with
97
- ChatGPT-style variant switching, message ratings with hover response
98
- metadata (duration, TTFT, tokens per second), a data-usage disclaimer
99
- plate under the composer, per-browser chat history
100
- ordered by host updates with search and a collapsible sidebar, lazy draft
101
- chats that create nothing until the first prompt, directory/workspace
102
- pinning with a dedicated `workspace-unavailable` refusal, the company
103
- interaction palette as `--dsh-qa-*` tokens, and a split of the surface into
104
- focused drawer, switcher, and formatting modules.
105
-
106
- ### 🩹 Fixes
107
-
108
- - Pack the generated Typert host and remote-client entrypoints: the `files` ([0059cb4](https://github.com/xarleyn/dsh-plugins/commit/0059cb4))
109
- allowlist only kept declarations under `lib/types/`, so the `./remote` and
110
- `./typert` exports previously shipped without their implementation modules
111
- and type definitions.
112
-
113
- ### ❤️ Thank You
114
-
115
- - xarleyn @xarleyn
116
-
117
- ## 0.1.1 (2026-09-06)
118
-
119
- ### 🩹 Fixes
120
-
121
- - Add the dedicated browser QA surface backed by native DeepSeek Harness ([dfdc430](https://github.com/xarleyn/dsh-plugins/commit/dfdc430))
122
- sessions.
123
-
124
- ### 🧱 Updated Dependencies
125
-
126
- - Updated @yadsh/dsh-plugin-log to 0.2.1
127
-
128
- ### ❤️ Thank You
129
-
130
- - xarleyn @xarleyn
131
-
132
- # Changelog
133
-
134
- ## 0.1.0 - 2026-09-05
135
-
136
- - Added the `/qa` full-screen overlay backed by native DSH sessions.
137
- - Added persistent, new-on-load and fixed session policies.
138
- - Added streaming transcript, Stop, New chat, safe Markdown and responsive UI.
139
- - Added Host settings registration and safety filtering for internal events.
140
- - Added a narrow Host navigation redirect for DSH releases whose static
141
- frontend returns 404 for direct `/qa` requests.
142
- - Added fail-closed Host policy attestation, the `qa-read-only` permission pin,
143
- an inherited-tool allow-list, and a monotonic execution guard.
144
- - Disabled session reset by default and added capability-regression gates.
145
- - Refined the QA surface with first-party-style conversation chrome, plain
146
- assistant flow, user bubbles, copy actions and a floating two-row composer.
147
- - Added opt-in reasoning and tool-call details grouped into a live turn work
148
- disclosure that collapses to a `Worked for …` summary before the final answer.
149
- - Added an optional minimal chat-history sidebar (`ui.showSessionList`) with a
150
- per-browser localStorage chat index, attested switching and a gated
151
- New chat control.
152
- - Send-time policy attestation now survives a Host that idled the session's
153
- agent out: the client re-binds the session (re-materializing the agent) and,
154
- when the refused session is still blank, continues in a fresh attested
155
- session instead of surfacing an error.
156
- - Added GFM table, ordered-list and horizontal-rule rendering to the safe
157
- Markdown output.
158
- - Added a two-click chat delete control to the chat-history sidebar; it
159
- removes the chat from the per-browser index only (DSH has no
160
- session-deletion seam).
161
- - Added attestation diagnostics: the Host folds a coarse reason code into the
162
- refusal and the browser console prints one operator hint instead of a
163
- duplicate stack trace.
164
- - Fixed repeated policy attestation for tools contributed by an agent preset:
165
- the applied restriction now retains the exact scoped allow-list instead of
166
- accidentally reducing it to global-only tools. Removed the redundant native
167
- presentation override so reloads cannot collide with the preset's mode.
168
- - The browser re-reads the Host configuration when the connection is restored,
169
- so an open page survives a Host restart with a changed deployment config.
170
- - Added LAN serving support: a shipped `deploy/qa-lan.patch.yml` webserver
171
- overlay, and a `qaSurface/describe` Host Remote the browser falls back to
172
- when the loopback-pinned settings namespace is unavailable, so branding,
173
- session pinning and lockdown UI switches keep working over the network.
174
- - Localized the end-user chat interface into Russian, added rotating playful
175
- thinking phrases, and moved the default quick-question chips next to the
176
- composer on an empty chat.