@yadsh/dsh-qa-surface 0.11.0 → 0.11.1

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.
package/README.md CHANGED
@@ -269,6 +269,10 @@ config:
269
269
  # Presets whose sessions may unlock the catalog. Empty leaves the gate open:
270
270
  # only do that when this Host serves one agent composition.
271
271
  activationPresets: []
272
+ # Where the documentation readers look. Empty reads `docs/` inside each
273
+ # chat's own workspace; name the corpus when it is published once, outside
274
+ # every per-user workspace (see "Dynamic QA tools" below).
275
+ docsRoot: ""
272
276
  ```
273
277
 
274
278
  `workspaceId` is recommended for a deterministic assistant. Without it, DSH
@@ -339,6 +343,17 @@ name. `tools.dynamicActivation: false` restores the always-on behaviour and
339
343
  attaches the catalog to every managed agent at creation — useful for a
340
344
  deployment that would rather debug the tool surface than the trigger.
341
345
 
346
+ `docs_search` and `docs_read` read the `docs/` directory of the calling chat's
347
+ own workspace by default. A deployment that publishes the corpus **once** — for
348
+ example `/workspace/docs` next to a per-user workspace layout — sets
349
+ `tools.docsRoot` to that absolute path, because with
350
+ `accounts.perUserWorkspace: true` the chat's workspace is a per-account
351
+ directory that holds no documentation: the readers would answer "there is no
352
+ documentation tree here" in every chat, while the `glob`/`grep`/`read` tools
353
+ reached the corpus by absolute path all along. The root is held to the same
354
+ rules either way: an absolute path, a real directory, no symlinks, and every
355
+ path is canonicalized and refused if it leaves the tree.
356
+
342
357
  These tools are not `lockdown.toolPolicy.allow` entries, and cannot be: that
343
358
  list is validated against the mounted catalog at attestation time, and a tool
344
359
  that only appears later would fail the check. The QA execution guard authorizes
@@ -625,13 +640,13 @@ lockdown:
625
640
 
626
641
  slashCommands:
627
642
  skills:
628
- mode: allow-list # deny-all | allow-list | all
643
+ mode: allow-list # deny-all | allow-list | all
629
644
  allow:
630
645
  - generate-tkp
631
646
  - generate-tz
632
647
  - gap-analysis
633
648
  commands:
634
- mode: deny-all # deny-all | allow-list | all
649
+ mode: deny-all # deny-all | allow-list | all
635
650
  allow: []
636
651
  palette:
637
652
  enabled: true
@@ -699,42 +714,41 @@ through the `qaSurfacePanels` service; the React body is registered separately
699
714
  in the keyed `qa.surface.panel` slot under the same implementation id:
700
715
 
701
716
  ```ts
702
- import type { Context } from "@deepseek-ai/cordis"
703
- import type { PropsRuntime } from "@deepseek-ai/dsh-client-ui-slots"
704
- import type {} from "@deepseek-ai/dsh-client-ui-renderer/client"
705
- import { QA_SURFACE_PANEL_SLOT } from "@yadsh/dsh-qa-surface/client/panels"
717
+ import type { Context } from "@deepseek-ai/cordis";
718
+ import type { PropsRuntime } from "@deepseek-ai/dsh-client-ui-slots";
719
+ import type {} from "@deepseek-ai/dsh-client-ui-renderer/client";
720
+ import { QA_SURFACE_PANEL_SLOT } from "@yadsh/dsh-qa-surface/client/panels";
706
721
 
707
- const id = "@example/dsh-qa-browser"
722
+ const id = "@example/dsh-qa-browser";
708
723
 
709
724
  function BrowserPanel(props: PropsRuntime<typeof QA_SURFACE_PANEL_SLOT>) {
710
725
  // panelId, panelKind, sessionId, visible, presentation, params,
711
726
  // actions and a registration-lifetime AbortSignal arrive in props.
712
- return null
727
+ return null;
713
728
  }
714
729
 
