dsh-zotero 0.8.3 → 0.9.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 (162) hide show
  1. package/README.en.md +2 -2
  2. package/README.md +2 -2
  3. package/lib/ask.d.ts.map +1 -1
  4. package/lib/ask.js +2 -2
  5. package/lib/ask.js.map +1 -1
  6. package/lib/client.js +126 -67
  7. package/lib/client.js.map +3 -3
  8. package/lib/command.d.ts +16 -0
  9. package/lib/command.d.ts.map +1 -1
  10. package/lib/command.js +30 -12
  11. package/lib/command.js.map +1 -1
  12. package/lib/config.d.ts +21 -0
  13. package/lib/config.d.ts.map +1 -1
  14. package/lib/config.js +3 -0
  15. package/lib/config.js.map +1 -1
  16. package/lib/constants.d.ts +45 -4
  17. package/lib/constants.d.ts.map +1 -1
  18. package/lib/constants.js +45 -4
  19. package/lib/constants.js.map +1 -1
  20. package/lib/contract.d.ts +5 -0
  21. package/lib/contract.d.ts.map +1 -1
  22. package/lib/contract.js +16 -5
  23. package/lib/contract.js.map +1 -1
  24. package/lib/errors.d.ts +61 -1
  25. package/lib/errors.d.ts.map +1 -1
  26. package/lib/errors.js +88 -0
  27. package/lib/errors.js.map +1 -1
  28. package/lib/http-client.d.ts +71 -8
  29. package/lib/http-client.d.ts.map +1 -1
  30. package/lib/http-client.js +103 -43
  31. package/lib/http-client.js.map +1 -1
  32. package/lib/json.d.ts +2 -0
  33. package/lib/json.d.ts.map +1 -1
  34. package/lib/json.js +6 -0
  35. package/lib/json.js.map +1 -1
  36. package/lib/local/attachment-location.d.ts +16 -0
  37. package/lib/local/attachment-location.d.ts.map +1 -1
  38. package/lib/local/attachment-location.js +45 -11
  39. package/lib/local/attachment-location.js.map +1 -1
  40. package/lib/local/browse-domain.d.ts +41 -0
  41. package/lib/local/browse-domain.d.ts.map +1 -1
  42. package/lib/local/browse-domain.js +56 -13
  43. package/lib/local/browse-domain.js.map +1 -1
  44. package/lib/local/changes-domain.d.ts +6 -0
  45. package/lib/local/changes-domain.d.ts.map +1 -1
  46. package/lib/local/changes-domain.js +9 -3
  47. package/lib/local/changes-domain.js.map +1 -1
  48. package/lib/local/children-wire.d.ts +47 -0
  49. package/lib/local/children-wire.d.ts.map +1 -0
  50. package/lib/local/children-wire.js +57 -0
  51. package/lib/local/children-wire.js.map +1 -0
  52. package/lib/local/detail.d.ts +35 -21
  53. package/lib/local/detail.d.ts.map +1 -1
  54. package/lib/local/detail.js +68 -52
  55. package/lib/local/detail.js.map +1 -1
  56. package/lib/local/export-domain.d.ts.map +1 -1
  57. package/lib/local/export-domain.js +2 -1
  58. package/lib/local/export-domain.js.map +1 -1
  59. package/lib/local/note-format.d.ts +35 -0
  60. package/lib/local/note-format.d.ts.map +1 -0
  61. package/lib/local/note-format.js +215 -0
  62. package/lib/local/note-format.js.map +1 -0
  63. package/lib/local/provider.d.ts +36 -2
  64. package/lib/local/provider.d.ts.map +1 -1
  65. package/lib/local/provider.js +79 -12
  66. package/lib/local/provider.js.map +1 -1
  67. package/lib/local/retrieve.d.ts.map +1 -1
  68. package/lib/local/retrieve.js +6 -1
  69. package/lib/local/retrieve.js.map +1 -1
  70. package/lib/local/scope-directory.d.ts.map +1 -1
  71. package/lib/local/scope-directory.js +2 -2
  72. package/lib/local/scope-directory.js.map +1 -1
  73. package/lib/local/search-domain.d.ts +6 -0
  74. package/lib/local/search-domain.d.ts.map +1 -1
  75. package/lib/local/search-domain.js +7 -1
  76. package/lib/local/search-domain.js.map +1 -1
  77. package/lib/local/write-domain.d.ts +63 -0
  78. package/lib/local/write-domain.d.ts.map +1 -0
  79. package/lib/local/write-domain.js +348 -0
  80. package/lib/local/write-domain.js.map +1 -0
  81. package/lib/normalize.d.ts +7 -0
  82. package/lib/normalize.d.ts.map +1 -1
  83. package/lib/normalize.js +14 -10
  84. package/lib/normalize.js.map +1 -1
  85. package/lib/prompt.d.ts +12 -0
  86. package/lib/prompt.d.ts.map +1 -1
  87. package/lib/prompt.js +16 -3
  88. package/lib/prompt.js.map +1 -1
  89. package/lib/refs.d.ts +17 -0
  90. package/lib/refs.d.ts.map +1 -1
  91. package/lib/refs.js +30 -6
  92. package/lib/refs.js.map +1 -1
  93. package/lib/remote.d.ts.map +1 -1
  94. package/lib/remote.js +1 -0
  95. package/lib/remote.js.map +1 -1
  96. package/lib/service.d.ts +48 -5
  97. package/lib/service.d.ts.map +1 -1
  98. package/lib/service.js +112 -5
  99. package/lib/service.js.map +1 -1
  100. package/lib/tools/add-tags.d.ts +74 -0
  101. package/lib/tools/add-tags.d.ts.map +1 -0
  102. package/lib/tools/add-tags.js +126 -0
  103. package/lib/tools/add-tags.js.map +1 -0
  104. package/lib/tools/add-to-collection.d.ts +65 -0
  105. package/lib/tools/add-to-collection.d.ts.map +1 -0
  106. package/lib/tools/add-to-collection.js +116 -0
  107. package/lib/tools/add-to-collection.js.map +1 -0
  108. package/lib/tools/attachment.d.ts +9 -0
  109. package/lib/tools/attachment.d.ts.map +1 -1
  110. package/lib/tools/attachment.js +2 -1
  111. package/lib/tools/attachment.js.map +1 -1
  112. package/lib/tools/browse.d.ts +13 -1
  113. package/lib/tools/browse.d.ts.map +1 -1
  114. package/lib/tools/browse.js +29 -14
  115. package/lib/tools/browse.js.map +1 -1
  116. package/lib/tools/changes.d.ts +32 -0
  117. package/lib/tools/changes.d.ts.map +1 -1
  118. package/lib/tools/changes.js +42 -20
  119. package/lib/tools/changes.js.map +1 -1
  120. package/lib/tools/children.d.ts +10 -6
  121. package/lib/tools/children.d.ts.map +1 -1
  122. package/lib/tools/children.js +14 -10
  123. package/lib/tools/children.js.map +1 -1
  124. package/lib/tools/create-note.d.ts +102 -0
  125. package/lib/tools/create-note.d.ts.map +1 -0
  126. package/lib/tools/create-note.js +168 -0
  127. package/lib/tools/create-note.js.map +1 -0
  128. package/lib/tools/export.d.ts +7 -0
  129. package/lib/tools/export.d.ts.map +1 -1
  130. package/lib/tools/export.js +13 -4
  131. package/lib/tools/export.js.map +1 -1
  132. package/lib/tools/get.d.ts +5 -3
  133. package/lib/tools/get.d.ts.map +1 -1
  134. package/lib/tools/get.js +6 -4
  135. package/lib/tools/get.js.map +1 -1
  136. package/lib/tools/retrieve.d.ts +37 -0
  137. package/lib/tools/retrieve.d.ts.map +1 -1
  138. package/lib/tools/retrieve.js +54 -11
  139. package/lib/tools/retrieve.js.map +1 -1
  140. package/lib/tools/search.d.ts +11 -0
  141. package/lib/tools/search.d.ts.map +1 -1
  142. package/lib/tools/search.js +23 -8
  143. package/lib/tools/search.js.map +1 -1
  144. package/lib/tools/validate.d.ts +10 -0
  145. package/lib/tools/validate.d.ts.map +1 -1
  146. package/lib/tools/validate.js +21 -7
  147. package/lib/tools/validate.js.map +1 -1
  148. package/lib/tools/write-approval.d.ts +58 -0
  149. package/lib/tools/write-approval.d.ts.map +1 -0
  150. package/lib/tools/write-approval.js +123 -0
  151. package/lib/tools/write-approval.js.map +1 -0
  152. package/lib/types.d.ts +131 -1
  153. package/lib/types.d.ts.map +1 -1
  154. package/lib/write-auth.d.ts +116 -0
  155. package/lib/write-auth.d.ts.map +1 -0
  156. package/lib/write-auth.js +155 -0
  157. package/lib/write-auth.js.map +1 -0
  158. package/lib/write-http.d.ts +137 -0
  159. package/lib/write-http.d.ts.map +1 -0
  160. package/lib/write-http.js +366 -0
  161. package/lib/write-http.js.map +1 -0
  162. package/package.json +115 -168
