@yadsh/dsh-qa-surface 0.12.0 → 0.14.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 (341) hide show
  1. package/README.md +148 -22
  2. package/compatibility.json +7 -3
  3. package/lib/access/capability-catalog.js +22 -6
  4. package/lib/access/capability-catalog.js.map +1 -1
  5. package/lib/access/model.js +36 -2
  6. package/lib/access/model.js.map +1 -1
  7. package/lib/access/service.js +19 -4
  8. package/lib/access/service.js.map +1 -1
  9. package/lib/account-remotes.js +4 -0
  10. package/lib/account-remotes.js.map +1 -1
  11. package/lib/accounts/database.js +49 -9
  12. package/lib/accounts/database.js.map +1 -1
  13. package/lib/accounts/errors.js.map +1 -1
  14. package/lib/accounts/file.js.map +1 -1
  15. package/lib/accounts/store.js +53 -8
  16. package/lib/accounts/store.js.map +1 -1
  17. package/lib/admin/permissions.js +6 -0
  18. package/lib/admin/permissions.js.map +1 -1
  19. package/lib/admin/quality-store.js +95 -19
  20. package/lib/admin/quality-store.js.map +1 -1
  21. package/lib/admin/service.js +432 -52
  22. package/lib/admin/service.js.map +1 -1
  23. package/lib/cli.js +24 -4
  24. package/lib/cli.js.map +1 -1
  25. package/lib/client/QaAccountsController.js +70 -5
  26. package/lib/client/QaAccountsController.js.map +1 -1
  27. package/lib/client/QaConfigController.js.map +1 -1
  28. package/lib/client/QaSessionController.js +626 -63
  29. package/lib/client/QaSessionController.js.map +1 -1
  30. package/lib/client/QaSurface.js +279 -43
  31. package/lib/client/QaSurface.js.map +1 -1
  32. package/lib/client/QaSurfaceGuard.js +2 -2
  33. package/lib/client/QaSurfaceGuard.js.map +1 -1
  34. package/lib/client/QaTranscriptAdapter.js +4 -2
  35. package/lib/client/QaTranscriptAdapter.js.map +1 -1
  36. package/lib/client/admin/QaAdmin.js +59 -34
  37. package/lib/client/admin/QaAdmin.js.map +1 -1
  38. package/lib/client/admin/pages/Conversations.js +21 -14
  39. package/lib/client/admin/pages/Conversations.js.map +1 -1
  40. package/lib/client/admin/pages/ExpertMemory.js +210 -0
  41. package/lib/client/admin/pages/ExpertMemory.js.map +1 -0
  42. package/lib/client/admin/pages/Overview.js +5 -5
  43. package/lib/client/admin/pages/Overview.js.map +1 -1
  44. package/lib/client/admin/pages/Quality.js +6 -6
  45. package/lib/client/admin/pages/Quality.js.map +1 -1
  46. package/lib/client/admin/pages/Review.js +13 -9
  47. package/lib/client/admin/pages/Review.js.map +1 -1
  48. package/lib/client/admin/pages/SkillFiles.js +3 -3
  49. package/lib/client/admin/pages/SkillFiles.js.map +1 -1
  50. package/lib/client/admin/pages/Users.js +12 -12
  51. package/lib/client/admin/pages/Users.js.map +1 -1
  52. package/lib/client/admin/routes.js +4 -0
  53. package/lib/client/admin/routes.js.map +1 -1
  54. package/lib/client/admin/shared.js +57 -10
  55. package/lib/client/admin/shared.js.map +1 -1
  56. package/lib/client/admin/styles.js +3 -0
  57. package/lib/client/admin/styles.js.map +1 -1
  58. package/lib/client/attestation.js +11 -2
  59. package/lib/client/attestation.js.map +1 -1
  60. package/lib/client/audit/QaAuditDialog.js +2 -2
  61. package/lib/client/audit/QaAuditDialog.js.map +1 -1
  62. package/lib/client/audit/QaAuditRowBadge.js +1 -1
  63. package/lib/client/audit/QaAuditRowBadge.js.map +1 -1
  64. package/lib/client/components/Markdown.js +7 -2
  65. package/lib/client/components/Markdown.js.map +1 -1
  66. package/lib/client/components/QaAgentsDrawer.js +7 -5
  67. package/lib/client/components/QaAgentsDrawer.js.map +1 -1
  68. package/lib/client/components/QaApproval.js +2 -2
  69. package/lib/client/components/QaApproval.js.map +1 -1
  70. package/lib/client/components/QaAuthGate.js +6 -6
  71. package/lib/client/components/QaAuthGate.js.map +1 -1
  72. package/lib/client/components/QaChangelog.js +87 -0
  73. package/lib/client/components/QaChangelog.js.map +1 -1
  74. package/lib/client/components/QaComposer.js +9 -6
  75. package/lib/client/components/QaComposer.js.map +1 -1
  76. package/lib/client/components/QaFileAttachment.js +1 -1
  77. package/lib/client/components/QaFileAttachment.js.map +1 -1
  78. package/lib/client/components/QaFilesPanel.js +7 -7
  79. package/lib/client/components/QaFilesPanel.js.map +1 -1
  80. package/lib/client/components/QaHeader.js +4 -4
  81. package/lib/client/components/QaHeader.js.map +1 -1
  82. package/lib/client/components/QaMessage.js +12 -12
  83. package/lib/client/components/QaMessage.js.map +1 -1
  84. package/lib/client/components/QaModal.js +11 -2
  85. package/lib/client/components/QaModal.js.map +1 -1
  86. package/lib/client/components/QaQuestions.js +4 -4
  87. package/lib/client/components/QaQuestions.js.map +1 -1
  88. package/lib/client/components/QaQueueDock.js +137 -0
  89. package/lib/client/components/QaQueueDock.js.map +1 -0
  90. package/lib/client/components/QaRequestQueue.js +22 -0
  91. package/lib/client/components/QaRequestQueue.js.map +1 -0
  92. package/lib/client/components/QaRightRail.js +2 -2
  93. package/lib/client/components/QaRightRail.js.map +1 -1
  94. package/lib/client/components/QaSidebar.js +66 -6
  95. package/lib/client/components/QaSidebar.js.map +1 -1
  96. package/lib/client/components/QaSourcesPanel.js +10 -8
  97. package/lib/client/components/QaSourcesPanel.js.map +1 -1
  98. package/lib/client/components/QaThemeSwitcher.js +19 -0
  99. package/lib/client/components/QaThemeSwitcher.js.map +1 -0
  100. package/lib/client/components/QaTurnNotice.js +40 -0
  101. package/lib/client/components/QaTurnNotice.js.map +1 -0
  102. package/lib/client/components/QaTurnRail.js +3 -3
  103. package/lib/client/components/QaTurnRail.js.map +1 -1
  104. package/lib/client/components/QaWelcomeNotice.js +2 -6
  105. package/lib/client/components/QaWelcomeNotice.js.map +1 -1
  106. package/lib/client/components/QaWidthHandle.js +2 -2
  107. package/lib/client/components/QaWidthHandle.js.map +1 -1
  108. package/lib/client/components/QaWorkGroup.js +5 -5
  109. package/lib/client/components/QaWorkGroup.js.map +1 -1
  110. package/lib/client/components/QaWorkspaceBrowser.js +10 -10
  111. package/lib/client/components/QaWorkspaceBrowser.js.map +1 -1
  112. package/lib/client/components/VariantSwitcher.js +1 -1
  113. package/lib/client/components/VariantSwitcher.js.map +1 -1
  114. package/lib/client/failure-copy.js +26 -8
  115. package/lib/client/failure-copy.js.map +1 -1
  116. package/lib/client/focus-ring.js +193 -0
  117. package/lib/client/focus-ring.js.map +1 -0
  118. package/lib/client/index.js +58 -24
  119. package/lib/client/index.js.map +1 -1
  120. package/lib/client/lineage.js +3 -16
  121. package/lib/client/lineage.js.map +1 -1
  122. package/lib/client/markdown/CodeBlock.js +2 -2
  123. package/lib/client/markdown/CodeBlock.js.map +1 -1
  124. package/lib/client/markdown/blocks.js +118 -31
  125. package/lib/client/markdown/blocks.js.map +1 -1
  126. package/lib/client/markdown/math.js +1 -1
  127. package/lib/client/markdown/math.js.map +1 -1
  128. package/lib/client/markdown/render.js +32 -12
  129. package/lib/client/markdown/render.js.map +1 -1
  130. package/lib/client/markdown/source-chip.js +3 -3
  131. package/lib/client/markdown/source-chip.js.map +1 -1
  132. package/lib/client/notifications/notification-dispatcher.js +90 -0
  133. package/lib/client/notifications/notification-dispatcher.js.map +1 -0
  134. package/lib/client/notifications/preferences.js +61 -0
  135. package/lib/client/notifications/preferences.js.map +1 -0
  136. package/lib/client/notifications/turn-completion-source.js +82 -0
  137. package/lib/client/notifications/turn-completion-source.js.map +1 -0
  138. package/lib/client/notifications/use-turn-notifications.js +108 -0
  139. package/lib/client/notifications/use-turn-notifications.js.map +1 -0
  140. package/lib/client/panels/PanelHost.js +5 -5
  141. package/lib/client/panels/PanelHost.js.map +1 -1
  142. package/lib/client/panels/PanelLauncher.js +2 -2
  143. package/lib/client/panels/PanelLauncher.js.map +1 -1
  144. package/lib/client/project-session-state.js +156 -4
  145. package/lib/client/project-session-state.js.map +1 -1
  146. package/lib/client/rating-harvest.js +138 -0
  147. package/lib/client/rating-harvest.js.map +1 -0
  148. package/lib/client/role/RoleSelector.js +9 -4
  149. package/lib/client/role/RoleSelector.js.map +1 -1
  150. package/lib/client/settings/card.js +58 -17
  151. package/lib/client/settings/card.js.map +1 -1
  152. package/lib/client/settings/fields.js +11 -10
  153. package/lib/client/settings/fields.js.map +1 -1
  154. package/lib/client/settings/format.js +0 -9
  155. package/lib/client/settings/format.js.map +1 -1
  156. package/lib/client/settings/sections/access.js +5 -5
  157. package/lib/client/settings/sections/access.js.map +1 -1
  158. package/lib/client/settings/sections/accounts.js +10 -10
  159. package/lib/client/settings/sections/accounts.js.map +1 -1
  160. package/lib/client/settings/sections/attachments.js +6 -6
  161. package/lib/client/settings/sections/attachments.js.map +1 -1
  162. package/lib/client/settings/sections/branding.js +7 -7
  163. package/lib/client/settings/sections/branding.js.map +1 -1
  164. package/lib/client/settings/sections/common.js +4 -2
  165. package/lib/client/settings/sections/common.js.map +1 -1
  166. package/lib/client/settings/sections/docs.js +4 -3
  167. package/lib/client/settings/sections/docs.js.map +1 -1
  168. package/lib/client/settings/sections/embedding.js +2 -2
  169. package/lib/client/settings/sections/embedding.js.map +1 -1
  170. package/lib/client/settings/sections/interface.js +12 -12
  171. package/lib/client/settings/sections/interface.js.map +1 -1
  172. package/lib/client/settings/sections/lockdown.js +9 -9
  173. package/lib/client/settings/sections/lockdown.js.map +1 -1
  174. package/lib/client/settings/sections/notes.js +12 -12
  175. package/lib/client/settings/sections/notes.js.map +1 -1
  176. package/lib/client/settings/sections/session.js +15 -12
  177. package/lib/client/settings/sections/session.js.map +1 -1
  178. package/lib/client/settings/sections/slash.js +9 -9
  179. package/lib/client/settings/sections/slash.js.map +1 -1
  180. package/lib/client/settings/sections/sources.js +26 -26
  181. package/lib/client/settings/sections/sources.js.map +1 -1
  182. package/lib/client/settings/sections/status.js +2 -2
  183. package/lib/client/settings/sections/status.js.map +1 -1
  184. package/lib/client/settings/styles.js +15 -9
  185. package/lib/client/settings/styles.js.map +1 -1
  186. package/lib/client/slash/SlashPalette.js +4 -4
  187. package/lib/client/slash/SlashPalette.js.map +1 -1
  188. package/lib/client/styles.js +139 -66
  189. package/lib/client/styles.js.map +1 -1
  190. package/lib/client/theme-preference.js +162 -0
  191. package/lib/client/theme-preference.js.map +1 -0
  192. package/lib/client/types.js +8 -0
  193. package/lib/client/types.js.map +1 -1
  194. package/lib/client/use-session-ui-state.js +7 -5
  195. package/lib/client/use-session-ui-state.js.map +1 -1
  196. package/lib/client/user-settings/GeneralSettingsPage.js +6 -6
  197. package/lib/client/user-settings/GeneralSettingsPage.js.map +1 -1
  198. package/lib/client/user-settings/IntegrationTokensPage.js +6 -6
  199. package/lib/client/user-settings/IntegrationTokensPage.js.map +1 -1
  200. package/lib/client/user-settings/NotificationSettingsPage.js +107 -0
  201. package/lib/client/user-settings/NotificationSettingsPage.js.map +1 -0
  202. package/lib/client/user-settings/PasswordSettingsPage.js +1 -1
  203. package/lib/client/user-settings/PasswordSettingsPage.js.map +1 -1
  204. package/lib/client/user-settings/ProfileSettingsPage.js +2 -2
  205. package/lib/client/user-settings/ProfileSettingsPage.js.map +1 -1
  206. package/lib/client/user-settings/SkillCatalog.js +3 -3
  207. package/lib/client/user-settings/SkillCatalog.js.map +1 -1
  208. package/lib/client/user-settings/SkillEditor.js +26 -8
  209. package/lib/client/user-settings/SkillEditor.js.map +1 -1
  210. package/lib/client/user-settings/SkillToolPicker.js +3 -3
  211. package/lib/client/user-settings/SkillToolPicker.js.map +1 -1
  212. package/lib/client/user-settings/SkillsSettingsPage.js +1 -1
  213. package/lib/client/user-settings/SkillsSettingsPage.js.map +1 -1
  214. package/lib/client/user-settings/StartersSettingsPage.js +6 -6
  215. package/lib/client/user-settings/StartersSettingsPage.js.map +1 -1
  216. package/lib/client/user-settings/UserSettingsDialog.js +7 -2
  217. package/lib/client/user-settings/UserSettingsDialog.js.map +1 -1
  218. package/lib/client/user-settings/copy.js +2 -0
  219. package/lib/client/user-settings/copy.js.map +1 -1
  220. package/lib/client/user-settings/draft.js +4 -1
  221. package/lib/client/user-settings/draft.js.map +1 -1
  222. package/lib/client/user-settings/fields.js +5 -5
  223. package/lib/client/user-settings/fields.js.map +1 -1
  224. package/lib/client.js +7483 -2075
  225. package/lib/client.js.map +1 -1
  226. package/lib/config-resolvers/defaults.js +7 -0
  227. package/lib/config-resolvers/defaults.js.map +1 -1
  228. package/lib/config-resolvers/lockdown.js +7 -0
  229. package/lib/config-resolvers/lockdown.js.map +1 -1
  230. package/lib/config-resolvers/notifications.js +15 -0
  231. package/lib/config-resolvers/notifications.js.map +1 -0
  232. package/lib/config-resolvers/session.js +11 -1
  233. package/lib/config-resolvers/session.js.map +1 -1
  234. package/lib/config.js +67 -18
  235. package/lib/config.js.map +1 -1
  236. package/lib/enforcement/tool-grants.js +6 -6
  237. package/lib/enforcement/tool-grants.js.map +1 -1
  238. package/lib/index.js +171 -39
  239. package/lib/index.js.map +1 -1
  240. package/lib/integration/answer.js +74 -8
  241. package/lib/integration/answer.js.map +1 -1
  242. package/lib/integration/expert-memory.js +39 -0
  243. package/lib/integration/expert-memory.js.map +1 -0
  244. package/lib/integration/host-runner.js +26 -14
  245. package/lib/integration/host-runner.js.map +1 -1
  246. package/lib/notifications.js +66 -0
  247. package/lib/notifications.js.map +1 -0
  248. package/lib/personal-skills/errors.js.map +1 -1
  249. package/lib/personal-skills/service.js +81 -7
  250. package/lib/personal-skills/service.js.map +1 -1
  251. package/lib/prompt-notes.js +2 -10
  252. package/lib/prompt-notes.js.map +1 -1
  253. package/lib/provenance/extractors.js +1 -1
  254. package/lib/provenance/extractors.js.map +1 -1
  255. package/lib/provenance/host-store.js +5 -1
  256. package/lib/provenance/host-store.js.map +1 -1
  257. package/lib/qa-tools/docs-tools.js +64 -11
  258. package/lib/qa-tools/docs-tools.js.map +1 -1
  259. package/lib/qa-tools/lifecycle.js +6 -3
  260. package/lib/qa-tools/lifecycle.js.map +1 -1
  261. package/lib/request-queue.js +32 -0
  262. package/lib/request-queue.js.map +1 -0
  263. package/lib/resolve-config.js +2 -0
  264. package/lib/resolve-config.js.map +1 -1
  265. package/lib/secure-session.js +7 -2
  266. package/lib/secure-session.js.map +1 -1
  267. package/lib/shared/settings.js +19 -2
  268. package/lib/shared/settings.js.map +1 -1
  269. package/lib/turn-failure-log.js +67 -0
  270. package/lib/turn-failure-log.js.map +1 -0
  271. package/lib/typert.host.js +1459 -647
  272. package/lib/typert.remote-client.d.ts +25 -9
  273. package/lib/typert.remote-client.js +1356 -636
  274. package/lib/types/access/capability-catalog.d.ts +20 -4
  275. package/lib/types/access/model.d.ts +23 -0
  276. package/lib/types/access/service.d.ts +2 -3
  277. package/lib/types/account-remotes.d.ts +8 -1
  278. package/lib/types/accounts/database.d.ts +13 -3
  279. package/lib/types/accounts/errors.d.ts +9 -1
  280. package/lib/types/accounts/file.d.ts +12 -0
  281. package/lib/types/accounts/store.d.ts +30 -2
  282. package/lib/types/admin/quality-store.d.ts +33 -0
  283. package/lib/types/admin/service.d.ts +119 -9
  284. package/lib/types/client/QaAccountsController.d.ts +37 -3
  285. package/lib/types/client/QaConfigController.d.ts +2 -2
  286. package/lib/types/client/QaSessionController.d.ts +199 -6
  287. package/lib/types/client/QaSurface.d.ts +6 -1
  288. package/lib/types/client/admin/pages/ExpertMemory.d.ts +19 -0
  289. package/lib/types/client/admin/routes.d.ts +3 -1
  290. package/lib/types/client/admin/shared.d.ts +20 -1
  291. package/lib/types/client/components/Markdown.d.ts +8 -1
  292. package/lib/types/client/components/QaHeader.d.ts +3 -1
  293. package/lib/types/client/components/QaModal.d.ts +7 -0
  294. package/lib/types/client/components/QaQueueDock.d.ts +27 -0
  295. package/lib/types/client/components/QaRequestQueue.d.ts +20 -0
  296. package/lib/types/client/components/QaThemeSwitcher.d.ts +14 -0
  297. package/lib/types/client/components/QaTurnNotice.d.ts +55 -0
  298. package/lib/types/client/focus-ring.d.ts +65 -0
  299. package/lib/types/client/lineage.d.ts +3 -13
  300. package/lib/types/client/markdown/blocks.d.ts +30 -2
  301. package/lib/types/client/markdown/render.d.ts +4 -1
  302. package/lib/types/client/notifications/notification-dispatcher.d.ts +68 -0
  303. package/lib/types/client/notifications/preferences.d.ts +44 -0
  304. package/lib/types/client/notifications/turn-completion-source.d.ts +114 -0
  305. package/lib/types/client/notifications/use-turn-notifications.d.ts +51 -0
  306. package/lib/types/client/project-session-state.d.ts +35 -1
  307. package/lib/types/client/rating-harvest.d.ts +49 -0
  308. package/lib/types/client/role/RoleSelector.d.ts +7 -1
  309. package/lib/types/client/settings/card.d.ts +36 -5
  310. package/lib/types/client/settings/fields.d.ts +24 -0
  311. package/lib/types/client/settings/format.d.ts +0 -5
  312. package/lib/types/client/settings/sections/common.d.ts +3 -1
  313. package/lib/types/client/settings/sections/session.d.ts +2 -1
  314. package/lib/types/client/settings/styles.d.ts +9 -4
  315. package/lib/types/client/settings-extensions/user-session.d.ts +1 -1
  316. package/lib/types/client/theme-preference.d.ts +69 -0
  317. package/lib/types/client/types.d.ts +36 -5
  318. package/lib/types/client/use-session-ui-state.d.ts +6 -4
  319. package/lib/types/client/user-settings/GeneralSettingsPage.d.ts +5 -5
  320. package/lib/types/client/user-settings/NotificationSettingsPage.d.ts +40 -0
  321. package/lib/types/client/user-settings/UserSettingsDialog.d.ts +12 -2
  322. package/lib/types/client/user-settings/draft.d.ts +4 -1
  323. package/lib/types/client/user-settings/fields.d.ts +7 -0
  324. package/lib/types/config-resolvers/notifications.d.ts +10 -0
  325. package/lib/types/config-resolvers/session.d.ts +6 -0
  326. package/lib/types/config.d.ts +20 -1
  327. package/lib/types/index.d.ts +70 -10
  328. package/lib/types/integration/answer.d.ts +27 -0
  329. package/lib/types/integration/expert-memory.d.ts +49 -0
  330. package/lib/types/notifications.d.ts +32 -0
  331. package/lib/types/personal-skills/errors.d.ts +1 -1
  332. package/lib/types/personal-skills/service.d.ts +6 -0
  333. package/lib/types/prompt-notes.d.ts +17 -4
  334. package/lib/types/qa-tools/docs-tools.d.ts +2 -2
  335. package/lib/types/request-queue.d.ts +32 -0
  336. package/lib/types/shared/settings.d.ts +19 -2
  337. package/lib/types/turn-failure-log.d.ts +18 -0
  338. package/lib/types/types.d.ts +200 -4
  339. package/package.json +64 -62
  340. package/scripts/attach-workspace-sessions.mjs +24 -5
  341. package/scripts/repair-session-events.mjs +25 -5