715
- export const inject = ["slots", "qaSurfacePanels"]
730
+ export const inject = ["slots", "qaSurfacePanels"];
716
731
 
717
732
  export function apply(ctx: Context) {
718
- ctx.effect(() => ctx.qaSurfacePanels.register({
719
- id,
720
- kind: "browser",
721
- title: () => "Browser",
722
- icon: "browser",
723
- order: 100,
724
- keepMounted: true,
725
- }))
733
+ ctx.effect(() =>
734
+ ctx.qaSurfacePanels.register({
735
+ id,
736
+ kind: "browser",
737
+ title: () => "Browser",
738
+ icon: "browser",
739
+ order: 100,
740
+ keepMounted: true,
741
+ }),
742
+ );
726
743
 
727
744
  ctx.slots.inject(QA_SURFACE_PANEL_SLOT, () =>
728
- ctx.slots.register(
729
- { name: QA_SURFACE_PANEL_SLOT, key: id },
730
- BrowserPanel,
731
- ),
732
- )
745
+ ctx.slots.register({ name: QA_SURFACE_PANEL_SLOT, key: id }, BrowserPanel),
746
+ );
733
747
 
734
748
  ctx.qaSurfacePanels.open("browser", {
735
749
  reason: "extension",
736
750
  focus: false,
737
- })
751
+ });
738
752
  }
739
753
  ```
740
754
 
@@ -756,17 +770,19 @@ authorize every Host call server-side and must not persist credentials in the
756
770
  browser.
757
771
 
758
772
  ```ts
759
- import type { Context } from "@deepseek-ai/cordis"
773
+ import type { Context } from "@deepseek-ai/cordis";
760
774
 
761
- export const inject = ["qaUserSettingsSections"]
775
+ export const inject = ["qaUserSettingsSections"];
762
776
 
763
777
  export function apply(ctx: Context) {
764
- ctx.effect(() => ctx.qaUserSettingsSections.register({
765
- id: "integrations",
766
- title: "Интеграции",
767
- order: 40,
768
- component: IntegrationsPage,
769
- }))
778
+ ctx.effect(() =>
779
+ ctx.qaUserSettingsSections.register({
780
+ id: "integrations",
781
+ title: "Интеграции",
782
+ order: 40,
783
+ component: IntegrationsPage,
784
+ }),
785
+ );
770
786
  }
771
787
  ```
772
788
 
@@ -783,9 +799,9 @@ the credential is transport authentication only: never persist it, log it, or
783
799
  put it in a URL, a tool argument or any model-visible value.
784
800
 
785
801
  ```ts
786
- import type { Context } from "@deepseek-ai/cordis"
802
+ import type { Context } from "@deepseek-ai/cordis";
787
803
 
788
- export const inject = ["qaUserSession", "slots"]
804
+ export const inject = ["qaUserSession", "slots"];
789
805
 
790
806
  export function apply(ctx: Context) {
791
807
  ctx.effect(() =>
@@ -793,7 +809,9 @@ export function apply(ctx: Context) {
793
809
  ctx.slots.register(
794
810
  { name: "settings.plugin.item", key: "my-namespace" },
795
811
  MyCard,
796
- )))
812
+ ),
813
+ ),
814
+ );
797
815
  }
798
816
  ```
799
817
 
@@ -957,12 +975,12 @@ metadata:
957
975
  qa-surface:
958
976
  version: 1
959
977
  audience:
960
- type: subroles # or: type: common
978
+ type: subroles # or: type: common
961
979
  include: [analyst, presales]
962
980
  tools:
963
981
  requires: [browser_open, browser_click]
964
982
  grant:
965
- lifecycle: session # the only lifecycle in v1
983
+ lifecycle: session # the only lifecycle in v1
966
984
  requireAll: true
967
985
  ---
968
986
  ```
@@ -988,6 +1006,7 @@ declared audience next to the effective one with a
988
1006
  `Healthy`/`Degraded`/`Blocked` state. Every activation is recorded on the
