remodex-cli 1.0.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/LICENSE +12 -0
  2. package/README.md +105 -0
  3. package/dist/archive-store.d.ts +28 -0
  4. package/dist/archive-store.js +68 -0
  5. package/dist/archive-store.js.map +1 -0
  6. package/dist/cli.d.ts +2 -0
  7. package/dist/cli.js +88 -0
  8. package/dist/cli.js.map +1 -0
  9. package/dist/codex-process.d.ts +186 -0
  10. package/dist/codex-process.js +2111 -0
  11. package/dist/codex-process.js.map +1 -0
  12. package/dist/debug-trace-store.d.ts +15 -0
  13. package/dist/debug-trace-store.js +78 -0
  14. package/dist/debug-trace-store.js.map +1 -0
  15. package/dist/doctor.d.ts +58 -0
  16. package/dist/doctor.js +670 -0
  17. package/dist/doctor.js.map +1 -0
  18. package/dist/firebase-auth.d.ts +35 -0
  19. package/dist/firebase-auth.js +132 -0
  20. package/dist/firebase-auth.js.map +1 -0
  21. package/dist/gallery-store.d.ts +67 -0
  22. package/dist/gallery-store.js +333 -0
  23. package/dist/gallery-store.js.map +1 -0
  24. package/dist/git-assist.d.ts +7 -0
  25. package/dist/git-assist.js +51 -0
  26. package/dist/git-assist.js.map +1 -0
  27. package/dist/git-operations.d.ts +63 -0
  28. package/dist/git-operations.js +292 -0
  29. package/dist/git-operations.js.map +1 -0
  30. package/dist/image-store.d.ts +23 -0
  31. package/dist/image-store.js +142 -0
  32. package/dist/image-store.js.map +1 -0
  33. package/dist/index.d.ts +1 -0
  34. package/dist/index.js +198 -0
  35. package/dist/index.js.map +1 -0
  36. package/dist/mdns.d.ts +7 -0
  37. package/dist/mdns.js +49 -0
  38. package/dist/mdns.js.map +1 -0
  39. package/dist/parser.d.ts +620 -0
  40. package/dist/parser.js +423 -0
  41. package/dist/parser.js.map +1 -0
  42. package/dist/path-utils.d.ts +4 -0
  43. package/dist/path-utils.js +34 -0
  44. package/dist/path-utils.js.map +1 -0
  45. package/dist/project-history.d.ts +10 -0
  46. package/dist/project-history.js +73 -0
  47. package/dist/project-history.js.map +1 -0
  48. package/dist/prompt-history-backup.d.ts +15 -0
  49. package/dist/prompt-history-backup.js +46 -0
  50. package/dist/prompt-history-backup.js.map +1 -0
  51. package/dist/proxy.d.ts +15 -0
  52. package/dist/proxy.js +95 -0
  53. package/dist/proxy.js.map +1 -0
  54. package/dist/push-i18n.d.ts +7 -0
  55. package/dist/push-i18n.js +75 -0
  56. package/dist/push-i18n.js.map +1 -0
  57. package/dist/push-relay.d.ts +29 -0
  58. package/dist/push-relay.js +70 -0
  59. package/dist/push-relay.js.map +1 -0
  60. package/dist/recording-store.d.ts +51 -0
  61. package/dist/recording-store.js +158 -0
  62. package/dist/recording-store.js.map +1 -0
  63. package/dist/screenshot.d.ts +28 -0
  64. package/dist/screenshot.js +98 -0
  65. package/dist/screenshot.js.map +1 -0
  66. package/dist/sdk-process.d.ts +180 -0
  67. package/dist/sdk-process.js +960 -0
  68. package/dist/sdk-process.js.map +1 -0
  69. package/dist/session.d.ts +144 -0
  70. package/dist/session.js +687 -0
  71. package/dist/session.js.map +1 -0
  72. package/dist/sessions-index.d.ts +130 -0
  73. package/dist/sessions-index.js +1817 -0
  74. package/dist/sessions-index.js.map +1 -0
  75. package/dist/setup-launchd.d.ts +9 -0
  76. package/dist/setup-launchd.js +115 -0
  77. package/dist/setup-launchd.js.map +1 -0
  78. package/dist/setup-systemd.d.ts +9 -0
  79. package/dist/setup-systemd.js +122 -0
  80. package/dist/setup-systemd.js.map +1 -0
  81. package/dist/startup-info.d.ts +9 -0
  82. package/dist/startup-info.js +116 -0
  83. package/dist/startup-info.js.map +1 -0
  84. package/dist/usage.d.ts +69 -0
  85. package/dist/usage.js +545 -0
  86. package/dist/usage.js.map +1 -0
  87. package/dist/version.d.ts +13 -0
  88. package/dist/version.js +43 -0
  89. package/dist/version.js.map +1 -0
  90. package/dist/websocket.d.ts +132 -0
  91. package/dist/websocket.js +3551 -0
  92. package/dist/websocket.js.map +1 -0
  93. package/dist/worktree-store.d.ts +26 -0
  94. package/dist/worktree-store.js +61 -0
  95. package/dist/worktree-store.js.map +1 -0
  96. package/dist/worktree.d.ts +47 -0
  97. package/dist/worktree.js +330 -0
  98. package/dist/worktree.js.map +1 -0
  99. package/package.json +62 -0
