@yadsh/dsh-qa-surface 0.9.0 → 0.11.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 (250) hide show
  1. package/README.md +269 -2
  2. package/lib/access/service.js +49 -10
  3. package/lib/access/service.js.map +1 -1
  4. package/lib/account-remotes.js +41 -0
  5. package/lib/account-remotes.js.map +1 -1
  6. package/lib/accounts/database.js +140 -0
  7. package/lib/accounts/database.js.map +1 -1
  8. package/lib/accounts/errors.js.map +1 -1
  9. package/lib/accounts/service-token.js +103 -0
  10. package/lib/accounts/service-token.js.map +1 -0
  11. package/lib/accounts/store.js +291 -5
  12. package/lib/accounts/store.js.map +1 -1
  13. package/lib/admin/conversation-log.js +14 -8
  14. package/lib/admin/conversation-log.js.map +1 -1
  15. package/lib/admin/permissions.js +5 -0
  16. package/lib/admin/permissions.js.map +1 -1
  17. package/lib/admin/quality-store.js +4 -0
  18. package/lib/admin/quality-store.js.map +1 -1
  19. package/lib/admin/service.js +180 -7
  20. package/lib/admin/service.js.map +1 -1
  21. package/lib/admin/session-log.js +39 -8
  22. package/lib/admin/session-log.js.map +1 -1
  23. package/lib/attachment-rules.js +39 -6
  24. package/lib/attachment-rules.js.map +1 -1
  25. package/lib/cli.js +83 -1
  26. package/lib/cli.js.map +1 -1
  27. package/lib/client/QaAccountsController.js +213 -4
  28. package/lib/client/QaAccountsController.js.map +1 -1
  29. package/lib/client/QaSessionController.js +49 -21
  30. package/lib/client/QaSessionController.js.map +1 -1
  31. package/lib/client/QaSurface.js +51 -9
  32. package/lib/client/QaSurface.js.map +1 -1
  33. package/lib/client/QaSurfaceGuard.js +12 -5
  34. package/lib/client/QaSurfaceGuard.js.map +1 -1
  35. package/lib/client/admin/QaAdmin.js +14 -2
  36. package/lib/client/admin/QaAdmin.js.map +1 -1
  37. package/lib/client/admin/pages/SkillFiles.js +78 -0
  38. package/lib/client/admin/pages/SkillFiles.js.map +1 -0
  39. package/lib/client/admin/pages/Users.js +74 -3
  40. package/lib/client/admin/pages/Users.js.map +1 -1
  41. package/lib/client/admin/routes.js +8 -1
  42. package/lib/client/admin/routes.js.map +1 -1
  43. package/lib/client/admin/shared.js +5 -1
  44. package/lib/client/admin/shared.js.map +1 -1
  45. package/lib/client/admin/styles.js +2 -0
  46. package/lib/client/admin/styles.js.map +1 -1
  47. package/lib/client/attachments.js +41 -11
  48. package/lib/client/attachments.js.map +1 -1
  49. package/lib/client/base64.js +22 -1
  50. package/lib/client/base64.js.map +1 -1
  51. package/lib/client/components/QaAgentsDrawer.js +9 -6
  52. package/lib/client/components/QaAgentsDrawer.js.map +1 -1
  53. package/lib/client/components/QaApproval.js +1 -1
  54. package/lib/client/components/QaApproval.js.map +1 -1
  55. package/lib/client/components/QaAuthGate.js +19 -10
  56. package/lib/client/components/QaAuthGate.js.map +1 -1
  57. package/lib/client/components/QaChangelog.js +56 -0
  58. package/lib/client/components/QaChangelog.js.map +1 -1
  59. package/lib/client/components/QaFilesPanel.js +17 -11
  60. package/lib/client/components/QaFilesPanel.js.map +1 -1
  61. package/lib/client/components/QaHeader.js +3 -11
  62. package/lib/client/components/QaHeader.js.map +1 -1
  63. package/lib/client/components/QaModal.js.map +1 -1
  64. package/lib/client/components/QaQuestions.js +4 -4
  65. package/lib/client/components/QaQuestions.js.map +1 -1
  66. package/lib/client/components/QaSidebar.js +10 -2
  67. package/lib/client/components/QaSidebar.js.map +1 -1
  68. package/lib/client/components/QaWidthHandle.js +111 -5
  69. package/lib/client/components/QaWidthHandle.js.map +1 -1
  70. package/lib/client/components/QaWorkspaceBrowser.js +231 -0
  71. package/lib/client/components/QaWorkspaceBrowser.js.map +1 -0
  72. package/lib/client/index.js +122 -53
  73. package/lib/client/index.js.map +1 -1
  74. package/lib/client/kiosk.js +51 -0
  75. package/lib/client/kiosk.js.map +1 -0
  76. package/lib/client/lineage.js +64 -0
  77. package/lib/client/lineage.js.map +1 -1
  78. package/lib/client/markdown/blocks.js +122 -7
  79. package/lib/client/markdown/blocks.js.map +1 -1
  80. package/lib/client/markdown/inline.js +108 -12
  81. package/lib/client/markdown/inline.js.map +1 -1
  82. package/lib/client/markdown/katex-css.js +12 -0
  83. package/lib/client/markdown/katex-css.js.map +1 -0
  84. package/lib/client/markdown/math.js +84 -0
  85. package/lib/client/markdown/math.js.map +1 -0
  86. package/lib/client/markdown/render.js +74 -5
  87. package/lib/client/markdown/render.js.map +1 -1
  88. package/lib/client/settings/card.js +2 -2
  89. package/lib/client/settings/card.js.map +1 -1
  90. package/lib/client/settings/sections/attachments.js +6 -5
  91. package/lib/client/settings/sections/attachments.js.map +1 -1
  92. package/lib/client/settings/sections/notes.js +64 -0
  93. package/lib/client/settings/sections/notes.js.map +1 -0
  94. package/lib/client/settings/sections/sources.js +4 -1
  95. package/lib/client/settings/sections/sources.js.map +1 -1
  96. package/lib/client/settings/sections.js +1 -0
  97. package/lib/client/settings/sections.js.map +1 -1
  98. package/lib/client/settlement.js +1 -1
  99. package/lib/client/settlement.js.map +1 -1
  100. package/lib/client/source-preview.js +3 -0
  101. package/lib/client/source-preview.js.map +1 -1
  102. package/lib/client/styles.js +106 -18
  103. package/lib/client/styles.js.map +1 -1
  104. package/lib/client/types.js.map +1 -1
  105. package/lib/client/user-settings/IntegrationTokensPage.js +150 -0
  106. package/lib/client/user-settings/IntegrationTokensPage.js.map +1 -0
  107. package/lib/client/user-settings/PasswordSettingsPage.js +48 -0
  108. package/lib/client/user-settings/PasswordSettingsPage.js.map +1 -0
  109. package/lib/client/user-settings/SkillCatalog.js +2 -2
  110. package/lib/client/user-settings/SkillCatalog.js.map +1 -1
  111. package/lib/client/user-settings/UserSettingsDialog.js +17 -2
  112. package/lib/client/user-settings/UserSettingsDialog.js.map +1 -1
  113. package/lib/client/user-settings/copy.js +20 -0
  114. package/lib/client/user-settings/copy.js.map +1 -1
  115. package/lib/client.js +31007 -686
  116. package/lib/client.js.map +1 -1
  117. package/lib/config-resolvers/attachments.js +6 -5
  118. package/lib/config-resolvers/attachments.js.map +1 -1
  119. package/lib/config-resolvers/defaults.js +33 -2
  120. package/lib/config-resolvers/defaults.js.map +1 -1
  121. package/lib/config-resolvers/integration.js +94 -0
  122. package/lib/config-resolvers/integration.js.map +1 -0
  123. package/lib/config-resolvers/notes.js +26 -0
  124. package/lib/config-resolvers/notes.js.map +1 -0
  125. package/lib/config-resolvers/sources.js +4 -0
  126. package/lib/config-resolvers/sources.js.map +1 -1
  127. package/lib/config.js +107 -0
  128. package/lib/config.js.map +1 -1
  129. package/lib/index.js +348 -12
  130. package/lib/index.js.map +1 -1
  131. package/lib/integration/answer.js +100 -0
  132. package/lib/integration/answer.js.map +1 -0
  133. package/lib/integration/attachments.js +231 -0
  134. package/lib/integration/attachments.js.map +1 -0
  135. package/lib/integration/contract.js +53 -0
  136. package/lib/integration/contract.js.map +1 -0
  137. package/lib/integration/host-runner.js +243 -0
  138. package/lib/integration/host-runner.js.map +1 -0
  139. package/lib/integration/http.js +538 -0
  140. package/lib/integration/http.js.map +1 -0
  141. package/lib/integration/service.js +331 -0
  142. package/lib/integration/service.js.map +1 -0
  143. package/lib/integration/transcript-reader.js +202 -0
  144. package/lib/integration/transcript-reader.js.map +1 -0
  145. package/lib/integration/transcript.js +148 -0
  146. package/lib/integration/transcript.js.map +1 -0
  147. package/lib/personal-skills/index.js +2 -2
  148. package/lib/personal-skills/index.js.map +1 -1
  149. package/lib/personal-skills/paths.js +14 -8
  150. package/lib/personal-skills/paths.js.map +1 -1
  151. package/lib/personal-skills/provider.js +16 -4
  152. package/lib/personal-skills/provider.js.map +1 -1
  153. package/lib/personal-skills/service.js +240 -30
  154. package/lib/personal-skills/service.js.map +1 -1
  155. package/lib/prompt-notes.js +103 -6
  156. package/lib/prompt-notes.js.map +1 -1
  157. package/lib/provenance/document-preview.js +60 -0
  158. package/lib/provenance/document-preview.js.map +1 -0
  159. package/lib/provenance/file-preview.js +191 -19
  160. package/lib/provenance/file-preview.js.map +1 -1
  161. package/lib/qa-tools/catalog.js +18 -1
  162. package/lib/qa-tools/catalog.js.map +1 -1
  163. package/lib/qa-tools/docs-tools.js +563 -0
  164. package/lib/qa-tools/docs-tools.js.map +1 -0
  165. package/lib/qa-tools/file-delete-gate.js +60 -0
  166. package/lib/qa-tools/file-delete-gate.js.map +1 -0
  167. package/lib/qa-tools/file-delete.js +156 -0
  168. package/lib/qa-tools/file-delete.js.map +1 -0
  169. package/lib/resolve-config.js +6 -0
  170. package/lib/resolve-config.js.map +1 -1
  171. package/lib/secure-session.js +83 -3
  172. package/lib/secure-session.js.map +1 -1
  173. package/lib/shared/documents.js +22 -0
  174. package/lib/shared/documents.js.map +1 -0
  175. package/lib/shared/integration-tokens.js +23 -0
  176. package/lib/shared/integration-tokens.js.map +1 -0
  177. package/lib/typert.host.js +1320 -134
  178. package/lib/typert.remote-client.d.ts +33 -1
  179. package/lib/typert.remote-client.js +1102 -74
  180. package/lib/types/access/service.d.ts +33 -2
  181. package/lib/types/account-remotes.d.ts +30 -1
  182. package/lib/types/accounts/database.d.ts +53 -0
  183. package/lib/types/accounts/errors.d.ts +5 -1
  184. package/lib/types/accounts/service-token.d.ts +70 -0
  185. package/lib/types/accounts/store.d.ts +131 -1
  186. package/lib/types/admin/conversation-log.d.ts +12 -0
  187. package/lib/types/admin/service.d.ts +56 -1
  188. package/lib/types/admin/session-log.d.ts +21 -0
  189. package/lib/types/attachment-rules.d.ts +26 -3
  190. package/lib/types/client/QaAccountsController.d.ts +64 -5
  191. package/lib/types/client/QaSessionController.d.ts +24 -2
  192. package/lib/types/client/admin/pages/SkillFiles.d.ts +17 -0
  193. package/lib/types/client/admin/routes.d.ts +2 -0
  194. package/lib/types/client/admin/shared.d.ts +2 -0
  195. package/lib/types/client/attachments.d.ts +21 -4
  196. package/lib/types/client/base64.d.ts +13 -1
  197. package/lib/types/client/components/QaAgentsDrawer.d.ts +2 -1
  198. package/lib/types/client/components/QaFilesPanel.d.ts +16 -4
  199. package/lib/types/client/components/QaHeader.d.ts +9 -3
  200. package/lib/types/client/components/QaModal.d.ts +4 -3
  201. package/lib/types/client/components/QaWidthHandle.d.ts +48 -2
  202. package/lib/types/client/components/QaWorkspaceBrowser.d.ts +15 -0
  203. package/lib/types/client/index.d.ts +1 -1
  204. package/lib/types/client/kiosk.d.ts +34 -0
  205. package/lib/types/client/lineage.d.ts +42 -0
  206. package/lib/types/client/markdown/blocks.d.ts +14 -1
  207. package/lib/types/client/markdown/inline.d.ts +23 -7
  208. package/lib/types/client/markdown/katex-css.d.ts +11 -0
  209. package/lib/types/client/markdown/math.d.ts +23 -0
  210. package/lib/types/client/markdown/render.d.ts +2 -1
  211. package/lib/types/client/settings/sections/notes.d.ts +12 -0
  212. package/lib/types/client/settings/sections.d.ts +1 -0
  213. package/lib/types/client/settlement.d.ts +4 -1
  214. package/lib/types/client/styles.d.ts +15 -2
  215. package/lib/types/client/types.d.ts +120 -1
  216. package/lib/types/client/user-settings/IntegrationTokensPage.d.ts +21 -0
  217. package/lib/types/client/user-settings/PasswordSettingsPage.d.ts +19 -0
  218. package/lib/types/client/user-settings/UserSettingsDialog.d.ts +11 -2
  219. package/lib/types/client/user-settings/copy.d.ts +10 -1
  220. package/lib/types/config-resolvers/integration.d.ts +47 -0
  221. package/lib/types/config-resolvers/notes.d.ts +10 -0
  222. package/lib/types/config.d.ts +10 -0
  223. package/lib/types/index.d.ts +111 -1
  224. package/lib/types/integration/answer.d.ts +65 -0
  225. package/lib/types/integration/attachments.d.ts +85 -0
  226. package/lib/types/integration/contract.d.ts +196 -0
  227. package/lib/types/integration/host-runner.d.ts +44 -0
  228. package/lib/types/integration/http.d.ts +79 -0
  229. package/lib/types/integration/service.d.ts +120 -0
  230. package/lib/types/integration/transcript-reader.d.ts +100 -0
  231. package/lib/types/integration/transcript.d.ts +59 -0
  232. package/lib/types/personal-skills/index.d.ts +2 -2
  233. package/lib/types/personal-skills/paths.d.ts +15 -3
  234. package/lib/types/personal-skills/provider.d.ts +14 -2
  235. package/lib/types/personal-skills/service.d.ts +89 -14
  236. package/lib/types/prompt-notes.d.ts +37 -0
  237. package/lib/types/provenance/document-preview.d.ts +28 -0
  238. package/lib/types/provenance/file-preview.d.ts +69 -2
  239. package/lib/types/qa-tools/catalog.d.ts +1 -1
  240. package/lib/types/qa-tools/docs-tools.d.ts +160 -0
  241. package/lib/types/qa-tools/file-delete-gate.d.ts +42 -0
  242. package/lib/types/qa-tools/file-delete.d.ts +32 -0
  243. package/lib/types/secure-session.d.ts +52 -1
  244. package/lib/types/shared/documents.d.ts +20 -0
  245. package/lib/types/shared/integration-tokens.d.ts +24 -0
  246. package/lib/types/types.d.ts +263 -3
  247. package/lib/types/ui-mode.d.ts +18 -0
  248. package/lib/ui-mode.js +22 -0
  249. package/lib/ui-mode.js.map +1 -0
  250. package/package.json +12 -10