@@ -1,12 +1,14 @@
1
1
  import { TypertRemoteService } from "@deepseek-ai/dsh-typert-protocol";
2
2
  import type { Context } from "@deepseek-ai/cordis";
3
+ import type { QaSurfaceConfigRefs } from "./config.js";
4
+ import type { QaAccountNotificationsInput } from "./types.js";
3
5
  import type { QaTurnSources } from "./provenance/types.js";
4
- import type { QaAccountProfileInput, QaAccountSession, QaAccountStartersInput, QaAccountUserPublic, QaApprovalDecision, QaClaimResult, QaDocumentPreview, QaIssuedServiceToken, QaLockdownProof, QaOwnershipEntry, QaPasswordResetRequest, QaPendingApproval, QaPendingQuestion, QaQuestionAnswerItem, QaServiceTokenCreateInput, QaServiceTokenSummary, QaSurfaceConfig, ResolvedQaSurfaceConfig, QaAdminSkillScope, QaAdminSkillsView, QaSkillDocument, QaSkillDraftInput, QaSkillRemoval, QaSkillSummary, QaSkillToolDescriptor, QaSkillValidation, QaSourceFilePreview, QaWhoamiResult, QaWorkspaceFile, QaWorkspaceListing, QaPrincipal, QaAccessAdminSnapshot, QaAdminAuditEvent, QaAdminOverview, QaAdminPage, QaAdminUserDetail, QaAdminUserRow, QaAdminUserUpdate, QaAuditQuery, QaCapabilitySelection, QaConversationDetail, QaConversationDeletion, QaConversationQuery, QaConversationReview, QaConversationReviewInput, QaConversationSummary, QaCurrentAccess, QaFeedbackQuery, QaFeedbackRow, QaMessageFeedback, QaMessageFeedbackInput, QaQualityMetrics, QaReviewQueueItem, QaReviewQueueRow, QaSessionAccess, QaSlashCatalog, QaSlashExecution, QaSlashSubmitAttachment, QaSkillActivationRecord, QaSkillAssignmentOverride, QaSubrole, QaUserAccess, QaUserQuery } from "./types.js";
6
+ import type { QaAccountProfileInput, QaAccountSession, QaAccountStartersInput, QaAccountUserPublic, QaApprovalDecision, QaClaimResult, QaDocumentPreview, 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, QaWorkspaceListing, QaPrincipal, QaAccessAdminSnapshot, QaAdminAuditEvent, QaAdminOverview, QaAdminPage, QaAdminUserDetail, QaAdminUserRow, QaAdminUserUpdate, QaAuditQuery, QaCapabilitySelection, QaConversationDetail, QaConversationDeletion, QaConversationQuery, QaConversationReview, QaConversationReviewInput, QaConversationSummary, QaCurrentAccess, QaFeedbackHarvestEntry, QaFeedbackHarvestResult, QaFeedbackQuery, QaFeedbackRow, QaMessageFeedback, QaMessageFeedbackInput, QaQualityMetrics, QaReviewQueueItem, QaReviewQueueRow, QaSessionAccess, QaSlashCatalog, QaSlashExecution, QaSlashSubmitAttachment, QaSkillActivationRecord, QaSkillAssignmentOverride, QaSubrole, QaUserAccess, QaUserQuery } from "./types.js";
5
7
  export declare const name = "qa-surface";