package/dist/index.js ADDED
@@ -0,0 +1,198 @@
1
+ import { createServer } from "node:http";
2
+ import { homedir } from "node:os";
3
+ import { fileURLToPath } from "node:url";
4
+ import { setupProxy } from "./proxy.js";
5
+ import { BridgeWebSocketServer } from "./websocket.js";
6
+ import { ImageStore } from "./image-store.js";
7
+ import { GalleryStore } from "./gallery-store.js";
8
+ import { printStartupInfo } from "./startup-info.js";
9
+ import { MdnsAdvertiser } from "./mdns.js";
10
+ import { ProjectHistory } from "./project-history.js";
11
+ import { getVersionInfo } from "./version.js";
12
+ import { fetchAllUsage } from "./usage.js";
13
+ import { runDoctor } from "./doctor.js";
14
+ import { DebugTraceStore } from "./debug-trace-store.js";
15
+ import { RecordingStore } from "./recording-store.js";
16
+ import { FirebaseAuthClient } from "./firebase-auth.js";
17
+ import { PromptHistoryBackupStore } from "./prompt-history-backup.js";
18
+ import { resolvePlatformPath } from "./path-utils.js";
19
+ export async function startServer() {
20
+ const PORT = parseInt(process.env.BRIDGE_PORT ?? "8765", 10);
21
+ const HOST = process.env.BRIDGE_HOST ?? "0.0.0.0";
22
+ const API_KEY = process.env.BRIDGE_API_KEY;
23
+ // Parse allowed project directories (default: $HOME)
24
+ const ALLOWED_DIRS = process.env.BRIDGE_ALLOWED_DIRS
25
+ ? process.env.BRIDGE_ALLOWED_DIRS
26
+ .split(",")
27
+ .map((d) => resolvePlatformPath(d.trim()))
28
+ .filter(Boolean)
29
+ : [homedir()];
30
+ console.log("[bridge] Starting remodex bridge server...");
31
+ if (API_KEY) {
32
+ console.log("[bridge] API key authentication enabled");
33
+ }
34
+ if (process.env.BRIDGE_DISABLE_MDNS) {
35
+ console.log("[bridge] mDNS advertisement disabled");
36
+ }
37
+ console.log(`[bridge] Allowed dirs: ${ALLOWED_DIRS.join(", ")}`);
38
+ // Initialize Firebase Anonymous Auth for push notifications
39
+ let firebaseAuth;
40
+ try {
41
+ firebaseAuth = new FirebaseAuthClient();
42
+ await firebaseAuth.initialize();
43
+ console.log("[bridge] Push relay enabled (Firebase Anonymous Auth)");
44
+ }
45
+ catch (err) {
46
+ console.warn("[bridge] Push relay disabled: Firebase auth failed:", err);
47
+ firebaseAuth = undefined;
48
+ }
49
+ const imageStore = new ImageStore();
50
+ const galleryStore = new GalleryStore();
51
+ const projectHistory = new ProjectHistory();
52
+ const debugTraceStore = new DebugTraceStore();
53
+ const RECORDING_ENABLED = !!process.env.BRIDGE_RECORDING;
54
+ const recordingStore = RECORDING_ENABLED ? new RecordingStore() : undefined;
55
+ const promptHistoryBackup = new PromptHistoryBackupStore();
56
+ const MDNS_DISABLED = !!process.env.BRIDGE_DISABLE_MDNS;
57
+ const mdns = MDNS_DISABLED ? undefined : new MdnsAdvertiser();
58
+ // Initialize stores (async)
59
+ galleryStore.init().then(() => {
60
+ console.log("[bridge] Gallery store initialized");
61
+ }).catch((err) => {
62
+ console.error("[bridge] Failed to initialize gallery store:", err);
63
+ });
64
+ projectHistory.init().then(() => {
65
+ console.log("[bridge] Project history initialized");
66
+ }).catch((err) => {
67
+ console.error("[bridge] Failed to initialize project history:", err);
68
+ });
69
+ debugTraceStore.init().then(() => {
70
+ console.log("[bridge] Debug trace store initialized");
71
+ }).catch((err) => {
72
+ console.error("[bridge] Failed to initialize debug trace store:", err);
73
+ });
74
+ if (recordingStore) {
75
+ recordingStore.init().then(() => {
76
+ console.log("[bridge] Recording enabled");
77
+ }).catch((err) => {
78
+ console.error("[bridge] Failed to initialize recording store:", err);
79
+ });
80
+ }
81
+ promptHistoryBackup.init().then(() => {
82
+ console.log("[bridge] Prompt history backup store initialized");
83
+ }).catch((err) => {
84
+ console.error("[bridge] Failed to initialize prompt history backup store:", err);
85
+ });
86
+ const startedAt = Date.now();
87
+ let wsServer = null;
88
+ const httpServer = createServer((req, res) => {
89
+ // CORS headers for Flutter Web clients
90
+ res.setHeader("Access-Control-Allow-Origin", "*");
91
+ res.setHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, OPTIONS");
92
+ res.setHeader("Access-Control-Allow-Headers", "Content-Type");
93
+ if (req.method === "OPTIONS") {
94
+ res.writeHead(204);
95
+ res.end();
96
+ return;
97
+ }
98
+ // Health check endpoint
99
+ if (req.url === "/health" && req.method === "GET") {
100
+ const body = JSON.stringify({
101
+ status: "ok",
102
+ uptime: Math.floor((Date.now() - startedAt) / 1000),
103
+ sessions: wsServer?.sessionCount ?? 0,
104
+ clients: wsServer?.clientCount ?? 0,
105
+ });
106
+ res.writeHead(200, { "Content-Type": "application/json" });
107
+ res.end(body);
108
+ return;
109
+ }
110
+ // Version info endpoint
111
+ if (req.url === "/version" && req.method === "GET") {
112
+ const body = JSON.stringify(getVersionInfo(startedAt));
113
+ res.writeHead(200, { "Content-Type": "application/json" });
114
+ res.end(body);
115
+ return;
116
+ }
117
+ // Usage endpoint
118
+ if (req.url === "/usage" && req.method === "GET") {
119
+ fetchAllUsage()
120
+ .then((providers) => {
121
+ res.writeHead(200, { "Content-Type": "application/json" });
122
+ res.end(JSON.stringify({ providers }));
123
+ })
124
+ .catch((err) => {
125
+ res.writeHead(500, { "Content-Type": "application/json" });
126
+ res.end(JSON.stringify({ error: String(err) }));
127
+ });
128
+ return;
129
+ }
130
+ // Doctor endpoint
131
+ if (req.url === "/doctor" && req.method === "GET") {
132
+ runDoctor()
133
+ .then((report) => {
134
+ res.writeHead(200, { "Content-Type": "application/json" });
135
+ res.end(JSON.stringify(report));
136
+ })
137
+ .catch((err) => {
138
+ res.writeHead(500, { "Content-Type": "application/json" });
139
+ res.end(JSON.stringify({ error: String(err) }));
140
+ });
141
+ return;
142
+ }
143
+ // Serve images via ImageStore (in-memory, session-scoped)
144
+ if (imageStore.handleRequest(req, res))
145
+ return;
146
+ // Serve gallery images via GalleryStore (disk-persistent)
147
+ if (galleryStore.handleRequest(req, res))
148
+ return;
149
+ // Upload images via POST /api/gallery/upload
150
+ if (galleryStore.handleUploadRequest(req, res, (meta) => {
151
+ if (wsServer) {
152
+ const info = galleryStore.metaToInfo(meta);
153
+ wsServer.broadcastGalleryNewImage(info);
154
+ }
155
+ }))
156
+ return;
157
+ // Default 404 for unknown HTTP requests
158
+ res.writeHead(404, { "Content-Type": "text/plain" });
159
+ res.end("Not Found");
160
+ });
161
+ wsServer = new BridgeWebSocketServer({
162
+ server: httpServer,
163
+ apiKey: API_KEY,
164
+ allowedDirs: ALLOWED_DIRS,
165
+ imageStore,
166
+ galleryStore,
167
+ projectHistory,
168
+ debugTraceStore,
169
+ recordingStore,
170
+ firebaseAuth,
171
+ promptHistoryBackup,
172
+ });
173
+ httpServer.listen(PORT, HOST, () => {
174
+ console.log(`[bridge] Ready. Listening on http://${HOST}:${PORT} (HTTP + WebSocket)`);
175
+ mdns?.start(PORT, API_KEY);
176
+ printStartupInfo(PORT, HOST, API_KEY);
177
+ });
178
+ function shutdown() {
179
+ console.log("\n[bridge] Shutting down gracefully...");
180
+ mdns?.stop();
181
+ wsServer?.close();
182
+ httpServer.close();
183
+ process.exit(0);
184
+ }
185
+ process.on("SIGINT", shutdown);
186
+ process.on("SIGTERM", shutdown);
187
+ }
188
+ // Auto-start when executed directly (node dist/index.js, tsx src/index.ts)
189
+ const isDirectExecution = process.argv[1] &&
190
+ fileURLToPath(import.meta.url) === process.argv[1];
191
+ if (isDirectExecution) {
192
+ setupProxy();
193
+ startServer().catch((err) => {
194
+ console.error("[bridge] Failed to start:", err);
195
+ process.exit(1);
196
+ });
197
+ }
198
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAEtD,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,MAAM,EAAE,EAAE,CAAC,CAAC;IAC7D,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,SAAS,CAAC;IAClD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IAE3C,qDAAqD;IACrD,MAAM,YAAY,GAAa,OAAO,CAAC,GAAG,CAAC,mBAAmB;QAC5D,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB;aAC9B,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;aACzC,MAAM,CAAC,OAAO,CAAC;QAClB,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IAEhB,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;IAE1D,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;IACzD,CAAC;IAED,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,0BAA0B,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEjE,4DAA4D;IAC5D,IAAI,YAA4C,CAAC;IACjD,IAAI,CAAC;QACH,YAAY,GAAG,IAAI,kBAAkB,EAAE,CAAC;QACxC,MAAM,YAAY,CAAC,UAAU,EAAE,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;IACvE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,qDAAqD,EAAE,GAAG,CAAC,CAAC;QACzE,YAAY,GAAG,SAAS,CAAC;IAC3B,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,UAAU,EAAE,CAAC;IACpC,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;IACxC,MAAM,cAAc,GAAG,IAAI,cAAc,EAAE,CAAC;IAC5C,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;IAC9C,MAAM,iBAAiB,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;IACzD,MAAM,cAAc,GAAG,iBAAiB,CAAC,CAAC,CAAC,IAAI,cAAc,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAC5E,MAAM,mBAAmB,GAAG,IAAI,wBAAwB,EAAE,CAAC;IAC3D,MAAM,aAAa,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;IACxD,MAAM,IAAI,GAAG,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,cAAc,EAAE,CAAC;IAE9D,4BAA4B;IAC5B,YAAY,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;QAC5B,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QACf,OAAO,CAAC,KAAK,CAAC,8CAA8C,EAAE,GAAG,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,cAAc,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;QAC9B,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QACf,OAAO,CAAC,KAAK,CAAC,gDAAgD,EAAE,GAAG,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,eAAe,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;QAC/B,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QACf,OAAO,CAAC,KAAK,CAAC,kDAAkD,EAAE,GAAG,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,IAAI,cAAc,EAAE,CAAC;QACnB,cAAc,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;YAC9B,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACf,OAAO,CAAC,KAAK,CAAC,gDAAgD,EAAE,GAAG,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC;IACL,CAAC;IAED,mBAAmB,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;QACnC,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QACf,OAAO,CAAC,KAAK,CAAC,4DAA4D,EAAE,GAAG,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,IAAI,QAAQ,GAAiC,IAAI,CAAC;IAElD,MAAM,UAAU,GAAG,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QAC3C,uCAAuC;QACvC,GAAG,CAAC,SAAS,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAC;QAClD,GAAG,CAAC,SAAS,CAAC,8BAA8B,EAAE,4BAA4B,CAAC,CAAC;QAC5E,GAAG,CAAC,SAAS,CAAC,8BAA8B,EAAE,cAAc,CAAC,CAAC;QAE9D,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC7B,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACnB,GAAG,CAAC,GAAG,EAAE,CAAC;YACV,OAAO;QACT,CAAC;QAED,wBAAwB;QACxB,IAAI,GAAG,CAAC,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;YAClD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC;gBAC1B,MAAM,EAAE,IAAI;gBACZ,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC;gBACnD,QAAQ,EAAE,QAAQ,EAAE,YAAY,IAAI,CAAC;gBACrC,OAAO,EAAE,QAAQ,EAAE,WAAW,IAAI,CAAC;aACpC,CAAC,CAAC;YACH,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;YAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACd,OAAO;QACT,CAAC;QAED,wBAAwB;QACxB,IAAI,GAAG,CAAC,GAAG,KAAK,UAAU,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;YACnD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,CAAC;YACvD,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;YAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACd,OAAO;QACT,CAAC;QAED,iBAAiB;QACjB,IAAI,GAAG,CAAC,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;YACjD,aAAa,EAAE;iBACZ,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE;gBAClB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;gBAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;YACzC,CAAC,CAAC;iBACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBACb,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;gBAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YAClD,CAAC,CAAC,CAAC;YACL,OAAO;QACT,CAAC;QAED,kBAAkB;QAClB,IAAI,GAAG,CAAC,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;YAClD,SAAS,EAAE;iBACR,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;gBACf,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;gBAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;YAClC,CAAC,CAAC;iBACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBACb,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;gBAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YAClD,CAAC,CAAC,CAAC;YACL,OAAO;QACT,CAAC;QAED,0DAA0D;QAC1D,IAAI,UAAU,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC;YAAE,OAAO;QAE/C,0DAA0D;QAC1D,IAAI,YAAY,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC;YAAE,OAAO;QAEjD,6CAA6C;QAC7C,IAAI,YAAY,CAAC,mBAAmB,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE;YACtD,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,IAAI,GAAG,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;gBAC3C,QAAQ,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC,CAAC;YAAE,OAAO;QAEX,wCAAwC;QACxC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC,CAAC;QACrD,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,QAAQ,GAAG,IAAI,qBAAqB,CAAC;QACnC,MAAM,EAAE,UAAU;QAClB,MAAM,EAAE,OAAO;QACf,WAAW,EAAE,YAAY;QACzB,UAAU;QACV,YAAY;QACZ,cAAc;QACd,eAAe;QACf,cAAc;QACd,YAAY;QACZ,mBAAmB;KACpB,CAAC,CAAC;IAEH,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE;QACjC,OAAO,CAAC,GAAG,CAAC,uCAAuC,IAAI,IAAI,IAAI,qBAAqB,CAAC,CAAC;QACtF,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC3B,gBAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,SAAS,QAAQ;QACf,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;QACtD,IAAI,EAAE,IAAI,EAAE,CAAC;QACb,QAAQ,EAAE,KAAK,EAAE,CAAC;QAClB,UAAU,CAAC,KAAK,EAAE,CAAC;QACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AAClC,CAAC;AAED,2EAA2E;AAC3E,MAAM,iBAAiB,GACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACf,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAErD,IAAI,iBAAiB,EAAE,CAAC;IACtB,UAAU,EAAE,CAAC;IACb,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QAC1B,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,GAAG,CAAC,CAAC;QAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}
package/dist/mdns.d.ts ADDED
@@ -0,0 +1,7 @@
1
+ export declare class MdnsAdvertiser {
2
+ private bonjour;
3
+ private service;
4
+ private disabled;
5
+ start(port: number, apiKey?: string): void;
6
+ stop(): void;
7
+ }
package/dist/mdns.js ADDED
@@ -0,0 +1,49 @@
1
+ import { Bonjour } from "bonjour-service";
2
+ export class MdnsAdvertiser {
3
+ bonjour = null;
4
+ service = null;
5
+ disabled = false;
6
+ start(port, apiKey) {
7
+ if (this.disabled)
8
+ return;
9
+ try {
10
+ this.bonjour = new Bonjour({}, (err) => {
11
+ console.warn(`[bridge] mDNS: transport error (non-fatal): ${err.message}`);
12
+ this.disabled = true;
13
+ this.stop();
14
+ });
15
+ this.service = this.bonjour.publish({
16
+ name: "remodex-cli",
17
+ type: "remodex",
18
+ protocol: "tcp",
19
+ port,
20
+ probe: false, // Skip name collision check (same bridge restarting)
21
+ txt: {
22
+ version: "1",
23
+ auth: apiKey ? "required" : "none",
24
+ },
25
+ });
26
+ // Handle async errors (e.g. name already in use from a stale process)
27
+ this.service.on("error", (err) => {
28
+ console.warn(`[bridge] mDNS: service error (non-fatal): ${err.message}`);
29
+ });
30
+ console.log(`[bridge] mDNS: advertising _remodex._tcp on port ${port}`);
31
+ }
32
+ catch (err) {
33
+ console.warn(`[bridge] mDNS: failed to advertise (non-fatal): ${err instanceof Error ? err.message : err}`);
34
+ this.stop();
35
+ }
36
+ }
37
+ stop() {
38
+ if (this.service) {
39
+ this.service.stop?.();
40
+ this.service = null;
41
+ }
42
+ if (this.bonjour) {
43
+ this.bonjour.destroy();
44
+ this.bonjour = null;
45
+ }
46
+ console.log("[bridge] mDNS: stopped advertising");
47
+ }
48
+ }
49
+ //# sourceMappingURL=mdns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mdns.js","sourceRoot":"","sources":["../src/mdns.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAgB,MAAM,iBAAiB,CAAC;AAExD,MAAM,OAAO,cAAc;IACjB,OAAO,GAAmB,IAAI,CAAC;IAC/B,OAAO,GAAmB,IAAI,CAAC;IAC/B,QAAQ,GAAG,KAAK,CAAC;IAEzB,KAAK,CAAC,IAAY,EAAE,MAAe;QACjC,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC1B,IAAI,CAAC;YACH,IAAI,CAAC,OAAO,GAAG,IAAI,OAAO,CAAC,EAAE,EAAE,CAAC,GAAU,EAAE,EAAE;gBAC5C,OAAO,CAAC,IAAI,CACV,+CAA+C,GAAG,CAAC,OAAO,EAAE,CAC7D,CAAC;gBACF,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;gBACrB,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;gBAClC,IAAI,EAAE,aAAa;gBACnB,IAAI,EAAE,SAAS;gBACf,QAAQ,EAAE,KAAK;gBACf,IAAI;gBACJ,KAAK,EAAE,KAAK,EAAE,qDAAqD;gBACnE,GAAG,EAAE;oBACH,OAAO,EAAE,GAAG;oBACZ,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM;iBACnC;aACF,CAAC,CAAC;YACH,sEAAsE;YACtE,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAU,EAAE,EAAE;gBACtC,OAAO,CAAC,IAAI,CAAC,6CAA6C,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YAC3E,CAAC,CAAC,CAAC;YACH,OAAO,CAAC,GAAG,CACT,oDAAoD,IAAI,EAAE,CAC3D,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,mDAAmD,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;YAC5G,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,CAAC;IACH,CAAC;IAED,IAAI;QACF,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;YACtB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACtB,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACvB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACtB,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;IACpD,CAAC;CACF"}