@@ -12,6 +12,28 @@ export const QA_IDENTITY_NOTE = "dsh-qa-surface:user-identity";
12
12
  export const QA_SOURCES_NOTE = "dsh-qa-surface:structured-sources";
13
13
  /** Note name asking the model to name its delegations. */
14
14
  export const QA_DELEGATION_NOTE = "dsh-qa-surface:delegation-naming";
15
+ /** Note name routing an attached office document to the document pipeline. */
16
+ export const QA_DOCUMENTS_NOTE = "dsh-qa-surface:attached-documents";
17
+ /** Note name carrying the deployment's rule about where an answer comes from. */
18
+ export const QA_SOURCE_PRIORITY_NOTE = "dsh-qa-surface:source-priority";
19
+ /**
20
+ * Built-in note texts. Each is the fallback for its settings template
21
+ * (`notes.*.template`); the placeholders mark the parts the injector
22
+ * substitutes. Unknown or empty placeholders render as empty text.
23
+ */
24
+ export const QA_IDENTITY_NOTE_TEMPLATE = "{identity}\n\n{instructions}";
25
+ export 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/Источники bibliography of your own.";
26
+ export const QA_SOURCES_FALLBACK_TEMPLATE = "A delegated run whose provider cannot expose tool events must call {reportTool} before finishing.";
27
+ export 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 («Сверка отчётов», \"Log triage\"). The QA surface shows that description as the subagent's display name in the operator's panel and completion notices.";
28
+ export 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 — `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. 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.";
29
+ export 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 — 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.";
30
+ /** Substitute `{name}` placeholders; a placeholder without a value drops out. */
31
+ function renderTemplate(template, tokens) {
32
+ return template.replace(/\{(\w+)\}/g, (token, name) => {
33
+ const value = tokens[name];
34
+ return value === undefined ? token : value;
35
+ });
36
+ }
15
37
  /** Bound on the durable delegation chain walked to find a chat's root session. */
16
38
  const QA_NOTES_MAX_DEPTH = 64;
17
39
  /**
@@ -117,6 +139,8 @@ export class QaPromptNotes {
117
139
  ...this.identityNotes(root, config),
118
140
  ...this.sourcesNotes(root, config),
119
141
  ...this.delegationNotes(root),
142
+ ...this.documentsNotes(root),
143
+ ...this.sourcePriorityNotes(root),
120
144
  ].filter((note) => this.carriedText(agent, note.name) !== note.text);
121
145
  if (pending.length === 0)
122
146
  return decision;
@@ -144,6 +168,8 @@ export class QaPromptNotes {
144
168
  const profileConfig = config.accounts.profile;
145
169
  if (!profileConfig.enabled || !profileConfig.inject)
146
170
  return [];
171
+ if (!config.notes.identity.enabled)
172
+ return [];
147
173
  const identity = this.identityOf(rootSessionId);
148
174
  if (identity === undefined)
149
175
  return [];
@@ -152,9 +178,16 @@ export class QaPromptNotes {
152
178
  profile: identity.profile,
153
179
  identities: profileConfig.identities,
154
180
  });
155
- const text = [rendered.identity, rendered.instructions]
156
- .filter((part) => part !== "")
157
- .join("\n\n");
181
+ const parts = [rendered.identity, rendered.instructions];
182
+ // `{identity}` is the payload: a template without it would inject a note
183
+ // that never says who the user is, so it falls back to the built-in order.
184
+ const template = config.notes.identity.template;
185
+ const text = template === "" || !template.includes("{identity}")
186
+ ? parts.filter((part) => part !== "").join("\n\n")
187
+ : renderTemplate(template, {
188
+ identity: rendered.identity,
189
+ instructions: rendered.instructions,
190
+ }).trim();
158
191
  return text === "" ? [] : [{ name: QA_IDENTITY_NOTE, text }];
159
192
  }
160
193
  /** What the deployment expects around the sources the surface collects. */
@@ -162,11 +195,20 @@ export class QaPromptNotes {
162
195
  const sources = config.sources;
163
196
  if (!sources.enabled || !this.options.isQaSession(rootSessionId))
164
197
  return [];
198
+ if (!config.notes.sources.enabled)
199
+ return [];
165
200
  const lines = [
166
- "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/Источники bibliography of your own.",
201
+ renderTemplate(config.notes.sources.template === ""
202
+ ? QA_SOURCES_NOTE_TEMPLATE
203
+ : config.notes.sources.template, { reportTool: QA_REPORT_SOURCES_TOOL }),
167
204
  ];
168
205
  if (sources.subagents.enableReportToolFallback) {
169
- lines.push(`A delegated run whose provider cannot expose tool events must call ${QA_REPORT_SOURCES_TOOL} before finishing.`);
206
+ const fallback = config.notes.sources.fallbackTemplate;
207
+ // `{reportTool}` is what makes the fallback actionable; without it the
208
+ // built-in sentence is the safer carrier.
209
+ lines.push(renderTemplate(fallback === "" || !fallback.includes("{reportTool}")
210
+ ? QA_SOURCES_FALLBACK_TEMPLATE
211
+ : fallback, { reportTool: QA_REPORT_SOURCES_TOOL }));
170
212
  }
171
213
  return [{ name: QA_SOURCES_NOTE, text: lines.join("\n") }];
172
214
  }
@@ -179,10 +221,65 @@ export class QaPromptNotes {
179
221
  delegationNotes(rootSessionId) {
180
222
  if (!this.options.isQaSession(rootSessionId))
181
223
  return [];
224
+ if (!this.options.config().notes.delegation.enabled)
225
+ return [];
226
+ const template = this.options.config().notes.delegation.template;
182
227
  return [
183
228
  {
184
229
  name: QA_DELEGATION_NOTE,
185
- text: "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 («Сверка отчётов», \"Log triage\"). The QA surface shows that description as the subagent's display name in the operator's panel and completion notices.",
230
+ text: template === ""
231
+ ? QA_DELEGATION_NOTE_TEMPLATE
232
+ : renderTemplate(template, {}).trim(),
233
+ },
234
+ ];
235
+ }
236
+ /**
237
+ * Which reader an attached document belongs to.
238
+ *
239
+ * A chat user's `.docx` or `.pdf` arrives as a path into the attachment
240
+ * store, and the reader the model reaches for by habit answers `binary file`
241
+ * for it. That answer is a fact about the format, not about the file being
242
+ * missing, and a run that reads it as the second one searches the workspace
243
+ * for a document it was already handed. The note names the pipeline and both
244
+ * halves of the trap: the plain reader's refusal is expected, and the
245
+ * pipeline's own refusal is a report to make, not a reason to try a third
246
+ * reader.
247
+ */
248
+ documentsNotes(rootSessionId) {
249
+ if (!this.options.isQaSession(rootSessionId))
250
+ return [];
251
+ if (!this.options.config().notes.documents.enabled)
252
+ return [];
253
+ const template = this.options.config().notes.documents.template;
254
+ return [
255
+ {
256
+ name: QA_DOCUMENTS_NOTE,
257
+ text: template === ""
258
+ ? QA_DOCUMENTS_NOTE_TEMPLATE
259
+ : renderTemplate(template, {}).trim(),
260
+ },
261
+ ];
262
+ }
263
+ /**
264
+ * Where an answer comes from, in this deployment's terms.
265
+ *
266
+ * The memory plugin's own skill says the same thing in its own words, but a
267
+ * persona may be the entire system prompt and a skill is read only once the
268
+ * model decides to reach for it: the rule that outlives both is the one
269
+ * delivered as a note, ahead of the first tool call that would break it.
270
+ */
271
+ sourcePriorityNotes(rootSessionId) {
272
+ if (!this.options.isQaSession(rootSessionId))
273
+ return [];
274
+ if (!this.options.config().notes.sourcePriority.enabled)
275
+ return [];
276
+ const template = this.options.config().notes.sourcePriority.template;
277
+ return [
278
+ {
279
+ name: QA_SOURCE_PRIORITY_NOTE,
280
+ text: template === ""
281
+ ? QA_SOURCE_PRIORITY_NOTE_TEMPLATE
282
+ : renderTemplate(template, {}).trim(),
186
283
  },
187
284
  ];
188
285
  }
@@ -1 +1 @@
1
- {"version":3,"file":"prompt-notes.js","sourceRoot":"","sources":["../src/prompt-notes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"prompt-notes.js","sourceRoot":"","sources":["../src/prompt-notes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { basename } from "node:path";
3
+ import { mediaTypeOf, QaSourcePreviewError, resolveAllowedFile, } from "./file-preview.js";
4
+ import { isConvertibleDocument } from "../shared/documents.js";
5
+ /** The produced PDF, base64-encoded for the wire. */
6
+ function toPreview(bytes, name) {
7
+ return {
8
+ kind: "pdf",
9
+ base64: bytes.toString("base64"),
10
+ mime: "application/pdf",
11
+ name,
12
+ bytes: bytes.byteLength,
13
+ };
14
+ }
15
+ /**
16
+ * Render one Word document as a PDF for the files panel.
17
+ *
18
+ * The conversion is the document pipeline's own — the same runtime, providers
19
+ * and limits the `document_*` tools use — reached through the face that plugin
20
+ * publishes for its Host siblings; a deployment without the pipeline installed
21
+ * refuses with `unsupported` rather than growing a second converter here. The
22
+ * input path passes the same containment check the panel's other reads use, so
23
+ * a preview cannot read what a listing could not reach.
24
+ *
25
+ * The resolved root the check opened is handed to the pipeline as well (§26.2):
26
+ * an uploaded Word file lives in the attachment store, and a pipeline that is
27
+ * not told about that root refuses the file this check just accepted.
28
+ */
29
+ export async function previewConvertibleDocument({ documents, sessionId, maxBytes, ...file }) {
30
+ const face = documents();
31
+ if (face === undefined)
32
+ throw new QaSourcePreviewError("unsupported");
33
+ const resolved = await resolveAllowedFile(file);
34
+ if (!isConvertibleDocument(mediaTypeOf(resolved.canonical))) {
35
+ throw new QaSourcePreviewError("unsupported");
36
+ }
37
+ const extraInputRoots = file.attachmentRoot === undefined ? [] : [file.attachmentRoot];
38
+ let rendered;
39
+ try {
40
+ const converted = await face.convert({ file: resolved.canonical, targetFormat: "pdf" }, {
41
+ workspaceRoot: file.cwd,
42
+ sessionId,
43
+ ...(extraInputRoots.length === 0 ? {} : { extraInputRoots }),
44
+ });
45
+ const pdf = converted.files.find((output) => output.format === "pdf" && output.status === "created");
46
+ if (pdf === undefined)
47
+ throw new QaSourcePreviewError("unsupported");
48
+ rendered = pdf.path;
49
+ }
50
+ catch (error) {
51
+ throw new QaSourcePreviewError(error instanceof QaSourcePreviewError ? error.reason : "unsupported");
52
+ }
53
+ const bytes = await readFile(rendered).catch(() => undefined);
54
+ if (bytes === undefined)
55
+ throw new QaSourcePreviewError("unavailable");
56
+ if (bytes.byteLength > maxBytes)
57
+ throw new QaSourcePreviewError("unsupported");
58
+ return toPreview(bytes, basename(resolved.canonical));
59
+ }
60
+ //# sourceMappingURL=document-preview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document-preview.js","sourceRoot":"","sources":["../../src/provenance/document-preview.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAErC,OAAO,EACL,WAAW,EACX,oBAAoB,EACpB,kBAAkB,GAEnB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAa/D,qDAAqD;AACrD,SAAS,SAAS,CAAC,KAAa,EAAE,IAAY;IAC5C,OAAO;QACL,IAAI,EAAE,KAAK;QACX,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAChC,IAAI,EAAE,iBAAiB;QACvB,IAAI;QACJ,KAAK,EAAE,KAAK,CAAC,UAAU;KACxB,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAC,EAC/C,SAAS,EACT,SAAS,EACT,QAAQ,EACR,GAAG,IAAI,EACkB;IACzB,MAAM,IAAI,GAAG,SAAS,EAAE,CAAC;IACzB,IAAI,IAAI,KAAK,SAAS;QAAE,MAAM,IAAI,oBAAoB,CAAC,aAAa,CAAC,CAAC;IACtE,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAChD,IAAI,CAAC,qBAAqB,CAAC,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;QAC5D,MAAM,IAAI,oBAAoB,CAAC,aAAa,CAAC,CAAC;IAChD,CAAC;IACD,MAAM,eAAe,GACnB,IAAI,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACjE,IAAI,QAAgB,CAAC;IACrB,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,OAAO,CAClC,EAAE,IAAI,EAAE,QAAQ,CAAC,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,EACjD;YACE,aAAa,EAAE,IAAI,CAAC,GAAG;YACvB,SAAS;YACT,GAAG,CAAC,eAAe,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC;SAC7D,CACF,CAAC;QACF,MAAM,GAAG,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAC9B,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,KAAK,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,CACnE,CAAC;QACF,IAAI,GAAG,KAAK,SAAS;YAAE,MAAM,IAAI,oBAAoB,CAAC,aAAa,CAAC,CAAC;QACrE,QAAQ,GAAG,GAAG,CAAC,IAAI,CAAC;IACtB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,oBAAoB,CAC5B,KAAK,YAAY,oBAAoB,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,CACrE,CAAC;IACJ,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAC9D,IAAI,KAAK,KAAK,SAAS;QAAE,MAAM,IAAI,oBAAoB,CAAC,aAAa,CAAC,CAAC;IACvE,IAAI,KAAK,CAAC,UAAU,GAAG,QAAQ;QAC7B,MAAM,IAAI,oBAAoB,CAAC,aAAa,CAAC,CAAC;IAChD,OAAO,SAAS,CAAC,KAAK,EAAE,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;AACxD,CAAC"}
@@ -1,4 +1,4 @@
1
- import { open, realpath, stat } from "node:fs/promises";
1
+ import { open, realpath, stat, lstat, readdir } from "node:fs/promises";
2
2
  import { isAbsolute, relative, resolve, sep } from "node:path";
3
3
  import { canonicalizeWorkspacePath } from "./normalize.js";
4
4
  /** Host refusal whose wire message carries the coarse reason marker. */
@@ -28,20 +28,16 @@ function insideRoot(root, file) {
28
28
  !isAbsolute(fromRoot));
29
29
  }
30
30
  /**
31
- * Read one evidence file from the roots the QA read policy opens.
31
+ * Resolve one requested file and check it against the readable roots.
32
32
  *
33
- * The bundle canonicalized each recorded path against the chat cwd, while the
34
- * browser may hold either spelling of the same file: it projects sources with
35
- * the *configured* session cwd, which is null whenever the chat is pinned by
36
- * workspaceId or by an account directory. So the request is canonicalized the
37
- * same way before it is matched, or a file inside the chat's own workspace is
38
- * refused as foreign evidence.
33
+ * The roots mirror the per-user execution guard — the chat's own cwd plus the
34
+ * deployment's shared read-only directories and the attachment store — so a
35
+ * file the model was explicitly allowed to read stays readable in the panel,
36
+ * while anything else is refused with the coarse `outside-roots` reason
37
+ * instead of leaking whether it exists.
39
38
  */
40
- export async function readSourceFilePreview({ sourcePath, cwd, isEvidence, sharedReadOnlyRoots = [], attachmentRoot, maxBytes, maxMarkdownRenderBytes, }) {
41
- const canonicalPath = canonicalizeWorkspacePath(sourcePath, cwd);
42
- if (!isEvidence(canonicalPath)) {
43
- throw new QaSourcePreviewError("not-evidence");
44
- }
39
+ export async function resolveAllowedFile({ filePath, cwd, sharedReadOnlyRoots = [], attachmentRoot, }) {
40
+ const canonicalPath = canonicalizeWorkspacePath(filePath, cwd);
45
41
  const chatRoot = await canonicalRoot(cwd);
46
42
  if (chatRoot === undefined)
47
43
  throw new QaSourcePreviewError("unavailable");
@@ -62,25 +58,201 @@ export async function readSourceFilePreview({ sourcePath, cwd, isEvidence, share
62
58
  if (info === undefined || !info.isFile()) {
63
59
  throw new QaSourcePreviewError("unavailable");
64
60
  }
65
- const limit = Math.min(maxBytes, info.size);
61
+ return { canonicalPath, canonical, size: info.size };
62
+ }
63
+ /**
64
+ * Read one evidence file from the roots the QA read policy opens.
65
+ *
66
+ * The bundle canonicalized each recorded path against the chat cwd, while the
67
+ * browser may hold either spelling of the same file: it projects sources with
68
+ * the *configured* session cwd, which is null whenever the chat is pinned by
69
+ * workspaceId or by an account directory. So the request is canonicalized the
70
+ * same way before it is matched, or a file inside the chat's own workspace is
71
+ * refused as foreign evidence.
72
+ */
73
+ export async function readSourceFilePreview({ sourcePath, cwd, isEvidence, sharedReadOnlyRoots = [], attachmentRoot, maxBytes, maxMarkdownRenderBytes, }) {
74
+ const canonicalPath = canonicalizeWorkspacePath(sourcePath, cwd);
75
+ if (!isEvidence(canonicalPath)) {
76
+ throw new QaSourcePreviewError("not-evidence");
77
+ }
78
+ const file = await resolveAllowedFile({
79
+ filePath: canonicalPath,
80
+ cwd,
81
+ sharedReadOnlyRoots,
82
+ ...(attachmentRoot === undefined ? {} : { attachmentRoot }),
83
+ });
84
+ const limit = Math.min(maxBytes, file.size);
66
85
  const buffer = Buffer.alloc(limit);
67
- const handle = await open(canonical, "r").catch(() => undefined);
86
+ const handle = await open(file.canonical, "r").catch(() => undefined);
68
87
  if (handle === undefined)
69
88
  throw new QaSourcePreviewError("unavailable");
70
89
  try {
71
90
  const { bytesRead } = await handle.read(buffer, 0, limit, 0);
72
- const markdown = /\.(?:md|markdown)$/iu.test(canonical);
91
+ const markdown = /\.(?:md|markdown)$/iu.test(file.canonical);
73
92
  return {
74
93
  path: canonicalPath,
75
94
  content: buffer.subarray(0, bytesRead).toString("utf8"),
76
- size: info.size,
77
- truncated: info.size > bytesRead,
95
+ size: file.size,
96
+ truncated: file.size > bytesRead,
78
97
  markdown,
79
- renderableMarkdown: markdown && info.size <= maxMarkdownRenderBytes,
98
+ renderableMarkdown: markdown && file.size <= maxMarkdownRenderBytes,
80
99
  };
81
100
  }
82
101
  finally {
83
102
  await handle.close();
84
103
  }
85
104
  }
105
+ /** Extensions the preview advertises so the panel can pick a renderer. */
106
+ const MIME_BY_EXTENSION = {
107
+ bmp: "image/bmp",
108
+ csv: "text/csv",
109
+ gif: "image/gif",
110
+ html: "text/html",
111
+ jpeg: "image/jpeg",
112
+ jpg: "image/jpeg",
113
+ json: "application/json",
114
+ md: "text/markdown",
115
+ markdown: "text/markdown",
116
+ pdf: "application/pdf",
117
+ docx: "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
118
+ png: "image/png",
119
+ svg: "image/svg+xml",
120
+ txt: "text/plain",
121
+ webp: "image/webp",
122
+ xml: "text/xml",
123
+ yaml: "text/yaml",
124
+ yml: "text/yaml",
125
+ };
126
+ /** The advertised type of one file: by extension, else opaque bytes. */
127
+ export function mediaTypeOf(path) {
128
+ const extension = /\.([a-z\d]+)$/iu.exec(path)?.[1]?.toLowerCase();
129
+ return ((extension === undefined ? undefined : MIME_BY_EXTENSION[extension]) ??
130
+ "application/octet-stream");
131
+ }
132
+ /** Whether a byte window decodes as UTF-8 text rather than binary. */
133
+ function decodesAsText(buffer) {
134
+ if (buffer.includes(0))
135
+ return false;
136
+ try {
137
+ new TextDecoder("utf-8", { fatal: true }).decode(buffer);
138
+ return true;
139
+ }
140
+ catch {
141
+ return false;
142
+ }
143
+ }
144
+ /**
145
+ * List one directory of the chat's own workspace.
146
+ *
147
+ * Browsing is deliberately narrower than previewing: the panel walks the tree
148
+ * the chat works in, never the deployment's shared read-only roots, so the
149
+ * visitor cannot enumerate the deployment from the rail. The request is
150
+ * confined with the same realpath-then-contain check the preview uses, which
151
+ * is what makes `..` and symlinked directories harmless.
152
+ * Symlinked children are omitted rather than followed: a link inside the
153
+ * workspace may point anywhere, and a tree that silently leaves the chat's
154
+ * directory is worse than one that hides a link.
155
+ */
156
+ export async function listWorkspaceDirectory({ dirPath, cwd, maxEntries, }) {
157
+ const requested = canonicalizeWorkspacePath(dirPath, cwd);
158
+ const chatRoot = await canonicalRoot(cwd);
159
+ if (chatRoot === undefined)
160
+ throw new QaSourcePreviewError("unavailable");
161
+ const candidate = requested === "" || requested === "."
162
+ ? chatRoot
163
+ : isAbsolute(requested)
164
+ ? requested
165
+ : resolve(chatRoot, requested);
166
+ const canonical = await realpath(candidate).catch(() => undefined);
167
+ if (canonical === undefined)
168
+ throw new QaSourcePreviewError("unavailable");
169
+ if (canonical !== chatRoot && !insideRoot(chatRoot, canonical)) {
170
+ throw new QaSourcePreviewError("outside-roots");
171
+ }
172
+ const info = await stat(canonical).catch(() => undefined);
173
+ if (info === undefined || !info.isDirectory()) {
174
+ throw new QaSourcePreviewError("unavailable");
175
+ }
176
+ const dirents = await readdir(canonical, { withFileTypes: true }).catch(() => undefined);
177
+ if (dirents === undefined)
178
+ throw new QaSourcePreviewError("unavailable");
179
+ const entries = [];
180
+ let truncated = false;
181
+ const sorted = [...dirents].sort((left, right) => left.name < right.name ? -1 : left.name > right.name ? 1 : 0);
182
+ for (const dirent of sorted) {
183
+ if (dirent.isSymbolicLink())
184
+ continue;
185
+ const type = dirent.isDirectory()
186
+ ? "directory"
187
+ : dirent.isFile()
188
+ ? "file"
189
+ : undefined;
190
+ if (type === undefined)
191
+ continue;
192
+ if (entries.length >= maxEntries) {
193
+ truncated = true;
194
+ break;
195
+ }
196
+ const size = type === "file"
197
+ ? ((await lstat(resolve(canonical, dirent.name)).catch(() => undefined))
198
+ ?.size ?? null)
199
+ : null;
200
+ entries.push({ name: dirent.name, type, size });
201
+ }
202
+ entries.sort((left, right) => {
203
+ if (left.type !== right.type)
204
+ return left.type === "directory" ? -1 : 1;
205
+ return left.name < right.name ? -1 : left.name > right.name ? 1 : 0;
206
+ });
207
+ return { path: requested === "." ? "" : requested, entries, truncated };
208
+ }
209
+ /**
210
+ * Read one file of the chat's workspace for the panel: text when it decodes as
211
+ * UTF-8, base64 bytes when it does not, so a document the agent produced can be
212
+ * offered for download while a note previews inline.
213
+ *
214
+ * Unlike the source preview this is not bound to recorded evidence — the panel
215
+ * browses what the chat's workspace holds — but it is bound to the same roots
216
+ * the model itself may read.
217
+ */
218
+ export async function readWorkspaceFile({ filePath, cwd, sharedReadOnlyRoots = [], attachmentRoot, maxBytes, maxMarkdownRenderBytes, }) {
219
+ const file = await resolveAllowedFile({
220
+ filePath,
221
+ cwd,
222
+ sharedReadOnlyRoots,
223
+ ...(attachmentRoot === undefined ? {} : { attachmentRoot }),
224
+ });
225
+ const limit = Math.min(maxBytes, file.size);
226
+ const buffer = Buffer.alloc(limit);
227
+ const handle = await open(file.canonical, "r").catch(() => undefined);
228
+ if (handle === undefined)
229
+ throw new QaSourcePreviewError("unavailable");
230
+ let read;
231
+ try {
232
+ read = await handle.read(buffer, 0, limit, 0);
233
+ }
234
+ finally {
235
+ await handle.close();
236
+ }
237
+ const bytesRead = read.bytesRead;
238
+ const window = buffer.subarray(0, bytesRead);
239
+ const markdown = /\.(?:md|markdown)$/iu.test(file.canonical);
240
+ const truncated = file.size > bytesRead;
241
+ const base = {
242
+ path: file.canonicalPath,
243
+ size: file.size,
244
+ truncated,
245
+ markdown,
246
+ renderableMarkdown: markdown && file.size <= maxMarkdownRenderBytes,
247
+ mime: mediaTypeOf(file.canonical),
248
+ };
249
+ // Text and bytes are told apart by the window itself, not by the size: a
250
+ // truncated text file still previews as its head, while a binary file stays
251
+ // bytes whatever the window holds — decoding it as text would hand the panel
252
+ // mojibake it cannot tell from content.
253
+ if (!decodesAsText(window)) {
254
+ return { ...base, base64: window.toString("base64") };
255
+ }
256
+ return { ...base, text: window.toString("utf8") };
257
+ }
86
258
  //# sourceMappingURL=file-preview.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"file-preview.js","sourceRoot":"","sources":["../../src/provenance/file-preview.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"file-preview.js","sourceRoot":"","sources":["../../src/provenance/file-preview.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAO/D,OAAO,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAe3D,wEAAwE;AACxE,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IACxB,MAAM;IAA3B,YAAqB,MAA6B;QAChD,KAAK,CAAC,gCAAgC,CAAC,CAAC;sBADrB,MAAM;QAEzB,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF;AA+BD,iFAAiF;AACjF,KAAK,UAAU,aAAa,CAAC,IAAY;IACvC,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,qEAAqE;AACrE,SAAS,UAAU,CAAC,IAAY,EAAE,IAAY;IAC5C,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACtC,OAAO,CACL,QAAQ,KAAK,EAAE;QACf,QAAQ,KAAK,IAAI;QACjB,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,GAAG,EAAE,CAAC;QAChC,CAAC,UAAU,CAAC,QAAQ,CAAC,CACtB,CAAC;AACJ,CAAC;AAoBD;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,EACvC,QAAQ,EACR,GAAG,EACH,mBAAmB,GAAG,EAAE,EACxB,cAAc,GACO;IACrB,MAAM,aAAa,GAAG,yBAAyB,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAC/D,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,GAAG,CAAC,CAAC;IAC1C,IAAI,QAAQ,KAAK,SAAS;QAAE,MAAM,IAAI,oBAAoB,CAAC,aAAa,CAAC,CAAC;IAC1E,MAAM,SAAS,GAAG,UAAU,CAAC,aAAa,CAAC;QACzC,CAAC,CAAC,aAAa;QACf,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IACrC,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IACnE,IAAI,SAAS,KAAK,SAAS;QAAE,MAAM,IAAI,oBAAoB,CAAC,aAAa,CAAC,CAAC;IAE3E,MAAM,QAAQ,GAAG,CAAC,QAAQ,EAAE,GAAG,mBAAmB,CAAC,CAAC;IACpD,IAAI,cAAc,KAAK,SAAS;QAAE,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAChE,MAAM,OAAO,GAAG,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,MAAM,CACrE,CAAC,IAAI,EAAkB,EAAE,CAAC,IAAI,KAAK,SAAS,CAC7C,CAAC;IACF,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC;QACzD,MAAM,IAAI,oBAAoB,CAAC,eAAe,CAAC,CAAC;IAClD,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAC1D,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;QACzC,MAAM,IAAI,oBAAoB,CAAC,aAAa,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;AACvD,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,EAC1C,UAAU,EACV,GAAG,EACH,UAAU,EACV,mBAAmB,GAAG,EAAE,EACxB,cAAc,EACd,QAAQ,EACR,sBAAsB,GACK;IAC3B,MAAM,aAAa,GAAG,yBAAyB,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;IACjE,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,oBAAoB,CAAC,cAAc,CAAC,CAAC;IACjD,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,kBAAkB,CAAC;QACpC,QAAQ,EAAE,aAAa;QACvB,GAAG;QACH,mBAAmB;QACnB,GAAG,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC;KAC5D,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACnC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IACtE,IAAI,MAAM,KAAK,SAAS;QAAE,MAAM,IAAI,oBAAoB,CAAC,aAAa,CAAC,CAAC;IACxE,IAAI,CAAC;QACH,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QAC7D,MAAM,QAAQ,GAAG,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC7D,OAAO;YACL,IAAI,EAAE,aAAa;YACnB,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;YACvD,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,SAAS,EAAE,IAAI,CAAC,IAAI,GAAG,SAAS;YAChC,QAAQ;YACR,kBAAkB,EAAE,QAAQ,IAAI,IAAI,CAAC,IAAI,IAAI,sBAAsB;SACpE,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;AACH,CAAC;AAWD,0EAA0E;AAC1E,MAAM,iBAAiB,GAAqC;IAC1D,GAAG,EAAE,WAAW;IAChB,GAAG,EAAE,UAAU;IACf,GAAG,EAAE,WAAW;IAChB,IAAI,EAAE,WAAW;IACjB,IAAI,EAAE,YAAY;IAClB,GAAG,EAAE,YAAY;IACjB,IAAI,EAAE,kBAAkB;IACxB,EAAE,EAAE,eAAe;IACnB,QAAQ,EAAE,eAAe;IACzB,GAAG,EAAE,iBAAiB;IACtB,IAAI,EAAE,yEAAyE;IAC/E,GAAG,EAAE,WAAW;IAChB,GAAG,EAAE,eAAe;IACpB,GAAG,EAAE,YAAY;IACjB,IAAI,EAAE,YAAY;IAClB,GAAG,EAAE,UAAU;IACf,IAAI,EAAE,WAAW;IACjB,GAAG,EAAE,WAAW;CACjB,CAAC;AAEF,wEAAwE;AACxE,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,MAAM,SAAS,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC;IACnE,OAAO,CACL,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;QACpE,0BAA0B,CAC3B,CAAC;AACJ,CAAC;AAED,sEAAsE;AACtE,SAAS,aAAa,CAAC,MAAc;IACnC,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACrC,IAAI,CAAC;QACH,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACzD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,EAC3C,OAAO,EACP,GAAG,EACH,UAAU,GACa;IACvB,MAAM,SAAS,GAAG,yBAAyB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,GAAG,CAAC,CAAC;IAC1C,IAAI,QAAQ,KAAK,SAAS;QAAE,MAAM,IAAI,oBAAoB,CAAC,aAAa,CAAC,CAAC;IAC1E,MAAM,SAAS,GACb,SAAS,KAAK,EAAE,IAAI,SAAS,KAAK,GAAG;QACnC,CAAC,CAAC,QAAQ;QACV,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC;YACrB,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IACrC,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IACnE,IAAI,SAAS,KAAK,SAAS;QAAE,MAAM,IAAI,oBAAoB,CAAC,aAAa,CAAC,CAAC;IAC3E,IAAI,SAAS,KAAK,QAAQ,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,CAAC;QAC/D,MAAM,IAAI,oBAAoB,CAAC,eAAe,CAAC,CAAC;IAClD,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAC1D,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;QAC9C,MAAM,IAAI,oBAAoB,CAAC,aAAa,CAAC,CAAC;IAChD,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CACrE,GAAG,EAAE,CAAC,SAAS,CAChB,CAAC;IACF,IAAI,OAAO,KAAK,SAAS;QAAE,MAAM,IAAI,oBAAoB,CAAC,aAAa,CAAC,CAAC;IAEzE,MAAM,OAAO,GAAuB,EAAE,CAAC;IACvC,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,MAAM,MAAM,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAC/C,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAC7D,CAAC;IACF,KAAK,MAAM,MAAM,IAAI,MAAM,EAAE,CAAC;QAC5B,IAAI,MAAM,CAAC,cAAc,EAAE;YAAE,SAAS;QACtC,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,EAAE;YAC/B,CAAC,CAAC,WAAW;YACb,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE;gBACf,CAAC,CAAC,MAAM;gBACR,CAAC,CAAC,SAAS,CAAC;QAChB,IAAI,IAAI,KAAK,SAAS;YAAE,SAAS;QACjC,IAAI,OAAO,CAAC,MAAM,IAAI,UAAU,EAAE,CAAC;YACjC,SAAS,GAAG,IAAI,CAAC;YACjB,MAAM;QACR,CAAC;QACD,MAAM,IAAI,GACR,IAAI,KAAK,MAAM;YACb,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;gBACpE,EAAE,IAAI,IAAI,IAAI,CAAC;YACnB,CAAC,CAAC,IAAI,CAAC;QACX,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QAC3B,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACxE,OAAO,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IACH,OAAO,EAAE,IAAI,EAAE,SAAS,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;AAC1E,CAAC;AAQD;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,EACtC,QAAQ,EACR,GAAG,EACH,mBAAmB,GAAG,EAAE,EACxB,cAAc,EACd,QAAQ,EACR,sBAAsB,GACC;IACvB,MAAM,IAAI,GAAG,MAAM,kBAAkB,CAAC;QACpC,QAAQ;QACR,GAAG;QACH,mBAAmB;QACnB,GAAG,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC;KAC5D,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACnC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IACtE,IAAI,MAAM,KAAK,SAAS;QAAE,MAAM,IAAI,oBAAoB,CAAC,aAAa,CAAC,CAAC;IACxE,IAAI,IAA6C,CAAC;IAClD,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IAChD,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;IACD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;IACjC,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC7D,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC;IACxC,MAAM,IAAI,GAAG;QACX,IAAI,EAAE,IAAI,CAAC,aAAa;QACxB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,SAAS;QACT,QAAQ;QACR,kBAAkB,EAAE,QAAQ,IAAI,IAAI,CAAC,IAAI,IAAI,sBAAsB;QACnE,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC;KAClC,CAAC;IACF,yEAAyE;IACzE,4EAA4E;IAC5E,6EAA6E;IAC7E,wCAAwC;IACxC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;IACxD,CAAC;IACD,OAAO,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;AACpD,CAAC"}
@@ -1,4 +1,6 @@
1
1
  import { defineTool } from "@deepseek-ai/dsh-tools";
2
+ import { createFileDeleteTool } from "./file-delete.js";
3
+ import { createDocsReadTool, createDocsSearchTool } from "./docs-tools.js";
2
4
  /**
3
5
  * Deterministic catalog identity. The durable activation marker is derived from
4
6
  * the session log rather than stored, so this version is not compared against a
@@ -7,7 +9,7 @@ import { defineTool } from "@deepseek-ai/dsh-tools";
7
9
  *
8
10
  * Bump it whenever the catalog's tool set or their schemas change.
9
11
  */
10
- export const QA_TOOL_CATALOG_VERSION = "1";
12
+ export const QA_TOOL_CATALOG_VERSION = "3";
11
13
  function createSelfcheckTool(deps) {
12
14
  return defineTool({
13
15
  name: "qa_tools_selfcheck",
@@ -79,6 +81,21 @@ export function createQaToolCatalog(deps) {
79
81
  group: "diagnostics",
80
82
  tags: ["activation", "diagnostics"],
81
83
  },
84
+ {
85
+ definition: createDocsSearchTool(),
86
+ group: "documentation",
87
+ tags: ["docs", "search"],
88
+ },
89
+ {
90
+ definition: createDocsReadTool(),
91
+ group: "documentation",
92
+ tags: ["docs", "read"],
93
+ },
94
+ {
95
+ definition: createFileDeleteTool(),
96
+ group: "workspace",
97
+ tags: ["files", "destructive"],
98
+ },
82
99
  ];
83
100
  }
84
101
  /** QA tool names, in catalog order; the admission gate treats them as dynamic. */
@@ -1 +1 @@
1
- {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/qa-tools/catalog.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/qa-tools/catalog.ts"],"names":[],"mappings":"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"}