@crewx/chromex 0.1.0-rc.25 → 0.1.0-rc.250

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/SKILL.md ADDED
@@ -0,0 +1,66 @@
1
+ ---
2
+ name: crewx/chromex
3
+ description: Chrome X browser tool CLI. Connect agents to Chrome X and call browser tools such as tab text, screenshots, and tab listing.
4
+ metadata:
5
+ version: 0.1.0
6
+ built-in: true
7
+ ---
8
+
9
+ # Chrome X Browser Tool
10
+
11
+ Chrome X is the browser tool CLI that CrewX agents use to read browser tabs and request screenshots.
12
+ It runs commands against a session connected to the server's Chrome X MCP/HTTP channel.
13
+
14
+ ## Commands
15
+
16
+ ```bash
17
+ crewx chromex usage
18
+ crewx chromex connect [--scope=all|current] [--expires=30d|90d|1y] [--name=<name>] [--endpoint=<url>] [--agent=<id>]
19
+ crewx chromex status
20
+ crewx chromex disconnect
21
+ crewx chromex read [--tab=<tabId>] [--step=1|2|3] [--selector=<css>]
22
+ crewx chromex screenshot [--tab=<tabId>] [--output=<path>]
23
+ crewx chromex tabs
24
+ ```
25
+
26
+ ## When To Use
27
+
28
+ - When you need to read the current text of a browser page
29
+ - When you need to check UI/webpage state via screenshot
30
+ - When you need a list of connected Chrome tabs
31
+ - When you need to check or disconnect the Chrome X session connection status
32
+
33
+ ## Connection
34
+
35
+ ```bash
36
+ crewx chromex connect --scope=current --expires=90d --agent=<agent_id>
37
+ crewx chromex status
38
+ ```
39
+
40
+ `connect` creates a Chrome X browser access approval request. The default endpoint is `http://localhost:8150`;
41
+ when using a remote server, specify `--endpoint` or `CREWX_ENDPOINT`.
42
+
43
+ ## Browser Reads
44
+
45
+ ```bash
46
+ crewx chromex read --tab=123
47
+ crewx chromex read --tab=123 --step=2 --selector="main"
48
+ crewx chromex screenshot --tab=123 --output=/tmp/page.png
49
+ crewx chromex tabs
50
+ ```
51
+
52
+ `read` is translated into a `page_read_text` tool call, `screenshot` into `page_screenshot`, and `tabs` into `listTabs`.
53
+
54
+ ## Environment
55
+
56
+ | Variable | Purpose |
57
+ |----------|---------|
58
+ | `CREWX_AGENT_ID` | Default agent ID |
59
+ | `CREWX_ENDPOINT` | Default CrewX server URL |
60
+ | `CREWX_API_TOKEN` | Explicit server auth token override; otherwise the runtime credential file is used |
61
+
62
+ ## Notes
63
+
64
+ - `usage` prints this `SKILL.md` as-is.
65
+ - If there's no browser session, run `connect` first.
66
+ - For server/extension connection issues, check `status` first.
package/dist/cli.d.ts CHANGED
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env node
2
2
  export declare function main(inputArgs?: string[]): Promise<void>;