989
1007
  session record with the requested, granted and denied tools, so a later review
990
1008
  can see what a conversation actually gained.
1009
+
991
1010
  ## Administrative console
992
1011
 
993
1012
  `/qa/admin` is the review and administration surface. It is part of the QA page
@@ -1045,13 +1064,13 @@ default**.
1045
1064
 
1046
1065
  ```yaml
1047
1066
  integration:
1048
- enabled: true # requires accounts.enabled: true
1049
- basePath: /qa/api # POST {basePath}/ask, GET {basePath}/session, GET {basePath}/health
1067
+ enabled: true # requires accounts.enabled: true
1068
+ basePath: /qa/api # POST {basePath}/ask, GET {basePath}/session, GET {basePath}/health
1050
1069
  tokenTtlDays: 90
1051
1070
  requestTimeoutMs: 90000
1052
1071
  maxConcurrent: 4
1053
1072
  requestsPerMinute: 60
1054
- maxAnswerCharacters: 4096 # the answer the ticket comment can hold
1073
+ maxAnswerCharacters: 4096 # the answer the ticket comment can hold
1055
1074
  ```
1056
1075
 
1057
1076
  The API needs accounts: a caller is an account, and the credential it presents
@@ -1121,19 +1140,23 @@ capability snapshot like any other QA chat.
1121
1140
  `session_id`, `context` as a JSON **string**) plus repeated `files` parts (at
1122
1141
  most five, 10 MiB each by default).
1123
1142
 
1124
- | Attachment | What the model receives |
1125
- | --- | --- |
1126
- | `image/png`, `image/jpeg`, `image/webp`, `image/gif` | the image itself |
1127
- | `text/plain`, `text/csv`, `text/markdown` | its text, under a heading with the file name |
1128
- | `application/pdf`, Word, Excel, PowerPoint | text extracted by the deployment's document pipeline |
1129
- | anything else | `415` — the fallback the bridge already implements |
1143
+ | Attachment | What the model receives |
1144
+ | ---------------------------------------------------- | ---------------------------------------------------- |
1145
+ | `image/png`, `image/jpeg`, `image/webp`, `image/gif` | the image itself |
1146
+ | `text/plain`, `text/csv`, `text/markdown` | its text, under a heading with the file name |
1147
+ | `application/pdf`, Word, Excel, PowerPoint | text extracted by the deployment's document pipeline |
1148
+ | anything else | `415` — the fallback the bridge already implements |
1130
1149
 
1131
1150
  A file the Host cannot read refuses the whole question with `415` rather than
1132
1151
  being skipped: an answer produced without the material it was asked about is
1133
1152
  worse than asking again without it. Documents need the `documents` plugin
1134
1153
  installed; without it PDF and Office attachments take the same `415` path, and
1135
- images and text keep working. Attachments are read, not stored: the bytes live
1136
- in a temporary directory for the length of one extraction, and the text is
1154
+ images and text keep working. An image the deployment itself refuses — one the
1155
+ selected model cannot see, or one past the Host's image limits — answers the
1156
+ same `415`, with the reason (`MODEL_DOES_NOT_SUPPORT_IMAGES`, `IMAGE_TOO_LARGE`,
1157
+ `IMAGE_TYPE_MISMATCH`, …) in the body and in the Host log. Attachments are read,
1158
+ not stored: the bytes live in a temporary directory for the length of one
1159
+ extraction, and the text is
1137
1160
  bounded (60 000 characters per file, 120 000 per question, truncated with a
1138
1161
  marker). Everything the bridge's own filter lets through is accepted; archives,
1139
1162
  executables and media are not.
@@ -1204,17 +1227,17 @@ curl -sS https://dsh.example.local/qa/api/health \
1204
1227
 
1205
1228
  ### Statuses
1206
1229
 
