@dyyz1993/agent-browser 0.26.4 → 0.27.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 (66) hide show
  1. package/dist/actions/crawl.d.ts.map +1 -1
  2. package/dist/actions/crawl.js +26 -12
  3. package/dist/actions/crawl.js.map +1 -1
  4. package/dist/actions/index.d.ts.map +1 -1
  5. package/dist/actions/index.js +10 -0
  6. package/dist/actions/index.js.map +1 -1
  7. package/dist/actions/plugins.d.ts +4 -0
  8. package/dist/actions/plugins.d.ts.map +1 -0
  9. package/dist/actions/plugins.js +233 -0
  10. package/dist/actions/plugins.js.map +1 -0
  11. package/dist/browser/browser-manager.d.ts.map +1 -1
  12. package/dist/browser/browser-manager.js +5 -7
  13. package/dist/browser/browser-manager.js.map +1 -1
  14. package/dist/cli/commands.d.ts.map +1 -1
  15. package/dist/cli/commands.js +102 -5
  16. package/dist/cli/commands.js.map +1 -1
  17. package/dist/cli/help.d.ts.map +1 -1
  18. package/dist/cli/help.js +47 -0
  19. package/dist/cli/help.js.map +1 -1
  20. package/dist/plugins/context.d.ts +4 -0
  21. package/dist/plugins/context.d.ts.map +1 -0
  22. package/dist/plugins/context.js +86 -0
  23. package/dist/plugins/context.js.map +1 -0
  24. package/dist/plugins/index.d.ts +5 -0
  25. package/dist/plugins/index.d.ts.map +1 -0
  26. package/dist/plugins/index.js +4 -0
  27. package/dist/plugins/index.js.map +1 -0
  28. package/dist/plugins/installers/builtin-installer.d.ts +7 -0
  29. package/dist/plugins/installers/builtin-installer.d.ts.map +1 -0
  30. package/dist/plugins/installers/builtin-installer.js +27 -0
  31. package/dist/plugins/installers/builtin-installer.js.map +1 -0
  32. package/dist/plugins/installers/git-installer.d.ts +3 -0
  33. package/dist/plugins/installers/git-installer.d.ts.map +1 -0
  34. package/dist/plugins/installers/git-installer.js +55 -0
  35. package/dist/plugins/installers/git-installer.js.map +1 -0
  36. package/dist/plugins/installers/local-installer.d.ts +3 -0
  37. package/dist/plugins/installers/local-installer.d.ts.map +1 -0
  38. package/dist/plugins/installers/local-installer.js +58 -0
  39. package/dist/plugins/installers/local-installer.js.map +1 -0
  40. package/dist/plugins/installers/npm-installer.d.ts +3 -0
  41. package/dist/plugins/installers/npm-installer.d.ts.map +1 -0
  42. package/dist/plugins/installers/npm-installer.js +54 -0
  43. package/dist/plugins/installers/npm-installer.js.map +1 -0
  44. package/dist/plugins/installers/types.d.ts +2 -0
  45. package/dist/plugins/installers/types.d.ts.map +1 -0
  46. package/dist/plugins/installers/types.js +2 -0
  47. package/dist/plugins/installers/types.js.map +1 -0
  48. package/dist/plugins/installers/url-installer.d.ts +3 -0
  49. package/dist/plugins/installers/url-installer.d.ts.map +1 -0
  50. package/dist/plugins/installers/url-installer.js +34 -0
  51. package/dist/plugins/installers/url-installer.js.map +1 -0
  52. package/dist/plugins/registry.d.ts +24 -0
  53. package/dist/plugins/registry.d.ts.map +1 -0
  54. package/dist/plugins/registry.js +253 -0
  55. package/dist/plugins/registry.js.map +1 -0
  56. package/dist/plugins/types.d.ts +76 -0
  57. package/dist/plugins/types.d.ts.map +1 -0
  58. package/dist/plugins/types.js +2 -0
  59. package/dist/plugins/types.js.map +1 -0
  60. package/dist/protocol.d.ts.map +1 -1
  61. package/dist/protocol.js +46 -0
  62. package/dist/protocol.js.map +1 -1
  63. package/dist/types.d.ts +38 -1
  64. package/dist/types.d.ts.map +1 -1
  65. package/dist/types.js.map +1 -1
  66. package/package.json +2 -1
