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,201 @@
1
+ /**
2
+ * Test runner engine - orchestrates all audit tests
3
+ */
4
+ import { startServer, stopServer, getServerInfo } from "./server-manager.js";
5
+ import { testEndpoints } from "./endpoint-tester.js";
6
+ import { testTunnelProviders, compareTunnelProviders } from "./tunnel-tester.js";
7
+ import { testPush, getPushRecommendations } from "./push-tester.js";
8
+ /**
9
+ * Run all audit tests
10
+ */
11
+ export async function runAudit(options) {
12
+ const startTime = Date.now();
13
+ const allResults = [];
14
+ const recommendations = [];
15
+ console.log("[Audit] Starting comprehensive endpoint audit...");
16
+ // Determine which tests to run
17
+ const runServer = !options.connect;
18
+ const runEndpoints = !options.tunnelOnly;
19
+ const runTunnels = !options.endpointsOnly && !options.pushOnly;
20
+ const runPush = !options.endpointsOnly && !options.tunnelOnly;
21
+ let serverPort = options.port || 4096;
22
+ // Start server if needed
23
+ if (runServer && !options.connect) {
24
+ console.log("[Audit] Starting server...");
25
+ try {
26
+ const { port } = await startServer(options);
27
+ serverPort = port;
28
+ }
29
+ catch (error) {
30
+ const errorMessage = error instanceof Error ? error.message : String(error);
31
+ console.error(`[Audit] Failed to start server: ${errorMessage}`);
32
+ return createFailedReport(options, errorMessage, allResults);
33
+ }
34
+ }
35
+ else if (options.connect) {
36
+ // Parse connection string
37
+ const [host, port] = options.connect.split(":");
38
+ serverPort = parseInt(port || "4096", 10);
39
+ console.log(`[Audit] Connecting to existing server at ${options.connect}`);
40
+ }
41
+ // Wait a moment for server to be ready
42
+ await new Promise((resolve) => setTimeout(resolve, 500));
43
+ // Run server health check
44
+ let serverInfo;
45
+ try {
46
+ serverInfo = await getServerInfo(serverPort);
47
+ if (!serverInfo.reachable) {
48
+ allResults.push({
49
+ name: "Server: Reachable",
50
+ category: "server",
51
+ status: "fail",
52
+ message: `Server on port ${serverPort} is not responding`,
53
+ });
54
+ }
55
+ else {
56
+ allResults.push({
57
+ name: "Server: Reachable",
58
+ category: "server",
59
+ status: "pass",
60
+ message: `Server responding on port ${serverPort}`,
61
+ });
62
+ }
63
+ }
64
+ catch (error) {
65
+ const errorMessage = error instanceof Error ? error.message : String(error);
66
+ serverInfo = {
67
+ port: serverPort,
68
+ proxyPort: serverPort + 1,
69
+ reachable: false,
70
+ corsConfigured: false,
71
+ };
72
+ allResults.push({
73
+ name: "Server: Reachable",
74
+ category: "server",
75
+ status: "fail",
76
+ message: `Health check failed: ${errorMessage}`,
77
+ error: errorMessage,
78
+ });
79
+ }
80
+ // Run endpoint tests
81
+ let endpointTestsResult;
82
+ if (runEndpoints) {
83
+ console.log("[Audit] Testing endpoints...");
84
+ endpointTestsResult = await testEndpoints(serverPort, options);
85
+ allResults.push(...endpointTestsResult.results);
86
+ }
87
+ // Run tunnel tests
88
+ let tunnelResults;
89
+ if (runTunnels) {
90
+ console.log("[Audit] Testing tunnel providers...");
91
+ tunnelResults = await testTunnelProviders(serverPort, options);
92
+ allResults.push(...tunnelResults.results);
93
+ // Add tunnel provider recommendations
94
+ const tunnelRecs = compareTunnelProviders(tunnelResults);
95
+ recommendations.push(...tunnelRecs);
96
+ }
97
+ // Run push tests
98
+ let pushResults;
99
+ if (runPush) {
100
+ console.log("[Audit] Testing push notifications...");
101
+ pushResults = await testPush(options);
102
+ allResults.push(...pushResults.results);
103
+ // Add push recommendations
104
+ const pushRecs = getPushRecommendations(pushResults.result);
105
+ recommendations.push(...pushRecs);
106
+ }
107
+ // Stop server if we started it
108
+ if (runServer && options.connect === undefined && options.cleanup !== false) {
109
+ console.log("[Audit] Cleaning up...");
110
+ await stopServer();
111
+ }
112
+ // Calculate summary
113
+ const summary = calculateSummary(allResults);
114
+ // Build report
115
+ const report = {
116
+ timestamp: new Date().toISOString(),
117
+ options,
118
+ summary,
119
+ server: serverInfo,
120
+ endpoints: endpointTestsResult?.tests,
121
+ tunnels: tunnelResults
122
+ ? {
123
+ ngrok: tunnelResults.ngrok,
124
+ cloudflare: tunnelResults.cloudflare,
125
+ localtunnel: tunnelResults.localtunnel,
126
+ }
127
+ : undefined,
128
+ push: pushResults?.result,
129
+ results: allResults,
130
+ recommendations,
131
+ };
132
+ const totalDuration = Date.now() - startTime;
133
+ console.log(`[Audit] Audit completed in ${(totalDuration / 1000).toFixed(2)}s`);
134
+ return report;
135
+ }
136
+ /**
137
+ * Calculate test summary
138
+ */
139
+ function calculateSummary(results) {
140
+ const passed = results.filter((r) => r.status === "pass").length;
141
+ const failed = results.filter((r) => r.status === "fail").length;
142
+ const skipped = results.filter((r) => r.status === "skip").length;
143
+ const warnings = results.filter((r) => r.status === "warn").length;
144
+ const testsRun = passed + failed + warnings; // Skipped don't count as run
145
+ const score = testsRun > 0 ? (passed / testsRun) * 100 : 0;
146
+ return {
147
+ testsRun,
148
+ passed,
149
+ failed,
150
+ skipped,
151
+ warnings,
152
+ score,
153
+ };
154
+ }
155
+ /**
156
+ * Create a failed report when audit can't complete
157
+ */
158
+ function createFailedReport(options, error, results) {
159
+ return {
160
+ timestamp: new Date().toISOString(),
161
+ options,
162
+ summary: {
163
+ testsRun: 0,
164
+ passed: 0,
165
+ failed: 1,
166
+ skipped: 0,
167
+ warnings: 0,
168
+ score: 0,
169
+ },
170
+ results: [
171
+ ...results,
172
+ {
173
+ name: "Audit: Initialization",
174
+ category: "infrastructure",
175
+ status: "fail",
176
+ message: `Audit failed to initialize: ${error}`,
177
+ error,
178
+ },
179
+ ],
180
+ recommendations: [
181
+ "Check that the server can be started or an existing server is reachable",
182
+ "Verify all dependencies are installed",
183
+ ],
184
+ };
185
+ }
186
+ /**
187
+ * Run specific test category
188
+ */
189
+ export async function runCategoryTest(category, port, options) {
190
+ switch (category) {
191
+ case "endpoint":
192
+ return { results: (await testEndpoints(port, options)).results };
193
+ case "tunnel":
194
+ return { results: (await testTunnelProviders(port, options)).results };
195
+ case "push":
196
+ return { results: (await testPush(options)).results };
197
+ default:
198
+ return { results: [] };
199
+ }
200
+ }
201
+ //# sourceMappingURL=test-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-runner.js","sourceRoot":"","sources":["../../../src/cli/test-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Tunnel QR Code TUI Command
3
+ * Displays QR code for tunnel URL with interactive TUI
4
+ * Run with: npx opencode-mobile tunnel-qr
5
+ */
6
+ declare function main(): Promise<void>;
7
+ export { main };
8
+ //# sourceMappingURL=tunnel-qr.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tunnel-qr.d.ts","sourceRoot":"","sources":["../../../src/cli/tunnel-qr.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA0HH,iBAAe,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAyEnC;AAED,OAAO,EAAE,IAAI,EAAE,CAAC"}
@@ -0,0 +1,163 @@
1
+ /**
2
+ * Tunnel QR Code TUI Command
3
+ * Displays QR code for tunnel URL with interactive TUI
4
+ * Run with: npx opencode-mobile tunnel-qr
5
+ */
6
+ import * as fs from "fs";
7
+ import * as path from "path";
8
+ import { displayQRCode } from "../tunnel/qrcode.js";
9
+ const CONFIG_DIR = path.join(process.env.HOME || "", ".config/opencode");
10
+ const TUNNEL_METADATA_FILE = path.join(CONFIG_DIR, "tunnel.json");
11
+ function loadMetadata() {
12
+ try {
13
+ if (fs.existsSync(TUNNEL_METADATA_FILE)) {
14
+ const data = fs.readFileSync(TUNNEL_METADATA_FILE, "utf-8");
15
+ return JSON.parse(data);
16
+ }
17
+ }
18
+ catch (e) {
19
+ console.error("[TunnelQR] Failed to load metadata:", e);
20
+ }
21
+ return null;
22
+ }
23
+ function clearScreen() {
24
+ console.clear();
25
+ }
26
+ function drawBox(title, content) {
27
+ const lines = content.split("\n");
28
+ const maxWidth = Math.max(...lines.map((l) => l.length), title.length) + 4;
29
+ console.log("┌" + "─".repeat(maxWidth - 2) + "┐");
30
+ console.log("│ " + title.padEnd(maxWidth - 4) + " │");
31
+ console.log("├" + "─".repeat(maxWidth - 2) + "┤");
32
+ for (const line of lines) {
33
+ console.log("│ " + line.padEnd(maxWidth - 4) + " │");
34
+ }
35
+ console.log("└" + "─".repeat(maxWidth - 2) + "┘");
36
+ }
37
+ function formatTimestamp(ts) {
38
+ if (!ts)
39
+ return "Never";
40
+ const date = new Date(ts);
41
+ return date.toLocaleString();
42
+ }
43
+ async function showTUI(url) {
44
+ clearScreen();
45
+ console.log("");
46
+ console.log("═".repeat(60));
47
+ console.log(" 🔗 OpenCode Mobile - Tunnel QR Code");
48
+ console.log("═".repeat(60));
49
+ console.log("");
50
+ const metadata = loadMetadata();
51
+ if (metadata) {
52
+ console.log(" 📋 Tunnel Information:");
53
+ console.log(" ─".repeat(30));
54
+ console.log(` │ Provider: ${metadata.provider || "N/A"}`);
55
+ console.log(` │ URL: ${metadata.url || "N/A"}`);
56
+ console.log(` │ Tunnel ID: ${metadata.tunnelId || "N/A"}`);
57
+ console.log(` │ Local: localhost:${metadata.port || "N/A"}`);
58
+ console.log(` │ Target: localhost:${metadata.targetPort || "N/A"}`);
59
+ console.log(` │ Started: ${formatTimestamp(metadata.startedAt)}`);
60
+ console.log(` │ Updated: ${formatTimestamp(metadata.lastUpdated)}`);
61
+ console.log("");
62
+ }
63
+ console.log(" 📱 Scan to connect:");
64
+ console.log(" ─".repeat(30));
65
+ console.log("");
66
+ await displayQRCode(url);
67
+ console.log("");
68
+ console.log(" 💡 Tips:");
69
+ console.log(" ─".repeat(30));
70
+ console.log(" │ â€ĸ Point camera at QR code");
71
+ console.log(" │ â€ĸ Ensure mobile device is on same network");
72
+ console.log(" │ â€ĸ Tunnel connects directly to OpenCode server");
73
+ console.log(" │");
74
+ console.log(" │ Press Ctrl+C to exit");
75
+ console.log("");
76
+ console.log("═".repeat(60));
77
+ }
78
+ async function showNoTunnel() {
79
+ clearScreen();
80
+ console.log("");
81
+ console.log("═".repeat(60));
82
+ console.log(" 🔗 OpenCode Mobile - Tunnel QR Code");
83
+ console.log("═".repeat(60));
84
+ console.log("");
85
+ console.log(" ❌ No active tunnel found");
86
+ console.log("");
87
+ console.log(" 📋 To start a tunnel:");
88
+ console.log(" ─".repeat(30));
89
+ console.log(" │ 1. Start the plugin: bun run index.ts serve");
90
+ console.log(" │ 2. Or run: npx opencode-mobile tunnel");
91
+ console.log(" │ 3. The tunnel URL will be saved to:");
92
+ console.log(` │ ${TUNNEL_METADATA_FILE}`);
93
+ console.log("");
94
+ console.log(" 🔄 Then run this command again:");
95
+ console.log(" │ npx opencode-mobile tunnel-qr");
96
+ console.log("");
97
+ console.log("═".repeat(60));
98
+ }
99
+ async function main() {
100
+ const args = process.argv.slice(2);
101
+ if (args.includes("--help") || args.includes("-h")) {
102
+ console.log(`
103
+ OpenCode Mobile - Tunnel QR Code TUI
104
+
105
+ USAGE:
106
+ npx opencode-mobile tunnel-qr
107
+
108
+ DESCRIPTION:
109
+ Displays a QR code for the tunnel URL in an interactive TUI.
110
+ Reads tunnel metadata from .config/opencode/tunnel.json
111
+
112
+ OPTIONS:
113
+ -h, --help Show this help message
114
+ --refresh Refresh every 5 seconds (default: interactive)
115
+
116
+ EXAMPLES:
117
+ npx opencode-mobile tunnel-qr # Show QR code TUI
118
+ npx opencode-mobile tunnel-qr --help # Show help
119
+ `);
120
+ return;
121
+ }
122
+ const metadata = loadMetadata();
123
+ if (!metadata?.url) {
124
+ await showNoTunnel();
125
+ return;
126
+ }
127
+ const refresh = args.includes("--refresh");
128
+ if (refresh) {
129
+ let iterations = 0;
130
+ const maxIterations = 12; // 1 minute
131
+ while (iterations < maxIterations) {
132
+ const currentMetadata = loadMetadata();
133
+ if (!currentMetadata?.url) {
134
+ console.log("\n âšī¸ Tunnel closed. Exiting...");
135
+ break;
136
+ }
137
+ await showTUI(currentMetadata.url);
138
+ console.log(` 🔄 Auto-refresh: ${iterations + 1}/${maxIterations} (Ctrl+C to stop)`);
139
+ await new Promise((resolve) => setTimeout(resolve, 5000));
140
+ iterations++;
141
+ }
142
+ }
143
+ else {
144
+ await showTUI(metadata.url);
145
+ // Keep alive with signal handling
146
+ await new Promise((resolve) => {
147
+ const cleanup = () => {
148
+ console.log("\n 👋 Goodbye!");
149
+ resolve();
150
+ };
151
+ process.on("SIGINT", cleanup);
152
+ process.on("SIGTERM", cleanup);
153
+ // Exit after first display if not refreshing
154
+ setTimeout(() => {
155
+ process.removeListener("SIGINT", cleanup);
156
+ process.removeListener("SIGTERM", cleanup);
157
+ resolve();
158
+ }, 100);
159
+ });
160
+ }
161
+ }
162
+ export { main };
163
+ //# sourceMappingURL=tunnel-qr.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tunnel-qr.js","sourceRoot":"","sources":["../../../src/cli/tunnel-qr.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Tunnel provider tester - ngrok, cloudflare, localtunnel
3
+ */
4
+ import type { AuditOptions, TunnelTestResult, TestResult } from "./types.js";
5
+ /**
6
+ * Test all tunnel providers
7
+ */
8
+ export declare function testTunnelProviders(port: number, options: AuditOptions): Promise<{
9
+ ngrok?: TunnelTestResult;
10
+ cloudflare?: TunnelTestResult;
11
+ localtunnel?: TunnelTestResult;
12
+ results: TestResult[];
13
+ }>;
14
+ /**
15
+ * Compare tunnel providers and return recommendations
16
+ */
17
+ export declare function compareTunnelProviders(results: {
18
+ ngrok?: TunnelTestResult;
19
+ cloudflare?: TunnelTestResult;
20
+ localtunnel?: TunnelTestResult;
21
+ }): string[];
22
+ //# sourceMappingURL=tunnel-tester.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tunnel-tester.d.ts","sourceRoot":"","sources":["../../../src/cli/tunnel-tester.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,KAAK,EACV,YAAY,EACZ,gBAAgB,EAChB,UAAU,EACX,MAAM,YAAY,CAAC;AAcpB;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,YAAY,GACpB,OAAO,CAAC;IACT,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,OAAO,EAAE,UAAU,EAAE,CAAC;CACvB,CAAC,CAiBD;AAwTD;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE;IAC9C,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,WAAW,CAAC,EAAE,gBAAgB,CAAC;CAChC,GAAG,MAAM,EAAE,CA6CX"}