package/README.en.md CHANGED
@@ -10,7 +10,7 @@
10
10
  <a href="https://www.npmjs.com/package/dsh-zotero"><img src="https://img.shields.io/npm/v/dsh-zotero" alt="npm version" style="max-width:100%;"></a>
11
11
  <a href="https://www.npmjs.com/package/dsh-zotero"><img src="https://img.shields.io/npm/dm/dsh-zotero" alt="npm downloads" style="max-width:100%;"></a>
12
12
  <a href="https://www.npmjs.com/package/dsh-zotero"><img src="https://img.shields.io/npm/l/dsh-zotero" alt="license" style="max-width:100%;"></a>
13
- <a href="https://github.com/deepseek-ai/deepseek-harness/releases/tag/dsh-v0.1.5-rc.2"><img src="https://img.shields.io/badge/dsh-%3E%3D0.1.5--rc.2-blue" alt="minimum dsh version" style="max-width:100%;"></a>
13
+ <a href="https://github.com/deepseek-ai/deepseek-harness/releases/tag/dsh-v0.1.6-alpha.2"><img src="https://img.shields.io/badge/dsh-%3E%3D0.1.6--alpha.2-blue" alt="minimum dsh version" style="max-width:100%;"></a>
14
14
  <a href="https://awesome-dsh-plugin.com"><img src="https://awesome-dsh-plugin.com/badge.svg" alt="Awesome DSH Plugin"></a>
15
15
  </p>
16
16
  </div>
@@ -69,7 +69,7 @@ The plugin provides a settings page under **Settings → Zotero** — a left-nav
69
69
 
70
70
  - Zotero ≥ 7 with local API enabled: **Settings → Advanced → "Allow other applications on this computer to communicate with Zotero"**
71
71
  - Node.js ≥ 22.19 (or ≥ 24)
72
- - dsh 0.1.5-rc.2 host (all `@deepseek-ai/dsh-*` peer dependencies are `^0.1.5-rc.2`, and the declared compatibility range is `engines.dsh`; only the latest pre-release line is supported until upstream stabilizes, with no backward compatibility)
72
+ - dsh 0.1.6-alpha.2 host (all `@deepseek-ai/dsh-*` peer dependencies are `^0.1.6-alpha.2`, and the declared compatibility range is `engines.dsh`; only the latest pre-release line is supported until upstream stabilizes, with no backward compatibility)
73
73
  - Local API at `http://127.0.0.1:23119/api`, unauthenticated, read-only
74
74
 
75
75
  ## Usage example
package/README.md CHANGED
@@ -10,7 +10,7 @@
10
10
  <a href="https://www.npmjs.com/package/dsh-zotero"><img src="https://img.shields.io/npm/v/dsh-zotero" alt="npm version" style="max-width:100%;"></a>
11
11
  <a href="https://www.npmjs.com/package/dsh-zotero"><img src="https://img.shields.io/npm/dm/dsh-zotero" alt="npm downloads" style="max-width:100%;"></a>
12
12
  <a href="https://www.npmjs.com/package/dsh-zotero"><img src="https://img.shields.io/npm/l/dsh-zotero" alt="license" style="max-width:100%;"></a>
13
- <a href="https://github.com/deepseek-ai/deepseek-harness/releases/tag/dsh-v0.1.5-rc.2"><img src="https://img.shields.io/badge/dsh-%3E%3D0.1.5--rc.2-blue" alt="最低 dsh 版本" style="max-width:100%;"></a>
13
+ <a href="https://github.com/deepseek-ai/deepseek-harness/releases/tag/dsh-v0.1.6-alpha.2"><img src="https://img.shields.io/badge/dsh-%3E%3D0.1.6--alpha.2-blue" alt="最低 dsh 版本" style="max-width:100%;"></a>
14
14
  <a href="https://awesome-dsh-plugin.com"><img src="https://awesome-dsh-plugin.com/badge.svg" alt="Awesome DSH Plugin"></a>
15
15
  </p>
16
16
  </div>
@@ -69,7 +69,7 @@ dsh plugin --profile <name> add ./dsh-zotero-*.tgz
69
69
 
70
70
  - Zotero ≥ 7 桌面版,启用本地 API:**设置 → 高级 → "允许其他应用程序与 Zotero 通信"**
71
71
  - Node.js ≥ 22.19(或 ≥ 24)
72
- - 宿主 dsh 0.1.5-rc.2(`@deepseek-ai/dsh-*` peer 依赖均为 `^0.1.5-rc.2`,兼容范围另见 `engines.dsh`;上游发布稳定版之前只跟最新预发布线,不向后兼容)
72
+ - 宿主 dsh 0.1.6-alpha.2(`@deepseek-ai/dsh-*` peer 依赖均为 `^0.1.6-alpha.2`,兼容范围另见 `engines.dsh`;上游发布稳定版之前只跟最新预发布线,不向后兼容)
73
73
  - 本地 API 地址 `http://127.0.0.1:23119/api`,无认证,只读
74
74
 
75
75
  ## 使用示例
