opencode-mobile 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/bin/audit +31 -0
  2. package/bin/qr +13 -0
  3. package/dist/index.d.ts +11 -4
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.js +545 -5
  6. package/dist/index.js.map +1 -1
  7. package/dist/src/cli/endpoint-tester.d.ts +19 -0
  8. package/dist/src/cli/endpoint-tester.d.ts.map +1 -0
  9. package/dist/src/cli/endpoint-tester.js +233 -0
  10. package/dist/src/cli/endpoint-tester.js.map +1 -0
  11. package/dist/src/cli/index.d.ts +20 -0
  12. package/dist/src/cli/index.d.ts.map +1 -0
  13. package/dist/src/cli/index.js +166 -0
  14. package/dist/src/cli/index.js.map +1 -0
  15. package/dist/src/cli/push-tester.d.ts +16 -0
  16. package/dist/src/cli/push-tester.d.ts.map +1 -0
  17. package/dist/src/cli/push-tester.js +293 -0
  18. package/dist/src/cli/push-tester.js.map +1 -0
  19. package/dist/src/cli/qr.d.ts +5 -0
  20. package/dist/src/cli/qr.d.ts.map +1 -0
  21. package/dist/src/cli/qr.js +127 -0
  22. package/dist/src/cli/qr.js.map +1 -0
  23. package/dist/src/cli/report.d.ts +25 -0
  24. package/dist/src/cli/report.d.ts.map +1 -0
  25. package/dist/src/cli/report.js +215 -0
  26. package/dist/src/cli/report.js.map +1 -0
  27. package/dist/src/cli/server-manager.d.ts +28 -0
  28. package/dist/src/cli/server-manager.d.ts.map +1 -0
  29. package/dist/src/cli/server-manager.js +340 -0
  30. package/dist/src/cli/server-manager.js.map +1 -0
  31. package/dist/src/cli/test-runner.d.ts +16 -0
  32. package/dist/src/cli/test-runner.d.ts.map +1 -0
  33. package/dist/src/cli/test-runner.js +201 -0
  34. package/dist/src/cli/test-runner.js.map +1 -0
  35. package/dist/src/cli/tunnel-qr.d.ts +8 -0
  36. package/dist/src/cli/tunnel-qr.d.ts.map +1 -0
  37. package/dist/src/cli/tunnel-qr.js +163 -0
  38. package/dist/src/cli/tunnel-qr.js.map +1 -0
  39. package/dist/src/cli/tunnel-tester.d.ts +22 -0
  40. package/dist/src/cli/tunnel-tester.d.ts.map +1 -0
  41. package/dist/src/cli/tunnel-tester.js +360 -0
  42. package/dist/src/cli/tunnel-tester.js.map +1 -0
  43. package/dist/src/cli/types.d.ts +112 -0
  44. package/dist/src/cli/types.d.ts.map +1 -0
  45. package/dist/src/cli/types.js +5 -0
  46. package/dist/src/cli/types.js.map +1 -0
  47. package/dist/src/push/index.d.ts +1 -0
  48. package/dist/src/push/index.d.ts.map +1 -1
  49. package/dist/src/push/index.js +1 -0
  50. package/dist/src/push/index.js.map +1 -1
  51. package/dist/src/push/notification-handler.d.ts +58 -0
  52. package/dist/src/push/notification-handler.d.ts.map +1 -0
  53. package/dist/src/push/notification-handler.js +110 -0
  54. package/dist/src/push/notification-handler.js.map +1 -0
  55. package/dist/src/tunnel/cloudflare.d.ts +32 -3
  56. package/dist/src/tunnel/cloudflare.d.ts.map +1 -1
  57. package/dist/src/tunnel/cloudflare.js +102 -32
  58. package/dist/src/tunnel/cloudflare.js.map +1 -1
  59. package/dist/src/tunnel/localtunnel.d.ts +28 -1
  60. package/dist/src/tunnel/localtunnel.d.ts.map +1 -1
  61. package/dist/src/tunnel/localtunnel.js +53 -11
  62. package/dist/src/tunnel/localtunnel.js.map +1 -1
  63. package/dist/src/tunnel/metadata.d.ts +29 -0
  64. package/dist/src/tunnel/metadata.d.ts.map +1 -0
  65. package/dist/src/tunnel/metadata.js +83 -0
  66. package/dist/src/tunnel/metadata.js.map +1 -0
  67. package/dist/src/tunnel/ngrok.d.ts +12 -0
  68. package/dist/src/tunnel/ngrok.d.ts.map +1 -1
  69. package/dist/src/tunnel/ngrok.js +72 -29
  70. package/dist/src/tunnel/ngrok.js.map +1 -1
  71. package/dist/src/tunnel/qrcode.d.ts +8 -0
  72. package/dist/src/tunnel/qrcode.d.ts.map +1 -1
  73. package/dist/src/tunnel/qrcode.js +60 -9
  74. package/dist/src/tunnel/qrcode.js.map +1 -1
  75. package/package.json +21 -3
  76. package/dist/push-notifications.d.ts +0 -4
  77. package/dist/push-notifications.d.ts.map +0 -1
  78. package/dist/push-notifications.js +0 -260
  79. package/dist/push-notifications.js.map +0 -1
  80. package/dist/reverse-proxy.d.ts +0 -9
  81. package/dist/reverse-proxy.d.ts.map +0 -1
  82. package/dist/reverse-proxy.js +0 -78
  83. package/dist/reverse-proxy.js.map +0 -1
  84. package/dist/sdk-logger.d.ts +0 -19
  85. package/dist/sdk-logger.d.ts.map +0 -1
  86. package/dist/sdk-logger.js +0 -103
  87. package/dist/sdk-logger.js.map +0 -1
  88. package/dist/src/tunnel/index.d.ts +0 -35
  89. package/dist/src/tunnel/index.d.ts.map +0 -1
  90. package/dist/src/tunnel/index.js +0 -191
  91. package/dist/src/tunnel/index.js.map +0 -1
  92. package/dist/src/utils/index.d.ts +0 -5
  93. package/dist/src/utils/index.d.ts.map +0 -1
  94. package/dist/src/utils/index.js +0 -5
  95. package/dist/src/utils/index.js.map +0 -1
  96. package/dist/src/utils/port.d.ts +0 -12
  97. package/dist/src/utils/port.d.ts.map +0 -1
  98. package/dist/src/utils/port.js +0 -41
  99. package/dist/src/utils/port.js.map +0 -1