1207
- | Status | Meaning |
1208
- | --- | --- |
1209
- | 200 | Answered, or escalated with an empty `answer` |
1210
- | 400 | Malformed body (no `message`, broken JSON or `context`), a missing `chat_id`, or a cursor that is not a whole number |
1211
- | 401 | Missing, expired, revoked or unknown token |
1212
- | 403 | Valid token without the scope the call needs (`ask`, `sessions:read`) |
1213
- | 404 | A chat the token's account does not own (or that does not exist); also `integration.enabled` is false: no route is registered, and the request reaches whatever the deployment serves for unknown paths |
1214
- | 413 | Body or attachment over the configured limit |
1215
- | 415 | Unsupported content type, or a non-image attachment |
1216
- | 429 | Per-token rate limit or the deployment's concurrency limit |
1217
- | 503 | The QA assistant failed before it could answer; retry |
1230
+ | Status | Meaning |
1231
+ | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1232
+ | 200 | Answered, or escalated with an empty `answer` |
1233
+ | 400 | Malformed body (no `message`, broken JSON or `context`), a missing `chat_id`, or a cursor that is not a whole number |
1234
+ | 401 | Missing, expired, revoked or unknown token |
1235
+ | 403 | Valid token without the scope the call needs (`ask`, `sessions:read`) |
1236
+ | 404 | A chat the token's account does not own (or that does not exist); also `integration.enabled` is false: no route is registered, and the request reaches whatever the deployment serves for unknown paths |
1237
+ | 413 | Body or attachment over the configured limit |
1238
+ | 415 | Unsupported content type, or an attachment the deployment refused |
1239
+ | 429 | Per-token rate limit or the deployment's concurrency limit |
1240
+ | 503 | The QA assistant failed before it could answer; retry |
1218
1241
 
1219
1242
  Response bodies carry `{ "error": "…", "code": "…" }` with the same reason
1220
1243
  vocabulary, so a client can branch on the code instead of parsing prose.
@@ -2,6 +2,20 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { QaModal } from "./QaModal.js";
3
3
  export const QA_VERSION = __DSH_QA_VERSION__;
