dsh-zotero 0.8.2 → 0.8.3
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.en.md +11 -8
- package/README.md +11 -8
- package/lib/ask.d.ts +27 -1
- package/lib/ask.d.ts.map +1 -1
- package/lib/ask.js +61 -19
- package/lib/ask.js.map +1 -1
- package/lib/client.js +22 -12
- package/lib/client.js.map +2 -2
- package/lib/command.d.ts.map +1 -1
- package/lib/command.js +2 -1
- package/lib/command.js.map +1 -1
- package/lib/concurrency.d.ts +40 -1
- package/lib/concurrency.d.ts.map +1 -1
- package/lib/concurrency.js +101 -1
- package/lib/concurrency.js.map +1 -1
- package/lib/config.d.ts +1 -1
- package/lib/config.d.ts.map +1 -1
- package/lib/constants.d.ts +35 -0
- package/lib/constants.d.ts.map +1 -1
- package/lib/constants.js +35 -0
- package/lib/constants.js.map +1 -1
- package/lib/contract.d.ts +2 -0
- package/lib/contract.d.ts.map +1 -1
- package/lib/contract.js +1 -0
- package/lib/contract.js.map +1 -1
- package/lib/errors.d.ts +13 -1
- package/lib/errors.d.ts.map +1 -1
- package/lib/errors.js +17 -0
- package/lib/errors.js.map +1 -1
- package/lib/evidence.d.ts +9 -4
- package/lib/evidence.d.ts.map +1 -1
- package/lib/evidence.js +13 -6
- package/lib/evidence.js.map +1 -1
- package/lib/http-client.d.ts +34 -0
- package/lib/http-client.d.ts.map +1 -1
- package/lib/http-client.js +132 -13
- package/lib/http-client.js.map +1 -1
- package/lib/local/changes-domain.d.ts +37 -10
- package/lib/local/changes-domain.d.ts.map +1 -1
- package/lib/local/changes-domain.js +385 -114
- package/lib/local/changes-domain.js.map +1 -1
- package/lib/local/limits.d.ts +1 -1
- package/lib/local/limits.d.ts.map +1 -1
- package/lib/local/provider.d.ts.map +1 -1
- package/lib/local/provider.js +2 -1
- package/lib/local/provider.js.map +1 -1
- package/lib/local/retrieve.d.ts +9 -2
- package/lib/local/retrieve.d.ts.map +1 -1
- package/lib/local/retrieve.js +184 -41
- package/lib/local/retrieve.js.map +1 -1
- package/lib/local/search-domain.d.ts.map +1 -1
- package/lib/local/search-domain.js +25 -26
- package/lib/local/search-domain.js.map +1 -1
- package/lib/prompt.js +1 -1
- package/lib/prompt.js.map +1 -1
- package/lib/remote.d.ts.map +1 -1
- package/lib/remote.js +1 -0
- package/lib/remote.js.map +1 -1
- package/lib/search-text.d.ts +29 -0
- package/lib/search-text.d.ts.map +1 -0
- package/lib/search-text.js +79 -0
- package/lib/search-text.js.map +1 -0
- package/lib/service.d.ts +9 -0
- package/lib/service.d.ts.map +1 -1
- package/lib/service.js +9 -0
- package/lib/service.js.map +1 -1
- package/lib/tools/attachment.d.ts.map +1 -1
- package/lib/tools/attachment.js +20 -3
- package/lib/tools/attachment.js.map +1 -1
- package/lib/tools/browse.js +1 -1
- package/lib/tools/browse.js.map +1 -1
- package/lib/tools/changes.d.ts +177 -14
- package/lib/tools/changes.d.ts.map +1 -1
- package/lib/tools/changes.js +218 -62
- package/lib/tools/changes.js.map +1 -1
- package/lib/tools/children.js +1 -1
- package/lib/tools/children.js.map +1 -1
- package/lib/tools/export.js +1 -1
- package/lib/tools/export.js.map +1 -1
- package/lib/tools/get.js +1 -1
- package/lib/tools/get.js.map +1 -1
- package/lib/tools/retrieve.d.ts +57 -1
- package/lib/tools/retrieve.d.ts.map +1 -1
- package/lib/tools/retrieve.js +92 -18
- package/lib/tools/retrieve.js.map +1 -1
- package/lib/tools/search.js +1 -1
- package/lib/tools/search.js.map +1 -1
- package/lib/tools/validate.d.ts +7 -0
- package/lib/tools/validate.d.ts.map +1 -1
- package/lib/tools/validate.js +13 -0
- package/lib/tools/validate.js.map +1 -1
- package/lib/types.d.ts +191 -8
- package/lib/types.d.ts.map +1 -1
- package/package.json +1 -1
package/README.en.md
CHANGED
|
@@ -78,20 +78,23 @@ The agent calls tools step by step during a conversation. Each result becomes co
|
|
|
78
78
|
|
|
79
79
|
```text
|
|
80
80
|
User: Find papers about Risk
|
|
81
|
-
Agent → zotero_search(query: "Risk",
|
|
81
|
+
Agent → zotero_search(query: "Risk", itemTypes: ["journalArticle"])
|
|
82
82
|
5 matches; user picks the first 3
|
|
83
83
|
|
|
84
84
|
User: What does the first one's abstract say?
|
|
85
|
-
Agent → zotero_get(ref:
|
|
86
|
-
Returns the full abstract
|
|
85
|
+
Agent → zotero_get(ref: "zotero://user/0/item/ABCD1234")
|
|
86
|
+
Returns the full abstract (the standard model carries it)
|
|
87
87
|
|
|
88
88
|
User: Find the methodology discussion in this paper
|
|
89
|
-
Agent → zotero_retrieve(
|
|
89
|
+
Agent → zotero_retrieve(ref: "zotero://user/0/item/ABCD1234", query: "methodology",
|
|
90
|
+
sources: ["fulltext", "note"])
|
|
90
91
|
Returns relevant passages with page numbers
|
|
91
92
|
|
|
92
93
|
User: Export all three as BibTeX
|
|
93
|
-
Agent → zotero_export(refs: [
|
|
94
|
-
|
|
94
|
+
Agent → zotero_export(refs: ["zotero://user/0/item/ABCD1234",
|
|
95
|
+
"zotero://user/0/item/EFGH5678",
|
|
96
|
+
"zotero://user/0/item/IJKL9012"], format: "bibtex")
|
|
97
|
+
Generates BibTeX entries; the UI can download them, the model reads the same text
|
|
95
98
|
```
|
|
96
99
|
|
|
97
100
|
More examples in [Features](docs/features.md).
|
|
@@ -101,7 +104,7 @@ More examples in [Features](docs/features.md).
|
|
|
101
104
|
- **Read-only library**: all operations are reads; items, notes, tags, and collections are unchanged
|
|
102
105
|
- **Loopback only**: network requests go only to `127.0.0.1:23119`
|
|
103
106
|
- **Evidence ranking is term-based**: BM25 ranks passages by query-term frequency match
|
|
104
|
-
- **Exports are static text**:
|
|
107
|
+
- **Exports are static text**: the tool returns text, and that is what the model reads; the Zotero panel offers one-click copy or file download (`.bib`, `.ris`, `.json`), so nothing has to be retyped
|
|
105
108
|
- **Full-text evidence depends on Zotero's index**: unindexed PDFs yield no full-text passages
|
|
106
109
|
- **Attachment depth depends on the harness**: `zotero_attachment` returns the file location; reading the PDF further needs a matching host capability
|
|
107
110
|
|
|
@@ -120,7 +123,7 @@ More examples in [Features](docs/features.md).
|
|
|
120
123
|
| [Getting Started](docs/getting-started.md) | Installation, prerequisites, first verification |
|
|
121
124
|
| [Features](docs/features.md) | Sources panel, chat integration, evidence, exports |
|
|
122
125
|
| [Tool Reference](docs/tools.md) | Parameters, return values, error codes for all 8 tools |
|
|
123
|
-
| [Configuration](docs/configuration.md) |
|
|
126
|
+
| [Configuration](docs/configuration.md) | 22 config fields, defaults, hot-reload |
|
|
124
127
|
| [Architecture](docs/architecture.md) | Data flow, layer responsibilities, design boundaries |
|
|
125
128
|
| [Development](docs/development.md) | Build, test, local development |
|
|
126
129
|
| [Troubleshooting](docs/troubleshooting.md) | 11 common issues with symptoms and fixes |
|
package/README.md
CHANGED
|
@@ -78,20 +78,23 @@ Agent 在对话中根据用户需求逐步调用工具,每次调用的结果
|
|
|
78
78
|
|
|
79
79
|
```text
|
|
80
80
|
用户:帮我找 Risk 相关的论文
|
|
81
|
-
Agent → zotero_search(query: "Risk",
|
|
81
|
+
Agent → zotero_search(query: "Risk", itemTypes: ["journalArticle"])
|
|
82
82
|
5 篇匹配结果,用户选择前 3 篇
|
|
83
83
|
|
|
84
84
|
用户:第一篇的摘要说了什么?
|
|
85
|
-
Agent → zotero_get(ref:
|
|
86
|
-
|
|
85
|
+
Agent → zotero_get(ref: "zotero://user/0/item/ABCD1234")
|
|
86
|
+
返回摘要全文(标准模型已含 abstract)
|
|
87
87
|
|
|
88
88
|
用户:这篇里关于方法论的讨论,帮我找出来
|
|
89
|
-
Agent → zotero_retrieve(
|
|
89
|
+
Agent → zotero_retrieve(ref: "zotero://user/0/item/ABCD1234", query: "methodology",
|
|
90
|
+
sources: ["fulltext", "note"])
|
|
90
91
|
返回相关段落,带页码和来源
|
|
91
92
|
|
|
92
93
|
用户:把这三篇导出为 BibTeX
|
|
93
|
-
Agent → zotero_export(refs: [
|
|
94
|
-
|
|
94
|
+
Agent → zotero_export(refs: ["zotero://user/0/item/ABCD1234",
|
|
95
|
+
"zotero://user/0/item/EFGH5678",
|
|
96
|
+
"zotero://user/0/item/IJKL9012"], format: "bibtex")
|
|
97
|
+
生成 BibTeX 条目;界面可下载,模型读到同样的文本
|
|
95
98
|
```
|
|
96
99
|
|
|
97
100
|
更多示例见 [功能概览](docs/features.md)。
|
|
@@ -101,7 +104,7 @@ Agent → zotero_export(refs: [1,2,3], format: "bibtex")
|
|
|
101
104
|
- **只读文献库**:所有操作均为读取,不修改条目、笔记、标签或分类
|
|
102
105
|
- **只访问本机**:网络请求仅发往 `127.0.0.1:23119`
|
|
103
106
|
- **证据排序是词项相关性**:基于 BM25,按查询词与 passage 的词频匹配度排序
|
|
104
|
-
-
|
|
107
|
+
- **导出是静态文本**:工具以文本形式返回,模型读到的就是它;Zotero 面板可以一键复制或下载文件(`.bib` / `.ris` / `.json` 等),不需要手动誊抄
|
|
105
108
|
- **全文证据依赖 Zotero 索引**:未索引的 PDF 无法提供全文段落
|
|
106
109
|
- **附件深度取决于宿主**:`zotero_attachment` 返回文件位置,继续阅读 PDF 需要宿主具备对应能力
|
|
107
110
|
|
|
@@ -120,7 +123,7 @@ Agent → zotero_export(refs: [1,2,3], format: "bibtex")
|
|
|
120
123
|
| [快速上手](docs/getting-started.md) | 安装、前置条件、首次验证 |
|
|
121
124
|
| [功能概览](docs/features.md) | 来源面板、对话集成、证据提取、导出 |
|
|
122
125
|
| [工具参考](docs/tools.md) | 全部 8 个工具的参数、返回值、错误码 |
|
|
123
|
-
| [配置](docs/configuration.md) |
|
|
126
|
+
| [配置](docs/configuration.md) | 22 个配置字段、默认值、热更新 |
|
|
124
127
|
| [架构](docs/architecture.md) | 数据流、各层职责、设计边界 |
|
|
125
128
|
| [开发指南](docs/development.md) | 构建、测试、本地开发 |
|
|
126
129
|
| [问题排查](docs/troubleshooting.md) | 11 个常见问题的症状和处理 |
|
package/lib/ask.d.ts
CHANGED
|
@@ -17,11 +17,37 @@ import type { Context } from '@deepseek-ai/cordis';
|
|
|
17
17
|
import { type ToolRunContext } from '@deepseek-ai/dsh-tools';
|
|
18
18
|
/** The parts of a tool execution `withConnectivityAsk` needs. */
|
|
19
19
|
type ConnectivityAskExec = Pick<ToolRunContext, 'signal' | 'agent'>;
|
|
20
|
+
/**
|
|
21
|
+
* One recovery conversation per failure kind, owned by one plugin instance.
|
|
22
|
+
*
|
|
23
|
+
* Tool calls run concurrently, and a Zotero that is down fails all of them:
|
|
24
|
+
* five parallel reads used to put five identical cards in front of the user,
|
|
25
|
+
* each one demanding the same answer. The gate keeps one ask per failure
|
|
26
|
+
* kind in flight and lets every other caller wait on that same answer, so a
|
|
27
|
+
* single card decides for all of them — and each caller then retries, or
|
|
28
|
+
* does not, on its own request. The entry is dropped as soon as the question
|
|
29
|
+
* settles, so a later failure asks again instead of inheriting a stale
|
|
30
|
+
* answer.
|
|
31
|
+
*/
|
|
32
|
+
export declare class ConnectivityRecovery {
|
|
33
|
+
private readonly asking;
|
|
34
|
+
/**
|
|
35
|
+
* Answer one failure kind, asking only when no question for it is in
|
|
36
|
+
* flight.
|
|
37
|
+
* @param code - the failure kind the question belongs to.
|
|
38
|
+
* @param question - the ask to run when this caller is the first; resolves
|
|
39
|
+
* true when the user chose to retry.
|
|
40
|
+
* @returns the answer this caller acts on.
|
|
41
|
+
*/
|
|
42
|
+
ask(code: string, question: () => Promise<boolean>): Promise<boolean>;
|
|
43
|
+
}
|
|
20
44
|
/**
|
|
21
45
|
* Run one Zotero request; on a connectivity failure, ask the user how to
|
|
22
46
|
* proceed and retry at most once when they choose the recommended action.
|
|
23
47
|
* @param ctx - the plugin context; the question service is looked up
|
|
24
48
|
* optionally, so headless compositions skip the ask.
|
|
49
|
+
* @param recovery - the instance's recovery gate: callers that failed the
|
|
50
|
+
* same way share one question instead of stacking identical cards.
|
|
25
51
|
* @param exec - the tool execution (signal and agent) the failure belongs to.
|
|
26
52
|
* @param run - the request to attempt; must be re-runnable with identical
|
|
27
53
|
* arguments, because the retry path calls it a second time.
|
|
@@ -30,6 +56,6 @@ type ConnectivityAskExec = Pick<ToolRunContext, 'signal' | 'agent'>;
|
|
|
30
56
|
* does not choose to retry, the question itself fails, or the retry
|
|
31
57
|
* fails again.
|
|
32
58
|
*/
|
|
33
|
-
export declare function withConnectivityAsk<T>(ctx: Context, exec: ConnectivityAskExec, run: () => Promise<T>): Promise<T>;
|
|
59
|
+
export declare function withConnectivityAsk<T>(ctx: Context, recovery: ConnectivityRecovery, exec: ConnectivityAskExec, run: () => Promise<T>): Promise<T>;
|
|
34
60
|
export {};
|
|
35
61
|
//# sourceMappingURL=ask.d.ts.map
|
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;
|
|
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"}
|
package/lib/ask.js
CHANGED
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
*/
|
|
16
16
|
import { HarnessError } from '@deepseek-ai/dsh-llm';
|
|
17
17
|
import { TOOL_ABORTED } from '@deepseek-ai/dsh-tools';
|
|
18
|
+
import { ZOTERO_LOCAL_API_VERSION } from './constants.js';
|
|
18
19
|
import { ZOTERO_API_DISABLED, ZOTERO_API_VERSION, ZOTERO_NOT_RUNNING, ZOTERO_TIMEOUT, ZoteroError, } from './errors.js';
|
|
19
20
|
/** The connectivity failure codes that warrant asking the user how to proceed. */
|
|
20
21
|
const ASK_WORTHY_CODES = [
|
|
@@ -46,10 +47,10 @@ const FAILURE_SPECS = {
|
|
|
46
47
|
abortDescription: ABORT_DESCRIPTION,
|
|
47
48
|
},
|
|
48
49
|
[ZOTERO_API_VERSION]: {
|
|
49
|
-
header: 'Zotero
|
|
50
|
-
question:
|
|
51
|
-
detail:
|
|
52
|
-
retryLabel: 'I
|
|
50
|
+
header: 'Zotero and this plugin share no API version',
|
|
51
|
+
question: `The running Zotero does not implement local API version ${ZOTERO_LOCAL_API_VERSION}, which this plugin requires.`,
|
|
52
|
+
detail: `Upgrade Zotero to a version whose local API supports version ${ZOTERO_LOCAL_API_VERSION} — or update dsh-zotero if the running Zotero is newer than this plugin line.`,
|
|
53
|
+
retryLabel: 'I fixed the version, retry (Recommended)',
|
|
53
54
|
retryDescription: RETRY_DESCRIPTION,
|
|
54
55
|
abortLabel: ABORT_LABEL,
|
|
55
56
|
abortDescription: ABORT_DESCRIPTION,
|
|
@@ -79,11 +80,49 @@ function questionOf(spec) {
|
|
|
79
80
|
],
|
|
80
81
|
};
|
|
81
82
|
}
|
|
83
|
+
/**
|
|
84
|
+
* One recovery conversation per failure kind, owned by one plugin instance.
|
|
85
|
+
*
|
|
86
|
+
* Tool calls run concurrently, and a Zotero that is down fails all of them:
|
|
87
|
+
* five parallel reads used to put five identical cards in front of the user,
|
|
88
|
+
* each one demanding the same answer. The gate keeps one ask per failure
|
|
89
|
+
* kind in flight and lets every other caller wait on that same answer, so a
|
|
90
|
+
* single card decides for all of them — and each caller then retries, or
|
|
91
|
+
* does not, on its own request. The entry is dropped as soon as the question
|
|
92
|
+
* settles, so a later failure asks again instead of inheriting a stale
|
|
93
|
+
* answer.
|
|
94
|
+
*/
|
|
95
|
+
export class ConnectivityRecovery {
|
|
96
|
+
asking = new Map();
|
|
97
|
+
/**
|
|
98
|
+
* Answer one failure kind, asking only when no question for it is in
|
|
99
|
+
* flight.
|
|
100
|
+
* @param code - the failure kind the question belongs to.
|
|
101
|
+
* @param question - the ask to run when this caller is the first; resolves
|
|
102
|
+
* true when the user chose to retry.
|
|
103
|
+
* @returns the answer this caller acts on.
|
|
104
|
+
*/
|
|
105
|
+
async ask(code, question) {
|
|
106
|
+
const inFlight = this.asking.get(code);
|
|
107
|
+
if (inFlight !== undefined)
|
|
108
|
+
return await inFlight;
|
|
109
|
+
const answer = question();
|
|
110
|
+
this.asking.set(code, answer);
|
|
111
|
+
try {
|
|
112
|
+
return await answer;
|
|
113
|
+
}
|
|
114
|
+
finally {
|
|
115
|
+
this.asking.delete(code);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
82
119
|
/**
|
|
83
120
|
* Run one Zotero request; on a connectivity failure, ask the user how to
|
|
84
121
|
* proceed and retry at most once when they choose the recommended action.
|
|
85
122
|
* @param ctx - the plugin context; the question service is looked up
|
|
86
123
|
* optionally, so headless compositions skip the ask.
|
|
124
|
+
* @param recovery - the instance's recovery gate: callers that failed the
|
|
125
|
+
* same way share one question instead of stacking identical cards.
|
|
87
126
|
* @param exec - the tool execution (signal and agent) the failure belongs to.
|
|
88
127
|
* @param run - the request to attempt; must be re-runnable with identical
|
|
89
128
|
* arguments, because the retry path calls it a second time.
|
|
@@ -92,7 +131,7 @@ function questionOf(spec) {
|
|
|
92
131
|
* does not choose to retry, the question itself fails, or the retry
|
|
93
132
|
* fails again.
|
|
94
133
|
*/
|
|
95
|
-
export async function withConnectivityAsk(ctx, exec, run) {
|
|
134
|
+
export async function withConnectivityAsk(ctx, recovery, exec, run) {
|
|
96
135
|
try {
|
|
97
136
|
return await run();
|
|
98
137
|
}
|
|
@@ -103,14 +142,23 @@ export async function withConnectivityAsk(ctx, exec, run) {
|
|
|
103
142
|
if (questions === undefined)
|
|
104
143
|
throw error;
|
|
105
144
|
const spec = FAILURE_SPECS[error.code];
|
|
106
|
-
let
|
|
145
|
+
let retry;
|
|
107
146
|
try {
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
147
|
+
retry = await recovery.ask(error.code, async () => {
|
|
148
|
+
const request = {
|
|
149
|
+
questions: [questionOf(spec)],
|
|
150
|
+
...(exec.agent !== undefined ? { agent: exec.agent } : {}),
|
|
151
|
+
signal: exec.signal,
|
|
152
|
+
};
|
|
153
|
+
const answer = await questions.ask(request);
|
|
154
|
+
const answerItem = answer.answers.find((item) => item.id === 'zotero-failure');
|
|
155
|
+
// Matched by label string because the answer protocol carries only
|
|
156
|
+
// selected labels (no stable option ids); the labels are code
|
|
157
|
+
// constants (FAILURE_SPECS), never i18n copy, so a rename breaks the
|
|
158
|
+
// build's contract visibly in one place. Revisit if the protocol
|
|
159
|
+
// gains option ids.
|
|
160
|
+
return (answerItem?.selected ?? []).includes(spec.retryLabel);
|
|
161
|
+
});
|
|
114
162
|
}
|
|
115
163
|
catch {
|
|
116
164
|
// A failed question (no provider, aborted ask, delegated caller) must
|
|
@@ -119,13 +167,7 @@ export async function withConnectivityAsk(ctx, exec, run) {
|
|
|
119
167
|
throw new HarnessError('tool call aborted', TOOL_ABORTED);
|
|
120
168
|
throw error;
|
|
121
169
|
}
|
|
122
|
-
|
|
123
|
-
const selected = answerItem?.selected ?? [];
|
|
124
|
-
// Matched by label string because the answer protocol carries only
|
|
125
|
-
// selected labels (no stable option ids); the labels are code constants
|
|
126
|
-
// (FAILURE_SPECS), never i18n copy, so a rename breaks the build's
|
|
127
|
-
// contract visibly in one place. Revisit if the protocol gains option ids.
|
|
128
|
-
if (!selected.includes(spec.retryLabel))
|
|
170
|
+
if (!retry)
|
|
129
171
|
throw error;
|
|
130
172
|
// Outside the catch: a second failure propagates as-is, never re-asking.
|
|
131
173
|
return await run();
|
package/lib/ask.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ask.js","sourceRoot":"","sources":["../src/ask.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACnD,OAAO,EAAE,YAAY,EAAuB,MAAM,wBAAwB,CAAA;AAO1E,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,cAAc,EACd,WAAW,GACZ,MAAM,aAAa,CAAA;AAEpB,kFAAkF;AAClF,MAAM,gBAAgB,GAAG;IACvB,kBAAkB;IAClB,mBAAmB;IACnB,kBAAkB;IAClB,cAAc;CACN,CAAA;AAkBV,MAAM,WAAW,GAAG,kBAAkB,CAAA;AACtC,MAAM,iBAAiB,GAAG,kEAAkE,CAAA;AAC5F,MAAM,iBAAiB,GAAG,gDAAgD,CAAA;AAE1E,MAAM,aAAa,GAAuC;IACxD,CAAC,kBAAkB,CAAC,EAAE;QACpB,MAAM,EAAE,uBAAuB;QAC/B,QAAQ,EAAE,yEAAyE;QACnF,MAAM,EACJ,yHAAyH;QAC3H,UAAU,EAAE,uCAAuC;QACnD,gBAAgB,EAAE,iBAAiB;QACnC,UAAU,EAAE,WAAW;QACvB,gBAAgB,EAAE,iBAAiB;KACpC;IACD,CAAC,mBAAmB,CAAC,EAAE;QACrB,MAAM,EAAE,8BAA8B;QACtC,QAAQ,EAAE,6DAA6D;QACvE,MAAM,EACJ,8GAA8G;QAChH,UAAU,EAAE,8CAA8C;QAC1D,gBAAgB,EAAE,iBAAiB;QACnC,UAAU,EAAE,WAAW;QACvB,gBAAgB,EAAE,iBAAiB;KACpC;IACD,CAAC,kBAAkB,CAAC,EAAE;QACpB,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"ask.js","sourceRoot":"","sources":["../src/ask.ts"],"names":[],"mappings":"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"}
|
package/lib/client.js
CHANGED
|
@@ -40,7 +40,7 @@ if (typeof document !== "undefined" && !document.querySelector('style[data-plugi
|
|
|
40
40
|
tag.textContent = style;
|
|
41
41
|
document.head.appendChild(tag);
|
|
42
42
|
}
|
|
43
|
-
var fields_default = { "
|
|
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
44
|
|
|
45
45
|
// src/client/fields.tsx
|
|
46
46
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
@@ -410,7 +410,7 @@ if (typeof document !== "undefined" && !document.querySelector('style[data-plugi
|
|
|
410
410
|
tag.textContent = style2;
|
|
411
411
|
document.head.appendChild(tag);
|
|
412
412
|
}
|
|
413
|
-
var ZoteroSettingsForm_default = { "
|
|
413
|
+
var ZoteroSettingsForm_default = { "groupTitle": "iz3HHa_groupTitle", "group": "iz3HHa_group", "fields": "iz3HHa_fields" };
|
|
414
414
|
|
|
415
415
|
// src/client/ZoteroSettingsForm.tsx
|
|
416
416
|
var import_jsx_runtime2 = require("react/jsx-runtime");
|
|
@@ -471,7 +471,7 @@ if (typeof document !== "undefined" && !document.querySelector('style[data-plugi
|
|
|
471
471
|
tag.textContent = style3;
|
|
472
472
|
document.head.appendChild(tag);
|
|
473
473
|
}
|
|
474
|
-
var ZoteroSettingsSection_default = { "
|
|
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" };
|
|
475
475
|
|
|
476
476
|
// src/client/ZoteroSettingsSection.tsx
|
|
477
477
|
var import_jsx_runtime3 = require("react/jsx-runtime");
|
|
@@ -1444,10 +1444,10 @@ var import_dsh_client_ui_primitives3 = require("@deepseek-ai/dsh-client-ui-primi
|
|
|
1444
1444
|
|
|
1445
1445
|
// src/client/build-info.ts
|
|
1446
1446
|
function buildVersion() {
|
|
1447
|
-
return true ? "0.8.
|
|
1447
|
+
return true ? "0.8.3" : "unknown";
|
|
1448
1448
|
}
|
|
1449
1449
|
function buildCommit() {
|
|
1450
|
-
return true ? "
|
|
1450
|
+
return true ? "a3ed7f6" : "unknown";
|
|
1451
1451
|
}
|
|
1452
1452
|
function buildInfoOf() {
|
|
1453
1453
|
return `${buildVersion()} \xB7 ${buildCommit()}`;
|
|
@@ -1471,7 +1471,7 @@ if (typeof document !== "undefined" && !document.querySelector('style[data-plugi
|
|
|
1471
1471
|
tag.textContent = style4;
|
|
1472
1472
|
document.head.appendChild(tag);
|
|
1473
1473
|
}
|
|
1474
|
-
var workspace_default = { "
|
|
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" };
|
|
1475
1475
|
|
|
1476
1476
|
// src/client/components/workspace/WorkspaceToolbar.tsx
|
|
1477
1477
|
var import_jsx_runtime4 = require("react/jsx-runtime");
|
|
@@ -1483,6 +1483,13 @@ function WorkspaceToolbar({ connection, onRefresh, t }) {
|
|
|
1483
1483
|
const data = connection.kind === "connected" || connection.kind === "unavailable" ? connection.data : void 0;
|
|
1484
1484
|
const menuItems = [
|
|
1485
1485
|
...data?.serverId !== void 0 ? [{ id: "serverId", label: `${t("serverIdLabel")} ${data.serverId}`, disabled: true }] : [],
|
|
1486
|
+
...data?.zoteroVersion !== void 0 ? [
|
|
1487
|
+
{
|
|
1488
|
+
id: "zotero",
|
|
1489
|
+
label: `${t("zoteroVersionLabel")} ${data.zoteroVersion}`,
|
|
1490
|
+
disabled: true
|
|
1491
|
+
}
|
|
1492
|
+
] : [],
|
|
1486
1493
|
...data?.apiVersion !== void 0 ? [{ id: "api", label: `${t("apiVersionLabel")} ${data.apiVersion}`, disabled: true }] : [],
|
|
1487
1494
|
...data?.schemaVersion !== void 0 ? [
|
|
1488
1495
|
{
|
|
@@ -1816,7 +1823,7 @@ if (typeof document !== "undefined" && !document.querySelector('style[data-plugi
|
|
|
1816
1823
|
tag.textContent = style5;
|
|
1817
1824
|
document.head.appendChild(tag);
|
|
1818
1825
|
}
|
|
1819
|
-
var cards_default = { "
|
|
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" };
|
|
1820
1827
|
|
|
1821
1828
|
// src/client/components/CopyButton.tsx
|
|
1822
1829
|
var import_jsx_runtime7 = require("react/jsx-runtime");
|
|
@@ -1861,7 +1868,7 @@ if (typeof document !== "undefined" && !document.querySelector('style[data-plugi
|
|
|
1861
1868
|
tag.textContent = style6;
|
|
1862
1869
|
document.head.appendChild(tag);
|
|
1863
1870
|
}
|
|
1864
|
-
var open_default = { "
|
|
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" };
|
|
1865
1872
|
|
|
1866
1873
|
// src/client/components/open/BlockedOpenAction.tsx
|
|
1867
1874
|
var import_jsx_runtime8 = require("react/jsx-runtime");
|
|
@@ -17463,6 +17470,7 @@ var zoteroStatusSchema = external_exports.object({
|
|
|
17463
17470
|
apiVersion: external_exports.string().optional(),
|
|
17464
17471
|
serverId: external_exports.string().optional(),
|
|
17465
17472
|
schemaVersion: external_exports.string().optional(),
|
|
17473
|
+
zoteroVersion: external_exports.string().optional(),
|
|
17466
17474
|
diagnosis: external_exports.string()
|
|
17467
17475
|
}).strict().readonly();
|
|
17468
17476
|
var ZOTERO_INVOCATIONS = [
|
|
@@ -17542,8 +17550,8 @@ var en = {
|
|
|
17542
17550
|
maxExportRefsHint: "Refs one zotero_export call accepts at most.",
|
|
17543
17551
|
maxBrowseResults: "Browse result cap",
|
|
17544
17552
|
maxBrowseResultsHint: "Items one zotero_browse call returns at most.",
|
|
17545
|
-
maxChangesResults: "Changes
|
|
17546
|
-
maxChangesResultsHint: "Entries one zotero_changes call lists per resource at most.",
|
|
17553
|
+
maxChangesResults: "Changes listing cap",
|
|
17554
|
+
maxChangesResultsHint: "Entries one zotero_changes call lists per resource at most \u2014 a display cap; the diff itself always reads the whole range, and totals reports the true counts.",
|
|
17547
17555
|
defaultStyle: "Default citation style",
|
|
17548
17556
|
defaultStyleHint: "CSL style id for citation and bibliography formats (e.g. apa).",
|
|
17549
17557
|
defaultLocale: "Default locale",
|
|
@@ -17559,6 +17567,7 @@ var en = {
|
|
|
17559
17567
|
detailsLabel: "Diagnostics",
|
|
17560
17568
|
apiVersionLabel: "API version",
|
|
17561
17569
|
schemaVersionLabel: "Schema version",
|
|
17570
|
+
zoteroVersionLabel: "Zotero version",
|
|
17562
17571
|
serverIdLabel: "Server ID",
|
|
17563
17572
|
buildInfoLabel: "Build",
|
|
17564
17573
|
diagnosisLabel: "Diagnosis",
|
|
@@ -17727,8 +17736,8 @@ var zh = {
|
|
|
17727
17736
|
maxExportRefsHint: "zotero_export \u5355\u6B21\u8C03\u7528\u6700\u591A\u63A5\u53D7\u7684 refs \u6570\u3002",
|
|
17728
17737
|
maxBrowseResults: "\u6D4F\u89C8\u7ED3\u679C\u4E0A\u9650",
|
|
17729
17738
|
maxBrowseResultsHint: "zotero_browse \u5355\u6B21\u8C03\u7528\u6700\u591A\u8FD4\u56DE\u7684\u6761\u76EE\u6570\u3002",
|
|
17730
|
-
maxChangesResults: "\u53D8\u66F4\
|
|
17731
|
-
maxChangesResultsHint: "zotero_changes \u5355\u6B21\u8C03\u7528\u6BCF\u79CD\u8D44\u6E90\u6700\u591A\u5217\u51FA\u7684\u6761\u76EE\u6570\u3002",
|
|
17739
|
+
maxChangesResults: "\u53D8\u66F4\u5217\u8868\u4E0A\u9650",
|
|
17740
|
+
maxChangesResultsHint: "zotero_changes \u5355\u6B21\u8C03\u7528\u6BCF\u79CD\u8D44\u6E90\u6700\u591A\u5217\u51FA\u7684\u6761\u76EE\u6570\uFF08\u4EC5\u5F71\u54CD\u5448\u73B0\uFF09\uFF1A\u5DEE\u5F02\u59CB\u7EC8\u6574\u6279\u8BFB\u53D6\uFF0Ctotals \u7ED9\u51FA\u771F\u5B9E\u6761\u6570\u3002",
|
|
17732
17741
|
defaultStyle: "\u9ED8\u8BA4\u5F15\u6587\u6837\u5F0F",
|
|
17733
17742
|
defaultStyleHint: "citation/bibliography \u683C\u5F0F\u7684 CSL \u6837\u5F0F id\uFF08\u5982 apa\uFF09\u3002",
|
|
17734
17743
|
defaultLocale: "\u9ED8\u8BA4\u533A\u57DF\u8BBE\u7F6E",
|
|
@@ -17744,6 +17753,7 @@ var zh = {
|
|
|
17744
17753
|
detailsLabel: "\u8BCA\u65AD\u8BE6\u60C5",
|
|
17745
17754
|
apiVersionLabel: "API \u7248\u672C",
|
|
17746
17755
|
schemaVersionLabel: "Schema \u7248\u672C",
|
|
17756
|
+
zoteroVersionLabel: "Zotero \u7248\u672C",
|
|
17747
17757
|
serverIdLabel: "Server ID",
|
|
17748
17758
|
buildInfoLabel: "\u6784\u5EFA",
|
|
17749
17759
|
diagnosisLabel: "\u8BCA\u65AD",
|