@yadsh/dsh-qa-surface 0.2.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 (325) hide show
  1. package/README.md +236 -20
  2. package/compatibility.json +11 -3
  3. package/lib/account-remotes.js +100 -0
  4. package/lib/account-remotes.js.map +1 -0
  5. package/lib/accounts/credentials.js +27 -0
  6. package/lib/accounts/credentials.js.map +1 -0
  7. package/lib/accounts/errors.js +9 -0
  8. package/lib/accounts/errors.js.map +1 -0
  9. package/lib/accounts/file.js +101 -0
  10. package/lib/accounts/file.js.map +1 -0
  11. package/lib/accounts/index.js +2 -0
  12. package/lib/accounts/index.js.map +1 -0
  13. package/lib/accounts/store.js +461 -0
  14. package/lib/accounts/store.js.map +1 -0
  15. package/lib/accounts/token.js +61 -0
  16. package/lib/accounts/token.js.map +1 -0
  17. package/lib/attachment-rules.js +111 -0
  18. package/lib/attachment-rules.js.map +1 -0
  19. package/lib/attestation.js.map +1 -1
  20. package/lib/cli.js +256 -0
  21. package/lib/cli.js.map +1 -0
  22. package/lib/client/QaAccountsController.js +359 -0
  23. package/lib/client/QaAccountsController.js.map +1 -0
  24. package/lib/client/QaSessionController.js +238 -180
  25. package/lib/client/QaSessionController.js.map +1 -1
  26. package/lib/client/QaSurface.js +281 -105
  27. package/lib/client/QaSurface.js.map +1 -1
  28. package/lib/client/QaTranscriptAdapter.js +95 -244
  29. package/lib/client/QaTranscriptAdapter.js.map +1 -1
  30. package/lib/client/attachments.js +150 -0
  31. package/lib/client/attachments.js.map +1 -0
  32. package/lib/client/attestation.js +7 -1
  33. package/lib/client/attestation.js.map +1 -1
  34. package/lib/client/base64.js +16 -0
  35. package/lib/client/base64.js.map +1 -0
  36. package/lib/client/chat-files.js +48 -0
  37. package/lib/client/chat-files.js.map +1 -0
  38. package/lib/client/components/Markdown.js +54 -13
  39. package/lib/client/components/Markdown.js.map +1 -1
  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 +131 -0
  43. package/lib/client/components/QaChangelog.js.map +1 -0
  44. package/lib/client/components/QaComposer.js +56 -74
  45. package/lib/client/components/QaComposer.js.map +1 -1
  46. package/lib/client/components/QaFileAttachment.js +19 -0
  47. package/lib/client/components/QaFileAttachment.js.map +1 -0
  48. package/lib/client/components/QaFilesPanel.js +45 -0
  49. package/lib/client/components/QaFilesPanel.js.map +1 -0
  50. package/lib/client/components/QaHeader.js +34 -0
  51. package/lib/client/components/QaHeader.js.map +1 -0
  52. package/lib/client/components/QaMessage.js +61 -18
  53. package/lib/client/components/QaMessage.js.map +1 -1
  54. package/lib/client/components/QaModal.js +31 -0
  55. package/lib/client/components/QaModal.js.map +1 -0
  56. package/lib/client/components/QaProfile.js +64 -0
  57. package/lib/client/components/QaProfile.js.map +1 -0
  58. package/lib/client/components/QaRightRail.js +15 -0
  59. package/lib/client/components/QaRightRail.js.map +1 -0
  60. package/lib/client/components/QaSidebar.js +68 -20
  61. package/lib/client/components/QaSidebar.js.map +1 -1
  62. package/lib/client/components/QaSourcesPanel.js +127 -0
  63. package/lib/client/components/QaSourcesPanel.js.map +1 -0
  64. package/lib/client/components/QaTurnRail.js +296 -0
  65. package/lib/client/components/QaTurnRail.js.map +1 -0
  66. package/lib/client/components/QaWelcomeNotice.js +125 -0
  67. package/lib/client/components/QaWelcomeNotice.js.map +1 -0
  68. package/lib/client/components/QaWidthHandle.js +147 -0
  69. package/lib/client/components/QaWidthHandle.js.map +1 -0
  70. package/lib/client/components/QaWorkGroup.js +19 -20
  71. package/lib/client/components/QaWorkGroup.js.map +1 -1
  72. package/lib/client/components/source-refs.js +78 -0
  73. package/lib/client/components/source-refs.js.map +1 -0
  74. package/lib/client/components/surface-utils.js +28 -0
  75. package/lib/client/components/surface-utils.js.map +1 -0
  76. package/lib/client/components/thinking-phrases.js +24 -0
  77. package/lib/client/components/thinking-phrases.js.map +1 -0
  78. package/lib/client/create-session.js +26 -0
  79. package/lib/client/create-session.js.map +1 -0
  80. package/lib/client/failure-copy.js +63 -0
  81. package/lib/client/failure-copy.js.map +1 -0
  82. package/lib/client/index.js +135 -16
  83. package/lib/client/index.js.map +1 -1
  84. package/lib/client/project-session-state.js +78 -0
  85. package/lib/client/project-session-state.js.map +1 -0
  86. package/lib/client/prompt-content.js +54 -0
  87. package/lib/client/prompt-content.js.map +1 -0
  88. package/lib/client/session-admission.js +38 -0
  89. package/lib/client/session-admission.js.map +1 -0
  90. package/lib/client/session-assets.js +52 -0
  91. package/lib/client/session-assets.js.map +1 -0
  92. package/lib/client/session-sources.js +61 -0
  93. package/lib/client/session-sources.js.map +1 -0
  94. package/lib/client/settings/card.js +143 -0
  95. package/lib/client/settings/card.js.map +1 -0
  96. package/lib/client/settings/fields.js +145 -0
  97. package/lib/client/settings/fields.js.map +1 -0
  98. package/lib/client/settings/format.js +255 -0
  99. package/lib/client/settings/format.js.map +1 -0
  100. package/lib/client/settings/sections/access.js +25 -0
  101. package/lib/client/settings/sections/access.js.map +1 -0
  102. package/lib/client/settings/sections/accounts.js +47 -0
  103. package/lib/client/settings/sections/accounts.js.map +1 -0
  104. package/lib/client/settings/sections/attachments.js +46 -0
  105. package/lib/client/settings/sections/attachments.js.map +1 -0
  106. package/lib/client/settings/sections/branding.js +28 -0
  107. package/lib/client/settings/sections/branding.js.map +1 -0
  108. package/lib/client/settings/sections/common.js +20 -0
  109. package/lib/client/settings/sections/common.js.map +1 -0
  110. package/lib/client/settings/sections/embedding.js +19 -0
  111. package/lib/client/settings/sections/embedding.js.map +1 -0
  112. package/lib/client/settings/sections/interface.js +60 -0
  113. package/lib/client/settings/sections/interface.js.map +1 -0
  114. package/lib/client/settings/sections/lockdown.js +82 -0
  115. package/lib/client/settings/sections/lockdown.js.map +1 -0
  116. package/lib/client/settings/sections/session.js +53 -0
  117. package/lib/client/settings/sections/session.js.map +1 -0
  118. package/lib/client/settings/sections/sources.js +72 -0
  119. package/lib/client/settings/sections/sources.js.map +1 -0
  120. package/lib/client/settings/sections/status.js +37 -0
  121. package/lib/client/settings/sections/status.js.map +1 -0
  122. package/lib/client/settings/sections.js +23 -0
  123. package/lib/client/settings/sections.js.map +1 -0
  124. package/lib/client/settings/styles.js +57 -0
  125. package/lib/client/settings/styles.js.map +1 -0
  126. package/lib/client/settlement.js +24 -0
  127. package/lib/client/settlement.js.map +1 -0
  128. package/lib/client/stream-publisher.js +47 -0
  129. package/lib/client/stream-publisher.js.map +1 -0
  130. package/lib/client/styles.js +225 -17
  131. package/lib/client/styles.js.map +1 -1
  132. package/lib/client/tool-presentation.js +102 -0
  133. package/lib/client/tool-presentation.js.map +1 -0
  134. package/lib/client/turn-sources.js +98 -0
  135. package/lib/client/turn-sources.js.map +1 -0
  136. package/lib/client/types.js +2 -0
  137. package/lib/client/types.js.map +1 -1
  138. package/lib/client/use-right-rail.js +96 -0
  139. package/lib/client/use-right-rail.js.map +1 -0
  140. package/lib/client/use-session-ui-state.js +75 -0
  141. package/lib/client/use-session-ui-state.js.map +1 -0
  142. package/lib/client/use-transcript-view.js +44 -0
  143. package/lib/client/use-transcript-view.js.map +1 -0
  144. package/lib/client.js +9052 -1345
  145. package/lib/client.js.map +1 -1
  146. package/lib/config-resolvers/accounts.js +60 -0
  147. package/lib/config-resolvers/accounts.js.map +1 -0
  148. package/lib/config-resolvers/attachments.js +28 -0
  149. package/lib/config-resolvers/attachments.js.map +1 -0
  150. package/lib/config-resolvers/basics.js +59 -0
  151. package/lib/config-resolvers/basics.js.map +1 -0
  152. package/lib/config-resolvers/defaults.js +132 -0
  153. package/lib/config-resolvers/defaults.js.map +1 -0
  154. package/lib/config-resolvers/lockdown.js +79 -0
  155. package/lib/config-resolvers/lockdown.js.map +1 -0
  156. package/lib/config-resolvers/session.js +42 -0
  157. package/lib/config-resolvers/session.js.map +1 -0
  158. package/lib/config-resolvers/shared.js +42 -0
  159. package/lib/config-resolvers/shared.js.map +1 -0
  160. package/lib/config-resolvers/sources.js +81 -0
  161. package/lib/config-resolvers/sources.js.map +1 -0
  162. package/lib/config-resolvers/ui.js +20 -0
  163. package/lib/config-resolvers/ui.js.map +1 -0
  164. package/lib/config.js +279 -102
  165. package/lib/config.js.map +1 -1
  166. package/lib/entry-redirect.js +45 -0
  167. package/lib/entry-redirect.js.map +1 -0
  168. package/lib/host-route.js +25 -1
  169. package/lib/host-route.js.map +1 -1
  170. package/lib/index.js +258 -23
  171. package/lib/index.js.map +1 -1
  172. package/lib/launch-token.js +42 -0
  173. package/lib/launch-token.js.map +1 -0
  174. package/lib/profile.js +214 -0
  175. package/lib/profile.js.map +1 -0
  176. package/lib/prompt-notes.js +231 -0
  177. package/lib/prompt-notes.js.map +1 -0
  178. package/lib/provenance/collector.js +40 -0
  179. package/lib/provenance/collector.js.map +1 -0
  180. package/lib/provenance/connectors.js +147 -0
  181. package/lib/provenance/connectors.js.map +1 -0
  182. package/lib/provenance/dedupe.js +89 -0
  183. package/lib/provenance/dedupe.js.map +1 -0
  184. package/lib/provenance/extractors.js +340 -0
  185. package/lib/provenance/extractors.js.map +1 -0
  186. package/lib/provenance/file-preview.js +39 -0
  187. package/lib/provenance/file-preview.js.map +1 -0
  188. package/lib/provenance/host-store.js +387 -0
  189. package/lib/provenance/host-store.js.map +1 -0
  190. package/lib/provenance/index.js +9 -0
  191. package/lib/provenance/index.js.map +1 -0
  192. package/lib/provenance/normalize.js +128 -0
  193. package/lib/provenance/normalize.js.map +1 -0
  194. package/lib/provenance/reported.js +53 -0
  195. package/lib/provenance/reported.js.map +1 -0
  196. package/lib/provenance/types.js +2 -0
  197. package/lib/provenance/types.js.map +1 -0
  198. package/lib/resolve-config.js +35 -249
  199. package/lib/resolve-config.js.map +1 -1
  200. package/lib/secure-session.js +122 -14
  201. package/lib/secure-session.js.map +1 -1
  202. package/lib/shared/session-key.js +18 -0
  203. package/lib/shared/session-key.js.map +1 -0
  204. package/lib/shared/settings.js +10 -0
  205. package/lib/shared/settings.js.map +1 -0
  206. package/lib/thinking-phrases.js +68 -0
  207. package/lib/thinking-phrases.js.map +1 -0
  208. package/lib/typert.host.js +749 -11
  209. package/lib/typert.remote-client.d.ts +23 -3
  210. package/lib/typert.remote-client.js +593 -6
  211. package/lib/types/account-remotes.d.ts +42 -0
  212. package/lib/types/accounts/credentials.d.ts +14 -0
  213. package/lib/types/accounts/errors.d.ts +11 -0
  214. package/lib/types/accounts/file.d.ts +82 -0
  215. package/lib/types/accounts/index.d.ts +2 -0
  216. package/lib/types/accounts/store.d.ts +144 -0
  217. package/lib/types/accounts/token.d.ts +31 -0
  218. package/lib/types/attachment-rules.d.ts +44 -0
  219. package/lib/types/attestation.d.ts +1 -1
  220. package/lib/types/cli.d.ts +9 -0
  221. package/lib/types/client/QaAccountsController.d.ts +102 -0
  222. package/lib/types/client/QaConfigController.d.ts +1 -1
  223. package/lib/types/client/QaSessionController.d.ts +61 -22
  224. package/lib/types/client/QaSurface.d.ts +14 -3
  225. package/lib/types/client/QaTranscriptAdapter.d.ts +5 -10
  226. package/lib/types/client/attachments.d.ts +54 -0
  227. package/lib/types/client/base64.d.ts +10 -0
  228. package/lib/types/client/chat-files.d.ts +30 -0
  229. package/lib/types/client/components/Markdown.d.ts +11 -1
  230. package/lib/types/client/components/QaAgentsDrawer.d.ts +1 -1
  231. package/lib/types/client/components/QaAuthGate.d.ts +15 -0
  232. package/lib/types/client/components/QaChangelog.d.ts +21 -0
  233. package/lib/types/client/components/QaComposer.d.ts +8 -4
  234. package/lib/types/client/components/QaFileAttachment.d.ts +14 -0
  235. package/lib/types/client/components/QaFilesPanel.d.ts +15 -0
  236. package/lib/types/client/components/QaHeader.d.ts +41 -0
  237. package/lib/types/client/components/QaMessage.d.ts +12 -3
  238. package/lib/types/client/components/QaModal.d.ts +26 -0
  239. package/lib/types/client/components/QaProfile.d.ts +25 -0
  240. package/lib/types/client/components/QaRightRail.d.ts +23 -0
  241. package/lib/types/client/components/QaSidebar.d.ts +44 -2
  242. package/lib/types/client/components/QaSourcesPanel.d.ts +23 -0
  243. package/lib/types/client/components/QaTurnRail.d.ts +65 -0
  244. package/lib/types/client/components/QaWelcomeNotice.d.ts +27 -0
  245. package/lib/types/client/components/QaWidthHandle.d.ts +43 -0
  246. package/lib/types/client/components/QaWorkGroup.d.ts +5 -3
  247. package/lib/types/client/components/source-refs.d.ts +16 -0
  248. package/lib/types/client/components/surface-utils.d.ts +11 -0
  249. package/lib/types/client/components/thinking-phrases.d.ts +9 -0
  250. package/lib/types/client/create-session.d.ts +13 -0
  251. package/lib/types/client/failure-copy.d.ts +19 -0
  252. package/lib/types/client/index.d.ts +1 -0
  253. package/lib/types/client/project-session-state.d.ts +30 -0
  254. package/lib/types/client/prompt-content.d.ts +30 -0
  255. package/lib/types/client/session-admission.d.ts +23 -0
  256. package/lib/types/client/session-assets.d.ts +20 -0
  257. package/lib/types/client/session-sources.d.ts +28 -0
  258. package/lib/types/client/settings/card.d.ts +23 -0
  259. package/lib/types/client/settings/fields.d.ts +139 -0
  260. package/lib/types/client/settings/format.d.ts +108 -0
  261. package/lib/types/client/settings/sections/access.d.ts +9 -0
  262. package/lib/types/client/settings/sections/accounts.d.ts +9 -0
  263. package/lib/types/client/settings/sections/attachments.d.ts +15 -0
  264. package/lib/types/client/settings/sections/branding.d.ts +8 -0
  265. package/lib/types/client/settings/sections/common.d.ts +28 -0
  266. package/lib/types/client/settings/sections/embedding.d.ts +8 -0
  267. package/lib/types/client/settings/sections/interface.d.ts +9 -0
  268. package/lib/types/client/settings/sections/lockdown.d.ts +9 -0
  269. package/lib/types/client/settings/sections/session.d.ts +9 -0
  270. package/lib/types/client/settings/sections/sources.d.ts +9 -0
  271. package/lib/types/client/settings/sections/status.d.ts +22 -0
  272. package/lib/types/client/settings/sections.d.ts +25 -0
  273. package/lib/types/client/settings/styles.d.ts +8 -0
  274. package/lib/types/client/settlement.d.ts +6 -0
  275. package/lib/types/client/stream-publisher.d.ts +28 -0
  276. package/lib/types/client/tool-presentation.d.ts +6 -0
  277. package/lib/types/client/turn-sources.d.ts +14 -0
  278. package/lib/types/client/types.d.ts +101 -9
  279. package/lib/types/client/use-right-rail.d.ts +56 -0
  280. package/lib/types/client/use-session-ui-state.d.ts +41 -0
  281. package/lib/types/client/use-transcript-view.d.ts +20 -0
  282. package/lib/types/config-resolvers/accounts.d.ts +15 -0
  283. package/lib/types/config-resolvers/attachments.d.ts +6 -0
  284. package/lib/types/config-resolvers/basics.d.ts +8 -0
  285. package/lib/types/config-resolvers/defaults.d.ts +4 -0
  286. package/lib/types/config-resolvers/lockdown.d.ts +10 -0
  287. package/lib/types/config-resolvers/session.d.ts +6 -0
  288. package/lib/types/config-resolvers/shared.d.ts +16 -0
  289. package/lib/types/config-resolvers/sources.d.ts +6 -0
  290. package/lib/types/config-resolvers/ui.d.ts +6 -0
  291. package/lib/types/entry-redirect.d.ts +20 -0
  292. package/lib/types/host-route.d.ts +14 -1
  293. package/lib/types/index.d.ts +54 -3
  294. package/lib/types/launch-token.d.ts +21 -0
  295. package/lib/types/profile.d.ts +76 -0
  296. package/lib/types/prompt-notes.d.ts +110 -0
  297. package/lib/types/provenance/collector.d.ts +26 -0
  298. package/lib/types/provenance/connectors.d.ts +11 -0
  299. package/lib/types/provenance/dedupe.d.ts +6 -0
  300. package/lib/types/provenance/extractors.d.ts +14 -0
  301. package/lib/types/provenance/file-preview.d.ts +10 -0
  302. package/lib/types/provenance/host-store.d.ts +54 -0
  303. package/lib/types/provenance/index.d.ts +10 -0
  304. package/lib/types/provenance/normalize.d.ts +13 -0
  305. package/lib/types/provenance/reported.d.ts +5 -0
  306. package/lib/types/provenance/types.d.ts +78 -0
  307. package/lib/types/resolve-config.d.ts +8 -3
  308. package/lib/types/secure-session.d.ts +36 -2
  309. package/lib/types/shared/session-key.d.ts +23 -0
  310. package/lib/types/shared/settings.d.ts +10 -0
  311. package/lib/types/thinking-phrases.d.ts +17 -0
  312. package/lib/types/types.d.ts +290 -16
  313. package/lib/types/user-workspace.d.ts +38 -0
  314. package/lib/user-workspace.js +231 -0
  315. package/lib/user-workspace.js.map +1 -0
  316. package/package.json +71 -47
  317. package/CHANGELOG.md +0 -93
  318. package/SPEC-dsh-qa-surface.md +0 -2425
  319. package/docs/ARCHITECTURE.md +0 -66
  320. package/docs/COMPATIBILITY.md +0 -14
  321. package/docs/CONFIGURATION.md +0 -112
  322. package/docs/EMBEDDING.md +0 -13
  323. package/lib/client/components/QaSourcesDrawer.js +0 -46
  324. package/lib/client/components/QaSourcesDrawer.js.map +0 -1
  325. package/lib/types/client/components/QaSourcesDrawer.d.ts +0 -8
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachment-rules.js","sourceRoot":"","sources":["../src/attachment-rules.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAsB,MAAM,CAAC,MAAM,CAAC;IACzE,IAAI;IACJ,UAAU;IACV,KAAK;IACL,MAAM;IACN,KAAK;IACL,MAAM;IACN,OAAO;IACP,MAAM;IACN,KAAK;IACL,MAAM;IACN,KAAK;IACL,KAAK;IACL,MAAM;IACN,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,MAAM;IACN,KAAK;IACL,KAAK;IACL,IAAI;IACJ,KAAK;IACL,KAAK;IACL,IAAI;IACJ,KAAK;IACL,KAAK;IACL,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,MAAM;IACN,IAAI;IACJ,IAAI;IACJ,KAAK;IACL,IAAI;IACJ,MAAM;IACN,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,OAAO;IACP,MAAM;CACP,CAAC,CAAC;AAEH,0DAA0D;AAC1D,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC;AAC1C,MAAM,CAAC,MAAM,wBAAwB,GAAG,MAAM,CAAC;AAC/C,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,CAAC;AAC1C,MAAM,CAAC,MAAM,qBAAqB,GAAG,UAAU,CAAC;AAChD,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC;AACpC,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAErC,0EAA0E;AAC1E,MAAM,iBAAiB,GAAG,6BAA6B,CAAC;AAExD;;;;;;;GAOG;AACH,MAAM,UAAU,uBAAuB,CACrC,MAAyB;IAEzB,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAC9D,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,SAAS;QAChE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAChB,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAC9B,IAAY,EACZ,UAA6B;IAE7B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACvC,IAAI,IAAI,KAAK,EAAE;QAAE,OAAO,KAAK,CAAC;IAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAClC,MAAM,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IACrD,OAAO,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AACrC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACrE,OAAO,UAAU,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;AAC/D,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"attestation.js","sourceRoot":"","sources":["../src/attestation.ts"],"names":[],"mappings":"AAmBA,0EAA0E;AAC1E,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAEhC,MAAM;IADjB,YACW,MAA2B,EACpC,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAC;sBAHN,MAAM;QAIf,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF"}
1
+ {"version":3,"file":"attestation.js","sourceRoot":"","sources":["../src/attestation.ts"],"names":[],"mappings":"AAqBA,0EAA0E;AAC1E,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAEhC,MAAM;IADjB,YACW,MAA2B,EACpC,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAC;sBAHN,MAAM;QAIf,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF"}
package/lib/cli.js ADDED
@@ -0,0 +1,256 @@
1
+ #!/usr/bin/env node
2
+ import { readFileSync } from "node:fs";
3
+ import { pathToFileURL } from "node:url";
4
+ import { QaAccounts, QaAccountsError, defaultAccountsFilePath, } from "./accounts/store.js";
5
+ const defaultIo = {
6
+ out: (line) => process.stdout.write(`${line}\n`),
7
+ err: (line) => process.stderr.write(`${line}\n`),
8
+ };
9
+ const USAGE = `Usage:
10
+ qa-accounts [--file <path>] list
11
+ qa-accounts [--file <path>] show <email>
12
+ qa-accounts [--file <path>] add <email> --password-stdin [--name <name>] [--role admin|user]
13
+ qa-accounts [--file <path>] set-role <email> <admin|user>
14
+ qa-accounts [--file <path>] disable <email> # blocks logins and revokes live tokens
15
+ qa-accounts [--file <path>] enable <email>
16
+ qa-accounts [--file <path>] revoke <email> # invalidates every issued token
17
+ qa-accounts [--file <path>] profile <email> [--full-name <name>]
18
+ [--identity <key>=<value>]... [--clear-identity <key>]...
19
+ [--instructions-file <path|->] [--clear-full-name] [--clear-instructions]
20
+
21
+ The accounts file defaults to \\$DSH_HOME/qa-accounts.json. Passwords are read
22
+ from stdin (one line) so they never land in shell history; --instructions-file -
23
+ reads that text from stdin too. Profile identity keys are free-form here: the
24
+ deployment's accounts.profile.identities decides which of them reach the prompt.`;
25
+ function readPasswordStdin() {
26
+ let password;
27
+ try {
28
+ password = readFileSync(0, "utf8");
29
+ }
30
+ catch (error) {
31
+ throw new Error(`could not read the password from stdin: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
32
+ }
33
+ return password.replace(/\r?\n$/u, "");
34
+ }
35
+ /** Read the instructions text from a file, or from stdin when the path is "-". */
36
+ function readInstructions(path, readStdin) {
37
+ if (path === "-")
38
+ return readStdin();
39
+ try {
40
+ return readFileSync(path, "utf8");
41
+ }
42
+ catch (error) {
43
+ throw new Error(`could not read the instructions from ${path}: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
44
+ }
45
+ }
46
+ /** Print one account's self-declared profile under its `show` header. */
47
+ function printProfile(io, user) {
48
+ const profile = user.profile;
49
+ io.out(` full name: ${profile.fullName === "" ? "(unset)" : profile.fullName}`);
50
+ const keys = Object.keys(profile.identities);
51
+ if (keys.length === 0)
52
+ io.out(" identities: (none)");
53
+ for (const key of keys)
54
+ io.out(` ${key}: ${profile.identities[key] ?? ""}`);
55
+ if (profile.instructions === "") {
56
+ io.out(" instructions: (none)");
57
+ }
58
+ else {
59
+ io.out(` instructions (${profile.instructions.length} characters):`);
60
+ for (const line of profile.instructions.split("\n"))
61
+ io.out(` ${line}`);
62
+ }
63
+ io.out(` updated: ${profile.updatedAt ?? "(never)"}`);
64
+ }
65
+ /** Options that consume the following argument. */
66
+ const VALUE_OPTIONS = new Set([
67
+ "--file",
68
+ "--name",
69
+ "--role",
70
+ "--full-name",
71
+ "--identity",
72
+ "--clear-identity",
73
+ "--instructions-file",
74
+ ]);
75
+ /** Options that stand alone. */
76
+ const FLAG_OPTIONS = new Set([
77
+ "--password-stdin",
78
+ "--clear-full-name",
79
+ "--clear-instructions",
80
+ ]);
81
+ /** Parse one `--identity` argument; the key is normalized like the config's. */
82
+ function identityFlag(raw) {
83
+ const separator = raw.indexOf("=");
84
+ const key = separator < 0 ? "" : raw.slice(0, separator).trim().toLowerCase();
85
+ if (key === "") {
86
+ throw new Error("--identity expects <key>=<value>");
87
+ }
88
+ return { key, value: raw.slice(separator + 1) };
89
+ }
90
+ /** Execute one management command; returns the process exit code. */
91
+ export function run(argv, io, readStdin = readPasswordStdin) {
92
+ const positional = [];
93
+ const options = new Map();
94
+ const identities = [];
95
+ const clearedIdentities = [];
96
+ for (let index = 0; index < argv.length; index += 1) {
97
+ const arg = argv[index];
98
+ if (FLAG_OPTIONS.has(arg)) {
99
+ options.set(arg.slice(2), "true");
100
+ continue;
101
+ }
102
+ if (VALUE_OPTIONS.has(arg)) {
103
+ const value = argv[index + 1];
104
+ if (value === undefined || value.startsWith("--")) {
105
+ throw new Error(`${arg} requires a value`);
106
+ }
107
+ if (arg === "--identity")
108
+ identities.push(identityFlag(value));
109
+ else if (arg === "--clear-identity")
110
+ clearedIdentities.push(value.trim().toLowerCase());
111
+ else
112
+ options.set(arg.slice(2), value);
113
+ index += 1;
114
+ continue;
115
+ }
116
+ positional.push(arg);
117
+ }
118
+ const file = options.get("file") ?? defaultAccountsFilePath();
119
+ const [command, first, second] = positional;
120
+ if (command === undefined || command === "help" || command === "--help") {
121
+ io.out(USAGE);
122
+ return command === undefined ? 1 : 0;
123
+ }
124
+ // Management options that only shape minting behavior; the CLI never mints.
125
+ const accounts = new QaAccounts(file, {
126
+ sessionTtlDays: 30,
127
+ allowRegistration: false,
128
+ });
129
+ const requireArgs = (count) => {
130
+ const given = [first, second].filter((value) => value !== undefined).length;
131
+ if (given < count) {
132
+ throw new Error(`the ${command} command requires ${count} argument(s)`);
133
+ }
134
+ };
135
+ switch (command) {
136
+ case "list": {
137
+ const users = accounts.listUsers();
138
+ if (users.length === 0) {
139
+ io.out("no accounts yet");
140
+ return 0;
141
+ }
142
+ for (const user of users) {
143
+ io.out(`${user.email}\t${user.displayName}\t${user.role}` +
144
+ `${user.disabled ? "\tdisabled" : ""}` +
145
+ `${user.lastLoginAt === null ? "" : `\tlast login ${user.lastLoginAt}`}`);
146
+ }
147
+ return 0;
148
+ }
149
+ case "add": {
150
+ requireArgs(1);
151
+ if (!options.has("password-stdin")) {
152
+ throw new Error("the add command requires --password-stdin");
153
+ }
154
+ const role = options.get("role");
155
+ if (role !== undefined && role !== "admin" && role !== "user") {
156
+ throw new Error("--role must be admin or user");
157
+ }
158
+ const name = options.get("name");
159
+ const user = accounts.addUser(first, readStdin(), {
160
+ ...(name === undefined ? {} : { displayName: name }),
161
+ ...(role === undefined ? {} : { role: role }),
162
+ });
163
+ io.out(`added ${user.email} (${user.role})`);
164
+ return 0;
165
+ }
166
+ case "set-role": {
167
+ requireArgs(2);
168
+ if (second !== "admin" && second !== "user") {
169
+ throw new Error("role must be admin or user");
170
+ }
171
+ const user = accounts.setUserRole(first, second);
172
+ io.out(`${user.email} is now ${user.role}`);
173
+ return 0;
174
+ }
175
+ case "disable": {
176
+ requireArgs(1);
177
+ const user = accounts.setUserDisabled(first, true);
178
+ io.out(`${user.email} disabled; live tokens revoked`);
179
+ return 0;
180
+ }
181
+ case "enable": {
182
+ requireArgs(1);
183
+ const user = accounts.setUserDisabled(first, false);
184
+ io.out(`${user.email} enabled`);
185
+ return 0;
186
+ }
187
+ case "revoke": {
188
+ requireArgs(1);
189
+ const user = accounts.revokeTokens(first);
190
+ io.out(`${user.email} tokens revoked`);
191
+ return 0;
192
+ }
193
+ case "show": {
194
+ requireArgs(1);
195
+ const user = accounts.findUser(first);
196
+ if (user === undefined) {
197
+ throw new Error(`no account for ${first}`);
198
+ }
199
+ io.out(`${user.email}\t${user.displayName}\t${user.role}` +
200
+ `${user.disabled ? "\tdisabled" : ""}`);
201
+ printProfile(io, user);
202
+ return 0;
203
+ }
204
+ case "profile": {
205
+ requireArgs(1);
206
+ const email = first;
207
+ const current = accounts.findUser(email);
208
+ if (current === undefined) {
209
+ throw new Error(`no account for ${email}`);
210
+ }
211
+ // Field-level flags merge into the stored profile; anything the command
212
+ // line does not mention keeps its stored value.
213
+ const mergedIdentities = {
214
+ ...current.profile.identities,
215
+ };
216
+ for (const key of clearedIdentities)
217
+ delete mergedIdentities[key];
218
+ for (const identity of identities) {
219
+ mergedIdentities[identity.key] = identity.value;
220
+ }
221
+ const instructionsFile = options.get("instructions-file");
222
+ const instructions = options.has("clear-instructions")
223
+ ? ""
224
+ : instructionsFile === undefined
225
+ ? current.profile.instructions
226
+ : readInstructions(instructionsFile, readStdin);
227
+ const user = accounts.setProfile(email, {
228
+ fullName: options.has("clear-full-name")
229
+ ? ""
230
+ : (options.get("full-name") ?? current.profile.fullName),
231
+ identities: mergedIdentities,
232
+ instructions,
233
+ });
234
+ io.out(`profile updated for ${user.email}`);
235
+ printProfile(io, user);
236
+ return 0;
237
+ }
238
+ default:
239
+ throw new Error(`unknown command ${JSON.stringify(command)}`);
240
+ }
241
+ }
242
+ export function main(argv, io = defaultIo, readStdin = readPasswordStdin) {
243
+ try {
244
+ return run(argv, io, readStdin);
245
+ }
246
+ catch (error) {
247
+ io.err(`qa-accounts: ${error instanceof QaAccountsError ? `${error.message} (reason: ${error.reason})` : error instanceof Error ? error.message : String(error)}`);
248
+ return 1;
249
+ }
250
+ }
251
+ /* v8 ignore next */
252
+ if (process.argv[1] !== undefined &&
253
+ import.meta.url === pathToFileURL(process.argv[1]).href) {
254
+ process.exitCode = main(process.argv.slice(2));
255
+ }
256
+ //# sourceMappingURL=cli.js.map
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,359 @@
1
+ import { qaStorageNamespace } from "../shared/session-key.js";
2
+ /** The `(reason: <code>)` marker the Host folds into account wire failures. */
3
+ const ACCOUNTS_REASON_MARKER = /\(reason: ([a-z-]+)\)/u;
4
+ /** Union of the own chat ids and every mapped one, own ids first. */
5
+ function mergeOwnershipIds(ownedIds, ownership) {
6
+ if (ownership.length === 0)
7
+ return ownedIds;
8
+ return [
9
+ ...new Set([...ownedIds, ...ownership.map((entry) => entry.sessionId)]),
10
+ ];
11
+ }
12
+ /**
13
+ * Audience-safe copy for the coarse account refusal codes; anything unknown
14
+ * falls back to the generic line.
15
+ */
16
+ export function accountsErrorMessage(code) {
17
+ switch (code) {
18
+ case "invalid-credentials":
19
+ return "Неверный email или пароль.";
20
+ case "admin-required":
21
+ return "Недостаточно прав: действие доступно администратору.";
22
+ case "account-disabled":
23
+ return "Аккаунт отключён администратором.";
24
+ case "email-taken":
25
+ return "Этот email уже зарегистрирован.";
26
+ case "invalid-email":
27
+ return "Введите корректный email.";
28
+ case "weak-password":
29
+ return "Пароль должен быть не короче 8 символов.";
30
+ case "invalid-display-name":
31
+ return "Слишком длинное имя.";
32
+ case "invalid-profile":
33
+ return "Проверьте поля профиля: значение слишком длинное или недопустимое.";
34
+ case "profile-disabled":
35
+ return "Профиль отключён на этом сервере.";
36
+ case "registration-disabled":
37
+ return "Регистрация на этом сервере отключена.";
38
+ case "rate-limited":
39
+ return "Слишком много попыток. Подождите минуту.";
40
+ default:
41
+ return "Не удалось войти. Попробуйте ещё раз.";
42
+ }
43
+ }
44
+ /** Extract the coarse account reason code from a Host wire failure. */
45
+ export function accountsReasonOf(failure) {
46
+ const message = typeof failure === "object" && failure !== null && "message" in failure
47
+ ? String(failure.message ?? "")
48
+ : "";
49
+ return ACCOUNTS_REASON_MARKER.exec(message)?.at(1) ?? null;
50
+ }
51
+ /**
52
+ * Browser-side account lifecycle: token persistence, the checking → gate →
53
+ * authed state machine, and the ownership bookkeeping the sidebar list is
54
+ * built from. Anonymous/failed identity never blocks a deployment with
55
+ * accounts disabled — the caller simply does not mount this controller.
56
+ */
57
+ export class QaAccountsController {
58
+ options;
59
+ listeners = new Set();
60
+ snapshot = { stage: "checking" };
61
+ tokenValue = null;
62
+ disposed = false;
63
+ constructor(options) {
64
+ this.options = options;
65
+ }
66
+ getSnapshot = () => this.snapshot;
67
+ subscribe = (listener) => {
68
+ this.listeners.add(listener);
69
+ return () => this.listeners.delete(listener);
70
+ };
71
+ dispose() {
72
+ this.disposed = true;
73
+ this.listeners.clear();
74
+ }
75
+ /** The bearer token threaded into gated remotes; null while anonymous. */
76
+ /** The bearer token threaded into gated remotes; null while anonymous. */
77
+ token() {
78
+ return this.tokenValue;
79
+ }
80
+ /** Server-owned chat ids (empty until authed); falls back to nothing. */
81
+ ownedIds() {
82
+ return this.snapshot.stage === "authed" ? this.snapshot.ownedIds : [];
83
+ }
84
+ /** Boot probe: restore the stored token and ask the Host who it is. */
85
+ async start() {
86
+ if (this.disposed || this.snapshot.stage !== "checking")
87
+ return;
88
+ this.tokenValue = this.readStoredToken();
89
+ if (this.tokenValue === null) {
90
+ this.publish({ stage: "gate", mode: "login", busy: false, error: null });
91
+ return;
92
+ }
93
+ try {
94
+ const result = await this.options.remote.accountsWhoami(this.tokenValue);
95
+ if (this.disposed)
96
+ return;
97
+ if (result.ok && result.value.authenticated) {
98
+ await this.enterSession(this.tokenValue, result.value.user);
99
+ return;
100
+ }
101
+ if (result.ok) {
102
+ // A definite "not authenticated": the token is stale or rotated.
103
+ this.tokenValue = null;
104
+ this.clearStoredToken();
105
+ }
106
+ }
107
+ catch (error) {
108
+ // The connection is down or the Host refused the round trip; keep the
109
+ // token and the checking stage so a reconnect retries the probe.
110
+ console.warn("dsh-qa-surface: accounts whoami failed", error);
111
+ return;
112
+ }
113
+ if (this.disposed)
114
+ return;
115
+ this.publish({ stage: "gate", mode: "login", busy: false, error: null });
116
+ }
117
+ async login(email, password) {
118
+ await this.authenticate("login", () => this.options.remote.accountsLogin(email, password));
119
+ }
120
+ async register(email, password) {
121
+ if (this.snapshot.stage !== "gate")
122
+ return;
123
+ await this.authenticate("register", () => this.options.remote.accountsRegister(email, password));
124
+ }
125
+ setMode(mode) {
126
+ if (this.snapshot.stage !== "gate" || this.snapshot.busy)
127
+ return;
128
+ this.publish({ ...this.snapshot, mode, error: null });
129
+ }
130
+ /** Drop the token and return to the gate (logout or expired identity). */
131
+ signOut() {
132
+ this.tokenValue = null;
133
+ this.clearStoredToken();
134
+ this.publish({ stage: "gate", mode: "login", busy: false, error: null });
135
+ }
136
+ /** Claim one freshly created chat so the ownership map stays current. */
137
+ async claimNewSession(sessionId) {
138
+ if (this.tokenValue === null || this.disposed)
139
+ return;
140
+ try {
141
+ await this.options.remote.accountsClaimSessions(this.tokenValue, [
142
+ sessionId,
143
+ ]);
144
+ }
145
+ catch (error) {
146
+ console.warn("dsh-qa-surface: session claim failed", error);
147
+ }
148
+ }
149
+ /**
150
+ * Replace the signed-in user's own profile. Resolves to audience-safe
151
+ * refusal copy when the Host rejected the write, and to null once the
152
+ * snapshot carries the stored profile — the form reports the outcome inline
153
+ * rather than through the gate's state machine.
154
+ */
155
+ async updateProfile(input) {
156
+ const token = this.tokenValue;
157
+ if (this.disposed || token === null || this.snapshot.stage !== "authed") {
158
+ return accountsErrorMessage(null);
159
+ }
160
+ try {
161
+ const result = await this.options.remote.accountsUpdateProfile(token, input);
162
+ if (this.disposed || this.snapshot.stage !== "authed")
163
+ return null;
164
+ if (!result.ok) {
165
+ return accountsErrorMessage(accountsReasonOf(result.error));
166
+ }
167
+ this.publish({ ...this.snapshot, user: result.value });
168
+ return null;
169
+ }
170
+ catch (error) {
171
+ console.warn("dsh-qa-surface: profile update failed", error);
172
+ return accountsErrorMessage(null);
173
+ }
174
+ }
175
+ async authenticate(mode, call) {
176
+ if (this.snapshot.stage !== "gate" || this.snapshot.busy || this.disposed) {
177
+ return;
178
+ }
179
+ this.publish({ ...this.snapshot, mode, busy: true, error: null });
180
+ try {
181
+ const result = await call();
182
+ if (this.disposed)
183
+ return;
184
+ if (!result.ok) {
185
+ const reason = accountsReasonOf(result.error);
186
+ // The gate keeps its inputs on a rejection; the copy is coarse.
187
+ this.publish({
188
+ stage: "gate",
189
+ mode,
190
+ busy: false,
191
+ error: accountsErrorMessage(reason),
192
+ });
193
+ return;
194
+ }
195
+ const { token, user } = result.value;
196
+ this.tokenValue = token;
197
+ this.saveStoredToken(token);
198
+ await this.enterSession(token, user);
199
+ }
200
+ catch (error) {
201
+ if (this.disposed)
202
+ return;
203
+ console.warn("dsh-qa-surface: account operation failed", error);
204
+ this.publish({
205
+ stage: "gate",
206
+ mode,
207
+ busy: false,
208
+ error: accountsErrorMessage(null),
209
+ });
210
+ }
211
+ }
212
+ /** Own the account, migrate the legacy index, then project authed. */
213
+ async enterSession(token, user) {
214
+ const migration = this.options.legacyChatIds?.() ?? [];
215
+ let ownedIds = [];
216
+ let ownership = [];
217
+ try {
218
+ const claimed = await this.options.remote.accountsClaimSessions(token, migration);
219
+ // Foreign chats disappear from this browser's index on purpose: their
220
+ // owner claimed them first.
221
+ for (const conflict of claimed.ok ? claimed.value.conflicts : []) {
222
+ this.options.forgetChat?.(conflict);
223
+ }
224
+ const ids = await this.options.remote.accountsOwnedSessions(token);
225
+ ownedIds = ids.ok ? ids.value.ids : [];
226
+ // The cross-user ownership view is a separate operator opt-in. A
227
+ // refusal only costs the grouping, never the admin's own chats.
228
+ if (user.role === "admin" &&
229
+ this.options.config().accounts.showOtherUsersChats) {
230
+ ownership = await this.fetchOwnership(token);
231
+ }
232
+ }
233
+ catch (error) {
234
+ console.warn("dsh-qa-surface: chat migration claim failed", error);
235
+ }
236
+ if (this.disposed)
237
+ return;
238
+ this.publish({
239
+ stage: "authed",
240
+ user,
241
+ ownedIds: mergeOwnershipIds(ownedIds, ownership),
242
+ ownership,
243
+ ownedRevision: 1,
244
+ });
245
+ }
246
+ /** Refresh the owned list after index changes; cheap enough to re-pull. */
247
+ async refreshOwned() {
248
+ if (this.tokenValue === null ||
249
+ this.disposed ||
250
+ this.snapshot.stage !== "authed") {
251
+ return;
252
+ }
253
+ try {
254
+ const ids = await this.options.remote.accountsOwnedSessions(this.tokenValue);
255
+ if (this.disposed || !ids.ok || this.snapshot.stage !== "authed")
256
+ return;
257
+ let ownership = this.snapshot.ownership;
258
+ if (this.snapshot.user.role === "admin" &&
259
+ this.options.config().accounts.showOtherUsersChats) {
260
+ ownership = await this.fetchOwnership(this.tokenValue);
261
+ if (this.disposed || this.snapshot.stage !== "authed")
262
+ return;
263
+ }
264
+ else {
265
+ ownership = [];
266
+ }
267
+ const ownedIds = mergeOwnershipIds(ids.value.ids, ownership);
268
+ if (JSON.stringify(ownedIds) === JSON.stringify(this.snapshot.ownedIds) &&
269
+ JSON.stringify(ownership) === JSON.stringify(this.snapshot.ownership)) {
270
+ return;
271
+ }
272
+ this.publish({
273
+ ...this.snapshot,
274
+ ownedIds,
275
+ ownership,
276
+ ownedRevision: this.snapshot.ownedRevision + 1,
277
+ });
278
+ }
279
+ catch (error) {
280
+ console.warn("dsh-qa-surface: owned sessions refresh failed", error);
281
+ }
282
+ }
283
+ /** The admin cross-user ownership view; failures degrade to an empty map. */
284
+ async fetchOwnership(token) {
285
+ try {
286
+ const listed = await this.options.remote.accountsListOwnership(token);
287
+ return listed.ok ? listed.value.entries : [];
288
+ }
289
+ catch (error) {
290
+ console.warn("dsh-qa-surface: ownership list failed", error);
291
+ return [];
292
+ }
293
+ }
294
+ /** Session id → owner display name; empty unless an admin is signed in. */
295
+ ownerNames() {
296
+ if (this.snapshot.stage !== "authed" ||
297
+ this.snapshot.user.role !== "admin" ||
298
+ !this.options.config().accounts.showOtherUsersChats) {
299
+ return new Map();
300
+ }
301
+ return new Map(this.snapshot.ownership.map((entry) => [
302
+ entry.sessionId,
303
+ entry.displayName,
304
+ ]));
305
+ }
306
+ /**
307
+ * The chat owner's display name for author labels: admins see it on
308
+ * foreign chats only; the owner themself and ordinary accounts see none.
309
+ */
310
+ messageAuthorOf(sessionId) {
311
+ if (this.snapshot.stage !== "authed" ||
312
+ this.snapshot.user.role !== "admin" ||
313
+ !this.options.config().accounts.showOtherUsersChats) {
314
+ return undefined;
315
+ }
316
+ const entry = this.snapshot.ownership.find((candidate) => candidate.sessionId === sessionId);
317
+ if (entry === undefined || entry.userId === this.snapshot.user.id) {
318
+ return undefined;
319
+ }
320
+ return entry.displayName;
321
+ }
322
+ readStoredToken() {
323
+ try {
324
+ const key = this.tokenKey();
325
+ const value = this.options.storage?.getItem(key)?.trim() ?? "";
326
+ return value === "" ? null : value;
327
+ }
328
+ catch {
329
+ return null;
330
+ }
331
+ }
332
+ saveStoredToken(token) {
333
+ try {
334
+ this.options.storage?.setItem(this.tokenKey(), token);
335
+ }
336
+ catch {
337
+ // A denied write only costs the browser its stay-logged-in state.
338
+ }
339
+ }
340
+ clearStoredToken() {
341
+ try {
342
+ this.options.storage?.removeItem(this.tokenKey());
343
+ }
344
+ catch {
345
+ // Harmless: the next whoami reports anonymous.
346
+ }
347
+ }
348
+ tokenKey() {
349
+ return `${qaStorageNamespace(this.options.config())}:account-token`;
350
+ }
351
+ publish(snapshot) {
352
+ if (this.disposed)
353
+ return;
354
+ this.snapshot = snapshot;
355
+ for (const listener of this.listeners)
356
+ listener();
357
+ }
358
+ }
359
+ //# 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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"}