@crewx/chromex 0.1.0-rc.8

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/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export declare function main(inputArgs?: string[]): Promise<void>;
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../cli.ts"],"names":[],"mappings":";AA4FA,wBAAsB,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAuE9D"}
package/dist/cli.js ADDED
@@ -0,0 +1,198 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ exports.main = main;
38
+ const fs = __importStar(require("fs"));
39
+ const path = __importStar(require("path"));
40
+ const engine_js_1 = require("./src/engine.js");
41
+ let PKG_VERSION = 'unknown';
42
+ try {
43
+ const _pkgPath = fs.existsSync(path.join(__dirname, 'package.json'))
44
+ ? path.join(__dirname, 'package.json')
45
+ : path.join(__dirname, '..', 'package.json');
46
+ const _pkg = JSON.parse(fs.readFileSync(_pkgPath, 'utf-8'));
47
+ if (_pkg?.version)
48
+ PKG_VERSION = String(_pkg.version);
49
+ }
50
+ catch { }
51
+ function printUsage() {
52
+ console.log(`
53
+ @crewx/chromex@${PKG_VERSION} - Chrome X 브라우저 도구 CLI
54
+
55
+ Usage:
56
+ chromex <command> [options]
57
+
58
+ Commands:
59
+ chromex connect Chrome X 브라우저 접근 승인 요청
60
+ chromex status 현재 세션 상태
61
+ chromex disconnect 세션 종료
62
+ chromex read 탭 텍스트 읽기 (page_read_text)
63
+ chromex screenshot 탭 스크린샷 캡처
64
+ chromex tabs 연결된 탭 목록
65
+
66
+ Options:
67
+ connect:
68
+ --scope=all|current 범위 (기본: all)
69
+ --expires=30d|90d|1y 토큰 만료기간 (기본: 90d)
70
+ --name=<name> 토큰 이름
71
+ --endpoint=<url> 서버 URL (기본: http://localhost:8150)
72
+ --agent=<id> 에이전트 ID (기본: CREWX_AGENT_ID 환경변수)
73
+
74
+ read:
75
+ --tab=<tabId> 대상 탭 ID
76
+ --step=1|2|3 추출 단계 (기본: 1)
77
+ --selector=<css> CSS 셀렉터
78
+
79
+ screenshot:
80
+ --tab=<tabId> 대상 탭 ID
81
+ --output=<path> 저장 경로
82
+
83
+ Environment variables:
84
+ CREWX_AGENT_ID 에이전트 ID
85
+ CREWX_ENDPOINT 서버 기본 URL
86
+ CREWX_API_TOKEN 서버 인증 토큰 (원격 서버 접근 시)
87
+ `);
88
+ }
89
+ const BOOLEAN_FLAGS = new Set(['help', 'version']);
90
+ function parseArgs(args) {
91
+ const result = { positional: [], options: {} };
92
+ for (let i = 0; i < args.length; i++) {
93
+ const arg = args[i];
94
+ if (arg === '-h') {
95
+ result.options['help'] = true;
96
+ }
97
+ else if (arg.startsWith('--')) {
98
+ const eqIdx = arg.indexOf('=');
99
+ if (eqIdx !== -1) {
100
+ result.options[arg.slice(2, eqIdx)] = arg.slice(eqIdx + 1);
101
+ }
102
+ else {
103
+ const key = arg.slice(2);
104
+ if (!BOOLEAN_FLAGS.has(key)) {
105
+ const next = args[i + 1];
106
+ if (next !== undefined && !next.startsWith('--') && next !== '-h') {
107
+ result.options[key] = next;
108
+ i++;
109
+ }
110
+ else {
111
+ result.options[key] = true;
112
+ }
113
+ }
114
+ else {
115
+ result.options[key] = true;
116
+ }
117
+ }
118
+ }
119
+ else {
120
+ result.positional.push(arg);
121
+ }
122
+ }
123
+ return result;
124
+ }
125
+ async function main(inputArgs) {
126
+ const args = inputArgs ?? process.argv.slice(2);
127
+ const { positional, options } = parseArgs(args);
128
+ const [command] = positional;
129
+ if (options['version']) {
130
+ console.log(PKG_VERSION);
131
+ return;
132
+ }
133
+ if (!command || command === 'help' || options['help']) {
134
+ printUsage();
135
+ return;
136
+ }
137
+ const engine = new engine_js_1.ChromexEngine();
138
+ switch (command) {
139
+ case 'connect': {
140
+ const scope = typeof options['scope'] === 'string' ? options['scope'] : undefined;
141
+ const expiresRaw = options['expires'];
142
+ const validExpires = ['30d', '90d', '1y'];
143
+ const expires = typeof expiresRaw === 'string' && validExpires.includes(expiresRaw)
144
+ ? expiresRaw
145
+ : undefined;
146
+ const name = typeof options['name'] === 'string' ? options['name'] : undefined;
147
+ const endpoint = typeof options['endpoint'] === 'string' ? options['endpoint'] : undefined;
148
+ const agent = typeof options['agent'] === 'string' ? options['agent'] : undefined;
149
+ await engine.connect({ scope, expires, name, endpoint, agent });
150
+ break;
151
+ }
152
+ case 'status':
153
+ await engine.status();
154
+ break;
155
+ case 'disconnect':
156
+ await engine.disconnect();
157
+ break;
158
+ case 'read': {
159
+ const tabId = options['tab'];
160
+ const step = options['step'];
161
+ const selector = options['selector'];
162
+ const callArgs = {};
163
+ if (tabId !== undefined)
164
+ callArgs['tabId'] = Number(tabId);
165
+ if (step !== undefined)
166
+ callArgs['step'] = Number(step);
167
+ if (typeof selector === 'string')
168
+ callArgs['selector'] = selector;
169
+ await engine.call('page_read_text', callArgs);
170
+ break;
171
+ }
172
+ case 'screenshot': {
173
+ const tabId = options['tab'];
174
+ const output = options['output'];
175
+ const callArgs = {};
176
+ if (tabId !== undefined)
177
+ callArgs['tabId'] = Number(tabId);
178
+ if (typeof output === 'string')
179
+ callArgs['output'] = output;
180
+ await engine.call('page_screenshot', callArgs);
181
+ break;
182
+ }
183
+ case 'tabs':
184
+ await engine.call('listTabs', {});
185
+ break;
186
+ default:
187
+ console.error(`Unknown command: ${command}`);
188
+ console.error('Run "chromex --help" for usage.');
189
+ process.exit(1);
190
+ }
191
+ }
192
+ if (require.main === module) {
193
+ main().catch((e) => {
194
+ console.error(e.message);
195
+ process.exit(1);
196
+ });
197
+ }
198
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { ConnectOptions } from './types.js';
2
+ export declare class ChromexEngine {
3
+ private readonly tokenPath;
4
+ constructor(tokenPath?: string);
5
+ private get agentId();
6
+ private get defaultEndpoint();
7
+ connect(opts: ConnectOptions): Promise<void>;
8
+ call(tool: string, args: Record<string, unknown>): Promise<void>;
9
+ status(): Promise<void>;
10
+ disconnect(): Promise<void>;
11
+ private loadToken;
12
+ private toMcpToolCall;
13
+ private loadTokenCache;
14
+ private saveTokenCache;
15
+ }
16
+ //# sourceMappingURL=engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/engine.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAe,cAAc,EAAc,MAAM,YAAY,CAAC;AAO1E,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,SAAS,CAAC,EAAE,MAAM;IAI9B,OAAO,KAAK,OAAO,GAElB;IAED,OAAO,KAAK,eAAe,GAE1B;IAEK,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IA0G5C,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAqDhE,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IA8BvB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAiCjC,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,aAAa;IAwBrB,OAAO,CAAC,cAAc;IAWtB,OAAO,CAAC,cAAc;CAWvB"}
@@ -0,0 +1,286 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.ChromexEngine = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const os = __importStar(require("os"));
39
+ const path = __importStar(require("path"));
40
+ const DEFAULT_ENDPOINT = 'http://localhost:8150';
41
+ const TOKEN_CACHE_FILE = path.join(os.homedir(), '.crewx', 'chromex-tokens.json');
42
+ const TOKEN_BUFFER_MS = 60000;
43
+ class ChromexEngine {
44
+ constructor(tokenPath) {
45
+ this.tokenPath = tokenPath ?? TOKEN_CACHE_FILE;
46
+ }
47
+ get agentId() {
48
+ return process.env['CREWX_AGENT_ID'] ?? 'unknown';
49
+ }
50
+ get defaultEndpoint() {
51
+ return process.env['CREWX_ENDPOINT'] ?? DEFAULT_ENDPOINT;
52
+ }
53
+ async connect(opts) {
54
+ const agentId = opts.agent ?? this.agentId;
55
+ const endpoint = opts.endpoint ?? this.defaultEndpoint;
56
+ const cache = this.loadTokenCache();
57
+ const existing = cache[agentId];
58
+ if (existing) {
59
+ if (existing.endpoint !== endpoint) {
60
+ console.warn(`경고: 저장된 endpoint(${existing.endpoint}) ≠ 현재 endpoint(${endpoint}) — 재연결합니다`);
61
+ }
62
+ else {
63
+ const expiresAt = new Date(existing.expiresAt).getTime();
64
+ if (existing.mcpSessionId && expiresAt - Date.now() > TOKEN_BUFFER_MS) {
65
+ console.log(`기존 토큰 재사용 (만료: ${existing.expiresAt})`);
66
+ return;
67
+ }
68
+ }
69
+ }
70
+ const scope = opts.scope === 'current' ? 'current' : 'all_tabs';
71
+ const expiresIn = opts.expires ?? '90d';
72
+ console.log(`Chrome X 브라우저 접근 요청 중... (최대 60초 대기)`);
73
+ console.log(`에이전트: ${agentId} | 범위: ${scope} | 만료: ${expiresIn}`);
74
+ console.log(`Chrome 팝업에서 [허용] 버튼을 클릭하세요.`);
75
+ const body = { agentId, scope, expiresIn };
76
+ if (opts.name)
77
+ body['tokenName'] = opts.name;
78
+ const apiToken = process.env['CREWX_API_TOKEN'] ?? '';
79
+ const headers = { 'Content-Type': 'application/json' };
80
+ if (apiToken)
81
+ headers['Authorization'] = `Bearer ${apiToken}`;
82
+ let res;
83
+ try {
84
+ res = await fetch(`${endpoint}/api/chromex/negotiate`, {
85
+ method: 'POST',
86
+ headers,
87
+ body: JSON.stringify(body),
88
+ signal: AbortSignal.timeout(65000),
89
+ });
90
+ }
91
+ catch (err) {
92
+ const msg = err instanceof Error ? err.message : String(err);
93
+ throw new Error(`서버 연결 실패: ${msg}\n서버가 실행 중인지 확인하세요 (${endpoint})`);
94
+ }
95
+ if (!res.ok) {
96
+ const data = await res.json().catch(() => ({}));
97
+ const reason = data['reason'] ?? '';
98
+ if (res.status === 403 && reason === 'user_denied') {
99
+ throw new Error('연결 거부 — 사용자가 브라우저 접근을 거부했습니다');
100
+ }
101
+ if (res.status === 403 && reason === 'restricted_tab') {
102
+ throw new Error('Chrome X 연결 거부 — 활성 탭이 chrome://, 확장 페이지, about:, data: 같은 제한 페이지입니다. 일반 웹 페이지 탭을 선택한 뒤 다시 실행하세요.');
103
+ }
104
+ if (res.status === 403 && reason === 'content_script_not_connected') {
105
+ throw new Error('Chrome X 연결 거부 — 읽을 수 있는 페이지 채널이 없습니다. 일반 웹 페이지를 열거나 새로고침한 뒤 다시 실행하세요.');
106
+ }
107
+ if (res.status === 403 && reason === 'no_browser_tab_available') {
108
+ throw new Error('Chrome X 연결 거부 — 승인 팝업을 띄울 브라우저 탭을 찾지 못했습니다. 일반 웹 페이지 탭을 연 뒤 다시 실행하세요.');
109
+ }
110
+ if (res.status === 403 && reason === 'invalid_scope') {
111
+ throw new Error('Chrome X 연결 거부 — 요청 scope가 올바르지 않습니다.');
112
+ }
113
+ if (res.status === 408 || reason === 'timeout') {
114
+ throw new Error('연결 타임아웃 — 60초 내에 응답이 없었습니다');
115
+ }
116
+ if (res.status === 503 || reason === 'no_browser_connected') {
117
+ throw new Error([
118
+ 'Chrome X 미연결 — 브라우저 MCP 세션을 찾지 못했습니다.',
119
+ 'Chrome에서 CrewX 익스텐션 사이드패널을 열어 MCP 상태가 connected인지 확인한 뒤 다시 실행하세요.',
120
+ `서버: ${endpoint}`,
121
+ ].join('\n'));
122
+ }
123
+ throw new Error(`negotiate 실패 (${res.status}): ${JSON.stringify(data)}`);
124
+ }
125
+ const result = await res.json();
126
+ cache[agentId] = {
127
+ token: result.token,
128
+ tokenId: result.tokenId,
129
+ jti: result.jti,
130
+ expiresAt: result.expiresAt,
131
+ scope: result.scope,
132
+ endpoint,
133
+ mcpSessionId: result.mcpSessionId,
134
+ };
135
+ this.saveTokenCache(cache);
136
+ console.log(`연결 성공!`);
137
+ console.log(` 만료: ${result.expiresAt}`);
138
+ console.log(` 범위: ${result.scope}`);
139
+ console.log(` 토큰 ID: ${result.jti}`);
140
+ }
141
+ async call(tool, args) {
142
+ const agentId = this.agentId;
143
+ const cached = this.loadToken(agentId);
144
+ if (!cached) {
145
+ throw new Error('토큰 없음 — npx crewx chromex connect 필요');
146
+ }
147
+ let res;
148
+ try {
149
+ const requestId = `chromex-${Date.now()}`;
150
+ const { name, arguments: mcpArguments } = this.toMcpToolCall(tool, args);
151
+ res = await fetch(`${cached.endpoint}/mcp`, {
152
+ method: 'POST',
153
+ headers: {
154
+ 'Content-Type': 'application/json',
155
+ Authorization: `Bearer ${cached.token}`,
156
+ 'Mcp-Session-Id': cached.mcpSessionId,
157
+ },
158
+ body: JSON.stringify({
159
+ jsonrpc: '2.0',
160
+ id: requestId,
161
+ method: 'tools/call',
162
+ params: { name, arguments: mcpArguments },
163
+ }),
164
+ signal: AbortSignal.timeout(30000),
165
+ });
166
+ }
167
+ catch (err) {
168
+ const msg = err instanceof Error ? err.message : String(err);
169
+ throw new Error(`서버 연결 실패: ${msg}`);
170
+ }
171
+ if (!res.ok) {
172
+ const data = await res.json().catch(() => ({}));
173
+ if (res.status === 401) {
174
+ throw new Error('토큰 만료 — npx crewx chromex connect 필요');
175
+ }
176
+ if (res.status === 403) {
177
+ throw new Error(`접근 거부 (403): ${JSON.stringify(data)}`);
178
+ }
179
+ throw new Error(`MCP tools/call 실패 (${res.status}): ${JSON.stringify(data)}`);
180
+ }
181
+ const payload = await res.json();
182
+ if (payload.error) {
183
+ throw new Error(`MCP tools/call 오류 (${payload.error.code ?? 'unknown'}): ${payload.error.message ?? JSON.stringify(payload.error)}`);
184
+ }
185
+ console.log(JSON.stringify(payload.result ?? payload, null, 2));
186
+ }
187
+ async status() {
188
+ const agentId = this.agentId;
189
+ const cached = this.loadToken(agentId);
190
+ if (!cached) {
191
+ console.log('연결된 세션 없음 — npx crewx chromex connect 실행');
192
+ return;
193
+ }
194
+ const expiresAt = new Date(cached.expiresAt);
195
+ const now = Date.now();
196
+ const diffMs = expiresAt.getTime() - now;
197
+ if (diffMs <= 0) {
198
+ console.log(`세션 만료됨 (${cached.expiresAt})`);
199
+ console.log('npx crewx chromex connect 로 재연결하세요');
200
+ return;
201
+ }
202
+ const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));
203
+ const diffHours = Math.floor((diffMs % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
204
+ const remaining = diffDays > 0 ? `${diffDays}일 ${diffHours}시간` : `${diffHours}시간`;
205
+ console.log(`에이전트: ${agentId}`);
206
+ console.log(`범위: ${cached.scope}`);
207
+ console.log(`만료: ${cached.expiresAt} (${remaining} 남음)`);
208
+ console.log(`토큰 ID: ${cached.jti}`);
209
+ console.log(`서버: ${cached.endpoint}`);
210
+ }
211
+ async disconnect() {
212
+ const agentId = this.agentId;
213
+ const cached = this.loadToken(agentId);
214
+ if (!cached) {
215
+ console.log('연결된 세션 없음');
216
+ return;
217
+ }
218
+ try {
219
+ const res = await fetch(`${cached.endpoint}/api/chromex/session`, {
220
+ method: 'DELETE',
221
+ headers: {
222
+ 'Content-Type': 'application/json',
223
+ Authorization: `Bearer ${cached.token}`,
224
+ },
225
+ body: JSON.stringify({ tokenId: cached.tokenId }),
226
+ signal: AbortSignal.timeout(10000),
227
+ });
228
+ if (!res.ok) {
229
+ console.warn(`서버 revoke 실패 (${res.status}) — 로컬 토큰만 삭제`);
230
+ }
231
+ }
232
+ catch {
233
+ console.warn('서버 연결 실패 — 로컬 토큰만 삭제');
234
+ }
235
+ const cache = this.loadTokenCache();
236
+ delete cache[agentId];
237
+ this.saveTokenCache(cache);
238
+ console.log('연결 종료됨');
239
+ }
240
+ loadToken(agentId) {
241
+ const cache = this.loadTokenCache();
242
+ return cache[agentId];
243
+ }
244
+ toMcpToolCall(tool, args) {
245
+ if (tool === 'listTabs') {
246
+ return { name: 'listTabs', arguments: args };
247
+ }
248
+ const tabId = args['tabId'];
249
+ if (typeof tabId !== 'number' || Number.isNaN(tabId)) {
250
+ throw new Error(`${tool} 호출에는 --tab=<tabId>가 필요합니다`);
251
+ }
252
+ const { tabId: _tabId, ...toolArgs } = args;
253
+ return {
254
+ name: 'callBrowser',
255
+ arguments: {
256
+ tabId,
257
+ tool,
258
+ args: toolArgs,
259
+ },
260
+ };
261
+ }
262
+ loadTokenCache() {
263
+ if (!fs.existsSync(this.tokenPath))
264
+ return {};
265
+ try {
266
+ const content = fs.readFileSync(this.tokenPath, 'utf-8');
267
+ return JSON.parse(content);
268
+ }
269
+ catch {
270
+ console.error('chromex-tokens.json 파싱 실패 — 재연결 필요: npx crewx chromex connect');
271
+ return {};
272
+ }
273
+ }
274
+ saveTokenCache(cache) {
275
+ const dir = path.dirname(this.tokenPath);
276
+ if (!fs.existsSync(dir)) {
277
+ fs.mkdirSync(dir, { recursive: true });
278
+ }
279
+ const tmpPath = `${this.tokenPath}.tmp.${Date.now()}`;
280
+ fs.writeFileSync(tmpPath, JSON.stringify(cache, null, 2), { mode: 0o600 });
281
+ fs.renameSync(tmpPath, this.tokenPath);
282
+ fs.chmodSync(this.tokenPath, 0o600);
283
+ }
284
+ }
285
+ exports.ChromexEngine = ChromexEngine;
286
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ export interface ConnectOptions {
2
+ scope?: string;
3
+ expires?: '30d' | '90d' | '1y';
4
+ name?: string;
5
+ endpoint?: string;
6
+ agent?: string;
7
+ }
8
+ export interface CachedToken {
9
+ token: string;
10
+ tokenId: string;
11
+ jti: string;
12
+ expiresAt: string;
13
+ scope: string;
14
+ endpoint: string;
15
+ mcpSessionId: string;
16
+ }
17
+ export type TokenCache = Record<string, CachedToken>;
18
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,IAAI,CAAC;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,49 @@
1
+ {
2
+ "name": "@crewx/chromex",
3
+ "version": "0.1.0-rc.8",
4
+ "description": "Chrome X browser tool CLI for CrewX agents",
5
+ "type": "commonjs",
6
+ "main": "dist/src/engine.js",
7
+ "types": "dist/src/engine.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/src/engine.d.ts",
11
+ "import": "./dist/src/engine.js",
12
+ "require": "./dist/src/engine.js",
13
+ "default": "./dist/src/engine.js"
14
+ },
15
+ "./cli": {
16
+ "import": "./dist/cli.js",
17
+ "require": "./dist/cli.js",
18
+ "default": "./dist/cli.js"
19
+ }
20
+ },
21
+ "bin": {
22
+ "chromex": "./dist/cli.js"
23
+ },
24
+ "files": [
25
+ "dist",
26
+ "SKILL.md"
27
+ ],
28
+ "keywords": [
29
+ "crewx",
30
+ "chromex",
31
+ "browser",
32
+ "chrome"
33
+ ],
34
+ "license": "MIT",
35
+ "dependencies": {
36
+ "@crewx/shared": "0.0.5"
37
+ },
38
+ "devDependencies": {
39
+ "@types/node": "^20.0.0",
40
+ "ts-node": "^10.9.0",
41
+ "typescript": "^5.0.0"
42
+ },
43
+ "scripts": {
44
+ "build": "tsc",
45
+ "dev": "ts-node cli.ts",
46
+ "clean": "rm -rf dist",
47
+ "test": "echo no tests"
48
+ }
49
+ }