@opentabs-dev/mcp-server 0.0.67 → 0.0.68

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 (107) hide show
  1. package/dist/browser-tools/extension-get-logs.d.ts +2 -2
  2. package/dist/browser-tools/get-console-logs.d.ts +2 -2
  3. package/package.json +1 -1
  4. package/dist/browser-tool-names.d.ts +0 -14
  5. package/dist/browser-tool-names.d.ts.map +0 -1
  6. package/dist/browser-tool-names.js +0 -55
  7. package/dist/browser-tool-names.js.map +0 -1
  8. package/dist/discovery-legacy.d.ts +0 -32
  9. package/dist/discovery-legacy.d.ts.map +0 -1
  10. package/dist/discovery-legacy.js +0 -415
  11. package/dist/discovery-legacy.js.map +0 -1
  12. package/dist/manifest-schema.d.ts +0 -14
  13. package/dist/manifest-schema.d.ts.map +0 -1
  14. package/dist/manifest-schema.js +0 -51
  15. package/dist/manifest-schema.js.map +0 -1
  16. package/dist/mcp-prompts.d.ts +0 -71
  17. package/dist/mcp-prompts.d.ts.map +0 -1
  18. package/dist/mcp-prompts.js +0 -248
  19. package/dist/mcp-prompts.js.map +0 -1
  20. package/dist/mcp-resources.d.ts +0 -53
  21. package/dist/mcp-resources.d.ts.map +0 -1
  22. package/dist/mcp-resources.js +0 -139
  23. package/dist/mcp-resources.js.map +0 -1
  24. package/dist/permissions.d.ts +0 -59
  25. package/dist/permissions.d.ts.map +0 -1
  26. package/dist/permissions.js +0 -144
  27. package/dist/permissions.js.map +0 -1
  28. package/dist/prompts/audit-ai-docs.d.ts +0 -6
  29. package/dist/prompts/audit-ai-docs.d.ts.map +0 -1
  30. package/dist/prompts/audit-ai-docs.js +0 -155
  31. package/dist/prompts/audit-ai-docs.js.map +0 -1
  32. package/dist/prompts/build-plugin.d.ts +0 -3
  33. package/dist/prompts/build-plugin.d.ts.map +0 -1
  34. package/dist/prompts/build-plugin.js +0 -455
  35. package/dist/prompts/build-plugin.js.map +0 -1
  36. package/dist/prompts/contribute-learnings.d.ts +0 -12
  37. package/dist/prompts/contribute-learnings.d.ts.map +0 -1
  38. package/dist/prompts/contribute-learnings.js +0 -107
  39. package/dist/prompts/contribute-learnings.js.map +0 -1
  40. package/dist/prompts/plugin-icon.d.ts +0 -5
  41. package/dist/prompts/plugin-icon.d.ts.map +0 -1
  42. package/dist/prompts/plugin-icon.js +0 -147
  43. package/dist/prompts/plugin-icon.js.map +0 -1
  44. package/dist/prompts/setup-plugin.d.ts +0 -3
  45. package/dist/prompts/setup-plugin.d.ts.map +0 -1
  46. package/dist/prompts/setup-plugin.js +0 -197
  47. package/dist/prompts/setup-plugin.js.map +0 -1
  48. package/dist/prompts/troubleshoot.d.ts +0 -3
  49. package/dist/prompts/troubleshoot.d.ts.map +0 -1
  50. package/dist/prompts/troubleshoot.js +0 -191
  51. package/dist/prompts/troubleshoot.js.map +0 -1
  52. package/dist/resources/browser-tools.d.ts +0 -3
  53. package/dist/resources/browser-tools.d.ts.map +0 -1
  54. package/dist/resources/browser-tools.js +0 -100
  55. package/dist/resources/browser-tools.js.map +0 -1
  56. package/dist/resources/cli.d.ts +0 -3
  57. package/dist/resources/cli.d.ts.map +0 -1
  58. package/dist/resources/cli.js +0 -217
  59. package/dist/resources/cli.js.map +0 -1
  60. package/dist/resources/plugin-development.d.ts +0 -3
  61. package/dist/resources/plugin-development.d.ts.map +0 -1
  62. package/dist/resources/plugin-development.js +0 -596
  63. package/dist/resources/plugin-development.js.map +0 -1
  64. package/dist/resources/quick-start.d.ts +0 -3
  65. package/dist/resources/quick-start.d.ts.map +0 -1
  66. package/dist/resources/quick-start.js +0 -210
  67. package/dist/resources/quick-start.js.map +0 -1
  68. package/dist/resources/sdk-api.d.ts +0 -3
  69. package/dist/resources/sdk-api.d.ts.map +0 -1
  70. package/dist/resources/sdk-api.js +0 -199
  71. package/dist/resources/sdk-api.js.map +0 -1
  72. package/dist/resources/self-improvement.d.ts +0 -10
  73. package/dist/resources/self-improvement.d.ts.map +0 -1
  74. package/dist/resources/self-improvement.js +0 -91
  75. package/dist/resources/self-improvement.js.map +0 -1
  76. package/dist/resources/status.d.ts +0 -5
  77. package/dist/resources/status.d.ts.map +0 -1
  78. package/dist/resources/status.js +0 -27
  79. package/dist/resources/status.js.map +0 -1
  80. package/dist/resources/troubleshooting.d.ts +0 -3
  81. package/dist/resources/troubleshooting.d.ts.map +0 -1
  82. package/dist/resources/troubleshooting.js +0 -167
  83. package/dist/resources/troubleshooting.js.map +0 -1
  84. package/dist/sanitize-tool-output.d.ts +0 -20
  85. package/dist/sanitize-tool-output.d.ts.map +0 -1
  86. package/dist/sanitize-tool-output.js +0 -52
  87. package/dist/sanitize-tool-output.js.map +0 -1
  88. package/dist/skip-confirmation.d.ts +0 -15
  89. package/dist/skip-confirmation.d.ts.map +0 -1
  90. package/dist/skip-confirmation.js +0 -16
  91. package/dist/skip-confirmation.js.map +0 -1
  92. package/dist/skip-permissions.d.ts +0 -11
  93. package/dist/skip-permissions.d.ts.map +0 -1
  94. package/dist/skip-permissions.js +0 -12
  95. package/dist/skip-permissions.js.map +0 -1
  96. package/dist/skip-sanitization.d.ts +0 -17
  97. package/dist/skip-sanitization.d.ts.map +0 -1
  98. package/dist/skip-sanitization.js +0 -18
  99. package/dist/skip-sanitization.js.map +0 -1
  100. package/dist/skip-verification.d.ts +0 -11
  101. package/dist/skip-verification.d.ts.map +0 -1
  102. package/dist/skip-verification.js +0 -12
  103. package/dist/skip-verification.js.map +0 -1
  104. package/dist/verify-plugin.d.ts +0 -53
  105. package/dist/verify-plugin.d.ts.map +0 -1
  106. package/dist/verify-plugin.js +0 -123
  107. package/dist/verify-plugin.js.map +0 -1
