ai-browser 0.2.5 → 0.3.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 (79) hide show
  1. package/README.md +10 -1
  2. package/dist/agent/agent-loop.d.ts +18 -0
  3. package/dist/agent/agent-loop.d.ts.map +1 -1
  4. package/dist/agent/agent-loop.js +233 -3
  5. package/dist/agent/agent-loop.js.map +1 -1
  6. package/dist/agent/content-budget.d.ts.map +1 -1
  7. package/dist/agent/content-budget.js +4 -0
  8. package/dist/agent/content-budget.js.map +1 -1
  9. package/dist/agent/conversation-manager.d.ts.map +1 -1
  10. package/dist/agent/conversation-manager.js +20 -6
  11. package/dist/agent/conversation-manager.js.map +1 -1
  12. package/dist/agent/index.js +7 -2
  13. package/dist/agent/index.js.map +1 -1
  14. package/dist/agent/prompt.d.ts +1 -1
  15. package/dist/agent/prompt.d.ts.map +1 -1
  16. package/dist/agent/prompt.js +8 -0
  17. package/dist/agent/prompt.js.map +1 -1
  18. package/dist/agent/tool-usage-tracker.d.ts.map +1 -1
  19. package/dist/agent/tool-usage-tracker.js +7 -3
  20. package/dist/agent/tool-usage-tracker.js.map +1 -1
  21. package/dist/agent/types.d.ts +6 -0
  22. package/dist/agent/types.d.ts.map +1 -1
  23. package/dist/api/mcp-sse.d.ts +2 -1
  24. package/dist/api/mcp-sse.d.ts.map +1 -1
  25. package/dist/api/mcp-sse.js +2 -1
  26. package/dist/api/mcp-sse.js.map +1 -1
  27. package/dist/api/routes.d.ts +2 -1
  28. package/dist/api/routes.d.ts.map +1 -1
  29. package/dist/api/routes.js +281 -7
  30. package/dist/api/routes.js.map +1 -1
  31. package/dist/browser/BrowserManager.d.ts.map +1 -1
  32. package/dist/browser/BrowserManager.js +5 -2
  33. package/dist/browser/BrowserManager.js.map +1 -1
  34. package/dist/cli/mcp-stdio.js +3 -0
  35. package/dist/cli/mcp-stdio.js.map +1 -1
  36. package/dist/cli/server.js +15 -3
  37. package/dist/cli/server.js.map +1 -1
  38. package/dist/mcp/ai-markdown.d.ts.map +1 -1
  39. package/dist/mcp/ai-markdown.js +106 -38
  40. package/dist/mcp/ai-markdown.js.map +1 -1
  41. package/dist/mcp/browser-mcp-server.d.ts +2 -0
  42. package/dist/mcp/browser-mcp-server.d.ts.map +1 -1
  43. package/dist/mcp/browser-mcp-server.js +61 -0
  44. package/dist/mcp/browser-mcp-server.js.map +1 -1
  45. package/dist/mcp/task-tools.d.ts.map +1 -1
  46. package/dist/mcp/task-tools.js +1 -0
  47. package/dist/mcp/task-tools.js.map +1 -1
  48. package/dist/memory/KnowledgeCardStore.d.ts +35 -0
  49. package/dist/memory/KnowledgeCardStore.d.ts.map +1 -0
  50. package/dist/memory/KnowledgeCardStore.js +304 -0
  51. package/dist/memory/KnowledgeCardStore.js.map +1 -0
  52. package/dist/memory/MemoryCapturer.d.ts +14 -0
  53. package/dist/memory/MemoryCapturer.d.ts.map +1 -0
  54. package/dist/memory/MemoryCapturer.js +183 -0
  55. package/dist/memory/MemoryCapturer.js.map +1 -0
  56. package/dist/memory/MemoryInjector.d.ts +23 -0
  57. package/dist/memory/MemoryInjector.d.ts.map +1 -0
  58. package/dist/memory/MemoryInjector.js +180 -0
  59. package/dist/memory/MemoryInjector.js.map +1 -0
  60. package/dist/memory/RecordingConverter.d.ts +16 -0
  61. package/dist/memory/RecordingConverter.d.ts.map +1 -0
  62. package/dist/memory/RecordingConverter.js +108 -0
  63. package/dist/memory/RecordingConverter.js.map +1 -0
  64. package/dist/memory/SessionRecorder.d.ts +39 -0
  65. package/dist/memory/SessionRecorder.d.ts.map +1 -0
  66. package/dist/memory/SessionRecorder.js +198 -0
  67. package/dist/memory/SessionRecorder.js.map +1 -0
  68. package/dist/memory/index.d.ts +8 -0
  69. package/dist/memory/index.d.ts.map +1 -0
  70. package/dist/memory/index.js +6 -0
  71. package/dist/memory/index.js.map +1 -0
  72. package/dist/memory/types.d.ts +39 -0
  73. package/dist/memory/types.d.ts.map +1 -0
  74. package/dist/memory/types.js +2 -0
  75. package/dist/memory/types.js.map +1 -0
  76. package/package.json +3 -1
  77. package/public/index.html +1651 -133
  78. package/public/task-result.html +107 -12
  79. package/public/tasks.html +83 -10