@@ -0,0 +1,55 @@
1
+ import { execSync } from 'node:child_process';
2
+ import fs from 'node:fs';
3
+ import path from 'node:path';
4
+ export const gitInstaller = {
5
+ type: 'git',
6
+ detect(source) {
7
+ return (source.endsWith('.git') ||
8
+ source.includes('github.com/') ||
9
+ source.includes('gitlab.com/') ||
10
+ source.startsWith('git+') ||
11
+ source.startsWith('git://'));
12
+ },
13
+ async install(source, pluginsDir) {
14
+ const url = source.replace(/^git\+/, '');
15
+ const baseName = url.replace(/\.git$/, '').split('/').pop() || 'unknown';
16
+ const name = baseName
17
+ .replace(/^agent-browser-plugin-/, '')
18
+ .replace(/^ab-plugin-/, '')
19
+ .replace(/^plugin-/, '');
20
+ const targetDir = path.join(pluginsDir, name);
21
+ fs.mkdirSync(pluginsDir, { recursive: true });
22
+ if (fs.existsSync(targetDir))
23
+ fs.rmSync(targetDir, { recursive: true });
24
+ try {
25
+ execSync(`git clone --depth 1 "${url}" "${targetDir}" 2>&1`, {
26
+ stdio: 'pipe',
27
+ timeout: 60000,
28
+ });
29
+ }
30
+ catch (e) {
31
+ throw new Error(`git clone failed: ${e.message}`);
32
+ }
33
+ let version = '0.0.0';
34
+ const pkgJson = path.join(targetDir, 'package.json');
35
+ if (fs.existsSync(pkgJson)) {
36
+ const pkg = JSON.parse(fs.readFileSync(pkgJson, 'utf-8'));
37
+ version = pkg.version || version;
38
+ }
39
+ let entryPath = path.join(targetDir, 'index.ts');
40
+ if (!fs.existsSync(entryPath))
41
+ entryPath = path.join(targetDir, 'index.js');
42
+ if (fs.existsSync(pkgJson)) {
43
+ const pkg = JSON.parse(fs.readFileSync(pkgJson, 'utf-8'));
44
+ if (pkg.main)
45
+ entryPath = path.join(targetDir, pkg.main);
46
+ }
47
+ return { name, version, path: entryPath };
48
+ },
49
+ async uninstall(name, pluginsDir) {
50
+ const targetDir = path.join(pluginsDir, name);
51
+ if (fs.existsSync(targetDir))
52
+ fs.rmSync(targetDir, { recursive: true });
53
+ },
54
+ };
55
+ //# sourceMappingURL=git-installer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-installer.js","sourceRoot":"","sources":["../../../src/plugins/installers/git-installer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { PluginInstaller } from '../types.js';
2
+ export declare const localInstaller: PluginInstaller;
3
+ //# sourceMappingURL=local-installer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-installer.d.ts","sourceRoot":"","sources":["../../../src/plugins/installers/local-installer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAiB,MAAM,aAAa,CAAC;AAKlE,eAAO,MAAM,cAAc,EAAE,eA2D5B,CAAC"}
@@ -0,0 +1,58 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import os from 'node:os';
4
+ export const localInstaller = {
5
+ type: 'local',
6
+ detect(source) {
7
+ if (source.startsWith('./') || source.startsWith('../') || source.startsWith('/'))
8
+ return true;
9
+ if (source.startsWith('~'))
10
+ return true;
11
+ const expanded = source.replace(/^~/, os.homedir());
12
+ return (fs.existsSync(expanded) &&
13
+ (expanded.endsWith('.ts') || expanded.endsWith('.js') || fs.statSync(expanded).isDirectory()));
14
+ },
15
+ async install(source, pluginsDir) {
16
+ const expanded = source.replace(/^~/, os.homedir());
17
+ const resolved = path.resolve(expanded);
18
+ if (!fs.existsSync(resolved)) {
19
+ throw new Error(`Local path not found: ${resolved}`);
20
+ }
21
+ const stat = fs.statSync(resolved);
22
+ let pluginDir;
23
+ if (stat.isDirectory()) {
24
+ const dirName = path.basename(resolved);
25
+ pluginDir = path.join(pluginsDir, dirName);
26
+ if (fs.existsSync(pluginDir))
27
+ fs.rmSync(pluginDir, { recursive: true });
28
+ fs.cpSync(resolved, pluginDir, { recursive: true });
29
+ return {
30
+ name: dirName,
31
+ version: '0.0.0',
32
+ path: path.join(pluginDir, 'index.ts'),
33
+ };
34
+ }
35
+ const pluginFileName = path.basename(resolved);
36
+ const name = pluginFileName.replace(/\.(ts|js|mjs)$/, '');
37
+ pluginDir = pluginsDir;
38
+ fs.mkdirSync(pluginDir, { recursive: true });
39
+ fs.copyFileSync(resolved, path.join(pluginDir, pluginFileName));
40
+ return {
41
+ name,
42
+ version: '0.0.0',
43
+ path: path.join(pluginDir, pluginFileName),
44
+ };
45
+ },
46
+ async uninstall(name, pluginsDir) {
47
+ const pluginPath = path.join(pluginsDir, name);
48
+ if (fs.existsSync(pluginPath)) {
49
+ fs.rmSync(pluginPath, { recursive: true });
50
+ }
51
+ for (const ext of ['.ts', '.js']) {
52
+ const f = path.join(pluginsDir, `${name}${ext}`);
53
+ if (fs.existsSync(f))
54
+ fs.unlinkSync(f);
55
+ }
56
+ },
57
+ };
58
+ //# sourceMappingURL=local-installer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-installer.js","sourceRoot":"","sources":["../../../src/plugins/installers/local-installer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { PluginInstaller } from '../types.js';
2
+ export declare const npmInstaller: PluginInstaller;
3
+ //# sourceMappingURL=npm-installer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"npm-installer.d.ts","sourceRoot":"","sources":["../../../src/plugins/installers/npm-installer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAiB,MAAM,aAAa,CAAC;AAOlE,eAAO,MAAM,YAAY,EAAE,eAkD1B,CAAC"}
@@ -0,0 +1,54 @@
1
+ import { execSync } from 'node:child_process';
2
+ import fs from 'node:fs';
3
+ import path from 'node:path';
4
+ const NPM_PREFIX = 'agent-browser-plugin-';
5
+ export const npmInstaller = {
6
+ type: 'npm',
7
+ detect(source) {
8
+ if (source.startsWith(NPM_PREFIX))
9
+ return true;
10
+ if (source.startsWith('@') && source.includes('/' + NPM_PREFIX))
11
+ return true;
12
+ return false;
13
+ },
14
+ async install(source, pluginsDir) {
15
+ const packageName = source;
16
+ const pluginDir = path.join(pluginsDir, 'node_modules', packageName);
17
+ fs.mkdirSync(pluginsDir, { recursive: true });
18
+ try {
19
+ execSync(`npm install --prefix "${pluginsDir}" "${packageName}" --no-save --no-package-lock 2>&1`, {
20
+ stdio: 'pipe',
21
+ timeout: 60000,
22
+ });
23
+ }
24
+ catch (e) {
25
+ throw new Error(`npm install failed: ${e.message}`);
26
+ }
27
+ const pkgJsonPath = path.join(pluginDir, 'package.json');
28
+ if (!fs.existsSync(pkgJsonPath)) {
29
+ throw new Error(`Package installed but no package.json found at ${pkgJsonPath}`);
30
+ }
31
+ const pkg = JSON.parse(fs.readFileSync(pkgJsonPath, 'utf-8'));
32
+ const name = packageName.replace(NPM_PREFIX, '').replace(/^@[^/]+\//, '');
33
+ return {
34
+ name,
35
+ version: pkg.version || '0.0.0',
36
+ path: path.join(pluginDir, pkg.main || 'index.js'),
37
+ };
38
+ },
39
+ async uninstall(name, pluginsDir) {
40
+ const packageName = `${NPM_PREFIX}${name}`;
41
+ try {
42
+ execSync(`npm uninstall --prefix "${pluginsDir}" "${packageName}" --no-save 2>&1`, {
43
+ stdio: 'pipe',
44
+ timeout: 30000,
45
+ });
46
+ }
47
+ catch {
48
+ const pluginDir = path.join(pluginsDir, 'node_modules', packageName);
49
+ if (fs.existsSync(pluginDir))
50
+ fs.rmSync(pluginDir, { recursive: true });
51
+ }
52
+ },
53
+ };
54
+ //# sourceMappingURL=npm-installer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"npm-installer.js","sourceRoot":"","sources":["../../../src/plugins/installers/npm-installer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,UAAU,GAAG,uBAAuB,CAAC;AAE3C,MAAM,CAAC,MAAM,YAAY,GAAoB;IAC3C,IAAI,EAAE,KAAK;IAEX,MAAM,CAAC,MAAc;QACnB,IAAI,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC;YAAE,OAAO,IAAI,CAAC;QAC/C,IAAI,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,GAAG,UAAU,CAAC;YAAE,OAAO,IAAI,CAAC;QAC7E,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,MAAc,EAAE,UAAkB;QAC9C,MAAM,WAAW,GAAG,MAAM,CAAC;QAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,EAAE,WAAW,CAAC,CAAC;QAErE,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE9C,IAAI,CAAC;YACH,QAAQ,CAAC,yBAAyB,UAAU,MAAM,WAAW,oCAAoC,EAAE;gBACjG,KAAK,EAAE,MAAM;gBACb,OAAO,EAAE,KAAK;aACf,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,CAAU,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,uBAAwB,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;QACjE,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;QACzD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,kDAAkD,WAAW,EAAE,CAAC,CAAC;QACnF,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;QAE9D,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAC1E,OAAO;YACL,IAAI;YACJ,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,OAAO;YAC/B,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,IAAI,IAAI,UAAU,CAAC;SACnD,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,IAAY,EAAE,UAAkB;QAC9C,MAAM,WAAW,GAAG,GAAG,UAAU,GAAG,IAAI,EAAE,CAAC;QAC3C,IAAI,CAAC;YACH,QAAQ,CAAC,2BAA2B,UAAU,MAAM,WAAW,kBAAkB,EAAE;gBACjF,KAAK,EAAE,MAAM;gBACb,OAAO,EAAE,KAAK;aACf,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,EAAE,WAAW,CAAC,CAAC;YACrE,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;gBAAE,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC;CACF,CAAC"}
@@ -0,0 +1,2 @@
1
+ export type { PluginInstaller, PluginSource, InstallResult, PluginSourceType } from '../types.js';
2
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/plugins/installers/types.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/plugins/installers/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ import type { PluginInstaller } from '../types.js';
2
+ export declare const urlInstaller: PluginInstaller;
3
+ //# sourceMappingURL=url-installer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url-installer.d.ts","sourceRoot":"","sources":["../../../src/plugins/installers/url-installer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAiB,MAAM,aAAa,CAAC;AAIlE,eAAO,MAAM,YAAY,EAAE,eAqC1B,CAAC"}
@@ -0,0 +1,34 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ export const urlInstaller = {
4
+ type: 'url',
5
+ detect(source) {
6
+ return source.startsWith('https://') || source.startsWith('http://');
7
+ },
8
+ async install(source, pluginsDir) {
9
+ if (source.startsWith('http://') && !source.startsWith('http://localhost')) {
10
+ throw new Error('Only HTTPS URLs are allowed for security. Use local install for local files.');
11
+ }
12
+ const url = new URL(source);
13
+ const baseName = path.basename(url.pathname);
14
+ const name = baseName.replace(/\.(ts|js|mjs)$/, '') || 'unknown';
15
+ const ext = path.extname(baseName) || '.js';
16
+ fs.mkdirSync(pluginsDir, { recursive: true });
17
+ const targetPath = path.join(pluginsDir, `${name}${ext}`);
18
+ const response = await fetch(source, { signal: AbortSignal.timeout(30000) });
19
+ if (!response.ok) {
20
+ throw new Error(`Failed to download: ${response.status} ${response.statusText}`);
21
+ }
22
+ const content = await response.text();
23
+ fs.writeFileSync(targetPath, content, 'utf-8');
24
+ return { name, version: '0.0.0', path: targetPath };
25
+ },
26
+ async uninstall(name, pluginsDir) {
27
+ for (const ext of ['.ts', '.js', '.mjs']) {
28
+ const filePath = path.join(pluginsDir, `${name}${ext}`);
29
+ if (fs.existsSync(filePath))
30
+ fs.unlinkSync(filePath);
31
+ }
32
+ },
33
+ };
34
+ //# sourceMappingURL=url-installer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url-installer.js","sourceRoot":"","sources":["../../../src/plugins/installers/url-installer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,CAAC,MAAM,YAAY,GAAoB;IAC3C,IAAI,EAAE,KAAK;IAEX,MAAM,CAAC,MAAc;QACnB,OAAO,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IACvE,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,MAAc,EAAE,UAAkB;QAC9C,IAAI,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC;YAC3E,MAAM,IAAI,KAAK,CAAC,8EAA8E,CAAC,CAAC;QAClG,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC7C,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,IAAI,SAAS,CAAC;QACjE,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC;QAE5C,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE9C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,IAAI,GAAG,GAAG,EAAE,CAAC,CAAC;QAE1D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC7E,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,uBAAuB,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QACnF,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACtC,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAE/C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,IAAY,EAAE,UAAkB;QAC9C,KAAK,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC;YACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,IAAI,GAAG,GAAG,EAAE,CAAC,CAAC;YACxD,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;gBAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;CACF,CAAC"}
@@ -0,0 +1,24 @@
1
+ import type { AgentBrowserPlugin, PluginRegistryEntry } from './types.js';
2
+ import type { BrowserManager } from '../browser/index.js';
3
+ import type { InstallResult } from './types.js';
4
+ export declare class PluginRegistry {
5
+ install(source: string): Promise<InstallResult & {
6
+ pluginsDir: string;
7
+ }>;
8
+ uninstall(name: string): Promise<void>;
9
+ update(name?: string): Promise<string[]>;
10
+ list(): Array<PluginRegistryEntry & {
11
+ pluginsDir: string;
12
+ }>;
13
+ info(name: string): Promise<(PluginRegistryEntry & {
14
+ pluginsDir: string;
15
+ plugin: AgentBrowserPlugin;
16
+ }) | null>;
17
+ search(keyword: string): Array<PluginRegistryEntry & {
18
+ pluginsDir: string;
19
+ }>;
20
+ find(name: string): Promise<AgentBrowserPlugin | null>;
21
+ execute(pluginName: string, commandName: string, browser: BrowserManager, args: string[], flags: Record<string, string | boolean>): Promise<unknown>;
22
+ }
23
+ export declare const pluginRegistry: PluginRegistry;
24
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/plugins/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAElB,mBAAmB,EAIpB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AA0EhD,qBAAa,cAAc;IACnB,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IAuBxE,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAwBtC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAqC9C,IAAI,IAAI,KAAK,CAAC,mBAAmB,GAAG;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IAwBrD,IAAI,CACR,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,CAAC,mBAAmB,GAAG;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,kBAAkB,CAAA;KAAE,CAAC,GAAG,IAAI,CAAC;IA6B7F,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,CAAC,mBAAmB,GAAG;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IAKtE,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;IA6CtD,OAAO,CACX,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,cAAc,EACvB,IAAI,EAAE,MAAM,EAAE,EACd,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GACtC,OAAO,CAAC,OAAO,CAAC;CAgBpB;AAED,eAAO,MAAM,cAAc,gBAAuB,CAAC"}
@@ -0,0 +1,253 @@
1
+ import { createPluginContext } from './context.js';
2
+ import { localInstaller } from './installers/local-installer.js';
3
+ import { npmInstaller } from './installers/npm-installer.js';
4
+ import { gitInstaller } from './installers/git-installer.js';
5
+ import { urlInstaller } from './installers/url-installer.js';
6
+ import { builtinInstaller } from './installers/builtin-installer.js';
7
+ import fs from 'node:fs';
8
+ import path from 'node:path';
9
+ import os from 'node:os';
10
+ import { createJiti } from 'jiti';
11
+ const REGISTRY_FILE = 'plugin-registry.json';
12
+ const installers = [
13
+ builtinInstaller,
14
+ localInstaller,
15
+ npmInstaller,
16
+ gitInstaller,
17
+ urlInstaller,
18
+ ];
19
+ function getPluginsDirs() {
20
+ return [
21
+ path.join(process.cwd(), '.agent-browser', 'plugins'),
22
+ path.join(os.homedir(), '.agent-browser', 'plugins'),
23
+ ];
24
+ }
25
+ function getRegistryPath(pluginsDir) {
26
+ return path.join(pluginsDir, REGISTRY_FILE);
27
+ }
28
+ function loadRegistry(pluginsDir) {
29
+ const registryPath = getRegistryPath(pluginsDir);
30
+ if (!fs.existsSync(registryPath))
31
+ return { plugins: {} };
32
+ try {
33
+ return JSON.parse(fs.readFileSync(registryPath, 'utf-8'));
34
+ }
35
+ catch {
36
+ return { plugins: {} };
37
+ }
38
+ }
39
+ function saveRegistry(pluginsDir, registry) {
40
+ fs.mkdirSync(pluginsDir, { recursive: true });
41
+ fs.writeFileSync(getRegistryPath(pluginsDir), JSON.stringify(registry, null, 2), 'utf-8');
42
+ }
43
+ const jiti = createJiti(import.meta.url, {
44
+ interopDefault: true,
45
+ });
46
+ const pluginCache = new Map();
47
+ async function loadPluginFromFile(filePath) {
48
+ const resolved = path.resolve(filePath);
49
+ const stat = fs.statSync(resolved);
50
+ const cached = pluginCache.get(resolved);
51
+ if (cached && cached.mtime === stat.mtimeMs) {
52
+ return cached.plugin;
53
+ }
54
+ const mod = await jiti(resolved);
55
+ const plugin = mod?.default ?? mod;
56
+ if (!plugin?.meta || !plugin?.handlers) {
57
+ throw new Error(`Invalid plugin: missing meta or handlers in ${resolved}`);
58
+ }
59
+ pluginCache.set(resolved, { plugin: plugin, mtime: stat.mtimeMs });
60
+ return plugin;
61
+ }
62
+ export class PluginRegistry {
63
+ async install(source) {
64
+ for (const installer of installers) {
65
+ if (installer.detect(source)) {
66
+ const pluginsDir = getPluginsDirs()[1];
67
+ const result = await installer.install(source, pluginsDir);
68
+ const sourceType = installer.type;
69
+ const registry = loadRegistry(pluginsDir);
70
+ registry.plugins[result.name] = {
71
+ name: result.name,
72
+ version: result.version,
73
+ source: { type: sourceType, ref: source },
74
+ installedAt: new Date().toISOString(),
75
+ path: result.path,
76
+ };
77
+ saveRegistry(pluginsDir, registry);
78
+ return { ...result, pluginsDir };
79
+ }
80
+ }
81
+ throw new Error(`Cannot detect plugin source type for: ${source}`);
82
+ }
83
+ async uninstall(name) {
84
+ if (builtinInstaller.listBuiltins().includes(name)) {
85
+ throw new Error(`Cannot uninstall builtin plugin "${name}"`);
86
+ }
87
+ for (const pluginsDir of getPluginsDirs()) {
88
+ const registry = loadRegistry(pluginsDir);
89
+ const entry = registry.plugins[name];
90
+ if (entry) {
91
+ const installer = installers.find((i) => i.type === entry.source.type);
92
+ if (installer)
93
+ await installer.uninstall(name, pluginsDir);
94
+ delete registry.plugins[name];
95
+ saveRegistry(pluginsDir, registry);
96
+ return;
97
+ }
98
+ if (fs.existsSync(path.join(pluginsDir, name))) {
99
+ await localInstaller.uninstall(name, pluginsDir);
100
+ return;
101
+ }
102
+ }
103
+ throw new Error(`Plugin "${name}" not found`);
104
+ }
105
+ async update(name) {
106
+ const updated = [];
107
+ for (const pluginsDir of getPluginsDirs()) {
108
+ const registry = loadRegistry(pluginsDir);
109
+ const entries = name ? { [name]: registry.plugins[name] } : registry.plugins;
110
+ for (const [pluginName, entry] of Object.entries(entries)) {
111
+ if (!entry)
112
+ continue;
113
+ try {
114
+ const installer = installers.find((i) => i.type === entry.source.type);
115
+ if (installer && installer.type !== 'builtin' && installer.type !== 'local') {
116
+ const result = await installer.install(entry.source.ref, pluginsDir);
117
+ registry.plugins[pluginName] = {
118
+ ...registry.plugins[pluginName],
119
+ version: result.version,
120
+ installedAt: new Date().toISOString(),
121
+ path: result.path,
122
+ };
123
+ updated.push(pluginName);
124
+ }
125
+ }
126
+ catch {
127
+ // skip failed updates
128
+ }
129
+ }
130
+ saveRegistry(pluginsDir, registry);
131
+ }
132
+ for (const n of updated) {
133
+ for (const key of pluginCache.keys()) {
134
+ if (key.includes(n))
135
+ pluginCache.delete(key);
136
+ }
137
+ }
138
+ return updated;
139
+ }
140
+ list() {
141
+ const all = [];
142
+ for (const name of builtinInstaller.listBuiltins()) {
143
+ all.push({
144
+ name,
145
+ version: 'builtin',
146
+ source: { type: 'builtin', ref: 'builtin' },
147
+ installedAt: '',
148
+ path: '',
149
+ pluginsDir: '',
150
+ });
151
+ }
152
+ for (const pluginsDir of getPluginsDirs()) {
153
+ const registry = loadRegistry(pluginsDir);
154
+ for (const entry of Object.values(registry.plugins)) {
155
+ all.push({ ...entry, pluginsDir });
156
+ }
157
+ }
158
+ return all;
159
+ }
160
+ async info(name) {
161
+ const builtin = await builtinInstaller.resolve(name);
162
+ if (builtin) {
163
+ return {
164
+ name,
165
+ version: 'builtin',
166
+ source: { type: 'builtin', ref: 'builtin' },
167
+ installedAt: '',
168
+ path: '',
169
+ pluginsDir: '',
170
+ plugin: builtin,
171
+ };
172
+ }
173
+ for (const pluginsDir of getPluginsDirs()) {
174
+ const registry = loadRegistry(pluginsDir);
175
+ const entry = registry.plugins[name];
176
+ if (entry) {
177
+ try {
178
+ const plugin = await loadPluginFromFile(entry.path);
179
+ return { ...entry, pluginsDir, plugin };
180
+ }
181
+ catch {
182
+ return { ...entry, pluginsDir, plugin: null };
183
+ }
184
+ }
185
+ }
186
+ return null;
187
+ }
188
+ search(keyword) {
189
+ const lower = keyword.toLowerCase();
190
+ return this.list().filter((e) => e.name.toLowerCase().includes(lower));
191
+ }
192
+ async find(name) {
193
+ const builtin = await builtinInstaller.resolve(name);
194
+ if (builtin)
195
+ return builtin;
196
+ for (const pluginsDir of getPluginsDirs()) {
197
+ const registry = loadRegistry(pluginsDir);
198
+ const entry = registry.plugins[name];
199
+ if (entry) {
200
+ try {
201
+ return await loadPluginFromFile(entry.path);
202
+ }
203
+ catch {
204
+ continue;
205
+ }
206
+ }
207
+ }
208
+ for (const pluginsDir of getPluginsDirs()) {
209
+ for (const ext of ['.ts', '.js', '.mjs']) {
210
+ const filePath = path.join(pluginsDir, `${name}${ext}`);
211
+ if (fs.existsSync(filePath)) {
212
+ try {
213
+ return await loadPluginFromFile(filePath);
214
+ }
215
+ catch {
216
+ continue;
217
+ }
218
+ }
219
+ }
220
+ const dirPath = path.join(pluginsDir, name);
221
+ if (fs.existsSync(dirPath) && fs.statSync(dirPath).isDirectory()) {
222
+ for (const entry of ['index.ts', 'index.js']) {
223
+ const indexPath = path.join(dirPath, entry);
224
+ if (fs.existsSync(indexPath)) {
225
+ try {
226
+ return await loadPluginFromFile(indexPath);
227
+ }
228
+ catch {
229
+ continue;
230
+ }
231
+ }
232
+ }
233
+ }
234
+ }
235
+ return null;
236
+ }
237
+ async execute(pluginName, commandName, browser, args, flags) {
238
+ const plugin = await this.find(pluginName);
239
+ if (!plugin)
240
+ throw new Error(`Plugin "${pluginName}" not found`);
241
+ const handler = plugin.handlers[commandName];
242
+ if (!handler) {
243
+ const available = Object.keys(plugin.handlers).join(', ');
244
+ throw new Error(`Plugin "${pluginName}" has no command "${commandName}". Available: ${available}`);
245
+ }
246
+ const ctx = createPluginContext(browser);
247
+ if (plugin.init)
248
+ await plugin.init(ctx);
249
+ return handler(ctx, args, flags);
250
+ }
251
+ }
252
+ export const pluginRegistry = new PluginRegistry();
253
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/plugins/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ import type { Page } from 'playwright-core';
2
+ import type { BrowserManager } from '../browser/index.js';
3
+ export interface PluginCommandMeta {
4
+ description: string;
5
+ usage: string;
6
+ options?: Record<string, string>;
7
+ }
8
+ export interface PluginMeta {
9
+ name: string;
10
+ version: string;
11
+ description?: string;
12
+ commands: Record<string, PluginCommandMeta>;
13
+ }
14
+ export interface PluginContext {
15
+ browser: BrowserManager;
16
+ page: Page;
17
+ goto(url: string, opts?: {
18
+ waitUntil?: string;
19
+ timeout?: number;
20
+ }): Promise<void>;
21
+ scrape(url: string, opts?: {
22
+ format?: string;
23
+ selector?: string;
24
+ }): Promise<string>;
25
+ eval(expression: string): Promise<any>;
26
+ snapshot(opts?: {
27
+ interactive?: boolean;
28
+ }): Promise<string>;
29
+ click(selector: string): Promise<void>;
30
+ fill(selector: string, value: string): Promise<void>;
31
+ type(selector: string, text: string): Promise<void>;
32
+ press(key: string): Promise<void>;
33
+ select(selector: string, values: string | string[]): Promise<void>;
34
+ wait(ms: number): Promise<void>;
35
+ waitForSelector(selector: string, opts?: {
36
+ timeout?: number;
37
+ }): Promise<void>;
38
+ title(): Promise<string>;
39
+ url(): string;
40
+ newTab(url?: string): Promise<Page>;
41
+ closeTab(page?: Page): Promise<void>;
42
+ }
43
+ export type PluginCommandHandler = (ctx: PluginContext, args: string[], flags: Record<string, string | boolean>) => Promise<any>;
44
+ export interface AgentBrowserPlugin {
45
+ meta: PluginMeta;
46
+ init?: (ctx: PluginContext) => Promise<void>;
47
+ cleanup?: () => Promise<void>;
48
+ handlers: Record<string, PluginCommandHandler>;
49
+ }
50
+ export type PluginSourceType = 'local' | 'npm' | 'git' | 'url' | 'builtin';
51
+ export interface PluginSource {
52
+ type: PluginSourceType;
53
+ ref: string;
54
+ }
55
+ export interface InstallResult {
56
+ name: string;
57
+ version: string;
58
+ path: string;
59
+ }
60
+ export interface PluginInstaller {
61
+ readonly type: PluginSourceType;
62
+ detect(source: string): boolean;
63
+ install(source: string, pluginsDir: string): Promise<InstallResult>;
64
+ uninstall(name: string, pluginsDir: string): Promise<void>;
65
+ }
66
+ export interface PluginRegistryEntry {
67
+ name: string;
68
+ version: string;
69
+ source: PluginSource;
70
+ installedAt: string;
71
+ path: string;
72
+ }
73
+ export interface PluginRegistryFile {
74
+ plugins: Record<string, PluginRegistryEntry>;
75
+ }
76
+ //# sourceMappingURL=types.d.ts.map