@yadsh/dsh-qa-surface 0.18.0 → 0.20.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 (243) hide show
  1. package/README.md +201 -22
  2. package/lib/access/model-choices.js +103 -0
  3. package/lib/access/model-choices.js.map +1 -0
  4. package/lib/access/model-policy.js +79 -7
  5. package/lib/access/model-policy.js.map +1 -1
  6. package/lib/access/model.js +29 -1
  7. package/lib/access/model.js.map +1 -1
  8. package/lib/access/queue-policy.js +36 -0
  9. package/lib/access/queue-policy.js.map +1 -0
  10. package/lib/access/service.js +124 -7
  11. package/lib/access/service.js.map +1 -1
  12. package/lib/account-remotes.js +10 -1
  13. package/lib/account-remotes.js.map +1 -1
  14. package/lib/accounts/database.js +44 -3
  15. package/lib/accounts/database.js.map +1 -1
  16. package/lib/accounts/store.js +28 -0
  17. package/lib/accounts/store.js.map +1 -1
  18. package/lib/admin/service.js +6 -1
  19. package/lib/admin/service.js.map +1 -1
  20. package/lib/attachment-access.js +147 -0
  21. package/lib/attachment-access.js.map +1 -0
  22. package/lib/chat-sharing/search.js +89 -0
  23. package/lib/chat-sharing/search.js.map +1 -0
  24. package/lib/chat-sharing/transport.js +8 -9
  25. package/lib/chat-sharing/transport.js.map +1 -1
  26. package/lib/client/QaAccountsController.js +43 -8
  27. package/lib/client/QaAccountsController.js.map +1 -1
  28. package/lib/client/QaSessionController.js +106 -32
  29. package/lib/client/QaSessionController.js.map +1 -1
  30. package/lib/client/QaSurface.js +64 -5
  31. package/lib/client/QaSurface.js.map +1 -1
  32. package/lib/client/admin/ModelPolicyEditor.js +28 -2
  33. package/lib/client/admin/ModelPolicyEditor.js.map +1 -1
  34. package/lib/client/admin/RoleEditor.js +18 -1
  35. package/lib/client/admin/RoleEditor.js.map +1 -1
  36. package/lib/client/admin/pages/SkillFiles.js +1 -1
  37. package/lib/client/admin/pages/SkillFiles.js.map +1 -1
  38. package/lib/client/admin/pages/Users.js +36 -16
  39. package/lib/client/admin/pages/Users.js.map +1 -1
  40. package/lib/client/admin/styles.js +3 -0
  41. package/lib/client/admin/styles.js.map +1 -1
  42. package/lib/client/code-source-styles.js +12 -0
  43. package/lib/client/code-source-styles.js.map +1 -0
  44. package/lib/client/components/QaChangelog.js +96 -0
  45. package/lib/client/components/QaChangelog.js.map +1 -1
  46. package/lib/client/components/QaChatActions.js +36 -14
  47. package/lib/client/components/QaChatActions.js.map +1 -1
  48. package/lib/client/components/QaCodeSourcePicker.js +18 -0
  49. package/lib/client/components/QaCodeSourcePicker.js.map +1 -0
  50. package/lib/client/components/QaComposer.js +11 -12
  51. package/lib/client/components/QaComposer.js.map +1 -1
  52. package/lib/client/components/QaComposerSettings.js +202 -0
  53. package/lib/client/components/QaComposerSettings.js.map +1 -0
  54. package/lib/client/components/QaFormItem.js +74 -38
  55. package/lib/client/components/QaFormItem.js.map +1 -1
  56. package/lib/client/components/QaHistoryCatalog.js +261 -0
  57. package/lib/client/components/QaHistoryCatalog.js.map +1 -0
  58. package/lib/client/components/QaInputForm.js +115 -32
  59. package/lib/client/components/QaInputForm.js.map +1 -1
  60. package/lib/client/components/QaModelSelector.js +21 -0
  61. package/lib/client/components/QaModelSelector.js.map +1 -0
  62. package/lib/client/components/QaRequestWait.js +15 -0
  63. package/lib/client/components/QaRequestWait.js.map +1 -0
  64. package/lib/client/components/QaSidebar.js +25 -24
  65. package/lib/client/components/QaSidebar.js.map +1 -1
  66. package/lib/client/composer-settings-styles.js +21 -0
  67. package/lib/client/composer-settings-styles.js.map +1 -0
  68. package/lib/client/forms-styles.js +35 -11
  69. package/lib/client/forms-styles.js.map +1 -1
  70. package/lib/client/history-organization-styles.js +31 -0
  71. package/lib/client/history-organization-styles.js.map +1 -0
  72. package/lib/client/history-organization.js +155 -0
  73. package/lib/client/history-organization.js.map +1 -0
  74. package/lib/client/index.js +13 -2
  75. package/lib/client/index.js.map +1 -1
  76. package/lib/client/project-session-state.js.map +1 -1
  77. package/lib/client/request-wait-styles.js +7 -0
  78. package/lib/client/request-wait-styles.js.map +1 -0
  79. package/lib/client/settings/sections/attachments.js +7 -1
  80. package/lib/client/settings/sections/attachments.js.map +1 -1
  81. package/lib/client/settings/sections/session.js +1 -1
  82. package/lib/client/settings/sections/session.js.map +1 -1
  83. package/lib/client/styles.js +20 -1
  84. package/lib/client/styles.js.map +1 -1
  85. package/lib/client/types.js.map +1 -1
  86. package/lib/client/use-chat-code-source.js +156 -0
  87. package/lib/client/use-chat-code-source.js.map +1 -0
  88. package/lib/client/use-history-organization.js +48 -0
  89. package/lib/client/use-history-organization.js.map +1 -0
  90. package/lib/client/use-model-selection.js +96 -0
  91. package/lib/client/use-model-selection.js.map +1 -0
  92. package/lib/client/use-qa-file-drop.js +81 -0
  93. package/lib/client/use-qa-file-drop.js.map +1 -0
  94. package/lib/client/user-settings/IntegrationTokensPage.js +42 -6
  95. package/lib/client/user-settings/IntegrationTokensPage.js.map +1 -1
  96. package/lib/client/user-settings/UserSettingsDialog.js +1 -1
  97. package/lib/client/user-settings/UserSettingsDialog.js.map +1 -1
  98. package/lib/client.js +131 -27
  99. package/lib/client.js.map +1 -1
  100. package/lib/code-source-selection.js +102 -0
  101. package/lib/code-source-selection.js.map +1 -0
  102. package/lib/config-resolvers/accounts.js +26 -1
  103. package/lib/config-resolvers/accounts.js.map +1 -1
  104. package/lib/config-resolvers/defaults.js +5 -0
  105. package/lib/config-resolvers/defaults.js.map +1 -1
  106. package/lib/config-resolvers/integration.js +8 -1
  107. package/lib/config-resolvers/integration.js.map +1 -1
  108. package/lib/config-resolvers/session.js +2 -0
  109. package/lib/config-resolvers/session.js.map +1 -1
  110. package/lib/config.js +51 -3
  111. package/lib/config.js.map +1 -1
  112. package/lib/enforcement/skill-policy.js +37 -2
  113. package/lib/enforcement/skill-policy.js.map +1 -1
  114. package/lib/filesystem-intent.js +39 -0
  115. package/lib/filesystem-intent.js.map +1 -0
  116. package/lib/forms/attachments.js +18 -2
  117. package/lib/forms/attachments.js.map +1 -1
  118. package/lib/forms/errors.js +6 -1
  119. package/lib/forms/errors.js.map +1 -1
  120. package/lib/forms/gate.js +28 -2
  121. package/lib/forms/gate.js.map +1 -1
  122. package/lib/forms/schema-errors.js +47 -0
  123. package/lib/forms/schema-errors.js.map +1 -0
  124. package/lib/forms/schema.js +29 -20
  125. package/lib/forms/schema.js.map +1 -1
  126. package/lib/index.js +189 -84
  127. package/lib/index.js.map +1 -1
  128. package/lib/integration/http.js +9 -10
  129. package/lib/integration/http.js.map +1 -1
  130. package/lib/integration/service.js +9 -0
  131. package/lib/integration/service.js.map +1 -1
  132. package/lib/personal-skills/provider.js +9 -1
  133. package/lib/personal-skills/provider.js.map +1 -1
  134. package/lib/personal-skills/service.js +4 -0
  135. package/lib/personal-skills/service.js.map +1 -1
  136. package/lib/personal-skills/shared-seed.js +65 -0
  137. package/lib/personal-skills/shared-seed.js.map +1 -0
  138. package/lib/prompt-notes.js +19 -1
  139. package/lib/prompt-notes.js.map +1 -1
  140. package/lib/provenance/collector.js +1 -0
  141. package/lib/provenance/collector.js.map +1 -1
  142. package/lib/provenance/extractors.js +6 -1
  143. package/lib/provenance/extractors.js.map +1 -1
  144. package/lib/qa-tools/catalog.js +18 -1
  145. package/lib/qa-tools/catalog.js.map +1 -1
  146. package/lib/qa-tools/code-files.js +207 -0
  147. package/lib/qa-tools/code-files.js.map +1 -0
  148. package/lib/qa-tools/code-tools.js +158 -0
  149. package/lib/qa-tools/code-tools.js.map +1 -0
  150. package/lib/qa-tools/docs-tools.js +49 -12
  151. package/lib/qa-tools/docs-tools.js.map +1 -1
  152. package/lib/qa-tools/index.js +4 -0
  153. package/lib/qa-tools/index.js.map +1 -1
  154. package/lib/qa-tools/request-user-form.js +27 -7
  155. package/lib/qa-tools/request-user-form.js.map +1 -1
  156. package/lib/request-scheduler.js +262 -0
  157. package/lib/request-scheduler.js.map +1 -0
  158. package/lib/resolve-config.js +9 -1
  159. package/lib/resolve-config.js.map +1 -1
  160. package/lib/secure-session.js +62 -56
  161. package/lib/secure-session.js.map +1 -1
  162. package/lib/session-create.js +125 -0
  163. package/lib/session-create.js.map +1 -0
  164. package/lib/session-model.js +43 -1
  165. package/lib/session-model.js.map +1 -1
  166. package/lib/shared/history-folder.js +18 -0
  167. package/lib/shared/history-folder.js.map +1 -0
  168. package/lib/typert.host.js +793 -159
  169. package/lib/typert.remote-client.d.ts +19 -7
  170. package/lib/typert.remote-client.js +726 -148
  171. package/lib/types/access/model-choices.d.ts +16 -0
  172. package/lib/types/access/model-policy.d.ts +13 -7
  173. package/lib/types/access/model.d.ts +9 -0
  174. package/lib/types/access/queue-policy.d.ts +30 -0
  175. package/lib/types/access/service.d.ts +27 -0
  176. package/lib/types/account-remotes.d.ts +5 -4
  177. package/lib/types/accounts/database.d.ts +5 -0
  178. package/lib/types/accounts/store.d.ts +6 -0
  179. package/lib/types/attachment-access.d.ts +29 -0
  180. package/lib/types/chat-sharing/search.d.ts +5 -0
  181. package/lib/types/chat-sharing/transport.d.ts +1 -1
  182. package/lib/types/client/QaAccountsController.d.ts +3 -1
  183. package/lib/types/client/QaSessionController.d.ts +31 -14
  184. package/lib/types/client/QaSurface.d.ts +2 -0
  185. package/lib/types/client/admin/ModelPolicyEditor.d.ts +2 -0
  186. package/lib/types/client/code-source-styles.d.ts +2 -0
  187. package/lib/types/client/components/QaChatActions.d.ts +3 -1
  188. package/lib/types/client/components/QaCodeSourcePicker.d.ts +9 -0
  189. package/lib/types/client/components/QaComposer.d.ts +2 -0
  190. package/lib/types/client/components/QaComposerSettings.d.ts +16 -0
  191. package/lib/types/client/components/QaFormItem.d.ts +4 -2
  192. package/lib/types/client/components/QaHistoryCatalog.d.ts +19 -0
  193. package/lib/types/client/components/QaInputForm.d.ts +3 -2
  194. package/lib/types/client/components/QaModelSelector.d.ts +4 -0
  195. package/lib/types/client/components/QaRequestWait.d.ts +6 -0
  196. package/lib/types/client/components/QaSidebar.d.ts +3 -0
  197. package/lib/types/client/composer-settings-styles.d.ts +2 -0
  198. package/lib/types/client/forms-styles.d.ts +1 -1
  199. package/lib/types/client/history-organization-styles.d.ts +3 -0
  200. package/lib/types/client/history-organization.d.ts +38 -0
  201. package/lib/types/client/project-session-state.d.ts +2 -4
  202. package/lib/types/client/request-wait-styles.d.ts +2 -0
  203. package/lib/types/client/types.d.ts +15 -7
  204. package/lib/types/client/use-chat-code-source.d.ts +20 -0
  205. package/lib/types/client/use-history-organization.d.ts +8 -0
  206. package/lib/types/client/use-model-selection.d.ts +24 -0
  207. package/lib/types/client/use-qa-file-drop.d.ts +12 -0
  208. package/lib/types/code-source-selection.d.ts +28 -0
  209. package/lib/types/code-sources.js +2 -0
  210. package/lib/types/code-sources.js.map +1 -0
  211. package/lib/types/config-resolvers/integration.d.ts +7 -1
  212. package/lib/types/filesystem-intent.d.ts +12 -0
  213. package/lib/types/forms/attachments.d.ts +5 -2
  214. package/lib/types/forms/errors.d.ts +3 -2
  215. package/lib/types/forms/gate.d.ts +4 -2
  216. package/lib/types/forms/schema-errors.d.ts +7 -0
  217. package/lib/types/forms/types.d.ts +14 -0
  218. package/lib/types/index.d.ts +41 -15
  219. package/lib/types/integration/http.d.ts +1 -3
  220. package/lib/types/integration/service.d.ts +2 -0
  221. package/lib/types/personal-skills/shared-seed.d.ts +12 -0
  222. package/lib/types/prompt-notes.d.ts +5 -1
  223. package/lib/types/qa-tools/catalog.d.ts +4 -3
  224. package/lib/types/qa-tools/code-files.d.ts +59 -0
  225. package/lib/types/qa-tools/code-tools.d.ts +7 -0
  226. package/lib/types/qa-tools/docs-tools.d.ts +4 -0
  227. package/lib/types/qa-tools/index.d.ts +3 -1
  228. package/lib/types/qa-tools/request-user-form.d.ts +1 -1
  229. package/lib/types/request-scheduler.d.ts +47 -0
  230. package/lib/types/secure-session.d.ts +12 -26
  231. package/lib/types/session-create.d.ts +29 -0
  232. package/lib/types/session-model.d.ts +11 -2
  233. package/lib/types/shared/history-folder.d.ts +4 -0
  234. package/lib/types/types/accounts.d.ts +11 -0
  235. package/lib/types/types/capability.d.ts +31 -4
  236. package/lib/types/types/code-sources.d.ts +12 -0
  237. package/lib/types/types/config.d.ts +20 -0
  238. package/lib/types/types/session.d.ts +8 -0
  239. package/lib/types/types.d.ts +1 -0
  240. package/lib/types/user-workspace.d.ts +4 -6
  241. package/lib/user-workspace.js +20 -71
  242. package/lib/user-workspace.js.map +1 -1
  243. package/package.json +13 -10