@@ -0,0 +1,293 @@
1
+ /**
2
+ * Push notification tester - token store and Expo API
3
+ */
4
+ import { loadTokens, saveTokens } from "../push/token-store.js";
5
+ const EXPO_PUSH_URL = "https://exp.host/--/api/v2/push/send";
6
+ /**
7
+ * Test push notification functionality
8
+ */
9
+ export async function testPush(_options) {
10
+ const results = [];
11
+ const result = {
12
+ tokenStore: {
13
+ readable: false,
14
+ writable: false,
15
+ initialCount: 0,
16
+ },
17
+ expoApi: {
18
+ reachable: false,
19
+ },
20
+ tokenOperations: {
21
+ register: false,
22
+ retrieve: false,
23
+ delete: false,
24
+ },
25
+ };
26
+ // Test 1: Check token store readability
27
+ const startRead = Date.now();
28
+ try {
29
+ const tokens = loadTokens();
30
+ result.tokenStore.readable = true;
31
+ result.tokenStore.initialCount = tokens.length;
32
+ results.push({
33
+ name: "push: Token Store Readable",
34
+ category: "push",
35
+ status: "pass",
36
+ message: `Found ${tokens.length} token(s)`,
37
+ duration: Date.now() - startRead,
38
+ });
39
+ }
40
+ catch (error) {
41
+ const errorMessage = error instanceof Error ? error.message : String(error);
42
+ results.push({
43
+ name: "push: Token Store Readable",
44
+ category: "push",
45
+ status: "fail",
46
+ message: `Failed to read: ${errorMessage}`,
47
+ duration: Date.now() - startRead,
48
+ error: errorMessage,
49
+ });
50
+ }
51
+ // Test 2: Check token store writability
52
+ const startWrite = Date.now();
53
+ try {
54
+ const testDeviceId = `audit-test-${Date.now()}`;
55
+ const testToken = "audit-test-token";
56
+ const tokens = loadTokens();
57
+ const idx = tokens.findIndex((t) => t.deviceId === testDeviceId);
58
+ const newToken = {
59
+ token: testToken,
60
+ platform: "ios",
61
+ deviceId: testDeviceId,
62
+ registeredAt: new Date().toISOString(),
63
+ };
64
+ if (idx >= 0)
65
+ tokens[idx] = newToken;
66
+ else
67
+ tokens.push(newToken);
68
+ saveTokens(tokens);
69
+ result.tokenStore.writable = true;
70
+ results.push({
71
+ name: "push: Token Store Writable",
72
+ category: "push",
73
+ status: "pass",
74
+ message: "Successfully wrote test token",
75
+ duration: Date.now() - startWrite,
76
+ });
77
+ }
78
+ catch (error) {
79
+ const errorMessage = error instanceof Error ? error.message : String(error);
80
+ results.push({
81
+ name: "push: Token Store Writable",
82
+ category: "push",
83
+ status: "fail",
84
+ message: `Failed to write: ${errorMessage}`,
85
+ duration: Date.now() - startWrite,
86
+ error: errorMessage,
87
+ });
88
+ }
89
+ // Test 3: Token operations - register
90
+ const startRegister = Date.now();
91
+ try {
92
+ const testDeviceId = `audit-register-${Date.now()}`;
93
+ const testToken = "audit-register-token";
94
+ const tokens = loadTokens();
95
+ const newToken = {
96
+ token: testToken,
97
+ platform: "ios",
98
+ deviceId: testDeviceId,
99
+ registeredAt: new Date().toISOString(),
100
+ };
101
+ tokens.push(newToken);
102
+ saveTokens(tokens);
103
+ // Verify it was saved
104
+ const verifyTokens = loadTokens();
105
+ const found = verifyTokens.some((t) => t.deviceId === testDeviceId);
106
+ result.tokenOperations.register = found;
107
+ results.push({
108
+ name: "push: Token Register",
109
+ category: "push",
110
+ status: found ? "pass" : "fail",
111
+ message: found
112
+ ? "Token registered successfully"
113
+ : "Token registration verification failed",
114
+ duration: Date.now() - startRegister,
115
+ });
116
+ }
117
+ catch (error) {
118
+ const errorMessage = error instanceof Error ? error.message : String(error);
119
+ results.push({
120
+ name: "push: Token Register",
121
+ category: "push",
122
+ status: "fail",
123
+ message: `Failed: ${errorMessage}`,
124
+ duration: Date.now() - startRegister,
125
+ error: errorMessage,
126
+ });
127
+ }
128
+ // Test 4: Token operations - retrieve
129
+ const startRetrieve = Date.now();
130
+ try {
131
+ const tokens = loadTokens();
132
+ result.tokenOperations.retrieve = tokens.length >= 0;
133
+ results.push({
134
+ name: "push: Token Retrieve",
135
+ category: "push",
136
+ status: "pass",
137
+ message: `Retrieved ${tokens.length} token(s)`,
138
+ duration: Date.now() - startRetrieve,
139
+ });
140
+ }
141
+ catch (error) {
142
+ const errorMessage = error instanceof Error ? error.message : String(error);
143
+ results.push({
144
+ name: "push: Token Retrieve",
145
+ category: "push",
146
+ status: "fail",
147
+ message: `Failed: ${errorMessage}`,
148
+ duration: Date.now() - startRetrieve,
149
+ error: errorMessage,
150
+ });
151
+ }
152
+ // Test 5: Token operations - delete
153
+ const startDelete = Date.now();
154
+ try {
155
+ const testDeviceId = `audit-register-${Date.now()}`;
156
+ const tokens = loadTokens();
157
+ const filtered = tokens.filter((t) => t.deviceId !== testDeviceId);
158
+ saveTokens(filtered);
159
+ // Verify deletion
160
+ const verifyTokens = loadTokens();
161
+ const found = verifyTokens.some((t) => t.deviceId === testDeviceId);
162
+ result.tokenOperations.delete = !found;
163
+ results.push({
164
+ name: "push: Token Delete",
165
+ category: "push",
166
+ status: !found ? "pass" : "fail",
167
+ message: !found
168
+ ? "Token deleted successfully"
169
+ : "Token deletion verification failed",
170
+ duration: Date.now() - startDelete,
171
+ });
172
+ }
173
+ catch (error) {
174
+ const errorMessage = error instanceof Error ? error.message : String(error);
175
+ results.push({
176
+ name: "push: Token Delete",
177
+ category: "push",
178
+ status: "fail",
179
+ message: `Failed: ${errorMessage}`,
180
+ duration: Date.now() - startDelete,
181
+ error: errorMessage,
182
+ });
183
+ }
184
+ // Test 6: Expo API reachability
185
+ const startExpo = Date.now();
186
+ try {
187
+ const controller = new AbortController();
188
+ const timeoutId = setTimeout(() => controller.abort(), 10000);
189
+ const response = await fetch(EXPO_PUSH_URL, {
190
+ method: "POST",
191
+ headers: { "Content-Type": "application/json" },
192
+ body: JSON.stringify([
193
+ {
194
+ to: "ExponentPushToken[xxxxxxxxxxxxxxxxxxxxxx]",
195
+ title: "Audit Test",
196
+ body: "This is a test - please ignore",
197
+ },
198
+ ]),
199
+ signal: controller.signal,
200
+ });
201
+ clearTimeout(timeoutId);
202
+ const responseTime = Date.now() - startExpo;
203
+ result.expoApi.reachable = true;
204
+ result.expoApi.responseTime = responseTime;
205
+ // Check if it's an auth error (token invalid) vs network error
206
+ const text = await response.text();
207
+ const isAuthError = text.includes("DeviceNotRegistered") ||
208
+ text.includes("InvalidCredentials");
209
+ if (response.status === 200 || (response.status === 400 && isAuthError)) {
210
+ results.push({
211
+ name: "push: Expo API",
212
+ category: "push",
213
+ status: "pass",
214
+ message: `API reachable (${response.status}) - ${responseTime}ms`,
215
+ duration: responseTime,
216
+ });
217
+ }
218
+ else {
219
+ results.push({
220
+ name: "push: Expo API",
221
+ category: "push",
222
+ status: "warn",
223
+ message: `API returned ${response.status}`,
224
+ duration: responseTime,
225
+ });
226
+ }
227
+ }
228
+ catch (error) {
229
+ const errorMessage = error instanceof Error ? error.message : String(error);
230
+ const duration = Date.now() - startExpo;
231
+ result.expoApi.reachable = false;
232
+ result.expoApi.error = errorMessage;
233
+ // Check for specific error types
234
+ if (errorMessage.includes("aborted")) {
235
+ results.push({
236
+ name: "push: Expo API",
237
+ category: "push",
238
+ status: "fail",
239
+ message: "Request timed out (10s)",
240
+ duration,
241
+ });
242
+ }
243
+ else if (errorMessage.includes("ENOTFOUND") || errorMessage.includes("EAI_AGAIN")) {
244
+ results.push({
245
+ name: "push: Expo API",
246
+ category: "push",
247
+ status: "fail",
248
+ message: "DNS resolution failed - check internet connection",
249
+ duration,
250
+ });
251
+ }
252
+ else {
253
+ results.push({
254
+ name: "push: Expo API",
255
+ category: "push",
256
+ status: "fail",
257
+ message: `Connection failed: ${errorMessage}`,
258
+ duration,
259
+ error: errorMessage,
260
+ });
261
+ }
262
+ }
263
+ return { result, results };
264
+ }
265
+ /**
266
+ * Generate push notification recommendations
267
+ */
268
+ export function getPushRecommendations(result) {
269
+ const recommendations = [];
270
+ if (!result.tokenStore.readable) {
271
+ recommendations.push("Token store is not readable. Check file permissions in ~/.config/opencode/");
272
+ }
273
+ if (!result.tokenStore.writable) {
274
+ recommendations.push("Token store is not writable. Check write permissions in ~/.config/opencode/");
275
+ }
276
+ if (!result.expoApi.reachable) {
277
+ recommendations.push("Expo API is not reachable. Check internet connection and firewall settings.");
278
+ }
279
+ else if (result.expoApi.responseTime && result.expoApi.responseTime > 5000) {
280
+ recommendations.push(`Expo API response time is high (${result.expoApi.responseTime}ms). Consider checking network latency.`);
281
+ }
282
+ if (!result.tokenOperations.register) {
283
+ recommendations.push("Token registration is failing. Check token format and device ID.");
284
+ }
285
+ if (!result.tokenOperations.delete) {
286
+ recommendations.push("Token deletion is failing. Check file permissions.");
287
+ }
288
+ if (result.tokenStore.initialCount === 0) {
289
+ recommendations.push("No tokens registered. Register a device before testing push notifications.");
290
+ }
291
+ return recommendations;
292
+ }
293
+ //# sourceMappingURL=push-tester.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"push-tester.js","sourceRoot":"","sources":["../../../src/cli/push-tester.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * CLI utility to render tunnel QR code from a JSON file
3
+ */
4
+ export declare function main(args?: string[]): Promise<void>;
5
+ //# sourceMappingURL=qr.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qr.d.ts","sourceRoot":"","sources":["../../../src/cli/qr.ts"],"names":[],"mappings":"AAAA;;GAEG;AAiHH,wBAAsB,IAAI,CAAC,IAAI,GAAE,MAAM,EAA0B,GAAG,OAAO,CAAC,IAAI,CAAC,CAoChF"}
@@ -0,0 +1,127 @@
1
+ /**
2
+ * CLI utility to render tunnel QR code from a JSON file
3
+ */
4
+ import * as fs from 'fs';
5
+ import * as path from 'path';
6
+ import { generateQRCodeAscii } from '../tunnel/qrcode.js';
7
+ const URL_KEYS = [
8
+ 'url',
9
+ 'tunnelUrl',
10
+ 'tunnel_url',
11
+ 'publicUrl',
12
+ 'public_url',
13
+ 'tunnel',
14
+ 'public',
15
+ ];
16
+ function parseArgs(args) {
17
+ const result = {};
18
+ for (let i = 0; i < args.length; i += 1) {
19
+ const arg = args[i];
20
+ if (arg === '--help' || arg === '-h') {
21
+ result.help = true;
22
+ continue;
23
+ }
24
+ if (arg === '--file' || arg === '-f') {
25
+ if (i + 1 < args.length) {
26
+ i += 1;
27
+ result.filePath = args[i];
28
+ }
29
+ continue;
30
+ }
31
+ if (arg.startsWith('-')) {
32
+ continue;
33
+ }
34
+ if (!result.filePath) {
35
+ result.filePath = arg;
36
+ }
37
+ }
38
+ return result;
39
+ }
40
+ function showHelp() {
41
+ console.log(`
42
+ OpenCode Mobile - Tunnel QR Utility
43
+
44
+ USAGE:
45
+ npx opencode-mobile qr <path-to-tunnels.json>
46
+ npx opencode-mobile qr --file <path-to-tunnels.json>
47
+
48
+ OPTIONS:
49
+ -f, --file Path to tunnels.json
50
+ -h, --help Show this help message
51
+
52
+ OUTPUT:
53
+ Prints an ASCII QR code and the tunnel URL.
54
+ `);
55
+ }
56
+ function isUrlString(value) {
57
+ return typeof value === 'string' && value.startsWith('http');
58
+ }
59
+ function findUrlFromValue(value, depth = 0) {
60
+ if (depth > 6) {
61
+ return null;
62
+ }
63
+ if (isUrlString(value)) {
64
+ return value;
65
+ }
66
+ if (Array.isArray(value)) {
67
+ for (const item of value) {
68
+ const found = findUrlFromValue(item, depth + 1);
69
+ if (found) {
70
+ return found;
71
+ }
72
+ }
73
+ return null;
74
+ }
75
+ if (value && typeof value === 'object') {
76
+ const record = value;
77
+ for (const key of URL_KEYS) {
78
+ if (isUrlString(record[key])) {
79
+ return record[key];
80
+ }
81
+ }
82
+ for (const key of Object.keys(record)) {
83
+ const found = findUrlFromValue(record[key], depth + 1);
84
+ if (found) {
85
+ return found;
86
+ }
87
+ }
88
+ }
89
+ return null;
90
+ }
91
+ export async function main(args = process.argv.slice(2)) {
92
+ const parsed = parseArgs(args);
93
+ if (parsed.help || !parsed.filePath) {
94
+ showHelp();
95
+ process.exit(parsed.help ? 0 : 1);
96
+ }
97
+ const resolvedPath = path.resolve(process.cwd(), parsed.filePath);
98
+ if (!fs.existsSync(resolvedPath)) {
99
+ console.error(`[QR] File not found: ${resolvedPath}`);
100
+ process.exit(1);
101
+ }
102
+ try {
103
+ const raw = fs.readFileSync(resolvedPath, 'utf-8');
104
+ const data = JSON.parse(raw);
105
+ const url = findUrlFromValue(data);
106
+ if (!url) {
107
+ console.error('[QR] No tunnel URL found in provided JSON.');
108
+ process.exit(1);
109
+ }
110
+ const qr = await generateQRCodeAscii(url);
111
+ if (qr) {
112
+ console.log(`${qr}\n${url}`);
113
+ }
114
+ else {
115
+ console.log(url);
116
+ }
117
+ }
118
+ catch (error) {
119
+ const message = error instanceof Error ? error.message : String(error);
120
+ console.error(`[QR] Failed to read tunnel JSON: ${message}`);
121
+ process.exit(1);
122
+ }
123
+ }
124
+ if (import.meta.main) {
125
+ main();
126
+ }
127
+ //# sourceMappingURL=qr.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qr.js","sourceRoot":"","sources":["../../../src/cli/qr.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Report generator for audit results
3
+ */
4
+ import type { AuditReport, TestResult } from "./types.js";
5
+ /**
6
+ * Generate console report
7
+ */
8
+ export declare function generateConsoleReport(report: AuditReport): string;
9
+ /**
10
+ * Generate JSON report
11
+ */
12
+ export declare function generateJsonReport(report: AuditReport): string;
13
+ /**
14
+ * Save report to file
15
+ */
16
+ export declare function saveReport(report: AuditReport, format?: "console" | "json", outputPath?: string): string;
17
+ /**
18
+ * Print report to console
19
+ */
20
+ export declare function printReport(report: AuditReport, json?: boolean): void;
21
+ /**
22
+ * Format individual test result for verbose output
23
+ */
24
+ export declare function formatTestResult(result: TestResult): string;
25
+ //# sourceMappingURL=report.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../../src/cli/report.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EACV,WAAW,EACX,UAAU,EAKX,MAAM,YAAY,CAAC;AA6BpB;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAyKjE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAE9D;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,MAAM,EAAE,WAAW,EACnB,MAAM,GAAE,SAAS,GAAG,MAAkB,EACtC,UAAU,CAAC,EAAE,MAAM,GAClB,MAAM,CAiBR;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,WAAW,EACnB,IAAI,GAAE,OAAe,GACpB,IAAI,CAMN;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAa3D"}