@@ -0,0 +1,304 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import os from 'node:os';
4
+ const MAX_DOMAINS = 200;
5
+ const MAX_PATTERNS_PER_DOMAIN = 30;
6
+ const MAX_ARCHIVES_PER_DOMAIN = 5;
7
+ const MAX_CACHE_SIZE = 10;
8
+ const FLUSH_DELAY = 5000;
9
+ const ARCHIVE_CHANGE_THRESHOLD = 0.5; // archive when >50% patterns changed
10
+ const CONFIDENCE_DECAY_BASE = 0.95;
11
+ const MIN_CONFIDENCE = 0.1;
12
+ /** Guard against path traversal: only allow safe domain/filename strings */
13
+ export function isSafeDomain(domain) {
14
+ return /^[a-zA-Z0-9][-a-zA-Z0-9.]*\.[a-zA-Z]{2,}$/.test(domain) && !domain.includes('..');
15
+ }
16
+ function isSafeFilename(name) {
17
+ return /^[a-zA-Z0-9][-a-zA-Z0-9_.]*\.json$/.test(name) && !name.includes('..');
18
+ }
19
+ export class KnowledgeCardStore {
20
+ index;
21
+ cardCache = new Map();
22
+ cacheOrder = []; // LRU tracking
23
+ baseDir;
24
+ dirty = false;
25
+ flushTimer = null;
26
+ constructor(baseDir) {
27
+ this.baseDir = baseDir || path.join(os.homedir(), '.ai-browser', 'memory');
28
+ this.index = { entries: {}, updatedAt: Date.now() };
29
+ this.loadIndex();
30
+ }
31
+ // === Index level (in-memory) ===
32
+ listDomains() {
33
+ return Object.values(this.index.entries);
34
+ }
35
+ getIndexEntry(domain) {
36
+ return this.index.entries[domain];
37
+ }
38
+ hasDomain(domain) {
39
+ return domain in this.index.entries;
40
+ }
41
+ // === Card level (on-demand from disk) ===
42
+ loadCard(domain) {
43
+ if (!isSafeDomain(domain))
44
+ return undefined;
45
+ // Check cache first
46
+ if (this.cardCache.has(domain)) {
47
+ this.touchCache(domain);
48
+ return this.cardCache.get(domain);
49
+ }
50
+ // Load from disk
51
+ const filePath = path.join(this.baseDir, 'cards', `${domain}.json`);
52
+ try {
53
+ if (!fs.existsSync(filePath))
54
+ return undefined;
55
+ const raw = fs.readFileSync(filePath, 'utf-8');
56
+ const card = JSON.parse(raw);
57
+ this.putCache(domain, card);
58
+ return card;
59
+ }
60
+ catch {
61
+ return undefined;
62
+ }
63
+ }
64
+ // === Write ===
65
+ saveCard(card) {
66
+ // Enforce pattern limit
67
+ if (card.patterns.length > MAX_PATTERNS_PER_DOMAIN) {
68
+ card.patterns.sort((a, b) => this.effectiveConfidence(b) - this.effectiveConfidence(a));
69
+ card.patterns = card.patterns.slice(0, MAX_PATTERNS_PER_DOMAIN);
70
+ }
71
+ // Archive old version if needed
72
+ const existing = this.loadCard(card.domain);
73
+ if (existing) {
74
+ this.archiveIfNeeded(card.domain, existing, card);
75
+ }
76
+ // Write card to disk
77
+ const cardsDir = path.join(this.baseDir, 'cards');
78
+ this.ensureDir(cardsDir);
79
+ const filePath = path.join(cardsDir, `${card.domain}.json`);
80
+ try {
81
+ fs.writeFileSync(filePath, JSON.stringify(card, null, 2), 'utf-8');
82
+ }
83
+ catch { /* non-critical */ }
84
+ // Update cache
85
+ this.putCache(card.domain, card);
86
+ // Update index
87
+ this.updateIndexEntry(card);
88
+ this.evictDomainsIfNeeded();
89
+ this.scheduleFlush();
90
+ }
91
+ recordUsage(domain, patternValue) {
92
+ const card = this.loadCard(domain);
93
+ if (!card)
94
+ return;
95
+ const pattern = card.patterns.find(p => p.value === patternValue);
96
+ if (!pattern)
97
+ return;
98
+ pattern.useCount++;
99
+ pattern.lastUsedAt = Date.now();
100
+ // Boost confidence on successful use, cap at 1.0
101
+ pattern.confidence = Math.min(1.0, pattern.confidence + 0.05);
102
+ card.updatedAt = Date.now();
103
+ this.saveCard(card);
104
+ }
105
+ clearDomain(domain) {
106
+ if (!this.hasDomain(domain))
107
+ return false;
108
+ // Remove card file
109
+ const filePath = path.join(this.baseDir, 'cards', `${domain}.json`);
110
+ try {
111
+ fs.unlinkSync(filePath);
112
+ }
113
+ catch { /* ok */ }
114
+ // Remove from cache and index
115
+ this.cardCache.delete(domain);
116
+ this.cacheOrder = this.cacheOrder.filter(d => d !== domain);
117
+ delete this.index.entries[domain];
118
+ this.index.updatedAt = Date.now();
119
+ this.scheduleFlush();
120
+ return true;
121
+ }
122
+ // === Archive ===
123
+ listArchives(domain) {
124
+ const archiveDir = path.join(this.baseDir, 'archive');
125
+ try {
126
+ if (!fs.existsSync(archiveDir))
127
+ return [];
128
+ const files = fs.readdirSync(archiveDir);
129
+ return files
130
+ .filter(f => f.startsWith(`${domain}_`) && f.endsWith('.json'))
131
+ .sort()
132
+ .reverse();
133
+ }
134
+ catch {
135
+ return [];
136
+ }
137
+ }
138
+ loadArchive(domain, filename) {
139
+ if (!isSafeDomain(domain) || !isSafeFilename(filename))
140
+ return undefined;
141
+ const filePath = path.join(this.baseDir, 'archive', filename);
142
+ try {
143
+ if (!fs.existsSync(filePath))
144
+ return undefined;
145
+ const raw = fs.readFileSync(filePath, 'utf-8');
146
+ return JSON.parse(raw);
147
+ }
148
+ catch {
149
+ return undefined;
150
+ }
151
+ }
152
+ restoreArchive(domain, filename) {
153
+ const archived = this.loadArchive(domain, filename);
154
+ if (!archived)
155
+ return false;
156
+ archived.updatedAt = Date.now();
157
+ archived.version++;
158
+ this.saveCard(archived);
159
+ return true;
160
+ }
161
+ archiveIfNeeded(domain, oldCard, newCard) {
162
+ if (oldCard.patterns.length === 0)
163
+ return;
164
+ const oldValues = new Set(oldCard.patterns.map(p => p.value));
165
+ const newValues = new Set(newCard.patterns.map(p => p.value));
166
+ let changed = 0;
167
+ for (const v of oldValues) {
168
+ if (!newValues.has(v))
169
+ changed++;
170
+ }
171
+ for (const v of newValues) {
172
+ if (!oldValues.has(v))
173
+ changed++;
174
+ }
175
+ const changeRatio = changed / Math.max(oldValues.size, newValues.size);
176
+ if (changeRatio < ARCHIVE_CHANGE_THRESHOLD)
177
+ return;
178
+ const archiveDir = path.join(this.baseDir, 'archive');
179
+ this.ensureDir(archiveDir);
180
+ const timestamp = Math.floor(Date.now() / 1000);
181
+ const filename = `${domain}_${timestamp}.json`;
182
+ try {
183
+ fs.writeFileSync(path.join(archiveDir, filename), JSON.stringify(oldCard, null, 2), 'utf-8');
184
+ }
185
+ catch { /* non-critical */ }
186
+ // Prune old archives
187
+ const archives = this.listArchives(domain);
188
+ if (archives.length > MAX_ARCHIVES_PER_DOMAIN) {
189
+ for (const old of archives.slice(MAX_ARCHIVES_PER_DOMAIN)) {
190
+ try {
191
+ fs.unlinkSync(path.join(archiveDir, old));
192
+ }
193
+ catch { /* ok */ }
194
+ }
195
+ }
196
+ }
197
+ // === Maintenance ===
198
+ runMaintenance() {
199
+ let changed = false;
200
+ for (const domain of Object.keys(this.index.entries)) {
201
+ const card = this.loadCard(domain);
202
+ if (!card)
203
+ continue;
204
+ const before = card.patterns.length;
205
+ card.patterns = card.patterns.filter(p => this.effectiveConfidence(p) >= MIN_CONFIDENCE);
206
+ if (card.patterns.length !== before) {
207
+ card.updatedAt = Date.now();
208
+ this.saveCard(card);
209
+ changed = true;
210
+ }
211
+ }
212
+ if (changed)
213
+ this.scheduleFlush();
214
+ }
215
+ flushIndex() {
216
+ if (!this.dirty)
217
+ return;
218
+ this.dirty = false;
219
+ try {
220
+ this.ensureDir(this.baseDir);
221
+ const filePath = path.join(this.baseDir, 'index.json');
222
+ fs.writeFileSync(filePath, JSON.stringify(this.index, null, 2), 'utf-8');
223
+ }
224
+ catch { /* non-critical */ }
225
+ }
226
+ dispose() {
227
+ if (this.flushTimer) {
228
+ clearTimeout(this.flushTimer);
229
+ this.flushTimer = null;
230
+ }
231
+ this.flushIndex();
232
+ }
233
+ // === Private helpers ===
234
+ effectiveConfidence(pattern) {
235
+ const daysSinceUse = (Date.now() - pattern.lastUsedAt) / (1000 * 60 * 60 * 24);
236
+ return pattern.confidence * Math.pow(CONFIDENCE_DECAY_BASE, daysSinceUse);
237
+ }
238
+ loadIndex() {
239
+ const filePath = path.join(this.baseDir, 'index.json');
240
+ try {
241
+ if (!fs.existsSync(filePath))
242
+ return;
243
+ const raw = fs.readFileSync(filePath, 'utf-8');
244
+ const data = JSON.parse(raw);
245
+ if (data && typeof data.entries === 'object') {
246
+ this.index = data;
247
+ }
248
+ }
249
+ catch { /* start fresh */ }
250
+ }
251
+ updateIndexEntry(card) {
252
+ const sorted = [...card.patterns].sort((a, b) => this.effectiveConfidence(b) - this.effectiveConfidence(a));
253
+ this.index.entries[card.domain] = {
254
+ domain: card.domain,
255
+ version: card.version,
256
+ patternCount: card.patterns.length,
257
+ siteType: card.siteType,
258
+ requiresLogin: card.requiresLogin,
259
+ topPatterns: sorted.slice(0, 3).map(p => p.description),
260
+ lastUsedAt: Math.max(...card.patterns.map(p => p.lastUsedAt), card.updatedAt),
261
+ updatedAt: card.updatedAt,
262
+ };
263
+ this.index.updatedAt = Date.now();
264
+ }
265
+ evictDomainsIfNeeded() {
266
+ const domains = Object.keys(this.index.entries);
267
+ if (domains.length <= MAX_DOMAINS)
268
+ return;
269
+ // Evict least recently used
270
+ const sorted = domains.sort((a, b) => (this.index.entries[a].lastUsedAt || 0) - (this.index.entries[b].lastUsedAt || 0));
271
+ const toRemove = sorted.slice(0, domains.length - MAX_DOMAINS);
272
+ for (const domain of toRemove) {
273
+ this.clearDomain(domain);
274
+ }
275
+ }
276
+ putCache(domain, card) {
277
+ this.cardCache.set(domain, card);
278
+ this.touchCache(domain);
279
+ // Evict LRU if over limit
280
+ while (this.cacheOrder.length > MAX_CACHE_SIZE) {
281
+ const evicted = this.cacheOrder.shift();
282
+ this.cardCache.delete(evicted);
283
+ }
284
+ }
285
+ touchCache(domain) {
286
+ this.cacheOrder = this.cacheOrder.filter(d => d !== domain);
287
+ this.cacheOrder.push(domain);
288
+ }
289
+ scheduleFlush() {
290
+ this.dirty = true;
291
+ if (this.flushTimer)
292
+ return;
293
+ this.flushTimer = setTimeout(() => {
294
+ this.flushTimer = null;
295
+ this.flushIndex();
296
+ }, FLUSH_DELAY);
297
+ }
298
+ ensureDir(dir) {
299
+ if (!fs.existsSync(dir)) {
300
+ fs.mkdirSync(dir, { recursive: true });
301
+ }
302
+ }
303
+ }
304
+ //# sourceMappingURL=KnowledgeCardStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KnowledgeCardStore.js","sourceRoot":"","sources":["../../src/memory/KnowledgeCardStore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { ToolCallRecord } from '../agent/tool-usage-tracker.js';
2
+ import type { SitePattern } from './types.js';
3
+ export declare class MemoryCapturer {
4
+ /**
5
+ * Extract reusable patterns from a successful agent run's tool history.
6
+ */
7
+ static extractPatterns(toolHistory: readonly ToolCallRecord[], finalUrl: string): SitePattern[];
8
+ /** Extract root domain from URL: www.bilibili.com → bilibili.com */
9
+ static extractDomain(url: string): string;
10
+ private static extractPath;
11
+ }
12
+ /** Merge new patterns into existing ones, dedup by value */
13
+ export declare function mergePatterns(existing: SitePattern[], incoming: SitePattern[]): SitePattern[];
14
+ //# sourceMappingURL=MemoryCapturer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MemoryCapturer.d.ts","sourceRoot":"","sources":["../../src/memory/MemoryCapturer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,KAAK,EAAE,WAAW,EAAiB,MAAM,YAAY,CAAC;AAE7D,qBAAa,cAAc;IACzB;;OAEG;IACH,MAAM,CAAC,eAAe,CAAC,WAAW,EAAE,SAAS,cAAc,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,WAAW,EAAE;IAsI/F,oEAAoE;IACpE,MAAM,CAAC,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAmBzC,OAAO,CAAC,MAAM,CAAC,WAAW;CAO3B;AAED,4DAA4D;AAC5D,wBAAgB,aAAa,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE,CAiB7F"}
@@ -0,0 +1,183 @@
1
+ export class MemoryCapturer {
2
+ /**
3
+ * Extract reusable patterns from a successful agent run's tool history.
4
+ */
5
+ static extractPatterns(toolHistory, finalUrl) {
6
+ const patterns = [];
7
+ const now = Date.now();
8
+ const seen = new Set(); // dedup by value
9
+ const consumedNavIndices = new Set(); // skip already-consumed nav entries
10
+ for (let i = 0; i < toolHistory.length; i++) {
11
+ const call = toolHistory[i];
12
+ if (!call.success)
13
+ continue;
14
+ // 1. execute_javascript with querySelector → selector pattern
15
+ if (call.toolName === 'execute_javascript') {
16
+ const script = call.args.script || call.args.code || '';
17
+ const selectorMatches = script.match(/querySelector(?:All)?\(\s*['"`]([^'"`]+)['"`]\s*\)/g);
18
+ if (selectorMatches) {
19
+ for (const match of selectorMatches) {
20
+ const inner = match.match(/['"`]([^'"`]+)['"`]/);
21
+ if (inner && inner[1] && !seen.has(inner[1])) {
22
+ seen.add(inner[1]);
23
+ patterns.push({
24
+ type: 'selector',
25
+ description: `使用 ${inner[1]} 选择元素`,
26
+ value: inner[1],
27
+ urlPattern: this.extractPath(finalUrl),
28
+ confidence: 0.6,
29
+ useCount: 1,
30
+ lastUsedAt: now,
31
+ createdAt: now,
32
+ source: 'agent_auto',
33
+ });
34
+ }
35
+ }
36
+ }
37
+ }
38
+ // 2. navigate success sequence → navigation_path (skip already-consumed indices)
39
+ if (call.toolName === 'navigate' && call.args.url && !consumedNavIndices.has(i)) {
40
+ const navSequence = [call.args.url];
41
+ const seqIndices = [i];
42
+ for (let j = i + 1; j < toolHistory.length && j < i + 5; j++) {
43
+ if (toolHistory[j].toolName === 'navigate' && toolHistory[j].success && toolHistory[j].args.url) {
44
+ navSequence.push(toolHistory[j].args.url);
45
+ seqIndices.push(j);
46
+ }
47
+ else {
48
+ break;
49
+ }
50
+ }
51
+ if (navSequence.length >= 2) {
52
+ const pathValue = navSequence.map(u => this.extractPath(u) || u).join(' → ');
53
+ if (!seen.has(pathValue)) {
54
+ seen.add(pathValue);
55
+ for (const idx of seqIndices)
56
+ consumedNavIndices.add(idx);
57
+ patterns.push({
58
+ type: 'navigation_path',
59
+ description: `导航路径: ${pathValue}`,
60
+ value: pathValue,
61
+ confidence: 0.5,
62
+ useCount: 1,
63
+ lastUsedAt: now,
64
+ createdAt: now,
65
+ source: 'agent_auto',
66
+ });
67
+ }
68
+ }
69
+ }
70
+ // 3. ask_human or result contains login/登录 → login_required
71
+ if (call.toolName === 'ask_human') {
72
+ const question = (call.args.question || '').toLowerCase();
73
+ if (question.includes('login') || question.includes('登录') || question.includes('密码') || question.includes('password')) {
74
+ const key = 'login_required';
75
+ if (!seen.has(key)) {
76
+ seen.add(key);
77
+ patterns.push({
78
+ type: 'login_required',
79
+ description: '此站点需要登录',
80
+ value: 'true',
81
+ confidence: 0.9,
82
+ useCount: 1,
83
+ lastUsedAt: now,
84
+ createdAt: now,
85
+ source: 'agent_auto',
86
+ });
87
+ }
88
+ }
89
+ }
90
+ // 4. get_page_content empty + execute_javascript success → spa_hint
91
+ if (call.toolName === 'get_page_content' && i + 1 < toolHistory.length) {
92
+ const next = toolHistory[i + 1];
93
+ if (next.toolName === 'execute_javascript' && next.success) {
94
+ const key = 'spa_hint';
95
+ if (!seen.has(key)) {
96
+ seen.add(key);
97
+ const script = next.args.script || next.args.code || '';
98
+ patterns.push({
99
+ type: 'spa_hint',
100
+ description: 'SPA 站点,需要通过 JS 提取内容',
101
+ value: script.slice(0, 500),
102
+ urlPattern: this.extractPath(finalUrl),
103
+ confidence: 0.7,
104
+ useCount: 1,
105
+ lastUsedAt: now,
106
+ createdAt: now,
107
+ source: 'agent_auto',
108
+ });
109
+ }
110
+ }
111
+ }
112
+ // 5. get_page_info with useful elements → page_structure
113
+ if (call.toolName === 'get_page_info' && call.args) {
114
+ // We record that get_page_info was useful at this URL
115
+ const key = `page_structure:${this.extractPath(finalUrl)}`;
116
+ if (!seen.has(key)) {
117
+ seen.add(key);
118
+ patterns.push({
119
+ type: 'page_structure',
120
+ description: `页面结构已通过 get_page_info 获取`,
121
+ value: this.extractPath(finalUrl) || '/',
122
+ urlPattern: this.extractPath(finalUrl),
123
+ confidence: 0.5,
124
+ useCount: 1,
125
+ lastUsedAt: now,
126
+ createdAt: now,
127
+ source: 'agent_auto',
128
+ });
129
+ }
130
+ }
131
+ }
132
+ return patterns;
133
+ }
134
+ /** Extract root domain from URL: www.bilibili.com → bilibili.com */
135
+ static extractDomain(url) {
136
+ try {
137
+ const hostname = new URL(url).hostname;
138
+ // Remove www. prefix
139
+ const parts = hostname.replace(/^www\./, '').split('.');
140
+ // Handle cases like co.uk, com.cn etc.
141
+ if (parts.length > 2) {
142
+ const tld2 = parts.slice(-2).join('.');
143
+ const knownTld2 = ['com.cn', 'co.uk', 'co.jp', 'com.au', 'com.br', 'org.cn', 'net.cn', 'co.kr', 'co.in', 'com.tw', 'com.hk', 'org.uk', 'ac.uk', 'com.sg', 'co.nz'];
144
+ if (knownTld2.includes(tld2)) {
145
+ return parts.slice(-3).join('.');
146
+ }
147
+ }
148
+ return parts.length > 2 ? parts.slice(-2).join('.') : parts.join('.');
149
+ }
150
+ catch {
151
+ return '';
152
+ }
153
+ }
154
+ static extractPath(url) {
155
+ try {
156
+ return new URL(url).pathname;
157
+ }
158
+ catch {
159
+ return undefined;
160
+ }
161
+ }
162
+ }
163
+ /** Merge new patterns into existing ones, dedup by value */
164
+ export function mergePatterns(existing, incoming) {
165
+ const byValue = new Map();
166
+ for (const p of existing) {
167
+ byValue.set(p.value, p);
168
+ }
169
+ for (const p of incoming) {
170
+ const prev = byValue.get(p.value);
171
+ if (prev) {
172
+ // Boost confidence and update timestamp
173
+ prev.confidence = Math.min(1.0, prev.confidence + 0.1);
174
+ prev.useCount++;
175
+ prev.lastUsedAt = Date.now();
176
+ }
177
+ else {
178
+ byValue.set(p.value, p);
179
+ }
180
+ }
181
+ return [...byValue.values()];
182
+ }
183
+ //# sourceMappingURL=MemoryCapturer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MemoryCapturer.js","sourceRoot":"","sources":["../../src/memory/MemoryCapturer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { KnowledgeCard, SitePattern } from './types.js';
2
+ /**
3
+ * Compute substring-based relevance score between an intent value and a hint.
4
+ * CJK-compatible: uses sliding window substring matching instead of word splitting.
5
+ * Returns the length of the longest matching substring (≥2 chars), or 0.
6
+ */
7
+ export declare function relevanceScore(intentValue: string, hint: string): number;
8
+ export declare class MemoryInjector {
9
+ /**
10
+ * Extract target domain from task text.
11
+ * Looks for URLs or well-known domain names.
12
+ */
13
+ static extractDomain(task: string): string | null;
14
+ /**
15
+ * Build a compact prompt fragment from a knowledge card.
16
+ * Sorted by effective confidence, hard-limited to maxChars.
17
+ * When taskHint is provided, task_intent patterns are sorted by substring relevance.
18
+ */
19
+ static buildContext(card: KnowledgeCard, maxChars?: number, taskHint?: string): string;
20
+ /** Count patterns by type for the tool response */
21
+ static countPatternTypes(patterns: SitePattern[]): Record<string, number>;
22
+ }
23
+ //# sourceMappingURL=MemoryInjector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MemoryInjector.d.ts","sourceRoot":"","sources":["../../src/memory/MemoryInjector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAK7D;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAaxE;AAED,qBAAa,cAAc;IACzB;;;OAGG;IACH,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAiDjD;;;;OAIG;IACH,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,aAAa,EAAE,QAAQ,SAAoB,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM;IAuGjG,mDAAmD;IACnD,MAAM,CAAC,iBAAiB,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;CAO1E"}