cbrowser 19.6.0 → 20.0.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/README.md +292 -232
- package/THIRD_PARTY_LICENSES.md +416 -7
- package/dist/analysis/accessibility-empathy.d.ts.map +1 -1
- package/dist/analysis/accessibility-empathy.js +2 -0
- package/dist/analysis/accessibility-empathy.js.map +1 -1
- package/dist/analysis/competitive-benchmark.d.ts.map +1 -1
- package/dist/analysis/competitive-benchmark.js +70 -558
- package/dist/analysis/competitive-benchmark.js.map +1 -1
- package/dist/analysis/natural-language.d.ts.map +1 -1
- package/dist/analysis/natural-language.js +43 -0
- package/dist/analysis/natural-language.js.map +1 -1
- package/dist/analysis/persona-comparison.d.ts +7 -0
- package/dist/analysis/persona-comparison.d.ts.map +1 -1
- package/dist/analysis/persona-comparison.js +8 -1
- package/dist/analysis/persona-comparison.js.map +1 -1
- package/dist/browser-options.d.ts +23 -0
- package/dist/browser-options.d.ts.map +1 -0
- package/dist/browser-options.js +24 -0
- package/dist/browser-options.js.map +1 -0
- package/dist/browser.d.ts +36 -14
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +139 -196
- package/dist/browser.js.map +1 -1
- package/dist/cli-args.d.ts +9 -1
- package/dist/cli-args.d.ts.map +1 -1
- package/dist/cli-args.js +35 -7
- package/dist/cli-args.js.map +1 -1
- package/dist/cli-browser-flags.d.ts +33 -0
- package/dist/cli-browser-flags.d.ts.map +1 -0
- package/dist/cli-browser-flags.js +89 -0
- package/dist/cli-browser-flags.js.map +1 -0
- package/dist/cli.js +979 -401
- package/dist/cli.js.map +1 -1
- package/dist/cognitive/index.d.ts +0 -13
- package/dist/cognitive/index.d.ts.map +1 -1
- package/dist/cognitive/index.js +39 -15
- package/dist/cognitive/index.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +16 -6
- package/dist/config.js.map +1 -1
- package/dist/daemon.d.ts +5 -4
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +87 -29
- package/dist/daemon.js.map +1 -1
- package/dist/devices.d.ts +20 -0
- package/dist/devices.d.ts.map +1 -1
- package/dist/devices.js +18 -0
- package/dist/devices.js.map +1 -1
- package/dist/help-client.d.ts +48 -0
- package/dist/help-client.d.ts.map +1 -0
- package/dist/help-client.js +96 -0
- package/dist/help-client.js.map +1 -0
- package/dist/mcp-server.d.ts.map +1 -1
- package/dist/mcp-server.js +165 -2281
- package/dist/mcp-server.js.map +1 -1
- package/dist/mcp-tools/base/advanced-interaction-tools.d.ts.map +1 -1
- package/dist/mcp-tools/base/advanced-interaction-tools.js +21 -21
- package/dist/mcp-tools/base/advanced-interaction-tools.js.map +1 -1
- package/dist/mcp-tools/base/assertion-tools.d.ts.map +1 -1
- package/dist/mcp-tools/base/assertion-tools.js +6 -3
- package/dist/mcp-tools/base/assertion-tools.js.map +1 -1
- package/dist/mcp-tools/base/audit-tools.d.ts.map +1 -1
- package/dist/mcp-tools/base/audit-tools.js +15 -4
- package/dist/mcp-tools/base/audit-tools.js.map +1 -1
- package/dist/mcp-tools/base/browser-state-tools.d.ts.map +1 -1
- package/dist/mcp-tools/base/browser-state-tools.js +33 -27
- package/dist/mcp-tools/base/browser-state-tools.js.map +1 -1
- package/dist/mcp-tools/base/bug-analysis-tools.d.ts.map +1 -1
- package/dist/mcp-tools/base/bug-analysis-tools.js +9 -2
- package/dist/mcp-tools/base/bug-analysis-tools.js.map +1 -1
- package/dist/mcp-tools/base/capture-tools.d.ts +60 -4
- package/dist/mcp-tools/base/capture-tools.d.ts.map +1 -1
- package/dist/mcp-tools/base/capture-tools.js +118 -14
- package/dist/mcp-tools/base/capture-tools.js.map +1 -1
- package/dist/mcp-tools/base/index.d.ts +6 -5
- package/dist/mcp-tools/base/index.d.ts.map +1 -1
- package/dist/mcp-tools/base/index.js +7 -6
- package/dist/mcp-tools/base/index.js.map +1 -1
- package/dist/mcp-tools/base/interaction-tools.d.ts.map +1 -1
- package/dist/mcp-tools/base/interaction-tools.js +20 -6
- package/dist/mcp-tools/base/interaction-tools.js.map +1 -1
- package/dist/mcp-tools/base/navigation-tools.d.ts +1 -1
- package/dist/mcp-tools/base/navigation-tools.d.ts.map +1 -1
- package/dist/mcp-tools/base/navigation-tools.js +83 -3
- package/dist/mcp-tools/base/navigation-tools.js.map +1 -1
- package/dist/mcp-tools/base/site-knowledge-tools.d.ts.map +1 -1
- package/dist/mcp-tools/base/site-knowledge-tools.js +11 -23
- package/dist/mcp-tools/base/site-knowledge-tools.js.map +1 -1
- package/dist/mcp-tools/base/visual-testing-tools.d.ts.map +1 -1
- package/dist/mcp-tools/base/visual-testing-tools.js +13 -3
- package/dist/mcp-tools/base/visual-testing-tools.js.map +1 -1
- package/dist/mcp-tools/enterprise-stubs.d.ts +2 -2
- package/dist/mcp-tools/enterprise-stubs.d.ts.map +1 -1
- package/dist/mcp-tools/enterprise-stubs.js +29 -16
- package/dist/mcp-tools/enterprise-stubs.js.map +1 -1
- package/dist/mcp-tools/index.d.ts +19 -14
- package/dist/mcp-tools/index.d.ts.map +1 -1
- package/dist/mcp-tools/index.js +2 -2
- package/dist/mcp-tools/index.js.map +1 -1
- package/dist/mcp-tools/red-zone-refusal.d.ts +33 -0
- package/dist/mcp-tools/red-zone-refusal.d.ts.map +1 -0
- package/dist/mcp-tools/red-zone-refusal.js +43 -0
- package/dist/mcp-tools/red-zone-refusal.js.map +1 -0
- package/dist/mcp-tools/tier-gate.js +1 -1
- package/dist/mcp-tools/tier-gate.js.map +1 -1
- package/dist/mcp-tools/tool-categories.d.ts.map +1 -1
- package/dist/mcp-tools/tool-categories.js +2 -0
- package/dist/mcp-tools/tool-categories.js.map +1 -1
- package/dist/output.d.ts.map +1 -1
- package/dist/output.js +18 -2
- package/dist/output.js.map +1 -1
- package/dist/performance/metrics.d.ts +8 -3
- package/dist/performance/metrics.d.ts.map +1 -1
- package/dist/performance/metrics.js +16 -5
- package/dist/performance/metrics.js.map +1 -1
- package/dist/recording/contact-sheet.js.map +1 -1
- package/dist/security/tool-permissions.d.ts.map +1 -1
- package/dist/security/tool-permissions.js +1 -0
- package/dist/security/tool-permissions.js.map +1 -1
- package/dist/testing/coverage.d.ts +2 -2
- package/dist/testing/coverage.d.ts.map +1 -1
- package/dist/testing/coverage.js +6 -2
- package/dist/testing/coverage.js.map +1 -1
- package/dist/testing/flaky-detection.d.ts +2 -2
- package/dist/testing/flaky-detection.d.ts.map +1 -1
- package/dist/testing/flaky-detection.js +11 -3
- package/dist/testing/flaky-detection.js.map +1 -1
- package/dist/testing/nl-test-suite.d.ts +13 -0
- package/dist/testing/nl-test-suite.d.ts.map +1 -1
- package/dist/testing/nl-test-suite.js +5 -1
- package/dist/testing/nl-test-suite.js.map +1 -1
- package/dist/testing/suite-results.d.ts +27 -0
- package/dist/testing/suite-results.d.ts.map +1 -0
- package/dist/testing/suite-results.js +54 -0
- package/dist/testing/suite-results.js.map +1 -0
- package/dist/testing/test-repair.d.ts +2 -2
- package/dist/testing/test-repair.d.ts.map +1 -1
- package/dist/testing/test-repair.js +6 -2
- package/dist/testing/test-repair.js.map +1 -1
- package/dist/types.d.ts +61 -7
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +17 -4
- package/dist/types.js.map +1 -1
- package/dist/visual/ab-comparison.d.ts.map +1 -1
- package/dist/visual/ab-comparison.js +7 -2
- package/dist/visual/ab-comparison.js.map +1 -1
- package/dist/visual/cross-browser.d.ts +7 -2
- package/dist/visual/cross-browser.d.ts.map +1 -1
- package/dist/visual/cross-browser.js +33 -5
- package/dist/visual/cross-browser.js.map +1 -1
- package/dist/visual/distance-metrics.d.ts +7 -0
- package/dist/visual/distance-metrics.d.ts.map +1 -1
- package/dist/visual/distance-metrics.js.map +1 -1
- package/dist/visual/heatmap-overlay.js.map +1 -1
- package/dist/visual/llm-relevance.d.ts.map +1 -1
- package/dist/visual/llm-relevance.js.map +1 -1
- package/dist/visual/regression.d.ts +17 -7
- package/dist/visual/regression.d.ts.map +1 -1
- package/dist/visual/regression.js +77 -38
- package/dist/visual/regression.js.map +1 -1
- package/dist/visual/responsive.d.ts +22 -0
- package/dist/visual/responsive.d.ts.map +1 -1
- package/dist/visual/responsive.js +44 -7
- package/dist/visual/responsive.js.map +1 -1
- package/dist/visual/visual-overlays.js.map +1 -1
- package/dist/webhooks.d.ts +67 -0
- package/dist/webhooks.d.ts.map +1 -0
- package/dist/webhooks.js +128 -0
- package/dist/webhooks.js.map +1 -0
- package/package.json +23 -24
package/dist/webhooks.js
ADDED
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CBrowser - Cognitive Browser Automation
|
|
3
|
+
* Copyright 2026 Alexandria Eden alexandria.shai.eden@gmail.com
|
|
4
|
+
* Learn more at https://cbrowser.ai - MIT License
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Webhooks configured with `cbrowser webhook add`, and the sender.
|
|
8
|
+
*
|
|
9
|
+
* `webhook add` wrote webhooks.json and nothing ever read it except `webhook
|
|
10
|
+
* list` and `webhook test`: no command sent test.fail or journey.complete, so a
|
|
11
|
+
* configured webhook never fired (audit O17, 2026-10-21). test-suite now sends
|
|
12
|
+
* test.pass or test.fail once per run, and cognitive-journey sends
|
|
13
|
+
* journey.complete once per journey. Events nothing sends are refused at
|
|
14
|
+
* `webhook add` rather than stored to wait forever.
|
|
15
|
+
*
|
|
16
|
+
* Sending never fails the run it reports on: one POST per webhook, JSON, a
|
|
17
|
+
* 10 s timeout, no retries, and a failure is a stderr warning that names the
|
|
18
|
+
* webhook, never its URL (a Slack or Discord URL is itself the credential).
|
|
19
|
+
*/
|
|
20
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
21
|
+
import { join } from "node:path";
|
|
22
|
+
/** Events a command sends: test.pass/test.fail per test-suite run, journey.complete per cognitive journey. */
|
|
23
|
+
export const SENT_WEBHOOK_EVENTS = ["test.pass", "test.fail", "journey.complete"];
|
|
24
|
+
export const WEBHOOK_FORMATS = ["generic", "slack", "discord"];
|
|
25
|
+
export const WEBHOOK_TIMEOUT_MS = 10_000;
|
|
26
|
+
export function webhooksPath(dataDir) {
|
|
27
|
+
return join(dataDir, "webhooks.json");
|
|
28
|
+
}
|
|
29
|
+
/** The configured webhooks; none when the file is missing or unreadable. */
|
|
30
|
+
export function loadWebhooks(dataDir) {
|
|
31
|
+
const path = webhooksPath(dataDir);
|
|
32
|
+
if (!existsSync(path))
|
|
33
|
+
return [];
|
|
34
|
+
try {
|
|
35
|
+
const parsed = JSON.parse(readFileSync(path, "utf-8"));
|
|
36
|
+
return Array.isArray(parsed) ? parsed : [];
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return [];
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Why a URL cannot be a webhook, or null when it can. Only http and https, and
|
|
44
|
+
* no user name or password in the URL: those would be sent on every event and
|
|
45
|
+
* printed by `webhook list`.
|
|
46
|
+
*/
|
|
47
|
+
export function webhookUrlProblem(url) {
|
|
48
|
+
let parsed;
|
|
49
|
+
try {
|
|
50
|
+
parsed = new URL(url);
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return `"${url}" is not a URL`;
|
|
54
|
+
}
|
|
55
|
+
if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
|
|
56
|
+
return `webhook URLs must be http or https, not ${parsed.protocol.replace(/:$/, "")}`;
|
|
57
|
+
}
|
|
58
|
+
if (parsed.username || parsed.password) {
|
|
59
|
+
return "a webhook URL must not carry a user name or password";
|
|
60
|
+
}
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
function isJourney(p) {
|
|
64
|
+
return "goalAchieved" in p;
|
|
65
|
+
}
|
|
66
|
+
/** The request body for one webhook format. */
|
|
67
|
+
export function webhookBody(format, event, run, timestamp) {
|
|
68
|
+
if (isJourney(run)) {
|
|
69
|
+
const text = `CBrowser journey "${run.goal}" as ${run.persona}: `
|
|
70
|
+
+ (run.goalAchieved ? "goal achieved" : `abandoned${run.abandonmentReason ? ` (${run.abandonmentReason})` : ""}`)
|
|
71
|
+
+ ` in ${run.stepCount} steps`;
|
|
72
|
+
if (format === "slack")
|
|
73
|
+
return { text };
|
|
74
|
+
if (format === "discord")
|
|
75
|
+
return { content: text };
|
|
76
|
+
return { event, ...run, timestamp };
|
|
77
|
+
}
|
|
78
|
+
const { suite, summary, failedTests } = run;
|
|
79
|
+
const text = `CBrowser test-suite "${suite}": ${summary.passed}/${summary.total} passed`
|
|
80
|
+
+ (failedTests.length > 0 ? `. Failed: ${failedTests.map((t) => t.name).join(", ")}` : "");
|
|
81
|
+
if (format === "slack")
|
|
82
|
+
return { text };
|
|
83
|
+
if (format === "discord")
|
|
84
|
+
return { content: text };
|
|
85
|
+
return { event, suite, summary, failedTests, timestamp };
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* POST the event to every webhook subscribed to it. Never throws: each failure
|
|
89
|
+
* is collected and, unless `quiet`, printed to stderr as a warning.
|
|
90
|
+
*/
|
|
91
|
+
export async function sendWebhookEvent(dataDir, event, run, options = {}) {
|
|
92
|
+
const result = { sent: [], failed: [] };
|
|
93
|
+
const timestamp = new Date().toISOString();
|
|
94
|
+
for (const hook of loadWebhooks(dataDir)) {
|
|
95
|
+
if (!Array.isArray(hook.events) || !hook.events.includes(event))
|
|
96
|
+
continue;
|
|
97
|
+
const problem = typeof hook.url === "string" ? webhookUrlProblem(hook.url) : "it has no URL";
|
|
98
|
+
let reason = problem;
|
|
99
|
+
if (!problem) {
|
|
100
|
+
try {
|
|
101
|
+
const response = await fetch(hook.url, {
|
|
102
|
+
method: "POST",
|
|
103
|
+
headers: { "Content-Type": "application/json" },
|
|
104
|
+
body: JSON.stringify(webhookBody(hook.format, event, run, timestamp)),
|
|
105
|
+
redirect: "error",
|
|
106
|
+
signal: AbortSignal.timeout(options.timeoutMs ?? WEBHOOK_TIMEOUT_MS),
|
|
107
|
+
});
|
|
108
|
+
reason = response.ok ? null : `HTTP ${response.status}`;
|
|
109
|
+
}
|
|
110
|
+
catch (e) {
|
|
111
|
+
const err = e;
|
|
112
|
+
reason = err.name === "TimeoutError"
|
|
113
|
+
? `no answer in ${(options.timeoutMs ?? WEBHOOK_TIMEOUT_MS) / 1000}s`
|
|
114
|
+
: err.message.split(hook.url).join("<url>");
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
if (reason === null) {
|
|
118
|
+
result.sent.push(hook.name);
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
result.failed.push({ name: hook.name, reason });
|
|
122
|
+
if (!options.quiet)
|
|
123
|
+
console.error(`Warning: webhook "${hook.name}" (${event}) was not delivered: ${reason}`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return result;
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=webhooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhooks.js","sourceRoot":"","sources":["../src/webhooks.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cbrowser",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "20.0.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Cognitive browser automation that thinks like your users—and helps AI agents navigate too. Simulate real user cognition with abandonment detection, constitutional safety, chaos engineering, and UX friction discovery. Sites that pass CBrowser's cognitive tests are easier for both humans and AI agents to navigate.",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -126,35 +126,37 @@
|
|
|
126
126
|
},
|
|
127
127
|
"homepage": "https://github.com/alexandriashai/cbrowser#readme",
|
|
128
128
|
"engines": {
|
|
129
|
-
"node": ">=
|
|
129
|
+
"node": ">=20.9.0"
|
|
130
130
|
},
|
|
131
131
|
"dependencies": {
|
|
132
|
-
"@anthropic-ai/sdk": "^0.
|
|
132
|
+
"@anthropic-ai/sdk": "^1.0.0",
|
|
133
133
|
"@mcp-ui/server": "^6.1.0",
|
|
134
|
-
"@modelcontextprotocol/ext-apps": "^
|
|
135
|
-
"@modelcontextprotocol/sdk": "^1.
|
|
134
|
+
"@modelcontextprotocol/ext-apps": "^2.0.3",
|
|
135
|
+
"@modelcontextprotocol/sdk": "^1.32.1",
|
|
136
136
|
"@types/express": "^5.0.6",
|
|
137
|
-
"express": "^5.
|
|
138
|
-
"jose": "^6.
|
|
139
|
-
"mcp-guardian": "^2.
|
|
140
|
-
"playwright": "^1.
|
|
141
|
-
"sharp": "^0.
|
|
142
|
-
"zod": "^4.
|
|
137
|
+
"express": "^5.3.0",
|
|
138
|
+
"jose": "^6.2.13",
|
|
139
|
+
"mcp-guardian": "^2.4.0",
|
|
140
|
+
"playwright": "^1.64.1",
|
|
141
|
+
"sharp": "^0.35.5",
|
|
142
|
+
"zod": "^4.6.7"
|
|
143
143
|
},
|
|
144
144
|
"devDependencies": {
|
|
145
|
-
"@commitlint/cli": "^
|
|
146
|
-
"@commitlint/config-conventional": "^
|
|
147
|
-
"@
|
|
145
|
+
"@commitlint/cli": "^21.2.4",
|
|
146
|
+
"@commitlint/config-conventional": "^21.2.4",
|
|
147
|
+
"@eslint/js": "^10.0.1",
|
|
148
|
+
"@release-it/conventional-changelog": "^12.0.2",
|
|
148
149
|
"@types/node": "^20.10.0",
|
|
149
|
-
"@typescript-eslint/eslint-plugin": "^
|
|
150
|
-
"@typescript-eslint/parser": "^
|
|
151
|
-
"
|
|
150
|
+
"@typescript-eslint/eslint-plugin": "^8.72.0",
|
|
151
|
+
"@typescript-eslint/parser": "^8.72.0",
|
|
152
|
+
"conventional-changelog-conventionalcommits": "^10.4.1",
|
|
153
|
+
"eslint": "^10.13.0",
|
|
152
154
|
"fast-check": "^4.9.0",
|
|
153
155
|
"husky": "^9.0.0",
|
|
154
|
-
"lint-staged": "^
|
|
155
|
-
"release-it": "^
|
|
156
|
+
"lint-staged": "^17.6.0",
|
|
157
|
+
"release-it": "^21.1.1",
|
|
156
158
|
"typedoc": "^0.28.16",
|
|
157
|
-
"typescript": "^
|
|
159
|
+
"typescript": "^6.0.3",
|
|
158
160
|
"yaml": "^2.9.0"
|
|
159
161
|
},
|
|
160
162
|
"lint-staged": {
|
|
@@ -169,8 +171,5 @@
|
|
|
169
171
|
"README.md",
|
|
170
172
|
"LICENSE",
|
|
171
173
|
"THIRD_PARTY_LICENSES.md"
|
|
172
|
-
]
|
|
173
|
-
"overrides": {
|
|
174
|
-
"conventional-changelog-conventionalcommits": "8.0.0"
|
|
175
|
-
}
|
|
174
|
+
]
|
|
176
175
|
}
|