package/lib/ask.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"ask.d.ts","sourceRoot":"","sources":["../src/ask.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAElD,OAAO,EAAgB,KAAK,cAAc,EAAE,MAAM,wBAAwB,CAAA;AA0B1E,iEAAiE;AACjE,KAAK,mBAAmB,GAAG,IAAI,CAAC,cAAc,EAAE,QAAQ,GAAG,OAAO,CAAC,CAAA;AA2EnE;;;;;;;;;;;GAWG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsC;IAE7D;;;;;;;OAOG;IACG,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;CAW5E;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,mBAAmB,CAAC,CAAC,EACzC,GAAG,EAAE,OAAO,EACZ,QAAQ,EAAE,oBAAoB,EAC9B,IAAI,EAAE,mBAAmB,EACzB,GAAG,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACpB,OAAO,CAAC,CAAC,CAAC,CAmCZ"}
1
+ {"version":3,"file":"ask.d.ts","sourceRoot":"","sources":["../src/ask.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAElD,OAAO,EAAgB,KAAK,cAAc,EAAE,MAAM,wBAAwB,CAAA;AA2B1E,iEAAiE;AACjE,KAAK,mBAAmB,GAAG,IAAI,CAAC,cAAc,EAAE,QAAQ,GAAG,OAAO,CAAC,CAAA;AA2EnE;;;;;;;;;;;GAWG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsC;IAE7D;;;;;;;OAOG;IACG,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;CAW5E;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,mBAAmB,CAAC,CAAC,EACzC,GAAG,EAAE,OAAO,EACZ,QAAQ,EAAE,oBAAoB,EAC9B,IAAI,EAAE,mBAAmB,EACzB,GAAG,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACpB,OAAO,CAAC,CAAC,CAAC,CAmCZ"}
package/lib/ask.js CHANGED
@@ -16,7 +16,7 @@
16
16
  import { HarnessError } from '@deepseek-ai/dsh-llm';
17
17
  import { TOOL_ABORTED } from '@deepseek-ai/dsh-tools';
18
18
  import { ZOTERO_LOCAL_API_VERSION } from './constants.js';
19
- import { ZOTERO_API_DISABLED, ZOTERO_API_VERSION, ZOTERO_NOT_RUNNING, ZOTERO_TIMEOUT, ZoteroError, } from './errors.js';
19
+ import { TOOL_ABORTED_MESSAGE, ZOTERO_API_DISABLED, ZOTERO_API_VERSION, ZOTERO_NOT_RUNNING, ZOTERO_TIMEOUT, ZoteroError, } from './errors.js';
20
20
  /** The connectivity failure codes that warrant asking the user how to proceed. */
21
21
  const ASK_WORTHY_CODES = [
22
22
  ZOTERO_NOT_RUNNING,
@@ -164,7 +164,7 @@ export async function withConnectivityAsk(ctx, recovery, exec, run) {
164
164
  // A failed question (no provider, aborted ask, delegated caller) must
165
165
  // never mask the underlying connectivity failure.
166
166
  if (exec.signal?.aborted)
167
- throw new HarnessError('tool call aborted', TOOL_ABORTED);
167
+ throw new HarnessError(TOOL_ABORTED_MESSAGE, TOOL_ABORTED);
168
168
  throw error;
169
169
  }
170
170
  if (!retry)
package/lib/ask.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"ask.js","sourceRoot":"","sources":["../src/ask.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ask.js","sourceRoot":"","sources":["../src/ask.ts"],"names":[],"mappings":"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"}
package/lib/client.js CHANGED
@@ -30,17 +30,18 @@ module.exports = __toCommonJS(index_exports);
30
30
  var import_dsh_client_ui_primitives2 = require("@deepseek-ai/dsh-client-ui-primitives");
31
31
 
32
32
  // src/client/fields.tsx
33
+ var import_react = require("react");
33
34
  var import_dsh_client_ui_primitives = require("@deepseek-ai/dsh-client-ui-primitives");
34
35
 
35
36
  // src/client/fields.module.css
36
- var style = `.gONAZG_field{flex-direction:column;gap:6px;padding:12px 0;display:flex}.gONAZG_field+.gONAZG_field{border-top:.5px solid var(--dsw-alias-border-l2)}.gONAZG_head{align-items:center;gap:8px;display:flex}.gONAZG_label{min-width:0;color:var(--dsw-alias-label-primary);flex:1;font-size:13px;font-weight:500;line-height:1.5}.gONAZG_badges{align-items:center;gap:8px;display:inline-flex}.gONAZG_reset{font:inherit;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:none;padding:0;font-size:12px;line-height:1.5}.gONAZG_reset:hover:not(:disabled){color:var(--dsw-alias-label-primary)}.gONAZG_reset:disabled{cursor:default}.gONAZG_input{border:.5px solid var(--dsw-alias-border-l4);background:var(--dsw-alias-bg-layer-3);height:34px;font:inherit;color:var(--dsw-alias-label-primary);border-radius:8px;padding:0 12px;font-size:13px;line-height:1.5}.gONAZG_input:focus-visible{border-color:var(--dsw-alias-brand-primary);outline:none}.gONAZG_input:disabled{color:var(--dsw-alias-label-tertiary);cursor:default}.gONAZG_inputInvalid{border-color:var(--dsw-alias-label-error,var(--dsw-alias-state-error-primary));}.gONAZG_invalid{color:var(--dsw-alias-label-error,var(--dsw-alias-state-error-primary));margin:0;font-size:12px;line-height:1.5}.gONAZG_hint{color:var(--dsw-alias-label-tertiary);margin:0;font-size:12px;line-height:1.5}.gONAZG_toggleRow{align-items:center;gap:8px;display:flex}.gONAZG_toggleLabel{min-width:0;color:var(--dsw-alias-label-primary);cursor:pointer;flex:1;font-size:13px;font-weight:500;line-height:1.5}.gONAZG_toggle{width:16px;height:16px;accent-color:var(--dsw-alias-state-business-primary);cursor:pointer;flex:none;margin:0}`;
37
+ var style = `.gONAZG_field{flex-direction:column;gap:6px;padding:12px 0;display:flex}.gONAZG_field+.gONAZG_field{border-top:.5px solid var(--dsw-alias-border-l2)}.gONAZG_head{align-items:center;gap:8px;display:flex}.gONAZG_label{min-width:0;color:var(--dsw-alias-label-primary);flex:1;font-size:13px;font-weight:500;line-height:1.5}.gONAZG_labelGroup{flex:1;align-items:center;gap:4px;min-width:0;display:flex}.gONAZG_labelGroup>.gONAZG_label{flex:0 auto}.gONAZG_helpButton{width:24px;height:24px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:0;border-radius:6px;flex:none;justify-content:center;align-items:center;padding:0;display:inline-flex}.gONAZG_helpButton:hover,.gONAZG_helpButton[aria-expanded=true]{background:var(--dsw-alias-bg-layer-4);color:var(--dsw-alias-label-secondary)}.gONAZG_helpButton:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:1px}.gONAZG_help{color:var(--dsw-alias-label-secondary);padding:10px 0 0;font-size:12px;line-height:1.6}.gONAZG_help>p{margin:0}.gONAZG_help>p+p{margin-top:8px}.gONAZG_badges{align-items:center;gap:8px;display:inline-flex}.gONAZG_reset{font:inherit;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:none;padding:0;font-size:12px;line-height:1.5}.gONAZG_reset:hover:not(:disabled){color:var(--dsw-alias-label-primary)}.gONAZG_reset:disabled{cursor:default}.gONAZG_input{border:.5px solid var(--dsw-alias-border-l4);background:var(--dsw-alias-bg-layer-3);height:34px;font:inherit;color:var(--dsw-alias-label-primary);border-radius:8px;padding:0 12px;font-size:13px;line-height:1.5}.gONAZG_input:focus-visible{border-color:var(--dsw-alias-brand-primary);outline:none}.gONAZG_input:disabled{color:var(--dsw-alias-label-tertiary);cursor:default}.gONAZG_input[aria-invalid=true]{border-color:var(--dsw-alias-state-error-primary)}.gONAZG_invalid{color:var(--dsw-alias-state-error-primary);margin:0;font-size:12px;line-height:1.5}.gONAZG_hint{color:var(--dsw-alias-label-tertiary);margin:0;font-size:12px;line-height:1.5}.gONAZG_toggleRow{align-items:center;gap:8px;display:flex}.gONAZG_toggleLabel{min-width:0;color:var(--dsw-alias-label-primary);cursor:pointer;flex:1;font-size:13px;font-weight:500;line-height:1.5}.gONAZG_toggle{width:16px;height:16px;accent-color:var(--dsw-alias-state-business-primary);cursor:pointer;flex:none;margin:0}`;
37
38
  if (typeof document !== "undefined" && !document.querySelector('style[data-plugin-css="dsh-zotero/fields.module.css"]')) {
38
39
  const tag = document.createElement("style");
39
40
  tag.setAttribute("data-plugin-css", "dsh-zotero/fields.module.css");
40
41
  tag.textContent = style;
41
42
  document.head.appendChild(tag);
42
43
  }
43
- var fields_default = { "field": "gONAZG_field", "reset": "gONAZG_reset", "inputInvalid": "gONAZG_inputInvalid", "input": "gONAZG_input", "hint": "gONAZG_hint", "toggleLabel": "gONAZG_toggleLabel", "label": "gONAZG_label", "badges": "gONAZG_badges", "invalid": "gONAZG_invalid", "head": "gONAZG_head", "toggle": "gONAZG_toggle", "toggleRow": "gONAZG_toggleRow" };
44
+ var fields_default = { "help": "gONAZG_help", "reset": "gONAZG_reset", "input": "gONAZG_input", "hint": "gONAZG_hint", "toggleRow": "gONAZG_toggleRow", "label": "gONAZG_label", "invalid": "gONAZG_invalid", "badges": "gONAZG_badges", "head": "gONAZG_head", "toggle": "gONAZG_toggle", "labelGroup": "gONAZG_labelGroup", "helpButton": "gONAZG_helpButton", "toggleLabel": "gONAZG_toggleLabel", "field": "gONAZG_field" };
44
45
 
45
46
  // src/client/fields.tsx
46
47
  var import_jsx_runtime = require("react/jsx-runtime");
@@ -51,9 +52,30 @@ function OverrideControls(props) {
51
52
  ] });
52
53
  }