4
4
  export const QA_CHANGELOG = [
5
+ {
6
+ version: "0.11.1",
7
+ date: "2026-09-22",
8
+ sections: [
9
+ {
10
+ title: "Исправления",
11
+ items: [
12
+ "Отказ по вложению больше не выглядит как недоступный стенд. Когда вложение отклоняет сам стенд — модель не умеет смотреть картинки, картинка больше установленного на стенде предела, содержимое не того типа, который заявила внешняя программа, — ответ теперь тот же, что и на нечитаемый файл: «повтори без вложений», с причиной отказа в ответе и в журнале. Раньше такой запрос получал ответ «сервис недоступен», а внешняя программа по своей же логике повторяла его без конца: обращение со снимком экрана не превращалось в вопрос без него и не получало ответа вообще. Теперь получает.",
13
+ "Два случая, когда вложение пропадало молча, тоже исправлены. Имя файла, пришедшее в международной процентной кодировке, стенд читал как обычное текстовое поле — файл не доезжал до модели, а вопрос всё равно получал ответ, уже без вложения. Часть запроса без разделителя заголовков разбиралась так же тихо: теперь она честно отклоняется, потому что ответ на вопрос, материала для которого модель не видела, хуже, чем попросить повторить запрос.",
14
+ "Если стенду не удалось подготовить временный каталог для чтения документа, он отвечает тем же «повтори без вложений», а не «сервис недоступен» — причина остаётся в журнале стенда.",
15
+ ],
16
+ },
17
+ ],
18
+ },
5
19
  {
6
20
  version: "0.11.0",
7
21
  date: "2026-09-21",
@@ -24,7 +38,9 @@ export const QA_CHANGELOG = [
24
38
  "Приложенный документ теперь разбирается целиком — и помощником, и панелью «Файлы». Загруженный файл стенд хранит в отдельном хранилище вложений, вне рабочего каталога чата, и читать его помощнику разрешено: путь к нему стоит в самом вопросе. Но инструменты работы с документами об этом хранилище не знали и отказывались открывать файл, который помощнику как раз разрешили прочитать, — просьба разобрать приложенный документ заканчивалась ответом «файла нет», хотя файл на месте, а приложенный документ Word нельзя было посмотреть в панели «Файлы». Теперь хранилище вложений передаётся этим инструментам так же, как его знает остальная часть стенда: документ разбирается по тому же пути, что пришёл в вопросе, а доступ к остальному содержимому хранилища не открывается — читается ровно один названный файл, и только на чтение. Доступ выдаётся тому чату, который его получил, вместе с его дочерними помощниками, и снимается вместе с чатом.",
25
39
  "Документ Word или PDF можно приложить к вопросу — раньше он отбивался прямо при перетаскивании. Список приложимых файлов был списком текстовых расширений: он так и назывался в настройках, и сообщение об отказе перечисляло свой набор «md, txt, log и другие», никак не связанный с настройкой стенда. Получалось несоответствие: стенд разбирает такие документы конвейером документов и показывает документ Word прямо в чате, а приложить его было нельзя. Теперь разрешённые расширения — это то, чем стенд действительно умеет работать: к текстовым файлам добавлены docx и pdf, а если формат всё-таки не разрешён, отказ называет само расширение и говорит, что список задаёт оператор стенда. Там, где список задан явно, он остаётся ровно таким, каким его задали, — добавление работает для стендов, которые полагаются на значения по умолчанию.",
26
40
  "Приложенный документ Word или PDF читается своим инструментом, а не универсальным чтением файла. Документ из вложения лежит на диске путём, и универсальное чтение отказывает таким форматам как бинарным — «cannot read …docx: binary file». Этот отказ ничего не говорит о том, есть ли файл на месте, но читался он именно так: агент решал, что документа нет, начинал искать его по рабочим каталогам и сообщал пользователю, что до файла не дотянуться, хотя конвейер документов всё это время был доступен. В разделе «Заметки модели» появилась заметка о документах: она называет инструменты конвейера (document_inspect, document_to_markdown, а для вложения по ссылке — document_from_url), говорит, что отказ универсального чтения на офисных форматах — это ожидаемый ответ, а не повод искать файл в другом месте, и что отказ самого конвейера нужно назвать вместе с путём, который он назвал. Заметка включается и переписывается своими словами, как и остальные, — стенду без конвейера документов её стоит выключить.",
41
+ "Источник из правой рейки открывается сразу после ответа, а не только после перезагрузки страницы. Список источников собирается из тех же записей о работе инструментов, по которым стенд решает, можно ли открыть файл, — но путь в этом списке строился от каталога, заданного настройкой стенда, а доказательства чата считают пути от рабочего каталога самого чата. Пока это один и тот же каталог, разницы нет; как только они разные (разговор, начатый при прежней настройке, или каталог пользователя внутри общего рабочего каталога), один и тот же файл получал в панели второе написание, и панель просила стенд открыть именно его — а такого пути в доказательствах чата нет. В ответ на клик приходило «источник больше не входит в доказательства этого чата», хотя источник только что был в ответе, и тот же источник открывался после перезагрузки страницы — тогда список пересобирался уже по доказательствам стенда. Теперь список источников строится от рабочего каталога чата, от того же каталога, что и доказательства, поэтому источник открывается с первого клика, а отказ остался там, где он честный: файл, которого в доказательствах этого чата нет, панель по-прежнему не открывает.",
27
42
  "Список чатов показывает только ваши чаты. Обычно список собирался и из ваших разговоров, и из того, что этот браузер запомнил раньше, поэтому на общем компьютере — в переговорке, у стенда, за одной учётной записью Windows — в него попадали разговоры, начатые до вас: с их названиями, временем и значком работы помощника в момент, когда чужой разговор шёл. Теперь список — это ровно ваши чаты: чужой разговор в нём не появится, а разговор, начатый или открытый после входа, виден сразу, без перезагрузки страницы. На стенде без учётных записей ничего не изменилось: список по-прежнему ваш собственный. Имена фоновых помощников в плашках о завершении берутся только из ваших разговоров.",
43
+ "Помощник снова может читать документацию стенда там, где она лежит. Поиск и чтение документации искали её строго в каталоге docs рабочего каталога чата. Пока документация лежала рядом с чатом, это работало; на стенде с личным каталогом у каждой учётной записи рабочий каталог чата — её собственный (внутри /workspace/work), а документация опубликована один раз, отдельно. Инструмент исправно отвечал «в рабочем каталоге этого чата нет каталога docs», хотя документация на стенде есть, и так было и в чате, и у каждого эксперта: путь к ней знали только файловые инструменты, которым путь называют явно. Теперь стенд называет корень документации настройкой (tools.docsRoot, на этом стенде — /workspace/docs), и оба инструмента читают ровно это дерево: те же пути в ответе, те же проверки (корень существует, это настоящий каталог, не ссылка; путь за пределы дерева отвергается). На стенде без личных каталогов ничего не изменилось — там по-прежнему ищется docs рядом с чатом. Инструменты, которые стенд выдал помощнику сам, больше не отказывают в чате с учётной записью. Поиск и чтение документации, диагностика набора инструментов и удаление файла в рабочем каталоге выданы помощнику стендом, а не ролью: их нет ни в одном списке роли, и роль не может их отозвать. Разрешение на вызов проверяют два уровня, и в чате с учётной записью про эти инструменты знал только один — второй строил границы разговора из списка стенда, инструментов роли и того, что роль может выдать по навыку, и выданных стендом инструментов там не находил. Получался отказ «инструмент вне профиля возможностей разговора», по которому невозможно понять, чего именно не хватает: инструмент виден помощнику, стенд его выдал, а вызов всё равно не проходит. Теперь границы разговора считают инструменты стенда так же, как это уже работало в чатах без учётных записей, а проверка профиля читает их из набора самого помощника. То, чего стенд помощнику не выдавал, остаётся за ролью: отказ на такой инструмент по-прежнему называет профиль, а не разговор.",
28
44
  ],
29
45
  },
30
46
  ],