@@ -1,2 +1,2 @@
1
- export declare const QA_FORM_STYLES = "\n.dsh-qa-form{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2);border-radius:12px;padding:16px;max-height:75vh;overflow:hidden;overflow-wrap:anywhere;color:var(--dsw-alias-label-primary);display:flex;flex-direction:column}\n.dsh-qa-form__content{overflow:auto;min-height:0;padding:0 2px}.dsh-qa-form>header,.dsh-qa-form>footer,.dsh-qa-form>nav,.dsh-qa-form>p{flex-shrink:0}.dsh-qa-form>footer{border-top:1px solid var(--dsw-alias-border-l2);padding-top:12px;margin-top:8px}\n.dsh-qa-form>header{max-height:96px;overflow:auto}\n.dsh-qa-form header,.dsh-qa-form footer,.dsh-qa-form nav{display:flex;gap:8px;align-items:center;flex-wrap:wrap}\n.dsh-qa-form header{justify-content:space-between}.dsh-qa-form nav{margin:12px 0}.dsh-qa-form h3{margin:12px 0}\n.dsh-qa-form button{font:inherit;color:inherit;background:var(--dsw-alias-bg-layer-3);border:1px solid var(--dsw-alias-border-l2);border-radius:8px;padding:8px 12px;cursor:pointer}\n.dsh-qa-form button:disabled{opacity:.55;cursor:default}.dsh-qa-form button:focus-visible,.dsh-qa-form input:focus-visible,.dsh-qa-form textarea:focus-visible{outline:var(--dsw-focus-ring-width,2px) solid var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary));outline-offset:2px}\n.dsh-qa-form__item{min-width:0;border:0;border-bottom:1px solid var(--dsw-alias-border-l2);padding:12px 0;margin:0 0 12px}.dsh-qa-form legend{font-weight:600}.dsh-qa-form small{font-weight:400;display:block;color:var(--dsw-alias-label-tertiary)}\n.dsh-qa-form__hint{font-size:13px;color:var(--dsw-alias-label-secondary)}.dsh-qa-form label{display:block}.dsh-qa-form input[type=text],.dsh-qa-form textarea{display:block;box-sizing:border-box;width:100%;font:inherit;color:inherit;background:var(--dsw-alias-bg-layer-3);border:1px solid var(--dsw-alias-border-l2);border-radius:8px;padding:10px;margin:6px 0}\n.dsh-qa-form__choices>label{display:flex;gap:8px;align-items:baseline;margin:8px 0}.dsh-qa-form__files{border:1px dashed var(--dsw-alias-border-l2);border-radius:8px;padding:12px;margin-top:12px}.dsh-qa-form input[type=file]{max-width:100%;display:block;margin:8px 0}.dsh-qa-form__files ul{padding-left:18px}.dsh-qa-form__files li{margin:10px 0}.dsh-qa-form__files button{margin:4px}.dsh-qa-form__review>div{border-bottom:1px solid var(--dsw-alias-border-l2);margin-bottom:12px}.dsh-qa-form [role=alert]{color:var(--dsw-alias-label-primary);border:1px solid var(--dsw-alias-border-l2);padding:10px;border-radius:8px}\n@media(max-width:600px){.dsh-qa-form{padding:12px;max-height:80vh}.dsh-qa-form footer button{flex:1 1 auto}.dsh-qa-form nav button{font-size:12px}}\n";
1
+ export declare const QA_FORM_STYLES = "\n.dsh-qa-form{box-sizing:border-box;min-width:0;max-height:min(720px,calc(100dvh - 160px));overflow:hidden;overflow-wrap:anywhere;background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-primary);border:1px solid var(--dsw-alias-border-l2);border-radius:16px;display:flex;flex-direction:column;font:inherit;font-size:14px;line-height:20px}\n.dsh-qa-form *{box-sizing:border-box}.dsh-qa-form p,.dsh-qa-form h3,.dsh-qa-form h4{margin:0}\n.dsh-qa-form .title-3{font-size:16px;line-height:24px;font-weight:600}.dsh-qa-form .title-4{font-size:14px;line-height:20px;font-weight:600}.dsh-qa-form .caption-5{font-size:12px;line-height:16px;font-weight:400}\n.dsh-qa-form>header{padding:16px 24px;display:flex;align-items:flex-start;justify-content:space-between;gap:16px;flex-shrink:0}.dsh-qa-form__heading{min-width:0;display:grid;gap:4px}.dsh-qa-form__heading strong{display:block;text-wrap:pretty}\n.dsh-qa-form__description{color:var(--dsw-alias-label-secondary);text-wrap:pretty}.dsh-qa-form__hint{font-size:12px;line-height:16px;color:var(--dsw-alias-label-secondary)}\n.dsh-qa-form__badge{display:inline-flex;flex-shrink:0;align-items:center;border-radius:999px;background:var(--dsw-alias-bg-module-platform);color:var(--dsw-alias-label-secondary);padding:4px 8px;white-space:nowrap}\n.dsh-qa-form__status{display:flex;flex-wrap:wrap;gap:4px 16px;padding:0 24px 12px;color:var(--dsw-alias-label-secondary);font-size:12px;line-height:16px;flex-shrink:0}\n.dsh-qa-form>nav{display:flex;gap:8px;overflow:auto;flex-shrink:0;padding:0 24px 16px;scrollbar-width:thin}.dsh-qa-form>nav button{display:flex;align-items:center;gap:8px;white-space:nowrap;font-weight:500;background:transparent}\n.dsh-qa-form__step-number{width:24px;height:24px;border-radius:999px;display:inline-grid;place-items:center;background:var(--dsw-alias-bg-module-platform);font-size:12px;line-height:16px;flex-shrink:0}\n.dsh-qa-form>nav button[aria-current=step]{background:color-mix(in srgb,var(--dsw-alias-state-business-primary) 12%,transparent);border-color:var(--dsw-alias-state-business-primary);color:var(--dsw-alias-label-primary)}\n.dsh-qa-form>nav button[aria-current=step] .dsh-qa-form__step-number{background:color-mix(in srgb,var(--dsw-alias-state-business-primary) 24%,transparent)}\n.dsh-qa-form__content{overflow:auto;min-height:0;padding:0 24px 16px;overscroll-behavior:contain;scrollbar-gutter:stable}.dsh-qa-form__step{display:grid;gap:16px}.dsh-qa-form__step-heading{display:grid;gap:4px}\n.dsh-qa-form__item{min-width:0;margin:0;padding:16px;border:1px solid var(--dsw-alias-border-l2);border-radius:12px;background:var(--dsw-alias-bg-layer-3)}\n.dsh-qa-form__item-title{max-width:100%;padding:0 4px;display:flex;align-items:center;gap:8px;flex-wrap:wrap;color:var(--dsw-alias-label-primary)}\n.dsh-qa-form__item>.dsh-qa-form__description,.dsh-qa-form__item>.dsh-qa-form__hint{margin-bottom:8px}.dsh-qa-form__answer{display:block}\n.dsh-qa-form input[type=text],.dsh-qa-form textarea{display:block;min-width:0;width:100%;font:inherit;color:inherit;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l2);border-radius:8px;padding:8px 12px;min-height:40px}.dsh-qa-form textarea{resize:vertical;min-height:96px}\n.dsh-qa-form__choices{display:grid;gap:8px}.dsh-qa-form__choice{display:grid;grid-template-columns:16px minmax(0,1fr);align-items:start;gap:12px;border:1px solid var(--dsw-alias-border-l2);border-radius:8px;padding:12px;background:var(--dsw-alias-bg-layer-2);cursor:pointer}\n.dsh-qa-form__choice:hover{border-color:var(--dsw-alias-label-dimmed)}.dsh-qa-form__choice.is-selected{border-color:var(--dsw-alias-state-business-primary);background:color-mix(in srgb,var(--dsw-alias-state-business-primary) 8%,var(--dsw-alias-bg-layer-2))}\n.dsh-qa-form__choice input{width:16px;height:16px;margin:2px 0 0;accent-color:var(--dsw-alias-state-business-primary)}.dsh-qa-form__choice-copy{display:grid;gap:4px;min-width:0}.dsh-qa-form__choice-copy>.title-4{display:flex;align-items:center;gap:8px;flex-wrap:wrap}\n.dsh-qa-form__recommended{color:var(--dsw-alias-state-business-primary);font-weight:500}.dsh-qa-form__other{display:grid;gap:8px;padding-top:4px}\n.dsh-qa-form button,.dsh-qa-form__picker{appearance:none;font:inherit;font-weight:500;line-height:20px;color:inherit;background:var(--dsw-alias-bg-layer-3);border:1px solid var(--dsw-alias-border-l2);border-radius:8px;padding:8px 12px;min-height:40px;cursor:pointer;text-align:center;display:inline-flex;align-items:center;justify-content:center;gap:8px}\n.dsh-qa-form button:hover,.dsh-qa-form__picker:hover{border-color:var(--dsw-alias-label-dimmed)}.dsh-qa-form button:disabled,.dsh-qa-form .is-disabled{opacity:.5;cursor:default}\n.dsh-qa-form button:focus-visible,.dsh-qa-form input:focus-visible,.dsh-qa-form textarea:focus-visible,.dsh-qa-form__picker:focus-within{outline:var(--dsw-focus-ring-width,2px) solid var(--dsw-focus-ring-color,var(--dsw-alias-state-business-primary));outline-offset:2px}\n.dsh-qa-form .dsh-qa-form__primary,.dsh-qa-form__dropzone>.dsh-qa-form__picker{font-weight:600;border-color:var(--dsw-alias-state-business-primary);background:color-mix(in srgb,var(--dsw-alias-state-business-primary) 16%,var(--dsw-alias-bg-layer-2))}\n.dsh-qa-form .dsh-qa-form__text-button{background:transparent;justify-self:start}.dsh-qa-form__files{display:grid;gap:8px;margin-top:12px;padding:16px;border:1px dashed var(--dsw-alias-label-dimmed);border-radius:8px;background:var(--dsw-alias-bg-layer-2)}\n.dsh-qa-form__file-heading{display:flex;align-items:center;justify-content:space-between;gap:8px}.dsh-qa-form__dropzone{display:flex;align-items:center;gap:12px;flex-wrap:wrap;padding-top:4px}.dsh-qa-form__picker{position:relative;max-width:100%}\n.dsh-qa-form__picker input[type=file]{position:absolute;width:1px;height:1px;opacity:0;overflow:hidden;clip-path:inset(50%)}\n.dsh-qa-form__file-list{display:grid;gap:8px;padding:0;margin:4px 0 0;list-style:none}.dsh-qa-form__file-row,.dsh-qa-form__upload{display:flex;align-items:center;gap:12px;flex-wrap:wrap;border:1px solid var(--dsw-alias-border-l2);border-radius:8px;padding:12px;background:var(--dsw-alias-bg-layer-3)}\n.dsh-qa-form__file-copy{display:grid;gap:4px;min-width:0;flex:1 1 160px}.dsh-qa-form__file-actions{display:flex;gap:8px;flex-wrap:wrap}.dsh-qa-form__file-actions button,.dsh-qa-form__picker--small{font-size:12px;line-height:16px;min-height:32px;padding:4px 8px}\n.dsh-qa-form__field-errors{display:grid;gap:4px;margin-top:8px;color:var(--dsw-alias-state-error-primary);font-size:12px;line-height:16px}.dsh-qa-form [aria-invalid=true]{border-color:var(--dsw-alias-state-error-primary)}\n.dsh-qa-form [role=alert]{display:grid;gap:8px;color:var(--dsw-alias-label-primary);border:1px solid var(--dsw-alias-state-error-primary);padding:12px;border-radius:8px;margin-bottom:16px}\n.dsh-qa-form>footer{display:grid;gap:8px;padding:12px 24px 16px;flex-shrink:0;background:var(--dsw-alias-bg-layer-2)}.dsh-qa-form__actions{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap}.dsh-qa-form__navigation,.dsh-qa-form__secondary{display:flex;gap:8px;flex-wrap:wrap}\n.dsh-qa-form__review{display:grid;gap:16px}.dsh-qa-form__review-step{display:grid;gap:12px}.dsh-qa-form__review-item{display:grid;gap:8px;padding:16px;border:1px solid var(--dsw-alias-border-l2);border-radius:12px;background:var(--dsw-alias-bg-layer-3);white-space:pre-wrap}\n.dsh-qa-form--summary{padding:16px 24px;flex-direction:row;align-items:center;justify-content:space-between;gap:16px}.dsh-qa-form--summary>div:first-child{display:grid;gap:4px;min-width:0}\n@media(max-width:600px){.dsh-qa-form{max-height:calc(100dvh - 160px);border-radius:12px}.dsh-qa-form>header{padding:12px 16px;gap:8px}.dsh-qa-form__status{padding:0 16px 12px}.dsh-qa-form>nav{padding:0 16px 12px}.dsh-qa-form__content{padding:0 16px 12px}.dsh-qa-form__item,.dsh-qa-form__files{padding:12px}.dsh-qa-form>footer{padding:12px 16px}.dsh-qa-form__actions{flex-direction:column;align-items:stretch}.dsh-qa-form__navigation{display:grid;grid-template-columns:1fr 1fr}.dsh-qa-form__secondary{justify-content:space-between}.dsh-qa-form__secondary button{font-size:12px;line-height:16px;min-height:32px;padding:4px 8px}.dsh-qa-form--summary{padding:12px 16px;align-items:flex-start}.dsh-qa-form__file-row{align-items:flex-start}}\n";
2
2
  //# sourceMappingURL=forms-styles.d.ts.map