53
54
  function ValueField(props) {
55
+ const [helpOpen, setHelpOpen] = (0, import_react.useState)(false);
56
+ const helpId = `${props.id}-help`;
57
+ const messageId = `${props.id}-message`;
58
+ const hasMessage = props.invalid || Boolean(props.hint);
59
+ const description = [hasMessage ? messageId : "", helpOpen ? helpId : ""].filter(Boolean).join(" ");
54
60
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: fields_default.field, children: [
55
61
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: fields_default.head, children: [
56
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("label", { className: fields_default.label, htmlFor: props.id, children: props.label }),
62
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: fields_default.labelGroup, children: [
63
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("label", { className: fields_default.label, htmlFor: props.id, children: props.label }),
64
+ props.help !== void 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
65
+ "button",
66
+ {
67
+ type: "button",
68
+ className: fields_default.helpButton,
69
+ "aria-label": props.help.label,
70
+ "aria-expanded": helpOpen,
71
+ "aria-controls": helpId,
72
+ onClick: () => {
73
+ setHelpOpen(!helpOpen);
74
+ },
75
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_dsh_client_ui_primitives.IconInfoOutline14, { size: 12 })
76
+ }
77
+ ) : null
78
+ ] }),
57
79
  props.overridden ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
58
80
  OverrideControls,
59
81
  {
@@ -68,10 +90,11 @@ function ValueField(props) {
68
90
  "input",
69
91
  {
70
92
  id: props.id,
71
- className: props.invalid ? fields_default.inputInvalid : fields_default.input,
93
+ className: fields_default.input,
72
94
  type: "text",
73
95
  ...props.numeric === true ? { inputMode: "numeric" } : {},
74
96
  ...props.invalid ? { "aria-invalid": true } : {},
97
+ "aria-describedby": description || void 0,
75
98
  value: props.text,
76
99
  placeholder: props.placeholder ?? "",
77
100
  disabled: props.disabled,
@@ -80,7 +103,8 @@ function ValueField(props) {
80
103
  }
81
104
  }
82
105
  ),
83
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: props.invalid ? fields_default.invalid : fields_default.hint, children: props.invalid ? props.invalidLabel : props.hint })
106
+ hasMessage ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { id: messageId, className: props.invalid ? fields_default.invalid : fields_default.hint, children: props.invalid ? props.invalidLabel : props.hint }) : null,
107
+ props.help !== void 0 && helpOpen ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { id: helpId, className: fields_default.help, role: "region", "aria-label": props.help.label, children: props.help.content }) : null
84
108
  ] });
85
109
  }