@@ -1 +1 @@
1
- {"version":3,"file":"QaChangelog.js","sourceRoot":"","sources":["../../../src/client/components/QaChangelog.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"QaChangelog.js","sourceRoot":"","sources":["../../../src/client/components/QaChangelog.tsx"],"names":[],"mappings":"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"}
package/lib/client.js CHANGED
@@ -49932,8 +49932,20 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
49932
49932
  }
49933
49933
  //#endregion
49934
49934
  //#region src/client/components/QaChangelog.tsx
49935
- const QA_VERSION = "0.11.0";
49935
+ const QA_VERSION = "0.11.1";
49936
49936
  const QA_CHANGELOG = [
49937
+ {
49938
+ version: "0.11.1",
49939
+ date: "2026-09-22",
49940
+ sections: [{
49941
+ title: "Исправления",
49942
+ items: [
49943
+ "Отказ по вложению больше не выглядит как недоступный стенд. Когда вложение отклоняет сам стенд — модель не умеет смотреть картинки, картинка больше установленного на стенде предела, содержимое не того типа, который заявила внешняя программа, — ответ теперь тот же, что и на нечитаемый файл: «повтори без вложений», с причиной отказа в ответе и в журнале. Раньше такой запрос получал ответ «сервис недоступен», а внешняя программа по своей же логике повторяла его без конца: обращение со снимком экрана не превращалось в вопрос без него и не получало ответа вообще. Теперь получает.",
49944
+ "Два случая, когда вложение пропадало молча, тоже исправлены. Имя файла, пришедшее в международной процентной кодировке, стенд читал как обычное текстовое поле — файл не доезжал до модели, а вопрос всё равно получал ответ, уже без вложения. Часть запроса без разделителя заголовков разбиралась так же тихо: теперь она честно отклоняется, потому что ответ на вопрос, материала для которого модель не видела, хуже, чем попросить повторить запрос.",
49945
+ "Если стенду не удалось подготовить временный каталог для чтения документа, он отвечает тем же «повтори без вложений», а не «сервис недоступен» — причина остаётся в журнале стенда."
49946
+ ]
49947
+ }]
49948
+ },
49937
49949
  {
49938
49950
  version: "0.11.0",
49939
49951
  date: "2026-09-21",
@@ -49954,7 +49966,9 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
49954
49966
  "Приложенный документ теперь разбирается целиком — и помощником, и панелью «Файлы». Загруженный файл стенд хранит в отдельном хранилище вложений, вне рабочего каталога чата, и читать его помощнику разрешено: путь к нему стоит в самом вопросе. Но инструменты работы с документами об этом хранилище не знали и отказывались открывать файл, который помощнику как раз разрешили прочитать, — просьба разобрать приложенный документ заканчивалась ответом «файла нет», хотя файл на месте, а приложенный документ Word нельзя было посмотреть в панели «Файлы». Теперь хранилище вложений передаётся этим инструментам так же, как его знает остальная часть стенда: документ разбирается по тому же пути, что пришёл в вопросе, а доступ к остальному содержимому хранилища не открывается — читается ровно один названный файл, и только на чтение. Доступ выдаётся тому чату, который его получил, вместе с его дочерними помощниками, и снимается вместе с чатом.",
49955
49967
  "Документ Word или PDF можно приложить к вопросу — раньше он отбивался прямо при перетаскивании. Список приложимых файлов был списком текстовых расширений: он так и назывался в настройках, и сообщение об отказе перечисляло свой набор «md, txt, log и другие», никак не связанный с настройкой стенда. Получалось несоответствие: стенд разбирает такие документы конвейером документов и показывает документ Word прямо в чате, а приложить его было нельзя. Теперь разрешённые расширения — это то, чем стенд действительно умеет работать: к текстовым файлам добавлены docx и pdf, а если формат всё-таки не разрешён, отказ называет само расширение и говорит, что список задаёт оператор стенда. Там, где список задан явно, он остаётся ровно таким, каким его задали, — добавление работает для стендов, которые полагаются на значения по умолчанию.",
49956
49968
  "Приложенный документ Word или PDF читается своим инструментом, а не универсальным чтением файла. Документ из вложения лежит на диске путём, и универсальное чтение отказывает таким форматам как бинарным — «cannot read …docx: binary file». Этот отказ ничего не говорит о том, есть ли файл на месте, но читался он именно так: агент решал, что документа нет, начинал искать его по рабочим каталогам и сообщал пользователю, что до файла не дотянуться, хотя конвейер документов всё это время был доступен. В разделе «Заметки модели» появилась заметка о документах: она называет инструменты конвейера (document_inspect, document_to_markdown, а для вложения по ссылке — document_from_url), говорит, что отказ универсального чтения на офисных форматах — это ожидаемый ответ, а не повод искать файл в другом месте, и что отказ самого конвейера нужно назвать вместе с путём, который он назвал. Заметка включается и переписывается своими словами, как и остальные, — стенду без конвейера документов её стоит выключить.",
49957
- "Список чатов показывает только ваши чаты. Обычно список собирался и из ваших разговоров, и из того, что этот браузер запомнил раньше, поэтому на общем компьютере — в переговорке, у стенда, за одной учётной записью Windows — в него попадали разговоры, начатые до вас: с их названиями, временем и значком работы помощника в момент, когда чужой разговор шёл. Теперь список — это ровно ваши чаты: чужой разговор в нём не появится, а разговор, начатый или открытый после входа, виден сразу, без перезагрузки страницы. На стенде без учётных записей ничего не изменилось: список по-прежнему ваш собственный. Имена фоновых помощников в плашках о завершении берутся только из ваших разговоров."
49969
+ "Источник из правой рейки открывается сразу после ответа, а не только после перезагрузки страницы. Список источников собирается из тех же записей о работе инструментов, по которым стенд решает, можно ли открыть файл, — но путь в этом списке строился от каталога, заданного настройкой стенда, а доказательства чата считают пути от рабочего каталога самого чата. Пока это один и тот же каталог, разницы нет; как только они разные (разговор, начатый при прежней настройке, или каталог пользователя внутри общего рабочего каталога), один и тот же файл получал в панели второе написание, и панель просила стенд открыть именно его — а такого пути в доказательствах чата нет. В ответ на клик приходило «источник больше не входит в доказательства этого чата», хотя источник только что был в ответе, и тот же источник открывался после перезагрузки страницы — тогда список пересобирался уже по доказательствам стенда. Теперь список источников строится от рабочего каталога чата, от того же каталога, что и доказательства, поэтому источник открывается с первого клика, а отказ остался там, где он честный: файл, которого в доказательствах этого чата нет, панель по-прежнему не открывает.",
49970
+ "Список чатов показывает только ваши чаты. Обычно список собирался и из ваших разговоров, и из того, что этот браузер запомнил раньше, поэтому на общем компьютере — в переговорке, у стенда, за одной учётной записью Windows — в него попадали разговоры, начатые до вас: с их названиями, временем и значком работы помощника в момент, когда чужой разговор шёл. Теперь список — это ровно ваши чаты: чужой разговор в нём не появится, а разговор, начатый или открытый после входа, виден сразу, без перезагрузки страницы. На стенде без учётных записей ничего не изменилось: список по-прежнему ваш собственный. Имена фоновых помощников в плашках о завершении берутся только из ваших разговоров.",
49971
+ "Помощник снова может читать документацию стенда там, где она лежит. Поиск и чтение документации искали её строго в каталоге docs рабочего каталога чата. Пока документация лежала рядом с чатом, это работало; на стенде с личным каталогом у каждой учётной записи рабочий каталог чата — её собственный (внутри /workspace/work), а документация опубликована один раз, отдельно. Инструмент исправно отвечал «в рабочем каталоге этого чата нет каталога docs», хотя документация на стенде есть, и так было и в чате, и у каждого эксперта: путь к ней знали только файловые инструменты, которым путь называют явно. Теперь стенд называет корень документации настройкой (tools.docsRoot, на этом стенде — /workspace/docs), и оба инструмента читают ровно это дерево: те же пути в ответе, те же проверки (корень существует, это настоящий каталог, не ссылка; путь за пределы дерева отвергается). На стенде без личных каталогов ничего не изменилось — там по-прежнему ищется docs рядом с чатом. Инструменты, которые стенд выдал помощнику сам, больше не отказывают в чате с учётной записью. Поиск и чтение документации, диагностика набора инструментов и удаление файла в рабочем каталоге выданы помощнику стендом, а не ролью: их нет ни в одном списке роли, и роль не может их отозвать. Разрешение на вызов проверяют два уровня, и в чате с учётной записью про эти инструменты знал только один — второй строил границы разговора из списка стенда, инструментов роли и того, что роль может выдать по навыку, и выданных стендом инструментов там не находил. Получался отказ «инструмент вне профиля возможностей разговора», по которому невозможно понять, чего именно не хватает: инструмент виден помощнику, стенд его выдал, а вызов всё равно не проходит. Теперь границы разговора считают инструменты стенда так же, как это уже работало в чатах без учётных записей, а проверка профиля читает их из набора самого помощника. То, чего стенд помощнику не выдавал, остаётся за ролью: отказ на такой инструмент по-прежнему называет профиль, а не разговор."
49958
49972
  ]
49959
49973
  }]
49960
49974
  },
@@ -50314,7 +50328,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
50314
50328
  className: "dsh-qa-changelog__date",
50315
50329
  children: entry.date
50316
50330
  }),
50317
- entry.version === "0.11.0" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
50331
+ entry.version === "0.11.1" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
50318
50332
  className: "dsh-qa-changelog__current",
50319
50333
  children: "текущая"
50320
50334
  }) : null