mobilecoder-mcp 2.0.0 → 2.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.
package/dist/agent.d.ts CHANGED
@@ -10,6 +10,7 @@ export declare class ZKRelayAgent {
10
10
  private initPTY;
11
11
  private connectToRelay;
12
12
  private handleIncomingMessage;
13
+ private handleToolCall;
13
14
  private sendSecurePayload;
14
15
  private sendEnvInfo;
15
16
  private printBanner;
@@ -1 +1 @@
1
- {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAWA,qBAAa,YAAY;IACrB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,UAAU,CAAM;IACxB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,OAAO,CAAwC;;IASvD,OAAO,CAAC,aAAa;IAarB,OAAO,CAAC,OAAO;IAkBf,OAAO,CAAC,cAAc;IA+DtB,OAAO,CAAC,qBAAqB;IAmC7B,OAAO,CAAC,iBAAiB;IAqBzB,OAAO,CAAC,WAAW;IAWnB,OAAO,CAAC,WAAW;CAYtB"}
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAaA,qBAAa,YAAY;IACrB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,UAAU,CAAM;IACxB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,OAAO,CAAwC;;IASvD,OAAO,CAAC,aAAa;IAarB,OAAO,CAAC,OAAO;IAkBf,OAAO,CAAC,cAAc;IAwCtB,OAAO,CAAC,qBAAqB;YAwDf,cAAc;IAyC5B,OAAO,CAAC,iBAAiB;IAsCzB,OAAO,CAAC,WAAW;IAWnB,OAAO,CAAC,WAAW;CAYtB"}
package/dist/agent.js CHANGED
@@ -4,6 +4,8 @@ import * as pty from 'node-pty';
4
4
  import CryptoJS from 'crypto-js';
5
5
  import chalk from 'chalk';
6
6
  import ora from 'ora';
7
+ import * as fs from 'fs';
8
+ import * as path from 'path';
7
9
  // 🚨 BURAYI KENDİ DOMAIN ADRESİNLE DEĞİŞTİR!
8
10
  const RELAY_SERVER_URL = 'https://api.mobilecoder.xyz';
9
11
  export class ZKRelayAgent {
@@ -55,8 +57,6 @@ export class ZKRelayAgent {
55
57
  this.spinner.succeed(chalk.green('Connected to Relay Node!'));
56
58
  // Odaya Katıl (Sadece Hash ID gönderilir)
57
59
  this.socket.emit('join_room', { code: this.roomId, type: 'agent' });
58
- // Note: Changed 'join_secure_room' to 'join_room' to match server implementation
59
- // Server implementation in index.ts: socket.on('join_room', (data: { code: string; type: 'agent' | 'client' }) => ...)
60
60
  this.printBanner();
61
61
  });
62
62
  this.socket.on('disconnect', () => {
@@ -68,27 +68,7 @@ export class ZKRelayAgent {
68
68
  this.sendEnvInfo();
69
69
  });
70
70
  // Mobilden şifreli veri geldiğinde
71
- // RelayManager emits 'term_data' and 'meta_data'.
72
- // Server implementation:
73
- // socket.on('term_data', ...) -> pass through term_data
74
- // socket.on('meta_data', ...) -> pass through meta_data
75
- // Agent connects to /, Server index.ts uses / (global namespace) BUT has:
76
- // const relayNamespace = io.of('/terminal');
77
- // WAIT. Previous user setup had /terminal.
78
- // My previous edit REMOVED /terminal and used RelayManager on root io.
79
- // But RelayManager implementation listens on 'relay_data'.
80
- // My RelayManager uses: socket.on('relay_data', ...)
81
- // But user snippet provided for Agent uses 'relay_encrypted' and listens on 'stream_encrypted'.
82
- // I need to align Agent and Server.
83
- // The previous edit to server/index.ts instantiates RelayManager.
84
- // RelayManager listens to 'relay_data'.
85
- // So the Agent MUST emit 'relay_data'.
86
71
  this.socket.on('relay_data', (message) => {
87
- // RelayManager checks payload structure?
88
- // Wait, RelayManager implementation:
89
- // socket.on('relay_data', (data) => { ... socket.to(room).emit('relay_data', data.payload) ... })
90
- // So client receives `payload`.
91
- // If payload is encrypted string, handle it.
92
72
  this.handleIncomingMessage(message);
93
73
  });
94
74
  // Also listen for connect_error
@@ -111,15 +91,31 @@ export class ZKRelayAgent {
111
91
  // Veri JSON mu? (Resize komutu vs olabilir)
112
92
  try {
113
93
  const cmd = JSON.parse(originalText);
94
+ // 1. Terminal Input (Keystrokes)
95
+ if (cmd.type === 'input') {
96
+ this.ptyProcess.write(cmd.data);
97
+ return;
98
+ }
99
+ // 2. Terminal Resize
114
100
  if (cmd.type === 'resize') {
115
101
  this.ptyProcess.resize(cmd.cols, cmd.rows);
116
102
  return;
117
103
  }
118
- if (cmd.type === 'input') {
119
- this.ptyProcess.write(cmd.data);
104
+ // 3. Chat Commands (e.g. "ls -la")
105
+ if (cmd.type === 'command') {
106
+ this.ptyProcess.write(cmd.text + '\r');
107
+ return;
108
+ }
109
+ // 4. CLI Tool/Button Commands (e.g. "git status")
110
+ if (cmd.type === 'cli_command') {
111
+ this.ptyProcess.write(cmd.command + '\r');
112
+ return;
113
+ }
114
+ // 5. Tool Calls (File System Access)
115
+ if (cmd.type === 'tool_call') {
116
+ this.handleToolCall(cmd.tool, cmd.data, cmd.id);
120
117
  return;
121
118
  }
122
- // Fallback checks
123
119
  }
124
120
  catch (e) {
125
121
  // JSON değilse saf terminal girdisidir
@@ -130,21 +126,74 @@ export class ZKRelayAgent {
130
126
  // Şifre çözülemezse (Yanlış anahtar vb.) sessizce yut
131
127
  }
132
128
  }
129
+ async handleToolCall(tool, args, id) {
130
+ try {
131
+ let result = null;
132
+ if (tool === 'list_directory') {
133
+ const dirPath = args.path ? path.resolve(args.path) : process.cwd();
134
+ const entries = await fs.promises.readdir(dirPath, { withFileTypes: true });
135
+ const files = entries.map(entry => ({
136
+ name: entry.name,
137
+ type: entry.isDirectory() ? 'directory' : 'file',
138
+ size: 0 // Simplification for speed
139
+ }));
140
+ result = { files };
141
+ }
142
+ else if (tool === 'read_file') {
143
+ const filePath = path.resolve(args.path);
144
+ const content = await fs.promises.readFile(filePath, 'utf-8');
145
+ result = { content };
146
+ }
147
+ else {
148
+ throw new Error(`Unknown tool: ${tool}`);
149
+ }
150
+ this.sendSecurePayload('tool_result', {
151
+ id,
152
+ result
153
+ });
154
+ }
155
+ catch (error) {
156
+ this.sendSecurePayload('tool_result', {
157
+ id,
158
+ error: error.message,
159
+ type: 'error'
160
+ });
161
+ }
162
+ }
133
163
  // Veriyi şifrele ve gönder
134
164
  sendSecurePayload(type, data) {
135
- let payloadStr = data;
136
- if (type === 'meta') {
165
+ let payloadStr = '';
166
+ if (type === 'meta' || type === 'tool_result') {
137
167
  // Standardize format
138
- payloadStr = JSON.stringify(data);
168
+ // For tool_result, data already contains id/result/error
169
+ // We wrap it in the top level object structure expected by client
170
+ // Client expects: { type: 'result', id: ..., result: ... } OR { type: 'error', id: ..., error: ... }
171
+ if (type === 'tool_result') {
172
+ // data is { id, result } or { id, error, type: 'error' }
173
+ if (data.type === 'error') {
174
+ payloadStr = JSON.stringify({ ...data });
175
+ }
176
+ else {
177
+ payloadStr = JSON.stringify({ type: 'result', ...data });
178
+ }
179
+ }
180
+ else {
181
+ payloadStr = JSON.stringify(data);
182
+ }
139
183
  }
140
- else if (type === 'term_data' && typeof data === 'string') {
141
- // Wrap output in { type: 'output', data: ... } for client consistency if client expects JSON
142
- // The Client handles { type: 'output' ... }
143
- payloadStr = JSON.stringify({ type: 'output', data: data });
184
+ else if (type === 'term_data') {
185
+ // Wrap output in { type: 'output', data: ... }
186
+ if (typeof data === 'string') {
187
+ payloadStr = JSON.stringify({ type: 'output', data: data });
188
+ }
189
+ else {
190
+ payloadStr = JSON.stringify(data);
191
+ }
144
192
  }
193
+ // Fallback if empty (shouldn't happen with above logic)
194
+ if (!payloadStr)
195
+ payloadStr = JSON.stringify(data);
145
196
  const encrypted = CryptoJS.AES.encrypt(payloadStr, this.encryptionKey).toString();
146
- // RelayManager expects 'relay_data' event with { room, payload }
147
- // It emits 'relay_data' with just payload to other peer.
148
197
  this.socket.emit('relay_data', {
149
198
  room: this.roomId,
150
199
  payload: { e: encrypted }
@@ -152,16 +201,16 @@ export class ZKRelayAgent {
152
201
  }
153
202
  sendEnvInfo() {
154
203
  const info = {
155
- type: 'host_info', // Changed to match client expectation
156
- username: os.userInfo().username, // user -> username
157
- hostname: os.hostname(), // host -> hostname
204
+ type: 'host_info',
205
+ username: os.userInfo().username,
206
+ hostname: os.hostname(),
158
207
  platform: os.platform(),
159
208
  cwd: process.cwd()
160
209
  };
161
210
  this.sendSecurePayload('meta', info);
162
211
  }
163
212
  printBanner() {
164
- console.log('\n' + chalk.bgBlue.bold(' MOBILECODER ZK-RELAY v2.0 '));
213
+ console.log('\n' + chalk.bgBlue.bold(' MOBILECODER ZK-RELAY v2.0.1 '));
165
214
  console.log(chalk.gray('Secure, End-to-End Encrypted Terminal Bridge\n'));
166
215
  console.log(chalk.yellow('┌──────────────────────────────────────┐'));
167
216
  console.log(chalk.yellow('│ 🔑 CONNECTION CODE (ENTER ON APP) │'));
package/dist/agent.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAU,MAAM,kBAAkB,CAAC;AAC9C,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAChC,OAAO,QAAQ,MAAM,WAAW,CAAC;AACjC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,6CAA6C;AAC7C,MAAM,gBAAgB,GAAG,6BAA6B,CAAC;AAEvD,MAAM,OAAO,YAAY;IACb,MAAM,CAAS;IACf,UAAU,CAAM;IAChB,UAAU,CAAS;IACnB,MAAM,CAAS;IACf,aAAa,CAAS;IACtB,OAAO,GAAG,GAAG,CAAC,+BAA+B,CAAC,CAAC;IAEvD;QACI,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,IAAI,CAAC,cAAc,EAAE,CAAC;IAC1B,CAAC;IAED,iDAAiD;IACzC,aAAa;QACjB,gDAAgD;QAChD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC;QAC9D,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC;QAEvC,mEAAmE;QACnE,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,QAAQ,EAAE,CAAC;QAE1D,gEAAgE;QAChE,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,UAAU,CAAC;IACzC,CAAC;IAED,6BAA6B;IACrB,OAAO;QACX,MAAM,KAAK,GAAG,EAAE,CAAC,QAAQ,EAAE,KAAK,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,MAAM,CAAC,CAAC;QAE3F,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,EAAE;YACnC,IAAI,EAAE,gBAAgB;YACtB,IAAI,EAAE,EAAE;YACR,IAAI,EAAE,EAAE;YACR,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;YAClB,GAAG,EAAE,OAAO,CAAC,GAAG;SACnB,CAAC,CAAC;QAEH,4CAA4C;QAC5C,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAY,EAAE,EAAE;YACpC,IAAI,CAAC,iBAAiB,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;IACP,CAAC;IAED,+BAA+B;IACvB,cAAc;QAClB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAEjE,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,gBAAgB,EAAE;YAC/B,UAAU,EAAE,CAAC,WAAW,CAAC,EAAE,4BAA4B;YACvD,YAAY,EAAE,IAAI;YAClB,oBAAoB,EAAE,QAAQ;SACjC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;YAC3B,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAC;YAE9D,0CAA0C;YAC1C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;YAEpE,IAAI,CAAC,WAAW,EAAE,CAAC;QACvB,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,GAAG,EAAE;YAC9B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,kCAAkC,CAAC,CAAC,CAAC;QACxE,CAAC,CAAC,CAAC;QAEH,8BAA8B;QAC9B,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,aAAa,EAAE,GAAG,EAAE;YAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC,CAAC;YAC/E,IAAI,CAAC,WAAW,EAAE,CAAC;QACvB,CAAC,CAAC,CAAC;QAEH,mCAAmC;QACnC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,OAAuC,EAAE,EAAE;YACrE,IAAI,CAAC,qBAAqB,CAAC,OAAc,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;QAEH,gCAAgC;QAChC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,eAAe,EAAE,CAAC,GAAG,EAAE,EAAE;YACpC,sBAAsB;QAC1B,CAAC,CAAC,CAAC;IACP,CAAC;IAED,2BAA2B;IACnB,qBAAqB,CAAC,gBAAqB;QAC/C,IAAI,CAAC;YACD,gDAAgD;YAChD,IAAI,UAAU,GAAG,gBAAgB,CAAC;YAClC,IAAI,OAAO,gBAAgB,KAAK,QAAQ,IAAI,gBAAgB,CAAC,CAAC,EAAE,CAAC;gBAC7D,UAAU,GAAG,gBAAgB,CAAC,CAAC,CAAC;YACpC,CAAC;YAED,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;YACnE,MAAM,YAAY,GAAG,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAEvD,IAAI,CAAC,YAAY;gBAAE,OAAO;YAE1B,4CAA4C;YAC5C,IAAI,CAAC;gBACD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;gBAErC,iCAAiC;gBACjC,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;oBACvB,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;oBAChC,OAAO;gBACX,CAAC;gBAED,qBAAqB;gBACrB,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBACxB,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;oBAC3C,OAAO;gBACX,CAAC;gBAED,mCAAmC;gBACnC,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;oBACzB,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;oBACvC,OAAO;gBACX,CAAC;gBAED,kDAAkD;gBAClD,IAAI,GAAG,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;oBAC7B,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;oBAC1C,OAAO;gBACX,CAAC;gBAED,qCAAqC;gBACrC,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;oBAC3B,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;oBAChD,OAAO;gBACX,CAAC;YAEL,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACT,uCAAuC;gBACvC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YACxC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,sDAAsD;QAC1D,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,cAAc,CAAC,IAAY,EAAE,IAAS,EAAE,EAAU;QAC5D,IAAI,CAAC;YACD,IAAI,MAAM,GAAQ,IAAI,CAAC;YAEvB,IAAI,IAAI,KAAK,gBAAgB,EAAE,CAAC;gBAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;gBACpE,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;gBAE5E,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;oBAChC,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,IAAI,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM;oBAChD,IAAI,EAAE,CAAC,CAAC,2BAA2B;iBACtC,CAAC,CAAC,CAAC;gBAEJ,MAAM,GAAG,EAAE,KAAK,EAAE,CAAC;YACvB,CAAC;iBAEI,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;gBAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACzC,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBAC9D,MAAM,GAAG,EAAE,OAAO,EAAE,CAAC;YACzB,CAAC;iBACI,CAAC;gBACF,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC;YAC7C,CAAC;YAED,IAAI,CAAC,iBAAiB,CAAC,aAAa,EAAE;gBAClC,EAAE;gBACF,MAAM;aACT,CAAC,CAAC;QAEP,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YAClB,IAAI,CAAC,iBAAiB,CAAC,aAAa,EAAE;gBAClC,EAAE;gBACF,KAAK,EAAE,KAAK,CAAC,OAAO;gBACpB,IAAI,EAAE,OAAO;aAChB,CAAC,CAAC;QACP,CAAC;IACL,CAAC;IAED,2BAA2B;IACnB,iBAAiB,CAAC,IAAY,EAAE,IAAS;QAC7C,IAAI,UAAU,GAAG,EAAE,CAAC;QAEpB,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;YAC5C,qBAAqB;YACrB,yDAAyD;YACzD,kEAAkE;YAClE,qGAAqG;YACrG,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;gBACzB,yDAAyD;gBACzD,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;oBACxB,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;gBAC7C,CAAC;qBAAM,CAAC;oBACJ,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;gBAC7D,CAAC;YACL,CAAC;iBAAM,CAAC;gBACJ,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YACtC,CAAC;QACL,CAAC;aAAM,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;YAC9B,+CAA+C;YAC/C,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC3B,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YAChE,CAAC;iBAAM,CAAC;gBACJ,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YACtC,CAAC;QACL,CAAC;QAED,wDAAwD;QACxD,IAAI,CAAC,UAAU;YAAE,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAEnD,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC,QAAQ,EAAE,CAAC;QAElF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE;YAC3B,IAAI,EAAE,IAAI,CAAC,MAAM;YACjB,OAAO,EAAE,EAAE,CAAC,EAAE,SAAS,EAAE;SAC5B,CAAC,CAAC;IACP,CAAC;IAEO,WAAW;QACf,MAAM,IAAI,GAAG;YACT,IAAI,EAAE,WAAW;YACjB,QAAQ,EAAE,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ;YAChC,QAAQ,EAAE,EAAE,CAAC,QAAQ,EAAE;YACvB,QAAQ,EAAE,EAAE,CAAC,QAAQ,EAAE;YACvB,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;SACrB,CAAC;QACF,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACzC,CAAC;IAEO,WAAW;QACf,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC,CAAC;QACvE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC,CAAC;QAE1E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,0CAA0C,CAAC,CAAC,CAAC;QACtE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,0CAA0C,CAAC,CAAC,CAAC;QACtE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,0CAA0C,CAAC,CAAC,CAAC;QACtE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;QAC9I,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,0CAA0C,CAAC,CAAC,CAAC;QACtE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,0CAA0C,CAAC,CAAC,CAAC;QACtE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC,CAAC;IAClE,CAAC;CACJ"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mobilecoder-mcp",
3
- "version": "2.0.0",
3
+ "version": "2.0.1",
4
4
  "description": "Secure Zero-Knowledge Terminal Relay for MobileCoder",
5
5
  "main": "dist/agent.js",
6
6
  "bin": {
package/src/agent.ts CHANGED
@@ -5,6 +5,8 @@ import * as pty from 'node-pty';
5
5
  import CryptoJS from 'crypto-js';
6
6
  import chalk from 'chalk';
7
7
  import ora from 'ora';
8
+ import * as fs from 'fs';
9
+ import * as path from 'path';
8
10
 
9
11
  // 🚨 BURAYI KENDİ DOMAIN ADRESİNLE DEĞİŞTİR!
10
12
  const RELAY_SERVER_URL = 'https://api.mobilecoder.xyz';
@@ -69,8 +71,6 @@ export class ZKRelayAgent {
69
71
 
70
72
  // Odaya Katıl (Sadece Hash ID gönderilir)
71
73
  this.socket.emit('join_room', { code: this.roomId, type: 'agent' });
72
- // Note: Changed 'join_secure_room' to 'join_room' to match server implementation
73
- // Server implementation in index.ts: socket.on('join_room', (data: { code: string; type: 'agent' | 'client' }) => ...)
74
74
 
75
75
  this.printBanner();
76
76
  });
@@ -80,34 +80,13 @@ export class ZKRelayAgent {
80
80
  });
81
81
 
82
82
  // Mobilden biri bağlandığında
83
- this.socket.on('peer_joined', () => { // Changed peer_connected to peer_joined based on server impl
83
+ this.socket.on('peer_joined', () => {
84
84
  console.log(chalk.green('\n📱 Mobile Client Connected via Encrypted Tunnel!'));
85
85
  this.sendEnvInfo();
86
86
  });
87
87
 
88
88
  // Mobilden şifreli veri geldiğinde
89
- // RelayManager emits 'term_data' and 'meta_data'.
90
- // Server implementation:
91
- // socket.on('term_data', ...) -> pass through term_data
92
- // socket.on('meta_data', ...) -> pass through meta_data
93
- // Agent connects to /, Server index.ts uses / (global namespace) BUT has:
94
- // const relayNamespace = io.of('/terminal');
95
- // WAIT. Previous user setup had /terminal.
96
- // My previous edit REMOVED /terminal and used RelayManager on root io.
97
- // But RelayManager implementation listens on 'relay_data'.
98
- // My RelayManager uses: socket.on('relay_data', ...)
99
- // But user snippet provided for Agent uses 'relay_encrypted' and listens on 'stream_encrypted'.
100
- // I need to align Agent and Server.
101
- // The previous edit to server/index.ts instantiates RelayManager.
102
- // RelayManager listens to 'relay_data'.
103
- // So the Agent MUST emit 'relay_data'.
104
-
105
89
  this.socket.on('relay_data', (message: { room: string, payload: any }) => {
106
- // RelayManager checks payload structure?
107
- // Wait, RelayManager implementation:
108
- // socket.on('relay_data', (data) => { ... socket.to(room).emit('relay_data', data.payload) ... })
109
- // So client receives `payload`.
110
- // If payload is encrypted string, handle it.
111
90
  this.handleIncomingMessage(message as any);
112
91
  });
113
92
 
@@ -134,15 +113,37 @@ export class ZKRelayAgent {
134
113
  // Veri JSON mu? (Resize komutu vs olabilir)
135
114
  try {
136
115
  const cmd = JSON.parse(originalText);
116
+
117
+ // 1. Terminal Input (Keystrokes)
118
+ if (cmd.type === 'input') {
119
+ this.ptyProcess.write(cmd.data);
120
+ return;
121
+ }
122
+
123
+ // 2. Terminal Resize
137
124
  if (cmd.type === 'resize') {
138
125
  this.ptyProcess.resize(cmd.cols, cmd.rows);
139
126
  return;
140
127
  }
141
- if (cmd.type === 'input') {
142
- this.ptyProcess.write(cmd.data);
128
+
129
+ // 3. Chat Commands (e.g. "ls -la")
130
+ if (cmd.type === 'command') {
131
+ this.ptyProcess.write(cmd.text + '\r');
143
132
  return;
144
133
  }
145
- // Fallback checks
134
+
135
+ // 4. CLI Tool/Button Commands (e.g. "git status")
136
+ if (cmd.type === 'cli_command') {
137
+ this.ptyProcess.write(cmd.command + '\r');
138
+ return;
139
+ }
140
+
141
+ // 5. Tool Calls (File System Access)
142
+ if (cmd.type === 'tool_call') {
143
+ this.handleToolCall(cmd.tool, cmd.data, cmd.id);
144
+ return;
145
+ }
146
+
146
147
  } catch (e) {
147
148
  // JSON değilse saf terminal girdisidir
148
149
  this.ptyProcess.write(originalText);
@@ -152,22 +153,79 @@ export class ZKRelayAgent {
152
153
  }
153
154
  }
154
155
 
156
+ private async handleToolCall(tool: string, args: any, id: string) {
157
+ try {
158
+ let result: any = null;
159
+
160
+ if (tool === 'list_directory') {
161
+ const dirPath = args.path ? path.resolve(args.path) : process.cwd();
162
+ const entries = await fs.promises.readdir(dirPath, { withFileTypes: true });
163
+
164
+ const files = entries.map(entry => ({
165
+ name: entry.name,
166
+ type: entry.isDirectory() ? 'directory' : 'file',
167
+ size: 0 // Simplification for speed
168
+ }));
169
+
170
+ result = { files };
171
+ }
172
+
173
+ else if (tool === 'read_file') {
174
+ const filePath = path.resolve(args.path);
175
+ const content = await fs.promises.readFile(filePath, 'utf-8');
176
+ result = { content };
177
+ }
178
+ else {
179
+ throw new Error(`Unknown tool: ${tool}`);
180
+ }
181
+
182
+ this.sendSecurePayload('tool_result', {
183
+ id,
184
+ result
185
+ });
186
+
187
+ } catch (error: any) {
188
+ this.sendSecurePayload('tool_result', {
189
+ id,
190
+ error: error.message,
191
+ type: 'error'
192
+ });
193
+ }
194
+ }
195
+
155
196
  // Veriyi şifrele ve gönder
156
197
  private sendSecurePayload(type: string, data: any) {
157
- let payloadStr = data;
158
- if (type === 'meta') {
198
+ let payloadStr = '';
199
+
200
+ if (type === 'meta' || type === 'tool_result') {
159
201
  // Standardize format
160
- payloadStr = JSON.stringify(data);
161
- } else if (type === 'term_data' && typeof data === 'string') {
162
- // Wrap output in { type: 'output', data: ... } for client consistency if client expects JSON
163
- // The Client handles { type: 'output' ... }
164
- payloadStr = JSON.stringify({ type: 'output', data: data });
202
+ // For tool_result, data already contains id/result/error
203
+ // We wrap it in the top level object structure expected by client
204
+ // Client expects: { type: 'result', id: ..., result: ... } OR { type: 'error', id: ..., error: ... }
205
+ if (type === 'tool_result') {
206
+ // data is { id, result } or { id, error, type: 'error' }
207
+ if (data.type === 'error') {
208
+ payloadStr = JSON.stringify({ ...data });
209
+ } else {
210
+ payloadStr = JSON.stringify({ type: 'result', ...data });
211
+ }
212
+ } else {
213
+ payloadStr = JSON.stringify(data);
214
+ }
215
+ } else if (type === 'term_data') {
216
+ // Wrap output in { type: 'output', data: ... }
217
+ if (typeof data === 'string') {
218
+ payloadStr = JSON.stringify({ type: 'output', data: data });
219
+ } else {
220
+ payloadStr = JSON.stringify(data);
221
+ }
165
222
  }
166
223
 
224
+ // Fallback if empty (shouldn't happen with above logic)
225
+ if (!payloadStr) payloadStr = JSON.stringify(data);
226
+
167
227
  const encrypted = CryptoJS.AES.encrypt(payloadStr, this.encryptionKey).toString();
168
228
 
169
- // RelayManager expects 'relay_data' event with { room, payload }
170
- // It emits 'relay_data' with just payload to other peer.
171
229
  this.socket.emit('relay_data', {
172
230
  room: this.roomId,
173
231
  payload: { e: encrypted }
@@ -176,9 +234,9 @@ export class ZKRelayAgent {
176
234
 
177
235
  private sendEnvInfo() {
178
236
  const info = {
179
- type: 'host_info', // Changed to match client expectation
180
- username: os.userInfo().username, // user -> username
181
- hostname: os.hostname(), // host -> hostname
237
+ type: 'host_info',
238
+ username: os.userInfo().username,
239
+ hostname: os.hostname(),
182
240
  platform: os.platform(),
183
241
  cwd: process.cwd()
184
242
  };
@@ -186,7 +244,7 @@ export class ZKRelayAgent {
186
244
  }
187
245
 
188
246
  private printBanner() {
189
- console.log('\n' + chalk.bgBlue.bold(' MOBILECODER ZK-RELAY v2.0 '));
247
+ console.log('\n' + chalk.bgBlue.bold(' MOBILECODER ZK-RELAY v2.0.1 '));
190
248
  console.log(chalk.gray('Secure, End-to-End Encrypted Terminal Bridge\n'));
191
249
 
192
250
  console.log(chalk.yellow('┌──────────────────────────────────────┐'));