86
110
  function BooleanField(props) {
@@ -304,7 +328,7 @@ var CardForm = class {
304
328
  }
305
329
  spec(field2) {
306
330
  const spec = this.specs.get(field2);
307
- if (spec === void 0) throw new Error(`plugin card has no field ${field2}`);
331
+ if (spec === void 0) throw new Error(`settings form has no field ${field2}`);
308
332
  return spec;
309
333
  }
310
334
  sectionValue(field2) {
@@ -348,7 +372,10 @@ var FIELD_SPECS = [
348
372
  { key: "maxBrowseResults", kind: "number", group: "groupOutput" },
349
373
  { key: "maxChangesResults", kind: "number", group: "groupOutput" },
350
374
  { key: "defaultStyle", kind: "text", group: "groupDefaults" },
351
- { key: "defaultLocale", kind: "text", group: "groupDefaults" }
375
+ { key: "defaultLocale", kind: "text", group: "groupDefaults" },
376
+ { key: "writeEnabled", kind: "boolean", group: "groupWrite" },
377
+ { key: "writeConfirm", kind: "boolean", group: "groupWrite" },
378
+ { key: "writePersistKey", kind: "boolean", group: "groupWrite" }
352
379
  ];
353
380
  var FIELDS = FIELD_SPECS.map((spec) => {
354
381
  if (spec.kind === "number") return numberFieldSpec(spec.key);
@@ -410,7 +437,7 @@ if (typeof document !== "undefined" && !document.querySelector('style[data-plugi
410
437
  tag.textContent = style2;
411
438
  document.head.appendChild(tag);
412
439
  }
413
- var ZoteroSettingsForm_default = { "groupTitle": "iz3HHa_groupTitle", "group": "iz3HHa_group", "fields": "iz3HHa_fields" };
440
+ var ZoteroSettingsForm_default = { "group": "iz3HHa_group", "groupTitle": "iz3HHa_groupTitle", "fields": "iz3HHa_fields" };
414
441
 
415
442
  // src/client/ZoteroSettingsForm.tsx
416
443
  var import_jsx_runtime2 = require("react/jsx-runtime");
@@ -471,7 +498,7 @@ if (typeof document !== "undefined" && !document.querySelector('style[data-plugi
471
498
  tag.textContent = style3;
472
499
  document.head.appendChild(tag);
473
500
  }
474
- var ZoteroSettingsSection_default = { "status": "_33OGJa_status", "failed": "_33OGJa_failed", "page": "_33OGJa_page", "title": "_33OGJa_title", "pending": "_33OGJa_pending", "head": "_33OGJa_head", "description": "_33OGJa_description", "footer": "_33OGJa_footer", "discard": "_33OGJa_discard", "save": "_33OGJa_save" };
501
+ var ZoteroSettingsSection_default = { "status": "_33OGJa_status", "failed": "_33OGJa_failed", "page": "_33OGJa_page", "pending": "_33OGJa_pending", "save": "_33OGJa_save", "head": "_33OGJa_head", "footer": "_33OGJa_footer", "discard": "_33OGJa_discard", "title": "_33OGJa_title", "description": "_33OGJa_description" };
475
502
 
476
503
  // src/client/ZoteroSettingsSection.tsx
477
504
  var import_jsx_runtime3 = require("react/jsx-runtime");
@@ -511,7 +538,7 @@ function ZoteroSettingsSection(props) {
511
538
  }
512
539
 
513
540
  // src/client/components/SourcesTab.tsx
514
- var import_react10 = require("react");
541
+ var import_react11 = require("react");
515
542
 
516
543
  // src/ref-grammar.ts
517
544
  var REF_KEY_SOURCE = "[A-Z0-9]{8}";
@@ -1228,7 +1255,7 @@ function buildSourceWorkspace(blocks, options = {}) {
1228
1255
  }
1229
1256
 
1230
1257
  // src/client/components/workspace/ZoteroWorkspaceView.tsx
1231
- var import_react9 = require("react");
1258
+ var import_react10 = require("react");
1232
1259
 
1233
1260
  // node_modules/clsx/dist/clsx.mjs
1234
1261
  function r(e) {
@@ -1439,15 +1466,15 @@ function exportedRefCountOf(exports) {
1439
1466
  }
1440
1467
 
1441
1468
  // src/client/components/workspace/WorkspaceToolbar.tsx
1442
- var import_react = require("react");
1469
+ var import_react2 = require("react");
1443
1470
  var import_dsh_client_ui_primitives3 = require("@deepseek-ai/dsh-client-ui-primitives");
1444
1471
 
1445
1472
  // src/client/build-info.ts
1446
1473
  function buildVersion() {
1447
- return true ? "0.8.3" : "unknown";
1474
+ return true ? "0.9.0" : "unknown";
1448
1475
  }
1449
1476
  function buildCommit() {
1450
- return true ? "a3ed7f6" : "unknown";
1477
+ return true ? "88341d5" : "unknown";
1451
1478
  }
1452
1479
  function buildInfoOf() {
1453
1480
  return `${buildVersion()} \xB7 ${buildCommit()}`;
@@ -1471,18 +1498,25 @@ if (typeof document !== "undefined" && !document.querySelector('style[data-plugi
1471
1498
  tag.textContent = style4;
1472
1499
  document.head.appendChild(tag);
1473
1500
  }
1474
- var workspace_default = { "filterArrow": "_o1AEW_filterArrow", "summaryLine": "_o1AEW_summaryLine", "lensTabCount": "_o1AEW_lensTabCount", "filterBar": "_o1AEW_filterBar", "listItemMeta": "_o1AEW_listItemMeta", "filterClear": "_o1AEW_filterClear", "passages": "_o1AEW_passages", "workspace": "_o1AEW_workspace", "detailTab": "_o1AEW_detailTab", "statusText": "_o1AEW_statusText", "sectionLabel": "_o1AEW_sectionLabel", "inspectorBody": "_o1AEW_inspectorBody", "detailTabCount": "_o1AEW_detailTabCount", "spacer": "_o1AEW_spacer", "filterArrowLeft": "_o1AEW_filterArrowLeft", "filterArrowRight": "_o1AEW_filterArrowRight", "warning": "_o1AEW_warning", "detailToggle": "_o1AEW_detailToggle", "action": "_o1AEW_action", "emptyWrap": "_o1AEW_emptyWrap", "empty": "_o1AEW_empty", "refresh": "_o1AEW_refresh", "note": "_o1AEW_note", "inspectorMeta": "_o1AEW_inspectorMeta", "diagnosis": "_o1AEW_diagnosis", "menuButton": "_o1AEW_menuButton", "listbox": "_o1AEW_listbox", "inspectorTitle": "_o1AEW_inspectorTitle", "sidebar": "_o1AEW_sidebar", "badge": "_o1AEW_badge", "lensTabActive": "_o1AEW_lensTabActive", "sourceTag": "_o1AEW_sourceTag", "lensTab": "_o1AEW_lensTab", "evidenceEntry": "_o1AEW_evidenceEntry", "inspectorTitleWrap": "_o1AEW_inspectorTitleWrap", "panel": "_o1AEW_panel", "listItemTitle": "_o1AEW_listItemTitle", "section": "_o1AEW_section", "inspectorHead": "_o1AEW_inspectorHead", "starterRow": "_o1AEW_starterRow", "actionRow": "_o1AEW_actionRow", "view": "_o1AEW_view", "availability": "_o1AEW_availability", "emptyNote": "_o1AEW_emptyNote", "passage": "_o1AEW_passage", "detailTabActive": "_o1AEW_detailTabActive", "listItem": "_o1AEW_listItem", "line": "_o1AEW_line", "emptyText": "_o1AEW_emptyText", "listItemSelected": "_o1AEW_listItemSelected", "inspectorTabs": "_o1AEW_inspectorTabs", "exportStack": "_o1AEW_exportStack", "toolbar": "_o1AEW_toolbar", "cardStack": "_o1AEW_cardStack", "passageHead": "_o1AEW_passageHead", "inspector": "_o1AEW_inspector", "backAction": "_o1AEW_backAction", "evidencePage": "_o1AEW_evidencePage", "badges": "_o1AEW_badges", "emptyIcon": "_o1AEW_emptyIcon", "exportsPage": "_o1AEW_exportsPage", "lensBar": "_o1AEW_lensBar" };
1501
+ var workspace_default = { "inspectorMeta": "_o1AEW_inspectorMeta", "warning": "_o1AEW_warning", "inspectorTabs": "_o1AEW_inspectorTabs", "section": "_o1AEW_section", "empty": "_o1AEW_empty", "exportsPage": "_o1AEW_exportsPage", "toolbar": "_o1AEW_toolbar", "sectionLabel": "_o1AEW_sectionLabel", "emptyNote": "_o1AEW_emptyNote", "starterRow": "_o1AEW_starterRow", "evidencePage": "_o1AEW_evidencePage", "summaryLine": "_o1AEW_summaryLine", "backAction": "_o1AEW_backAction", "actionRow": "_o1AEW_actionRow", "detailToggle": "_o1AEW_detailToggle", "listbox": "_o1AEW_listbox", "line": "_o1AEW_line", "badges": "_o1AEW_badges", "emptyWrap": "_o1AEW_emptyWrap", "inspector": "_o1AEW_inspector", "note": "_o1AEW_note", "passage": "_o1AEW_passage", "lensTabActive": "_o1AEW_lensTabActive", "inspectorBody": "_o1AEW_inspectorBody", "inspectorTitle": "_o1AEW_inspectorTitle", "availability": "_o1AEW_availability", "cardStack": "_o1AEW_cardStack", "filterBar": "_o1AEW_filterBar", "filterClear": "_o1AEW_filterClear", "badge": "_o1AEW_badge", "lensTab": "_o1AEW_lensTab", "filterArrowLeft": "_o1AEW_filterArrowLeft", "diagnosis": "_o1AEW_diagnosis", "inspectorHead": "_o1AEW_inspectorHead", "sourceTag": "_o1AEW_sourceTag", "menuButton": "_o1AEW_menuButton", "detailTabCount": "_o1AEW_detailTabCount", "evidenceEntry": "_o1AEW_evidenceEntry", "listItemTitle": "_o1AEW_listItemTitle", "filterArrowRight": "_o1AEW_filterArrowRight", "action": "_o1AEW_action", "listItemMeta": "_o1AEW_listItemMeta", "emptyIcon": "_o1AEW_emptyIcon", "spacer": "_o1AEW_spacer", "detailTabActive": "_o1AEW_detailTabActive", "refresh": "_o1AEW_refresh", "workspace": "_o1AEW_workspace", "panel": "_o1AEW_panel", "sidebar": "_o1AEW_sidebar", "inspectorTitleWrap": "_o1AEW_inspectorTitleWrap", "emptyText": "_o1AEW_emptyText", "passages": "_o1AEW_passages", "filterArrow": "_o1AEW_filterArrow", "passageHead": "_o1AEW_passageHead", "exportStack": "_o1AEW_exportStack", "statusText": "_o1AEW_statusText", "detailTab": "_o1AEW_detailTab", "lensBar": "_o1AEW_lensBar", "view": "_o1AEW_view", "listItem": "_o1AEW_listItem", "lensTabCount": "_o1AEW_lensTabCount", "listItemSelected": "_o1AEW_listItemSelected" };
1475
1502
 
1476
1503
  // src/client/components/workspace/WorkspaceToolbar.tsx
1477
1504
  var import_jsx_runtime4 = require("react/jsx-runtime");
1478
1505
  function WorkspaceToolbar({ connection, onRefresh, t }) {
1479
- const [menuOpen, setMenuOpen] = (0, import_react.useState)(false);
1506
+ const [menuOpen, setMenuOpen] = (0, import_react2.useState)(false);
1480
1507
  const failed = connection.kind === "unavailable" || connection.kind === "remote-error";
1481
1508
  const diagnosis = failed ? connectionDiagnosisOf(connection, t) : "";
1482
1509
  const checkedAt = connection.kind === "connected" || connection.kind === "unavailable" ? connection.checkedAt : void 0;
1483
1510
  const data = connection.kind === "connected" || connection.kind === "unavailable" ? connection.data : void 0;
1484
1511
  const menuItems = [
1485
1512
  ...data?.serverId !== void 0 ? [{ id: "serverId", label: `${t("serverIdLabel")} ${data.serverId}`, disabled: true }] : [],
1513
+ ...data?.write !== void 0 ? [
1514
+ {
1515
+ id: "write",
1516
+ label: `${t("writeLabel")} ${data.write.enabled ? data.write.authorized ? t("writeAuthorizedLabel") : t("writeUnauthorizedLabel") : t("writeDisabledLabel")}`,
1517
+ disabled: true
1518
+ }
1519
+ ] : [],
1486
1520
  ...data?.zoteroVersion !== void 0 ? [
1487
1521
  {
1488
1522
  id: "zotero",
@@ -1566,7 +1600,7 @@ function WorkspaceToolbar({ connection, onRefresh, t }) {
1566
1600
  }
1567
1601
 
1568
1602
  // src/client/components/workspace/SourceSidebar.tsx
1569
- var import_react2 = require("react");
1603
+ var import_react3 = require("react");
1570
1604
  var import_dsh_client_ui_primitives4 = require("@deepseek-ai/dsh-client-ui-primitives");
1571
1605
 
1572
1606
  // src/client/components/workspace/SourceListItem.tsx
@@ -1635,22 +1669,22 @@ function SourceSidebar({
1635
1669
  asideRef,
1636
1670
  t
1637
1671
  }) {
1638
- const optionRefs = (0, import_react2.useRef)([]);
1672
+ const optionRefs = (0, import_react3.useRef)([]);
1639
1673
  optionRefs.current.length = visible.length;
1640
1674
  const asideRefLocal = asideRef;
1641
- const filterBarRef = (0, import_react2.useRef)(null);
1642
- const [filterEdges, setFilterEdges] = (0, import_react2.useState)({ left: false, right: false });
1643
- const updateFilterEdges = (0, import_react2.useCallback)(() => {
1675
+ const filterBarRef = (0, import_react3.useRef)(null);
1676
+ const [filterEdges, setFilterEdges] = (0, import_react3.useState)({ left: false, right: false });
1677
+ const updateFilterEdges = (0, import_react3.useCallback)(() => {
1644
1678
  const el = filterBarRef.current;
1645
1679
  if (el === null) return;
1646
1680
  const left = el.scrollLeft > 1;
1647
1681
  const right = el.scrollLeft < el.scrollWidth - el.clientWidth - 1;
1648
1682
  setFilterEdges((prev) => prev.left === left && prev.right === right ? prev : { left, right });
1649
1683
  }, []);
1650
- (0, import_react2.useLayoutEffect)(() => {
1684
+ (0, import_react3.useLayoutEffect)(() => {
1651
1685
  updateFilterEdges();
1652
1686
  }, [counts, filter, updateFilterEdges]);
1653
- (0, import_react2.useEffect)(() => {
1687
+ (0, import_react3.useEffect)(() => {
1654
1688
  const el = filterBarRef.current;
1655
1689
  if (el === null) return;
1656
1690
  el.addEventListener("scroll", updateFilterEdges);
@@ -1798,10 +1832,10 @@ function SourceSidebar({
1798
1832
  }
1799
1833
 
1800
1834
  // src/client/components/workspace/SourceInspector.tsx
1801
- var import_react8 = require("react");
1835
+ var import_react9 = require("react");
1802
1836
 
1803
1837
  // src/client/components/workspace/SourceOverview.tsx
1804
- var import_react5 = require("react");
1838
+ var import_react6 = require("react");
1805
1839
 
1806
1840
  // src/client/actions/source-actions.ts
1807
1841
  function askDraftOf(ref, t) {
@@ -1812,7 +1846,7 @@ function exportDraftOf(ref, t) {
1812
1846
  }
1813
1847
 
1814
1848
  // src/client/components/CopyButton.tsx
1815
- var import_react3 = require("react");
1849
+ var import_react4 = require("react");
1816
1850
  var import_dsh_client_ui_primitives5 = require("@deepseek-ai/dsh-client-ui-primitives");
1817
1851
 
1818
1852
  // src/client/components/cards.module.css
@@ -1823,14 +1857,14 @@ if (typeof document !== "undefined" && !document.querySelector('style[data-plugi
1823
1857
  tag.textContent = style5;
1824
1858
  document.head.appendChild(tag);
1825
1859
  }
1826
- var cards_default = { "sourceTag": "_27yOoG_sourceTag", "passageHead": "_27yOoG_passageHead", "lineActions": "_27yOoG_lineActions", "exportCode": "_27yOoG_exportCode", "note": "_27yOoG_note", "passages": "_27yOoG_passages", "lineAction": "_27yOoG_lineAction", "exportSectionCount": "_27yOoG_exportSectionCount", "exportCodeLabel": "_27yOoG_exportCodeLabel", "chevron": "_27yOoG_chevron", "link": "_27yOoG_link", "exportSectionActions": "_27yOoG_exportSectionActions", "passage": "_27yOoG_passage", "exportPre": "_27yOoG_exportPre", "exportToggle": "_27yOoG_exportToggle", "exportKeys": "_27yOoG_exportKeys", "exportTitle": "_27yOoG_exportTitle", "exportRow": "_27yOoG_exportRow", "line": "_27yOoG_line", "documentKey": "_27yOoG_documentKey", "card": "_27yOoG_card", "availability": "_27yOoG_availability", "exportCodeHead": "_27yOoG_exportCodeHead", "cardHead": "_27yOoG_cardHead", "unresolvedItems": "_27yOoG_unresolvedItems", "exportSection": "_27yOoG_exportSection", "unresolvedItemsText": "_27yOoG_unresolvedItemsText", "documentTitle": "_27yOoG_documentTitle", "exportHead": "_27yOoG_exportHead", "exportSectionTitle": "_27yOoG_exportSectionTitle", "exportKeysText": "_27yOoG_exportKeysText", "cardTitle": "_27yOoG_cardTitle", "exportSectionHead": "_27yOoG_exportSectionHead", "exportFacts": "_27yOoG_exportFacts", "chevronOpen": "_27yOoG_chevronOpen", "exportBody": "_27yOoG_exportBody" };
1860
+ var cards_default = { "exportSectionTitle": "_27yOoG_exportSectionTitle", "exportFacts": "_27yOoG_exportFacts", "lineAction": "_27yOoG_lineAction", "cardTitle": "_27yOoG_cardTitle", "chevron": "_27yOoG_chevron", "unresolvedItemsText": "_27yOoG_unresolvedItemsText", "exportKeys": "_27yOoG_exportKeys", "line": "_27yOoG_line", "exportBody": "_27yOoG_exportBody", "exportKeysText": "_27yOoG_exportKeysText", "passages": "_27yOoG_passages", "chevronOpen": "_27yOoG_chevronOpen", "exportHead": "_27yOoG_exportHead", "exportTitle": "_27yOoG_exportTitle", "exportPre": "_27yOoG_exportPre", "note": "_27yOoG_note", "exportSectionActions": "_27yOoG_exportSectionActions", "exportSection": "_27yOoG_exportSection", "unresolvedItems": "_27yOoG_unresolvedItems", "passageHead": "_27yOoG_passageHead", "exportSectionCount": "_27yOoG_exportSectionCount", "lineActions": "_27yOoG_lineActions", "card": "_27yOoG_card", "exportSectionHead": "_27yOoG_exportSectionHead", "cardHead": "_27yOoG_cardHead", "exportCode": "_27yOoG_exportCode", "sourceTag": "_27yOoG_sourceTag", "link": "_27yOoG_link", "documentKey": "_27yOoG_documentKey", "exportRow": "_27yOoG_exportRow", "exportCodeLabel": "_27yOoG_exportCodeLabel", "documentTitle": "_27yOoG_documentTitle", "availability": "_27yOoG_availability", "passage": "_27yOoG_passage", "exportToggle": "_27yOoG_exportToggle", "exportCodeHead": "_27yOoG_exportCodeHead" };
1827
1861
 
1828
1862
  // src/client/components/CopyButton.tsx
1829
1863
  var import_jsx_runtime7 = require("react/jsx-runtime");
1830
1864
  function CopyButton({ value, label, copiedLabel, className }) {
1831
- const [copied, setCopied] = (0, import_react3.useState)(false);
1832
- const epoch = (0, import_react3.useRef)(0);
1833
- (0, import_react3.useEffect)(() => {
1865
+ const [copied, setCopied] = (0, import_react4.useState)(false);
1866
+ const epoch = (0, import_react4.useRef)(0);
1867
+ (0, import_react4.useEffect)(() => {
1834
1868
  if (!copied) return;
1835
1869
  const timer = window.setTimeout(() => {
1836
1870
  setCopied(false);
@@ -1857,7 +1891,7 @@ function CopyButton({ value, label, copiedLabel, className }) {
1857
1891
  }
1858
1892
 
1859
1893
  // src/client/components/open/BlockedOpenAction.tsx
1860
- var import_react4 = require("react");
1894
+ var import_react5 = require("react");
1861
1895
  var import_dsh_client_ui_primitives6 = require("@deepseek-ai/dsh-client-ui-primitives");
1862
1896
 
1863
1897
  // src/client/components/open/open.module.css
@@ -1868,13 +1902,13 @@ if (typeof document !== "undefined" && !document.querySelector('style[data-plugi
1868
1902
  tag.textContent = style6;
1869
1903
  document.head.appendChild(tag);
1870
1904
  }
1871
- var open_default = { "srOnly": "_02bwZG_srOnly", "linkWrap": "_02bwZG_linkWrap", "linkIcon": "_02bwZG_linkIcon", "blocked": "_02bwZG_blocked", "link": "_02bwZG_link", "note": "_02bwZG_note", "button": "_02bwZG_button" };
1905
+ var open_default = { "linkWrap": "_02bwZG_linkWrap", "button": "_02bwZG_button", "note": "_02bwZG_note", "linkIcon": "_02bwZG_linkIcon", "blocked": "_02bwZG_blocked", "link": "_02bwZG_link", "srOnly": "_02bwZG_srOnly" };
1872
1906
 
1873
1907
  // src/client/components/open/BlockedOpenAction.tsx
1874
1908
  var import_jsx_runtime8 = require("react/jsx-runtime");
1875
1909
  function BlockedOpenAction({ label, t, className }) {
1876
1910
  const reason = t("provenanceMismatch");
1877
- const reasonId = (0, import_react4.useId)();
1911
+ const reasonId = (0, import_react5.useId)();
1878
1912
  return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_jsx_runtime8.Fragment, { children: [
1879
1913
  /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_dsh_client_ui_primitives6.Tooltip, { label: reason, children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
1880
1914
  "button",
@@ -1948,7 +1982,7 @@ function filterLineOf(itemTypes, tags, t) {
1948
1982
  return parts.length === 0 ? "" : parts.join(" \xB7 ");
1949
1983
  }
1950
1984
  function SourceOverview({ item, t, setDraft }) {
1951
- const [detailOpen, setDetailOpen] = (0, import_react5.useState)(false);
1985
+ const [detailOpen, setDetailOpen] = (0, import_react6.useState)(false);
1952
1986
  const verdict = openVerdictOf(item);
1953
1987
  const selectUrl = selectUrlOf(item.ref);
1954
1988
  const pdfCapability = pdfCapabilityOf(item);
@@ -2129,7 +2163,7 @@ function downloadBlob(text, fileName, mime) {
2129
2163
  }
2130
2164
 
2131
2165
  // src/client/components/ExportDocumentRow.tsx
2132
- var import_react7 = require("react");
2166
+ var import_react8 = require("react");
2133
2167
  var import_dsh_client_ui_primitives9 = require("@deepseek-ai/dsh-client-ui-primitives");
2134
2168
 
2135
2169
  // src/export-items.ts
@@ -2155,7 +2189,7 @@ function citeCommandOf(keys) {
2155
2189
  }
2156
2190
 
2157
2191
  // src/client/components/ExportCard.tsx
2158
- var import_react6 = require("react");
2192
+ var import_react7 = require("react");
2159
2193
  var import_dsh_client_ui_primitives8 = require("@deepseek-ai/dsh-client-ui-primitives");
2160
2194
  var import_jsx_runtime12 = require("react/jsx-runtime");
2161
2195
  function formatLabelOf(format, t) {
@@ -2219,12 +2253,12 @@ function artifactTimeOf(artifact) {
2219
2253
  return `${pad(date5.getHours())}:${pad(date5.getMinutes())}`;
2220
2254
  }
2221
2255
  function ExportCard({ artifact, t }) {
2222
- const [open, setOpen] = (0, import_react6.useState)(false);
2223
- const keys = (0, import_react6.useMemo)(
2256
+ const [open, setOpen] = (0, import_react7.useState)(false);
2257
+ const keys = (0, import_react7.useMemo)(
2224
2258
  () => artifact.format === "bibtex" || artifact.format === "biblatex" ? bibTexKeysOf(artifact.text) : [],
2225
2259
  [artifact.format, artifact.text]
2226
2260
  );
2227
- const citeCommand = (0, import_react6.useMemo)(() => citeCommandOf(keys), [keys]);
2261
+ const citeCommand = (0, import_react7.useMemo)(() => citeCommandOf(keys), [keys]);
2228
2262
  const timeLabel = artifactTimeOf(artifact);
2229
2263
  const download = () => {
2230
2264
  downloadBlob(artifact.text, fileNameOf(artifact), mimeOf(artifact.format));
@@ -2271,8 +2305,8 @@ function ExportCard({ artifact, t }) {
2271
2305
  // src/client/components/ExportDocumentRow.tsx
2272
2306
  var import_jsx_runtime13 = require("react/jsx-runtime");
2273
2307
  function ExportDocumentRow({ doc, t }) {
2274
- const [open, setOpen] = (0, import_react7.useState)(false);
2275
- const citeCommand = (0, import_react7.useMemo)(
2308
+ const [open, setOpen] = (0, import_react8.useState)(false);
2309
+ const citeCommand = (0, import_react8.useMemo)(
2276
2310
  () => doc.key === void 0 ? "" : citeCommandOf([doc.key]),
2277
2311
  [doc.key]
2278
2312
  );
@@ -2410,12 +2444,12 @@ function SourceInspector({
2410
2444
  setDraft,
2411
2445
  t
2412
2446
  }) {
2413
- const [panel, setPanel] = (0, import_react8.useState)("overview");
2414
- const selected = (0, import_react8.useMemo)(
2447
+ const [panel, setPanel] = (0, import_react9.useState)("overview");
2448
+ const selected = (0, import_react9.useMemo)(
2415
2449
  () => workspace.sources.find((item) => item.key === selectedKey),
2416
2450
  [workspace.sources, selectedKey]
2417
2451
  );
2418
- (0, import_react8.useEffect)(() => {
2452
+ (0, import_react9.useEffect)(() => {
2419
2453
  setPanel("overview");
2420
2454
  }, [selectedKey]);
2421
2455
  if (selected === void 0) {
@@ -2691,22 +2725,22 @@ function ZoteroWorkspaceView({
2691
2725
  onRefresh,
2692
2726
  t
2693
2727
  }) {
2694
- const [lens, setLens] = (0, import_react9.useState)("sources");
2695
- const [filter, setFilter] = (0, import_react9.useState)("all");
2696
- const [selection, setSelection] = (0, import_react9.useState)({ key: void 0, focusIndex: 0 });
2697
- const [mobilePane, setMobilePane] = (0, import_react9.useState)("list");
2698
- const [evidenceOpen, setEvidenceOpen] = (0, import_react9.useState)(false);
2699
- const asideRef = (0, import_react9.useRef)(null);
2700
- const counts = (0, import_react9.useMemo)(() => filterCountsOf(workspace.sources), [workspace.sources]);
2701
- const visible = (0, import_react9.useMemo)(
2728
+ const [lens, setLens] = (0, import_react10.useState)("sources");
2729
+ const [filter, setFilter] = (0, import_react10.useState)("all");
2730
+ const [selection, setSelection] = (0, import_react10.useState)({ key: void 0, focusIndex: 0 });
2731
+ const [mobilePane, setMobilePane] = (0, import_react10.useState)("list");
2732
+ const [evidenceOpen, setEvidenceOpen] = (0, import_react10.useState)(false);
2733
+ const asideRef = (0, import_react10.useRef)(null);
2734
+ const counts = (0, import_react10.useMemo)(() => filterCountsOf(workspace.sources), [workspace.sources]);
2735
+ const visible = (0, import_react10.useMemo)(
2702
2736
  () => filterSources(workspace.sources, filter),
2703
2737
  [workspace.sources, filter]
2704
2738
  );
2705
- const selectedKey = (0, import_react9.useMemo)(
2739
+ const selectedKey = (0, import_react10.useMemo)(
2706
2740
  () => effectiveSelectionOf(selection, workspace.sources, visible),
2707
2741
  [selection, workspace.sources, visible]
2708
2742
  );
2709
- const exportedCount = (0, import_react9.useMemo)(() => exportedRefCountOf(workspace.exports), [workspace.exports]);
2743
+ const exportedCount = (0, import_react10.useMemo)(() => exportedRefCountOf(workspace.exports), [workspace.exports]);
2710
2744
  void sessionId;
2711
2745
  if (evidenceOpen) {
2712
2746
  return /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { className: workspace_default.view, "data-conversation-composer-overlay": true, children: [
@@ -2884,22 +2918,22 @@ function collectZoteroCalls(snapshot) {
2884
2918
  return out;
2885
2919
  }
2886
2920
  function useZoteroBlocks(chat) {
2887
- const signature = (0, import_react10.useMemo)(() => sessionSignatureOf(chat), [chat]);
2888
- return (0, import_react10.useMemo)(() => collectZoteroCalls(chat), [signature]);
2921
+ const signature = (0, import_react11.useMemo)(() => sessionSignatureOf(chat), [chat]);
2922
+ return (0, import_react11.useMemo)(() => collectZoteroCalls(chat), [signature]);
2889
2923
  }
2890
2924
  function SourcesTab({ status, t, useSession, useChat, inputActions }) {
2891
2925
  const sessionId = useSession((snapshot) => snapshot.sessionId);
2892
2926
  const chat = useChat((snapshot) => snapshot);
2893
- const [statusState, setStatusState] = (0, import_react10.useState)({ kind: "loading" });
2894
- const [requestId, setRequestId] = (0, import_react10.useState)(0);
2895
- const [serverId, setServerId] = (0, import_react10.useState)(void 0);
2927
+ const [statusState, setStatusState] = (0, import_react11.useState)({ kind: "loading" });
2928
+ const [requestId, setRequestId] = (0, import_react11.useState)(0);
2929
+ const [serverId, setServerId] = (0, import_react11.useState)(void 0);
2896
2930
  const blocks = useZoteroBlocks(chat);
2897
- const workspace = (0, import_react10.useMemo)(
2931
+ const workspace = (0, import_react11.useMemo)(
2898
2932
  () => buildSourceWorkspace(blocks, { currentServerId: serverId }),
2899
2933
  [blocks, serverId]
2900
2934
  );
2901
2935
  const setDraft = inputActions?.setDraft.bind(inputActions);
2902
- (0, import_react10.useEffect)(() => {
2936
+ (0, import_react11.useEffect)(() => {
2903
2937
  if (status === void 0) return;
2904
2938
  const controller = new AbortController();
2905
2939
  setStatusState({ kind: "loading" });
@@ -17471,8 +17505,15 @@ var zoteroStatusSchema = external_exports.object({
17471
17505
  serverId: external_exports.string().optional(),
17472
17506
  schemaVersion: external_exports.string().optional(),
17473
17507
  zoteroVersion: external_exports.string().optional(),
17508
+ write: external_exports.object({ enabled: external_exports.boolean(), authorized: external_exports.boolean() }).strict().optional(),
17474
17509
  diagnosis: external_exports.string()
17475
17510
  }).strict().readonly();
17511
+ var zoteroStatusCodec = {
17512
+ mode: "strict",
17513
+ typeSymbol: "dsh-zotero#ZoteroStatusView",
17514
+ create: () => zoteroStatusSchema,
17515
+ schema: zoteroStatusSchema
17516
+ };
17476
17517
  var ZOTERO_INVOCATIONS = [
17477
17518
  {
17478
17519
  id: "dsh-zotero#zotero/status",
@@ -17481,11 +17522,7 @@ var ZOTERO_INVOCATIONS = [
17481
17522
  method: "status",
17482
17523
  invocation: { kind: "direct" },
17483
17524
  parameters: [],
17484
- result: {
17485
- mode: "strict",
17486
- typeSymbol: "dsh-zotero#ZoteroStatusView",
17487
- schema: zoteroStatusSchema
17488
- }
17525
+ result: zoteroStatusCodec
17489
17526
  }
17490
17527
  ];
17491
17528
 
@@ -17514,6 +17551,13 @@ var en = {
17514
17551
  groupSearch: "Search limits",
17515
17552
  groupOutput: "Output limits",
17516
17553
  groupDefaults: "Export defaults",
17554
+ groupWrite: "Writing",
17555
+ writeEnabled: "Enable write tools",
17556
+ writeEnabledHint: "Registers zotero_create_note, zotero_add_tags, and zotero_add_to_collection, and lets the local provider serve writes. Zotero 10 still gates every write behind its own authorization dialog.",
17557
+ writeConfirm: "Confirm each write",
17558
+ writeConfirmHint: "Shows a plan card and waits for your approval before every write. The Zotero key gate stays in force either way.",
17559
+ writePersistKey: "Store the Zotero write key",
17560
+ writePersistKeyHint: 'Persists an "Always Allow" key from the Zotero dialog into the credentials store, bound to the Zotero instance that issued it. One-time keys are never stored.',
17517
17561
  baseUrl: "Local API base URL",
17518
17562
  baseUrlHint: "Must be a loopback HTTP address (127.0.0.1, localhost, or ::1).",
17519
17563
  provider: "Provider id",
@@ -17569,6 +17613,10 @@ var en = {
17569
17613
  schemaVersionLabel: "Schema version",
17570
17614
  zoteroVersionLabel: "Zotero version",
17571
17615
  serverIdLabel: "Server ID",
17616
+ writeLabel: "Write",
17617
+ writeAuthorizedLabel: "enabled, key stored",
17618
+ writeUnauthorizedLabel: "enabled, no key yet",
17619
+ writeDisabledLabel: "disabled",
17572
17620
  buildInfoLabel: "Build",
17573
17621
  diagnosisLabel: "Diagnosis",
17574
17622
  refresh: "Refresh",
@@ -17700,6 +17748,13 @@ var zh = {
17700
17748
  groupSearch: "\u68C0\u7D22\u9650\u5236",
17701
17749
  groupOutput: "\u8F93\u51FA\u9650\u5236",
17702
17750
  groupDefaults: "\u5BFC\u51FA\u9ED8\u8BA4",
17751
+ groupWrite: "\u5199\u5165",
17752
+ writeEnabled: "\u542F\u7528\u5199\u5165\u5DE5\u5177",
17753
+ writeEnabledHint: "\u6CE8\u518C zotero_create_note\u3001zotero_add_tags\u3001zotero_add_to_collection\uFF0C\u5E76\u5141\u8BB8 local provider \u63D0\u4F9B\u5199\u5165\u80FD\u529B\u3002Zotero 10 \u4ECD\u4F1A\u7528\u5B83\u81EA\u5DF1\u7684\u6388\u6743\u5F39\u7A97\u628A\u5173\u6BCF\u4E00\u6B21\u5199\u5165\u3002",
17754
+ writeConfirm: "\u6BCF\u6B21\u5199\u5165\u524D\u786E\u8BA4",
17755
+ writeConfirmHint: "\u6BCF\u6B21\u5199\u5165\u524D\u5C55\u793A\u8BA1\u5212\u5361\u7247\u5E76\u7B49\u5F85\u4F60\u6279\u51C6\u3002\u65E0\u8BBA\u6B64\u9879\u5F00\u5173\u5982\u4F55\uFF0CZotero \u81EA\u5DF1\u7684 key \u5173\u5361\u59CB\u7EC8\u751F\u6548\u3002",
17756
+ writePersistKey: "\u4FDD\u5B58 Zotero \u5199\u5165\u5BC6\u94A5",
17757
+ writePersistKeyHint: '\u628A Zotero \u6388\u6743\u5F39\u7A97\u91CC"Always Allow"\u7B7E\u53D1\u7684\u5BC6\u94A5\u5B58\u5165\u5BBF\u4E3B\u51ED\u636E\u5E93\uFF0C\u5E76\u7ED1\u5B9A\u5230\u7B7E\u53D1\u5B83\u7684 Zotero \u5B9E\u4F8B\u3002\u4E00\u6B21\u6027\u5BC6\u94A5\u6C38\u4E0D\u843D\u76D8\u3002',
17703
17758
  baseUrl: "Local API \u5730\u5740",
17704
17759
  baseUrlHint: "\u4EC5\u5141\u8BB8\u672C\u673A\u56DE\u73AF HTTP \u5730\u5740\uFF08127.0.0.1\u3001localhost \u6216 ::1\uFF09\u3002",
17705
17760
  provider: "\u63D0\u4F9B\u65B9 ID",
@@ -17754,7 +17809,11 @@ var zh = {
17754
17809
  apiVersionLabel: "API \u7248\u672C",
17755
17810
  schemaVersionLabel: "Schema \u7248\u672C",
17756
17811
  zoteroVersionLabel: "Zotero \u7248\u672C",
17757
- serverIdLabel: "Server ID",
17812
+ serverIdLabel: "\u670D\u52A1\u5668 ID",
17813
+ writeLabel: "\u5199\u5165",
17814
+ writeAuthorizedLabel: "\u5DF2\u542F\u7528\uFF0C\u5BC6\u94A5\u5DF2\u4FDD\u5B58",
17815
+ writeUnauthorizedLabel: "\u5DF2\u542F\u7528\uFF0C\u5C1A\u672A\u6388\u6743",
17816
+ writeDisabledLabel: "\u5DF2\u5173\u95ED",
17758
17817
  buildInfoLabel: "\u6784\u5EFA",
17759
17818
  diagnosisLabel: "\u8BCA\u65AD",
17760
17819
  refresh: "\u5237\u65B0",