@anweat/dsh-browser 0.1.5 → 0.1.7
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 +245 -140
- package/cordis.patch.yml +16 -15
- package/lib/approval-policy.d.ts +12 -0
- package/lib/approval-policy.js +63 -0
- package/lib/approval-policy.js.map +1 -0
- package/lib/automation.d.ts +67 -0
- package/lib/automation.js +181 -0
- package/lib/automation.js.map +1 -0
- package/lib/browser-service.d.ts +51 -0
- package/lib/browser-service.js +149 -45
- package/lib/browser-service.js.map +1 -1
- package/lib/config.d.ts +4 -0
- package/lib/config.js +3 -0
- package/lib/config.js.map +1 -1
- package/lib/deps.js +3 -7
- package/lib/deps.js.map +1 -1
- package/lib/freedom.d.ts +8 -0
- package/lib/freedom.js +48 -0
- package/lib/freedom.js.map +1 -0
- package/lib/index.d.ts +6 -1
- package/lib/index.js +13 -1
- package/lib/index.js.map +1 -1
- package/lib/scripts.d.ts +35 -0
- package/lib/scripts.js +181 -0
- package/lib/scripts.js.map +1 -0
- package/lib/tools.js +277 -9
- package/lib/tools.js.map +1 -1
- package/package.json +78 -75
package/lib/config.js
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
import path from 'node:path';
|
|
6
6
|
import os from 'node:os';
|
|
7
7
|
import z from '@deepseek-ai/schemastery';
|
|
8
|
+
import { resolveAutomationMode } from "./freedom.js";
|
|
8
9
|
export const Config = z.object({
|
|
9
10
|
enabled: z.boolean().default(true),
|
|
10
11
|
channel: z.string().default('chromium'),
|
|
@@ -32,6 +33,7 @@ export const Config = z.object({
|
|
|
32
33
|
})),
|
|
33
34
|
executablePath: z.string(),
|
|
34
35
|
opencliEnabled: z.boolean().default(true),
|
|
36
|
+
automationMode: z.string().default('standard'),
|
|
35
37
|
autoInstall: z.boolean().default(false),
|
|
36
38
|
snapshotDir: z.string(),
|
|
37
39
|
verbose: z.boolean().default(false),
|
|
@@ -47,6 +49,7 @@ export function resolveConfig(config) {
|
|
|
47
49
|
channel: config.channel ?? 'chromium',
|
|
48
50
|
headless: config.headless ?? true,
|
|
49
51
|
opencliEnabled: config.opencliEnabled ?? true,
|
|
52
|
+
automationMode: resolveAutomationMode(config.automationMode),
|
|
50
53
|
autoInstall: config.autoInstall ?? false,
|
|
51
54
|
snapshotDir,
|
|
52
55
|
verbose: config.verbose ?? false,
|
package/lib/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,CAAC,MAAM,0BAA0B,CAAA;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/lib/deps.js
CHANGED
|
@@ -113,12 +113,6 @@ export function opencliEntryPath() {
|
|
|
113
113
|
const bin = typeof pkg.bin === 'string' ? pkg.bin : (pkg.bin?.opencli ?? pkg.main ?? 'dist/src/main.js');
|
|
114
114
|
return path.join(dir, bin);
|
|
115
115
|
}
|
|
116
|
-
function quoteArg(arg) {
|
|
117
|
-
if (/[^\w@%+=:,./-]/.test(arg)) {
|
|
118
|
-
return '"' + arg.replace(/"/g, '\\"') + '"';
|
|
119
|
-
}
|
|
120
|
-
return arg;
|
|
121
|
-
}
|
|
122
116
|
/**
|
|
123
117
|
* Run a Node.js script with piped stdio capture (bundled opencli / playwright
|
|
124
118
|
* CLI). Mirrors web-search-pro's runCli contract.
|
|
@@ -148,7 +142,9 @@ export function runNode(script, args, opts = { signal: undefined }) {
|
|
|
148
142
|
finish(-1, false);
|
|
149
143
|
};
|
|
150
144
|
timer = opts.timeoutMs ? setTimeout(() => finish(-1, true), opts.timeoutMs) : undefined;
|
|
151
|
-
|
|
145
|
+
// spawn() is used without a shell, so argv must be passed verbatim. Adding
|
|
146
|
+
// shell quotes here would make those quote characters part of the value.
|
|
147
|
+
child = spawn(process.execPath, [script, ...args], {
|
|
152
148
|
env: { ...process.env, ...opts.env },
|
|
153
149
|
cwd: opts.cwd,
|
|
154
150
|
windowsHide: true,
|
package/lib/deps.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deps.js","sourceRoot":"","sources":["../src/deps.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"deps.js","sourceRoot":"","sources":["../src/deps.ts"],"names":[],"mappings":"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"}
|
package/lib/freedom.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** Public automation-freedom contract and tool exposure matrix. */
|
|
2
|
+
export declare const AUTOMATION_MODES: readonly ["read-only", "standard", "autonomous", "unrestricted"];
|
|
3
|
+
export type AutomationMode = typeof AUTOMATION_MODES[number];
|
|
4
|
+
export declare const ALL_BROWSER_TOOL_NAMES: readonly ["browser_open", "browser_click", "browser_type", "browser_scroll", "browser_read", "browser_screenshot", "browser_close", "browser_status", "browser_install", "browser_script_catalog", "browser_script_validate", "browser_script_run_builtin", "browser_userscript_run", "browser_recipe_run", "browser_opencli_status", "browser_opencli_run"];
|
|
5
|
+
export type BrowserToolName = typeof ALL_BROWSER_TOOL_NAMES[number];
|
|
6
|
+
export declare function resolveAutomationMode(value: unknown): AutomationMode;
|
|
7
|
+
export declare function isBrowserToolExposed(name: string, mode: AutomationMode): name is BrowserToolName;
|
|
8
|
+
export declare function browserToolsForMode(mode: AutomationMode): BrowserToolName[];
|
package/lib/freedom.js
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/** Public automation-freedom contract and tool exposure matrix. */
|
|
2
|
+
export const AUTOMATION_MODES = ['read-only', 'standard', 'autonomous', 'unrestricted'];
|
|
3
|
+
export const ALL_BROWSER_TOOL_NAMES = [
|
|
4
|
+
'browser_open',
|
|
5
|
+
'browser_click',
|
|
6
|
+
'browser_type',
|
|
7
|
+
'browser_scroll',
|
|
8
|
+
'browser_read',
|
|
9
|
+
'browser_screenshot',
|
|
10
|
+
'browser_close',
|
|
11
|
+
'browser_status',
|
|
12
|
+
'browser_install',
|
|
13
|
+
'browser_script_catalog',
|
|
14
|
+
'browser_script_validate',
|
|
15
|
+
'browser_script_run_builtin',
|
|
16
|
+
'browser_userscript_run',
|
|
17
|
+
'browser_recipe_run',
|
|
18
|
+
'browser_opencli_status',
|
|
19
|
+
'browser_opencli_run',
|
|
20
|
+
];
|
|
21
|
+
const READ_ONLY_TOOL_NAMES = new Set([
|
|
22
|
+
'browser_open',
|
|
23
|
+
'browser_read',
|
|
24
|
+
'browser_screenshot',
|
|
25
|
+
'browser_close',
|
|
26
|
+
'browser_status',
|
|
27
|
+
'browser_script_catalog',
|
|
28
|
+
'browser_script_validate',
|
|
29
|
+
'browser_script_run_builtin',
|
|
30
|
+
'browser_recipe_run',
|
|
31
|
+
'browser_opencli_status',
|
|
32
|
+
]);
|
|
33
|
+
export function resolveAutomationMode(value) {
|
|
34
|
+
const mode = value ?? 'standard';
|
|
35
|
+
if (typeof mode !== 'string' || !AUTOMATION_MODES.includes(mode)) {
|
|
36
|
+
throw new Error('automationMode must be one of: ' + AUTOMATION_MODES.join(', '));
|
|
37
|
+
}
|
|
38
|
+
return mode;
|
|
39
|
+
}
|
|
40
|
+
export function isBrowserToolExposed(name, mode) {
|
|
41
|
+
if (!ALL_BROWSER_TOOL_NAMES.includes(name))
|
|
42
|
+
return false;
|
|
43
|
+
return mode !== 'read-only' || READ_ONLY_TOOL_NAMES.has(name);
|
|
44
|
+
}
|
|
45
|
+
export function browserToolsForMode(mode) {
|
|
46
|
+
return ALL_BROWSER_TOOL_NAMES.filter(name => isBrowserToolExposed(name, mode));
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=freedom.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"freedom.js","sourceRoot":"","sources":["../src/freedom.ts"],"names":[],"mappings":"AAAA,mEAAmE;AAEnE,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,cAAc,CAAU,CAAA;AAGhG,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,cAAc;IACd,eAAe;IACf,cAAc;IACd,gBAAgB;IAChB,cAAc;IACd,oBAAoB;IACpB,eAAe;IACf,gBAAgB;IAChB,iBAAiB;IACjB,wBAAwB;IACxB,yBAAyB;IACzB,4BAA4B;IAC5B,wBAAwB;IACxB,oBAAoB;IACpB,wBAAwB;IACxB,qBAAqB;CACb,CAAA;AAIV,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAkB;IACpD,cAAc;IACd,cAAc;IACd,oBAAoB;IACpB,eAAe;IACf,gBAAgB;IAChB,wBAAwB;IACxB,yBAAyB;IACzB,4BAA4B;IAC5B,oBAAoB;IACpB,wBAAwB;CACzB,CAAC,CAAA;AAEF,MAAM,UAAU,qBAAqB,CAAC,KAAc;IAClD,MAAM,IAAI,GAAG,KAAK,IAAI,UAAU,CAAA;IAChC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAsB,CAAC,EAAE,CAAC;QACnF,MAAM,IAAI,KAAK,CAAC,iCAAiC,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;IAClF,CAAC;IACD,OAAO,IAAsB,CAAA;AAC/B,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAY,EAAE,IAAoB;IACrE,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,IAAuB,CAAC;QAAE,OAAO,KAAK,CAAA;IAC3E,OAAO,IAAI,KAAK,WAAW,IAAI,oBAAoB,CAAC,GAAG,CAAC,IAAuB,CAAC,CAAA;AAClF,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAoB;IACtD,OAAO,sBAAsB,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,oBAAoB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAA;AAChF,CAAC"}
|
package/lib/index.d.ts
CHANGED
|
@@ -12,7 +12,12 @@ export declare const name = "dsh-browser";
|
|
|
12
12
|
export declare const inject: string[];
|
|
13
13
|
export { Config };
|
|
14
14
|
export type { Config as BrowserConfig } from './config.ts';
|
|
15
|
-
export type { BrowserService, RenderRule, RenderResult, SnapshotResult, PlatformSpec, SearchItem, InteractiveState } from './browser-service.ts';
|
|
15
|
+
export type { BrowserService, RenderRule, RenderResult, SnapshotResult, PlatformSpec, SearchItem, InteractiveState, RecipeRunResult, ScriptRunResult } from './browser-service.ts';
|
|
16
16
|
export type { AuthProfileConfig, ResolvedAuthProfile } from './auth-profiles.ts';
|
|
17
17
|
export type { RulePackConfig, RuleStep, ResolvedRulePack } from './rule-packs.ts';
|
|
18
|
+
export type { BrowserRecipeStep, RecipeStepResult } from './automation.ts';
|
|
19
|
+
export type { UserscriptMetadata, UserscriptValidation, BuiltinScript } from './scripts.ts';
|
|
20
|
+
export { BUILTIN_SCRIPTS, validateUserscript } from './scripts.ts';
|
|
21
|
+
export type { AutomationMode, BrowserToolName } from './freedom.ts';
|
|
22
|
+
export { AUTOMATION_MODES, ALL_BROWSER_TOOL_NAMES, browserToolsForMode } from './freedom.ts';
|
|
18
23
|
export declare function apply(ctx: Context, config: Config): void;
|
package/lib/index.js
CHANGED
|
@@ -11,13 +11,24 @@ import path from 'node:path';
|
|
|
11
11
|
import { Config, resolveConfig } from "./config.js";
|
|
12
12
|
import { BrowserService } from "./browser-service.js";
|
|
13
13
|
import { registerTools } from "./tools.js";
|
|
14
|
+
import { browserPolicyDecision } from "./approval-policy.js";
|
|
14
15
|
export const name = 'dsh-browser';
|
|
15
16
|
export const inject = ['tools'];
|
|
16
17
|
export { Config };
|
|
18
|
+
export { BUILTIN_SCRIPTS, validateUserscript } from "./scripts.js";
|
|
19
|
+
export { AUTOMATION_MODES, ALL_BROWSER_TOOL_NAMES, browserToolsForMode } from "./freedom.js";
|
|
17
20
|
export function apply(ctx, config) {
|
|
18
21
|
const resolved = resolveConfig(config);
|
|
19
22
|
fs.mkdirSync(resolved.snapshotDir, { recursive: true });
|
|
20
23
|
const service = new BrowserService(resolved);
|
|
24
|
+
// Apply the configured exposure/approval mode before every browser tool.
|
|
25
|
+
// Validation remains active even when unrestricted mode skips approvals.
|
|
26
|
+
ctx.on('tools/pre-execute', async (exec, next) => {
|
|
27
|
+
const downstream = await next();
|
|
28
|
+
if (downstream.kind !== 'allow')
|
|
29
|
+
return downstream;
|
|
30
|
+
return browserPolicyDecision(exec.name, exec.arguments, resolved.automationMode);
|
|
31
|
+
});
|
|
21
32
|
// Provide the `browser` service so consumers (web-search-pro) can inject it.
|
|
22
33
|
// ctx.provide is scoped to this plugin's fiber; the browser instance itself
|
|
23
34
|
// is closed via the effect disposer below.
|
|
@@ -33,11 +44,12 @@ export function apply(ctx, config) {
|
|
|
33
44
|
channel: resolved.channel,
|
|
34
45
|
headless: resolved.headless,
|
|
35
46
|
opencliEnabled: resolved.opencliEnabled,
|
|
47
|
+
automationMode: resolved.automationMode,
|
|
36
48
|
snapshotDir: resolved.snapshotDir,
|
|
37
49
|
}) + '\n', 'utf8');
|
|
38
50
|
}
|
|
39
51
|
catch { /* marker is best-effort */ }
|
|
40
52
|
}
|
|
41
|
-
ctx.logger?.(name).info('dsh-browser loaded: channel=' + resolved.channel + ' headless=' + resolved.headless + ' opencli=' + resolved.opencliEnabled);
|
|
53
|
+
ctx.logger?.(name).info('dsh-browser loaded: channel=' + resolved.channel + ' headless=' + resolved.headless + ' opencli=' + resolved.opencliEnabled + ' automation=' + resolved.automationMode);
|
|
42
54
|
}
|
|
43
55
|
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,OAAO,EAAE,MAAM,EAAE,aAAa,EAAuB,MAAM,aAAa,CAAA;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,OAAO,EAAE,MAAM,EAAE,aAAa,EAAuB,MAAM,aAAa,CAAA;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAC1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AAE5D,MAAM,CAAC,MAAM,IAAI,GAAG,aAAa,CAAA;AACjC,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,OAAO,CAAC,CAAA;AAE/B,OAAO,EAAE,MAAM,EAAE,CAAA;AAOjB,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAElE,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAE5F,MAAM,UAAU,KAAK,CAAC,GAAY,EAAE,MAAc;IAChD,MAAM,QAAQ,GAAmB,aAAa,CAAC,MAAM,CAAC,CAAA;IACtD,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAEvD,MAAM,OAAO,GAAG,IAAI,cAAc,CAAC,QAAQ,CAAC,CAAA;IAE5C,yEAAyE;IACzE,yEAAyE;IACzE,GAAG,CAAC,EAAE,CAAC,mBAAmB,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;QAC/C,MAAM,UAAU,GAAG,MAAM,IAAI,EAAE,CAAA;QAC/B,IAAI,UAAU,CAAC,IAAI,KAAK,OAAO;YAAE,OAAO,UAAU,CAAA;QAClD,OAAO,qBAAqB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAA;IAClF,CAAC,CAAC,CAAA;IAEF,6EAA6E;IAC7E,4EAA4E;IAC5E,2CAA2C;IAC3C,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;IAC/B,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,OAAO,CAAC,KAAK,EAAE,CAAC,CAAA;IAE5C,aAAa,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAA;IAErC,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;QACrB,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC,CAAA;YAC/D,EAAE,CAAC,cAAc,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC;gBAC3C,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBAC5B,MAAM,EAAE,IAAI;gBACZ,OAAO,EAAE,QAAQ,CAAC,OAAO;gBACzB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;gBAC3B,cAAc,EAAE,QAAQ,CAAC,cAAc;gBACvC,cAAc,EAAE,QAAQ,CAAC,cAAc;gBACvC,WAAW,EAAE,QAAQ,CAAC,WAAW;aAClC,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAA;QACpB,CAAC;QAAC,MAAM,CAAC,CAAC,2BAA2B,CAAC,CAAC;IACzC,CAAC;IAED,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,8BAA8B,GAAG,QAAQ,CAAC,OAAO,GAAG,YAAY,GAAG,QAAQ,CAAC,QAAQ,GAAG,WAAW,GAAG,QAAQ,CAAC,cAAc,GAAG,cAAc,GAAG,QAAQ,CAAC,cAAc,CAAC,CAAA;AAClM,CAAC"}
|
package/lib/scripts.d.ts
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tampermonkey-compatible metadata validation and bounded userscript execution.
|
|
3
|
+
* Only `@grant none` is supported; GM_* APIs are intentionally not emulated.
|
|
4
|
+
* @module dsh-browser/scripts
|
|
5
|
+
*/
|
|
6
|
+
export interface UserscriptMetadata {
|
|
7
|
+
name: string;
|
|
8
|
+
description?: string;
|
|
9
|
+
matches: string[];
|
|
10
|
+
excludes: string[];
|
|
11
|
+
grants: string[];
|
|
12
|
+
}
|
|
13
|
+
export interface UserscriptValidation {
|
|
14
|
+
valid: boolean;
|
|
15
|
+
sha256: string;
|
|
16
|
+
bytes: number;
|
|
17
|
+
metadata: UserscriptMetadata;
|
|
18
|
+
capabilities: string[];
|
|
19
|
+
errors: string[];
|
|
20
|
+
warnings: string[];
|
|
21
|
+
}
|
|
22
|
+
export interface BuiltinScript {
|
|
23
|
+
id: string;
|
|
24
|
+
name: string;
|
|
25
|
+
description: string;
|
|
26
|
+
source: string;
|
|
27
|
+
}
|
|
28
|
+
export declare const BUILTIN_SCRIPTS: readonly BuiltinScript[];
|
|
29
|
+
export declare function matchUserscriptPattern(pattern: string, targetUrl: string): boolean;
|
|
30
|
+
export declare function validateUserscript(source: string, targetUrl?: string): UserscriptValidation;
|
|
31
|
+
export declare function builtinScript(id: string): BuiltinScript;
|
|
32
|
+
export declare function executeUserscript(page: any, source: string, maxResultChars?: number): Promise<{
|
|
33
|
+
resultJson: string;
|
|
34
|
+
truncated: boolean;
|
|
35
|
+
}>;
|
package/lib/scripts.js
ADDED
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tampermonkey-compatible metadata validation and bounded userscript execution.
|
|
3
|
+
* Only `@grant none` is supported; GM_* APIs are intentionally not emulated.
|
|
4
|
+
* @module dsh-browser/scripts
|
|
5
|
+
*/
|
|
6
|
+
import crypto from 'node:crypto';
|
|
7
|
+
const header = (name, description) => `// ==UserScript==
|
|
8
|
+
// @name ${name}
|
|
9
|
+
// @description ${description}
|
|
10
|
+
// @match *://*/*
|
|
11
|
+
// @grant none
|
|
12
|
+
// ==/UserScript==`;
|
|
13
|
+
export const BUILTIN_SCRIPTS = [
|
|
14
|
+
{
|
|
15
|
+
id: 'article-clean',
|
|
16
|
+
name: 'Article Clean Reader',
|
|
17
|
+
description: 'Extract title, canonical URL, headings, and readable article text.',
|
|
18
|
+
source: `${header('Article Clean Reader', 'Extract readable article content without mutating the page.')}
|
|
19
|
+
const root = document.querySelector('article, main, [role="main"]') || document.body
|
|
20
|
+
return {
|
|
21
|
+
title: document.title,
|
|
22
|
+
canonicalUrl: document.querySelector('link[rel="canonical"]')?.href || location.href,
|
|
23
|
+
headings: [...root.querySelectorAll('h1,h2,h3')].slice(0, 100).map(el => (el.textContent || '').trim()).filter(Boolean),
|
|
24
|
+
text: (root.innerText || root.textContent || '').trim().slice(0, 50000),
|
|
25
|
+
}`,
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
id: 'links',
|
|
29
|
+
name: 'Link Inventory',
|
|
30
|
+
description: 'Extract up to 200 visible links with absolute URLs.',
|
|
31
|
+
source: `${header('Link Inventory', 'Extract visible links without clicking them.')}
|
|
32
|
+
return [...document.querySelectorAll('a[href]')].slice(0, 200).map(a => ({
|
|
33
|
+
text: (a.textContent || '').trim().slice(0, 500),
|
|
34
|
+
url: a.href,
|
|
35
|
+
})).filter(item => item.url)`,
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
id: 'jsonld',
|
|
39
|
+
name: 'JSON-LD Extractor',
|
|
40
|
+
description: 'Read structured JSON-LD blocks from the page.',
|
|
41
|
+
source: `${header('JSON-LD Extractor', 'Extract JSON-LD structured data.')}
|
|
42
|
+
return [...document.querySelectorAll('script[type="application/ld+json"]')].slice(0, 20).map(node => {
|
|
43
|
+
try { return JSON.parse(node.textContent || 'null') } catch { return { invalid: true, text: (node.textContent || '').slice(0, 2000) } }
|
|
44
|
+
})`,
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
id: 'forms',
|
|
48
|
+
name: 'Form Structure',
|
|
49
|
+
description: 'Describe forms and controls without returning current values.',
|
|
50
|
+
source: `${header('Form Structure', 'Describe form controls without exposing entered values.')}
|
|
51
|
+
return [...document.forms].slice(0, 30).map((form, formIndex) => ({
|
|
52
|
+
form: formIndex,
|
|
53
|
+
action: form.action,
|
|
54
|
+
method: form.method,
|
|
55
|
+
controls: [...form.elements].slice(0, 100).map(el => ({
|
|
56
|
+
tag: el.tagName.toLowerCase(), type: el.type || '', name: el.name || '', id: el.id || '', required: !!el.required,
|
|
57
|
+
})),
|
|
58
|
+
}))`,
|
|
59
|
+
},
|
|
60
|
+
];
|
|
61
|
+
function metadataOf(source) {
|
|
62
|
+
const start = source.indexOf('// ==UserScript==');
|
|
63
|
+
const end = source.indexOf('// ==/UserScript==');
|
|
64
|
+
const rows = start >= 0 && end > start ? source.slice(start, end).split(/\r?\n/) : [];
|
|
65
|
+
const values = new Map();
|
|
66
|
+
for (const row of rows) {
|
|
67
|
+
const match = row.match(/^\s*\/\/\s*@([\w-]+)\s*(.*?)\s*$/);
|
|
68
|
+
if (!match)
|
|
69
|
+
continue;
|
|
70
|
+
const key = match[1].toLowerCase();
|
|
71
|
+
const list = values.get(key) ?? [];
|
|
72
|
+
list.push(match[2]);
|
|
73
|
+
values.set(key, list);
|
|
74
|
+
}
|
|
75
|
+
return {
|
|
76
|
+
name: values.get('name')?.[0] || 'External userscript',
|
|
77
|
+
...values.get('description')?.[0] ? { description: values.get('description')[0] } : {},
|
|
78
|
+
matches: values.get('match') ?? [],
|
|
79
|
+
excludes: values.get('exclude-match') ?? [],
|
|
80
|
+
grants: values.get('grant') ?? [],
|
|
81
|
+
requires: values.get('require') ?? [],
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
function globPath(pattern) {
|
|
85
|
+
return new RegExp('^' + pattern.replace(/[.+?^${}()|[\]\\]/g, '\\$&').replace(/\*/g, '.*') + '$');
|
|
86
|
+
}
|
|
87
|
+
export function matchUserscriptPattern(pattern, targetUrl) {
|
|
88
|
+
const parsed = pattern.match(/^(\*|https?|file|ftp):\/\/([^/]+)(\/.*)$/i);
|
|
89
|
+
if (!parsed)
|
|
90
|
+
return false;
|
|
91
|
+
const url = new URL(targetUrl);
|
|
92
|
+
if (parsed[1] === '*' ? !/^https?:$/.test(url.protocol) : url.protocol !== parsed[1].toLowerCase() + ':')
|
|
93
|
+
return false;
|
|
94
|
+
const wantedHost = parsed[2].toLowerCase();
|
|
95
|
+
const host = url.hostname.toLowerCase();
|
|
96
|
+
const hostMatches = wantedHost === '*'
|
|
97
|
+
|| (wantedHost.startsWith('*.') ? host === wantedHost.slice(2) || host.endsWith('.' + wantedHost.slice(2)) : host === wantedHost);
|
|
98
|
+
return hostMatches && globPath(parsed[3]).test(url.pathname + url.search + url.hash);
|
|
99
|
+
}
|
|
100
|
+
function capabilitiesOf(source) {
|
|
101
|
+
const capabilities = new Set(['dom-read']);
|
|
102
|
+
if (/\b(fetch|XMLHttpRequest|WebSocket|sendBeacon)\b/.test(source))
|
|
103
|
+
capabilities.add('network');
|
|
104
|
+
if (/\b(localStorage|sessionStorage|indexedDB|document\.cookie)\b/.test(source))
|
|
105
|
+
capabilities.add('storage');
|
|
106
|
+
if (/\.click\s*\(|dispatchEvent\s*\(|\.submit\s*\(|\blocation\s*=|history\.(pushState|replaceState)/.test(source))
|
|
107
|
+
capabilities.add('interaction');
|
|
108
|
+
if (/\b(remove|append|prepend|replaceWith|insertAdjacentHTML)\s*\(|\.innerHTML\s*=|\.textContent\s*=/.test(source))
|
|
109
|
+
capabilities.add('dom-write');
|
|
110
|
+
return [...capabilities];
|
|
111
|
+
}
|
|
112
|
+
export function validateUserscript(source, targetUrl) {
|
|
113
|
+
const bytes = Buffer.byteLength(source, 'utf8');
|
|
114
|
+
const sha256 = crypto.createHash('sha256').update(source, 'utf8').digest('hex');
|
|
115
|
+
const parsed = metadataOf(source);
|
|
116
|
+
const errors = [];
|
|
117
|
+
const warnings = [];
|
|
118
|
+
if (bytes < 1 || bytes > 64 * 1024)
|
|
119
|
+
errors.push('source must contain between 1 and 65536 UTF-8 bytes');
|
|
120
|
+
if (!source.includes('// ==UserScript==') || !source.includes('// ==/UserScript=='))
|
|
121
|
+
errors.push('userscript metadata block is required');
|
|
122
|
+
if (parsed.matches.length < 1)
|
|
123
|
+
errors.push('at least one @match is required');
|
|
124
|
+
if (parsed.matches.some(pattern => !/^(\*|https?):\/\//i.test(pattern)))
|
|
125
|
+
errors.push('only HTTP(S) @match patterns are supported');
|
|
126
|
+
if (parsed.requires.length > 0)
|
|
127
|
+
errors.push('@require is not supported; external code must be supplied inline for approval');
|
|
128
|
+
const invalidGrants = parsed.grants.filter(grant => grant !== 'none');
|
|
129
|
+
if (invalidGrants.length > 0)
|
|
130
|
+
errors.push('unsupported @grant values: ' + invalidGrants.join(', '));
|
|
131
|
+
if (parsed.grants.length === 0)
|
|
132
|
+
warnings.push('missing @grant; execution still provides no GM_* APIs');
|
|
133
|
+
if (targetUrl !== undefined) {
|
|
134
|
+
let matched = false;
|
|
135
|
+
try {
|
|
136
|
+
matched = parsed.matches.some(pattern => matchUserscriptPattern(pattern, targetUrl))
|
|
137
|
+
&& !parsed.excludes.some(pattern => matchUserscriptPattern(pattern, targetUrl));
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
errors.push('target URL is invalid');
|
|
141
|
+
}
|
|
142
|
+
if (!matched)
|
|
143
|
+
errors.push('target URL is outside the userscript @match scope');
|
|
144
|
+
}
|
|
145
|
+
return {
|
|
146
|
+
valid: errors.length === 0,
|
|
147
|
+
sha256,
|
|
148
|
+
bytes,
|
|
149
|
+
metadata: {
|
|
150
|
+
name: parsed.name,
|
|
151
|
+
...parsed.description ? { description: parsed.description } : {},
|
|
152
|
+
matches: parsed.matches,
|
|
153
|
+
excludes: parsed.excludes,
|
|
154
|
+
grants: parsed.grants,
|
|
155
|
+
},
|
|
156
|
+
capabilities: capabilitiesOf(source),
|
|
157
|
+
errors,
|
|
158
|
+
warnings,
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
export function builtinScript(id) {
|
|
162
|
+
const script = BUILTIN_SCRIPTS.find(candidate => candidate.id === id);
|
|
163
|
+
if (!script)
|
|
164
|
+
throw new Error('unknown built-in script: ' + id);
|
|
165
|
+
return script;
|
|
166
|
+
}
|
|
167
|
+
export async function executeUserscript(page, source, maxResultChars = 100_000) {
|
|
168
|
+
const result = await page.evaluate(`(async () => {\n${source}\n})()`);
|
|
169
|
+
let resultJson;
|
|
170
|
+
try {
|
|
171
|
+
resultJson = JSON.stringify(result ?? null);
|
|
172
|
+
}
|
|
173
|
+
catch {
|
|
174
|
+
resultJson = JSON.stringify({ unserializable: true, text: String(result) });
|
|
175
|
+
}
|
|
176
|
+
const truncated = resultJson.length > maxResultChars;
|
|
177
|
+
if (truncated)
|
|
178
|
+
resultJson = resultJson.slice(0, maxResultChars) + '…';
|
|
179
|
+
return { resultJson, truncated };
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=scripts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scripts.js","sourceRoot":"","sources":["../src/scripts.ts"],"names":[],"mappings":"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"}
|