cbrowser 18.34.1 → 18.35.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 (60) hide show
  1. package/dist/analysis/accessibility-empathy.d.ts.map +1 -1
  2. package/dist/analysis/accessibility-empathy.js +44 -8
  3. package/dist/analysis/accessibility-empathy.js.map +1 -1
  4. package/dist/analysis/page-understanding.d.ts +118 -0
  5. package/dist/analysis/page-understanding.d.ts.map +1 -0
  6. package/dist/analysis/page-understanding.js +940 -0
  7. package/dist/analysis/page-understanding.js.map +1 -0
  8. package/dist/browser/index.d.ts +2 -0
  9. package/dist/browser/index.d.ts.map +1 -1
  10. package/dist/browser/index.js +1 -0
  11. package/dist/browser/index.js.map +1 -1
  12. package/dist/browser/site-profile-manager.d.ts +116 -0
  13. package/dist/browser/site-profile-manager.d.ts.map +1 -0
  14. package/dist/browser/site-profile-manager.js +495 -0
  15. package/dist/browser/site-profile-manager.js.map +1 -0
  16. package/dist/cognitive/goal-decomposer.d.ts +127 -0
  17. package/dist/cognitive/goal-decomposer.d.ts.map +1 -0
  18. package/dist/cognitive/goal-decomposer.js +902 -0
  19. package/dist/cognitive/goal-decomposer.js.map +1 -0
  20. package/dist/cognitive/goal-types.d.ts +140 -0
  21. package/dist/cognitive/goal-types.d.ts.map +1 -0
  22. package/dist/cognitive/goal-types.js +136 -0
  23. package/dist/cognitive/goal-types.js.map +1 -0
  24. package/dist/cognitive/index.d.ts +2 -0
  25. package/dist/cognitive/index.d.ts.map +1 -1
  26. package/dist/cognitive/index.js +4 -0
  27. package/dist/cognitive/index.js.map +1 -1
  28. package/dist/mcp-tools/base/audit-tools.d.ts.map +1 -1
  29. package/dist/mcp-tools/base/audit-tools.js +5 -2
  30. package/dist/mcp-tools/base/audit-tools.js.map +1 -1
  31. package/dist/mcp-tools/base/cognitive-tools.d.ts.map +1 -1
  32. package/dist/mcp-tools/base/cognitive-tools.js +20 -0
  33. package/dist/mcp-tools/base/cognitive-tools.js.map +1 -1
  34. package/dist/mcp-tools/base/index.d.ts +4 -2
  35. package/dist/mcp-tools/base/index.d.ts.map +1 -1
  36. package/dist/mcp-tools/base/index.js +7 -2
  37. package/dist/mcp-tools/base/index.js.map +1 -1
  38. package/dist/mcp-tools/base/interaction-tools.d.ts.map +1 -1
  39. package/dist/mcp-tools/base/interaction-tools.js +23 -0
  40. package/dist/mcp-tools/base/interaction-tools.js.map +1 -1
  41. package/dist/mcp-tools/base/navigation-tools.d.ts.map +1 -1
  42. package/dist/mcp-tools/base/navigation-tools.js +13 -0
  43. package/dist/mcp-tools/base/navigation-tools.js.map +1 -1
  44. package/dist/mcp-tools/base/site-knowledge-tools.d.ts +15 -0
  45. package/dist/mcp-tools/base/site-knowledge-tools.d.ts.map +1 -0
  46. package/dist/mcp-tools/base/site-knowledge-tools.js +314 -0
  47. package/dist/mcp-tools/base/site-knowledge-tools.js.map +1 -0
  48. package/dist/mcp-tools/index.d.ts +6 -6
  49. package/dist/mcp-tools/index.d.ts.map +1 -1
  50. package/dist/mcp-tools/index.js +7 -7
  51. package/dist/mcp-tools/index.js.map +1 -1
  52. package/dist/site-model/manager.d.ts +161 -0
  53. package/dist/site-model/manager.d.ts.map +1 -0
  54. package/dist/site-model/manager.js +825 -0
  55. package/dist/site-model/manager.js.map +1 -0
  56. package/dist/site-model/types.d.ts +108 -0
  57. package/dist/site-model/types.d.ts.map +1 -0
  58. package/dist/site-model/types.js +10 -0
  59. package/dist/site-model/types.js.map +1 -0
  60. package/package.json +2 -2
