userflow-mcp 0.2.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 (87) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +177 -0
  3. package/dist/analysis/clarity.d.ts +7 -0
  4. package/dist/analysis/clarity.d.ts.map +1 -0
  5. package/dist/analysis/clarity.js +114 -0
  6. package/dist/analysis/clarity.js.map +1 -0
  7. package/dist/analysis/cognitive-load.d.ts +7 -0
  8. package/dist/analysis/cognitive-load.d.ts.map +1 -0
  9. package/dist/analysis/cognitive-load.js +45 -0
  10. package/dist/analysis/cognitive-load.js.map +1 -0
  11. package/dist/analysis/emotional-arc.d.ts +10 -0
  12. package/dist/analysis/emotional-arc.d.ts.map +1 -0
  13. package/dist/analysis/emotional-arc.js +95 -0
  14. package/dist/analysis/emotional-arc.js.map +1 -0
  15. package/dist/analysis/friction.d.ts +23 -0
  16. package/dist/analysis/friction.d.ts.map +1 -0
  17. package/dist/analysis/friction.js +61 -0
  18. package/dist/analysis/friction.js.map +1 -0
  19. package/dist/feedback/comparison.d.ts +11 -0
  20. package/dist/feedback/comparison.d.ts.map +1 -0
  21. package/dist/feedback/comparison.js +156 -0
  22. package/dist/feedback/comparison.js.map +1 -0
  23. package/dist/feedback/generator.d.ts +19 -0
  24. package/dist/feedback/generator.d.ts.map +1 -0
  25. package/dist/feedback/generator.js +139 -0
  26. package/dist/feedback/generator.js.map +1 -0
  27. package/dist/feedback/report.d.ts +10 -0
  28. package/dist/feedback/report.d.ts.map +1 -0
  29. package/dist/feedback/report.js +123 -0
  30. package/dist/feedback/report.js.map +1 -0
  31. package/dist/index.d.ts +3 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +13 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/personas/engine.d.ts +39 -0
  36. package/dist/personas/engine.d.ts.map +1 -0
  37. package/dist/personas/engine.js +58 -0
  38. package/dist/personas/engine.js.map +1 -0
  39. package/dist/personas/presets.d.ts +11 -0
  40. package/dist/personas/presets.d.ts.map +1 -0
  41. package/dist/personas/presets.js +251 -0
  42. package/dist/personas/presets.js.map +1 -0
  43. package/dist/personas/types.d.ts +11 -0
  44. package/dist/personas/types.d.ts.map +1 -0
  45. package/dist/personas/types.js +23 -0
  46. package/dist/personas/types.js.map +1 -0
  47. package/dist/server.d.ts +3 -0
  48. package/dist/server.d.ts.map +1 -0
  49. package/dist/server.js +288 -0
  50. package/dist/server.js.map +1 -0
  51. package/dist/session/session-manager.d.ts +54 -0
  52. package/dist/session/session-manager.d.ts.map +1 -0
  53. package/dist/session/session-manager.js +228 -0
  54. package/dist/session/session-manager.js.map +1 -0
  55. package/dist/session/types.d.ts +35 -0
  56. package/dist/session/types.d.ts.map +1 -0
  57. package/dist/session/types.js +2 -0
  58. package/dist/session/types.js.map +1 -0
  59. package/dist/types.d.ts +284 -0
  60. package/dist/types.d.ts.map +1 -0
  61. package/dist/types.js +3 -0
  62. package/dist/types.js.map +1 -0
  63. package/dist/utils/actions.d.ts +17 -0
  64. package/dist/utils/actions.d.ts.map +1 -0
  65. package/dist/utils/actions.js +89 -0
  66. package/dist/utils/actions.js.map +1 -0
  67. package/dist/utils/browser.d.ts +22 -0
  68. package/dist/utils/browser.d.ts.map +1 -0
  69. package/dist/utils/browser.js +122 -0
  70. package/dist/utils/browser.js.map +1 -0
  71. package/dist/utils/page-snapshot.d.ts +11 -0
  72. package/dist/utils/page-snapshot.d.ts.map +1 -0
  73. package/dist/utils/page-snapshot.js +102 -0
  74. package/dist/utils/page-snapshot.js.map +1 -0
  75. package/dist/walker/action-planner.d.ts +15 -0
  76. package/dist/walker/action-planner.d.ts.map +1 -0
  77. package/dist/walker/action-planner.js +236 -0
  78. package/dist/walker/action-planner.js.map +1 -0
  79. package/dist/walker/flow-walker.d.ts +10 -0
  80. package/dist/walker/flow-walker.d.ts.map +1 -0
  81. package/dist/walker/flow-walker.js +107 -0
  82. package/dist/walker/flow-walker.js.map +1 -0
  83. package/dist/walker/session-recorder.d.ts +28 -0
  84. package/dist/walker/session-recorder.d.ts.map +1 -0
  85. package/dist/walker/session-recorder.js +90 -0
  86. package/dist/walker/session-recorder.js.map +1 -0
  87. package/package.json +71 -0
