@opentabs-dev/shared 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.
@@ -0,0 +1,199 @@
1
+ /**
2
+ * Shared type definitions for the OpenTabs Platform.
3
+ *
4
+ * Types used across both the MCP server and Chrome extension are defined here
5
+ * to provide compile-time safety for the JSON-RPC wire protocol and shared
6
+ * domain concepts.
7
+ */
8
+ /** Tab state for a plugin */
9
+ export type TabState = 'closed' | 'unavailable' | 'ready';
10
+ /** Trust tier for a plugin */
11
+ export type TrustTier = 'official' | 'community' | 'local';
12
+ /** Manifest shape as written by `opentabs build` */
13
+ export interface PluginManifest {
14
+ name: string;
15
+ version: string;
16
+ displayName?: string;
17
+ description: string;
18
+ url_patterns: string[];
19
+ tools: ManifestTool[];
20
+ /** SHA-256 hex hash of the adapter IIFE content (set by `opentabs build`) */
21
+ adapterHash?: string;
22
+ }
23
+ /** Single tool definition within a plugin manifest */
24
+ export interface ManifestTool {
25
+ name: string;
26
+ description: string;
27
+ input_schema: Record<string, unknown>;
28
+ output_schema: Record<string, unknown>;
29
+ }
30
+ /** Minimal WebSocket handle — the subset of ServerWebSocket used by handlers */
31
+ export interface WsHandle {
32
+ send: (data: string) => void;
33
+ close: (code?: number, reason?: string) => void;
34
+ }
35
+ /** JSON-RPC 2.0 notification (no id — no response expected) */
36
+ export interface JsonRpcNotification {
37
+ jsonrpc: '2.0';
38
+ method: string;
39
+ params?: Record<string, unknown>;
40
+ }
41
+ /** JSON-RPC 2.0 request (has id — response expected) */
42
+ export interface JsonRpcRequest {
43
+ jsonrpc: '2.0';
44
+ method: string;
45
+ params?: Record<string, unknown>;
46
+ id: string | number;
47
+ }
48
+ /** JSON-RPC 2.0 success response */
49
+ export interface JsonRpcResult {
50
+ jsonrpc: '2.0';
51
+ result: unknown;
52
+ id: string | number;
53
+ }
54
+ /** JSON-RPC 2.0 error response (id is null when the request id was unparseable) */
55
+ export interface JsonRpcError {
56
+ jsonrpc: '2.0';
57
+ error: {
58
+ code: number;
59
+ message: string;
60
+ data?: Record<string, unknown>;
61
+ };
62
+ id: string | number | null;
63
+ }
64
+ /** Tool definition as sent over the wire (sync.full / plugin.update) */
65
+ export interface WireToolDef {
66
+ name: string;
67
+ description: string;
68
+ enabled: boolean;
69
+ }
70
+ /** Plugin payload as sent in sync.full and plugin.update messages */
71
+ export interface WirePluginPayload {
72
+ name: string;
73
+ version: string;
74
+ displayName?: string;
75
+ urlPatterns: string[];
76
+ trustTier: TrustTier;
77
+ sourcePath?: string;
78
+ adapterHash?: string;
79
+ tools: WireToolDef[];
80
+ }
81
+ /** sync.full notification: server → extension (all plugins on connect) */
82
+ export interface SyncFullParams {
83
+ plugins: WirePluginPayload[];
84
+ }
85
+ /** tool.dispatch request: server → extension */
86
+ export interface ToolDispatchParams {
87
+ plugin: string;
88
+ tool: string;
89
+ input: Record<string, unknown>;
90
+ }
91
+ /** tool.invocationStart notification: server → extension (side panel animation) */
92
+ export interface ToolInvocationStartParams {
93
+ plugin: string;
94
+ tool: string;
95
+ ts: number;
96
+ }
97
+ /** tool.invocationEnd notification: server → extension (side panel animation) */
98
+ export interface ToolInvocationEndParams {
99
+ plugin: string;
100
+ tool: string;
101
+ durationMs: number;
102
+ success: boolean;
103
+ }
104
+ /** plugin.update notification: server → extension (file watcher / hot reload) */
105
+ export type PluginUpdateParams = WirePluginPayload;
106
+ /** tab.stateChanged notification: extension → server */
107
+ export interface TabStateChangedParams {
108
+ plugin: string;
109
+ state: TabState;
110
+ tabId: number | null;
111
+ url: string | null;
112
+ }
113
+ /** tab.syncAll notification: extension → server */
114
+ export interface TabSyncAllParams {
115
+ tabs: Record<string, {
116
+ state: TabState;
117
+ tabId: number | null;
118
+ url: string | null;
119
+ }>;
120
+ }
121
+ /** config.getState response payload */
122
+ export interface ConfigStatePlugin {
123
+ name: string;
124
+ displayName: string;
125
+ version: string;
126
+ trustTier: TrustTier;
127
+ tabState: TabState;
128
+ urlPatterns: string[];
129
+ tools: WireToolDef[];
130
+ }
131
+ /** config.getState result */
132
+ export interface ConfigStateResult {
133
+ plugins: ConfigStatePlugin[];
134
+ outdatedPlugins: Array<{
135
+ name: string;
136
+ currentVersion: string;
137
+ latestVersion: string;
138
+ updateCommand: string;
139
+ }>;
140
+ }
141
+ /** config.setToolEnabled request params */
142
+ export interface ConfigSetToolEnabledParams {
143
+ plugin: string;
144
+ tool: string;
145
+ enabled: boolean;
146
+ }
147
+ /** config.setAllToolsEnabled request params */
148
+ export interface ConfigSetAllToolsEnabledParams {
149
+ plugin: string;
150
+ enabled: boolean;
151
+ }
152
+ /** extension.reload request: server → extension (no params needed) */
153
+ export type ExtensionReloadParams = Record<string, never>;
154
+ /** browser.openTab request params */
155
+ export interface BrowserOpenTabParams {
156
+ url: string;
157
+ }
158
+ /** browser.navigateTab request params */
159
+ export interface BrowserNavigateTabParams {
160
+ tabId: number;
161
+ url: string;
162
+ }
163
+ /** browser.closeTab request params */
164
+ export interface BrowserCloseTabParams {
165
+ tabId: number;
166
+ }
167
+ /** browser.executeScript request params */
168
+ export interface BrowserExecuteScriptParams {
169
+ tabId: number;
170
+ world?: 'MAIN' | 'ISOLATED';
171
+ returnExpression?: string;
172
+ }
173
+ /** plugin.uninstall request params */
174
+ export interface PluginUninstallParams {
175
+ name: string;
176
+ }
177
+ /** URL schemes that must be rejected by browser tools to prevent injection attacks */
178
+ export declare const BLOCKED_URL_SCHEMES: readonly string[];
179
+ /** Check if a URL uses a blocked scheme. Returns true if the URL is dangerous or unparseable. */
180
+ export declare const isBlockedUrlScheme: (url: string) => boolean;
181
+ /** Matches paths to exclude when copying the browser extension to ~/.opentabs/extension/ */
182
+ export declare const EXTENSION_COPY_EXCLUDE_PATTERN: RegExp;
183
+ /** Regex for valid plugin names: lowercase alphanumeric with hyphens */
184
+ export declare const NAME_REGEX: RegExp;
185
+ /** Plugin names that conflict with platform internals */
186
+ export declare const RESERVED_NAMES: Set<string>;
187
+ /** Validate a plugin name. Returns an error message string, or null if valid. */
188
+ export declare const validatePluginName: (name: string) => string | null;
189
+ /**
190
+ * Validates a Chrome match pattern.
191
+ * Valid formats: <scheme>://<host>/<path>
192
+ * scheme: *, http, https (Chrome removed FTP support)
193
+ * host: *, *.example.com, example.com
194
+ * path: any string starting with /
195
+ *
196
+ * Returns an error message string, or null if valid.
197
+ */
198
+ export declare const validateUrlPattern: (pattern: string) => string | null;
199
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Shared type definitions for the OpenTabs Platform.
3
+ *
4
+ * Types used across both the MCP server and Chrome extension are defined here
5
+ * to provide compile-time safety for the JSON-RPC wire protocol and shared
6
+ * domain concepts.
7
+ */
8
+ // ---------------------------------------------------------------------------
9
+ // Security constants — shared between MCP server and Chrome extension
10
+ // ---------------------------------------------------------------------------
11
+ /** URL schemes that must be rejected by browser tools to prevent injection attacks */
12
+ export const BLOCKED_URL_SCHEMES = [
13
+ 'javascript:',
14
+ 'data:',
15
+ 'file:',
16
+ 'chrome:',
17
+ 'chrome-extension:',
18
+ 'blob:',
19
+ ];
20
+ /** Check if a URL uses a blocked scheme. Returns true if the URL is dangerous or unparseable. */
21
+ export const isBlockedUrlScheme = (url) => {
22
+ try {
23
+ const parsed = new URL(url);
24
+ return BLOCKED_URL_SCHEMES.includes(parsed.protocol);
25
+ }
26
+ catch {
27
+ return true;
28
+ }
29
+ };
30
+ /** Matches paths to exclude when copying the browser extension to ~/.opentabs/extension/ */
31
+ export const EXTENSION_COPY_EXCLUDE_PATTERN = /(?:^|[\\/])(?:node_modules|src|\.git)(?:[\\/]|$)|[\\/]tsconfig[^/\\]*/;
32
+ // ---------------------------------------------------------------------------
33
+ // Plugin name validation
34
+ // ---------------------------------------------------------------------------
35
+ /** Regex for valid plugin names: lowercase alphanumeric with hyphens */
36
+ export const NAME_REGEX = /^[a-z0-9]+(-[a-z0-9]+)*$/;
37
+ /** Plugin names that conflict with platform internals */
38
+ export const RESERVED_NAMES = new Set([
39
+ 'system',
40
+ 'browser',
41
+ 'opentabs',
42
+ 'extension',
43
+ 'config',
44
+ 'plugin',
45
+ 'tool',
46
+ 'mcp',
47
+ ]);
48
+ /** Validate a plugin name. Returns an error message string, or null if valid. */
49
+ export const validatePluginName = (name) => {
50
+ if (name.length === 0)
51
+ return 'Plugin name is required';
52
+ if (!NAME_REGEX.test(name))
53
+ return `Plugin name "${name}" must be lowercase alphanumeric with hyphens (e.g., "my-plugin")`;
54
+ if (RESERVED_NAMES.has(name))
55
+ return `Plugin name "${name}" is reserved — choose a different name`;
56
+ return null;
57
+ };
58
+ // ---------------------------------------------------------------------------
59
+ // URL pattern validation
60
+ // ---------------------------------------------------------------------------
61
+ /**
62
+ * Validates a Chrome match pattern.
63
+ * Valid formats: <scheme>://<host>/<path>
64
+ * scheme: *, http, https (Chrome removed FTP support)
65
+ * host: *, *.example.com, example.com
66
+ * path: any string starting with /
67
+ *
68
+ * Returns an error message string, or null if valid.
69
+ */
70
+ export const validateUrlPattern = (pattern) => {
71
+ // Reject overly broad patterns
72
+ if (pattern === '*://*/*' || pattern === '<all_urls>') {
73
+ return `URL pattern "${pattern}" is too broad — restrict to specific domains`;
74
+ }
75
+ const match = pattern.match(/^(\*|https?):\/\/(.+?)(\/.*)$/);
76
+ if (!match) {
77
+ return `URL pattern "${pattern}" is not a valid Chrome match pattern (expected: <scheme>://<host>/<path>, scheme must be *, http, or https)`;
78
+ }
79
+ const host = match[2] ?? '';
80
+ // Host must be *, *.domain, a specific domain, or localhost (with optional port).
81
+ // Chrome match patterns natively support localhost — essential for local development
82
+ // and E2E testing where plugins target local web servers.
83
+ if (host !== '*' &&
84
+ !/^localhost(:\d+)?$/.test(host) &&
85
+ !/^(\*\.)?[a-z0-9]+([-.]?[a-z0-9]+)*\.[a-z]{2,}$/i.test(host)) {
86
+ return `URL pattern "${pattern}" has an invalid host "${host}"`;
87
+ }
88
+ return null;
89
+ };
90
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA+MH,8EAA8E;AAC9E,sEAAsE;AACtE,8EAA8E;AAE9E,sFAAsF;AACtF,MAAM,CAAC,MAAM,mBAAmB,GAAsB;IACpD,aAAa;IACb,OAAO;IACP,OAAO;IACP,SAAS;IACT,mBAAmB;IACnB,OAAO;CACR,CAAC;AAEF,iGAAiG;AACjG,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,GAAW,EAAW,EAAE;IACzD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,OAAO,mBAAmB,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACvD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC,CAAC;AAEF,4FAA4F;AAC5F,MAAM,CAAC,MAAM,8BAA8B,GAAG,uEAAuE,CAAC;AAEtH,8EAA8E;AAC9E,yBAAyB;AACzB,8EAA8E;AAE9E,wEAAwE;AACxE,MAAM,CAAC,MAAM,UAAU,GAAG,0BAA0B,CAAC;AAErD,yDAAyD;AACzD,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC;IACpC,QAAQ;IACR,SAAS;IACT,UAAU;IACV,WAAW;IACX,QAAQ;IACR,QAAQ;IACR,MAAM;IACN,KAAK;CACN,CAAC,CAAC;AAEH,iFAAiF;AACjF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,IAAY,EAAiB,EAAE;IAChE,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,yBAAyB,CAAC;IACxD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;QACxB,OAAO,gBAAgB,IAAI,mEAAmE,CAAC;IACjG,IAAI,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO,gBAAgB,IAAI,yCAAyC,CAAC;IACnG,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,8EAA8E;AAC9E,yBAAyB;AACzB,8EAA8E;AAE9E;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,OAAe,EAAiB,EAAE;IACnE,+BAA+B;IAC/B,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,YAAY,EAAE,CAAC;QACtD,OAAO,gBAAgB,OAAO,+CAA+C,CAAC;IAChF,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;IAC7D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,gBAAgB,OAAO,8GAA8G,CAAC;IAC/I,CAAC;IAED,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5B,kFAAkF;IAClF,qFAAqF;IACrF,0DAA0D;IAC1D,IACE,IAAI,KAAK,GAAG;QACZ,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC;QAChC,CAAC,iDAAiD,CAAC,IAAI,CAAC,IAAI,CAAC,EAC7D,CAAC;QACD,OAAO,gBAAgB,OAAO,0BAA0B,IAAI,GAAG,CAAC;IAClE,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC,CAAC"}
package/package.json ADDED
@@ -0,0 +1,24 @@
1
+ {
2
+ "name": "@opentabs-dev/shared",
3
+ "version": "0.0.1",
4
+ "type": "module",
5
+ "exports": {
6
+ ".": {
7
+ "types": "./dist/index.d.ts",
8
+ "import": "./dist/index.js"
9
+ }
10
+ },
11
+ "types": "./dist/index.d.ts",
12
+ "files": [
13
+ "dist"
14
+ ],
15
+ "publishConfig": {
16
+ "access": "restricted"
17
+ },
18
+ "scripts": {
19
+ "build": "tsc --build"
20
+ },
21
+ "devDependencies": {
22
+ "bun-types": "^1.3.9"
23
+ }
24
+ }