@tangle-network/browser-agent-driver 0.6.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 +196 -0
- package/README.md +149 -0
- package/dist/artifacts/composite-sink.d.ts +15 -0
- package/dist/artifacts/composite-sink.d.ts.map +1 -0
- package/dist/artifacts/composite-sink.js +27 -0
- package/dist/artifacts/composite-sink.js.map +1 -0
- package/dist/artifacts/filesystem-sink.d.ts +26 -0
- package/dist/artifacts/filesystem-sink.d.ts.map +1 -0
- package/dist/artifacts/filesystem-sink.js +81 -0
- package/dist/artifacts/filesystem-sink.js.map +1 -0
- package/dist/artifacts/types.d.ts +97 -0
- package/dist/artifacts/types.d.ts.map +1 -0
- package/dist/artifacts/types.js +9 -0
- package/dist/artifacts/types.js.map +1 -0
- package/dist/artifacts/webhook-sink.d.ts +71 -0
- package/dist/artifacts/webhook-sink.d.ts.map +1 -0
- package/dist/artifacts/webhook-sink.js +117 -0
- package/dist/artifacts/webhook-sink.js.map +1 -0
- package/dist/brain/index.d.ts +149 -0
- package/dist/brain/index.d.ts.map +1 -0
- package/dist/brain/index.js +1030 -0
- package/dist/brain/index.js.map +1 -0
- package/dist/browser-launch.d.ts +27 -0
- package/dist/browser-launch.d.ts.map +1 -0
- package/dist/browser-launch.js +92 -0
- package/dist/browser-launch.js.map +1 -0
- package/dist/cli.d.ts +14 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +1035 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +143 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +205 -0
- package/dist/config.js.map +1 -0
- package/dist/context-budget.d.ts +14 -0
- package/dist/context-budget.d.ts.map +1 -0
- package/dist/context-budget.js +39 -0
- package/dist/context-budget.js.map +1 -0
- package/dist/design-audit.d.ts +48 -0
- package/dist/design-audit.d.ts.map +1 -0
- package/dist/design-audit.js +172 -0
- package/dist/design-audit.js.map +1 -0
- package/dist/domain-policy.d.ts +4 -0
- package/dist/domain-policy.d.ts.map +1 -0
- package/dist/domain-policy.js +69 -0
- package/dist/domain-policy.js.map +1 -0
- package/dist/drivers/block-patterns.d.ts +11 -0
- package/dist/drivers/block-patterns.d.ts.map +1 -0
- package/dist/drivers/block-patterns.js +123 -0
- package/dist/drivers/block-patterns.js.map +1 -0
- package/dist/drivers/cdp-page-state.d.ts +22 -0
- package/dist/drivers/cdp-page-state.d.ts.map +1 -0
- package/dist/drivers/cdp-page-state.js +38 -0
- package/dist/drivers/cdp-page-state.js.map +1 -0
- package/dist/drivers/cdp-snapshot.d.ts +32 -0
- package/dist/drivers/cdp-snapshot.d.ts.map +1 -0
- package/dist/drivers/cdp-snapshot.js +120 -0
- package/dist/drivers/cdp-snapshot.js.map +1 -0
- package/dist/drivers/playwright.d.ts +84 -0
- package/dist/drivers/playwright.d.ts.map +1 -0
- package/dist/drivers/playwright.js +385 -0
- package/dist/drivers/playwright.js.map +1 -0
- package/dist/drivers/snapshot.d.ts +134 -0
- package/dist/drivers/snapshot.d.ts.map +1 -0
- package/dist/drivers/snapshot.js +354 -0
- package/dist/drivers/snapshot.js.map +1 -0
- package/dist/drivers/types.d.ts +37 -0
- package/dist/drivers/types.d.ts.map +1 -0
- package/dist/drivers/types.js +5 -0
- package/dist/drivers/types.js.map +1 -0
- package/dist/env-loader.d.ts +2 -0
- package/dist/env-loader.d.ts.map +1 -0
- package/dist/env-loader.js +35 -0
- package/dist/env-loader.js.map +1 -0
- package/dist/formatters/slack.d.ts +37 -0
- package/dist/formatters/slack.d.ts.map +1 -0
- package/dist/formatters/slack.js +97 -0
- package/dist/formatters/slack.js.map +1 -0
- package/dist/index.d.ts +60 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +53 -0
- package/dist/index.js.map +1 -0
- package/dist/memory/analyzer.d.ts +67 -0
- package/dist/memory/analyzer.d.ts.map +1 -0
- package/dist/memory/analyzer.js +265 -0
- package/dist/memory/analyzer.js.map +1 -0
- package/dist/memory/knowledge.d.ts +55 -0
- package/dist/memory/knowledge.d.ts.map +1 -0
- package/dist/memory/knowledge.js +115 -0
- package/dist/memory/knowledge.js.map +1 -0
- package/dist/memory/project-store.d.ts +43 -0
- package/dist/memory/project-store.d.ts.map +1 -0
- package/dist/memory/project-store.js +119 -0
- package/dist/memory/project-store.js.map +1 -0
- package/dist/memory/selectors.d.ts +46 -0
- package/dist/memory/selectors.d.ts.map +1 -0
- package/dist/memory/selectors.js +89 -0
- package/dist/memory/selectors.js.map +1 -0
- package/dist/memory/store.d.ts +39 -0
- package/dist/memory/store.d.ts.map +1 -0
- package/dist/memory/store.js +193 -0
- package/dist/memory/store.js.map +1 -0
- package/dist/model-pricing.d.ts +41 -0
- package/dist/model-pricing.d.ts.map +1 -0
- package/dist/model-pricing.js +197 -0
- package/dist/model-pricing.js.map +1 -0
- package/dist/multi-actor.d.ts +108 -0
- package/dist/multi-actor.d.ts.map +1 -0
- package/dist/multi-actor.js +192 -0
- package/dist/multi-actor.js.map +1 -0
- package/dist/override-pipeline.d.ts +57 -0
- package/dist/override-pipeline.d.ts.map +1 -0
- package/dist/override-pipeline.js +26 -0
- package/dist/override-pipeline.js.map +1 -0
- package/dist/personas.d.ts +19 -0
- package/dist/personas.d.ts.map +1 -0
- package/dist/personas.js +86 -0
- package/dist/personas.js.map +1 -0
- package/dist/preview.d.ts +32 -0
- package/dist/preview.d.ts.map +1 -0
- package/dist/preview.js +138 -0
- package/dist/preview.js.map +1 -0
- package/dist/provider-defaults.d.ts +6 -0
- package/dist/provider-defaults.d.ts.map +1 -0
- package/dist/provider-defaults.js +40 -0
- package/dist/provider-defaults.js.map +1 -0
- package/dist/providers/sandbox-backend.d.ts +22 -0
- package/dist/providers/sandbox-backend.d.ts.map +1 -0
- package/dist/providers/sandbox-backend.js +259 -0
- package/dist/providers/sandbox-backend.js.map +1 -0
- package/dist/recovery.d.ts +91 -0
- package/dist/recovery.d.ts.map +1 -0
- package/dist/recovery.js +500 -0
- package/dist/recovery.js.map +1 -0
- package/dist/reporters/junit.d.ts +8 -0
- package/dist/reporters/junit.d.ts.map +1 -0
- package/dist/reporters/junit.js +99 -0
- package/dist/reporters/junit.js.map +1 -0
- package/dist/run-metrics.d.ts +4 -0
- package/dist/run-metrics.d.ts.map +1 -0
- package/dist/run-metrics.js +48 -0
- package/dist/run-metrics.js.map +1 -0
- package/dist/run-state.d.ts +22 -0
- package/dist/run-state.d.ts.map +1 -0
- package/dist/run-state.js +33 -0
- package/dist/run-state.js.map +1 -0
- package/dist/runner/goal-verification.d.ts +13 -0
- package/dist/runner/goal-verification.d.ts.map +1 -0
- package/dist/runner/goal-verification.js +152 -0
- package/dist/runner/goal-verification.js.map +1 -0
- package/dist/runner/index.d.ts +12 -0
- package/dist/runner/index.d.ts.map +1 -0
- package/dist/runner/index.js +18 -0
- package/dist/runner/index.js.map +1 -0
- package/dist/runner/overrides.d.ts +75 -0
- package/dist/runner/overrides.d.ts.map +1 -0
- package/dist/runner/overrides.js +385 -0
- package/dist/runner/overrides.js.map +1 -0
- package/dist/runner/page-analysis.d.ts +23 -0
- package/dist/runner/page-analysis.d.ts.map +1 -0
- package/dist/runner/page-analysis.js +91 -0
- package/dist/runner/page-analysis.js.map +1 -0
- package/dist/runner/runner.d.ts +66 -0
- package/dist/runner/runner.d.ts.map +1 -0
- package/dist/runner/runner.js +1314 -0
- package/dist/runner/runner.js.map +1 -0
- package/dist/runner/scout.d.ts +29 -0
- package/dist/runner/scout.d.ts.map +1 -0
- package/dist/runner/scout.js +81 -0
- package/dist/runner/scout.js.map +1 -0
- package/dist/runner/search-guidance.d.ts +31 -0
- package/dist/runner/search-guidance.d.ts.map +1 -0
- package/dist/runner/search-guidance.js +210 -0
- package/dist/runner/search-guidance.js.map +1 -0
- package/dist/runner/utils.d.ts +28 -0
- package/dist/runner/utils.d.ts.map +1 -0
- package/dist/runner/utils.js +119 -0
- package/dist/runner/utils.js.map +1 -0
- package/dist/runner.d.ts +8 -0
- package/dist/runner.d.ts.map +1 -0
- package/dist/runner.js +21 -0
- package/dist/runner.js.map +1 -0
- package/dist/supervisor/critic.d.ts +29 -0
- package/dist/supervisor/critic.d.ts.map +1 -0
- package/dist/supervisor/critic.js +320 -0
- package/dist/supervisor/critic.js.map +1 -0
- package/dist/supervisor/policy.d.ts +11 -0
- package/dist/supervisor/policy.d.ts.map +1 -0
- package/dist/supervisor/policy.js +118 -0
- package/dist/supervisor/policy.js.map +1 -0
- package/dist/test-report.d.ts +15 -0
- package/dist/test-report.d.ts.map +1 -0
- package/dist/test-report.js +241 -0
- package/dist/test-report.js.map +1 -0
- package/dist/test-runner.d.ts +99 -0
- package/dist/test-runner.d.ts.map +1 -0
- package/dist/test-runner.js +1075 -0
- package/dist/test-runner.js.map +1 -0
- package/dist/types.d.ts +493 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/wallet/automation.d.ts +52 -0
- package/dist/wallet/automation.d.ts.map +1 -0
- package/dist/wallet/automation.js +507 -0
- package/dist/wallet/automation.js.map +1 -0
- package/package.json +101 -0
- package/scripts/postinstall-provider-patches.mjs +52 -0
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* App Knowledge — domain-scoped fact accumulation with confidence scoring.
|
|
3
|
+
*
|
|
4
|
+
* Stores structured facts the agent discovers about a specific application,
|
|
5
|
+
* persisted across runs. Facts have confidence scores that increase with
|
|
6
|
+
* repeated confirmation and decay when contradicted.
|
|
7
|
+
*
|
|
8
|
+
* Fact types:
|
|
9
|
+
* - timing: wait durations, animation timings, load times
|
|
10
|
+
* - selector: reliable selectors for specific elements
|
|
11
|
+
* - pattern: multi-step interaction patterns (auth flows, navigation)
|
|
12
|
+
* - quirk: app-specific behaviors (shadow DOM, lazy loading, etc.)
|
|
13
|
+
*/
|
|
14
|
+
import { existsSync, readFileSync, writeFileSync } from 'fs';
|
|
15
|
+
export class AppKnowledge {
|
|
16
|
+
path;
|
|
17
|
+
data;
|
|
18
|
+
constructor(path, domain) {
|
|
19
|
+
this.path = path;
|
|
20
|
+
this.data = this.load(domain);
|
|
21
|
+
}
|
|
22
|
+
/** Get all facts with confidence above threshold */
|
|
23
|
+
getFacts(minConfidence = 0.3) {
|
|
24
|
+
return this.data.facts.filter(f => f.confidence >= minConfidence);
|
|
25
|
+
}
|
|
26
|
+
/** Get facts of a specific type */
|
|
27
|
+
getFactsByType(type, minConfidence = 0.3) {
|
|
28
|
+
return this.data.facts.filter(f => f.type === type && f.confidence >= minConfidence);
|
|
29
|
+
}
|
|
30
|
+
/** Look up a specific fact by type and key */
|
|
31
|
+
getFact(type, key) {
|
|
32
|
+
return this.data.facts.find(f => f.type === type && f.key === key);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Record a fact. If a matching fact exists:
|
|
36
|
+
* - Same value: boost confidence and increment sources
|
|
37
|
+
* - Different value: decay old fact's confidence, add new fact
|
|
38
|
+
*/
|
|
39
|
+
recordFact(type, key, value) {
|
|
40
|
+
const existing = this.data.facts.find(f => f.type === type && f.key === key);
|
|
41
|
+
const now = new Date().toISOString();
|
|
42
|
+
if (existing) {
|
|
43
|
+
if (existing.value === value) {
|
|
44
|
+
// Confirm — boost confidence (asymptotic toward 1.0)
|
|
45
|
+
existing.confidence = Math.min(1.0, existing.confidence + (1 - existing.confidence) * 0.2);
|
|
46
|
+
existing.sources++;
|
|
47
|
+
existing.lastSeen = now;
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
// Contradict — decay old, add new
|
|
51
|
+
existing.confidence *= 0.5;
|
|
52
|
+
this.data.facts.push({
|
|
53
|
+
type, key, value,
|
|
54
|
+
confidence: 0.6,
|
|
55
|
+
sources: 1,
|
|
56
|
+
lastSeen: now,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
this.data.facts.push({
|
|
62
|
+
type, key, value,
|
|
63
|
+
confidence: 0.6,
|
|
64
|
+
sources: 1,
|
|
65
|
+
lastSeen: now,
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
// Prune low-confidence facts
|
|
69
|
+
this.data.facts = this.data.facts.filter(f => f.confidence >= 0.1);
|
|
70
|
+
this.data.updatedAt = now;
|
|
71
|
+
}
|
|
72
|
+
/** Merge multiple facts at once (e.g., from LLM extraction) */
|
|
73
|
+
recordFacts(facts) {
|
|
74
|
+
for (const f of facts) {
|
|
75
|
+
this.recordFact(f.type, f.key, f.value);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/** Format knowledge for injection into brain context */
|
|
79
|
+
formatForBrain() {
|
|
80
|
+
const facts = this.getFacts(0.5); // Only high-confidence facts
|
|
81
|
+
if (facts.length === 0)
|
|
82
|
+
return '';
|
|
83
|
+
const grouped = new Map();
|
|
84
|
+
for (const f of facts) {
|
|
85
|
+
const group = grouped.get(f.type) || [];
|
|
86
|
+
group.push(f);
|
|
87
|
+
grouped.set(f.type, group);
|
|
88
|
+
}
|
|
89
|
+
const lines = ['APP KNOWLEDGE (learned from previous runs):'];
|
|
90
|
+
for (const [type, typeFacts] of grouped) {
|
|
91
|
+
lines.push(` ${type.toUpperCase()}:`);
|
|
92
|
+
for (const f of typeFacts.sort((a, b) => b.confidence - a.confidence)) {
|
|
93
|
+
const conf = (f.confidence * 100).toFixed(0);
|
|
94
|
+
lines.push(` - ${f.key}: ${f.value} (${conf}% confidence, ${f.sources} observations)`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return lines.join('\n');
|
|
98
|
+
}
|
|
99
|
+
/** Persist to disk */
|
|
100
|
+
save() {
|
|
101
|
+
writeFileSync(this.path, JSON.stringify(this.data, null, 2));
|
|
102
|
+
}
|
|
103
|
+
load(domain) {
|
|
104
|
+
if (existsSync(this.path)) {
|
|
105
|
+
try {
|
|
106
|
+
return JSON.parse(readFileSync(this.path, 'utf-8'));
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
// Corrupted file — start fresh
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return { domain, facts: [], updatedAt: new Date().toISOString() };
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=knowledge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"knowledge.js","sourceRoot":"","sources":["../../src/memory/knowledge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project Memory Store — manages the `.agent-memory/` directory layout.
|
|
3
|
+
*
|
|
4
|
+
* Provides domain-scoped storage for knowledge, selectors, and trajectories.
|
|
5
|
+
* The directory is git-committable and accumulates learning across runs.
|
|
6
|
+
*
|
|
7
|
+
* Layout:
|
|
8
|
+
* .agent-memory/
|
|
9
|
+
* ├── domains/
|
|
10
|
+
* │ └── localhost_5173/ # sanitized origin
|
|
11
|
+
* │ ├── knowledge.json # accumulated facts about this app
|
|
12
|
+
* │ ├── selectors.json # element → best selector mappings
|
|
13
|
+
* │ └── trajectories/ # successful run recordings
|
|
14
|
+
* │ └── traj_*.json
|
|
15
|
+
* ├── hints.json # cross-domain optimization hints
|
|
16
|
+
* └── runs/
|
|
17
|
+
* └── run_*.json # suite result summaries
|
|
18
|
+
*/
|
|
19
|
+
import type { TestSuiteResult } from '../types.js';
|
|
20
|
+
export declare class ProjectStore {
|
|
21
|
+
private root;
|
|
22
|
+
constructor(root?: string);
|
|
23
|
+
/** Get the root directory path */
|
|
24
|
+
getRoot(): string;
|
|
25
|
+
/** Get the domain directory for a given URL origin */
|
|
26
|
+
getDomainDir(url: string): string;
|
|
27
|
+
/** Get the trajectory store path for a domain */
|
|
28
|
+
getTrajectoryDir(url: string): string;
|
|
29
|
+
/** Get the knowledge file path for a domain */
|
|
30
|
+
getKnowledgePath(url: string): string;
|
|
31
|
+
/** Get the selector cache file path for a domain */
|
|
32
|
+
getSelectorCachePath(url: string): string;
|
|
33
|
+
/** Get the cross-domain hints file path */
|
|
34
|
+
getHintsPath(): string;
|
|
35
|
+
/** Save cross-domain optimization hints */
|
|
36
|
+
saveHints(hints: string): void;
|
|
37
|
+
/** Load cross-domain optimization hints */
|
|
38
|
+
loadHints(): string | null;
|
|
39
|
+
/** Save a run summary (lightweight — just metrics, no full traces) */
|
|
40
|
+
saveRunSummary(suite: TestSuiteResult): void;
|
|
41
|
+
private ensureDir;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=project-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-store.d.ts","sourceRoot":"","sources":["../../src/memory/project-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,qBAAa,YAAY;IACvB,OAAO,CAAC,IAAI,CAAS;gBAET,IAAI,CAAC,EAAE,MAAM;IAOzB,kCAAkC;IAClC,OAAO,IAAI,MAAM;IAIjB,sDAAsD;IACtD,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAOjC,iDAAiD;IACjD,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAMrC,+CAA+C;IAC/C,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAIrC,oDAAoD;IACpD,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAIzC,2CAA2C;IAC3C,YAAY,IAAI,MAAM;IAItB,2CAA2C;IAC3C,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAI9B,2CAA2C;IAC3C,SAAS,IAAI,MAAM,GAAG,IAAI;IAW1B,sEAAsE;IACtE,cAAc,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI;IA4B5C,OAAO,CAAC,SAAS;CAKlB"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project Memory Store — manages the `.agent-memory/` directory layout.
|
|
3
|
+
*
|
|
4
|
+
* Provides domain-scoped storage for knowledge, selectors, and trajectories.
|
|
5
|
+
* The directory is git-committable and accumulates learning across runs.
|
|
6
|
+
*
|
|
7
|
+
* Layout:
|
|
8
|
+
* .agent-memory/
|
|
9
|
+
* ├── domains/
|
|
10
|
+
* │ └── localhost_5173/ # sanitized origin
|
|
11
|
+
* │ ├── knowledge.json # accumulated facts about this app
|
|
12
|
+
* │ ├── selectors.json # element → best selector mappings
|
|
13
|
+
* │ └── trajectories/ # successful run recordings
|
|
14
|
+
* │ └── traj_*.json
|
|
15
|
+
* ├── hints.json # cross-domain optimization hints
|
|
16
|
+
* └── runs/
|
|
17
|
+
* └── run_*.json # suite result summaries
|
|
18
|
+
*/
|
|
19
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
|
|
20
|
+
import { join } from 'path';
|
|
21
|
+
export class ProjectStore {
|
|
22
|
+
root;
|
|
23
|
+
constructor(root) {
|
|
24
|
+
this.root = root || join(process.cwd(), '.agent-memory');
|
|
25
|
+
this.ensureDir(this.root);
|
|
26
|
+
this.ensureDir(join(this.root, 'domains'));
|
|
27
|
+
this.ensureDir(join(this.root, 'runs'));
|
|
28
|
+
}
|
|
29
|
+
/** Get the root directory path */
|
|
30
|
+
getRoot() {
|
|
31
|
+
return this.root;
|
|
32
|
+
}
|
|
33
|
+
/** Get the domain directory for a given URL origin */
|
|
34
|
+
getDomainDir(url) {
|
|
35
|
+
const domain = sanitizeDomain(url);
|
|
36
|
+
const dir = join(this.root, 'domains', domain);
|
|
37
|
+
this.ensureDir(dir);
|
|
38
|
+
return dir;
|
|
39
|
+
}
|
|
40
|
+
/** Get the trajectory store path for a domain */
|
|
41
|
+
getTrajectoryDir(url) {
|
|
42
|
+
const dir = join(this.getDomainDir(url), 'trajectories');
|
|
43
|
+
this.ensureDir(dir);
|
|
44
|
+
return dir;
|
|
45
|
+
}
|
|
46
|
+
/** Get the knowledge file path for a domain */
|
|
47
|
+
getKnowledgePath(url) {
|
|
48
|
+
return join(this.getDomainDir(url), 'knowledge.json');
|
|
49
|
+
}
|
|
50
|
+
/** Get the selector cache file path for a domain */
|
|
51
|
+
getSelectorCachePath(url) {
|
|
52
|
+
return join(this.getDomainDir(url), 'selectors.json');
|
|
53
|
+
}
|
|
54
|
+
/** Get the cross-domain hints file path */
|
|
55
|
+
getHintsPath() {
|
|
56
|
+
return join(this.root, 'hints.json');
|
|
57
|
+
}
|
|
58
|
+
/** Save cross-domain optimization hints */
|
|
59
|
+
saveHints(hints) {
|
|
60
|
+
writeFileSync(this.getHintsPath(), JSON.stringify({ hints, updatedAt: new Date().toISOString() }, null, 2));
|
|
61
|
+
}
|
|
62
|
+
/** Load cross-domain optimization hints */
|
|
63
|
+
loadHints() {
|
|
64
|
+
const path = this.getHintsPath();
|
|
65
|
+
if (!existsSync(path))
|
|
66
|
+
return null;
|
|
67
|
+
try {
|
|
68
|
+
const data = JSON.parse(readFileSync(path, 'utf-8'));
|
|
69
|
+
return data.hints || null;
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/** Save a run summary (lightweight — just metrics, no full traces) */
|
|
76
|
+
saveRunSummary(suite) {
|
|
77
|
+
const id = `run_${Date.now()}_${Math.random().toString(36).slice(2, 6)}`;
|
|
78
|
+
const summary = {
|
|
79
|
+
id,
|
|
80
|
+
model: suite.model,
|
|
81
|
+
timestamp: suite.timestamp,
|
|
82
|
+
total: suite.summary.total,
|
|
83
|
+
passed: suite.summary.passed,
|
|
84
|
+
failed: suite.summary.failed,
|
|
85
|
+
passRate: suite.summary.passRate,
|
|
86
|
+
avgTurns: suite.summary.avgTurns,
|
|
87
|
+
avgDurationMs: suite.summary.avgDurationMs,
|
|
88
|
+
totalDurationMs: suite.summary.totalDurationMs,
|
|
89
|
+
tests: suite.results.map(r => ({
|
|
90
|
+
id: r.testCase.id,
|
|
91
|
+
name: r.testCase.name,
|
|
92
|
+
verified: r.verified,
|
|
93
|
+
turnsUsed: r.turnsUsed,
|
|
94
|
+
durationMs: r.durationMs,
|
|
95
|
+
})),
|
|
96
|
+
};
|
|
97
|
+
writeFileSync(join(this.root, 'runs', `${id}.json`), JSON.stringify(summary, null, 2));
|
|
98
|
+
}
|
|
99
|
+
ensureDir(dir) {
|
|
100
|
+
if (!existsSync(dir)) {
|
|
101
|
+
mkdirSync(dir, { recursive: true });
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Sanitize a URL into a filesystem-safe domain key.
|
|
107
|
+
* "http://localhost:5173/foo/bar" → "localhost_5173"
|
|
108
|
+
*/
|
|
109
|
+
function sanitizeDomain(url) {
|
|
110
|
+
try {
|
|
111
|
+
const parsed = new URL(url);
|
|
112
|
+
return parsed.host.replace(/[^a-zA-Z0-9.-]/g, '_');
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
// Fallback: extract something useful from the string
|
|
116
|
+
return url.replace(/[^a-zA-Z0-9.-]/g, '_').slice(0, 50) || 'unknown';
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=project-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-store.js","sourceRoot":"","sources":["../../src/memory/project-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Selector Cache — maps element identities to their best-known selectors.
|
|
3
|
+
*
|
|
4
|
+
* After each successful action, records which selector worked for a given
|
|
5
|
+
* element (identified by role+name from the a11y tree). On future runs,
|
|
6
|
+
* known-good selectors are injected into the brain context so the agent
|
|
7
|
+
* can skip trial-and-error.
|
|
8
|
+
*
|
|
9
|
+
* Each entry tracks:
|
|
10
|
+
* - The last successful @ref (changes between page loads)
|
|
11
|
+
* - The best stable selector (data-testid, aria-label, etc.)
|
|
12
|
+
* - Success count and last used timestamp
|
|
13
|
+
*/
|
|
14
|
+
export interface SelectorEntry {
|
|
15
|
+
/** Element identity from a11y tree (e.g., 'button "Send"') */
|
|
16
|
+
element: string;
|
|
17
|
+
/** Last known @ref ID (volatile — changes between sessions) */
|
|
18
|
+
lastRef?: string;
|
|
19
|
+
/** Best stable selector (data-testid, aria-label, etc.) */
|
|
20
|
+
stableSelector?: string;
|
|
21
|
+
/** Number of successful uses */
|
|
22
|
+
successCount: number;
|
|
23
|
+
/** Last successful use */
|
|
24
|
+
lastUsed: string;
|
|
25
|
+
}
|
|
26
|
+
export interface SelectorCacheData {
|
|
27
|
+
entries: Record<string, SelectorEntry>;
|
|
28
|
+
updatedAt: string;
|
|
29
|
+
}
|
|
30
|
+
export declare class SelectorCache {
|
|
31
|
+
private path;
|
|
32
|
+
private data;
|
|
33
|
+
constructor(path: string);
|
|
34
|
+
/** Record a successful selector use */
|
|
35
|
+
recordSuccess(element: string, selector: string): void;
|
|
36
|
+
/** Look up the best known selector for an element */
|
|
37
|
+
lookup(element: string): SelectorEntry | undefined;
|
|
38
|
+
/** Get all entries sorted by success count (most reliable first) */
|
|
39
|
+
getAll(): SelectorEntry[];
|
|
40
|
+
/** Get the most reliable selectors (high success count) for brain context */
|
|
41
|
+
formatForBrain(limit?: number): string;
|
|
42
|
+
/** Persist to disk */
|
|
43
|
+
save(): void;
|
|
44
|
+
private load;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=selectors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selectors.d.ts","sourceRoot":"","sources":["../../src/memory/selectors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,MAAM,WAAW,aAAa;IAC5B,8DAA8D;IAC9D,OAAO,EAAE,MAAM,CAAC;IAChB,+DAA+D;IAC/D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2DAA2D;IAC3D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gCAAgC;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,0BAA0B;IAC1B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACvC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,IAAI,CAAoB;gBAEpB,IAAI,EAAE,MAAM;IAKxB,uCAAuC;IACvC,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IA6BtD,qDAAqD;IACrD,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAIlD,oEAAoE;IACpE,MAAM,IAAI,aAAa,EAAE;IAKzB,6EAA6E;IAC7E,cAAc,CAAC,KAAK,SAAK,GAAG,MAAM;IAYlC,sBAAsB;IACtB,IAAI,IAAI,IAAI;IAIZ,OAAO,CAAC,IAAI;CAUb"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Selector Cache — maps element identities to their best-known selectors.
|
|
3
|
+
*
|
|
4
|
+
* After each successful action, records which selector worked for a given
|
|
5
|
+
* element (identified by role+name from the a11y tree). On future runs,
|
|
6
|
+
* known-good selectors are injected into the brain context so the agent
|
|
7
|
+
* can skip trial-and-error.
|
|
8
|
+
*
|
|
9
|
+
* Each entry tracks:
|
|
10
|
+
* - The last successful @ref (changes between page loads)
|
|
11
|
+
* - The best stable selector (data-testid, aria-label, etc.)
|
|
12
|
+
* - Success count and last used timestamp
|
|
13
|
+
*/
|
|
14
|
+
import { existsSync, readFileSync, writeFileSync } from 'fs';
|
|
15
|
+
export class SelectorCache {
|
|
16
|
+
path;
|
|
17
|
+
data;
|
|
18
|
+
constructor(path) {
|
|
19
|
+
this.path = path;
|
|
20
|
+
this.data = this.load();
|
|
21
|
+
}
|
|
22
|
+
/** Record a successful selector use */
|
|
23
|
+
recordSuccess(element, selector) {
|
|
24
|
+
const now = new Date().toISOString();
|
|
25
|
+
const existing = this.data.entries[element];
|
|
26
|
+
if (existing) {
|
|
27
|
+
existing.successCount++;
|
|
28
|
+
existing.lastUsed = now;
|
|
29
|
+
if (selector.startsWith('@')) {
|
|
30
|
+
existing.lastRef = selector;
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
existing.stableSelector = selector;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
const entry = {
|
|
38
|
+
element,
|
|
39
|
+
successCount: 1,
|
|
40
|
+
lastUsed: now,
|
|
41
|
+
};
|
|
42
|
+
if (selector.startsWith('@')) {
|
|
43
|
+
entry.lastRef = selector;
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
entry.stableSelector = selector;
|
|
47
|
+
}
|
|
48
|
+
this.data.entries[element] = entry;
|
|
49
|
+
}
|
|
50
|
+
this.data.updatedAt = now;
|
|
51
|
+
}
|
|
52
|
+
/** Look up the best known selector for an element */
|
|
53
|
+
lookup(element) {
|
|
54
|
+
return this.data.entries[element];
|
|
55
|
+
}
|
|
56
|
+
/** Get all entries sorted by success count (most reliable first) */
|
|
57
|
+
getAll() {
|
|
58
|
+
return Object.values(this.data.entries)
|
|
59
|
+
.sort((a, b) => b.successCount - a.successCount);
|
|
60
|
+
}
|
|
61
|
+
/** Get the most reliable selectors (high success count) for brain context */
|
|
62
|
+
formatForBrain(limit = 20) {
|
|
63
|
+
const entries = this.getAll().slice(0, limit);
|
|
64
|
+
if (entries.length === 0)
|
|
65
|
+
return '';
|
|
66
|
+
const lines = ['KNOWN SELECTORS (from previous runs):'];
|
|
67
|
+
for (const e of entries) {
|
|
68
|
+
const selector = e.stableSelector || e.lastRef || '(unknown)';
|
|
69
|
+
lines.push(` - ${e.element} → ${selector} (used ${e.successCount}x)`);
|
|
70
|
+
}
|
|
71
|
+
return lines.join('\n');
|
|
72
|
+
}
|
|
73
|
+
/** Persist to disk */
|
|
74
|
+
save() {
|
|
75
|
+
writeFileSync(this.path, JSON.stringify(this.data, null, 2));
|
|
76
|
+
}
|
|
77
|
+
load() {
|
|
78
|
+
if (existsSync(this.path)) {
|
|
79
|
+
try {
|
|
80
|
+
return JSON.parse(readFileSync(this.path, 'utf-8'));
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
// Corrupted file — start fresh
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return { entries: {}, updatedAt: new Date().toISOString() };
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=selectors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selectors.js","sourceRoot":"","sources":["../../src/memory/selectors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Trajectory Store — saves and loads successful trajectories for case-based reasoning.
|
|
3
|
+
*
|
|
4
|
+
* Stores trajectories as JSON files in a configurable directory (.trajectories/ by default).
|
|
5
|
+
* No fine-tuning needed — successful trajectories are injected into the system prompt
|
|
6
|
+
* as reference guides for similar future tasks.
|
|
7
|
+
*/
|
|
8
|
+
import type { Trajectory, Turn } from '../types.js';
|
|
9
|
+
export interface TrajectoryStoreOptions {
|
|
10
|
+
similarityThreshold?: number;
|
|
11
|
+
enableScoring?: boolean;
|
|
12
|
+
ttlDays?: number;
|
|
13
|
+
}
|
|
14
|
+
export interface TrajectorySaveOptions {
|
|
15
|
+
origin?: string;
|
|
16
|
+
}
|
|
17
|
+
export interface TrajectoryMatchOptions {
|
|
18
|
+
origin?: string;
|
|
19
|
+
}
|
|
20
|
+
export declare class TrajectoryStore {
|
|
21
|
+
private storePath;
|
|
22
|
+
private cache;
|
|
23
|
+
private similarityThreshold;
|
|
24
|
+
private enableScoring;
|
|
25
|
+
private ttlDays;
|
|
26
|
+
constructor(storePath?: string, thresholdOrOptions?: number | TrajectoryStoreOptions);
|
|
27
|
+
/** Save a trajectory from a completed agent run */
|
|
28
|
+
save(goal: string, turns: Turn[], success: boolean, model: string, options?: TrajectorySaveOptions): Trajectory;
|
|
29
|
+
/** Load all trajectories (cached — invalidated on save) */
|
|
30
|
+
loadAll(): Trajectory[];
|
|
31
|
+
/** Find the best matching trajectory for a goal */
|
|
32
|
+
findBestMatch(goal: string, options?: TrajectoryMatchOptions): Trajectory | null;
|
|
33
|
+
private computeScore;
|
|
34
|
+
private computeRecencyScore;
|
|
35
|
+
private computeVerificationScore;
|
|
36
|
+
/** Format a trajectory as a human-readable reference for the brain */
|
|
37
|
+
formatAsReference(trajectory: Trajectory): string;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/memory/store.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,IAAI,EAAU,MAAM,aAAa,CAAC;AAG5D,MAAM,WAAW,sBAAsB;IACrC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,KAAK,CAA6B;IAC1C,OAAO,CAAC,mBAAmB,CAAS;IACpC,OAAO,CAAC,aAAa,CAAU;IAC/B,OAAO,CAAC,OAAO,CAAS;gBAEZ,SAAS,CAAC,EAAE,MAAM,EAAE,kBAAkB,GAAE,MAAM,GAAG,sBAA4B;IAczF,mDAAmD;IACnD,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,qBAA0B,GAAG,UAAU;IA0BnH,2DAA2D;IAC3D,OAAO,IAAI,UAAU,EAAE;IAiBvB,mDAAmD;IACnD,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,sBAA2B,GAAG,UAAU,GAAG,IAAI;IAoCpF,OAAO,CAAC,YAAY;IAUpB,OAAO,CAAC,mBAAmB;IAO3B,OAAO,CAAC,wBAAwB;IAMhC,sEAAsE;IACtE,iBAAiB,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM;CAclD"}
|