6
8
  export declare const inject: string[];
7
9
  import { QA_SURFACE_SETTINGS_NAMESPACE } from "./shared/settings.js";
8
10
  export { QA_SURFACE_SETTINGS_NAMESPACE };
9
- export declare const Config: import("@deepseek-ai/schemastery").default<QaSurfaceConfig>;
11
+ export declare const Config: import("@deepseek-ai/schemastery").default<QaSurfaceConfigRefs>;
10
12
  declare module "@deepseek-ai/cordis" {
11
13
  interface Context {
12
14
  qaSurface: QaSurface;
@@ -15,8 +17,8 @@ declare module "@deepseek-ai/cordis" {
15
17
  /** Host companion: validates config, owns the admission boundary and the route. */
16
18
  export declare class QaSurface extends TypertRemoteService {
17
19
  static inject: string[];
18
- static Config: import("@deepseek-ai/schemastery").default<QaSurfaceConfig>;
19
- private source;
20
+ static Config: import("@deepseek-ai/schemastery").default<QaSurfaceConfigRefs>;
21
+ private readonly source;
20
22
  private readonly logger;
21
23
  private readonly admission;
22
24
  private readonly approvals;
@@ -64,7 +66,7 @@ export declare class QaSurface extends TypertRemoteService {
64
66
  * opens the admin console never grows one.
65
67
  */
66
68
  private qualityStore;
67
- constructor(ctx: Context, entry?: QaSurfaceConfig);
69
+ constructor(ctx: Context, entry?: Partial<QaSurfaceConfigRefs>);
68
70
  /** The quality store, opening its file the first time anyone needs it. */
69
71
  private quality;
70
72
  /**
@@ -75,6 +77,9 @@ export declare class QaSurface extends TypertRemoteService {
75
77
  * the preset composes it but starts no agent, no session and no turn;
76
78
  * without a pinned preset there is nothing to borrow, and the read stays
77
79
  * global.
80
+ *
81
+ * The registry answers with a lease on one preset revision, so the scope is
82
+ * handed to the caller that reads with it and released when that read ends.
78
83
  */
79
84
  private qaPresetScope;
80
85
  /**
@@ -157,6 +162,13 @@ export declare class QaSurface extends TypertRemoteService {
157
162
  * deployment's limits are enforced in the store before anything is written.
158
163
  */
159
164
  accountsUpdateStarters(token: string, input: QaAccountStartersInput): QaAccountUserPublic;
165
+ /**
166
+ * Replace the caller's own notification channels. The account the token
167
+ * authenticates is the only one editable, and the answer is the whole public
168
+ * record, so the settings form re-reads what the stand now holds rather than
169
+ * what it meant to send.
170
+ */
171
+ accountsUpdateNotifications(token: string, input: QaAccountNotificationsInput): QaAccountUserPublic;
160
172
  /**
161
173
  * The caller's own integration tokens. The list is the account's own: the
162
174
  * token names it, and a secret is never part of a summary, so reading this
@@ -188,6 +200,20 @@ export declare class QaSurface extends TypertRemoteService {
188
200
  * boundary stays in {@link secureSession}.
189
201
  */
190
202
  describe(): ResolvedQaSurfaceConfig;
203
+ /**
204
+ * Report how much of the deployment's request ceiling the stand is using, so
205
+ * a browser holds its question back instead of opening another turn on a
206
+ * model that is busy answering the ones it allows.
207
+ *
208
+ * The count is the Host's, not the browser's: a visitor cannot see another
209
+ * account's chats, and the HTTP API's questions are invisible to every chat
210
+ * view. Read-only, and a ceiling rather than a lock — a prompt rides the
211
+ * native session RPC this plugin does not own, so the boundary is the
212
+ * browser's own courtesy, and two questions sent in the same instant can
213
+ * still overshoot by one. What the ceiling buys is that steady state, not a
214
+ * strict bound.
215
+ */
216
+ queueStatus(): QaQueueStatus;
191
217
  /**
192
218
  * Create a QA session from Host-owned inputs. With account workspaces on,
193
219
  * cwd is `<configured workspace>/.qa-users/<account UUID>` and the child is
@@ -232,15 +258,44 @@ export declare class QaSurface extends TypertRemoteService {
232
258
  adminSkillTools(token: string, scope: QaAdminSkillScope): Promise<{
233
259
  readonly tools: readonly QaSkillToolDescriptor[];
234
260
  }>;
235
- /** Counters, attention lines and the newest quality signals. */
236
- adminOverview(token: string): Promise<QaAdminOverview>;
261
+ /**
262
+ * Which experts hold memory, and how much.
263
+ *
264
+ * Reads the domain-experts service on the host plane rather than its remotes:
265
+ * those answer a trusted in-Harness caller and check no token, while this
266
+ * console answers a browser, so the permission check lives here.
267
+ */
268
+ adminMemoryScopes(token: string): Promise<readonly QaExpertMemoryScope[]>;
269
+ /** One page of one namespace, newest first, with the filter's match count. */
270
+ adminMemoryRecords(token: string, namespace: string, query: string, limit: number | null, offset: number): Promise<QaExpertMemoryPage>;
271
+ /** Rewrite one remembered line; the audit trail keeps both images. */
272
+ adminMemoryCorrect(token: string, namespace: string, key: string, draft: QaExpertMemoryDraft): Promise<QaExpertMemoryRecord>;
273
+ /** Drop one or several remembered lines of one namespace. */
274
+ adminMemoryForget(token: string, namespace: string, keys: readonly string[]): Promise<number>;
275
+ /**
276
+ * Empty one namespace, confirming the count the operator was shown.
277
+ *
278
+ * The check is the console's, not the store's: what the operator clicked was
279
+ * a number on a screen, and memory an expert wrote in the meantime is not
280
+ * memory they agreed to erase.
281
+ */
282
+ adminMemoryWipe(token: string, namespace: string, expectedRecords: number | null): Promise<number>;
283
+ /**
284
+ * Counters, attention lines and the newest quality signals.
285
+ *
286
+ * The Host hands the last parameter its cancellation: this call reads the
287
+ * newest conversation logs of the deployment, which on a real store is minutes
288
+ * of work, and a reviewer who leaves the page while it runs must not leave it
289
+ * running — every other administrative call waits behind it.
290
+ */
291
+ adminOverview(token: string, signal: AbortSignal): Promise<QaAdminOverview>;
237
292
  adminUsers(token: string, query: QaUserQuery, cursor: string | null, limit: number | null): Promise<QaAdminPage<QaAdminUserRow>>;
238
293
  adminUser(token: string, userId: string): Promise<QaAdminUserDetail>;
239
294
  /** Authorization role, status and subrole assignment of one account. */
240
295
  adminUpdateUser(token: string, userId: string, update: QaAdminUserUpdate): Promise<QaAdminUserDetail>;
241
296
  adminPasswordResetRequests(token: string): Promise<readonly QaPasswordResetRequest[]>;
242
297
  adminResetPassword(token: string, userId: string, password: string): Promise<QaAdminUserDetail>;
243
- adminConversations(token: string, query: QaConversationQuery, cursor: string | null, limit: number | null): Promise<QaAdminPage<QaConversationSummary>>;
298
+ adminConversations(token: string, query: QaConversationQuery, cursor: string | null, limit: number | null, signal: AbortSignal): Promise<QaAdminPage<QaConversationSummary>>;
244
299
  /** One conversation with its messages, tool calls and review state. */
245
300
  adminConversation(token: string, conversationId: string): Promise<QaConversationDetail>;
246
301
  /**
@@ -255,11 +310,16 @@ export declare class QaSurface extends TypertRemoteService {
255
310
  * ratable conversation, exactly as the self-service profile write does.
256
311
  */
257
312
  adminRateMessage(token: string, conversationId: string, messageId: string, input: QaMessageFeedbackInput): QaMessageFeedback;
258
- adminReviewQueue(token: string, cursor: string | null, limit: number | null): Promise<QaAdminPage<QaReviewQueueRow>>;
313
+ /**
314
+ * Replay the ratings a browser still holds from before a thumbs reached the
315
+ * Host. Insert-only: what the deployment already records is never rewritten.
316
+ */
317
+ adminHarvestFeedback(token: string, entries: readonly QaFeedbackHarvestEntry[]): QaFeedbackHarvestResult;
318
+ adminReviewQueue(token: string, cursor: string | null, limit: number | null, signal: AbortSignal): Promise<QaAdminPage<QaReviewQueueRow>>;
259
319
  /** Park a conversation for review without rating it. */
260
320
  adminQueueConversation(token: string, conversationId: string, messageId: string | null): QaReviewQueueItem;
261
321
  adminSaveReview(token: string, input: QaConversationReviewInput): QaConversationReview;
262
- adminMetrics(token: string): Promise<QaQualityMetrics>;
322
+ adminMetrics(token: string, signal: AbortSignal): Promise<QaQualityMetrics>;
263
323
  adminAudit(token: string, query: QaAuditQuery, cursor: string | null, limit: number | null): Promise<QaAdminPage<QaAdminAuditEvent>>;
264
324
  /** Pin and attest the effective policy. The browser supplies identity only. */
265
325
  secureSession(token: string, sessionId: string): Promise<QaLockdownProof>;
@@ -20,6 +20,15 @@ export interface QaTurnAnswer {
20
20
  /** Durable seq of the message the answer came from, when there was one. */
21
21
  readonly seq: number | null;
22
22
  }
23
+ /** One request's answer, additionally attributed to the turn it came from. */
24
+ export interface QaRequestAnswer extends QaTurnAnswer {
25
+ /**
26
+ * The harness turn number the answer was read out of, or null when the log
27
+ * named no turn for the request's own row. The provenance bundle of a turn is
28
+ * the evidence of its answer, so the caller cites the same number.
29
+ */
30
+ readonly turn: number | null;
31
+ }
23
32
  /** The empty answer: what a turn that committed nothing readable looks like. */
24
33
  export declare const QA_EMPTY_ANSWER: QaTurnAnswer;
25
34
  /**
@@ -35,6 +44,24 @@ export declare const QA_EMPTY_ANSWER: QaTurnAnswer;
35
44
  * @returns the publishable answer and whether the turn was interrupted.
36
45
  */
37
46
  export declare function answerAfter(events: readonly StoredSessionEvent[], afterSeq: number): QaTurnAnswer;
47
+ /**
48
+ * Project the answer of the turn one request's own prompt opened.
49
+ *
50
+ * The harness stamps the prompt's rpc id onto the durable user row it claims,
51
+ * so the row is found by id rather than guessed from the newest human message:
52
+ * two questions in flight on one chat open two turns, and a selection by
53
+ * "latest" answers each caller with the other's turn. The turn that answers a
54
+ * request is the one its row was claimed into — `turn/start` opens a turn and
55
+ * the claimed rows follow it — so the answer is read out of that turn's
56
+ * assistant messages only, and its number travels with it for the citation.
57
+ *
58
+ * @param events - durable events, in any order.
59
+ * @param requestId - the rpc id the prompt was submitted with.
60
+ * @returns the answer of this request's turn, or `undefined` when the log
61
+ * holds no row for the request (an unflushed prompt, or a harness that does not
62
+ * echo the id), which leaves the choice of cursor to the caller.
63
+ */
64
+ export declare function answerForRequest(events: readonly StoredSessionEvent[], requestId: string): QaRequestAnswer | undefined;
38
65
  /**
39
66
  * Cut an answer down to the size the caller publishes.
40
67
  *
@@ -0,0 +1,49 @@
1
+ import type { QaExpertMemoryRecord, QaExpertMemoryScope } from "../types.js";
2
+ /**
3
+ * The slice of `@yadsh/dsh-domain-experts` the QA console uses.
4
+ *
5
+ * Declared structurally instead of imported, for the same reason the audit
6
+ * remote is: the QA surface has to load on a stand where the experts plugin is
7
+ * not composed at all, and a package dependency would turn "not installed" into
8
+ * "does not boot".
9
+ *
10
+ * What is reached is the plugin's `memoryAdmin` seam — not its `@Remote`
11
+ * methods. A domain-experts remote takes no token and checks no permission,
12
+ * because inside the Harness its caller is already a trusted component; the QA
13
+ * console answers a browser on a LAN port, so it carries the identity itself
14
+ * and goes through the host-plane seam instead.
15
+ */
16
+ export interface QaExpertMemoryAdmin {
17
+ scopes(): Promise<readonly QaExpertMemoryScope[]>;
18
+ search(namespace: string, query: string, limit: number, offset: number): Promise<{
19
+ readonly records: readonly QaExpertMemoryRecord[];
20
+ readonly total: number;
21
+ }>;
22
+ correct(input: QaExpertMemoryRecordInput): Promise<QaExpertMemoryRecord>;
23
+ remove(namespace: string, key: string): Promise<boolean>;
24
+ removeMany(namespace: string, keys: readonly string[]): Promise<number>;
25
+ wipe(namespace: string): Promise<number>;
26
+ }
27
+ /** What a correction says one record should hold. The key is the address. */
28
+ export interface QaExpertMemoryRecordInput {
29
+ readonly namespace: string;
30
+ readonly key: string;
31
+ readonly text: string;
32
+ readonly tags?: readonly string[];
33
+ }
34
+ /** The part of the domain-experts service the console addresses. */
35
+ export interface QaDomainExpertsFace {
36
+ readonly memoryAdmin: QaExpertMemoryAdmin;
37
+ }
38
+ /**
39
+ * Why a memory call failed, in the coarse vocabulary the console's copy table
40
+ * speaks.
41
+ *
42
+ * The refusal is read off the plugin's stable `code` field rather than its
43
+ * message: a message is written for a log and gets reworded, and matching one
44
+ * here would mean a rename in another package silently turns a refusal into an
45
+ * unhandled fault. `cause` is checked too, because the storage seam wraps what
46
+ * the backend threw.
47
+ */
48
+ export declare function expertMemoryReasonOf(error: unknown): "forbidden" | "memory-record-unknown" | "memory-unavailable" | "invalid-memory" | undefined;
49
+ //# sourceMappingURL=expert-memory.d.ts.map
@@ -0,0 +1,32 @@
1
+ import type { QaAccountNotifications, QaAccountNotificationsInput } from "./types.js";
2
+ /**
3
+ * What an account that never opened the notifications form gets.
4
+ *
5
+ * The in-page line is the shipped default of the feature itself, so an
6
+ * untouched account keeps behaving as it did before the form existed. The
7
+ * desktop channel stays off until asked for: raising an operating-system notice
8
+ * is the one choice that leaves the page, and a stand where the browser was
9
+ * never asked must not make it on the account's behalf.
10
+ */
11
+ export declare function emptyNotifications(): QaAccountNotifications;
12
+ /**
13
+ * Read one stored (or wire-delivered) notifications record into its public
14
+ * shape. Unknown or hand-edited input degrades to the readable subset rather
15
+ * than throwing, mirroring the starters read path: a malformed record must
16
+ * never cost the account its session.
17
+ */
18
+ export declare function normalizeNotifications(value: unknown): QaAccountNotifications;
19
+ export type QaNotificationsWriteResult = {
20
+ readonly ok: true;
21
+ readonly value: QaAccountNotificationsInput;
22
+ } | {
23
+ readonly ok: false;
24
+ readonly message: string;
25
+ };
26
+ /**
27
+ * Validate one full-replace notifications write. Both channels are required: a
28
+ * payload that names only one would silently reset the other, and the form
29
+ * always sends the pair it was rendered with.
30
+ */
31
+ export declare function validateNotificationsWrite(input: unknown): QaNotificationsWriteResult;
32
+ //# sourceMappingURL=notifications.d.ts.map
@@ -3,7 +3,7 @@
3
3
  * `(reason: <code>)` marker the account remotes established: the browser maps
4
4
  * them to audience-safe copy, while the precise cause stays in the Host log.
5
5
  */
6
- export type QaPersonalSkillErrorReason = "skills-disabled" | "workspace-unavailable" | "skill-not-found" | "skill-exists" | "skill-conflict" | "skill-name-invalid" | "skill-invalid" | "storage-unavailable";
6
+ export type QaPersonalSkillErrorReason = "skills-disabled" | "workspace-unavailable" | "skill-not-found" | "skill-exists" | "skill-conflict" | "skill-truncated" | "skill-name-invalid" | "skill-invalid" | "storage-unavailable";
7
7
  export declare class QaPersonalSkillError extends Error {
8
8
  readonly reason: QaPersonalSkillErrorReason;
9
9
  constructor(reason: QaPersonalSkillErrorReason, message: string);
@@ -55,6 +55,12 @@ export interface QaStoredSkill {
55
55
  readonly contents: QaSkillFileContents | undefined;
56
56
  readonly diagnostics: readonly QaSkillDiagnostic[];
57
57
  readonly resourceCount: number;
58
+ /**
59
+ * True when `raw` is only the head of the file: an oversized `SKILL.md` is
60
+ * read up to the ceiling, and what follows it was never loaded. A write must
61
+ * not overwrite such a document without saying so out loud.
62
+ */
63
+ readonly truncated: boolean;
58
64
  }
59
65
  export interface QaPersonalSkillsOptions {
60
66
  readonly getConfig: () => ResolvedQaSurfaceConfig;
@@ -1,13 +1,26 @@
1
1
  import type { Context } from "@deepseek-ai/cordis";
2
+ import type { ContextSnapshotSection } from "@deepseek-ai/dsh-llm";
2
3
  import type { PluginLogger } from "@yadsh/dsh-plugin-log";
3
4
  import type { QaAccounts } from "./accounts/store.js";
4
5
  import type { QaAccountIdentityField, QaAccountProfile, ResolvedQaSurfaceConfig } from "./types.js";
5
6
  /**
6
- * Plugin marker on every injected message. The chat projection turns a
7
- * plugin-sourced user message into injected context rather than a chat
8
- * bubble, and the QA transcript keeps exactly those hidden.
7
+ * This plugin's own producer source kind. The `@deepseek-ai/dsh-llm` source map
8
+ * is merge-extensible and ships no catch-all `plugin` kind, so a producer names
9
+ * itself here. The chat projection turns a `qa-notes`-sourced user message into
10
+ * injected context rather than a chat bubble, and the QA transcript keeps
11
+ * exactly those hidden.
9
12
  */
10
- export declare const QA_NOTES_PLUGIN = "qa-surface";
13
+ export interface QaNotesMessageSource {
14
+ readonly kind: "qa-notes";
15
+ /** Every note is superseded by the next one this plugin injects. */
16
+ readonly form: "snapshot";
17
+ readonly sections: readonly ContextSnapshotSection[];
18
+ }
19
+ declare module "@deepseek-ai/dsh-llm" {
20
+ interface MessageSourceMap {
21
+ "qa-notes": QaNotesMessageSource;
22
+ }
23
+ }
11
24
  /** Note name carrying who the assistant is talking to. */
12
25
  export declare const QA_IDENTITY_NOTE = "dsh-qa-surface:user-identity";
13
26
  /** Note name carrying the deployment's rule about source provenance. */
@@ -161,8 +161,8 @@ export interface QaDocsSearchRequest {
161
161
  /**
162
162
  * Search the documentation tree of one chat workspace.
163
163
  *
164
- * Matching is a case-insensitive substring test, line by line: a hit is a
165
- * line, not a file, so the caller can cite it. The result is bounded twice —
164
+ * Matching uses one case-insensitive, grep-style regular expression, line by
165
+ * line: a hit is a line, not a file, so the caller can cite it. The result is bounded twice —
166
166
  * by `limit` hits and by the byte budget of the rendered report — and reports
167
167
  * which bound cut it short instead of silently dropping matches.
168
168
  * @throws QaDocsError when the tree is missing, the scope path is wrong, or the query is empty.
@@ -0,0 +1,32 @@
1
+ import type { Agent } from "@deepseek-ai/dsh-agent";
2
+ import type { QaQueueStatus } from "./types.js";
3
+ /**
4
+ * Chat turns the stand is answering right now.
5
+ *
6
+ * `running` is the harness's own definition of an active request: an agent
7
+ * enters it when waking input starts the driver and leaves it when the driver
8
+ * retires, which is what `agent/status` reports. Reading the live agents rather
9
+ * than counting the plugin's own sends is what keeps the places honest — a
10
+ * browser that closes mid-answer, an answer started through the HTTP API and a
11
+ * turn resumed by another surface all occupy a place, and none of them has to
12
+ * report it here. Only top-level agents count: a delegated expert's requests
13
+ * belong to the chat turn that delegated them, so charging both would bill one
14
+ * conversation twice.
15
+ *
16
+ * The count is of the model's load, not of this plugin's traffic: a turn the
17
+ * native assistant runs occupies a place exactly like a QA question does,
18
+ * because the ceiling exists for the card that is busy either way.
19
+ */
20
+ export declare function qaActiveRequests(agents: readonly {
21
+ readonly status: Agent["status"];
22
+ }[]): number;
23
+ /**
24
+ * Judge the live count against the deployment's ceiling. A ceiling of 0 sets no
25
+ * limit, so the stand is never full and nobody waits.
26
+ *
27
+ * There is deliberately no "ahead of you" number: `active` includes this
28
+ * visitor's own turns, and a stand that cannot say which place belongs to whom
29
+ * should not pretend to know who is waiting behind whom.
30
+ */
31
+ export declare function qaQueueStatus(limit: number, active: number): QaQueueStatus;
32
+ //# sourceMappingURL=request-queue.d.ts.map
@@ -5,6 +5,23 @@
5
5
  * browser build must not pull the Host config surface (schemastery) into the
6
6
  * page just to learn the namespace name.
7
7
  */
8
- /** Settings namespace the QA surface owns and its card binds to. */
9
- export declare const QA_SURFACE_SETTINGS_NAMESPACE = "qa-surface";
8
+ /**
9
+ * Settings namespace the QA surface owns and its card binds to.
10
+ *
11
+ * The namespace is the profile entry id the bundle declares in
12
+ * `cordis.patch.yml`, not a name this plugin picks: the Host derives the
13
+ * configuration form of every entry from its volatile `Config` fields and serves
14
+ * it under that id.
15
+ */
16
+ export declare const QA_SURFACE_SETTINGS_NAMESPACE = "dsh-qa-surface";
17
+ /**
18
+ * The key of the seat this card takes on the Host's Plugins page.
19
+ *
20
+ * `plugins.row.config` is keyed `<package name>#<row id>`, so the two names the
21
+ * page joins are this bundle's `package.json.name` and the profile entry id
22
+ * above. Neither is a name this plugin picks: a key that drifts from that pair
23
+ * leaves the row without its configure control and the card off the page, with
24
+ * nothing said about it.
25
+ */
26
+ export declare const QA_SURFACE_ROW_CONFIG_KEY = "@yadsh/dsh-qa-surface#dsh-qa-surface";
10
27
  //# sourceMappingURL=settings.d.ts.map
@@ -0,0 +1,18 @@
1
+ import type { Context } from "@deepseek-ai/cordis";
2
+ import type { PluginLogger } from "@yadsh/dsh-plugin-log";
3
+ /**
4
+ * Write a failed turn where the operator of the stand reads it.
5
+ *
6
+ * The chat row of a failed turn carries the failure code and nothing else: the
7
+ * provider's own message is deliberately kept out of the browser, and the
8
+ * session journal that holds it is a zstd archive nobody reads over an
9
+ * operator's shoulder. So a stand whose provider adapters never registered —
10
+ * every turn ending `NO_ADAPTER` — shows its tester «Помощнику не удалось
11
+ * завершить ответ.» and stays undiagnosable until someone decodes frames by
12
+ * hand. This listener puts the facts an operator needs — the chat, the session
13
+ * that died inside it, the turn, the code, and the provider the Host was asked
14
+ * to route to — into the plugin's own daily log, which is mirrored to the
15
+ * container's stdout from `warn` up.
16
+ */
17
+ export declare function registerTurnFailureLog(ctx: Context, logger: PluginLogger, resolveChat: (sessionId: string) => string | undefined): () => void;
18
+ //# sourceMappingURL=turn-failure-log.d.ts.map