3
- //# sourceMappingURL=cli.d.ts.map
3
+
package/dist/cli.js CHANGED
@@ -1,198 +1,38 @@
1
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
2
+ "use strict";var v=exports&&exports.__createBinding||(Object.create?(function(n,t,r,e){if(e===void 0)e=r;var s=Object.getOwnPropertyDescriptor(t,r);if(!s||("get"in s?!t.__esModule:s.writable||s.configurable)){s={enumerable:true,get:function(){return t[r]}}}Object.defineProperty(n,e,s)}):(function(n,t,r,e){if(e===void 0)e=r;n[e]=t[r]}));var x=exports&&exports.__setModuleDefault||(Object.create?(function(n,t){Object.defineProperty(n,"default",{enumerable:true,value:t})}):function(n,t){n["default"]=t});var p=exports&&exports.__importStar||(function(){var n=function(t){n=Object.getOwnPropertyNames||function(r){var e=[];for(var s in r)if(Object.prototype.hasOwnProperty.call(r,s))e[e.length]=s;return e};return n(t)};return function(t){if(t&&t.__esModule)return t;var r={};if(t!=null){for(var e=n(t),s=0;s<e.length;s++)if(e[s]!=="default")v(r,t,e[s])}x(r,t);return r}})();Object.defineProperty(exports,"__esModule",{value:true});exports.main=g;const l=p(require("fs"));const d=p(require("path"));const w=require("@crewx/shared/crewx-api-credential");const y=require("./src/engine.js");let f="unknown";try{const n=l.existsSync(d.join(__dirname,"package.json"))?d.join(__dirname,"package.json"):d.join(__dirname,"..","package.json");const t=JSON.parse(l.readFileSync(n,"utf-8"));if(t?.version)f=String(t.version)}catch{}function h(){console.log(`
3
+ @crewx/chromex@${f} - Chrome X browser tools CLI
54
4
 
55
5
  Usage:
56
6
  chromex <command> [options]
57
7
 
58
8
  Commands:
59
- chromex connect Chrome X 브라우저 접근 승인 요청
60
- chromex status 현재 세션 상태
61
- chromex disconnect 세션 종료
62
- chromex read 탭 텍스트 읽기 (page_read_text)
63
- chromex screenshot 탭 스크린샷 캡처
64
- chromex tabs 연결된 탭 목록
9
+ chromex usage Show detailed guide (SKILL.md)
10
+ chromex connect Request Chrome X browser access approval
11
+ chromex status Show current session status
12
+ chromex disconnect End the current session
13
+ chromex read Read tab text (page_read_text)
14
+ chromex screenshot Capture a tab screenshot
15
+ chromex tabs List connected tabs
65
16
 
66
17
  Options:
67
18
  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 환경변수)
19
+ --scope=all|current Scope (default: all)
20
+ --expires=30d|90d|1y Token expiration (default: 90d)
21
+ --name=<name> Token name
22
+ --endpoint=<url> Server URL (default: http://localhost:8150)
23
+ --agent=<id> Agent ID (default: CREWX_AGENT_ID environment variable)
73
24
 
74
25
  read:
75
- --tab=<tabId> 대상 탭 ID
76
- --step=1|2|3 추출 단계 (기본: 1)
77
- --selector=<css> CSS 셀렉터
26
+ --tab=<tabId> Target tab ID
27
+ --step=1|2|3 Extraction step (default: 1)
28
+ --selector=<css> CSS selector
78
29
 
79
30
  screenshot:
80
- --tab=<tabId> 대상 탭 ID
81
- --output=<path> 저장 경로
31
+ --tab=<tabId> Target tab ID
32
+ --output=<path> Output path
82
33
 
83
34
  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
35
+ CREWX_AGENT_ID Agent ID
36
+ CREWX_ENDPOINT Default server URL
37
+ CREWX_API_TOKEN Explicit server auth token override
38
+ `)}function O(){const n=d.join(__dirname,"..","SKILL.md");if(l.existsSync(n)){process.stdout.write(l.readFileSync(n,"utf-8"))}else{h()}}const I=new Set(["help","version"]);function S(n){const t={positional:[],options:{}};for(let r=0;r<n.length;r++){const e=n[r];if(e==="-h"){t.options["help"]=true}else if(e.startsWith("--")){const s=e.indexOf("=");if(s!==-1){t.options[e.slice(2,s)]=e.slice(s+1)}else{const a=e.slice(2);if(!I.has(a)){const o=n[r+1];if(o!==void 0&&!o.startsWith("--")&&o!=="-h"){t.options[a]=o;r++}else{t.options[a]=true}}else{t.options[a]=true}}}else{t.positional.push(e)}}return t}async function g(n){const t=n??process.argv.slice(2);const{positional:r,options:e}=S(t);const[s]=r;if(e["version"]){console.log(f);return}if(s==="usage"){O();return}if(!s||s==="help"||e["help"]){h();return}const a=new y.ChromexEngine;switch(s){case"connect":{const o=typeof e["scope"]==="string"?e["scope"]:void 0;const i=e["expires"];const c=["30d","90d","1y"];const u=typeof i==="string"&&c.includes(i)?i:void 0;const _=typeof e["name"]==="string"?e["name"]:void 0;const b=typeof e["endpoint"]==="string"?e["endpoint"]:void 0;const m=typeof e["agent"]==="string"?e["agent"]:void 0;await a.connect({scope:o,expires:u,name:_,endpoint:b,agent:m});break}case"status":await a.status();break;case"disconnect":await a.disconnect();break;case"read":{const o=e["tab"];const i=e["step"];const c=e["selector"];const u={};if(o!==void 0)u["tabId"]=Number(o);if(i!==void 0)u["step"]=Number(i);if(typeof c==="string")u["selector"]=c;await a.call("page_read_text",u);break}case"screenshot":{const o=e["tab"];const i=e["output"];const c={};if(o!==void 0)c["tabId"]=Number(o);if(typeof i==="string")c["output"]=i;await a.call("page_screenshot",c);break}case"tabs":await a.call("listTabs",{});break;default:console.error(`Unknown command: ${s}`);console.error('Run "chromex --help" for usage.');process.exit(1)}}if(require.main===module){g().catch(n=>{console.error(n.message);process.exit(n instanceof w.CrewxCredentialError?n.exitCode:1)})}
@@ -13,4 +13,4 @@ export declare class ChromexEngine {
13
13
  private loadTokenCache;
14
14
  private saveTokenCache;
15
15
  }