@@ -7,10 +7,10 @@ import { z } from 'zod';
7
7
  declare const extensionGetLogs: import("./definition.js").BrowserToolDefinition<z.ZodObject<{
8
8
  level: z.ZodOptional<z.ZodEnum<{
9
9
  info: "info";
10
+ warn: "warn";
10
11
  error: "error";
11
- all: "all";
12
12
  log: "log";
13
- warn: "warn";
13
+ all: "all";
14
14
  }>>;
15
15
  source: z.ZodOptional<z.ZodEnum<{
16
16
  all: "all";
@@ -8,10 +8,10 @@ declare const getConsoleLogs: import("./definition.js").BrowserToolDefinition<z.
8
8
  level: z.ZodOptional<z.ZodEnum<{
9
9
  debug: "debug";
10
10
  info: "info";
11
+ warn: "warn";
11
12
  error: "error";
12
- all: "all";
13
13
  log: "log";
14
- warn: "warn";
14
+ all: "all";
15
15
  }>>;
16
16
  }, z.core.$strip>>;
17
17
  export { getConsoleLogs };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opentabs-dev/mcp-server",
3
- "version": "0.0.67",
3
+ "version": "0.0.68",
4
4
  "license": "MIT",
5
5
  "engines": {
6
6
  "node": ">= 22.0.0"
@@ -1,14 +0,0 @@
1
- /**
2
- * Static list of all browser tool names.
3
- *
4
- * Extracted into its own module so the plugin loader can check for browser
5
- * tool name references (prompt injection detection) without pulling in the
6
- * full browser-tools barrel and its heavy dependencies (Zod schemas,
7
- * handler implementations, etc.).
8
- *
9
- * browser-tools/index.ts validates at module load time that this list
10
- * matches the actual tool definitions.
11
- */
12
- declare const BROWSER_TOOL_NAMES: readonly string[];
13
- export { BROWSER_TOOL_NAMES };
14
- //# sourceMappingURL=browser-tool-names.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"browser-tool-names.d.ts","sourceRoot":"","sources":["../src/browser-tool-names.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,QAAA,MAAM,kBAAkB,EAAE,SAAS,MAAM,EAyCxC,CAAC;AAEF,OAAO,EAAE,kBAAkB,EAAE,CAAC"}
@@ -1,55 +0,0 @@
1
- /**
2
- * Static list of all browser tool names.
3
- *
4
- * Extracted into its own module so the plugin loader can check for browser
5
- * tool name references (prompt injection detection) without pulling in the
6
- * full browser-tools barrel and its heavy dependencies (Zod schemas,
7
- * handler implementations, etc.).
8
- *
9
- * browser-tools/index.ts validates at module load time that this list
10
- * matches the actual tool definitions.
11
- */
12
- const BROWSER_TOOL_NAMES = [
13
- 'extension_reload',
14
- 'browser_list_tabs',
15
- 'browser_open_tab',
16
- 'browser_close_tab',
17
- 'browser_navigate_tab',
18
- 'browser_focus_tab',
19
- 'browser_get_tab_info',
20
- 'browser_execute_script',
21
- 'browser_screenshot_tab',
22
- 'browser_get_tab_content',
23
- 'browser_get_page_html',
24
- 'browser_get_storage',
25
- 'browser_click_element',
26
- 'browser_type_text',
27
- 'browser_select_option',
28
- 'browser_wait_for_element',
29
- 'browser_query_elements',
30
- 'browser_get_cookies',
31
- 'browser_set_cookie',
32
- 'browser_delete_cookies',
33
- 'browser_enable_network_capture',
34
- 'browser_get_network_requests',
35
- 'browser_get_websocket_frames',
36
- 'browser_export_har',
37
- 'browser_disable_network_capture',
38
- 'browser_get_console_logs',
39
- 'browser_clear_console_logs',
40
- 'browser_list_resources',
41
- 'browser_get_resource_content',
42
- 'browser_press_key',
43
- 'browser_scroll',
44
- 'browser_hover_element',
45
- 'browser_handle_dialog',
46
- 'extension_get_state',
47
- 'extension_get_logs',
48
- 'extension_get_side_panel',
49
- 'extension_check_adapter',
50
- 'extension_force_reconnect',
51
- 'plugin_analyze_site',
52
- 'plugin_list_tabs',
53
- ];
54
- export { BROWSER_TOOL_NAMES };
55
- //# sourceMappingURL=browser-tool-names.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"browser-tool-names.js","sourceRoot":"","sources":["../src/browser-tool-names.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,kBAAkB,GAAsB;IAC5C,kBAAkB;IAClB,mBAAmB;IACnB,kBAAkB;IAClB,mBAAmB;IACnB,sBAAsB;IACtB,mBAAmB;IACnB,sBAAsB;IACtB,wBAAwB;IACxB,wBAAwB;IACxB,yBAAyB;IACzB,uBAAuB;IACvB,qBAAqB;IACrB,uBAAuB;IACvB,mBAAmB;IACnB,uBAAuB;IACvB,0BAA0B;IAC1B,wBAAwB;IACxB,qBAAqB;IACrB,oBAAoB;IACpB,wBAAwB;IACxB,gCAAgC;IAChC,8BAA8B;IAC9B,8BAA8B;IAC9B,oBAAoB;IACpB,iCAAiC;IACjC,0BAA0B;IAC1B,4BAA4B;IAC5B,wBAAwB;IACxB,8BAA8B;IAC9B,mBAAmB;IACnB,gBAAgB;IAChB,uBAAuB;IACvB,uBAAuB;IACvB,qBAAqB;IACrB,oBAAoB;IACpB,0BAA0B;IAC1B,yBAAyB;IACzB,2BAA2B;IAC3B,qBAAqB;IACrB,kBAAkB;CACnB,CAAC;AAEF,OAAO,EAAE,kBAAkB,EAAE,CAAC"}
@@ -1,32 +0,0 @@
1
- /**
2
- * Legacy plugin discovery (opentabs-plugin.json based).
3
- *
4
- * Provides the old discoverPlugins and loadPluginFromDir functions that read
5
- * opentabs-plugin.json manifests. Used by reload.ts and file-watcher.ts until
6
- * they are migrated to the new package.json-based pipeline in later stories.
7
- *
8
- * This file will be deleted once US-009 (reload.ts), US-012 (file-watcher.ts),
9
- * and US-020 (cleanup) are complete.
10
- */
11
- import type { FailedPlugin, RegisteredPlugin } from './state.js';
12
- import type { TrustTier } from '@opentabs-dev/shared';
13
- /**
14
- * Load a single plugin from a directory.
15
- * Reads opentabs-plugin.json and dist/adapter.iife.js.
16
- */
17
- declare const loadPluginFromDir: (dir: string, trustTier: TrustTier, npmPkgName: string | null, sourcePath?: string) => Promise<RegisteredPlugin>;
18
- /** Result of full plugin discovery: successfully loaded plugins and failed paths */
19
- interface DiscoveryOutcome {
20
- plugins: Map<string, RegisteredPlugin>;
21
- failures: FailedPlugin[];
22
- }
23
- /**
24
- * Legacy plugin discovery using opentabs-plugin.json manifests.
25
- * Discovers from both node_modules and local filesystem paths.
26
- *
27
- * This function will be replaced by the new discoverPlugins in discovery.ts
28
- * once reload.ts (US-009) and file-watcher.ts (US-012) are migrated.
29
- */
30
- declare const discoverPluginsLegacy: (localPaths: string[], allowedNpmPackages: string[], rootDir?: string) => Promise<DiscoveryOutcome>;
31
- export { discoverPluginsLegacy, loadPluginFromDir };
32
- //# sourceMappingURL=discovery-legacy.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"discovery-legacy.d.ts","sourceRoot":"","sources":["../src/discovery-legacy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAUH,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACjE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAqEtD;;;GAGG;AACH,QAAA,MAAM,iBAAiB,GACrB,KAAK,MAAM,EACX,WAAW,SAAS,EACpB,YAAY,MAAM,GAAG,IAAI,EACzB,aAAa,MAAM,KAClB,OAAO,CAAC,gBAAgB,CA+E1B,CAAC;AA4PF,oFAAoF;AACpF,UAAU,gBAAgB;IACxB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IACvC,QAAQ,EAAE,YAAY,EAAE,CAAC;CAC1B;AAED;;;;;;GAMG;AACH,QAAA,MAAM,qBAAqB,GACzB,YAAY,MAAM,EAAE,EACpB,oBAAoB,MAAM,EAAE,EAC5B,UAAU,MAAM,KACf,OAAO,CAAC,gBAAgB,CAoC1B,CAAC;AAEF,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,CAAC"}
@@ -1,415 +0,0 @@
1
- /**
2
- * Legacy plugin discovery (opentabs-plugin.json based).
3
- *
4
- * Provides the old discoverPlugins and loadPluginFromDir functions that read
5
- * opentabs-plugin.json manifests. Used by reload.ts and file-watcher.ts until
6
- * they are migrated to the new package.json-based pipeline in later stories.
7
- *
8
- * This file will be deleted once US-009 (reload.ts), US-012 (file-watcher.ts),
9
- * and US-020 (cleanup) are complete.
10
- */
11
- import { browserTools } from './browser-tools/index.js';
12
- import { log } from './logger.js';
13
- import { parseManifest } from './manifest-schema.js';
14
- import { isAllowedPluginPath } from './resolver.js';
15
- import { validatePluginName, validateUrlPattern } from '@opentabs-dev/shared';
16
- import { readdir, stat } from 'node:fs/promises';
17
- import { join, resolve, dirname } from 'node:path';
18
- import { fileURLToPath } from 'node:url';
19
- /**
20
- * The mcp-server package root directory, resolved from this module's URL.
21
- * Used as the default rootDir for npm plugin discovery so that `node_modules`
22
- * scanning works regardless of the process's working directory.
23
- */
24
- const PACKAGE_DIR = resolve(dirname(fileURLToPath(import.meta.url)), '..');
25
- /**
26
- * Extract the plugin name from an npm package name.
27
- * opentabs-plugin-slack → slack
28
- * @myorg/opentabs-plugin-jira → myorg-jira
29
- */
30
- const pluginNameFromPackage = (pkgName) => {
31
- if (pkgName.startsWith('@')) {
32
- // Scoped: @scope/opentabs-plugin-name → scope-name
33
- const parts = pkgName.split('/');
34
- const scopePart = parts[0] ?? '';
35
- const namePart = parts[1] ?? '';
36
- const scope = scopePart.slice(1); // remove @
37
- const pluginSuffix = namePart.replace(/^opentabs-plugin-/, '');
38
- return `${scope}-${pluginSuffix}`;
39
- }
40
- return pkgName.replace(/^opentabs-plugin-/, '');
41
- };
42
- /**
43
- * Determine trust tier from how the plugin was discovered.
44
- */
45
- const determineTrustTierLegacy = (pkgName, isLocal) => {
46
- if (isLocal)
47
- return 'local';
48
- if (pkgName && pkgName.startsWith('@opentabs-dev/'))
49
- return 'official';
50
- return 'community';
51
- };
52
- /**
53
- * Browser tool names that should not appear in plugin tool descriptions.
54
- * Presence of these names may indicate a prompt injection attempt where
55
- * a plugin tries to instruct the AI agent to invoke browser-level tools.
56
- * Derived from the browserTools array so the list stays in sync automatically.
57
- */
58
- const BROWSER_TOOL_NAMES = browserTools.map(t => t.name);
59
- /**
60
- * Check plugin tool descriptions for references to browser tool names.
61
- * Returns an array of { toolName, browserToolName } for each match found.
62
- */
63
- const checkBrowserToolReferences = (tools) => {
64
- const matches = [];
65
- for (const tool of tools) {
66
- const descLower = tool.description.toLowerCase();
67
- for (const btName of BROWSER_TOOL_NAMES) {
68
- if (descLower.includes(btName)) {
69
- matches.push({ toolName: tool.name, browserToolName: btName });
70
- }
71
- }
72
- }
73
- return matches;
74
- };
75
- /**
76
- * Load a single plugin from a directory.
77
- * Reads opentabs-plugin.json and dist/adapter.iife.js.
78
- */
79
- const loadPluginFromDir = async (dir, trustTier, npmPkgName, sourcePath) => {
80
- const manifestPath = join(dir, 'opentabs-plugin.json');
81
- const iifePath = join(dir, 'dist', 'adapter.iife.js');
82
- // Read and validate manifest
83
- const manifestRaw = await Bun.file(manifestPath).text();
84
- const manifest = parseManifest(manifestRaw, manifestPath);
85
- // Derive the internal plugin name.
86
- // Handles both bare names ("slack") and legacy prefixed names ("opentabs-plugin-slack").
87
- let pluginName;
88
- if (npmPkgName) {
89
- pluginName = pluginNameFromPackage(npmPkgName);
90
- const manifestBare = manifest.name.replace(/^opentabs-plugin-/, '');
91
- if (manifestBare !== pluginName) {
92
- log.warn(`Plugin manifest name "${manifest.name}" doesn't match package name "${npmPkgName}" (expected plugin name: ${pluginName}, got: ${manifestBare})`);
93
- }
94
- }
95
- else {
96
- // Local plugin — strip legacy prefix if present
97
- pluginName = manifest.name.replace(/^opentabs-plugin-/, '');
98
- }
99
- // Validate plugin name
100
- const nameError = validatePluginName(pluginName);
101
- if (nameError) {
102
- throw new Error(nameError);
103
- }
104
- // Validate URL patterns
105
- for (const pattern of manifest.url_patterns) {
106
- const patternError = validateUrlPattern(pattern);
107
- if (patternError)
108
- throw new Error(patternError);
109
- }
110
- // Warn if any tool description references browser tool names (possible prompt injection)
111
- for (const match of checkBrowserToolReferences(manifest.tools)) {
112
- log.warn(`Plugin "${pluginName}" tool "${match.toolName}" description references browser tool "${match.browserToolName}" — possible prompt injection attempt`);
113
- }
114
- // Read IIFE — reject missing, empty, or oversized files
115
- const MAX_IIFE_SIZE = 5 * 1024 * 1024;
116
- const iifeFile = Bun.file(iifePath);
117
- if (!(await iifeFile.exists())) {
118
- throw new Error(`Adapter IIFE not found at ${iifePath}`);
119
- }
120
- const iifeSize = iifeFile.size;
121
- if (iifeSize > MAX_IIFE_SIZE) {
122
- throw new Error(`Adapter IIFE for "${pluginName}" is ${(iifeSize / 1024 / 1024).toFixed(1)}MB, exceeding the 5MB limit`);
123
- }
124
- const iife = await iifeFile.text();
125
- if (iife.length === 0) {
126
- throw new Error(`Adapter IIFE at ${iifePath} is empty — rebuild the plugin`);
127
- }
128
- return {
129
- name: pluginName,
130
- version: manifest.version,
131
- displayName: manifest.displayName,
132
- urlPatterns: manifest.url_patterns,
133
- trustTier,
134
- iife,
135
- tools: manifest.tools.map(t => ({
136
- name: t.name,
137
- displayName: t.displayName,
138
- description: t.description,
139
- icon: t.icon,
140
- input_schema: t.input_schema,
141
- output_schema: t.output_schema,
142
- })),
143
- adapterHash: manifest.adapterHash,
144
- sourcePath,
145
- npmPackageName: npmPkgName ?? undefined,
146
- };
147
- };
148
- /**
149
- * Check if a directory exists and is accessible.
150
- */
151
- const dirExists = async (path) => {
152
- try {
153
- const s = await stat(path);
154
- return s.isDirectory();
155
- }
156
- catch {
157
- return false;
158
- }
159
- };
160
- /**
161
- * Check if a file exists and is accessible.
162
- */
163
- const fileExists = async (path) => Bun.file(path).exists();
164
- /**
165
- * Scan node_modules for opentabs plugins.
166
- * Looks for:
167
- * 1. node_modules/opentabs-plugin-* directories
168
- * 2. node_modules/@* /opentabs-plugin-* directories (scoped packages)
169
- * 3. Any package with 'opentabs-plugin' keyword in package.json
170
- *
171
- * Only packages listed in allowedPackages are loaded. Discovered packages
172
- * not in the allow list are logged as skipped with instructions to add them.
173
- */
174
- const discoverFromNodeModules = async (rootDir, allowedPackages) => {
175
- const allowedSet = new Set(allowedPackages);
176
- const results = [];
177
- const nodeModulesDir = join(rootDir, 'node_modules');
178
- if (!(await dirExists(nodeModulesDir))) {
179
- return results;
180
- }
181
- let entries;
182
- try {
183
- entries = await readdir(nodeModulesDir);
184
- }
185
- catch {
186
- return results;
187
- }
188
- // Track already-discovered package dirs to avoid duplicate keyword scan
189
- const discoveredDirs = new Set();
190
- // 1. Direct matches: opentabs-plugin-*
191
- for (const entry of entries) {
192
- if (!entry.startsWith('opentabs-plugin-'))
193
- continue;
194
- const pkgDir = join(nodeModulesDir, entry);
195
- if (!(await dirExists(pkgDir)))
196
- continue;
197
- if (!(await fileExists(join(pkgDir, 'opentabs-plugin.json'))))
198
- continue;
199
- if (!allowedSet.has(entry)) {
200
- log.info(`Skipping npm plugin "${entry}" — not listed in config.npmPlugins. Add it to ~/.opentabs/config.json to enable.`);
201
- discoveredDirs.add(pkgDir);
202
- continue;
203
- }
204
- const trustTier = determineTrustTierLegacy(entry, false);
205
- try {
206
- const plugin = await loadPluginFromDir(pkgDir, trustTier, entry);
207
- results.push({ plugin, source: `node_modules/${entry}` });
208
- discoveredDirs.add(pkgDir);
209
- }
210
- catch (err) {
211
- log.error(`Failed to load plugin from node_modules/${entry}:`, err);
212
- }
213
- }
214
- // 2. Scoped packages: @scope/opentabs-plugin-*
215
- for (const entry of entries) {
216
- if (!entry.startsWith('@'))
217
- continue;
218
- const scopeDir = join(nodeModulesDir, entry);
219
- if (!(await dirExists(scopeDir)))
220
- continue;
221
- let scopeEntries;
222
- try {
223
- scopeEntries = await readdir(scopeDir);
224
- }
225
- catch {
226
- continue;
227
- }
228
- for (const scopeEntry of scopeEntries) {
229
- if (!scopeEntry.startsWith('opentabs-plugin-'))
230
- continue;
231
- const pkgDir = join(scopeDir, scopeEntry);
232
- if (!(await dirExists(pkgDir)))
233
- continue;
234
- if (!(await fileExists(join(pkgDir, 'opentabs-plugin.json'))))
235
- continue;
236
- const fullPkgName = `${entry}/${scopeEntry}`;
237
- if (!allowedSet.has(fullPkgName)) {
238
- log.info(`Skipping npm plugin "${fullPkgName}" — not listed in config.npmPlugins. Add it to ~/.opentabs/config.json to enable.`);
239
- discoveredDirs.add(pkgDir);
240
- continue;
241
- }
242
- const trustTier = determineTrustTierLegacy(fullPkgName, false);
243
- try {
244
- const plugin = await loadPluginFromDir(pkgDir, trustTier, fullPkgName);
245
- results.push({
246
- plugin,
247
- source: `node_modules/${fullPkgName}`,
248
- });
249
- discoveredDirs.add(pkgDir);
250
- }
251
- catch (err) {
252
- log.error(`Failed to load plugin from node_modules/${fullPkgName}:`, err);
253
- }
254
- }
255
- }
256
- // 3. Keyword fallback: scan remaining packages for 'opentabs-plugin' keyword.
257
- // Check for opentabs-plugin.json first (cheap stat) before reading package.json (expensive parse).
258
- for (const entry of entries) {
259
- if (entry.startsWith('.') || entry.startsWith('@'))
260
- continue;
261
- if (entry.startsWith('opentabs-plugin-'))
262
- continue; // Already checked
263
- const pkgDir = join(nodeModulesDir, entry);
264
- if (discoveredDirs.has(pkgDir))
265
- continue;
266
- if (!(await dirExists(pkgDir)))
267
- continue;
268
- if (!(await fileExists(join(pkgDir, 'opentabs-plugin.json'))))
269
- continue;
270
- const pkgJsonPath = join(pkgDir, 'package.json');
271
- if (!(await fileExists(pkgJsonPath)))
272
- continue;
273
- try {
274
- const pkgJson = JSON.parse(await Bun.file(pkgJsonPath).text());
275
- const keywords = pkgJson.keywords;
276
- if (!Array.isArray(keywords) || !keywords.includes('opentabs-plugin'))
277
- continue;
278
- if (!allowedSet.has(entry)) {
279
- log.info(`Skipping npm plugin "${entry}" — not listed in config.npmPlugins. Add it to ~/.opentabs/config.json to enable.`);
280
- discoveredDirs.add(pkgDir);
281
- continue;
282
- }
283
- const trustTier = determineTrustTierLegacy(entry, false);
284
- const plugin = await loadPluginFromDir(pkgDir, trustTier, entry);
285
- results.push({ plugin, source: `node_modules/${entry} (keyword)` });
286
- discoveredDirs.add(pkgDir);
287
- }
288
- catch (err) {
289
- log.error(`Failed to load plugin from node_modules/${entry} (keyword):`, err);
290
- }
291
- }
292
- // Keyword scan for scoped packages too
293
- for (const entry of entries) {
294
- if (!entry.startsWith('@'))
295
- continue;
296
- const scopeDir = join(nodeModulesDir, entry);
297
- if (!(await dirExists(scopeDir)))
298
- continue;
299
- let scopeEntries;
300
- try {
301
- scopeEntries = await readdir(scopeDir);
302
- }
303
- catch {
304
- continue;
305
- }
306
- for (const scopeEntry of scopeEntries) {
307
- if (scopeEntry.startsWith('opentabs-plugin-'))
308
- continue; // Already checked
309
- const pkgDir = join(scopeDir, scopeEntry);
310
- if (discoveredDirs.has(pkgDir))
311
- continue;
312
- if (!(await dirExists(pkgDir)))
313
- continue;
314
- if (!(await fileExists(join(pkgDir, 'opentabs-plugin.json'))))
315
- continue;
316
- const pkgJsonPath = join(pkgDir, 'package.json');
317
- if (!(await fileExists(pkgJsonPath)))
318
- continue;
319
- try {
320
- const pkgJson = JSON.parse(await Bun.file(pkgJsonPath).text());
321
- const keywords = pkgJson.keywords;
322
- if (!Array.isArray(keywords) || !keywords.includes('opentabs-plugin'))
323
- continue;
324
- const fullPkgName = `${entry}/${scopeEntry}`;
325
- if (!allowedSet.has(fullPkgName)) {
326
- log.info(`Skipping npm plugin "${fullPkgName}" — not listed in config.npmPlugins. Add it to ~/.opentabs/config.json to enable.`);
327
- discoveredDirs.add(pkgDir);
328
- continue;
329
- }
330
- const trustTier = determineTrustTierLegacy(fullPkgName, false);
331
- const plugin = await loadPluginFromDir(pkgDir, trustTier, fullPkgName);
332
- results.push({
333
- plugin,
334
- source: `node_modules/${fullPkgName} (keyword)`,
335
- });
336
- discoveredDirs.add(pkgDir);
337
- }
338
- catch (err) {
339
- log.error(`Failed to load plugin from node_modules/${entry}/${scopeEntry} (keyword):`, err);
340
- }
341
- }
342
- }
343
- return results;
344
- };
345
- const discoverFromLocalPaths = async (paths) => {
346
- const results = [];
347
- const failures = [];
348
- for (const pluginPath of paths) {
349
- const resolvedPath = resolve(pluginPath);
350
- if (!(await isAllowedPluginPath(resolvedPath))) {
351
- const msg = `Rejected plugin path outside allowed directories: ${resolvedPath}`;
352
- log.warn(msg);
353
- failures.push({ path: resolvedPath, error: 'Path is outside allowed directories' });
354
- continue;
355
- }
356
- if (!(await dirExists(resolvedPath))) {
357
- const msg = `Local plugin path does not exist: ${resolvedPath}`;
358
- log.warn(msg);
359
- failures.push({ path: resolvedPath, error: 'Directory does not exist' });
360
- continue;
361
- }
362
- if (!(await fileExists(join(resolvedPath, 'opentabs-plugin.json')))) {
363
- const msg = `No opentabs-plugin.json found at: ${resolvedPath}`;
364
- log.warn(msg);
365
- failures.push({ path: resolvedPath, error: 'No opentabs-plugin.json found' });
366
- continue;
367
- }
368
- try {
369
- const plugin = await loadPluginFromDir(resolvedPath, 'local', null, resolvedPath);
370
- results.push({ plugin, source: resolvedPath });
371
- }
372
- catch (err) {
373
- const errorMsg = err instanceof Error ? err.message : String(err);
374
- log.error(`Failed to load local plugin from ${resolvedPath}:`, err);
375
- failures.push({ path: resolvedPath, error: errorMsg });
376
- }
377
- }
378
- return { results, failures };
379
- };
380
- /**
381
- * Legacy plugin discovery using opentabs-plugin.json manifests.
382
- * Discovers from both node_modules and local filesystem paths.
383
- *
384
- * This function will be replaced by the new discoverPlugins in discovery.ts
385
- * once reload.ts (US-009) and file-watcher.ts (US-012) are migrated.
386
- */
387
- const discoverPluginsLegacy = async (localPaths, allowedNpmPackages, rootDir) => {
388
- const resolvedRoot = rootDir ?? PACKAGE_DIR;
389
- log.info('Starting plugin discovery...');
390
- // Discover from both sources in parallel
391
- const [npmResults, localDiscovery] = await Promise.all([
392
- discoverFromNodeModules(resolvedRoot, allowedNpmPackages),
393
- discoverFromLocalPaths(localPaths),
394
- ]);
395
- // Local results first so local plugins take precedence over npm in dedup
396
- const allResults = [...localDiscovery.results, ...npmResults];
397
- const failures = [...localDiscovery.failures];
398
- // Build new plugin Map, checking for duplicates
399
- const plugins = new Map();
400
- let loaded = 0;
401
- for (const { plugin, source } of allResults) {
402
- if (plugins.has(plugin.name)) {
403
- log.warn(`Duplicate plugin "${plugin.name}" from ${source} — skipping (already loaded)`);
404
- continue;
405
- }
406
- plugins.set(plugin.name, plugin);
407
- loaded++;
408
- const toolNames = plugin.tools.map(t => t.name).join(', ');
409
- log.info(`Discovered plugin: ${plugin.name} v${plugin.version} (${plugin.trustTier}) from ${source} — tools: [${toolNames}]`);
410
- }
411
- log.info(`Plugin discovery complete: ${loaded} plugin(s) loaded`);
412
- return { plugins, failures };
413
- };
414
- export { discoverPluginsLegacy, loadPluginFromDir };
415
- //# sourceMappingURL=discovery-legacy.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"discovery-legacy.js","sourceRoot":"","sources":["../src/discovery-legacy.ts"],"names":[],"mappings":"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"}
@@ -1,14 +0,0 @@
1
- /**
2
- * Zod schema for runtime validation of opentabs-plugin.json manifests.
3
- *
4
- * Validates the shape and types of plugin manifests read from disk,
5
- * producing clear error messages for malformed files instead of cryptic
6
- * downstream crashes from unchecked casts.
7
- */
8
- import type { PluginManifest } from '@opentabs-dev/shared';
9
- /**
10
- * Parse and validate a plugin manifest JSON string.
11
- * Throws a descriptive error on invalid input.
12
- */
13
- export declare const parseManifest: (raw: string, sourcePath: string) => PluginManifest;
14
- //# sourceMappingURL=manifest-schema.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"manifest-schema.d.ts","sourceRoot":"","sources":["../src/manifest-schema.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AA+B3D;;;GAGG;AACH,eAAO,MAAM,aAAa,GAAI,KAAK,MAAM,EAAE,YAAY,MAAM,KAAG,cAe/D,CAAC"}
@@ -1,51 +0,0 @@
1
- /**
2
- * Zod schema for runtime validation of opentabs-plugin.json manifests.
3
- *
4
- * Validates the shape and types of plugin manifests read from disk,
5
- * producing clear error messages for malformed files instead of cryptic
6
- * downstream crashes from unchecked casts.
7
- */
8
- import { z } from 'zod';
9
- const manifestToolSchema = z.object({
10
- name: z.string().min(1, 'Tool name is required'),
11
- displayName: z.string().min(1, 'Tool displayName is required'),
12
- description: z
13
- .string()
14
- .min(1, 'Tool description is required')
15
- .max(1000, 'Tool description must be at most 1000 characters'),
16
- icon: z.string().min(1, 'Tool icon is required'),
17
- input_schema: z.record(z.string(), z.unknown()),
18
- output_schema: z.record(z.string(), z.unknown()),
19
- });
20
- const pluginManifestSchema = z.looseObject({
21
- name: z.string().min(1, 'Plugin name is required'),
22
- version: z.string().min(1, 'Plugin version is required'),
23
- displayName: z.string().min(1, 'Plugin displayName is required'),
24
- description: z
25
- .string()
26
- .min(1, 'Plugin description is required')
27
- .max(500, 'Plugin description must be at most 500 characters'),
28
- url_patterns: z.array(z.string()).min(1, 'At least one URL pattern is required'),
29
- tools: z.array(manifestToolSchema).min(1, 'At least one tool is required'),
30
- adapterHash: z.string().optional(),
31
- });
32
- /**
33
- * Parse and validate a plugin manifest JSON string.
34
- * Throws a descriptive error on invalid input.
35
- */
36
- export const parseManifest = (raw, sourcePath) => {
37
- let parsed;
38
- try {
39
- parsed = JSON.parse(raw);
40
- }
41
- catch {
42
- throw new Error(`Invalid JSON in manifest at ${sourcePath}`);
43
- }
44
- const result = pluginManifestSchema.safeParse(parsed);
45
- if (!result.success) {
46
- const issues = result.error.issues.map(issue => ` - ${issue.path.join('.')}: ${issue.message}`).join('\n');
47
- throw new Error(`Invalid plugin manifest at ${sourcePath}:\n${issues}`);
48
- }
49
- return result.data;
50
- };
51
- //# sourceMappingURL=manifest-schema.js.map