nstbrowser-ai-agent 0.0.1
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 +201 -0
- package/README.md +1321 -0
- package/bin/nstbrowser-ai-agent-darwin-arm64 +0 -0
- package/bin/nstbrowser-ai-agent-darwin-x64 +0 -0
- package/bin/nstbrowser-ai-agent-linux-arm64 +0 -0
- package/bin/nstbrowser-ai-agent-linux-x64 +0 -0
- package/bin/nstbrowser-ai-agent-win32-x64.exe +0 -0
- package/bin/nstbrowser-ai-agent.js +109 -0
- package/dist/action-policy.d.ts +14 -0
- package/dist/action-policy.d.ts.map +1 -0
- package/dist/action-policy.js +253 -0
- package/dist/action-policy.js.map +1 -0
- package/dist/actions.d.ts +18 -0
- package/dist/actions.d.ts.map +1 -0
- package/dist/actions.js +2037 -0
- package/dist/actions.js.map +1 -0
- package/dist/auth-cli.d.ts +2 -0
- package/dist/auth-cli.d.ts.map +1 -0
- package/dist/auth-cli.js +97 -0
- package/dist/auth-cli.js.map +1 -0
- package/dist/auth-vault.d.ts +36 -0
- package/dist/auth-vault.d.ts.map +1 -0
- package/dist/auth-vault.js +125 -0
- package/dist/auth-vault.js.map +1 -0
- package/dist/browser.d.ts +573 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +2036 -0
- package/dist/browser.js.map +1 -0
- package/dist/confirmation.d.ts +8 -0
- package/dist/confirmation.d.ts.map +1 -0
- package/dist/confirmation.js +30 -0
- package/dist/confirmation.js.map +1 -0
- package/dist/daemon.d.ts +65 -0
- package/dist/daemon.d.ts.map +1 -0
- package/dist/daemon.js +589 -0
- package/dist/daemon.js.map +1 -0
- package/dist/diff.d.ts +18 -0
- package/dist/diff.d.ts.map +1 -0
- package/dist/diff.js +271 -0
- package/dist/diff.js.map +1 -0
- package/dist/domain-filter.d.ts +28 -0
- package/dist/domain-filter.d.ts.map +1 -0
- package/dist/domain-filter.js +149 -0
- package/dist/domain-filter.js.map +1 -0
- package/dist/encryption.d.ts +73 -0
- package/dist/encryption.d.ts.map +1 -0
- package/dist/encryption.js +171 -0
- package/dist/encryption.js.map +1 -0
- package/dist/ios-actions.d.ts +11 -0
- package/dist/ios-actions.d.ts.map +1 -0
- package/dist/ios-actions.js +228 -0
- package/dist/ios-actions.js.map +1 -0
- package/dist/ios-manager.d.ts +266 -0
- package/dist/ios-manager.d.ts.map +1 -0
- package/dist/ios-manager.js +1073 -0
- package/dist/ios-manager.js.map +1 -0
- package/dist/nstbrowser-actions.d.ts +10 -0
- package/dist/nstbrowser-actions.d.ts.map +1 -0
- package/dist/nstbrowser-actions.js +277 -0
- package/dist/nstbrowser-actions.js.map +1 -0
- package/dist/nstbrowser-client.d.ts +197 -0
- package/dist/nstbrowser-client.d.ts.map +1 -0
- package/dist/nstbrowser-client.js +454 -0
- package/dist/nstbrowser-client.js.map +1 -0
- package/dist/nstbrowser-errors.d.ts +28 -0
- package/dist/nstbrowser-errors.d.ts.map +1 -0
- package/dist/nstbrowser-errors.js +59 -0
- package/dist/nstbrowser-errors.js.map +1 -0
- package/dist/nstbrowser-profile-resolver.d.ts +89 -0
- package/dist/nstbrowser-profile-resolver.d.ts.map +1 -0
- package/dist/nstbrowser-profile-resolver.js +227 -0
- package/dist/nstbrowser-profile-resolver.js.map +1 -0
- package/dist/nstbrowser-types.d.ts +151 -0
- package/dist/nstbrowser-types.d.ts.map +1 -0
- package/dist/nstbrowser-types.js +5 -0
- package/dist/nstbrowser-types.js.map +1 -0
- package/dist/nstbrowser-utils.d.ts +71 -0
- package/dist/nstbrowser-utils.d.ts.map +1 -0
- package/dist/nstbrowser-utils.js +174 -0
- package/dist/nstbrowser-utils.js.map +1 -0
- package/dist/protocol.d.ts +26 -0
- package/dist/protocol.d.ts.map +1 -0
- package/dist/protocol.js +1245 -0
- package/dist/protocol.js.map +1 -0
- package/dist/snapshot.d.ts +67 -0
- package/dist/snapshot.d.ts.map +1 -0
- package/dist/snapshot.js +514 -0
- package/dist/snapshot.js.map +1 -0
- package/dist/state-utils.d.ts +77 -0
- package/dist/state-utils.d.ts.map +1 -0
- package/dist/state-utils.js +178 -0
- package/dist/state-utils.js.map +1 -0
- package/dist/stream-server.d.ts +117 -0
- package/dist/stream-server.d.ts.map +1 -0
- package/dist/stream-server.js +309 -0
- package/dist/stream-server.js.map +1 -0
- package/dist/types.d.ts +1121 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +83 -0
- package/scripts/analyze-api-coverage.js +205 -0
- package/scripts/analyze-cli-coverage.js +239 -0
- package/scripts/build-all-platforms.sh +68 -0
- package/scripts/check-version-sync.js +39 -0
- package/scripts/copy-native.js +36 -0
- package/scripts/download-nstbrowser-docs.js +152 -0
- package/scripts/generate-skills.sh +218 -0
- package/scripts/postinstall.js +231 -0
- package/scripts/sync-version.js +69 -0
- package/skills/nstbrowser-ai-agent/SKILL.md +759 -0
- package/skills/nstbrowser-ai-agent/references/batch-operations.md +414 -0
- package/skills/nstbrowser-ai-agent/references/nst-api-reference.md +960 -0
- package/skills/nstbrowser-ai-agent/references/profile-management.md +672 -0
- package/skills/nstbrowser-ai-agent/references/proxy-configuration.md +460 -0
- package/skills/nstbrowser-ai-agent/references/troubleshooting.md +773 -0
- package/skills/nstbrowser-ai-agent/templates/automated-workflow.sh +248 -0
- package/skills/nstbrowser-ai-agent/templates/batch-proxy-update.sh +257 -0
- package/skills/nstbrowser-ai-agent/templates/profile-setup.sh +248 -0
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Cross-platform CLI wrapper for nstbrowser-ai-agent
|
|
5
|
+
*
|
|
6
|
+
* This wrapper enables npx support on Windows where shell scripts don't work.
|
|
7
|
+
* For global installs, postinstall.js patches the shims to invoke the native
|
|
8
|
+
* binary directly (zero overhead).
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { spawn } from 'child_process';
|
|
12
|
+
import { existsSync, accessSync, chmodSync, constants } from 'fs';
|
|
13
|
+
import { dirname, join } from 'path';
|
|
14
|
+
import { fileURLToPath } from 'url';
|
|
15
|
+
import { platform, arch } from 'os';
|
|
16
|
+
|
|
17
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
18
|
+
|
|
19
|
+
// Map Node.js platform/arch to binary naming convention
|
|
20
|
+
function getBinaryName() {
|
|
21
|
+
const os = platform();
|
|
22
|
+
const cpuArch = arch();
|
|
23
|
+
|
|
24
|
+
let osKey;
|
|
25
|
+
switch (os) {
|
|
26
|
+
case 'darwin':
|
|
27
|
+
osKey = 'darwin';
|
|
28
|
+
break;
|
|
29
|
+
case 'linux':
|
|
30
|
+
osKey = 'linux';
|
|
31
|
+
break;
|
|
32
|
+
case 'win32':
|
|
33
|
+
osKey = 'win32';
|
|
34
|
+
break;
|
|
35
|
+
default:
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
let archKey;
|
|
40
|
+
switch (cpuArch) {
|
|
41
|
+
case 'x64':
|
|
42
|
+
case 'x86_64':
|
|
43
|
+
archKey = 'x64';
|
|
44
|
+
break;
|
|
45
|
+
case 'arm64':
|
|
46
|
+
case 'aarch64':
|
|
47
|
+
archKey = 'arm64';
|
|
48
|
+
break;
|
|
49
|
+
default:
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const ext = os === 'win32' ? '.exe' : '';
|
|
54
|
+
return `nstbrowser-ai-agent-${osKey}-${archKey}${ext}`;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function main() {
|
|
58
|
+
const binaryName = getBinaryName();
|
|
59
|
+
|
|
60
|
+
if (!binaryName) {
|
|
61
|
+
console.error(`Error: Unsupported platform: ${platform()}-${arch()}`);
|
|
62
|
+
process.exit(1);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const binaryPath = join(__dirname, binaryName);
|
|
66
|
+
|
|
67
|
+
if (!existsSync(binaryPath)) {
|
|
68
|
+
console.error(`Error: No binary found for ${platform()}-${arch()}`);
|
|
69
|
+
console.error(`Expected: ${binaryPath}`);
|
|
70
|
+
console.error('');
|
|
71
|
+
console.error('Run "npm run build:native" to build for your platform,');
|
|
72
|
+
console.error('or reinstall the package to trigger the postinstall download.');
|
|
73
|
+
process.exit(1);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// Ensure binary is executable (fixes EACCES on macOS/Linux when postinstall didn't run,
|
|
77
|
+
// e.g., when using bun which blocks lifecycle scripts by default)
|
|
78
|
+
if (platform() !== 'win32') {
|
|
79
|
+
try {
|
|
80
|
+
accessSync(binaryPath, constants.X_OK);
|
|
81
|
+
} catch {
|
|
82
|
+
// Binary exists but isn't executable - fix it
|
|
83
|
+
try {
|
|
84
|
+
chmodSync(binaryPath, 0o755);
|
|
85
|
+
} catch (chmodErr) {
|
|
86
|
+
console.error(`Error: Cannot make binary executable: ${chmodErr.message}`);
|
|
87
|
+
console.error('Try running: chmod +x ' + binaryPath);
|
|
88
|
+
process.exit(1);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// Spawn the native binary with inherited stdio
|
|
94
|
+
const child = spawn(binaryPath, process.argv.slice(2), {
|
|
95
|
+
stdio: 'inherit',
|
|
96
|
+
windowsHide: false,
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
child.on('error', (err) => {
|
|
100
|
+
console.error(`Error executing binary: ${err.message}`);
|
|
101
|
+
process.exit(1);
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
child.on('close', (code) => {
|
|
105
|
+
process.exit(code ?? 0);
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
main();
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface ActionPolicy {
|
|
2
|
+
default: 'allow' | 'deny';
|
|
3
|
+
allow?: string[];
|
|
4
|
+
deny?: string[];
|
|
5
|
+
}
|
|
6
|
+
export type PolicyDecision = 'allow' | 'deny' | 'confirm';
|
|
7
|
+
export declare const KNOWN_CATEGORIES: Set<string>;
|
|
8
|
+
export declare function getActionCategory(action: string): string;
|
|
9
|
+
export declare function loadPolicyFile(policyPath: string): ActionPolicy;
|
|
10
|
+
export declare function initPolicyReloader(policyPath: string, policy: ActionPolicy): void;
|
|
11
|
+
export declare function reloadPolicyIfChanged(): ActionPolicy | null;
|
|
12
|
+
export declare function checkPolicy(action: string, policy: ActionPolicy | null, confirmCategories: Set<string>): PolicyDecision;
|
|
13
|
+
export declare function describeAction(action: string, command: Record<string, unknown>): string;
|
|
14
|
+
//# sourceMappingURL=action-policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"action-policy.d.ts","sourceRoot":"","sources":["../src/action-policy.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,GAAG,MAAM,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;AA4K1D,eAAO,MAAM,gBAAgB,aAE5B,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,YAAY,CAwB/D;AAQD,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAIjF;AAED,wBAAgB,qBAAqB,IAAI,YAAY,GAAG,IAAI,CAkB3D;AAED,wBAAgB,WAAW,CACzB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,YAAY,GAAG,IAAI,EAC3B,iBAAiB,EAAE,GAAG,CAAC,MAAM,CAAC,GAC7B,cAAc,CAkBhB;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAyBvF"}
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
import { readFileSync, statSync } from 'node:fs';
|
|
2
|
+
import { resolve } from 'node:path';
|
|
3
|
+
const ACTION_CATEGORIES = {
|
|
4
|
+
navigate: 'navigate',
|
|
5
|
+
back: 'navigate',
|
|
6
|
+
forward: 'navigate',
|
|
7
|
+
reload: 'navigate',
|
|
8
|
+
tab_new: 'navigate',
|
|
9
|
+
click: 'click',
|
|
10
|
+
dblclick: 'click',
|
|
11
|
+
tap: 'click',
|
|
12
|
+
fill: 'fill',
|
|
13
|
+
type: 'fill',
|
|
14
|
+
// The `keyboard` action is a compound command that dispatches to sub-actions
|
|
15
|
+
// (type, inserttext, press, down, up). Its primary use is text input, so it
|
|
16
|
+
// maps to 'fill'. The interact-like sub-actions (press, down, up) are less
|
|
17
|
+
// common and don't have separate top-level action names in the protocol.
|
|
18
|
+
keyboard: 'fill',
|
|
19
|
+
inserttext: 'fill',
|
|
20
|
+
select: 'fill',
|
|
21
|
+
multiselect: 'fill',
|
|
22
|
+
check: 'fill',
|
|
23
|
+
uncheck: 'fill',
|
|
24
|
+
clear: 'fill',
|
|
25
|
+
selectall: 'fill',
|
|
26
|
+
setvalue: 'fill',
|
|
27
|
+
download: 'download',
|
|
28
|
+
waitfordownload: 'download',
|
|
29
|
+
upload: 'upload',
|
|
30
|
+
evaluate: 'eval',
|
|
31
|
+
evalhandle: 'eval',
|
|
32
|
+
addscript: 'eval',
|
|
33
|
+
addinitscript: 'eval',
|
|
34
|
+
snapshot: 'snapshot',
|
|
35
|
+
screenshot: 'snapshot',
|
|
36
|
+
pdf: 'snapshot',
|
|
37
|
+
diff_snapshot: 'snapshot',
|
|
38
|
+
diff_screenshot: 'snapshot',
|
|
39
|
+
diff_url: 'snapshot',
|
|
40
|
+
scroll: 'scroll',
|
|
41
|
+
scrollintoview: 'scroll',
|
|
42
|
+
wait: 'wait',
|
|
43
|
+
waitforurl: 'wait',
|
|
44
|
+
waitforloadstate: 'wait',
|
|
45
|
+
waitforfunction: 'wait',
|
|
46
|
+
gettext: 'get',
|
|
47
|
+
content: 'get',
|
|
48
|
+
innerhtml: 'get',
|
|
49
|
+
innertext: 'get',
|
|
50
|
+
inputvalue: 'get',
|
|
51
|
+
url: 'get',
|
|
52
|
+
title: 'get',
|
|
53
|
+
getattribute: 'get',
|
|
54
|
+
count: 'get',
|
|
55
|
+
boundingbox: 'get',
|
|
56
|
+
styles: 'get',
|
|
57
|
+
isvisible: 'get',
|
|
58
|
+
isenabled: 'get',
|
|
59
|
+
ischecked: 'get',
|
|
60
|
+
responsebody: 'get',
|
|
61
|
+
route: 'network',
|
|
62
|
+
unroute: 'network',
|
|
63
|
+
requests: 'network',
|
|
64
|
+
state_save: 'state',
|
|
65
|
+
state_load: 'state',
|
|
66
|
+
cookies_set: 'state',
|
|
67
|
+
storage_set: 'state',
|
|
68
|
+
credentials: 'state',
|
|
69
|
+
hover: 'interact',
|
|
70
|
+
focus: 'interact',
|
|
71
|
+
drag: 'interact',
|
|
72
|
+
press: 'interact',
|
|
73
|
+
keydown: 'interact',
|
|
74
|
+
keyup: 'interact',
|
|
75
|
+
mousemove: 'interact',
|
|
76
|
+
mousedown: 'interact',
|
|
77
|
+
mouseup: 'interact',
|
|
78
|
+
wheel: 'interact',
|
|
79
|
+
dispatch: 'interact',
|
|
80
|
+
// These are always allowed (internal/meta operations)
|
|
81
|
+
launch: '_internal',
|
|
82
|
+
close: '_internal',
|
|
83
|
+
tab_list: '_internal',
|
|
84
|
+
tab_switch: '_internal',
|
|
85
|
+
tab_close: '_internal',
|
|
86
|
+
window_new: '_internal',
|
|
87
|
+
frame: '_internal',
|
|
88
|
+
mainframe: '_internal',
|
|
89
|
+
dialog: '_internal',
|
|
90
|
+
session: '_internal',
|
|
91
|
+
console: '_internal',
|
|
92
|
+
errors: '_internal',
|
|
93
|
+
cookies_get: '_internal',
|
|
94
|
+
cookies_clear: '_internal',
|
|
95
|
+
storage_get: '_internal',
|
|
96
|
+
storage_clear: '_internal',
|
|
97
|
+
state_list: '_internal',
|
|
98
|
+
state_show: '_internal',
|
|
99
|
+
state_clear: '_internal',
|
|
100
|
+
state_clean: '_internal',
|
|
101
|
+
state_rename: '_internal',
|
|
102
|
+
highlight: '_internal',
|
|
103
|
+
bringtofront: '_internal',
|
|
104
|
+
trace_start: '_internal',
|
|
105
|
+
trace_stop: '_internal',
|
|
106
|
+
har_start: '_internal',
|
|
107
|
+
har_stop: '_internal',
|
|
108
|
+
video_start: '_internal',
|
|
109
|
+
video_stop: '_internal',
|
|
110
|
+
recording_start: '_internal',
|
|
111
|
+
recording_stop: '_internal',
|
|
112
|
+
recording_restart: '_internal',
|
|
113
|
+
profiler_start: '_internal',
|
|
114
|
+
profiler_stop: '_internal',
|
|
115
|
+
clipboard: '_internal',
|
|
116
|
+
viewport: '_internal',
|
|
117
|
+
useragent: '_internal',
|
|
118
|
+
device: '_internal',
|
|
119
|
+
geolocation: '_internal',
|
|
120
|
+
permissions: '_internal',
|
|
121
|
+
emulatemedia: '_internal',
|
|
122
|
+
offline: '_internal',
|
|
123
|
+
headers: '_internal',
|
|
124
|
+
addstyle: 'eval',
|
|
125
|
+
expose: 'eval',
|
|
126
|
+
timezone: '_internal',
|
|
127
|
+
locale: '_internal',
|
|
128
|
+
pause: '_internal',
|
|
129
|
+
setcontent: 'eval',
|
|
130
|
+
screencast_start: '_internal',
|
|
131
|
+
screencast_stop: '_internal',
|
|
132
|
+
input_mouse: '_internal',
|
|
133
|
+
input_keyboard: '_internal',
|
|
134
|
+
input_touch: '_internal',
|
|
135
|
+
auth_save: '_internal',
|
|
136
|
+
auth_login: '_internal',
|
|
137
|
+
auth_list: '_internal',
|
|
138
|
+
auth_delete: '_internal',
|
|
139
|
+
auth_show: '_internal',
|
|
140
|
+
confirm: '_internal',
|
|
141
|
+
deny: '_internal',
|
|
142
|
+
// Find/semantic locator actions (read-only element resolution)
|
|
143
|
+
getbyrole: 'get',
|
|
144
|
+
getbytext: 'get',
|
|
145
|
+
getbylabel: 'get',
|
|
146
|
+
getbyplaceholder: 'get',
|
|
147
|
+
getbyalttext: 'get',
|
|
148
|
+
getbytitle: 'get',
|
|
149
|
+
getbytestid: 'get',
|
|
150
|
+
nth: 'get',
|
|
151
|
+
};
|
|
152
|
+
// User-facing categories used in policy files. '_internal' is excluded because
|
|
153
|
+
// internal actions always bypass policy. 'unknown' is intentionally not a value
|
|
154
|
+
// in ACTION_CATEGORIES -- it is only the fallback return of getActionCategory()
|
|
155
|
+
// for unrecognized actions. If a user puts "unknown" in a policy file,
|
|
156
|
+
// loadPolicyFile will warn about it as unrecognized, which is correct.
|
|
157
|
+
export const KNOWN_CATEGORIES = new Set(Object.values(ACTION_CATEGORIES).filter((c) => c !== '_internal'));
|
|
158
|
+
export function getActionCategory(action) {
|
|
159
|
+
return ACTION_CATEGORIES[action] ?? 'unknown';
|
|
160
|
+
}
|
|
161
|
+
export function loadPolicyFile(policyPath) {
|
|
162
|
+
const resolved = resolve(policyPath);
|
|
163
|
+
const content = readFileSync(resolved, 'utf-8');
|
|
164
|
+
const policy = JSON.parse(content);
|
|
165
|
+
if (policy.default !== 'allow' && policy.default !== 'deny') {
|
|
166
|
+
throw new Error(`Invalid action policy: "default" must be "allow" or "deny", got "${policy.default}"`);
|
|
167
|
+
}
|
|
168
|
+
for (const list of [policy.allow, policy.deny]) {
|
|
169
|
+
if (!list)
|
|
170
|
+
continue;
|
|
171
|
+
for (const category of list) {
|
|
172
|
+
if (!KNOWN_CATEGORIES.has(category)) {
|
|
173
|
+
console.warn(`[nstbrowser-ai-agent] Warning: unrecognized action category "${category}" in policy file. ` +
|
|
174
|
+
`Known categories: ${[...KNOWN_CATEGORIES].sort().join(', ')}`);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return policy;
|
|
179
|
+
}
|
|
180
|
+
let cachedPolicyPath = null;
|
|
181
|
+
let cachedPolicyMtimeMs = 0;
|
|
182
|
+
let cachedPolicy = null;
|
|
183
|
+
const RELOAD_CHECK_INTERVAL_MS = 5_000;
|
|
184
|
+
let lastCheckMs = 0;
|
|
185
|
+
export function initPolicyReloader(policyPath, policy) {
|
|
186
|
+
cachedPolicyPath = resolve(policyPath);
|
|
187
|
+
cachedPolicyMtimeMs = statSync(cachedPolicyPath).mtimeMs;
|
|
188
|
+
cachedPolicy = policy;
|
|
189
|
+
}
|
|
190
|
+
export function reloadPolicyIfChanged() {
|
|
191
|
+
if (!cachedPolicyPath)
|
|
192
|
+
return cachedPolicy;
|
|
193
|
+
const now = Date.now();
|
|
194
|
+
if (now - lastCheckMs < RELOAD_CHECK_INTERVAL_MS)
|
|
195
|
+
return cachedPolicy;
|
|
196
|
+
lastCheckMs = now;
|
|
197
|
+
try {
|
|
198
|
+
const currentMtime = statSync(cachedPolicyPath).mtimeMs;
|
|
199
|
+
if (currentMtime !== cachedPolicyMtimeMs) {
|
|
200
|
+
cachedPolicy = loadPolicyFile(cachedPolicyPath);
|
|
201
|
+
cachedPolicyMtimeMs = currentMtime;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
catch {
|
|
205
|
+
// File may have been removed; keep using cached policy
|
|
206
|
+
}
|
|
207
|
+
return cachedPolicy;
|
|
208
|
+
}
|
|
209
|
+
export function checkPolicy(action, policy, confirmCategories) {
|
|
210
|
+
const category = getActionCategory(action);
|
|
211
|
+
// Internal actions are always allowed
|
|
212
|
+
if (category === '_internal')
|
|
213
|
+
return 'allow';
|
|
214
|
+
// Explicit deny takes precedence over confirmation
|
|
215
|
+
if (policy?.deny?.includes(category))
|
|
216
|
+
return 'deny';
|
|
217
|
+
// Check if this category requires confirmation
|
|
218
|
+
if (confirmCategories.has(category))
|
|
219
|
+
return 'confirm';
|
|
220
|
+
if (!policy)
|
|
221
|
+
return 'allow';
|
|
222
|
+
// Explicit allow list
|
|
223
|
+
if (policy.allow?.includes(category))
|
|
224
|
+
return 'allow';
|
|
225
|
+
return policy.default;
|
|
226
|
+
}
|
|
227
|
+
export function describeAction(action, command) {
|
|
228
|
+
const category = getActionCategory(action);
|
|
229
|
+
switch (action) {
|
|
230
|
+
case 'navigate':
|
|
231
|
+
return `Navigate to ${command.url}`;
|
|
232
|
+
case 'evaluate':
|
|
233
|
+
case 'evalhandle':
|
|
234
|
+
return `Evaluate JavaScript: ${String(command.script ?? '').slice(0, 80)}`;
|
|
235
|
+
case 'fill':
|
|
236
|
+
return `Fill ${command.selector}`;
|
|
237
|
+
case 'type':
|
|
238
|
+
return `Type into ${command.selector}`;
|
|
239
|
+
case 'click':
|
|
240
|
+
return `Click ${command.selector}`;
|
|
241
|
+
case 'dblclick':
|
|
242
|
+
return `Double-click ${command.selector}`;
|
|
243
|
+
case 'tap':
|
|
244
|
+
return `Tap ${command.selector}`;
|
|
245
|
+
case 'download':
|
|
246
|
+
return `Download via ${command.selector} to ${command.path}`;
|
|
247
|
+
case 'upload':
|
|
248
|
+
return `Upload files to ${command.selector}`;
|
|
249
|
+
default:
|
|
250
|
+
return `${category}: ${action}`;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
//# sourceMappingURL=action-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"action-policy.js","sourceRoot":"","sources":["../src/action-policy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { BrowserManager, ScreencastFrame } from './browser.js';
|
|
2
|
+
import type { Command, Response } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Set the callback for screencast frames
|
|
5
|
+
* This is called by the daemon to set up frame streaming
|
|
6
|
+
*/
|
|
7
|
+
export declare function setScreencastFrameCallback(callback: ((frame: ScreencastFrame) => void) | null): void;
|
|
8
|
+
/**
|
|
9
|
+
* Convert Playwright errors to AI-friendly messages
|
|
10
|
+
* @internal Exported for testing
|
|
11
|
+
*/
|
|
12
|
+
export declare function toAIFriendlyError(error: unknown, selector: string): Error;
|
|
13
|
+
export declare function initActionPolicy(): void;
|
|
14
|
+
/**
|
|
15
|
+
* Execute a command and return a response
|
|
16
|
+
*/
|
|
17
|
+
export declare function executeCommand(command: Command, browser: BrowserManager): Promise<Response>;
|
|
18
|
+
//# sourceMappingURL=actions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAqBpE,OAAO,KAAK,EACV,OAAO,EACP,QAAQ,EAsIT,MAAM,YAAY,CAAC;AAQpB;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC,GAAG,IAAI,GAClD,IAAI,CAEN;AAQD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,KAAK,CAqDzE;AAKD,wBAAgB,gBAAgB,IAAI,IAAI,CAuBvC;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,QAAQ,CAAC,CA6CjG"}
|