16
- //# sourceMappingURL=engine.d.ts.map
16
+
@@ -1,286 +1,2 @@
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
1
+ "use strict";var y=exports&&exports.__createBinding||(Object.create?(function(i,e,n,t){if(t===void 0)t=n;var o=Object.getOwnPropertyDescriptor(e,n);if(!o||("get"in o?!e.__esModule:o.writable||o.configurable)){o={enumerable:true,get:function(){return e[n]}}}Object.defineProperty(i,t,o)}):(function(i,e,n,t){if(t===void 0)t=n;i[t]=e[n]}));var S=exports&&exports.__setModuleDefault||(Object.create?(function(i,e){Object.defineProperty(i,"default",{enumerable:true,value:e})}):function(i,e){i["default"]=e});var p=exports&&exports.__importStar||(function(){var i=function(e){i=Object.getOwnPropertyNames||function(n){var t=[];for(var o in n)if(Object.prototype.hasOwnProperty.call(n,o))t[t.length]=o;return t};return i(e)};return function(e){if(e&&e.__esModule)return e;var n={};if(e!=null){for(var t=i(e),o=0;o<t.length;o++)if(t[o]!=="default")y(n,e,t[o])}S(n,e);return n}})();Object.defineProperty(exports,"__esModule",{value:true});exports.ChromexEngine=void 0;const g=p(require("fs"));const _=p(require("os"));const w=p(require("path"));const m=require("@crewx/shared/crewx-api-credential");const x="http://localhost:8150";const E=w.join(_.homedir(),".crewx","chromex-tokens.json");const $=6e4;class C{constructor(e){this.tokenPath=e??E}get agentId(){return process.env["CREWX_AGENT_ID"]??"unknown"}get defaultEndpoint(){return process.env["CREWX_ENDPOINT"]??x}async connect(e){const n=e.agent??this.agentId;const t=e.endpoint??this.defaultEndpoint;const o=this.loadTokenCache();const r=o[n];if(r){if(r.endpoint!==t){console.warn(`Warning: saved endpoint (${r.endpoint}) differs from the current endpoint (${t}); reconnecting`)}else{const u=new Date(r.expiresAt).getTime();if(r.mcpSessionId&&u-Date.now()>$){console.log(`Reusing existing token (expires: ${r.expiresAt})`);return}}}const c=e.scope==="current"?"current":"all_tabs";const s=e.expires??"90d";console.log(`Requesting Chrome X browser access... (waiting up to 60 seconds)`);console.log(`Agent: ${n} | Scope: ${c} | Expires: ${s}`);console.log(`Click Allow in the Chrome popup.`);const h={agentId:n,scope:c,expiresIn:s};if(e.name)h["tokenName"]=e.name;const f=(0,m.resolveCrewxApiCredential)("chromex-negotiate");const b={"Content-Type":"application/json",...(0,m.authorizationHeader)(f)};let a;try{a=await fetch(`${t}/api/chromex/negotiate`,{method:"POST",headers:b,body:JSON.stringify(h),signal:AbortSignal.timeout(65e3)})}catch(u){const d=u instanceof Error?u.message:String(u);throw new Error(`Server connection failed: ${d}
2
+ Check that the server is running (${t})`)}if(!a.ok){const u=await a.json().catch(()=>({}));const d=u["reason"]??"";if(a.status===403&&d==="user_denied"){throw new Error("Connection denied: the user rejected browser access")}if(a.status===403&&d==="restricted_tab"){throw new Error("Chrome X connection denied: the active tab is a restricted page such as chrome://, an extension page, about:, or data:. Select a regular web page tab and try again.")}if(a.status===403&&d==="content_script_not_connected"){throw new Error("Chrome X connection denied: no readable page channel is connected. Open or reload a regular web page and try again.")}if(a.status===403&&d==="no_browser_tab_available"){throw new Error("Chrome X connection denied: no browser tab is available for the approval popup. Open a regular web page tab and try again.")}if(a.status===403&&d==="invalid_scope"){throw new Error("Chrome X connection denied: the requested scope is invalid.")}if(a.status===408||d==="timeout"){throw new Error("Connection timed out: no response within 60 seconds")}if(a.status===503||d==="no_browser_connected"){throw new Error(["Chrome X is not connected: no browser MCP session was found.","Open the CrewX extension side panel in Chrome, confirm MCP status is connected, then try again.",`Server: ${t}`].join("\n"))}throw new Error(`Negotiation failed (${a.status}): ${JSON.stringify(u)}`)}const l=await a.json();o[n]={token:l.token,tokenId:l.tokenId,jti:l.jti,expiresAt:l.expiresAt,scope:l.scope,endpoint:t,mcpSessionId:l.mcpSessionId};this.saveTokenCache(o);console.log(`Connection successful.`);console.log(` Expires: ${l.expiresAt}`);console.log(` Scope: ${l.scope}`);console.log(` Token ID: ${l.jti}`)}async call(e,n){const t=this.agentId;const o=this.loadToken(t);if(!o){throw new Error("No token found. Run: crewx chromex connect")}let r;try{const s=`chromex-${Date.now()}`;const{name:h,arguments:f}=this.toMcpToolCall(e,n);r=await fetch(`${o.endpoint}/mcp`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${o.token}`,"Mcp-Session-Id":o.mcpSessionId},body:JSON.stringify({jsonrpc:"2.0",id:s,method:"tools/call",params:{name:h,arguments:f}}),signal:AbortSignal.timeout(3e4)})}catch(s){const h=s instanceof Error?s.message:String(s);throw new Error(`Server connection failed: ${h}`)}if(!r.ok){const s=await r.json().catch(()=>({}));if(r.status===401){throw new Error("Token expired. Run: crewx chromex connect")}if(r.status===403){throw new Error(`Access denied (403): ${JSON.stringify(s)}`)}throw new Error(`MCP tools/call failed (${r.status}): ${JSON.stringify(s)}`)}const c=await r.json();if(c.error){throw new Error(`MCP tools/call error (${c.error.code??"unknown"}): ${c.error.message??JSON.stringify(c.error)}`)}console.log(JSON.stringify(c.result??c,null,2))}async status(){const e=this.agentId;const n=this.loadToken(e);if(!n){console.log("No connected session. Run: crewx chromex connect");return}const t=new Date(n.expiresAt);const o=Date.now();const r=t.getTime()-o;if(r<=0){console.log(`Session expired (${n.expiresAt})`);console.log("Reconnect with: crewx chromex connect");return}const c=Math.floor(r/(1e3*60*60*24));const s=Math.floor(r%(1e3*60*60*24)/(1e3*60*60));const h=c>0?`${c}d ${s}h`:`${s}h`;console.log(`Agent: ${e}`);console.log(`Scope: ${n.scope}`);console.log(`Expires: ${n.expiresAt} (${h} remaining)`);console.log(`Token ID: ${n.jti}`);console.log(`Server: ${n.endpoint}`)}async disconnect(){const e=this.agentId;const n=this.loadToken(e);if(!n){console.log("No connected session");return}try{const o=await fetch(`${n.endpoint}/api/chromex/session`,{method:"DELETE",headers:{"Content-Type":"application/json",Authorization:`Bearer ${n.token}`},body:JSON.stringify({tokenId:n.tokenId}),signal:AbortSignal.timeout(1e4)});if(!o.ok){console.warn(`Server revoke failed (${o.status}); deleting the local token only`)}}catch{console.warn("Server connection failed; deleting the local token only")}const t=this.loadTokenCache();delete t[e];this.saveTokenCache(t);console.log("Disconnected")}loadToken(e){const n=this.loadTokenCache();return n[e]}toMcpToolCall(e,n){if(e==="listTabs"){return{name:"listTabs",arguments:n}}const t=n["tabId"];if(typeof t!=="number"||Number.isNaN(t)){throw new Error(`${e} requires --tab=<tabId>`)}const{tabId:o,...r}=n;return{name:"callBrowser",arguments:{tabId:t,tool:e,args:r}}}loadTokenCache(){if(!g.existsSync(this.tokenPath))return{};try{const e=g.readFileSync(this.tokenPath,"utf-8");return JSON.parse(e)}catch{console.error("Failed to parse chromex-tokens.json. Reconnect with: crewx chromex connect");return{}}}saveTokenCache(e){const n=w.dirname(this.tokenPath);if(!g.existsSync(n)){g.mkdirSync(n,{recursive:true})}const t=`${this.tokenPath}.tmp.${Date.now()}`;g.writeFileSync(t,JSON.stringify(e,null,2),{mode:384});g.renameSync(t,this.tokenPath);g.chmodSync(this.tokenPath,384)}}exports.ChromexEngine=C;
@@ -15,4 +15,4 @@ export interface CachedToken {
15
15
  mcpSessionId: string;
16
16
  }
17
17
  export type TokenCache = Record<string, CachedToken>;
18
- //# sourceMappingURL=types.d.ts.map
18
+
package/dist/src/types.js CHANGED
@@ -1,3 +1 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=types.js.map
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@crewx/chromex",
3
- "version": "0.1.0-rc.25",
3
+ "version": "0.1.0-rc.250",
4
4
  "description": "Chrome X browser tool CLI for CrewX agents",
5
5
  "type": "commonjs",
6
6
  "main": "dist/src/engine.js",
@@ -33,7 +33,7 @@
33
33
  ],
34
34
  "license": "MIT",
35
35
  "dependencies": {
36
- "@crewx/shared": "0.0.5"
36
+ "@crewx/shared": "0.0.6-rc.132"
37
37
  },
38
38
  "devDependencies": {
39
39
  "@types/node": "^20.0.0",
package/dist/cli.d.ts.map DELETED
@@ -1 +0,0 @@
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.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../cli.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/engine.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":""}