@lemoncat7/dsh-knowledge 2.6.1 → 2.7.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.
- package/README.md +20 -0
- package/lib/client.d.ts +3 -0
- package/lib/client.d.ts.map +1 -1
- package/lib/client.js +102 -7
- package/lib/client.js.map +4 -4
- package/lib/extraction.d.ts.map +1 -1
- package/lib/extraction.js +1 -0
- package/lib/extraction.js.map +1 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +14 -1
- package/lib/index.js.map +1 -1
- package/lib/web.js +1 -1
- package/lib/web.js.map +1 -1
- package/lib/writeback/control.d.ts +5 -0
- package/lib/writeback/control.d.ts.map +1 -0
- package/lib/writeback/control.js +39 -0
- package/lib/writeback/control.js.map +1 -0
- package/lib/writeback/live-control.d.ts +5 -0
- package/lib/writeback/live-control.d.ts.map +1 -0
- package/lib/writeback/live-control.js +63 -0
- package/lib/writeback/live-control.js.map +1 -0
- package/lib/writeback/queue.d.ts +27 -1
- package/lib/writeback/queue.d.ts.map +1 -1
- package/lib/writeback/queue.js +97 -7
- package/lib/writeback/queue.js.map +1 -1
- package/lib/writeback/status-client.d.ts +3 -0
- package/lib/writeback/status-client.d.ts.map +1 -1
- package/lib/writeback/status-client.js +30 -4
- package/lib/writeback/status-client.js.map +1 -1
- package/package.json +1 -1
- package/web/app.js +12 -3
- package/web/styles.css +9 -0
- package/web/writeback-live.d.ts +1 -0
- package/web/writeback-live.js +52 -0
- package/web/writeback-workspace.js +76 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../src/writeback/queue.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAA;AAC9D,OAAO,KAAK,EAAE,oBAAoB,EAAgB,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAExF,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,QAAQ,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAA;
|
|
1
|
+
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../src/writeback/queue.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAA;AAC9D,OAAO,KAAK,EAAE,oBAAoB,EAAgB,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAExF,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,QAAQ,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,WAAW,CAAA;IACnE,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,OAAO,CAAA;IAClB,YAAY,CAAC,EAAE,0BAA0B,EAAE,CAAA;IAC3C,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,eAAe,CAAC,EAAE,OAAO,CAAA;CAC1B;AACD,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,YAAY,CAAA;IACtB,WAAW,EAAE,MAAM,CAAA;CACpB;AAID,qBAAa,iBAAkB,SAAQ,KAAK;CAAG;AAE/C,iFAAiF;AACjF,qBAAa,cAAc;IA4BC,OAAO,CAAC,QAAQ,CAAC,OAAO;IAA4G,OAAO,CAAC,QAAQ,CAAC,IAAI;IA3BnL,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAc;IACjC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;IACrC,OAAO,CAAC,KAAK,CAA4B;IACzC,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,UAAU,CAA6B;IAC/C,OAAO,CAAC,SAAS,CAAoB;IACrC,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,OAAO,CAA2B;IAC1C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAwB;IAElD,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IAK3C,IAAI,QAAQ,IAAI,MAAM,CAKrB;IAED,OAAO,CAAC,MAAM;gBAKF,IAAI,EAAE,MAAM,EAAmB,OAAO,EAAE,CAAC,IAAI,EAAE,aAAa,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,eAAe,CAAC,EAAmB,IAAI,GAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAe;IAsBzN,OAAO,CAAC,IAAI,EAAE,aAAa,GAAG,eAAe;IAa7C,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,eAAe;IAOpE,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAWhD,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe;IAYnC,IAAI,CAAC,SAAS,SAAK,EAAE,MAAM,SAAI,EAAE,KAAK,SAAK;;;oBAhHnC,QAAQ,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,WAAW;qBAC1D,MAAM;oBACP,MAAM;uBACH,OAAO;2BACH,0BAA0B,EAAE;4BAC3B,MAAM;wBACV,MAAM;8BACA,OAAO;;;;;;;IAiHzB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe;IAkBpC,OAAO,CAAC,kBAAkB;IAK1B,KAAK,IAAI,IAAI;IAOb,IAAI,SAAS,IAAI,OAAO,CAAyC;IAEjE,OAAO,CAAC,IAAI;IAQZ,OAAO,CAAC,KAAK;YAsBC,KAAK;IAwDnB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAQvB"}
|
package/lib/writeback/queue.js
CHANGED
|
@@ -15,8 +15,31 @@ export class WritebackQueue {
|
|
|
15
15
|
timer;
|
|
16
16
|
active;
|
|
17
17
|
controller;
|
|
18
|
+
activeKey;
|
|
18
19
|
closed = false;
|
|
19
20
|
closing;
|
|
21
|
+
listeners = new Set();
|
|
22
|
+
subscribe(listener) {
|
|
23
|
+
this.listeners.add(listener);
|
|
24
|
+
return () => { this.listeners.delete(listener); };
|
|
25
|
+
}
|
|
26
|
+
get revision() {
|
|
27
|
+
if (this.closed)
|
|
28
|
+
return `${this.owner}:closed`;
|
|
29
|
+
const external = this.db.prepare('PRAGMA data_version').get();
|
|
30
|
+
const local = this.db.prepare('SELECT total_changes() AS changes').get();
|
|
31
|
+
return `${this.owner}:${external.data_version}:${local.changes}`;
|
|
32
|
+
}
|
|
33
|
+
notify() {
|
|
34
|
+
for (const listener of this.listeners) {
|
|
35
|
+
try {
|
|
36
|
+
listener();
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
this.warn(`writeback status notification: ${String(error)}`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
20
43
|
constructor(path, execute, warn = () => { }) {
|
|
21
44
|
this.execute = execute;
|
|
22
45
|
this.warn = warn;
|
|
@@ -33,6 +56,21 @@ export class WritebackQueue {
|
|
|
33
56
|
CREATE INDEX IF NOT EXISTS queue_capacity ON queue_jobs(id) WHERE status!='completed';
|
|
34
57
|
CREATE TABLE IF NOT EXISTS queue_lease(id INTEGER PRIMARY KEY CHECK(id=1), owner TEXT NOT NULL, expires INTEGER NOT NULL);
|
|
35
58
|
INSERT OR IGNORE INTO queue_lease VALUES(1,'',0);`);
|
|
59
|
+
this.db.exec('BEGIN IMMEDIATE');
|
|
60
|
+
try {
|
|
61
|
+
const columns = this.db.prepare('PRAGMA table_info(queue_jobs)').all();
|
|
62
|
+
if (!columns.some(column => column.name === 'cancel_requested'))
|
|
63
|
+
this.db.exec('ALTER TABLE queue_jobs ADD COLUMN cancel_requested INTEGER NOT NULL DEFAULT 0');
|
|
64
|
+
if (!columns.some(column => column.name === 'created_at'))
|
|
65
|
+
this.db.exec('ALTER TABLE queue_jobs ADD COLUMN created_at INTEGER');
|
|
66
|
+
this.db.exec('DROP INDEX IF EXISTS queue_management_order');
|
|
67
|
+
this.db.exec('COMMIT');
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
this.db.exec('ROLLBACK');
|
|
71
|
+
this.db.close();
|
|
72
|
+
throw error;
|
|
73
|
+
}
|
|
36
74
|
}
|
|
37
75
|
enqueue(work) {
|
|
38
76
|
if (this.closed)
|
|
@@ -40,18 +78,19 @@ export class WritebackQueue {
|
|
|
40
78
|
const existing = this.status(work.snapshot.sourceKey);
|
|
41
79
|
if (existing)
|
|
42
80
|
return existing;
|
|
43
|
-
const count = this.db.prepare("SELECT count(*) AS count FROM queue_jobs WHERE status
|
|
81
|
+
const count = this.db.prepare("SELECT count(*) AS count FROM queue_jobs WHERE status NOT IN ('completed','cancelled')").get();
|
|
44
82
|
if (count.count >= 1000)
|
|
45
83
|
throw new Error('回写队列已满,请先处理失败任务;未删除任何未完成记录');
|
|
46
84
|
const view = { status: 'queued', summary: '知识库回写 · 等待回写', retryable: false };
|
|
47
|
-
this.db.prepare('INSERT OR IGNORE INTO queue_jobs(source_key,session_id,payload,status,view) VALUES(
|
|
48
|
-
.run(work.snapshot.sourceKey, work.snapshot.sessionId, JSON.stringify(work), 'queued', JSON.stringify(view));
|
|
85
|
+
this.db.prepare('INSERT OR IGNORE INTO queue_jobs(source_key,session_id,payload,status,view,created_at) VALUES(?,?,?,?,?,?)')
|
|
86
|
+
.run(work.snapshot.sourceKey, work.snapshot.sessionId, JSON.stringify(work), 'queued', JSON.stringify(view), Date.now());
|
|
49
87
|
this.kick();
|
|
50
88
|
return this.status(work.snapshot.sourceKey);
|
|
51
89
|
}
|
|
52
90
|
completeEmpty(sourceKey, sessionId) {
|
|
53
91
|
const view = { status: 'completed', summary: '知识库回写 · 当前回答无可提取内容', retryable: false };
|
|
54
|
-
this.db.prepare('INSERT OR IGNORE INTO queue_jobs(source_key,session_id,status,view) VALUES(
|
|
92
|
+
this.db.prepare('INSERT OR IGNORE INTO queue_jobs(source_key,session_id,status,view,created_at) VALUES(?,?,?,?,?)').run(sourceKey, sessionId, view.status, JSON.stringify(view), Date.now());
|
|
93
|
+
this.notify();
|
|
55
94
|
return this.status(sourceKey);
|
|
56
95
|
}
|
|
57
96
|
status(key) {
|
|
@@ -59,8 +98,9 @@ export class WritebackQueue {
|
|
|
59
98
|
if (!row)
|
|
60
99
|
return undefined;
|
|
61
100
|
const view = JSON.parse(row.view);
|
|
62
|
-
|
|
63
|
-
|
|
101
|
+
const blocker = row.status === 'queued' ? this.db.prepare("SELECT source_key FROM queue_jobs WHERE session_id=? AND id<? AND status NOT IN ('completed','cancelled') ORDER BY id LIMIT 1").get(row.session_id, row.id) : undefined;
|
|
102
|
+
if (blocker) {
|
|
103
|
+
return { ...view, blockedBy: blocker.source_key, summary: '知识库回写 · 等待本会话前一轮回写完成;可在回写任务中重试或取消阻塞项' };
|
|
64
104
|
}
|
|
65
105
|
return view;
|
|
66
106
|
}
|
|
@@ -79,6 +119,42 @@ export class WritebackQueue {
|
|
|
79
119
|
this.kick();
|
|
80
120
|
return this.status(key);
|
|
81
121
|
}
|
|
122
|
+
list(sessionId = '', offset = 0, limit = 50) {
|
|
123
|
+
const where = sessionId ? 'WHERE session_id=?' : '';
|
|
124
|
+
const args = sessionId ? [sessionId] : [];
|
|
125
|
+
const total = this.db.prepare(`SELECT count(*) AS count FROM queue_jobs ${where}`).get(...args).count;
|
|
126
|
+
const rows = this.db.prepare(`SELECT source_key,session_id,attempts,created_at FROM queue_jobs ${where} ORDER BY id DESC LIMIT ? OFFSET ?`).all(...args, limit, offset);
|
|
127
|
+
return { total, items: rows.map(row => ({ sourceKey: row.source_key, sessionId: row.session_id, attempts: row.attempts, createdAt: row.created_at, ...this.status(row.source_key) })) };
|
|
128
|
+
}
|
|
129
|
+
cancel(key) {
|
|
130
|
+
if (this.closed)
|
|
131
|
+
throw new Error('知识库回写队列已关闭');
|
|
132
|
+
this.db.exec('BEGIN IMMEDIATE');
|
|
133
|
+
try {
|
|
134
|
+
const current = this.status(key);
|
|
135
|
+
if (!current)
|
|
136
|
+
throw Object.assign(new Error('回写任务不存在'), { status: 404 });
|
|
137
|
+
if (current.status === 'running') {
|
|
138
|
+
this.db.prepare('UPDATE queue_jobs SET cancel_requested=1,view=? WHERE source_key=?').run(JSON.stringify({ ...current, cancelRequested: true, summary: '知识库回写 · 正在取消,等待当前写入结束' }), key);
|
|
139
|
+
}
|
|
140
|
+
else if (current.status !== 'completed' && current.status !== 'cancelled') {
|
|
141
|
+
this.finishCancellation(key);
|
|
142
|
+
}
|
|
143
|
+
this.db.exec('COMMIT');
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
this.db.exec('ROLLBACK');
|
|
147
|
+
throw error;
|
|
148
|
+
}
|
|
149
|
+
if (this.activeKey === key)
|
|
150
|
+
this.controller?.abort(new Error('用户取消回写'));
|
|
151
|
+
this.kick();
|
|
152
|
+
return this.status(key);
|
|
153
|
+
}
|
|
154
|
+
finishCancellation(key) {
|
|
155
|
+
const view = { status: 'cancelled', summary: '知识库回写 · 已取消;已写入的内容不会撤销', retryable: false };
|
|
156
|
+
this.db.prepare("UPDATE queue_jobs SET status='cancelled',payload=NULL,plan=NULL,view=? WHERE source_key=?").run(JSON.stringify(view), key);
|
|
157
|
+
}
|
|
82
158
|
start() {
|
|
83
159
|
if (this.timer || this.closed)
|
|
84
160
|
return;
|
|
@@ -88,6 +164,8 @@ export class WritebackQueue {
|
|
|
88
164
|
}
|
|
89
165
|
get isRunning() { return this.controller !== undefined; }
|
|
90
166
|
kick() {
|
|
167
|
+
if (!this.closed)
|
|
168
|
+
this.notify();
|
|
91
169
|
if (this.closed || this.active)
|
|
92
170
|
return;
|
|
93
171
|
// A macrotask boundary lets the host finish its turn/channel reply first.
|
|
@@ -104,10 +182,12 @@ export class WritebackQueue {
|
|
|
104
182
|
return undefined;
|
|
105
183
|
}
|
|
106
184
|
// Only the current lease owner may recover work abandoned by a dead process.
|
|
185
|
+
for (const cancelled of this.db.prepare("SELECT source_key FROM queue_jobs WHERE status='running' AND cancel_requested=1").all())
|
|
186
|
+
this.finishCancellation(cancelled.source_key);
|
|
107
187
|
this.db.prepare("UPDATE queue_jobs SET status='queued',next_at=0,view=? WHERE status='running'")
|
|
108
188
|
.run(JSON.stringify({ status: 'queued', summary: '知识库回写 · 中断后等待恢复', retryable: false }));
|
|
109
189
|
const row = this.db.prepare(`SELECT j.* FROM queue_jobs j WHERE j.status='queued' AND j.next_at<=?
|
|
110
|
-
AND NOT EXISTS(SELECT 1 FROM queue_jobs p WHERE p.session_id=j.session_id AND p.id<j.id AND p.status
|
|
190
|
+
AND NOT EXISTS(SELECT 1 FROM queue_jobs p WHERE p.session_id=j.session_id AND p.id<j.id AND p.status NOT IN ('completed','cancelled'))
|
|
111
191
|
ORDER BY j.id LIMIT 1`).get(now);
|
|
112
192
|
if (!row) {
|
|
113
193
|
this.db.exec('COMMIT');
|
|
@@ -131,11 +211,15 @@ export class WritebackQueue {
|
|
|
131
211
|
break;
|
|
132
212
|
const controller = new AbortController();
|
|
133
213
|
this.controller = controller;
|
|
214
|
+
this.activeKey = row.source_key;
|
|
215
|
+
this.notify();
|
|
134
216
|
const assertLease = () => {
|
|
135
217
|
controller.signal.throwIfAborted();
|
|
136
218
|
const lease = this.db.prepare('SELECT owner,expires FROM queue_lease WHERE id=1').get();
|
|
137
219
|
if (lease.owner !== this.owner || lease.expires < Date.now())
|
|
138
220
|
throw new Error('回写工作租约已失效');
|
|
221
|
+
if (this.db.prepare('SELECT 1 FROM queue_jobs WHERE id=? AND cancel_requested=1').get(row.id))
|
|
222
|
+
throw new Error('用户取消回写');
|
|
139
223
|
};
|
|
140
224
|
const renewal = setInterval(() => {
|
|
141
225
|
try {
|
|
@@ -162,6 +246,10 @@ export class WritebackQueue {
|
|
|
162
246
|
const lease = this.db.prepare('SELECT owner FROM queue_lease WHERE id=1').get();
|
|
163
247
|
if (lease.owner !== this.owner)
|
|
164
248
|
return;
|
|
249
|
+
if (this.db.prepare('SELECT 1 FROM queue_jobs WHERE id=? AND cancel_requested=1').get(row.id)) {
|
|
250
|
+
this.finishCancellation(row.source_key);
|
|
251
|
+
continue;
|
|
252
|
+
}
|
|
165
253
|
const message = error instanceof Error ? error.message : String(error);
|
|
166
254
|
const waiting = error instanceof WritebackDeferred;
|
|
167
255
|
const transient = /network|fetch failed|EOF|ECONN|ETIMEDOUT|EAI_AGAIN|SQLITE_BUSY|timeout|timed out|\b(?:429|500|502|503|504)\b|invalid JSON|网络|超时|租约已失效/i.test(message);
|
|
@@ -175,7 +263,9 @@ export class WritebackQueue {
|
|
|
175
263
|
finally {
|
|
176
264
|
clearInterval(renewal);
|
|
177
265
|
this.controller = undefined;
|
|
266
|
+
this.activeKey = undefined;
|
|
178
267
|
this.db.prepare('UPDATE queue_lease SET owner=\'\',expires=0 WHERE owner=?').run(this.owner);
|
|
268
|
+
this.notify();
|
|
179
269
|
}
|
|
180
270
|
}
|
|
181
271
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queue.js","sourceRoot":"","sources":["../../src/writeback/queue.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"queue.js","sourceRoot":"","sources":["../../src/writeback/queue.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,9 +12,12 @@ export declare class WritebackStatusClient {
|
|
|
12
12
|
private failures;
|
|
13
13
|
private value;
|
|
14
14
|
private readError;
|
|
15
|
+
private missing;
|
|
16
|
+
private invalidated;
|
|
15
17
|
constructor(url: string, change: (value: WritebackStatus | undefined, retrying: boolean, readError?: string) => void, fetcher?: typeof fetch);
|
|
16
18
|
setVisible(visible: boolean): void;
|
|
17
19
|
refresh(): void;
|
|
20
|
+
invalidate(): void;
|
|
18
21
|
retry(): void;
|
|
19
22
|
private load;
|
|
20
23
|
dispose(): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status-client.d.ts","sourceRoot":"","sources":["../../src/writeback/status-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAEjD,uFAAuF;AACvF,qBAAa,qBAAqB;
|
|
1
|
+
{"version":3,"file":"status-client.d.ts","sourceRoot":"","sources":["../../src/writeback/status-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAEjD,uFAAuF;AACvF,qBAAa,qBAAqB;IAapB,OAAO,CAAC,QAAQ,CAAC,GAAG;IAAU,OAAO,CAAC,QAAQ,CAAC,MAAM;IAAuF,OAAO,CAAC,QAAQ,CAAC,OAAO;IAZhL,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,KAAK,CAA2C;IACxD,OAAO,CAAC,QAAQ,CAAQ;IACxB,OAAO,CAAC,OAAO,CAAO;IACtB,OAAO,CAAC,QAAQ,CAAQ;IACxB,OAAO,CAAC,QAAQ,CAAI;IACpB,OAAO,CAAC,KAAK,CAA6B;IAC1C,OAAO,CAAC,SAAS,CAAoB;IACrC,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,WAAW,CAAQ;gBAGE,GAAG,EAAE,MAAM,EAAmB,MAAM,EAAE,CAAC,KAAK,EAAE,eAAe,GAAG,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,IAAI,EAAmB,OAAO,GAAE,OAAO,KAA8C;IAEvO,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAMlC,OAAO,IAAI,IAAI;IAKf,UAAU,IAAI,IAAI;IAMlB,KAAK,IAAI,IAAI;YAQC,IAAI;IAkDlB,OAAO,IAAI,IAAI;CAKhB"}
|
|
@@ -11,6 +11,8 @@ export class WritebackStatusClient {
|
|
|
11
11
|
failures = 0;
|
|
12
12
|
value;
|
|
13
13
|
readError;
|
|
14
|
+
missing = false;
|
|
15
|
+
invalidated = false;
|
|
14
16
|
// Browser fetch checks its Window receiver. Never store it as an unbound
|
|
15
17
|
// instance method: this.fetcher() would supply the client as its receiver.
|
|
16
18
|
constructor(url, change, fetcher = (...args) => globalThis.fetch(...args)) {
|
|
@@ -33,6 +35,14 @@ export class WritebackStatusClient {
|
|
|
33
35
|
return;
|
|
34
36
|
void this.load(false);
|
|
35
37
|
}
|
|
38
|
+
invalidate() {
|
|
39
|
+
if (this.disposed || !this.visible)
|
|
40
|
+
return;
|
|
41
|
+
if (this.retrying || this.request && !this.request.signal.aborted)
|
|
42
|
+
this.invalidated = true;
|
|
43
|
+
else
|
|
44
|
+
this.refresh();
|
|
45
|
+
}
|
|
36
46
|
retry() {
|
|
37
47
|
if (this.disposed || this.retrying || !this.value?.retryable)
|
|
38
48
|
return;
|
|
@@ -55,15 +65,27 @@ export class WritebackStatusClient {
|
|
|
55
65
|
const body = await response.json();
|
|
56
66
|
if (this.request !== controller || this.disposed)
|
|
57
67
|
return;
|
|
58
|
-
if (!response.ok && (retry || response.status !== 404))
|
|
68
|
+
if (!response.ok && (retry || response.status !== 404 || String(body.status) !== 'missing'))
|
|
59
69
|
throw new Error(body.error ?? `状态请求失败(HTTP ${response.status})`);
|
|
60
|
-
|
|
70
|
+
if (response.ok && !body.summary)
|
|
71
|
+
throw new Error('无效的回写状态响应');
|
|
61
72
|
if (response.ok && body.summary) {
|
|
73
|
+
this.readError = undefined;
|
|
74
|
+
this.missing = false;
|
|
62
75
|
this.value = body;
|
|
63
76
|
this.failures = 0;
|
|
64
|
-
delay = body.status === 'completed' ? 0 : body.status === 'failed' ? 15_000 : 1_500;
|
|
77
|
+
delay = body.status === 'completed' || body.status === 'cancelled' ? 0 : body.status === 'failed' ? 15_000 : 1_500;
|
|
65
78
|
}
|
|
66
79
|
else {
|
|
80
|
+
// A definitive missing response must invalidate a previously displayed state.
|
|
81
|
+
// Initial absence is normal before turn-stopping has persisted the snapshot.
|
|
82
|
+
if (this.value || this.missing) {
|
|
83
|
+
this.missing = true;
|
|
84
|
+
this.value = undefined;
|
|
85
|
+
this.readError = '当前客户端找不到这轮回写记录;旧等待状态已失效,请在回写任务中核对。';
|
|
86
|
+
}
|
|
87
|
+
else
|
|
88
|
+
this.readError = undefined;
|
|
67
89
|
delay = ++this.failures <= 3 ? 1_500 : 60_000;
|
|
68
90
|
}
|
|
69
91
|
}
|
|
@@ -83,7 +105,11 @@ export class WritebackStatusClient {
|
|
|
83
105
|
if (retry)
|
|
84
106
|
this.retrying = false;
|
|
85
107
|
this.change(this.value, this.retrying, this.readError);
|
|
86
|
-
if (
|
|
108
|
+
if (this.invalidated && this.visible) {
|
|
109
|
+
this.invalidated = false;
|
|
110
|
+
this.refresh();
|
|
111
|
+
}
|
|
112
|
+
else if (delay && this.visible)
|
|
87
113
|
this.timer = setTimeout(() => this.refresh(), delay);
|
|
88
114
|
}
|
|
89
115
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status-client.js","sourceRoot":"","sources":["../../src/writeback/status-client.ts"],"names":[],"mappings":"AAEA,uFAAuF;AACvF,MAAM,OAAO,qBAAqB;
|
|
1
|
+
{"version":3,"file":"status-client.js","sourceRoot":"","sources":["../../src/writeback/status-client.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lemoncat7/dsh-knowledge",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.7.0",
|
|
4
4
|
"description": "Local and remote knowledge bases for DeepSeek Harness, with scoped recall, controlled write-back, and a Web management console",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"deepseek-harness",
|
package/web/app.js
CHANGED
|
@@ -17,6 +17,8 @@ const { installHostThemeBridge } = themeModule
|
|
|
17
17
|
const { actionButton, badge, createToastPresenter, element, interfaceIcon, paneToggleButton } = uiModule
|
|
18
18
|
const { renderMenu: renderDocumentMenu, closeMenus: closeDocumentMenus } = documentActionsModule.createDocumentMenuPresenter(uiModule)
|
|
19
19
|
const readModelCatalog = modelCatalogModule.createModelCatalogLoader()
|
|
20
|
+
const { createWritebackWorkspace } = await import(moduleUrl('writeback-workspace'))
|
|
21
|
+
let writebackWorkspace
|
|
20
22
|
const TOKEN_KEY = 'dsh-knowledge.session-token'
|
|
21
23
|
const TYPES = ['preference', 'fact', 'decision', 'procedure', 'lesson']
|
|
22
24
|
const TYPE_LABELS = { preference: '偏好', fact: '事实', decision: '决策', procedure: '流程', lesson: '经验' }
|
|
@@ -32,7 +34,7 @@ const NOTE_MAX_FILE_SIZE = 64 * 1024 * 1024
|
|
|
32
34
|
const pageParams = new URLSearchParams(location.search)
|
|
33
35
|
const initialKnowledgeBaseId = pageParams.get('knowledgeBaseId')?.trim() || ''
|
|
34
36
|
const initialDocumentId = pageParams.get('documentId')?.trim() || ''
|
|
35
|
-
const initialView = pageParams.get('view')
|
|
37
|
+
const initialView = ['notes', 'writeback'].includes(pageParams.get('view')) ? pageParams.get('view') : 'entries'
|
|
36
38
|
const initialNoteId = pageParams.get('noteId')?.trim() || ''
|
|
37
39
|
const mountContext = {
|
|
38
40
|
sessionId: pageParams.get('sessionId')?.trim() || '',
|
|
@@ -950,6 +952,8 @@ async function loadTokens(signal) {
|
|
|
950
952
|
}
|
|
951
953
|
|
|
952
954
|
function renderShell() {
|
|
955
|
+
writebackWorkspace?.dispose()
|
|
956
|
+
writebackWorkspace = undefined
|
|
953
957
|
closeDocumentMenus()
|
|
954
958
|
releaseNoteEditors()
|
|
955
959
|
captureScrollPosition()
|
|
@@ -960,10 +964,11 @@ function renderShell() {
|
|
|
960
964
|
notes: ['笔记文档', '像本地目录一样整理笔记和资料,并按需关联到知识文档'],
|
|
961
965
|
shares: ['已分享', '管理只读分享链接,也可以导入别人分享的笔记和目录'],
|
|
962
966
|
candidates: ['待审核', '确认 AI 提取结果后再写入知识文档'],
|
|
967
|
+
writeback: ['回写任务', '查看本机队列,处理失败和阻塞的回写'],
|
|
963
968
|
tokens: ['访问管理', '管理其他客户端连接中央知识库的权限'],
|
|
964
969
|
}
|
|
965
970
|
const [title, subtitle] = titles[state.view]
|
|
966
|
-
const viewIndexes = { overview: '00', notes: '01', shares: '02', entries: '03', candidates: '04',
|
|
971
|
+
const viewIndexes = { overview: '00', notes: '01', shares: '02', entries: '03', candidates: '04', writeback: '05', bases: '06', tokens: '07' }
|
|
967
972
|
const shell = element('div', {
|
|
968
973
|
class: 'app-shell', 'data-menu-open': String(state.menuOpen),
|
|
969
974
|
'data-view': state.view, 'data-loading': String(state.loading),
|
|
@@ -1146,7 +1151,7 @@ function renderSidebar() {
|
|
|
1146
1151
|
const pending = state.stats?.candidates.pending
|
|
1147
1152
|
const navGroups = [
|
|
1148
1153
|
['笔记工作区', [['notes', '笔记文档'], ['shares', '已分享']]],
|
|
1149
|
-
['知识工作区', [['entries', '知识文档'], ['candidates', '待审核'], ['bases', '知识库与挂载']]],
|
|
1154
|
+
['知识工作区', [['entries', '知识文档'], ['candidates', '待审核'], ['writeback', '回写任务'], ['bases', '知识库与挂载']]],
|
|
1150
1155
|
['连接', [['tokens', '访问管理']].filter(([id]) => id !== 'tokens' || !state.service.remote)],
|
|
1151
1156
|
].filter(([, items]) => items.length)
|
|
1152
1157
|
let navIndex = 0
|
|
@@ -1172,6 +1177,10 @@ function renderSidebar() {
|
|
|
1172
1177
|
function renderCurrentView() {
|
|
1173
1178
|
if (state.loading) return loadingView(state.view, state.loadingPhase, state.loadingProgress)
|
|
1174
1179
|
if (state.error) return errorView(state.error, () => navigate(state.view))
|
|
1180
|
+
if (state.view === 'writeback') {
|
|
1181
|
+
writebackWorkspace = createWritebackWorkspace({ element, actionButton, openConfirm, sessionId: mountContext.sessionId })
|
|
1182
|
+
return writebackWorkspace.root
|
|
1183
|
+
}
|
|
1175
1184
|
if (state.view === 'overview') return renderOverview()
|
|
1176
1185
|
if (state.view === 'bases') return renderKnowledgeBases()
|
|
1177
1186
|
if (state.view === 'entries') return renderEntries()
|
package/web/styles.css
CHANGED
|
@@ -2028,3 +2028,12 @@ html,
|
|
|
2028
2028
|
@media (forced-colors: active) {
|
|
2029
2029
|
.status-dot, .history-dot { forced-color-adjust: none; }
|
|
2030
2030
|
}
|
|
2031
|
+
/* Durable outbox: reuse workspace controls and surfaces, no animated cards. */
|
|
2032
|
+
.writeback-workspace { display: grid; gap: 12px; min-width: 0; }
|
|
2033
|
+
.writeback-toolbar { display: flex; align-items: center; flex-wrap: wrap; gap: 8px; }
|
|
2034
|
+
.writeback-toolbar input { flex: 1 1 220px; min-width: 0; }
|
|
2035
|
+
.writeback-job-list { display: grid; gap: 12px; }
|
|
2036
|
+
.writeback-job { padding: 12px; border: 1px solid var(--border); border-radius: 12px; min-width: 0; }
|
|
2037
|
+
.writeback-job p { margin: 8px 0; overflow-wrap: anywhere; }
|
|
2038
|
+
.writeback-job-key { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; margin-top: 8px; }
|
|
2039
|
+
.writeback-job pre { white-space: pre-wrap; overflow-wrap: anywhere; }
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export function subscribeWritebackChanges(client: 'conversation-web' | 'management-web', listener: () => void): () => void
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
// Shared by visible conversation turns; the iframe owns its own single channel.
|
|
2
|
+
const groups = new Map()
|
|
3
|
+
export function subscribeWritebackChanges(client, listener) {
|
|
4
|
+
let group = groups.get(client)
|
|
5
|
+
if (!group) {
|
|
6
|
+
const listeners = new Set()
|
|
7
|
+
let stopped = false, request, timer, revision = '', failures = 0
|
|
8
|
+
function emit() { for (const fn of listeners) fn() }
|
|
9
|
+
async function poll() {
|
|
10
|
+
if (stopped || document.hidden) return
|
|
11
|
+
const controller = new AbortController()
|
|
12
|
+
request = controller
|
|
13
|
+
try {
|
|
14
|
+
const response = await fetch(`/knowledge-control/v1/writeback-changes?since=${encodeURIComponent(revision)}`, {
|
|
15
|
+
credentials: 'same-origin', cache: 'no-store', headers: { 'x-dsh-knowledge-client': client },
|
|
16
|
+
signal: AbortSignal.any([controller.signal, AbortSignal.timeout(25000)]),
|
|
17
|
+
})
|
|
18
|
+
if (!response.ok) throw new Error('notification transport unavailable')
|
|
19
|
+
const data = await response.json()
|
|
20
|
+
if (typeof data.revision !== 'string') throw new Error('invalid revision')
|
|
21
|
+
if (stopped || controller.signal.aborted) return
|
|
22
|
+
const changed = revision !== data.revision || failures > 0
|
|
23
|
+
revision = data.revision
|
|
24
|
+
failures = 0
|
|
25
|
+
if (changed) emit()
|
|
26
|
+
} catch { if (!controller.signal.aborted) failures++ }
|
|
27
|
+
finally {
|
|
28
|
+
if (request === controller) {
|
|
29
|
+
request = undefined
|
|
30
|
+
if (!stopped && !document.hidden) timer = setTimeout(poll, failures ? Math.min(30000, 1000 * 2 ** Math.min(failures, 5)) : 0)
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
function resume() {
|
|
35
|
+
clearTimeout(timer)
|
|
36
|
+
request?.abort()
|
|
37
|
+
request = undefined
|
|
38
|
+
if (!document.hidden && !stopped) { emit(); void poll() }
|
|
39
|
+
}
|
|
40
|
+
document.addEventListener('visibilitychange', resume)
|
|
41
|
+
window.addEventListener('online', resume)
|
|
42
|
+
group = { listeners, close() { stopped = true; clearTimeout(timer); request?.abort(); document.removeEventListener('visibilitychange', resume); window.removeEventListener('online', resume) } }
|
|
43
|
+
groups.set(client, group)
|
|
44
|
+
// Let the first caller attach before the initial revision arrives.
|
|
45
|
+
timer = setTimeout(poll, 0)
|
|
46
|
+
}
|
|
47
|
+
group.listeners.add(listener)
|
|
48
|
+
return () => {
|
|
49
|
+
group.listeners.delete(listener)
|
|
50
|
+
if (!group.listeners.size) { group.close(); groups.delete(client) }
|
|
51
|
+
}
|
|
52
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { subscribeWritebackChanges } from './writeback-live.js'
|
|
2
|
+
/** Local outbox UI. Poll only this view, never reload the knowledge workspace. */
|
|
3
|
+
export function createWritebackWorkspace({ element, actionButton, openConfirm, sessionId = '' }) {
|
|
4
|
+
const labels = { queued: '排队中', running: '回写中', failed: '失败', completed: '已完成', cancelled: '已取消' }
|
|
5
|
+
let disposed = false, timer, request, offset = 0, busy = false, previous = '', dirty = false
|
|
6
|
+
const message = element('p', { role: 'status' })
|
|
7
|
+
const list = element('div', { class: 'writeback-job-list' })
|
|
8
|
+
const page = element('span', {})
|
|
9
|
+
const filter = element('input', { class: 'input', value: sessionId, placeholder: '按会话编号筛选(可留空)', 'aria-label': '会话编号' })
|
|
10
|
+
const previousButton = actionButton('上一页', () => { offset = Math.max(0, offset - 50); previous = ''; void refresh() }, 'ghost small')
|
|
11
|
+
const nextButton = actionButton('下一页', () => { offset += 50; previous = ''; void refresh() }, 'ghost small')
|
|
12
|
+
const root = element('section', { class: 'writeback-workspace' },
|
|
13
|
+
element('p', {}, '本机回写队列。同一会话按顺序执行;网络中断会自动重试,连续失败可手动重试或取消。取消不会撤销已经写入的内容。'),
|
|
14
|
+
element('div', { class: 'writeback-toolbar' }, filter, actionButton('筛选', () => { sessionId = filter.value.trim(); offset = 0; previous = ''; void refresh() }, 'small'), actionButton('刷新', () => { void refresh() }, 'ghost small')),
|
|
15
|
+
message, list, element('div', { class: 'writeback-toolbar' }, previousButton, page, nextButton))
|
|
16
|
+
async function fetchJson(params, method = 'GET', signal) {
|
|
17
|
+
const response = await fetch(`/knowledge-control/v1/writeback-jobs?${params}`, { method, credentials: 'same-origin', headers: { 'x-dsh-knowledge-client': 'management-web' }, signal: signal ? AbortSignal.any([signal, AbortSignal.timeout(15000)]) : AbortSignal.timeout(15000) })
|
|
18
|
+
const data = await response.json().catch(() => ({}))
|
|
19
|
+
if (!response.ok) throw new Error(data.error || `读取回写队列失败(${response.status})`)
|
|
20
|
+
return data
|
|
21
|
+
}
|
|
22
|
+
async function operate(job, action) {
|
|
23
|
+
if (busy || disposed) return
|
|
24
|
+
busy = true
|
|
25
|
+
request?.abort()
|
|
26
|
+
message.textContent = action === 'cancel' ? '正在请求取消…' : '正在提交重试…'
|
|
27
|
+
try {
|
|
28
|
+
const result = await fetchJson(new URLSearchParams({ action, sourceKey: job.sourceKey }), 'POST')
|
|
29
|
+
message.textContent = result.summary
|
|
30
|
+
previous = ''
|
|
31
|
+
} catch (error) { message.textContent = error.message }
|
|
32
|
+
finally { busy = false; if (!disposed) void refresh(true) }
|
|
33
|
+
}
|
|
34
|
+
function renderJob(job) {
|
|
35
|
+
const actions = element('div', { class: 'writeback-toolbar' })
|
|
36
|
+
if (job.status === 'failed') actions.append(actionButton('重试', () => operate(job, 'retry'), 'small'))
|
|
37
|
+
if (['queued', 'running', 'failed'].includes(job.status)) actions.append(actionButton(job.cancelRequested ? '取消中…' : '取消回写', () => openConfirm({ title: '取消这条回写?', message: '取消后不再重试,并允许后续轮次继续。已经写入的内容不会撤销。', confirmLabel: '取消回写', danger: true, onConfirm: () => operate(job, 'cancel') }), 'ghost small', { disabled: job.cancelRequested }))
|
|
38
|
+
return element('article', { class: 'writeback-job' },
|
|
39
|
+
element('div', { class: 'writeback-toolbar' }, element('strong', {}, labels[job.status] || job.status), element('span', {}, `已尝试 ${job.attempts} 次`), actions),
|
|
40
|
+
element('div', { class: 'writeback-job-key', title: job.sourceKey }, job.sourceKey),
|
|
41
|
+
job.createdAt ? element('p', {}, '创建于 ', element('time', { datetime: new Date(job.createdAt).toISOString() }, new Date(job.createdAt).toLocaleString())) : element('p', {}, '历史任务 · 创建时间未记录'),
|
|
42
|
+
element('p', {}, job.summary),
|
|
43
|
+
job.blockedBy ? element('p', {}, `阻塞任务:${job.blockedBy}`) : null,
|
|
44
|
+
job.nextAttemptAt ? element('p', {}, `下次自动重试:${new Date(job.nextAttemptAt).toLocaleString()}`) : null,
|
|
45
|
+
job.error ? element('details', {}, element('summary', {}, '失败原因'), element('pre', {}, job.error)) : null,
|
|
46
|
+
...(job.destinations || []).map(destination => element('p', {}, `${destination.knowledgeBaseName} / ${destination.documentTitle || destination.documentId || ''}`)))
|
|
47
|
+
}
|
|
48
|
+
async function refresh(preserveMessage = false) {
|
|
49
|
+
clearTimeout(timer)
|
|
50
|
+
if (disposed || document.hidden || busy) return
|
|
51
|
+
dirty = false
|
|
52
|
+
request?.abort()
|
|
53
|
+
const controller = new AbortController()
|
|
54
|
+
request = controller
|
|
55
|
+
try {
|
|
56
|
+
const data = await fetchJson(new URLSearchParams({ sessionId, offset: String(offset) }), 'GET', controller.signal)
|
|
57
|
+
if (disposed || request !== controller) return
|
|
58
|
+
const fingerprint = JSON.stringify(data)
|
|
59
|
+
if (fingerprint !== previous) {
|
|
60
|
+
list.replaceChildren(...(data.items.length ? data.items.map(renderJob) : [element('p', {}, '没有回写任务')]))
|
|
61
|
+
previous = fingerprint
|
|
62
|
+
}
|
|
63
|
+
page.textContent = `共 ${data.total} 条 · 第 ${Math.floor(offset / 50) + 1} 页`
|
|
64
|
+
previousButton.disabled = offset === 0
|
|
65
|
+
nextButton.disabled = offset + 50 >= data.total
|
|
66
|
+
if (!preserveMessage) message.textContent = '状态自动更新'
|
|
67
|
+
} catch (error) { if (!controller.signal.aborted && !disposed) message.textContent = `${error.message};将自动重连` }
|
|
68
|
+
finally { if (request === controller) { request = undefined; if (!disposed) timer = setTimeout(() => refresh(), dirty ? 0 : 5000) } }
|
|
69
|
+
}
|
|
70
|
+
function visibility() { if (document.hidden) { clearTimeout(timer); request?.abort() } else void refresh() }
|
|
71
|
+
document.addEventListener('visibilitychange', visibility)
|
|
72
|
+
window.addEventListener('online', visibility)
|
|
73
|
+
const unsubscribeChanges = subscribeWritebackChanges('management-web', () => { if (request || busy) dirty = true; else void refresh() })
|
|
74
|
+
void refresh()
|
|
75
|
+
return { root, dispose() { disposed = true; clearTimeout(timer); request?.abort(); unsubscribeChanges(); document.removeEventListener('visibilitychange', visibility); window.removeEventListener('online', visibility) } }
|
|
76
|
+
}
|