@@ -0,0 +1,495 @@
1
+ /**
2
+ * CBrowser - Site Profile Manager
3
+ * Persistent browser profiles per site with encrypted credential storage.
4
+ * Auto-saves cookies/localStorage on close, auto-restores on reconnection.
5
+ *
6
+ * @copyright 2026 Alexandria Eden alexandria.shai.eden@gmail.com https://cbrowser.ai
7
+ * @license MIT
8
+ * @since v18.35.0
9
+ */
10
+ import { readFile, writeFile, mkdir, readdir, rm, stat, chmod } from "fs/promises";
11
+ import { existsSync } from "fs";
12
+ import { join } from "path";
13
+ import { homedir, hostname } from "os";
14
+ import { createCipheriv, createDecipheriv, randomBytes, createHash, } from "crypto";
15
+ // ---------------------------------------------------------------------------
16
+ // Constants
17
+ // ---------------------------------------------------------------------------
18
+ /** Paths that indicate a login/auth redirect */
19
+ const LOGIN_PATH_PATTERNS = [
20
+ "/login",
21
+ "/signin",
22
+ "/sign-in",
23
+ "/auth",
24
+ "/sso",
25
+ "/oauth",
26
+ "/accounts/login",
27
+ "/session/new",
28
+ ];
29
+ /** Current profile data format version */
30
+ const PROFILE_VERSION = 1;
31
+ /** File permission: owner read/write only */
32
+ const FILE_MODE = 0o600;
33
+ // ---------------------------------------------------------------------------
34
+ // SiteProfileManager
35
+ // ---------------------------------------------------------------------------
36
+ export class SiteProfileManager {
37
+ profileDir;
38
+ /** Max profile age for auto-restore (24 hours default) */
39
+ static MAX_PROFILE_AGE_MS = 24 * 60 * 60 * 1000;
40
+ constructor(dataDir) {
41
+ const baseDir = dataDir || process.env.CBROWSER_DATA_DIR || join(homedir(), ".cbrowser");
42
+ this.profileDir = join(baseDir, "site-profiles");
43
+ }
44
+ // -------------------------------------------------------------------------
45
+ // Public API
46
+ // -------------------------------------------------------------------------
47
+ /**
48
+ * Save the current browser context state for a domain.
49
+ *
50
+ * Persists cookies (AES-256-GCM encrypted), localStorage, and metadata
51
+ * so the session can be restored on the next connection to the same site.
52
+ */
53
+ async saveProfile(domain, context, lastUrl) {
54
+ const domainDir = this.domainDir(domain);
55
+ await mkdir(domainDir, { recursive: true });
56
+ // -- Cookies (encrypted) -----------------------------------------------
57
+ const cookies = await context.cookies();
58
+ const cookiesJson = JSON.stringify(cookies);
59
+ const encryptedCookies = this.encrypt(cookiesJson);
60
+ await this.writeSecure(join(domainDir, "cookies.enc.json"), encryptedCookies);
61
+ // -- localStorage (plain — no credentials) -----------------------------
62
+ const storageData = await this.extractLocalStorage(context);
63
+ await this.writeSecure(join(domainDir, "storage.json"), JSON.stringify(storageData, null, 2));
64
+ // -- Auth status heuristic ---------------------------------------------
65
+ const authStatus = this.inferAuthStatus(cookies, lastUrl);
66
+ // -- Metadata ----------------------------------------------------------
67
+ const now = new Date().toISOString();
68
+ const existingMeta = await this.readMeta(domain);
69
+ const meta = {
70
+ domain,
71
+ created: existingMeta?.created ?? now,
72
+ lastUsed: now,
73
+ cookieCount: cookies.length,
74
+ localStorageKeys: Object.keys(storageData).length,
75
+ lastUrl,
76
+ authStatus,
77
+ profileVersion: PROFILE_VERSION,
78
+ };
79
+ await this.writeSecure(join(domainDir, "meta.json"), JSON.stringify(meta, null, 2));
80
+ // -- State snapshot -----------------------------------------------------
81
+ const state = {
82
+ lastUrl,
83
+ timestamp: now,
84
+ authStatus,
85
+ };
86
+ await this.writeSecure(join(domainDir, "state.json"), JSON.stringify(state, null, 2));
87
+ return meta;
88
+ }
89
+ /**
90
+ * Restore a previously saved profile into the current browser context.
91
+ *
92
+ * Checks profile age (default 24 h), decrypts cookies, and restores
93
+ * localStorage if a page is available.
94
+ */
95
+ async loadProfile(domain, context, page) {
96
+ const domainDir = this.domainDir(domain);
97
+ // -- Existence check ---------------------------------------------------
98
+ if (!existsSync(domainDir)) {
99
+ return this.loadResult(domain, false, 0, 0, false, "No profile found");
100
+ }
101
+ // -- Age check ---------------------------------------------------------
102
+ const meta = await this.readMeta(domain);
103
+ if (meta) {
104
+ const age = Date.now() - new Date(meta.lastUsed).getTime();
105
+ if (age > SiteProfileManager.MAX_PROFILE_AGE_MS) {
106
+ return this.loadResult(domain, false, 0, 0, false, `Profile expired (${Math.round(age / 3600000)}h old, max ${SiteProfileManager.MAX_PROFILE_AGE_MS / 3600000}h)`);
107
+ }
108
+ }
109
+ // -- Cookies -----------------------------------------------------------
110
+ let cookiesRestored = 0;
111
+ try {
112
+ const encData = await readFile(join(domainDir, "cookies.enc.json"), "utf-8");
113
+ const decrypted = this.decrypt(encData);
114
+ const cookies = JSON.parse(decrypted);
115
+ if (Array.isArray(cookies) && cookies.length > 0) {
116
+ // Filter out expired cookies before restoring
117
+ const now = Math.floor(Date.now() / 1000);
118
+ const validCookies = cookies.filter((c) => c.expires === undefined || c.expires === -1 || c.expires > now);
119
+ if (validCookies.length > 0) {
120
+ await context.addCookies(validCookies);
121
+ }
122
+ cookiesRestored = validCookies.length;
123
+ }
124
+ }
125
+ catch (err) {
126
+ console.debug(`[SiteProfileManager] Cookie restore failed for ${domain}: ${err.message}`);
127
+ }
128
+ // -- localStorage ------------------------------------------------------
129
+ let storageKeysRestored = 0;
130
+ if (page) {
131
+ try {
132
+ const storageRaw = await readFile(join(domainDir, "storage.json"), "utf-8");
133
+ const storageData = JSON.parse(storageRaw);
134
+ const keys = Object.keys(storageData);
135
+ if (keys.length > 0) {
136
+ await page.evaluate((data) => {
137
+ for (const [key, value] of Object.entries(data)) {
138
+ try {
139
+ window.localStorage.setItem(key, value);
140
+ }
141
+ catch {
142
+ // Storage quota or security — skip this key
143
+ }
144
+ }
145
+ }, storageData);
146
+ storageKeysRestored = keys.length;
147
+ }
148
+ }
149
+ catch (err) {
150
+ console.debug(`[SiteProfileManager] Storage restore failed for ${domain}: ${err.message}`);
151
+ }
152
+ }
153
+ const sessionValid = cookiesRestored > 0 || storageKeysRestored > 0;
154
+ const message = sessionValid
155
+ ? `Restored ${cookiesRestored} cookies and ${storageKeysRestored} storage keys`
156
+ : "Profile loaded but no session data was restorable";
157
+ return this.loadResult(domain, true, cookiesRestored, storageKeysRestored, sessionValid, message);
158
+ }
159
+ /**
160
+ * List all saved site profiles with summary information.
161
+ */
162
+ async listProfiles() {
163
+ if (!existsSync(this.profileDir)) {
164
+ return [];
165
+ }
166
+ const entries = await readdir(this.profileDir, { withFileTypes: true });
167
+ const summaries = [];
168
+ for (const entry of entries) {
169
+ if (!entry.isDirectory())
170
+ continue;
171
+ try {
172
+ const summary = await this.getProfileHealth(entry.name);
173
+ summaries.push(summary);
174
+ }
175
+ catch {
176
+ // Corrupted profile directory — skip
177
+ summaries.push({
178
+ domain: entry.name,
179
+ lastUsed: "unknown",
180
+ cookieCount: 0,
181
+ authStatus: "unknown",
182
+ sizeBytes: 0,
183
+ healthy: false,
184
+ });
185
+ }
186
+ }
187
+ // Sort by lastUsed descending (most recent first)
188
+ return summaries.sort((a, b) => {
189
+ if (a.lastUsed === "unknown")
190
+ return 1;
191
+ if (b.lastUsed === "unknown")
192
+ return -1;
193
+ return new Date(b.lastUsed).getTime() - new Date(a.lastUsed).getTime();
194
+ });
195
+ }
196
+ /**
197
+ * Delete a site profile and all its data.
198
+ */
199
+ async deleteProfile(domain) {
200
+ const domainDir = this.domainDir(domain);
201
+ if (!existsSync(domainDir)) {
202
+ return false;
203
+ }
204
+ await rm(domainDir, { recursive: true, force: true });
205
+ return true;
206
+ }
207
+ /**
208
+ * Check whether the current page session is still valid.
209
+ *
210
+ * Detects login redirects and login forms to determine if the
211
+ * previously restored session has expired.
212
+ */
213
+ async checkSessionValidity(page, domain) {
214
+ try {
215
+ const currentUrl = page.url();
216
+ // Blank or error pages are unknown
217
+ if (!currentUrl || currentUrl === "about:blank") {
218
+ return { valid: false, reason: "unknown" };
219
+ }
220
+ let parsedUrl;
221
+ try {
222
+ parsedUrl = new URL(currentUrl);
223
+ }
224
+ catch {
225
+ return { valid: false, reason: "unknown" };
226
+ }
227
+ // Check if we were redirected to a different domain
228
+ const currentDomain = parsedUrl.hostname;
229
+ if (currentDomain !== domain && !currentDomain.endsWith(`.${domain}`)) {
230
+ return {
231
+ valid: false,
232
+ reason: "redirected",
233
+ redirectedTo: currentUrl,
234
+ };
235
+ }
236
+ // Check if URL path contains login-related segments
237
+ const path = parsedUrl.pathname.toLowerCase();
238
+ const isLoginPath = LOGIN_PATH_PATTERNS.some((pattern) => path.includes(pattern));
239
+ if (isLoginPath) {
240
+ return {
241
+ valid: false,
242
+ reason: "expired",
243
+ redirectedTo: currentUrl,
244
+ };
245
+ }
246
+ // Check for login forms on the page
247
+ const hasLoginForm = await page
248
+ .evaluate(() => {
249
+ // Look for forms containing password inputs
250
+ const passwordInputs = document.querySelectorAll('input[type="password"]');
251
+ if (passwordInputs.length > 0) {
252
+ // Check if any password input is visible
253
+ for (let i = 0; i < passwordInputs.length; i++) {
254
+ const el = passwordInputs[i];
255
+ const rect = el.getBoundingClientRect();
256
+ // Only count visible password fields
257
+ if (rect.width > 0 && rect.height > 0) {
258
+ return true;
259
+ }
260
+ }
261
+ }
262
+ return false;
263
+ })
264
+ .catch(() => false);
265
+ if (hasLoginForm) {
266
+ return { valid: false, reason: "expired" };
267
+ }
268
+ return { valid: true, reason: "active" };
269
+ }
270
+ catch {
271
+ return { valid: false, reason: "unknown" };
272
+ }
273
+ }
274
+ /**
275
+ * Get health and summary information for a single domain profile.
276
+ */
277
+ async getProfileHealth(domain) {
278
+ const domainDir = this.domainDir(domain);
279
+ const metaPath = join(domainDir, "meta.json");
280
+ const defaultSummary = {
281
+ domain,
282
+ lastUsed: "unknown",
283
+ cookieCount: 0,
284
+ authStatus: "unknown",
285
+ sizeBytes: 0,
286
+ healthy: false,
287
+ };
288
+ if (!existsSync(metaPath)) {
289
+ return defaultSummary;
290
+ }
291
+ try {
292
+ const metaRaw = await readFile(metaPath, "utf-8");
293
+ const meta = JSON.parse(metaRaw);
294
+ // Compute total profile size
295
+ const totalSize = await this.computeDirSize(domainDir);
296
+ // Check cookie freshness
297
+ const age = Date.now() - new Date(meta.lastUsed).getTime();
298
+ const isExpired = age > SiteProfileManager.MAX_PROFILE_AGE_MS;
299
+ // Verify required files exist
300
+ const hasCookies = existsSync(join(domainDir, "cookies.enc.json"));
301
+ const hasState = existsSync(join(domainDir, "state.json"));
302
+ const healthy = !isExpired && hasCookies && hasState;
303
+ return {
304
+ domain: meta.domain,
305
+ lastUsed: meta.lastUsed,
306
+ cookieCount: meta.cookieCount,
307
+ authStatus: isExpired ? "expired" : meta.authStatus,
308
+ sizeBytes: totalSize,
309
+ healthy,
310
+ };
311
+ }
312
+ catch {
313
+ return defaultSummary;
314
+ }
315
+ }
316
+ // -------------------------------------------------------------------------
317
+ // Encryption
318
+ // -------------------------------------------------------------------------
319
+ /**
320
+ * Derive a machine-bound encryption key from hostname, home directory,
321
+ * and a fixed salt. This ties profiles to the machine they were created on.
322
+ */
323
+ getEncryptionKey() {
324
+ const material = `cbrowser-profile-${hostname()}-${homedir()}-v1`;
325
+ return createHash("sha256").update(material).digest();
326
+ }
327
+ /**
328
+ * Encrypt a string with AES-256-GCM.
329
+ * Returns a JSON string containing { iv, authTag, data }.
330
+ */
331
+ encrypt(data) {
332
+ const key = this.getEncryptionKey();
333
+ const iv = randomBytes(12); // 96-bit IV for GCM
334
+ const cipher = createCipheriv("aes-256-gcm", key, iv);
335
+ let encrypted = cipher.update(data, "utf8", "base64");
336
+ encrypted += cipher.final("base64");
337
+ const authTag = cipher.getAuthTag();
338
+ return JSON.stringify({
339
+ iv: iv.toString("base64"),
340
+ authTag: authTag.toString("base64"),
341
+ data: encrypted,
342
+ });
343
+ }
344
+ /**
345
+ * Decrypt an AES-256-GCM encrypted JSON envelope.
346
+ * Throws on tampered or corrupted data (GCM auth tag verification).
347
+ */
348
+ decrypt(encryptedJson) {
349
+ const parsed = JSON.parse(encryptedJson);
350
+ const { iv, authTag, data } = parsed;
351
+ const key = this.getEncryptionKey();
352
+ const decipher = createDecipheriv("aes-256-gcm", key, Buffer.from(iv, "base64"));
353
+ decipher.setAuthTag(Buffer.from(authTag, "base64"));
354
+ let decrypted = decipher.update(data, "base64", "utf8");
355
+ decrypted += decipher.final("utf8");
356
+ return decrypted;
357
+ }
358
+ // -------------------------------------------------------------------------
359
+ // Private helpers
360
+ // -------------------------------------------------------------------------
361
+ /** Get the filesystem path for a domain's profile directory. */
362
+ domainDir(domain) {
363
+ // Sanitize domain for filesystem safety
364
+ const safeDomain = domain.replace(/[^a-zA-Z0-9._-]/g, "_");
365
+ return join(this.profileDir, safeDomain);
366
+ }
367
+ /** Write data to a file with restricted permissions (0o600). */
368
+ async writeSecure(filePath, data) {
369
+ await writeFile(filePath, data, { encoding: "utf-8", mode: FILE_MODE });
370
+ // Ensure permissions even if file existed with different mode
371
+ await chmod(filePath, FILE_MODE);
372
+ }
373
+ /** Read meta.json for a domain, returning null if missing or corrupt. */
374
+ async readMeta(domain) {
375
+ const metaPath = join(this.domainDir(domain), "meta.json");
376
+ try {
377
+ const raw = await readFile(metaPath, "utf-8");
378
+ return JSON.parse(raw);
379
+ }
380
+ catch {
381
+ return null;
382
+ }
383
+ }
384
+ /**
385
+ * Extract localStorage from all pages in the context.
386
+ * Falls back gracefully if pages are inaccessible.
387
+ */
388
+ async extractLocalStorage(context) {
389
+ const pages = context.pages();
390
+ // Use the first available page
391
+ const page = pages.find((p) => {
392
+ try {
393
+ const url = p.url();
394
+ return url && url !== "about:blank" && !url.startsWith("chrome");
395
+ }
396
+ catch {
397
+ return false;
398
+ }
399
+ });
400
+ if (!page)
401
+ return {};
402
+ try {
403
+ return await page.evaluate(() => {
404
+ const data = {};
405
+ for (let i = 0; i < window.localStorage.length; i++) {
406
+ const key = window.localStorage.key(i);
407
+ if (key) {
408
+ data[key] = window.localStorage.getItem(key) || "";
409
+ }
410
+ }
411
+ return data;
412
+ });
413
+ }
414
+ catch (err) {
415
+ console.debug(`[SiteProfileManager] localStorage extraction failed: ${err.message}`);
416
+ return {};
417
+ }
418
+ }
419
+ /**
420
+ * Infer authentication status from cookies and the last visited URL.
421
+ * Simple heuristic: presence of session-like cookies suggests authentication.
422
+ */
423
+ inferAuthStatus(cookies, lastUrl) {
424
+ // Check URL for login pages
425
+ try {
426
+ const path = new URL(lastUrl).pathname.toLowerCase();
427
+ if (LOGIN_PATH_PATTERNS.some((p) => path.includes(p))) {
428
+ return "none";
429
+ }
430
+ }
431
+ catch {
432
+ // Invalid URL — can't determine from path
433
+ }
434
+ if (cookies.length === 0) {
435
+ return "none";
436
+ }
437
+ // Look for common session cookie patterns
438
+ const sessionCookieNames = [
439
+ "session",
440
+ "sid",
441
+ "token",
442
+ "auth",
443
+ "jwt",
444
+ "access_token",
445
+ "refresh_token",
446
+ "PHPSESSID",
447
+ "JSESSIONID",
448
+ "connect.sid",
449
+ "_session",
450
+ "laravel_session",
451
+ "rack.session",
452
+ "user",
453
+ ];
454
+ const hasSessionCookie = cookies.some((c) => {
455
+ const name = c.name.toLowerCase();
456
+ return sessionCookieNames.some((pattern) => name === pattern.toLowerCase() ||
457
+ name.includes(pattern.toLowerCase()));
458
+ });
459
+ return hasSessionCookie ? "authenticated" : "unknown";
460
+ }
461
+ /** Compute total size of all files in a directory (non-recursive). */
462
+ async computeDirSize(dirPath) {
463
+ try {
464
+ const entries = await readdir(dirPath);
465
+ let total = 0;
466
+ for (const entry of entries) {
467
+ try {
468
+ const s = await stat(join(dirPath, entry));
469
+ if (s.isFile()) {
470
+ total += s.size;
471
+ }
472
+ }
473
+ catch {
474
+ // Skip inaccessible files
475
+ }
476
+ }
477
+ return total;
478
+ }
479
+ catch {
480
+ return 0;
481
+ }
482
+ }
483
+ /** Build a ProfileLoadResult object. */
484
+ loadResult(domain, success, cookiesRestored, storageKeysRestored, sessionValid, message) {
485
+ return {
486
+ success,
487
+ domain,
488
+ cookiesRestored,
489
+ storageKeysRestored,
490
+ sessionValid,
491
+ message,
492
+ };
493
+ }
494
+ }
495
+ //# sourceMappingURL=site-profile-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"site-profile-manager.js","sourceRoot":"","sources":["../../src/browser/site-profile-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,127 @@
1
+ /**
2
+ * CBrowser - Goal Decomposer
3
+ * Transforms user goals into executable sub-goal trees with fallback strategies.
4
+ * Uses site model for informed planning, Claude API for novel goals.
5
+ *
6
+ * @copyright 2026 Alexandria Eden alexandria.shai.eden@gmail.com https://cbrowser.ai
7
+ * @license MIT
8
+ * @since v18.35.0
9
+ */
10
+ import type { GoalType, ParsedGoal, GoalPlan, GoalResult, PlannedAction } from "./goal-types.js";
11
+ import type { GoalPath } from "../site-model/types.js";
12
+ /**
13
+ * Minimal interface for the SiteModelManager dependency.
14
+ * Defined here to avoid circular imports -- the concrete class lives in
15
+ * src/site-model/manager.ts (not yet implemented). When the real manager
16
+ * ships, it must satisfy this contract.
17
+ */
18
+ export interface SiteModelManagerLike {
19
+ /** Query for the best known path matching a goal type on a domain */
20
+ queryBestPath(domain: string, goalType: GoalType): GoalPath | null;
21
+ /** Record a successful goal execution path */
22
+ recordGoalPath(domain: string, goalDescription: string, goalType: GoalType, actions: PlannedAction[], persona?: string): void;
23
+ /** Record a failure pattern for future avoidance */
24
+ recordFailure(domain: string, pageUrl: string, failureType: string, conditions: string[]): void;
25
+ }
26
+ /**
27
+ * Transforms natural-language user goals into structured, executable plans.
28
+ *
29
+ * Planning priority:
30
+ * 1. Site model -- if we have seen this domain before and have a path with
31
+ * >60% success rate, we reuse it.
32
+ * 2. Heuristic -- keyword-driven strategy generation using common web patterns.
33
+ * 3. Claude API -- future enhancement for truly novel goals (TODO).
34
+ */
35
+ export declare class GoalDecomposer {
36
+ private siteModelManager;
37
+ constructor(siteModelManager: SiteModelManagerLike);
38
+ /**
39
+ * Parse a natural language goal into a structured ParsedGoal.
40
+ *
41
+ * Classification pipeline:
42
+ * 1. Lowercase and normalize the goal text.
43
+ * 2. Match against GOAL_PATTERNS to determine GoalType.
44
+ * - Longest matching phrase wins.
45
+ * - Ties broken by declaration order in the patterns object.
46
+ * 3. If GoalType is "find_information", sub-classify via INFORMATION_PATTERNS.
47
+ * 4. Extract keywords by stripping stop words from the original text.
48
+ * 5. Assign confidence based on match strength.
49
+ */
50
+ parseGoal(goal: string): ParsedGoal;
51
+ /**
52
+ * Generate a complete execution plan for a goal on a specific domain.
53
+ *
54
+ * Strategy:
55
+ * 1. Parse the goal.
56
+ * 2. Check site model for known successful paths.
57
+ * 3. If no site model coverage, generate heuristic strategies.
58
+ * 4. Future: fall back to Claude API for truly novel goals.
59
+ */
60
+ decompose(goal: string, domain: string): Promise<GoalPlan>;
61
+ /**
62
+ * Record the outcome of a goal execution back to the site model.
63
+ * This closes the learning loop: successful paths get reinforced,
64
+ * failures get cataloged for future avoidance.
65
+ */
66
+ recordOutcome(domain: string, result: GoalResult): Promise<void>;
67
+ /**
68
+ * Classify goal text against GOAL_PATTERNS.
69
+ * Uses longest-match-wins to resolve ambiguity.
70
+ */
71
+ private classifyGoalType;
72
+ /**
73
+ * Sub-classify an information-seeking goal by the kind of information sought.
74
+ */
75
+ private classifyInformationType;
76
+ /**
77
+ * Extract meaningful keywords from goal text.
78
+ * Strips stop words, punctuation, and deduplicates.
79
+ */
80
+ private extractKeywords;
81
+ /**
82
+ * Build a plan from a known site model path.
83
+ * The site model path represents a previously successful execution,
84
+ * so we wrap it as a high-confidence strategy.
85
+ */
86
+ private buildSiteModelPlan;
87
+ /**
88
+ * Build a heuristic plan based on goal type.
89
+ * Each goal type gets a structured set of sub-goals with
90
+ * navigation, URL-pattern, and search fallback strategies.
91
+ */
92
+ private buildHeuristicPlan;
93
+ private buildFindInformationSubGoals;
94
+ private buildCompleteActionSubGoals;
95
+ private buildNavigateToSubGoals;
96
+ private buildFillFormSubGoals;
97
+ private buildCompareSubGoals;
98
+ private buildExploreSubGoals;
99
+ private buildExtractDataSubGoals;
100
+ /**
101
+ * Generate all three heuristic strategies for a goal:
102
+ * navigation-based, URL-pattern-based, and search-based.
103
+ * Returned in confidence-descending order.
104
+ */
105
+ private generateAllStrategies;
106
+ /**
107
+ * Generate a navigation-based strategy.
108
+ * Clicks on nav links whose text matches the goal keywords.
109
+ */
110
+ private generateNavStrategy;
111
+ /**
112
+ * Generate a URL-pattern strategy.
113
+ * Tries direct navigation to common URL patterns matching the goal keywords.
114
+ */
115
+ private generateUrlStrategy;
116
+ /**
117
+ * Generate a search-based strategy.
118
+ * Finds a search input on the page, enters goal keywords, and browses results.
119
+ */
120
+ private generateSearchStrategy;
121
+ /**
122
+ * Extract the set of actions from the first successful strategy path
123
+ * across completed sub-goals. Used to record winning paths in the site model.
124
+ */
125
+ private extractSuccessfulActions;
126
+ }
127
+ //# sourceMappingURL=goal-decomposer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"goal-decomposer.d.ts","sourceRoot":"","sources":["../../src/cognitive/goal-decomposer.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,QAAQ,EAER,UAAU,EACV,QAAQ,EACR,UAAU,EAGV,aAAa,EACd,MAAM,iBAAiB,CAAC;AAKzB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAOvD;;;;;GAKG;AACH,MAAM,WAAW,oBAAoB;IACnC,qEAAqE;IACrE,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,QAAQ,GAAG,IAAI,CAAC;IACnE,8CAA8C;IAC9C,cAAc,CACZ,MAAM,EAAE,MAAM,EACd,eAAe,EAAE,MAAM,EACvB,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,aAAa,EAAE,EACxB,OAAO,CAAC,EAAE,MAAM,GACf,IAAI,CAAC;IACR,oDAAoD;IACpD,aAAa,CACX,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAAE,GACnB,IAAI,CAAC;CACT;AAuDD;;;;;;;;GAQG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,gBAAgB,CAAuB;gBAEnC,gBAAgB,EAAE,oBAAoB;IAQlD;;;;;;;;;;;OAWG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU;IAyBnC;;;;;;;;OAQG;IACG,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAyBhE;;;;OAIG;IACG,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAsCtE;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAuCxB;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAyB/B;;;OAGG;IACH,OAAO,CAAC,eAAe;IAevB;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;IA4C1B;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;IAmE1B,OAAO,CAAC,4BAA4B;IAqFpC,OAAO,CAAC,2BAA2B;IA4EnC,OAAO,CAAC,uBAAuB;IAgB/B,OAAO,CAAC,qBAAqB;IAqC7B,OAAO,CAAC,oBAAoB;IAmD5B,OAAO,CAAC,oBAAoB;IAyD5B,OAAO,CAAC,wBAAwB;IAqFhC;;;;OAIG;IACH,OAAO,CAAC,qBAAqB;IAW7B;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAmD3B;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IA0E3B;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IAqE9B;;;OAGG;IACH,OAAO,CAAC,wBAAwB;CAiBjC"}