@@ -0,0 +1,17 @@
1
+ import type { Page } from "puppeteer-core";
2
+ export interface ActionInput {
3
+ readonly type: string;
4
+ readonly target?: string;
5
+ readonly value?: string;
6
+ readonly scrollAmount?: number;
7
+ }
8
+ export interface ActionResult {
9
+ readonly success: boolean;
10
+ readonly error: string | null;
11
+ }
12
+ /**
13
+ * Execute an action on a Puppeteer page.
14
+ * Supports: click, type, scroll, scroll_up, navigate, select, hover, press_key, wait, read, give_up.
15
+ */
16
+ export declare function executeAction(page: Page, action: ActionInput): Promise<ActionResult>;
17
+ //# sourceMappingURL=actions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../src/utils/actions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAM3C,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED;;;GAGG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CAiF1F"}
@@ -0,0 +1,89 @@
1
+ const DEFAULT_WAIT_TIMEOUT = 5000;
2
+ const POST_ACTION_DELAY = 1500;
3
+ const SCROLL_DELAY = 800;
4
+ /**
5
+ * Execute an action on a Puppeteer page.
6
+ * Supports: click, type, scroll, scroll_up, navigate, select, hover, press_key, wait, read, give_up.
7
+ */
8
+ export async function executeAction(page, action) {
9
+ try {
10
+ switch (action.type) {
11
+ case "click": {
12
+ if (!action.target)
13
+ return { success: false, error: "click requires a target selector" };
14
+ await page.waitForSelector(action.target, { visible: true, timeout: DEFAULT_WAIT_TIMEOUT });
15
+ await page.click(action.target);
16
+ await new Promise((resolve) => setTimeout(resolve, POST_ACTION_DELAY));
17
+ return { success: true, error: null };
18
+ }
19
+ case "type": {
20
+ if (!action.target)
21
+ return { success: false, error: "type requires a target selector" };
22
+ if (!action.value)
23
+ return { success: false, error: "type requires a value" };
24
+ await page.waitForSelector(action.target, { visible: true, timeout: DEFAULT_WAIT_TIMEOUT });
25
+ await page.click(action.target, { count: 3 });
26
+ await page.type(action.target, action.value);
27
+ return { success: true, error: null };
28
+ }
29
+ case "scroll": {
30
+ const amount = action.scrollAmount ?? 500;
31
+ await page.evaluate((px) => window.scrollBy(0, px), amount);
32
+ await new Promise((resolve) => setTimeout(resolve, SCROLL_DELAY));
33
+ return { success: true, error: null };
34
+ }
35
+ case "scroll_up": {
36
+ const amount = action.scrollAmount ?? 500;
37
+ await page.evaluate((px) => window.scrollBy(0, -px), amount);
38
+ await new Promise((resolve) => setTimeout(resolve, SCROLL_DELAY));
39
+ return { success: true, error: null };
40
+ }
41
+ case "navigate": {
42
+ if (!action.value)
43
+ return { success: false, error: "navigate requires a URL in value" };
44
+ await page.goto(action.value, { waitUntil: "networkidle2", timeout: 30_000 });
45
+ return { success: true, error: null };
46
+ }
47
+ case "select": {
48
+ if (!action.target)
49
+ return { success: false, error: "select requires a target selector" };
50
+ if (!action.value)
51
+ return { success: false, error: "select requires a value" };
52
+ await page.waitForSelector(action.target, { timeout: DEFAULT_WAIT_TIMEOUT });
53
+ await page.select(action.target, action.value);
54
+ return { success: true, error: null };
55
+ }
56
+ case "hover": {
57
+ if (!action.target)
58
+ return { success: false, error: "hover requires a target selector" };
59
+ await page.waitForSelector(action.target, { visible: true, timeout: DEFAULT_WAIT_TIMEOUT });
60
+ await page.hover(action.target);
61
+ await new Promise((resolve) => setTimeout(resolve, 500));
62
+ return { success: true, error: null };
63
+ }
64
+ case "press_key": {
65
+ if (!action.value)
66
+ return { success: false, error: "press_key requires a key name in value" };
67
+ await page.keyboard.press(action.value);
68
+ await new Promise((resolve) => setTimeout(resolve, 500));
69
+ return { success: true, error: null };
70
+ }
71
+ case "wait": {
72
+ const ms = action.scrollAmount ?? 2000;
73
+ await new Promise((resolve) => setTimeout(resolve, ms));
74
+ return { success: true, error: null };
75
+ }
76
+ case "read":
77
+ case "give_up": {
78
+ return { success: true, error: null };
79
+ }
80
+ default:
81
+ return { success: false, error: `Unknown action type: ${action.type}` };
82
+ }
83
+ }
84
+ catch (err) {
85
+ const message = err instanceof Error ? err.message : String(err);
86
+ return { success: false, error: message };
87
+ }
88
+ }
89
+ //# sourceMappingURL=actions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actions.js","sourceRoot":"","sources":["../../src/utils/actions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { type Browser, type Page } from "puppeteer-core";
2
+ /**
3
+ * Get or create a shared browser instance.
4
+ */
5
+ export declare function getBrowser(): Promise<Browser>;
6
+ /**
7
+ * Create a new page with the given viewport settings.
8
+ */
9
+ export declare function createPage(width: number, height: number, deviceScaleFactor?: number): Promise<Page>;
10
+ /**
11
+ * Navigate to a URL and wait for the page to be ready.
12
+ */
13
+ export declare function navigateAndWait(page: Page, url: string, delay?: number): Promise<void>;
14
+ /**
15
+ * Close a page safely.
16
+ */
17
+ export declare function closePage(page: Page): Promise<void>;
18
+ /**
19
+ * Shut down the shared browser instance.
20
+ */
21
+ export declare function closeBrowser(): Promise<void>;
22
+ //# sourceMappingURL=browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../src/utils/browser.ts"],"names":[],"mappings":"AAAA,OAAkB,EAAE,KAAK,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,gBAAgB,CAAC;AA4DpE;;GAEG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,CAoBnD;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,iBAAiB,GAAE,MAAU,GAC5B,OAAO,CAAC,IAAI,CAAC,CAKf;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,IAAI,EACV,GAAG,EAAE,MAAM,EACX,KAAK,GAAE,MAAU,GAChB,OAAO,CAAC,IAAI,CAAC,CASf;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAQzD;AAED;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CASlD"}
@@ -0,0 +1,122 @@
1
+ import puppeteer from "puppeteer-core";
2
+ import { execSync } from "node:child_process";
3
+ import { existsSync } from "node:fs";
4
+ let browserInstance = null;
5
+ /**
6
+ * Find Chrome/Chromium executable on the system.
7
+ * Checks common installation paths across macOS, Linux, and Windows.
8
+ */
9
+ function findChromePath() {
10
+ const envPath = process.env.CHROME_PATH || process.env.PUPPETEER_EXECUTABLE_PATH;
11
+ if (envPath && existsSync(envPath)) {
12
+ return envPath;
13
+ }
14
+ const paths = [
15
+ // macOS
16
+ "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",
17
+ "/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary",
18
+ "/Applications/Chromium.app/Contents/MacOS/Chromium",
19
+ "/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge",
20
+ "/Applications/Brave Browser.app/Contents/MacOS/Brave Browser",
21
+ // Linux
22
+ "/usr/bin/google-chrome",
23
+ "/usr/bin/google-chrome-stable",
24
+ "/usr/bin/chromium",
25
+ "/usr/bin/chromium-browser",
26
+ "/snap/bin/chromium",
27
+ // Windows (WSL)
28
+ "/mnt/c/Program Files/Google/Chrome/Application/chrome.exe",
29
+ "/mnt/c/Program Files (x86)/Google/Chrome/Application/chrome.exe",
30
+ ];
31
+ for (const chromePath of paths) {
32
+ if (existsSync(chromePath)) {
33
+ return chromePath;
34
+ }
35
+ }
36
+ try {
37
+ const result = execSync("which google-chrome || which chromium || which chromium-browser", {
38
+ encoding: "utf-8",
39
+ timeout: 5000,
40
+ }).trim();
41
+ if (result && existsSync(result)) {
42
+ return result;
43
+ }
44
+ }
45
+ catch {
46
+ // `which` failed
47
+ }
48
+ throw new Error("Could not find Chrome/Chromium. Install Google Chrome or set CHROME_PATH environment variable.\n" +
49
+ " macOS: brew install --cask google-chrome\n" +
50
+ " Linux: sudo apt install google-chrome-stable\n" +
51
+ " Or set: export CHROME_PATH=/path/to/chrome");
52
+ }
53
+ /**
54
+ * Get or create a shared browser instance.
55
+ */
56
+ export async function getBrowser() {
57
+ if (browserInstance && browserInstance.connected) {
58
+ return browserInstance;
59
+ }
60
+ const executablePath = findChromePath();
61
+ browserInstance = await puppeteer.launch({
62
+ executablePath,
63
+ headless: true,
64
+ args: [
65
+ "--no-sandbox",
66
+ "--disable-setuid-sandbox",
67
+ "--disable-dev-shm-usage",
68
+ "--disable-gpu",
69
+ "--disable-extensions",
70
+ ],
71
+ });
72
+ return browserInstance;
73
+ }
74
+ /**
75
+ * Create a new page with the given viewport settings.
76
+ */
77
+ export async function createPage(width, height, deviceScaleFactor = 1) {
78
+ const browser = await getBrowser();
79
+ const page = await browser.newPage();
80
+ await page.setViewport({ width, height, deviceScaleFactor });
81
+ return page;
82
+ }
83
+ /**
84
+ * Navigate to a URL and wait for the page to be ready.
85
+ */
86
+ export async function navigateAndWait(page, url, delay = 0) {
87
+ await page.goto(url, {
88
+ waitUntil: "networkidle2",
89
+ timeout: 30000,
90
+ });
91
+ if (delay > 0) {
92
+ await new Promise((resolve) => setTimeout(resolve, delay));
93
+ }
94
+ }
95
+ /**
96
+ * Close a page safely.
97
+ */
98
+ export async function closePage(page) {
99
+ try {
100
+ if (!page.isClosed()) {
101
+ await page.close();
102
+ }
103
+ }
104
+ catch {
105
+ // Page may already be closed
106
+ }
107
+ }
108
+ /**
109
+ * Shut down the shared browser instance.
110
+ */
111
+ export async function closeBrowser() {
112
+ if (browserInstance) {
113
+ try {
114
+ await browserInstance.close();
115
+ }
116
+ catch {
117
+ // Browser may already be closed
118
+ }
119
+ browserInstance = null;
120
+ }
121
+ }
122
+ //# sourceMappingURL=browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.js","sourceRoot":"","sources":["../../src/utils/browser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { Page } from "puppeteer-core";
2
+ import type { PageSnapshot } from "../types.js";
3
+ /**
4
+ * Extract a full snapshot of the current page state.
5
+ * Gathers all interactive elements, text content, headings, error messages, etc.
6
+ * Shared between session manager (step-by-step) and legacy flow walker (auto_walk).
7
+ */
8
+ export declare function extractPageSnapshot(page: Page, options?: {
9
+ readonly fullPage?: boolean;
10
+ }): Promise<PageSnapshot>;
11
+ //# sourceMappingURL=page-snapshot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-snapshot.d.ts","sourceRoot":"","sources":["../../src/utils/page-snapshot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,YAAY,EAAe,MAAM,aAAa,CAAC;AAE7D;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,IAAI,EACV,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,GACxC,OAAO,CAAC,YAAY,CAAC,CA4GvB"}
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Extract a full snapshot of the current page state.
3
+ * Gathers all interactive elements, text content, headings, error messages, etc.
4
+ * Shared between session manager (step-by-step) and legacy flow walker (auto_walk).
5
+ */
6
+ export async function extractPageSnapshot(page, options) {
7
+ const startTime = Date.now();
8
+ const url = page.url();
9
+ const title = await page.title();
10
+ const pageData = await page.evaluate(() => {
11
+ const getSelector = (el) => {
12
+ if (el.id)
13
+ return `#${el.id}`;
14
+ if (el.getAttribute("data-testid"))
15
+ return `[data-testid="${el.getAttribute("data-testid")}"]`;
16
+ if (el.getAttribute("name"))
17
+ return `[name="${el.getAttribute("name")}"]`;
18
+ const tag = el.tagName.toLowerCase();
19
+ const classes = el.className && typeof el.className === "string"
20
+ ? "." + el.className.trim().split(/\s+/).slice(0, 2).join(".")
21
+ : "";
22
+ const parent = el.parentElement;
23
+ if (parent) {
24
+ const siblings = Array.from(parent.children).filter((c) => c.tagName === el.tagName);
25
+ if (siblings.length > 1) {
26
+ const index = siblings.indexOf(el) + 1;
27
+ return `${tag}${classes}:nth-of-type(${index})`;
28
+ }
29
+ }
30
+ return `${tag}${classes}`;
31
+ };
32
+ const isVisible = (el) => {
33
+ const style = window.getComputedStyle(el);
34
+ const rect = el.getBoundingClientRect();
35
+ return (style.display !== "none" &&
36
+ style.visibility !== "hidden" &&
37
+ style.opacity !== "0" &&
38
+ rect.width > 0 &&
39
+ rect.height > 0);
40
+ };
41
+ const toPageElement = (el) => {
42
+ const htmlEl = el;
43
+ return {
44
+ selector: getSelector(el),
45
+ tagName: el.tagName.toLowerCase(),
46
+ text: (el.textContent ?? "").trim().slice(0, 200),
47
+ type: htmlEl.type || undefined,
48
+ href: el.href || undefined,
49
+ isVisible: isVisible(el),
50
+ isInteractive: true,
51
+ ariaLabel: el.getAttribute("aria-label") || undefined,
52
+ placeholder: htmlEl.placeholder || undefined,
53
+ };
54
+ };
55
+ const buttons = Array.from(document.querySelectorAll("button, [role='button'], input[type='submit'], input[type='button']"))
56
+ .map(toPageElement);
57
+ const links = Array.from(document.querySelectorAll("a[href]"))
58
+ .filter((el) => {
59
+ const href = el.href;
60
+ return href && !href.startsWith("javascript:") && !href.startsWith("#");
61
+ })
62
+ .map(toPageElement);
63
+ const formFields = Array.from(document.querySelectorAll("input:not([type='hidden']):not([type='submit']):not([type='button']), textarea, select"))
64
+ .map(toPageElement);
65
+ const allInteractive = [...buttons, ...links, ...formFields];
66
+ const headings = Array.from(document.querySelectorAll("h1, h2, h3"))
67
+ .map((h) => (h.textContent ?? "").trim())
68
+ .filter((t) => t.length > 0);
69
+ const mainText = (document.body?.innerText ?? "").trim().slice(0, 500);
70
+ const errorSelectors = [
71
+ "[class*='error']", "[class*='Error']",
72
+ "[role='alert']", "[class*='danger']",
73
+ "[class*='warning']", ".toast-error",
74
+ ];
75
+ const errorMessages = errorSelectors.flatMap((sel) => Array.from(document.querySelectorAll(sel))
76
+ .map((el) => (el.textContent ?? "").trim())
77
+ .filter((t) => t.length > 0 && t.length < 300));
78
+ return { buttons, links, formFields, allInteractive, headings, mainText, errorMessages };
79
+ });
80
+ const screenshotBuffer = await page.screenshot({
81
+ type: "png",
82
+ fullPage: options?.fullPage ?? false,
83
+ encoding: "binary",
84
+ });
85
+ const screenshot = Buffer.from(screenshotBuffer).toString("base64");
86
+ const loadTimeMs = Date.now() - startTime;
87
+ return {
88
+ url,
89
+ title,
90
+ timestamp: new Date().toISOString(),
91
+ screenshot,
92
+ interactiveElements: pageData.allInteractive,
93
+ headings: pageData.headings,
94
+ mainText: pageData.mainText,
95
+ formFields: pageData.formFields,
96
+ links: pageData.links,
97
+ buttons: pageData.buttons,
98
+ errorMessages: pageData.errorMessages,
99
+ loadTimeMs,
100
+ };
101
+ }
102
+ //# sourceMappingURL=page-snapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-snapshot.js","sourceRoot":"","sources":["../../src/utils/page-snapshot.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { Persona, PageSnapshot, StepAction, EmotionalState, FrictionPoint, SessionStep } from "../types.js";
2
+ /**
3
+ * Determine what emotional state this persona would feel on this page.
4
+ */
5
+ export declare function assessEmotion(persona: Persona, page: PageSnapshot, previousSteps: readonly SessionStep[], frictionPoints: readonly FrictionPoint[]): EmotionalState;
6
+ /**
7
+ * Detect friction points on the current page for this persona.
8
+ */
9
+ export declare function detectFriction(persona: Persona, page: PageSnapshot, stepIndex: number): readonly FrictionPoint[];
10
+ /**
11
+ * Plan the next action for a persona on the current page.
12
+ * Uses heuristic scoring based on persona goals and traits.
13
+ */
14
+ export declare function planNextAction(persona: Persona, page: PageSnapshot, previousSteps: readonly SessionStep[]): StepAction;
15
+ //# sourceMappingURL=action-planner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action-planner.d.ts","sourceRoot":"","sources":["../../src/walker/action-planner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAe,UAAU,EAAc,cAAc,EAAE,aAAa,EAAoB,WAAW,EAAE,MAAM,aAAa,CAAC;AAqC5J;;GAEG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,YAAY,EAClB,aAAa,EAAE,SAAS,WAAW,EAAE,EACrC,cAAc,EAAE,SAAS,aAAa,EAAE,GACvC,cAAc,CA2BhB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,YAAY,EAClB,SAAS,EAAE,MAAM,GAChB,SAAS,aAAa,EAAE,CAwE1B;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,YAAY,EAClB,aAAa,EAAE,SAAS,WAAW,EAAE,GACpC,UAAU,CA2EZ"}