dsh-web-search-pro 0.1.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/LICENSE +21 -0
- package/LOGIN.md +67 -0
- package/README.md +123 -0
- package/cordis.patch.yml +21 -0
- package/lib/browser-service.d.ts +68 -0
- package/lib/browser-service.js +8 -0
- package/lib/browser-service.js.map +1 -0
- package/lib/config.d.ts +91 -0
- package/lib/config.js +72 -0
- package/lib/config.js.map +1 -0
- package/lib/deps.d.ts +34 -0
- package/lib/deps.js +90 -0
- package/lib/deps.js.map +1 -0
- package/lib/engines.d.ts +71 -0
- package/lib/engines.js +562 -0
- package/lib/engines.js.map +1 -0
- package/lib/extract.d.ts +40 -0
- package/lib/extract.js +243 -0
- package/lib/extract.js.map +1 -0
- package/lib/fetch.d.ts +42 -0
- package/lib/fetch.js +175 -0
- package/lib/fetch.js.map +1 -0
- package/lib/index.d.ts +23 -0
- package/lib/index.js +117 -0
- package/lib/index.js.map +1 -0
- package/lib/memory-cache.d.ts +18 -0
- package/lib/memory-cache.js +42 -0
- package/lib/memory-cache.js.map +1 -0
- package/lib/platform-search.d.ts +34 -0
- package/lib/platform-search.js +61 -0
- package/lib/platform-search.js.map +1 -0
- package/lib/playwright.d.ts +71 -0
- package/lib/playwright.js +165 -0
- package/lib/playwright.js.map +1 -0
- package/lib/router.d.ts +66 -0
- package/lib/router.js +332 -0
- package/lib/router.js.map +1 -0
- package/lib/store.d.ts +117 -0
- package/lib/store.js +223 -0
- package/lib/store.js.map +1 -0
- package/lib/tools.d.ts +28 -0
- package/lib/tools.js +542 -0
- package/lib/tools.js.map +1 -0
- package/lib/util.d.ts +73 -0
- package/lib/util.js +220 -0
- package/lib/util.js.map +1 -0
- package/package.json +59 -0
- package/scripts/save-login.mjs +77 -0
package/lib/store.js
ADDED
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQLite persistence for web-search-pro (node:sqlite, zero dependencies).
|
|
3
|
+
* Stores search queries + results, fetched page snapshots, and user-extended
|
|
4
|
+
* extraction rules (userscript-style). All methods are synchronous; writes are
|
|
5
|
+
* small and batched per call.
|
|
6
|
+
* @module web-search-pro/store
|
|
7
|
+
*/
|
|
8
|
+
import { DatabaseSync } from 'node:sqlite';
|
|
9
|
+
import fs from 'node:fs';
|
|
10
|
+
import path from 'node:path';
|
|
11
|
+
import { uid } from "./util.js";
|
|
12
|
+
const SCHEMA = `
|
|
13
|
+
CREATE TABLE IF NOT EXISTS queries (
|
|
14
|
+
id TEXT PRIMARY KEY,
|
|
15
|
+
kind TEXT NOT NULL,
|
|
16
|
+
query TEXT,
|
|
17
|
+
engine TEXT,
|
|
18
|
+
platform TEXT,
|
|
19
|
+
url TEXT,
|
|
20
|
+
status TEXT NOT NULL,
|
|
21
|
+
ts TEXT NOT NULL,
|
|
22
|
+
detail TEXT
|
|
23
|
+
);
|
|
24
|
+
CREATE TABLE IF NOT EXISTS results (
|
|
25
|
+
id TEXT PRIMARY KEY,
|
|
26
|
+
query_id TEXT NOT NULL,
|
|
27
|
+
rank INTEGER NOT NULL,
|
|
28
|
+
url TEXT NOT NULL,
|
|
29
|
+
title TEXT,
|
|
30
|
+
snippet TEXT,
|
|
31
|
+
published TEXT,
|
|
32
|
+
engine TEXT,
|
|
33
|
+
extra TEXT
|
|
34
|
+
);
|
|
35
|
+
CREATE TABLE IF NOT EXISTS pages (
|
|
36
|
+
id TEXT PRIMARY KEY,
|
|
37
|
+
url TEXT UNIQUE NOT NULL,
|
|
38
|
+
title TEXT,
|
|
39
|
+
text TEXT,
|
|
40
|
+
html_path TEXT,
|
|
41
|
+
screenshot_path TEXT,
|
|
42
|
+
status INTEGER,
|
|
43
|
+
fetched_at TEXT NOT NULL,
|
|
44
|
+
source TEXT
|
|
45
|
+
);
|
|
46
|
+
CREATE TABLE IF NOT EXISTS rules (
|
|
47
|
+
hostname TEXT PRIMARY KEY,
|
|
48
|
+
content TEXT NOT NULL,
|
|
49
|
+
remove TEXT,
|
|
50
|
+
created_at TEXT NOT NULL,
|
|
51
|
+
updated_at TEXT NOT NULL
|
|
52
|
+
);
|
|
53
|
+
CREATE INDEX IF NOT EXISTS idx_results_query ON results(query_id);
|
|
54
|
+
CREATE INDEX IF NOT EXISTS idx_queries_ts ON queries(ts);
|
|
55
|
+
CREATE INDEX IF NOT EXISTS idx_queries_kind ON queries(kind);
|
|
56
|
+
CREATE INDEX IF NOT EXISTS idx_pages_url ON pages(url);
|
|
57
|
+
`;
|
|
58
|
+
export class Store {
|
|
59
|
+
dbPath;
|
|
60
|
+
db;
|
|
61
|
+
constructor(dbPath) {
|
|
62
|
+
this.dbPath = dbPath;
|
|
63
|
+
fs.mkdirSync(path.dirname(dbPath), { recursive: true });
|
|
64
|
+
this.db = new DatabaseSync(dbPath);
|
|
65
|
+
this.db.exec('PRAGMA journal_mode = WAL');
|
|
66
|
+
this.db.exec(SCHEMA);
|
|
67
|
+
}
|
|
68
|
+
close() {
|
|
69
|
+
try {
|
|
70
|
+
this.db.close();
|
|
71
|
+
}
|
|
72
|
+
catch { /* already closed */ }
|
|
73
|
+
}
|
|
74
|
+
/** Record one operation (search / fetch / platform / snapshot). Returns its id. */
|
|
75
|
+
recordQuery(input) {
|
|
76
|
+
const id = input.id ?? uid();
|
|
77
|
+
const ts = new Date().toISOString();
|
|
78
|
+
this.db.prepare('INSERT OR REPLACE INTO queries (id, kind, query, engine, platform, url, status, ts, detail) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)').run(id, input.kind, input.query ?? null, input.engine ?? null, input.platform ?? null, input.url ?? null, input.status, ts, input.detail ?? null);
|
|
79
|
+
return id;
|
|
80
|
+
}
|
|
81
|
+
/** Look up a fresh cached search by (engine, normalized query). */
|
|
82
|
+
getCachedSearch(engine, normQuery, ttlSeconds) {
|
|
83
|
+
const row = this.db.prepare(`SELECT id, detail FROM queries
|
|
84
|
+
WHERE kind = 'search' AND engine = ? AND query = ? AND status = 'ok'
|
|
85
|
+
AND ts > ? ORDER BY ts DESC LIMIT 1`).get(engine, normQuery, new Date(Date.now() - ttlSeconds * 1000).toISOString());
|
|
86
|
+
if (!row)
|
|
87
|
+
return undefined;
|
|
88
|
+
return { id: row.id, ...row.detail != null ? { detail: row.detail } : {} };
|
|
89
|
+
}
|
|
90
|
+
recordResults(queryId, sources, engine) {
|
|
91
|
+
const stmt = this.db.prepare('INSERT OR REPLACE INTO results (id, query_id, rank, url, title, snippet, published, engine, extra) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)');
|
|
92
|
+
sources.forEach((s, i) => {
|
|
93
|
+
stmt.run(uid(), queryId, i, s.url, s.title ?? null, s.snippet ?? null, s.publishedAt ?? null, engine, s.extra ?? null);
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
resultsForQuery(queryId) {
|
|
97
|
+
return this.db.prepare('SELECT * FROM results WHERE query_id = ? ORDER BY rank ASC').all(queryId);
|
|
98
|
+
}
|
|
99
|
+
/** Fresh page snapshot by URL, or undefined. */
|
|
100
|
+
getPage(url, ttlSeconds) {
|
|
101
|
+
const row = this.db.prepare(`SELECT * FROM pages WHERE url = ? AND fetched_at > ? ORDER BY fetched_at DESC LIMIT 1`).get(url, new Date(Date.now() - ttlSeconds * 1000).toISOString());
|
|
102
|
+
return row;
|
|
103
|
+
}
|
|
104
|
+
savePage(input) {
|
|
105
|
+
this.db.prepare(`INSERT OR REPLACE INTO pages (id, url, title, text, html_path, screenshot_path, status, fetched_at, source)
|
|
106
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(uid(), input.url, input.title ?? null, input.text ?? null, input.htmlPath ?? null, input.screenshotPath ?? null, input.status ?? null, new Date().toISOString(), input.source ?? null);
|
|
107
|
+
}
|
|
108
|
+
listQueries(opts) {
|
|
109
|
+
const limit = Math.min(Math.max(opts.limit ?? 20, 1), 200);
|
|
110
|
+
const clauses = [];
|
|
111
|
+
const params = [];
|
|
112
|
+
const kind = opts.kind;
|
|
113
|
+
if (kind) {
|
|
114
|
+
clauses.push('kind = ?');
|
|
115
|
+
params.push(kind);
|
|
116
|
+
}
|
|
117
|
+
const q = opts.query;
|
|
118
|
+
if (q) {
|
|
119
|
+
clauses.push('(query LIKE ? OR url LIKE ?)');
|
|
120
|
+
params.push(`%${q}%`, `%${q}%`);
|
|
121
|
+
}
|
|
122
|
+
const engine = opts.engine;
|
|
123
|
+
if (engine) {
|
|
124
|
+
clauses.push('engine = ?');
|
|
125
|
+
params.push(engine);
|
|
126
|
+
}
|
|
127
|
+
const platform = opts.platform;
|
|
128
|
+
if (platform) {
|
|
129
|
+
clauses.push('platform = ?');
|
|
130
|
+
params.push(platform);
|
|
131
|
+
}
|
|
132
|
+
const where = clauses.length ? 'WHERE ' + clauses.join(' AND ') : '';
|
|
133
|
+
return this.db.prepare(`SELECT * FROM queries ${where} ORDER BY ts DESC LIMIT ${limit}`).all(...params);
|
|
134
|
+
}
|
|
135
|
+
clearCache(opts) {
|
|
136
|
+
const cutoff = opts.olderThanDays
|
|
137
|
+
? new Date(Date.now() - opts.olderThanDays * 86400_000).toISOString()
|
|
138
|
+
: undefined;
|
|
139
|
+
let removed = { queries: 0, results: 0, pages: 0 };
|
|
140
|
+
if (opts.olderThanDays === undefined) {
|
|
141
|
+
const engine = opts.engine;
|
|
142
|
+
if (engine) {
|
|
143
|
+
const ids = this.db.prepare(`SELECT id FROM queries WHERE engine = ?`).all(engine);
|
|
144
|
+
for (const r of ids)
|
|
145
|
+
this.removeQuery(r.id);
|
|
146
|
+
removed.queries = ids.length;
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
const q = this.db.prepare('SELECT COUNT(*) AS c FROM queries').get();
|
|
150
|
+
const r = this.db.prepare('SELECT COUNT(*) AS c FROM results').get();
|
|
151
|
+
const p = this.db.prepare('SELECT COUNT(*) AS c FROM pages').get();
|
|
152
|
+
this.db.exec('DELETE FROM results; DELETE FROM queries; DELETE FROM pages');
|
|
153
|
+
removed = { queries: q.c, results: r.c, pages: p.c };
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
const engine = opts.engine;
|
|
158
|
+
const since = cutoff ?? new Date(0).toISOString();
|
|
159
|
+
const rows = engine
|
|
160
|
+
? this.db.prepare(`SELECT id FROM queries WHERE ts < ? AND engine = ?`).all(since, engine)
|
|
161
|
+
: this.db.prepare(`SELECT id FROM queries WHERE ts < ?`).all(since);
|
|
162
|
+
for (const row of rows)
|
|
163
|
+
this.removeQuery(row.id);
|
|
164
|
+
const p = this.db.prepare(`SELECT COUNT(*) AS c FROM pages WHERE fetched_at < ?`).get(since);
|
|
165
|
+
this.db.prepare('DELETE FROM pages WHERE fetched_at < ?').run(since);
|
|
166
|
+
removed = { queries: rows.length, results: rows.length, pages: p.c };
|
|
167
|
+
}
|
|
168
|
+
return removed;
|
|
169
|
+
}
|
|
170
|
+
removeQuery(id) {
|
|
171
|
+
this.db.prepare('DELETE FROM results WHERE query_id = ?').run(id);
|
|
172
|
+
this.db.prepare('DELETE FROM queries WHERE id = ?').run(id);
|
|
173
|
+
}
|
|
174
|
+
/** Delete one query and its results; returns whether it existed. */
|
|
175
|
+
deleteQuery(id) {
|
|
176
|
+
const row = this.db.prepare('SELECT id FROM queries WHERE id = ?').get(id);
|
|
177
|
+
if (!row)
|
|
178
|
+
return false;
|
|
179
|
+
this.removeQuery(id);
|
|
180
|
+
return true;
|
|
181
|
+
}
|
|
182
|
+
/** Most-used engines, desc. */
|
|
183
|
+
topEngines(limit = 8) {
|
|
184
|
+
return this.db.prepare('SELECT engine, COUNT(*) AS count FROM queries WHERE engine IS NOT NULL GROUP BY engine ORDER BY count DESC LIMIT ?').all(limit);
|
|
185
|
+
}
|
|
186
|
+
/** Most-frequent queries, desc. */
|
|
187
|
+
topQueries(limit = 8) {
|
|
188
|
+
return this.db.prepare('SELECT query, COUNT(*) AS count FROM queries WHERE query IS NOT NULL GROUP BY query ORDER BY count DESC LIMIT ?').all(limit);
|
|
189
|
+
}
|
|
190
|
+
/** Per-kind record counts. */
|
|
191
|
+
kindCounts() {
|
|
192
|
+
return this.db.prepare('SELECT kind, COUNT(*) AS count FROM queries GROUP BY kind ORDER BY count DESC').all();
|
|
193
|
+
}
|
|
194
|
+
stats() {
|
|
195
|
+
const count = (sql) => this.db.prepare(sql).get().c;
|
|
196
|
+
let dbSizeBytes = 0;
|
|
197
|
+
try {
|
|
198
|
+
dbSizeBytes = fs.statSync(this.dbPath).size;
|
|
199
|
+
}
|
|
200
|
+
catch { /* not on disk (memory) */ }
|
|
201
|
+
return {
|
|
202
|
+
dbSizeBytes,
|
|
203
|
+
queries: count('SELECT COUNT(*) AS c FROM queries'),
|
|
204
|
+
results: count('SELECT COUNT(*) AS c FROM results'),
|
|
205
|
+
pages: count('SELECT COUNT(*) AS c FROM pages'),
|
|
206
|
+
rules: count('SELECT COUNT(*) AS c FROM rules'),
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
listRules() {
|
|
210
|
+
return this.db.prepare('SELECT * FROM rules ORDER BY hostname ASC').all();
|
|
211
|
+
}
|
|
212
|
+
upsertRule(hostname, content, remove) {
|
|
213
|
+
const now = new Date().toISOString();
|
|
214
|
+
this.db.prepare(`INSERT INTO rules (hostname, content, remove, created_at, updated_at)
|
|
215
|
+
VALUES (?, ?, ?, ?, ?)
|
|
216
|
+
ON CONFLICT(hostname) DO UPDATE SET content = excluded.content, remove = excluded.remove, updated_at = excluded.updated_at`).run(hostname.toLowerCase(), content, remove ?? null, now, now);
|
|
217
|
+
}
|
|
218
|
+
removeRule(hostname) {
|
|
219
|
+
const res = this.db.prepare('DELETE FROM rules WHERE hostname = ?').run(hostname.toLowerCase());
|
|
220
|
+
return res.changes > 0;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
//# sourceMappingURL=store.js.map
|
package/lib/store.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
|
package/lib/tools.d.ts
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool definitions for web-search-pro: 8 model-facing tools over the router,
|
|
3
|
+
* fetch service, store, and playwright manager.
|
|
4
|
+
* @module web-search-pro/tools
|
|
5
|
+
*/
|
|
6
|
+
import type { Context } from '@deepseek-ai/cordis';
|
|
7
|
+
import type { SearchRouter } from './router.ts';
|
|
8
|
+
import type { FetchService } from './fetch.ts';
|
|
9
|
+
import type { Store } from './store.ts';
|
|
10
|
+
import type { BrowserService } from './browser-service.ts';
|
|
11
|
+
import type { ResolvedConfig } from './config.ts';
|
|
12
|
+
export interface ToolDeps {
|
|
13
|
+
ctx: Context;
|
|
14
|
+
config: ResolvedConfig;
|
|
15
|
+
/** Hot-reloadable config source (settings.yaml overlay). */
|
|
16
|
+
dynamic: () => ResolvedConfig;
|
|
17
|
+
store: Store;
|
|
18
|
+
router: SearchRouter;
|
|
19
|
+
fetch: FetchService;
|
|
20
|
+
browser: BrowserService;
|
|
21
|
+
}
|
|
22
|
+
export declare function formatSources(sources: {
|
|
23
|
+
url: string;
|
|
24
|
+
title?: string;
|
|
25
|
+
snippet?: string;
|
|
26
|
+
publishedAt?: string;
|
|
27
|
+
}[]): string;
|
|
28
|
+
export declare function registerTools(deps: ToolDeps): void;
|