@@ -0,0 +1,3 @@
1
+ /** Virtual history controls inherit the same palette as the existing sidebar. */
2
+ export declare const historyOrganizationStyles: string;
3
+ //# sourceMappingURL=history-organization-styles.d.ts.map
@@ -0,0 +1,38 @@
1
+ import type { QaHistoryFolderTarget } from "../types/accounts.js";
2
+ /** Browser-only presentation metadata. No entry is a filesystem path. */
3
+ export interface QaHistoryFolder {
4
+ readonly id: string;
5
+ readonly name: string;
6
+ readonly collapsed: boolean;
7
+ }
8
+ export interface QaHistoryOrganization {
9
+ readonly folders: readonly QaHistoryFolder[];
10
+ readonly assignments: Readonly<Record<string, string>>;
11
+ readonly pinned: readonly string[];
12
+ readonly order: readonly string[];
13
+ /** Routing was imported, or the reader explicitly chose a folder/root. */
14
+ readonly folderHandled?: readonly string[];
15
+ }
16
+ export declare const EMPTY_HISTORY: QaHistoryOrganization;
17
+ /** Treat storage as untrusted and tolerate older, partial or damaged values. */
18
+ export declare function parseHistoryOrganization(raw: string | null): QaHistoryOrganization;
19
+ export declare function historyFolderOf(state: QaHistoryOrganization, id: string): string | null;
20
+ /** A removed folder releases its chats, including pinned chats, to the root. */
21
+ export declare function removeHistoryFolder(state: QaHistoryOrganization, folderId: string): QaHistoryOrganization;
22
+ /** Insert relative to the visible target without losing filtered or unloaded ids. */
23
+ export declare function insertHistoryId(ids: readonly string[], id: string, before?: string): string[];
24
+ export type QaHistoryDestination = {
25
+ readonly kind: "pinned";
26
+ } | {
27
+ readonly kind: "folder";
28
+ readonly id: string | null;
29
+ };
30
+ /** Moving a pinned chat into a folder unpins it; pinning retains its folder. */
31
+ export declare function moveHistoryChat(state: QaHistoryOrganization, id: string, destination: QaHistoryDestination, visibleOrder: readonly string[], before?: string): QaHistoryOrganization;
32
+ /** Apply server defaults once; subsequent manual moves and deletions win. */
33
+ export declare function importIntegrationFolders(state: QaHistoryOrganization, hints: Readonly<Record<string, QaHistoryFolderTarget>>, visibleIds: ReadonlySet<string>): QaHistoryOrganization;
34
+ /** Unordered rows keep recency order until the reader arranges them. */
35
+ export declare function orderHistoryRows<T extends {
36
+ readonly id: string;
37
+ }>(rows: readonly T[], order: readonly string[]): T[];
38
+ //# sourceMappingURL=history-organization.d.ts.map
@@ -40,10 +40,8 @@ export interface QaBoundProjectionInput {
40
40
  readonly questions: readonly QaPendingQuestion[];
41
41
  readonly operationError: string | null;
42
42
  /**
43
- * A send the stand had no room for. The dialog is the whole of what the
44
- * visitor learns: the question never reached the Host, so the transcript has
45
- * no row to carry the refusal on. Distinct from `queue`, the waiting rows of
46
- * this chat.
43
+ * Server admission status for this waiting chat, or a legacy Host's
44
+ * pre-send refusal. Distinct from `queue`, the next messages of this chat.
47
45
  */
48
46
  readonly requestQueue: QaQueueStatus | null;
49
47
  readonly policyReady: boolean;
@@ -0,0 +1,2 @@
1
+ export declare const requestWaitStyles = "\n.dsh-qa-request-wait{display:flex;align-items:center;gap:8px;align-self:flex-start;width:fit-content;max-width:100%;box-sizing:border-box;margin:0 0 10px;padding:6px 12px;border:1px solid var(--dsw-alias-border-l2);border-radius:8px;background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-secondary);font-size:13px;line-height:1.45;overflow-wrap:anywhere}\n.dsh-qa-request-wait__spinner{width:12px;height:12px;flex:none;border:1.5px solid var(--dsw-alias-border-l2);border-top-color:var(--dsw-alias-label-secondary);border-radius:50%;animation:dsh-qa-request-spin 1s linear infinite}\n@keyframes dsh-qa-request-spin{to{transform:rotate(360deg)}}\n@media(prefers-reduced-motion:reduce){.dsh-qa-request-wait__spinner{animation:none}}\n";
2
+ //# sourceMappingURL=request-wait-styles.d.ts.map
@@ -1,7 +1,7 @@
1
1
  import type { ClientRemote } from "@deepseek-ai/dsh-api-gateway/client";
2
2
  import type { ISessions, SessionFace } from "@deepseek-ai/dsh-api-session-controller/client";
3
3
  import type { UiConversation } from "@deepseek-ai/dsh-client-ui-conversation/client";
4
- import type { QaAccountNotificationsInput, QaAccountProfileInput, QaAccountSession, QaAccountStartersInput, QaAccountStarter, QaAccountUserPublic, QaAccessAdminSnapshot, QaApprovalDecision, QaClaimResult, QaLockdownProof, QaModelCatalogEntry, QaOwnershipEntry, QaPasswordResetRequest, QaPendingApproval, QaPendingQuestion, QaQuestionAnswerItem, QaQueueStatus, QaIssuedServiceToken, QaServiceTokenCreateInput, QaServiceTokenSummary, QaSessionState, QaSkillDocument, QaSkillDraftInput, QaSkillRemoval, QaSkillSummary, QaSkillToolDescriptor, QaSkillValidation, QaSourceFilePreview, QaTurnSources, QaWhoamiResult, QaDocumentPreview, QaSpreadsheetPreviewSelection, QaWorkspaceFile, QaWorkspaceFileChunk, QaDocumentWorkflowStatus, QaWorkspaceListing, QaCapabilitySelection, QaCurrentAccess, QaSessionAccess, QaSkillActivationRecord, QaSkillAssignmentOverride, QaSubrole, QaUserAccess, QaAdminAuditEvent, QaAdminOverview, QaAdminPage, QaAdminSkillScope, QaAdminSkillsView, QaAdminUserDetail, QaAdminUserRow, QaAdminUserUpdate, QaAuditQuery, QaConversationDetail, QaConversationDeletion, QaConversationQuery, QaConversationReview, QaConversationReviewInput, QaConversationSummary, QaExpertMemoryDraft, QaExpertMemoryPage, QaExpertMemoryRecord, QaExpertMemoryScope, QaFeedbackQuery, QaFeedbackRow, QaMessageFeedback, QaMessageFeedbackInput, QaQualityMetrics, QaReviewQueueItem, QaReviewQueueRow, QaSlashCatalog, QaSlashExecution, QaSlashSubmitAttachment, QaUserQuery } from "../types.js";
4
+ import type { QaAccountNotificationsInput, QaAccountProfileInput, QaAccountSession, QaAccountStartersInput, QaAccountStarter, QaAccountUserPublic, QaAccessAdminSnapshot, QaApprovalDecision, QaClaimResult, QaLockdownProof, QaModelCatalogEntry, QaModelOptions, QaOwnershipEntry, QaPasswordResetRequest, QaPendingApproval, QaPendingQuestion, QaQuestionAnswerItem, QaQueueStatus, QaIssuedServiceToken, QaServiceTokenCreateInput, QaServiceTokenSummary, QaSessionState, QaSkillDocument, QaSkillDraftInput, QaSkillRemoval, QaSkillSummary, QaSkillToolDescriptor, QaSkillValidation, QaSourceFilePreview, QaTurnSources, QaWhoamiResult, QaDocumentPreview, QaSpreadsheetPreviewSelection, QaWorkspaceFile, QaWorkspaceFileChunk, QaDocumentWorkflowStatus, QaWorkspaceListing, QaCapabilitySelection, QaCurrentAccess, QaSessionAccess, QaSkillActivationRecord, QaSkillAssignmentOverride, QaSubrole, QaUserAccess, QaAdminAuditEvent, QaAdminOverview, QaAdminPage, QaAdminSkillScope, QaAdminSkillsView, QaAdminUserDetail, QaAdminUserRow, QaAdminUserUpdate, QaAuditQuery, QaConversationDetail, QaConversationDeletion, QaConversationQuery, QaConversationReview, QaConversationReviewInput, QaConversationSummary, QaExpertMemoryDraft, QaExpertMemoryPage, QaExpertMemoryRecord, QaExpertMemoryScope, QaFeedbackQuery, QaFeedbackRow, QaMessageFeedback, QaMessageFeedbackInput, QaQualityMetrics, QaReviewQueueItem, QaReviewQueueRow, QaSlashCatalog, QaSlashExecution, QaSlashSubmitAttachment, QaUserQuery } from "../types.js";
5
5
  /** Wire content one prompt carries: text plus base64 image uploads. */
6
6
  export type QaPromptContent = Parameters<SessionFace["prompt"]>[0];
7
7
  /** DSH session runtime surface the QA controller is allowed to touch. */
@@ -37,12 +37,13 @@ export type QaCreateSession = (token: string, subroleId: string | null, adminPre
37
37
  export type QaForkSession = (token: string, sourceId: string, answerSeq: number) => Promise<RemoteResult<string>>;
38
38
  /**
39
39
  * The Host's live read of the request ceiling (`qaSurface/queueStatus`), asked
40
- * per send: how many questions the stand is answering and whether one more
41
- * fits.
40
+ * per send and for the current waiting chat. Supplying a session id requires
41
+ * current account read access; global reads expose counts only.
42
42
  */
43
- export type QaQueueStatusRemote = () => Promise<RemoteResult<QaQueueStatus>>;
43
+ export type QaQueueStatusRemote = (token?: string, sessionId?: string) => Promise<RemoteResult<QaQueueStatus>>;
44
44
  /** Role selector plus administrator mutation channel. */
45
45
  export interface QaAccessApi {
46
+ userModels?(token: string, sessionId: string | null, subroleId: string | null, adminPreview: boolean): Promise<RemoteResult<QaModelOptions>>;
46
47
  current(token: string): Promise<RemoteResult<QaCurrentAccess>>;
47
48
  session(token: string, sessionId: string): Promise<RemoteResult<QaSessionAccess>>;
48
49
  admin(token: string): Promise<RemoteResult<QaAccessAdminSnapshot>>;
@@ -337,6 +338,8 @@ export type QaIntegrationTokenResult<Value> = {
337
338
  };
338
339
  /** The integration-token section with the account token bound at the call site. */
339
340
  export interface QaIntegrationTokenApi {
341
+ readonly historyStorageKey?: string;
342
+ setFolder?(tokenId: string, folder: import("../types/accounts.js").QaHistoryFolderTarget | null): Promise<QaIntegrationTokenResult<null>>;
340
343
  /**
341
344
  * Whether this deployment can mint at all. A token is a credential for the
342
345
  * HTTP API, so when that API is off the page explains the state instead of
@@ -351,6 +354,9 @@ export interface QaIntegrationTokenApi {
351
354
  }
352
355
  /** Account remotes exposed by the plugin's own typert namespace. */
353
356
  export interface QaAccountsApi {
357
+ accountsSetServiceTokenHistoryFolder?(token: string, tokenId: string, folder: import("../types/accounts.js").QaHistoryFolderTarget | null): Promise<RemoteResult<{
358
+ readonly updated: boolean;
359
+ }>>;
354
360
  accountsSetServiceTokenClarifications?(token: string, tokenId: string, allowed: boolean): Promise<RemoteResult<{
355
361
  readonly updated: boolean;
356
362
  }>>;
@@ -362,9 +368,7 @@ export interface QaAccountsApi {
362
368
  accountsLogin(email: string, password: string): Promise<RemoteResult<QaAccountSession>>;
363
369
  accountsRegister(email: string, password: string): Promise<RemoteResult<QaAccountSession>>;
364
370
  accountsClaimSessions(token: string, sessionIds: readonly string[]): Promise<RemoteResult<QaClaimResult>>;
365
- accountsOwnedSessions(token: string): Promise<RemoteResult<{
366
- readonly ids: readonly string[];
367
- }>>;
371
+ accountsOwnedSessions(token: string): Promise<RemoteResult<import("../types/accounts.js").QaOwnedSessionsResult>>;
368
372
  accountsListOwnership(token: string): Promise<RemoteResult<{
369
373
  readonly entries: readonly QaOwnershipEntry[];
370
374
  }>>;
@@ -412,6 +416,10 @@ export type RemoteResult<Value> = {
412
416
  readonly ok: false;
413
417
  readonly error: unknown;
414
418
  };
419
+ export interface QaChatCodeSourceApi {
420
+ read(token: string, sessionId: string): Promise<RemoteResult<import("../types/code-sources.js").QaChatCodeSources>>;
421
+ select(token: string, sessionId: string, source: string | null): Promise<RemoteResult<import("../types/code-sources.js").QaChatCodeSources>>;
422
+ }
415
423
  /** Minimal persistence contract; backed by `window.localStorage` in the app. */
416
424
  export interface StorageLike {
417
425
  getItem(key: string): string | null;
@@ -0,0 +1,20 @@
1
+ import type { CodeSourcesCatalog } from "@yadsh/dsh-plugin-kit/code-sources";
2
+ import type { QaChatCodeSources } from "../types/code-sources.js";
3
+ import type { QaChatCodeSourceApi } from "./types.js";
4
+ export interface ChatCodeSourceOptions {
5
+ readonly api?: QaChatCodeSourceApi | undefined;
6
+ readonly token: string;
7
+ readonly sessionId: string | null;
8
+ readonly chatKey: number;
9
+ readonly catalog: CodeSourcesCatalog;
10
+ }
11
+ /** Server-backed per-chat state. Drafts do not create sessions until their first send. */
12
+ export declare function useChatCodeSource(options: ChatCodeSourceOptions): {
13
+ value: QaChatCodeSources;
14
+ pending: boolean;
15
+ error: string | null;
16
+ select: (source: string | null) => Promise<boolean>;
17
+ prepareSession: (sessionId: string) => Promise<void>;
18
+ blocked: boolean;
19
+ };
20
+ //# sourceMappingURL=use-chat-code-source.d.ts.map
@@ -0,0 +1,8 @@
1
+ import { type QaHistoryOrganization } from "./history-organization.js";
2
+ /** The catalog is keyed on mount, so changing accounts cannot reuse its state. */
3
+ export declare function useHistoryOrganization(key: string): {
4
+ state: QaHistoryOrganization;
5
+ update: (next: QaHistoryOrganization) => void;
6
+ persistenceFailed: boolean;
7
+ };
8
+ //# sourceMappingURL=use-history-organization.d.ts.map
@@ -0,0 +1,24 @@
1
+ import type { QaModelOptions, QaModelPair } from "../types.js";
2
+ import type { QaAccessApi } from "./types.js";
3
+ export declare const qaModelKey: (pair: QaModelPair) => string;
4
+ export interface QaModelSelectionProps {
5
+ readonly api: NonNullable<QaAccessApi["userModels"]>;
6
+ readonly token: string;
7
+ readonly sessionId: string | null;
8
+ readonly subroleId: string | null;
9
+ readonly preview: boolean;
10
+ readonly disabled: boolean;
11
+ readonly onSelect: (pair: QaModelPair) => Promise<string>;
12
+ }
13
+ /** The existing authenticated selection boundary shared by composer controls. */
14
+ export declare function useQaModelSelection(props: QaModelSelectionProps | undefined): {
15
+ options: QaModelOptions | undefined;
16
+ busy: boolean;
17
+ error: string | undefined;
18
+ selectedKey: string;
19
+ select: (key: string) => Promise<boolean>;
20
+ selected: import("../types.js").QaModelCatalogEntry | undefined;
21
+ disabled: boolean;
22
+ reload: () => void;
23
+ };
24
+ //# sourceMappingURL=use-model-selection.d.ts.map
@@ -0,0 +1,12 @@
1
+ import { type RefObject } from "react";
2
+ interface FileDropTarget {
3
+ readonly element: RefObject<HTMLElement>;
4
+ readonly fallback?: boolean;
5
+ readonly canDrop: () => boolean;
6
+ readonly onFiles: (files: File[]) => void;
7
+ readonly onActive?: (active: boolean) => void;
8
+ }
9
+ /** Register a QA file receiver; ordinary text and chat drags remain untouched. */
10
+ export declare function useQaFileDrop(target: FileDropTarget): void;
11
+ export {};
12
+ //# sourceMappingURL=use-qa-file-drop.d.ts.map
@@ -0,0 +1,28 @@
1
+ import { SqliteDatabase } from "@yadsh/dsh-plugin-kit/sqlite";
2
+ import type { CodeSourcesCatalog } from "@yadsh/dsh-plugin-kit/code-sources";
3
+ import type { QaChatCodeSources } from "./types/code-sources.js";
4
+ export interface CodeSourceSession {
5
+ readonly header: {
6
+ readonly parentSession?: unknown;
7
+ readonly isSeeded?: boolean;
8
+ readonly origin?: unknown;
9
+ };
10
+ }
11
+ /** Durable chat preference and immutable snapshots for delegated/forked children. */
12
+ export declare class QaCodeSourceSelection {
13
+ private readonly configured;
14
+ private readonly session;
15
+ private readonly busy;
16
+ readonly storage: SqliteDatabase;
17
+ constructor(filePath: string, configured: () => CodeSourcesCatalog, session: (id: string) => CodeSourceSession | undefined, busy: (id: string) => boolean);
18
+ private stored;
19
+ /** Resolve old/resumed children through their durable lineage when no snapshot exists. */
20
+ selected(id: string): string | null;
21
+ catalog(id?: string): CodeSourcesCatalog;
22
+ view(id: string, owner: boolean): QaChatCodeSources;
23
+ select(id: string, source: string | null): QaChatCodeSources;
24
+ inherit(id: string, parent: string, managedParent?: boolean): void;
25
+ private save;
26
+ close(): void;
27
+ }
28
+ //# sourceMappingURL=code-source-selection.d.ts.map
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=code-sources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-sources.js","sourceRoot":"","sources":["../../src/types/code-sources.ts"],"names":[],"mappings":""}
@@ -48,6 +48,12 @@ export declare function normalizeIntegrationBasePath(value: string): string;
48
48
  * @param accounts - the resolved accounts domain, for the cross-check.
49
49
  * @returns the frozen resolved slice.
50
50
  */
51
- export declare function resolveIntegration(input: QaIntegrationConfig | undefined, accounts: ResolvedQaSurfaceConfig["accounts"]): ResolvedIntegration;
51
+ export declare function resolveIntegration(input: QaIntegrationConfig | undefined, accounts: ResolvedQaSurfaceConfig["accounts"], attachments?: {
52
+ readonly textFiles: boolean;
53
+ readonly pastedTextLines: number;
54
+ readonly maxFileBytes: number;
55
+ readonly maxPending: number;
56
+ readonly extensions: readonly string[];
57
+ }): ResolvedIntegration;
52
58
  export {};
53
59
  //# sourceMappingURL=integration.d.ts.map
@@ -0,0 +1,12 @@
1
+ /** The Host tool contract, normalized once for path and storage policy. */
2
+ export type QaFilesystemIntent = {
3
+ readonly kind: "read";
4
+ readonly path: string;
5
+ readonly fileOnlyGrant: boolean;
6
+ } | {
7
+ readonly kind: "write";
8
+ readonly path: string;
9
+ readonly bytes: number;
10
+ };
11
+ export declare function qaFilesystemIntent(name: string, args: Record<string, unknown> | undefined): QaFilesystemIntent | undefined;
12
+ //# sourceMappingURL=filesystem-intent.d.ts.map
@@ -27,7 +27,8 @@ export declare function validateFormFile(name: string, data: Buffer): string;
27
27
  export declare class QaFormAttachmentAdapter {
28
28
  private readonly service;
29
29
  private readonly host;
30
- constructor(service: () => QaFormService, host: () => QaFormHostAttachments | undefined);
30
+ private readonly grantFile?;
31
+ constructor(service: () => QaFormService, host: () => QaFormHostAttachments | undefined, grantFile?: ((sessionId: string, file: string) => void) | undefined);
31
32
  available(): boolean;
32
33
  check(session: string, formId: string, uploadId: string): void;
33
34
  claim(session: string, uploadId: string): {
@@ -37,12 +38,14 @@ export declare class QaFormAttachmentAdapter {
37
38
  complete(session: string, formId: string, uploadId: string, raw: unknown, signal: AbortSignal, authorize: () => void): Promise<QaFormRecord>;
38
39
  fail(session: string, formId: string, uploadId: string): void;
39
40
  /** Exact saved bytes are re-projected through the Host on each successful resume. */
40
- readable(submission: QaFormSubmission): Promise<QaFormSubmission & {
41
+ readable(submission: QaFormSubmission, sessionId?: string): Promise<QaFormSubmission & {
41
42
  resources: {
42
43
  resource_id: string;
43
44
  read_path: string;
44
45
  }[];
45
46
  }>;
47
+ /** Rebuild exact grants from this chat's persisted, verified submissions. */
48
+ restore(sessionId: string): Promise<void>;
46
49
  }
47
50
  export {};
48
51
  //# sourceMappingURL=attachments.d.ts.map
@@ -1,9 +1,10 @@
1
- import type { QaFormFieldError, QaFormResult } from "./types.js";
1
+ import type { QaFormFieldError, QaFormResult, QaFormSchemaIssue } from "./types.js";
2
2
  export declare class QaFormError extends Error {
3
3
  readonly code: string;
4
4
  readonly revision?: number | undefined;
5
5
  readonly fields?: QaFormFieldError[] | undefined;
6
- constructor(code: string, message: string, revision?: number | undefined, fields?: QaFormFieldError[] | undefined);
6
+ readonly schemaIssues?: QaFormSchemaIssue[] | undefined;
7
+ constructor(code: string, message: string, revision?: number | undefined, fields?: QaFormFieldError[] | undefined, schemaIssues?: QaFormSchemaIssue[] | undefined);
7
8
  }
8
9
  /** Deliberately redact unexpected storage/Host exceptions at the wire boundary. */
9
10
  export declare function formFailure(error: unknown): QaFormResult<never>;
@@ -1,12 +1,13 @@
1
1
  import type { Context } from "@deepseek-ai/cordis";
2
2
  import type { ToolExecution } from "@deepseek-ai/dsh-tools";
3
3
  import type { QaFormService } from "./service.js";
4
- import type { QaFormRecord, QaFormSubmission } from "./types.js";
5
- type Outcome = QaFormSubmission | {
4
+ import type { QaFormRecord, QaFormSubmission, QaFormValidation } from "./types.js";
5
+ type CollectionOutcome = QaFormSubmission | {
6
6
  status: "paused";
7
7
  form_id: string;
8
8
  reason: string;
9
9
  };
10
+ type Outcome = CollectionOutcome | QaFormValidation;
10
11
  /** A parked tool call is transient. Never reconstruct one from a saved draft. */
11
12
  export declare class QaFormGate {
12
13
  readonly service: () => QaFormService;
@@ -22,6 +23,7 @@ export declare class QaFormGate {
22
23
  install(ctx: Context): void;
23
24
  waiting(id: string): boolean;
24
25
  touch(session: string): void;
26
+ private clientReady;
25
27
  hasSession(session: string): boolean;
26
28
  request(raw: unknown, exec: ToolExecution): Promise<Outcome>;
27
29
  notify(record: QaFormRecord, pause?: boolean): void;
@@ -0,0 +1,7 @@
1
+ import type { z } from "zod";
2
+ import { QaFormError } from "./errors.js";
3
+ import type { QaFormSchemaIssue } from "./types.js";
4
+ /** Report locations and constraints, never copy input values into diagnostics. */
5
+ export declare function formSchemaError(issues: QaFormSchemaIssue[]): QaFormError;
6
+ export declare function formSchemaIssues(issues: z.ZodError["issues"]): QaFormSchemaIssue[];
7
+ //# sourceMappingURL=schema-errors.d.ts.map
@@ -106,6 +106,19 @@ export interface QaFormFieldError {
106
106
  code: string;
107
107
  message: string;
108
108
  }
109
+ export interface QaFormSchemaIssue {
110
+ path: string;
111
+ code: string;
112
+ message: string;
113
+ }
114
+ export interface QaFormValidation {
115
+ status: "validated";
116
+ valid: boolean;
117
+ interactive_client_ready: boolean;
118
+ file_upload_available: boolean;
119
+ policy: Readonly<QaFormPolicy>;
120
+ issues: QaFormSchemaIssue[];
121
+ }
109
122
  export interface QaFormSubmission {
110
123
  status: "submitted";
111
124
  form_id: string;
@@ -182,6 +195,7 @@ export type QaFormResult<T> = {
182
195
  message: string;
183
196
  form_revision?: number;
184
197
  field_errors?: QaFormFieldError[];
198
+ schema_errors?: QaFormSchemaIssue[];
185
199
  };
186
200
  };
187
201
  /**
@@ -1,12 +1,14 @@
1
+ import type { QaChatCodeSources } from "./types/code-sources.js";
1
2
  import type { QaChatAccess, QaChatGrant, QaChatMode, QaChatAuthor, QaChatJson } from "./chat-sharing/types.js";
2
3
  import type { SessionPageRequest, SessionFollowRequest, SessionPromptRequest, SessionPromptValue, SessionAttachmentRequest, SessionAttachmentValue, SessionRenameRequest, SessionRenameValue, SessionCancelValue, SessionUpdateQueueRequest, SessionUpdateQueueValue, SessionSearchRequest, SessionSelectModelRequest, SessionSelectModelValue } from "@deepseek-ai/dsh-api-session-controller/types";
3
4
  import { TypertRemoteService } from "@deepseek-ai/dsh-typert-protocol";
4
5
  import type { Context } from "@deepseek-ai/cordis";
5
6
  import type { QaSurfaceConfigRefs } from "./config.js";
6
7
  import type { QaFormCommand, QaFormResult, QaFormView } from "./forms/types.js";
8
+ import type { QaModelOptions } from "./types.js";
7
9
  import type { QaAccountNotificationsInput } from "./types.js";
8
10
  import type { QaTurnSources } from "./provenance/types.js";
9
- import type { QaAccountProfileInput, QaAccountSession, QaAccountStartersInput, QaAccountUserPublic, QaApprovalDecision, QaClaimResult, QaDocumentPreview, QaSpreadsheetPreviewSelection, QaDocumentWorkflowStatus, QaIssuedServiceToken, QaLockdownProof, QaOwnershipEntry, QaPasswordResetRequest, QaPendingApproval, QaPendingQuestion, QaQuestionAnswerItem, QaQueueStatus, QaServiceTokenCreateInput, QaServiceTokenSummary, ResolvedQaSurfaceConfig, QaAdminSkillScope, QaAdminSkillsView, QaExpertMemoryDraft, QaExpertMemoryPage, QaExpertMemoryRecord, QaExpertMemoryScope, QaSkillDocument, QaSkillDraftInput, QaSkillRemoval, QaSkillSummary, QaSkillToolDescriptor, QaSkillValidation, QaSourceFilePreview, QaWhoamiResult, QaWorkspaceFile, QaWorkspaceFileChunk, QaWorkspaceListing, QaPrincipal, QaAccessAdminSnapshot, QaAdminAuditEvent, QaAdminOverview, QaAdminPage, QaAdminUserDetail, QaAdminUserRow, QaAdminUserUpdate, QaAuditQuery, QaCapabilitySelection, QaConversationDetail, QaConversationDeletion, QaConversationQuery, QaConversationReview, QaConversationReviewInput, QaConversationSummary, QaCurrentAccess, QaFeedbackHarvestEntry, QaFeedbackHarvestResult, QaFeedbackQuery, QaFeedbackRow, QaMessageFeedback, QaMessageFeedbackInput, QaModelCatalogEntry, QaModelPair, QaQualityMetrics, QaReviewQueueItem, QaReviewQueueRow, QaSessionAccess, QaSlashCatalog, QaSlashExecution, QaSlashSubmitAttachment, QaSkillActivationRecord, QaSkillAssignmentOverride, QaSubrole, QaUserAccess, QaUserQuery } from "./types.js";
11
+ import type { QaAccountProfileInput, QaAccountSession, QaAccountStartersInput, QaAccountUserPublic, QaApprovalDecision, QaClaimResult, QaDocumentPreview, QaSpreadsheetPreviewSelection, QaDocumentWorkflowStatus, QaIssuedServiceToken, QaHistoryFolderTarget, QaOwnedSessionsResult, QaLockdownProof, QaOwnershipEntry, QaPasswordResetRequest, QaPendingApproval, QaPendingQuestion, QaQuestionAnswerItem, QaQueueStatus, QaServiceTokenCreateInput, QaServiceTokenSummary, ResolvedQaSurfaceConfig, QaAdminSkillScope, QaAdminSkillsView, QaExpertMemoryDraft, QaExpertMemoryPage, QaExpertMemoryRecord, QaExpertMemoryScope, QaSkillDocument, QaSkillDraftInput, QaSkillRemoval, QaSkillSummary, QaSkillToolDescriptor, QaSkillValidation, QaSourceFilePreview, QaWhoamiResult, QaWorkspaceFile, QaWorkspaceFileChunk, QaWorkspaceListing, QaPrincipal, QaAccessAdminSnapshot, QaAdminAuditEvent, QaAdminOverview, QaAdminPage, QaAdminUserDetail, QaAdminUserRow, QaAdminUserUpdate, QaAuditQuery, QaCapabilitySelection, QaConversationDetail, QaConversationDeletion, QaConversationQuery, QaConversationReview, QaConversationReviewInput, QaConversationSummary, QaCurrentAccess, QaFeedbackHarvestEntry, QaFeedbackHarvestResult, QaFeedbackQuery, QaFeedbackRow, QaMessageFeedback, QaMessageFeedbackInput, QaModelCatalogEntry, QaModelPair, QaQualityMetrics, QaReviewQueueItem, QaReviewQueueRow, QaSessionAccess, QaSlashCatalog, QaSlashExecution, QaSlashSubmitAttachment, QaSkillActivationRecord, QaSkillAssignmentOverride, QaSubrole, QaUserAccess, QaUserQuery } from "./types.js";
10
12
  export declare const name = "qa-surface";
11
13
  export declare const inject: string[];
12
14
  import { QA_SURFACE_SETTINGS_NAMESPACE } from "./shared/settings.js";
@@ -19,6 +21,8 @@ declare module "@deepseek-ai/cordis" {
19
21
  }
20
22
  /** Host companion: validates config, owns the admission boundary and the route. */
21
23
  export declare class QaSurface extends TypertRemoteService {
24
+ private sourceSelections?;
25
+ private codeSourceStore;
22
26
  static inject: string[];
23
27
  static Config: import("@deepseek-ai/schemastery").default<QaSurfaceConfigRefs>;
24
28
  private readonly source;
@@ -79,6 +83,7 @@ export declare class QaSurface extends TypertRemoteService {
79
83
  private chatSharingStore;
80
84
  private readonly chatTransport;
81
85
  private readonly chatTurnGuard;
86
+ private readonly requestScheduler;
82
87
  private sharing;
83
88
  constructor(ctx: Context, entry?: Partial<QaSurfaceConfigRefs>);
84
89
  /** The quality store, opening its file the first time anyone needs it. */
@@ -125,6 +130,11 @@ export declare class QaSurface extends TypertRemoteService {
125
130
  * @param sessionId - the chat the work is delegated from.
126
131
  */
127
132
  modelPolicyForSession(sessionId: string): QaModelPair | undefined;
133
+ /** Shared source catalogue consumed by preset-mounted Git tools at call time. */
134
+ getCodeSources(sessionId?: string): ResolvedQaSurfaceConfig["codeSources"];
135
+ getSelectedCodeSource(sessionId: string): string | null;
136
+ chatCodeSources(token: string, sessionId: string): Promise<QaChatCodeSources>;
137
+ chatSelectCodeSource(token: string, sessionId: string, source: string | null): Promise<QaChatCodeSources>;
128
138
  getConfig(): ResolvedQaSurfaceConfig;
129
139
  /**
130
140
  * Ownership plus the role's user-skill grant for one slash read.
@@ -171,9 +181,7 @@ export declare class QaSurface extends TypertRemoteService {
171
181
  */
172
182
  accountsClaimSessions(token: string, sessionIds: readonly string[]): QaClaimResult;
173
183
  /** The token user's owned session ids; the sidebar list authority. */
174
- accountsOwnedSessions(token: string): {
175
- readonly ids: readonly string[];
176
- };
184
+ accountsOwnedSessions(token: string): QaOwnedSessionsResult;
177
185
  /**
178
186
  * Every chat-ownership entry with owner display names; the cross-user view
179
187
  * admin browsers group the sidebar by. Ordinary accounts are refused with
@@ -228,6 +236,9 @@ export declare class QaSurface extends TypertRemoteService {
228
236
  accountsSetServiceTokenClarifications(token: string, tokenId: string, allowed: boolean): {
229
237
  readonly updated: boolean;
230
238
  };
239
+ accountsSetServiceTokenHistoryFolder(token: string, tokenId: string, folder: QaHistoryFolderTarget | null): {
240
+ readonly updated: boolean;
241
+ };
231
242
  /**
232
243
  * Serve the effective QA configuration to the browser. The DSH gateway pins
233
244
  * settings RPCs to loopback, so a browser served over the LAN always sees
@@ -237,19 +248,33 @@ export declare class QaSurface extends TypertRemoteService {
237
248
  */
238
249
  describe(): ResolvedQaSurfaceConfig;
239
250
  /**
240
- * Report how much of the deployment's request ceiling the stand is using, so
241
- * a browser holds its question back instead of opening another turn on a
242
- * model that is busy answering the ones it allows.
251
+ * Report server admission. Global reads expose counts only; a chat's FIFO
252
+ * position requires that account's current read access to the chat. The
253
+ * scheduler gates every root turn, including native and integration sends.
243
254
  *
244
- * The count is the Host's, not the browser's: a visitor cannot see another
245
- * account's chats, and the HTTP API's questions are invisible to every chat
246
- * view. Read-only, and a ceiling rather than a lock — a prompt rides the
247
- * native session RPC this plugin does not own, so the boundary is the
248
- * browser's own courtesy, and two questions sent in the same instant can
249
- * still overshoot by one. What the ceiling buys is that steady state, not a
250
- * strict bound.
255
+ * Both arguments are part of the wire contract: the gateway client counts
256
+ * declared parameters rather than TypeScript optionals, so a call that omits
257
+ * them is refused on the browser before the Host ever sees it. An empty
258
+ * session id is the global read — the shape every initial send asks for,
259
+ * while its draft chat has no session to name yet.
260
+ */
261
+ queueStatus(token: string, sessionId: string): QaQueueStatus;
262
+ /**
263
+ * The ceiling this read answers against: the chat's own account chain when
264
+ * the read names a chat, the caller's account chain when it does not (the
265
+ * pre-send check carries a token but no chat yet), and the deployment's
266
+ * number whenever accounts are off or nobody matches. `undefined` is the
267
+ * scheduler's signal to fall back to that number, so the branch is a value
268
+ * rather than a flag.
269
+ */
270
+ private queueCeiling;
271
+ /**
272
+ * The ceiling override one arriving turn fills against, or `undefined` when
273
+ * the deployment default governs it: without accounts every turn shares the
274
+ * one number, and an unowned session (an integration or an admin preview)
275
+ * stays in that shared pool whatever its role might say.
251
276
  */
252
- queueStatus(): QaQueueStatus;
277
+ private queueSlotsOverride;
253
278
  /**
254
279
  * Create a QA session from Host-owned inputs. With account workspaces on,
255
280
  * cwd is `<configured workspace>/.qa-users/<account UUID>` and the child is
@@ -268,6 +293,7 @@ export declare class QaSurface extends TypertRemoteService {
268
293
  accessUpdateSubrole(token: string, id: string, input: QaSubrole): Promise<QaSubrole>;
269
294
  /** The pairs this Host can serve, for the surface that writes a policy. */
270
295
  accessModelCatalog(token: string): Promise<readonly QaModelCatalogEntry[]>;
296
+ accessUserModels(token: string, sessionId: string | null, subroleId: string | null, adminPreview: boolean): Promise<QaModelOptions>;
271
297
  accessDeleteSubrole(token: string, id: string, replacementId: string | null): {
272
298
  readonly deleted: boolean;
273
299
  };
@@ -4,8 +4,6 @@ import type { PluginLogger } from "@yadsh/dsh-plugin-log";
4
4
  import type { ResolvedQaSurfaceConfig } from "../types.js";
5
5
  import { type QaAskRequest } from "./contract.js";
6
6
  import type { QaIntegrationService } from "./service.js";
7
- /** The bridge's own ceiling: five attachments per question. */
8
- export declare const QA_INTEGRATION_MAX_FILES = 5;
9
7
  export interface QaIntegrationRouteOptions {
10
8
  config: ResolvedQaSurfaceConfig;
11
9
  service: QaIntegrationService;
@@ -59,7 +57,7 @@ interface MultipartBody {
59
57
  * @param boundary - the boundary parameter of the content type.
60
58
  * @returns text fields and file parts, in the order they appeared.
61
59
  */
62
- export declare function parseMultipart(body: Buffer, boundary: string): MultipartBody;
60
+ export declare function parseMultipart(body: Buffer, boundary: string, maxAttachments?: number): MultipartBody;
63
61
  /**
64
62
  * Read the whole request body under a byte ceiling.
65
63
  * @param request - the incoming request.
@@ -1,5 +1,6 @@
1
1
  import type { PluginLogger } from "@yadsh/dsh-plugin-log";
2
2
  import type { QaAccounts } from "../accounts/store.js";
3
+ import type { QaHistoryFolderTarget } from "../types/accounts.js";
3
4
  import { type QaServiceTokenScope } from "../accounts/service-token.js";
4
5
  import type { QaSourceReference } from "../provenance/types.js";
5
6
  import type { ResolvedQaSurfaceConfig } from "../types.js";
@@ -31,6 +32,7 @@ export declare const QA_INTEGRATION_MAX_CITATIONS = 5;
31
32
  export declare function sourceCitations(sources: readonly QaSourceReference[]): readonly string[];
32
33
  /** Who a presented credential turned out to be. */
33
34
  export interface QaIntegrationIdentity {
35
+ readonly historyFolder?: QaHistoryFolderTarget;
34
36
  readonly allowClarifications: boolean;
35
37
  readonly tokenId: string;
36
38
  readonly userId: string;
@@ -0,0 +1,12 @@
1
+ import type { PluginLogger } from "@yadsh/dsh-plugin-log";
2
+ import type { ResolvedQaSurfaceConfig } from "../types.js";
3
+ import { type QaSkillRoots } from "./paths.js";
4
+ /**
5
+ * Promote an operator-selected subset of a read-only catalog into the shared
6
+ * store. Copy complete directories, including resources, before publishing a
7
+ * skill. Neither a restart, an updated seed nor an editor deletion restores
8
+ * the original bytes: a hidden per-name receipt survives rename and removal.
9
+ * Existing shared directories always belong to the operator and win as-is.
10
+ */
11
+ export declare function seedSharedSkills(roots: QaSkillRoots, seed: ResolvedQaSurfaceConfig["accounts"]["skills"]["sharedSeed"], logger: PluginLogger): boolean;
12
+ //# sourceMappingURL=shared-seed.d.ts.map
@@ -32,6 +32,7 @@ export declare const QA_DOCUMENTS_NOTE = "dsh-qa-surface:attached-documents";
32
32
  /** Note name carrying the deployment's rule about where an answer comes from. */
33
33
  export declare const QA_SOURCE_PRIORITY_NOTE = "dsh-qa-surface:source-priority";
34
34
  export declare const QA_BRANCH_NOTE = "dsh-qa-surface:chat-branch";
35
+ export declare const QA_CODE_SOURCES_NOTE = "dsh-qa-surface:code-sources";
35
36
  /**
36
37
  * Built-in note texts. Each is the fallback for its settings template
37
38
  * (`notes.*.template`); the placeholders mark the parts the injector
@@ -41,7 +42,7 @@ export declare const QA_IDENTITY_NOTE_TEMPLATE = "{identity}\n\n{instructions}";
41
42
  export declare const QA_SOURCES_NOTE_TEMPLATE = "Source provenance is collected automatically from your tool calls; the QA surface lists what it collected beside the answer. Do not append a manual Sources/\u0418\u0441\u0442\u043E\u0447\u043D\u0438\u043A\u0438 bibliography of your own.";
42
43
  export declare const QA_SOURCES_FALLBACK_TEMPLATE = "A delegated run whose provider cannot expose tool events must call {reportTool} before finishing.";
43
44
  export declare const QA_DELEGATION_NOTE_TEMPLATE = "When you start a background subagent, give the delegation a short vivid name in its description field: two or three words in the user's language that say what the run is for (\u00AB\u0421\u0432\u0435\u0440\u043A\u0430 \u043E\u0442\u0447\u0451\u0442\u043E\u0432\u00BB, \"Log triage\"). The QA surface shows that description as the subagent's display name in the operator's panel and completion notices.";
44
- export declare const QA_DOCUMENTS_NOTE_TEMPLATE = "A document a chat user attached is a path on disk, not text: read it with the deployment's document pipeline \u2014 `document_inspect` says what a DOCX or PDF is, `document_to_markdown` extracts its text, `document_from_url` stores the text of an attachment that only exists behind a URL. For XLSX, CSV, TSV, ODS or FODS, `spreadsheet_inspect` lists all sheets and detects text delimiter/encoding, `spreadsheet_read` reads pages, and `spreadsheet_create` creates a file in the selected format. CSV/TSV have one Data sheet with string fields; reuse detected delimiter and encoding when paging. XLSX/ODS/FODS support multiple sheets. Inspect all sheet names before selecting data; formula values are saved caches, not recalculated results. The plain file reader refuses those formats as binary, so that refusal is expected and is not a hint to go looking for the file somewhere else. When the pipeline itself refuses a path, report the refusal and the path it named instead of trying another reader.";
45
+ export declare const QA_DOCUMENTS_NOTE_TEMPLATE: string;
45
46
  export declare const QA_SOURCE_PRIORITY_NOTE_TEMPLATE = "Answer from the source that owns the question: read what the conversation and its attachments already carry, then search the product documentation and ask the domain expert, and only then look in memory. Recalled memory is background from earlier sessions \u2014 a miss there is not evidence that no source exists, and it is not where a document, a page or a product fact should be looked up.";
46
47
  export interface QaIdentityRenderInput {
47
48
  /** The owner's account address; the one fact accounts always provide. */
@@ -71,6 +72,7 @@ export interface QaPromptNote {
71
72
  readonly text: string;
72
73
  }
73
74
  export interface QaPromptNotesOptions {
75
+ readonly codeSources?: (sessionId: string) => import("@yadsh/dsh-plugin-kit/code-sources").CodeSourcesCatalog;
74
76
  readonly config: () => ResolvedQaSurfaceConfig;
75
77
  /** The live accounts store, or undefined while accounts are disabled. */
76
78
  readonly accounts: () => QaAccounts | undefined;
@@ -116,6 +118,8 @@ export declare class QaPromptNotes {
116
118
  dispose(): void;
117
119
  /** Append every note whose text this step does not already carry. */
118
120
  private inject;
121
+ /** Keep Git and file lookups on the same configured tree, including in children. */
122
+ private codeSourceNotes;
119
123
  /** Who is asking: the owner's name, handles and their own instructions. */
120
124
  private identityNotes;
121
125
  /** What the deployment expects around the sources the surface collects. */