lockin-mcp 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 (175) hide show
  1. package/README.md +349 -0
  2. package/assets/icon-256.png +0 -0
  3. package/assets/icon-32.png +0 -0
  4. package/assets/icon.svg +4 -0
  5. package/dist/blocker.d.ts +23 -0
  6. package/dist/blocker.d.ts.map +1 -0
  7. package/dist/blocker.js +184 -0
  8. package/dist/blocker.js.map +1 -0
  9. package/dist/brand.d.ts +12 -0
  10. package/dist/brand.d.ts.map +1 -0
  11. package/dist/brand.js +12 -0
  12. package/dist/brand.js.map +1 -0
  13. package/dist/hosts-manager.d.ts +14 -0
  14. package/dist/hosts-manager.d.ts.map +1 -0
  15. package/dist/hosts-manager.js +233 -0
  16. package/dist/hosts-manager.js.map +1 -0
  17. package/dist/hosts-manager.test.d.ts +2 -0
  18. package/dist/hosts-manager.test.d.ts.map +1 -0
  19. package/dist/hosts-manager.test.js +19 -0
  20. package/dist/hosts-manager.test.js.map +1 -0
  21. package/dist/index.d.ts +3 -0
  22. package/dist/index.d.ts.map +1 -0
  23. package/dist/index.js +296 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/install.d.ts +3 -0
  26. package/dist/install.d.ts.map +1 -0
  27. package/dist/install.js +15 -0
  28. package/dist/install.js.map +1 -0
  29. package/dist/installer/agent-instructions.d.ts +25 -0
  30. package/dist/installer/agent-instructions.d.ts.map +1 -0
  31. package/dist/installer/agent-instructions.js +36 -0
  32. package/dist/installer/agent-instructions.js.map +1 -0
  33. package/dist/installer/agents.d.ts +9 -0
  34. package/dist/installer/agents.d.ts.map +1 -0
  35. package/dist/installer/agents.js +223 -0
  36. package/dist/installer/agents.js.map +1 -0
  37. package/dist/installer/background-service.d.ts +11 -0
  38. package/dist/installer/background-service.d.ts.map +1 -0
  39. package/dist/installer/background-service.js +47 -0
  40. package/dist/installer/background-service.js.map +1 -0
  41. package/dist/installer/clipboard.d.ts +2 -0
  42. package/dist/installer/clipboard.d.ts.map +1 -0
  43. package/dist/installer/clipboard.js +28 -0
  44. package/dist/installer/clipboard.js.map +1 -0
  45. package/dist/installer/daemon-linux.d.ts +10 -0
  46. package/dist/installer/daemon-linux.d.ts.map +1 -0
  47. package/dist/installer/daemon-linux.js +66 -0
  48. package/dist/installer/daemon-linux.js.map +1 -0
  49. package/dist/installer/daemon-windows.d.ts +10 -0
  50. package/dist/installer/daemon-windows.d.ts.map +1 -0
  51. package/dist/installer/daemon-windows.js +88 -0
  52. package/dist/installer/daemon-windows.js.map +1 -0
  53. package/dist/installer/daemon.d.ts +10 -0
  54. package/dist/installer/daemon.d.ts.map +1 -0
  55. package/dist/installer/daemon.js +96 -0
  56. package/dist/installer/daemon.js.map +1 -0
  57. package/dist/installer/hosts-sudo.d.ts +6 -0
  58. package/dist/installer/hosts-sudo.d.ts.map +1 -0
  59. package/dist/installer/hosts-sudo.js +111 -0
  60. package/dist/installer/hosts-sudo.js.map +1 -0
  61. package/dist/installer/legacy-tunnels.d.ts +2 -0
  62. package/dist/installer/legacy-tunnels.d.ts.map +1 -0
  63. package/dist/installer/legacy-tunnels.js +27 -0
  64. package/dist/installer/legacy-tunnels.js.map +1 -0
  65. package/dist/installer/license.d.ts +9 -0
  66. package/dist/installer/license.d.ts.map +1 -0
  67. package/dist/installer/license.js +193 -0
  68. package/dist/installer/license.js.map +1 -0
  69. package/dist/installer/mcp-cleanup.d.ts +3 -0
  70. package/dist/installer/mcp-cleanup.d.ts.map +1 -0
  71. package/dist/installer/mcp-cleanup.js +28 -0
  72. package/dist/installer/mcp-cleanup.js.map +1 -0
  73. package/dist/installer/platform.d.ts +7 -0
  74. package/dist/installer/platform.d.ts.map +1 -0
  75. package/dist/installer/platform.js +76 -0
  76. package/dist/installer/platform.js.map +1 -0
  77. package/dist/installer/poke-daemon.d.ts +14 -0
  78. package/dist/installer/poke-daemon.d.ts.map +1 -0
  79. package/dist/installer/poke-daemon.js +161 -0
  80. package/dist/installer/poke-daemon.js.map +1 -0
  81. package/dist/installer/poke.d.ts +43 -0
  82. package/dist/installer/poke.d.ts.map +1 -0
  83. package/dist/installer/poke.js +154 -0
  84. package/dist/installer/poke.js.map +1 -0
  85. package/dist/installer/port.d.ts +6 -0
  86. package/dist/installer/port.d.ts.map +1 -0
  87. package/dist/installer/port.js +76 -0
  88. package/dist/installer/port.js.map +1 -0
  89. package/dist/installer/presets.d.ts +5 -0
  90. package/dist/installer/presets.d.ts.map +1 -0
  91. package/dist/installer/presets.js +22 -0
  92. package/dist/installer/presets.js.map +1 -0
  93. package/dist/installer/prompts.d.ts +8 -0
  94. package/dist/installer/prompts.d.ts.map +1 -0
  95. package/dist/installer/prompts.js +128 -0
  96. package/dist/installer/prompts.js.map +1 -0
  97. package/dist/installer/relay-credentials.d.ts +26 -0
  98. package/dist/installer/relay-credentials.d.ts.map +1 -0
  99. package/dist/installer/relay-credentials.js +75 -0
  100. package/dist/installer/relay-credentials.js.map +1 -0
  101. package/dist/installer/relay-provision.d.ts +26 -0
  102. package/dist/installer/relay-provision.d.ts.map +1 -0
  103. package/dist/installer/relay-provision.js +57 -0
  104. package/dist/installer/relay-provision.js.map +1 -0
  105. package/dist/installer/run.d.ts +2 -0
  106. package/dist/installer/run.d.ts.map +1 -0
  107. package/dist/installer/run.js +365 -0
  108. package/dist/installer/run.js.map +1 -0
  109. package/dist/installer/tty.d.ts +7 -0
  110. package/dist/installer/tty.d.ts.map +1 -0
  111. package/dist/installer/tty.js +37 -0
  112. package/dist/installer/tty.js.map +1 -0
  113. package/dist/installer/tui.d.ts +14 -0
  114. package/dist/installer/tui.d.ts.map +1 -0
  115. package/dist/installer/tui.js +150 -0
  116. package/dist/installer/tui.js.map +1 -0
  117. package/dist/installer/tunnel-daemon.d.ts +13 -0
  118. package/dist/installer/tunnel-daemon.d.ts.map +1 -0
  119. package/dist/installer/tunnel-daemon.js +129 -0
  120. package/dist/installer/tunnel-daemon.js.map +1 -0
  121. package/dist/installer/tunnel-provision.d.ts +14 -0
  122. package/dist/installer/tunnel-provision.d.ts.map +1 -0
  123. package/dist/installer/tunnel-provision.js +31 -0
  124. package/dist/installer/tunnel-provision.js.map +1 -0
  125. package/dist/installer/tunnel.d.ts +12 -0
  126. package/dist/installer/tunnel.d.ts.map +1 -0
  127. package/dist/installer/tunnel.js +91 -0
  128. package/dist/installer/tunnel.js.map +1 -0
  129. package/dist/installer/types.d.ts +59 -0
  130. package/dist/installer/types.d.ts.map +1 -0
  131. package/dist/installer/types.js +2 -0
  132. package/dist/installer/types.js.map +1 -0
  133. package/dist/license-check.d.ts +12 -0
  134. package/dist/license-check.d.ts.map +1 -0
  135. package/dist/license-check.js +59 -0
  136. package/dist/license-check.js.map +1 -0
  137. package/dist/license-guard.d.ts +14 -0
  138. package/dist/license-guard.d.ts.map +1 -0
  139. package/dist/license-guard.js +56 -0
  140. package/dist/license-guard.js.map +1 -0
  141. package/dist/license-guard.test.d.ts +2 -0
  142. package/dist/license-guard.test.d.ts.map +1 -0
  143. package/dist/license-guard.test.js +34 -0
  144. package/dist/license-guard.test.js.map +1 -0
  145. package/dist/relay-client.d.ts +32 -0
  146. package/dist/relay-client.d.ts.map +1 -0
  147. package/dist/relay-client.js +249 -0
  148. package/dist/relay-client.js.map +1 -0
  149. package/dist/relay-types.d.ts +30 -0
  150. package/dist/relay-types.d.ts.map +1 -0
  151. package/dist/relay-types.js +2 -0
  152. package/dist/relay-types.js.map +1 -0
  153. package/dist/relay-urls.d.ts +22 -0
  154. package/dist/relay-urls.d.ts.map +1 -0
  155. package/dist/relay-urls.js +57 -0
  156. package/dist/relay-urls.js.map +1 -0
  157. package/dist/server.d.ts +6 -0
  158. package/dist/server.d.ts.map +1 -0
  159. package/dist/server.js +164 -0
  160. package/dist/server.js.map +1 -0
  161. package/dist/state.d.ts +12 -0
  162. package/dist/state.d.ts.map +1 -0
  163. package/dist/state.js +91 -0
  164. package/dist/state.js.map +1 -0
  165. package/dist/types.d.ts +40 -0
  166. package/dist/types.d.ts.map +1 -0
  167. package/dist/types.js +41 -0
  168. package/dist/types.js.map +1 -0
  169. package/dist/types.test.d.ts +2 -0
  170. package/dist/types.test.d.ts.map +1 -0
  171. package/dist/types.test.js +13 -0
  172. package/dist/types.test.js.map +1 -0
  173. package/install.ps1 +41 -0
  174. package/install.sh +39 -0
  175. package/package.json +64 -0
@@ -0,0 +1,365 @@
1
+ import * as clack from "@clack/prompts";
2
+ import color from "picocolors";
3
+ import { spawn } from "node:child_process";
4
+ import { randomBytes } from "node:crypto";
5
+ import { mkdir, writeFile } from "node:fs/promises";
6
+ import { dirname, join } from "node:path";
7
+ import { fileURLToPath } from "node:url";
8
+ import { blockDomains } from "../blocker.js";
9
+ import { canWriteHostsFile } from "../hosts-manager.js";
10
+ import { verifyLicenseInfo } from "../license-check.js";
11
+ import { resolveLicense } from "./license.js";
12
+ import { detectPlatform, ensureNodeVersion, getInstallDir } from "./platform.js";
13
+ import { describePortConflict, resolveMcpPort } from "./port.js";
14
+ import { buildPokeUrls, POKE_LOCKIN_RECIPE_URL } from "./poke.js";
15
+ import { promptConnectAgent, promptBackgroundService, installBackgroundService } from "./agents.js";
16
+ import { promptInstallHostsSudoers } from "./hosts-sudo.js";
17
+ import { uninstallLegacyTunnelLaunchAgents } from "./legacy-tunnels.js";
18
+ import { stopLockInMcpLaunchAgent } from "./mcp-cleanup.js";
19
+ import { parseInstallerArgs, summarizeSelections, } from "./prompts.js";
20
+ import { provisionRelayDevice, refreshRelayRegistration } from "./relay-provision.js";
21
+ import { readRelayCredentials, relayCredentialsMatchPort, relayEnvFromCredentials, toRelayProvisionResult, writeRelayCredentials, } from "./relay-credentials.js";
22
+ import { promptSiteSelection, resolveLicenseInteractive, showSuccessOutro, } from "./tui.js";
23
+ import { verifyPublicTunnel, waitForHttp } from "./tunnel.js";
24
+ import { attachToTerminal } from "./tty.js";
25
+ function createMcpAuthToken(existing) {
26
+ return existing ?? `mdb_${randomBytes(24).toString("hex")}`;
27
+ }
28
+ async function writeSetupManifest(manifest) {
29
+ const dir = getInstallDir();
30
+ await mkdir(dir, { recursive: true });
31
+ const path = join(dir, "setup-manifest.json");
32
+ await writeFile(path, `${JSON.stringify(manifest, null, 2)}\n`, {
33
+ mode: 0o600,
34
+ });
35
+ return path;
36
+ }
37
+ function startMcpServer(params) {
38
+ const env = params.relayEnv ?? { ...process.env };
39
+ if (params.authToken) {
40
+ env.MDB_MCP_AUTH_TOKEN = params.authToken;
41
+ }
42
+ env.MDB_HTTP_PORT = String(params.port);
43
+ const serverEntry = join(dirname(fileURLToPath(import.meta.url)), "..", "index.js");
44
+ const child = spawn(process.execPath, [serverEntry, "--http", "--port", String(params.port)], {
45
+ env,
46
+ stdio: ["ignore", "pipe", "pipe"],
47
+ });
48
+ child.stdout?.on("data", () => {
49
+ // suppress MCP server logs during installer UI
50
+ });
51
+ child.stderr?.on("data", () => {
52
+ // suppress MCP server logs during installer UI
53
+ });
54
+ return child;
55
+ }
56
+ async function setupRelayAccess(params) {
57
+ const localMcpUrl = `http://127.0.0.1:${params.port}`;
58
+ if (params.options.skipTunnel) {
59
+ return {
60
+ publicMcpUrl: localMcpUrl,
61
+ publicTunnelVerified: false,
62
+ };
63
+ }
64
+ if (!params.relayCredentials) {
65
+ throw new Error("Relay credentials missing");
66
+ }
67
+ const healthBase = params.relayCredentials.healthUrl
68
+ ? params.relayCredentials.healthUrl.replace(/\/health$/, "")
69
+ : `${params.relayCredentials.relayUrl.replace(/\/$/, "")}/device/${params.relayCredentials.deviceId}`;
70
+ const verifySpinner = clack.spinner();
71
+ verifySpinner.start("Verifying relay is reachable...");
72
+ const verification = await verifyPublicTunnel({
73
+ publicBaseUrl: healthBase,
74
+ authToken: params.mcpAuthToken,
75
+ attempts: 15,
76
+ delayMs: 2000,
77
+ });
78
+ if (verification.healthOk && verification.mcpOk) {
79
+ verifySpinner.stop(color.green(verification.detail));
80
+ }
81
+ else {
82
+ verifySpinner.stop(color.yellow("Relay not ready yet"));
83
+ clack.log.warn(verification.detail);
84
+ }
85
+ const publicMcpUrl = params.relayCredentials.mcpUrl?.replace(/\/mcp$/, "") ?? healthBase;
86
+ return {
87
+ publicMcpUrl,
88
+ relayDeviceId: params.relayCredentials.deviceId,
89
+ relayUrl: params.relayCredentials.relayUrl,
90
+ publicTunnelVerified: verification.healthOk && verification.mcpOk,
91
+ };
92
+ }
93
+ export async function runInstaller(argv) {
94
+ attachToTerminal();
95
+ await ensureNodeVersion();
96
+ const platform = detectPlatform();
97
+ if (platform.id === "unsupported") {
98
+ throw new Error(`Unsupported platform: ${platform.name}`);
99
+ }
100
+ if (!platform.isHostsSupported) {
101
+ throw new Error("Hosts-based blocking is not supported on this platform.");
102
+ }
103
+ let options = parseInstallerArgs(argv);
104
+ let license;
105
+ if (options.nonInteractive) {
106
+ license = await resolveLicense({
107
+ licenseKey: options.licenseKey,
108
+ useBrowserLogin: options.useBrowserLogin,
109
+ });
110
+ }
111
+ else {
112
+ const licenseResult = await resolveLicenseInteractive(options);
113
+ options = licenseResult.options;
114
+ license = licenseResult.license;
115
+ const sites = await promptSiteSelection(options);
116
+ if (!sites) {
117
+ process.exit(0);
118
+ }
119
+ options = sites;
120
+ }
121
+ if (license.tier !== "pro") {
122
+ throw new Error("Pro license required. Purchase at your dashboard.");
123
+ }
124
+ if (license.token) {
125
+ const status = await verifyLicenseInfo(license);
126
+ if (!status.valid) {
127
+ throw new Error(`License verification failed: ${status.error ?? "invalid token"}`);
128
+ }
129
+ }
130
+ const { domains } = summarizeSelections(options);
131
+ if (!options.skipBlock && domains.length > 0) {
132
+ const needsSudo = !(await canWriteHostsFile());
133
+ if (needsSudo) {
134
+ clack.log.warn("Administrator access is required to update /etc/hosts.\n" +
135
+ color.dim("Your Mac will prompt for your login password next (characters stay hidden)."));
136
+ }
137
+ const blockSpinner = needsSudo ? null : clack.spinner();
138
+ if (blockSpinner) {
139
+ blockSpinner.start(`Blocking ${domains.length} domain(s)...`);
140
+ }
141
+ else {
142
+ clack.log.step(`Blocking ${domains.length} domain(s)...`);
143
+ }
144
+ try {
145
+ const result = await blockDomains(domains);
146
+ if (blockSpinner) {
147
+ blockSpinner.stop(color.green(result.message));
148
+ }
149
+ else {
150
+ clack.log.success(result.message);
151
+ }
152
+ if (!options.nonInteractive &&
153
+ needsSudo &&
154
+ !result.message.includes("already blocked")) {
155
+ await promptInstallHostsSudoers();
156
+ }
157
+ }
158
+ catch (error) {
159
+ if (blockSpinner) {
160
+ blockSpinner.stop(color.red("Failed to update /etc/hosts"));
161
+ }
162
+ throw error;
163
+ }
164
+ }
165
+ const mcpAuthToken = createMcpAuthToken(options.mcpAuthToken);
166
+ await uninstallLegacyTunnelLaunchAgents();
167
+ const stoppedBackground = await stopLockInMcpLaunchAgent();
168
+ if (stoppedBackground) {
169
+ clack.log.info("Stopped previous LockIn background service for a clean install.");
170
+ }
171
+ const portConflict = await describePortConflict(options.port);
172
+ if (portConflict) {
173
+ const resolvedPort = await resolveMcpPort(options.port);
174
+ if (resolvedPort !== options.port) {
175
+ clack.log.warn(`${portConflict}. Using port ${resolvedPort} instead.`);
176
+ options.port = resolvedPort;
177
+ }
178
+ }
179
+ const localMcpUrl = `http://127.0.0.1:${options.port}`;
180
+ let relayCredentials;
181
+ let relayEnv;
182
+ if (!options.skipTunnel && license.token) {
183
+ const cachedRelay = await readRelayCredentials();
184
+ const cacheValid = cachedRelay && relayCredentialsMatchPort(cachedRelay, options.port);
185
+ let relay = cacheValid ? toRelayProvisionResult(cachedRelay) : null;
186
+ if (cacheValid) {
187
+ const refreshSpinner = clack.spinner();
188
+ refreshSpinner.start("Refreshing relay registration...");
189
+ try {
190
+ const refreshed = await refreshRelayRegistration({
191
+ licenseToken: license.token,
192
+ port: options.port,
193
+ });
194
+ relay = {
195
+ ...toRelayProvisionResult(cachedRelay),
196
+ relayUrl: refreshed.relayUrl,
197
+ relayConnectUrl: refreshed.relayConnectUrl,
198
+ mcpUrl: refreshed.mcpUrl,
199
+ sseUrl: refreshed.sseUrl,
200
+ healthUrl: refreshed.healthUrl,
201
+ };
202
+ refreshSpinner.stop(color.green("Relay registration refreshed"));
203
+ await writeRelayCredentials({
204
+ deviceId: cachedRelay.deviceId,
205
+ relayDeviceToken: cachedRelay.relayDeviceToken,
206
+ relayUrl: refreshed.relayUrl,
207
+ relayConnectUrl: refreshed.relayConnectUrl,
208
+ mcpUrl: refreshed.mcpUrl,
209
+ sseUrl: refreshed.sseUrl,
210
+ healthUrl: refreshed.healthUrl,
211
+ localPort: options.port,
212
+ });
213
+ }
214
+ catch (error) {
215
+ refreshSpinner.stop(color.yellow("Could not refresh relay — reprovisioning"));
216
+ relay = null;
217
+ }
218
+ }
219
+ if (!relay) {
220
+ const provisionSpinner = clack.spinner();
221
+ provisionSpinner.start("Provisioning relay device...");
222
+ relay = await provisionRelayDevice({
223
+ licenseToken: license.token,
224
+ port: options.port,
225
+ });
226
+ provisionSpinner.stop(color.green(`Relay device ${relay.deviceId} registered`));
227
+ await writeRelayCredentials({
228
+ deviceId: relay.deviceId,
229
+ relayDeviceToken: relay.relayDeviceToken,
230
+ relayUrl: relay.relayUrl,
231
+ relayConnectUrl: relay.relayConnectUrl,
232
+ mcpUrl: relay.mcpUrl,
233
+ sseUrl: relay.sseUrl,
234
+ healthUrl: relay.healthUrl,
235
+ localPort: options.port,
236
+ });
237
+ }
238
+ relayCredentials = {
239
+ relayUrl: relay.relayUrl,
240
+ relayConnectUrl: relay.relayConnectUrl,
241
+ deviceId: relay.deviceId,
242
+ relayDeviceToken: relay.relayDeviceToken,
243
+ healthUrl: relay.healthUrl,
244
+ mcpUrl: relay.mcpUrl,
245
+ };
246
+ await uninstallLegacyTunnelLaunchAgents();
247
+ relayEnv = relayEnvFromCredentials({
248
+ deviceId: relay.deviceId,
249
+ relayDeviceToken: relay.relayDeviceToken,
250
+ relayUrl: relay.relayUrl,
251
+ relayConnectUrl: relay.relayConnectUrl,
252
+ mcpUrl: relay.mcpUrl,
253
+ sseUrl: relay.sseUrl,
254
+ healthUrl: relay.healthUrl,
255
+ localPort: options.port,
256
+ }, mcpAuthToken);
257
+ }
258
+ const mcpSpinner = clack.spinner();
259
+ mcpSpinner.start("Starting MCP server...");
260
+ const mcpProcess = startMcpServer({
261
+ port: options.port,
262
+ authToken: mcpAuthToken,
263
+ relayEnv,
264
+ });
265
+ await waitForHttp(`${localMcpUrl}/health`);
266
+ mcpSpinner.stop(color.green("MCP server ready"));
267
+ const relayResult = await setupRelayAccess({
268
+ options,
269
+ port: options.port,
270
+ mcpAuthToken,
271
+ relayCredentials,
272
+ });
273
+ const { publicMcpUrl, relayDeviceId, relayUrl, publicTunnelVerified, } = relayResult;
274
+ const remoteMcpUrl = relayCredentials?.mcpUrl ?? `${publicMcpUrl}/mcp`;
275
+ const pokeUrls = !options.skipPoke
276
+ ? buildPokeUrls({ remoteMcpUrl, mcpAuthToken })
277
+ : undefined;
278
+ const manifest = {
279
+ version: "2.0.0",
280
+ installedAt: new Date().toISOString(),
281
+ platform: platform.id,
282
+ licenseTier: license.tier,
283
+ blockedDomains: domains,
284
+ localMcpUrl,
285
+ publicMcpUrl: remoteMcpUrl.replace(/\/mcp$/, ""),
286
+ mcpAuthToken,
287
+ pokeIntegrationUrl: pokeUrls?.integrationUrl,
288
+ pokeRecipeUrl: POKE_LOCKIN_RECIPE_URL,
289
+ relayDeviceId,
290
+ relayUrl,
291
+ };
292
+ await writeSetupManifest(manifest);
293
+ const hasRemoteRelay = !options.skipTunnel && remoteMcpUrl.startsWith("https://");
294
+ const serverEntry = join(dirname(fileURLToPath(import.meta.url)), "..", "index.js");
295
+ showSuccessOutro({
296
+ blockedCount: domains.length,
297
+ remoteMcpUrl,
298
+ authToken: mcpAuthToken,
299
+ });
300
+ if (!options.nonInteractive) {
301
+ const installedBackground = await promptBackgroundService({
302
+ port: options.port,
303
+ authToken: mcpAuthToken,
304
+ serverEntry,
305
+ relayUrl: relayCredentials?.relayConnectUrl ?? relayCredentials?.relayUrl,
306
+ deviceId: relayCredentials?.deviceId,
307
+ relayDeviceToken: relayCredentials?.relayDeviceToken,
308
+ });
309
+ if (installedBackground) {
310
+ mcpProcess.kill("SIGTERM");
311
+ await waitForHttp(`${localMcpUrl}/health`, 20, 500);
312
+ }
313
+ if (hasRemoteRelay) {
314
+ await promptConnectAgent({
315
+ remoteMcpUrl,
316
+ pokeIntegrationUrl: pokeUrls?.integrationUrl ?? "",
317
+ authToken: mcpAuthToken,
318
+ publicTunnelVerified: installedBackground ? true : publicTunnelVerified,
319
+ });
320
+ }
321
+ if (installedBackground) {
322
+ const lines = [
323
+ `LockIn MCP runs in the background on port ${options.port}.`,
324
+ "Site blocks persist across restarts.",
325
+ ];
326
+ if (hasRemoteRelay) {
327
+ lines.push(`Remote URL: ${remoteMcpUrl}`);
328
+ }
329
+ clack.outro(color.dim(lines.join(" · ")));
330
+ process.exit(0);
331
+ }
332
+ }
333
+ else if (relayCredentials) {
334
+ const installedBackground = await installBackgroundService({
335
+ port: options.port,
336
+ authToken: mcpAuthToken,
337
+ serverEntry,
338
+ relayUrl: relayCredentials.relayConnectUrl ?? relayCredentials.relayUrl,
339
+ deviceId: relayCredentials.deviceId,
340
+ relayDeviceToken: relayCredentials.relayDeviceToken,
341
+ });
342
+ if (installedBackground) {
343
+ mcpProcess.kill("SIGTERM");
344
+ await waitForHttp(`${localMcpUrl}/health`, 20, 500);
345
+ clack.outro(color.dim(`LockIn MCP runs in the background on port ${options.port}. Remote URL: ${remoteMcpUrl}`));
346
+ process.exit(0);
347
+ }
348
+ }
349
+ if (hasRemoteRelay) {
350
+ clack.outro(color.dim("Relay connection is active. Enable background MCP on next run to close this terminal."));
351
+ }
352
+ else {
353
+ clack.outro(color.dim("Keep this terminal open · Ctrl+C to stop"));
354
+ }
355
+ const shutdown = () => {
356
+ mcpProcess.kill("SIGTERM");
357
+ process.exit(0);
358
+ };
359
+ process.on("SIGINT", shutdown);
360
+ process.on("SIGTERM", shutdown);
361
+ return await new Promise(() => {
362
+ // keep installer alive while MCP runs
363
+ });
364
+ }
365
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/installer/run.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,gBAAgB,CAAC;AACxC,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACjF,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AACpG,OAAO,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,iCAAiC,EAAE,MAAM,qBAAqB,CAAC;AACxE,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EACL,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AACtF,OAAO,EACL,oBAAoB,EACpB,yBAAyB,EACzB,uBAAuB,EACvB,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,mBAAmB,EACnB,yBAAyB,EACzB,gBAAgB,GACjB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAG5C,SAAS,kBAAkB,CAAC,QAAiB;IAC3C,OAAO,QAAQ,IAAI,OAAO,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;AAC9D,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,QAAuB;IACvD,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;IAC5B,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,qBAAqB,CAAC,CAAC;IAC9C,MAAM,SAAS,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;QAC9D,IAAI,EAAE,KAAK;KACZ,CAAC,CAAC;IACH,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,cAAc,CAAC,MAIvB;IACC,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,IAAI,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAClD,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACrB,GAAG,CAAC,kBAAkB,GAAG,MAAM,CAAC,SAAS,CAAC;IAC5C,CAAC;IACD,GAAG,CAAC,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAExC,MAAM,WAAW,GAAG,IAAI,CACtB,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EACvC,IAAI,EACJ,UAAU,CACX,CAAC;IAEF,MAAM,KAAK,GAAG,KAAK,CACjB,OAAO,CAAC,QAAQ,EAChB,CAAC,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EACtD;QACE,GAAG;QACH,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;KAClC,CACF,CAAC;IAEF,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;QAC5B,+CAA+C;IACjD,CAAC,CAAC,CAAC;IACH,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;QAC5B,+CAA+C;IACjD,CAAC,CAAC,CAAC;IACH,OAAO,KAAK,CAAC;AACf,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,MAW/B;IAMC,MAAM,WAAW,GAAG,oBAAoB,MAAM,CAAC,IAAI,EAAE,CAAC;IAEtD,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QAC9B,OAAO;YACL,YAAY,EAAE,WAAW;YACzB,oBAAoB,EAAE,KAAK;SAC5B,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,CAAC,gBAAgB,CAAC,SAAS;QAClD,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;QAC5D,CAAC,CAAC,GAAG,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC;IAExG,MAAM,aAAa,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;IACtC,aAAa,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACvD,MAAM,YAAY,GAAG,MAAM,kBAAkB,CAAC;QAC5C,aAAa,EAAE,UAAU;QACzB,SAAS,EAAE,MAAM,CAAC,YAAY;QAC9B,QAAQ,EAAE,EAAE;QACZ,OAAO,EAAE,IAAI;KACd,CAAC,CAAC;IAEH,IAAI,YAAY,CAAC,QAAQ,IAAI,YAAY,CAAC,KAAK,EAAE,CAAC;QAChD,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;IACvD,CAAC;SAAM,CAAC;QACN,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAAC;QACxD,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;IAED,MAAM,YAAY,GAChB,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,UAAU,CAAC;IAEtE,OAAO;QACL,YAAY;QACZ,aAAa,EAAE,MAAM,CAAC,gBAAgB,CAAC,QAAQ;QAC/C,QAAQ,EAAE,MAAM,CAAC,gBAAgB,CAAC,QAAQ;QAC1C,oBAAoB,EAAE,YAAY,CAAC,QAAQ,IAAI,YAAY,CAAC,KAAK;KAClE,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAc;IAC/C,gBAAgB,EAAE,CAAC;IAEnB,MAAM,iBAAiB,EAAE,CAAC;IAC1B,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;IAElC,IAAI,QAAQ,CAAC,EAAE,KAAK,aAAa,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,yBAAyB,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,gBAAgB,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAC7E,CAAC;IAED,IAAI,OAAO,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IACvC,IAAI,OAAoB,CAAC;IAEzB,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;QAC3B,OAAO,GAAG,MAAM,cAAc,CAAC;YAC7B,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,eAAe,EAAE,OAAO,CAAC,eAAe;SACzC,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,MAAM,aAAa,GAAG,MAAM,yBAAyB,CAAC,OAAO,CAAC,CAAC;QAC/D,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC;QAChC,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC;QAEhC,MAAM,KAAK,GAAG,MAAM,mBAAmB,CAAC,OAAO,CAAC,CAAC;QACjD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,OAAO,GAAG,KAAK,CAAC;IAClB,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACvE,CAAC;IAED,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAChD,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CACb,gCAAgC,MAAM,CAAC,KAAK,IAAI,eAAe,EAAE,CAClE,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,EAAE,OAAO,EAAE,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAEjD,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7C,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,iBAAiB,EAAE,CAAC,CAAC;QAC/C,IAAI,SAAS,EAAE,CAAC;YACd,KAAK,CAAC,GAAG,CAAC,IAAI,CACZ,0DAA0D;gBACxD,KAAK,CAAC,GAAG,CACP,6EAA6E,CAC9E,CACJ,CAAC;QACJ,CAAC;QAED,MAAM,YAAY,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;QACxD,IAAI,YAAY,EAAE,CAAC;YACjB,YAAY,CAAC,KAAK,CAAC,YAAY,OAAO,CAAC,MAAM,eAAe,CAAC,CAAC;QAChE,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,OAAO,CAAC,MAAM,eAAe,CAAC,CAAC;QAC5D,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;YAC3C,IAAI,YAAY,EAAE,CAAC;gBACjB,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;YACjD,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACpC,CAAC;YAED,IACE,CAAC,OAAO,CAAC,cAAc;gBACvB,SAAS;gBACT,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAC3C,CAAC;gBACD,MAAM,yBAAyB,EAAE,CAAC;YACpC,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,YAAY,EAAE,CAAC;gBACjB,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC,CAAC;YAC9D,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,MAAM,YAAY,GAAG,kBAAkB,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAE9D,MAAM,iCAAiC,EAAE,CAAC;IAC1C,MAAM,iBAAiB,GAAG,MAAM,wBAAwB,EAAE,CAAC;IAC3D,IAAI,iBAAiB,EAAE,CAAC;QACtB,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAAC;IACpF,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,oBAAoB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9D,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,YAAY,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACxD,IAAI,YAAY,KAAK,OAAO,CAAC,IAAI,EAAE,CAAC;YAClC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,YAAY,gBAAgB,YAAY,WAAW,CAAC,CAAC;YACvE,OAAO,CAAC,IAAI,GAAG,YAAY,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,MAAM,WAAW,GAAG,oBAAoB,OAAO,CAAC,IAAI,EAAE,CAAC;IAEvD,IAAI,gBASS,CAAC;IACd,IAAI,QAAuC,CAAC;IAE5C,IAAI,CAAC,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QACzC,MAAM,WAAW,GAAG,MAAM,oBAAoB,EAAE,CAAC;QACjD,MAAM,UAAU,GACd,WAAW,IAAI,yBAAyB,CAAC,WAAW,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QAEtE,IAAI,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,sBAAsB,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAEpE,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;YACvC,cAAc,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;YACzD,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,MAAM,wBAAwB,CAAC;oBAC/C,YAAY,EAAE,OAAO,CAAC,KAAK;oBAC3B,IAAI,EAAE,OAAO,CAAC,IAAI;iBACnB,CAAC,CAAC;gBACH,KAAK,GAAG;oBACN,GAAG,sBAAsB,CAAC,WAAW,CAAC;oBACtC,QAAQ,EAAE,SAAS,CAAC,QAAQ;oBAC5B,eAAe,EAAE,SAAS,CAAC,eAAe;oBAC1C,MAAM,EAAE,SAAS,CAAC,MAAM;oBACxB,MAAM,EAAE,SAAS,CAAC,MAAM;oBACxB,SAAS,EAAE,SAAS,CAAC,SAAS;iBAC/B,CAAC;gBACF,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC,CAAC;gBACjE,MAAM,qBAAqB,CAAC;oBAC1B,QAAQ,EAAE,WAAW,CAAC,QAAQ;oBAC9B,gBAAgB,EAAE,WAAW,CAAC,gBAAgB;oBAC9C,QAAQ,EAAE,SAAS,CAAC,QAAQ;oBAC5B,eAAe,EAAE,SAAS,CAAC,eAAe;oBAC1C,MAAM,EAAE,SAAS,CAAC,MAAM;oBACxB,MAAM,EAAE,SAAS,CAAC,MAAM;oBACxB,SAAS,EAAE,SAAS,CAAC,SAAS;oBAC9B,SAAS,EAAE,OAAO,CAAC,IAAI;iBACxB,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,0CAA0C,CAAC,CAAC,CAAC;gBAC9E,KAAK,GAAG,IAAI,CAAC;YACf,CAAC;QACH,CAAC;QAED,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,gBAAgB,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;YACzC,gBAAgB,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;YACvD,KAAK,GAAG,MAAM,oBAAoB,CAAC;gBACjC,YAAY,EAAE,OAAO,CAAC,KAAK;gBAC3B,IAAI,EAAE,OAAO,CAAC,IAAI;aACnB,CAAC,CAAC;YACH,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,gBAAgB,KAAK,CAAC,QAAQ,aAAa,CAAC,CAAC,CAAC;YAChF,MAAM,qBAAqB,CAAC;gBAC1B,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;gBACxC,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,eAAe,EAAE,KAAK,CAAC,eAAe;gBACtC,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,SAAS,EAAE,OAAO,CAAC,IAAI;aACxB,CAAC,CAAC;QACL,CAAC;QAED,gBAAgB,GAAG;YACjB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,eAAe,EAAE,KAAK,CAAC,eAAe;YACtC,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;YACxC,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,MAAM,EAAE,KAAK,CAAC,MAAM;SACrB,CAAC;QACF,MAAM,iCAAiC,EAAE,CAAC;QAC1C,QAAQ,GAAG,uBAAuB,CAChC;YACE,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;YACxC,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,eAAe,EAAE,KAAK,CAAC,eAAe;YACtC,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,SAAS,EAAE,OAAO,CAAC,IAAI;SACxB,EACD,YAAY,CACb,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;IACnC,UAAU,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAE3C,MAAM,UAAU,GAAG,cAAc,CAAC;QAChC,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,SAAS,EAAE,YAAY;QACvB,QAAQ;KACT,CAAC,CAAC;IAEH,MAAM,WAAW,CAAC,GAAG,WAAW,SAAS,CAAC,CAAC;IAC3C,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAEjD,MAAM,WAAW,GAAG,MAAM,gBAAgB,CAAC;QACzC,OAAO;QACP,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,YAAY;QACZ,gBAAgB;KACjB,CAAC,CAAC;IAEH,MAAM,EACJ,YAAY,EACZ,aAAa,EACb,QAAQ,EACR,oBAAoB,GACrB,GAAG,WAAW,CAAC;IAEhB,MAAM,YAAY,GAAG,gBAAgB,EAAE,MAAM,IAAI,GAAG,YAAY,MAAM,CAAC;IACvE,MAAM,QAAQ,GAAG,CAAC,OAAO,CAAC,QAAQ;QAChC,CAAC,CAAC,aAAa,CAAC,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC;QAC/C,CAAC,CAAC,SAAS,CAAC;IAEd,MAAM,QAAQ,GAAkB;QAC9B,OAAO,EAAE,OAAO;QAChB,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,QAAQ,EAAE,QAAQ,CAAC,EAAE;QACrB,WAAW,EAAE,OAAO,CAAC,IAAI;QACzB,cAAc,EAAE,OAAO;QACvB,WAAW;QACX,YAAY,EAAE,YAAY,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;QAChD,YAAY;QACZ,kBAAkB,EAAE,QAAQ,EAAE,cAAc;QAC5C,aAAa,EAAE,sBAAsB;QACrC,aAAa;QACb,QAAQ;KACT,CAAC;IAEF,MAAM,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAEnC,MAAM,cAAc,GAClB,CAAC,OAAO,CAAC,UAAU,IAAI,YAAY,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IAE7D,MAAM,WAAW,GAAG,IAAI,CACtB,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EACvC,IAAI,EACJ,UAAU,CACX,CAAC;IAEF,gBAAgB,CAAC;QACf,YAAY,EAAE,OAAO,CAAC,MAAM;QAC5B,YAAY;QACZ,SAAS,EAAE,YAAY;KACxB,CAAC,CAAC;IAEH,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;QAC5B,MAAM,mBAAmB,GAAG,MAAM,uBAAuB,CAAC;YACxD,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,SAAS,EAAE,YAAY;YACvB,WAAW;YACX,QAAQ,EAAE,gBAAgB,EAAE,eAAe,IAAI,gBAAgB,EAAE,QAAQ;YACzE,QAAQ,EAAE,gBAAgB,EAAE,QAAQ;YACpC,gBAAgB,EAAE,gBAAgB,EAAE,gBAAgB;SACrD,CAAC,CAAC;QAEH,IAAI,mBAAmB,EAAE,CAAC;YACxB,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC3B,MAAM,WAAW,CAAC,GAAG,WAAW,SAAS,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;QACtD,CAAC;QAED,IAAI,cAAc,EAAE,CAAC;YACnB,MAAM,kBAAkB,CAAC;gBACvB,YAAY;gBACZ,kBAAkB,EAAE,QAAQ,EAAE,cAAc,IAAI,EAAE;gBAClD,SAAS,EAAE,YAAY;gBACvB,oBAAoB,EAAE,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,oBAAoB;aACxE,CAAC,CAAC;QACL,CAAC;QAED,IAAI,mBAAmB,EAAE,CAAC;YACxB,MAAM,KAAK,GAAG;gBACZ,6CAA6C,OAAO,CAAC,IAAI,GAAG;gBAC5D,sCAAsC;aACvC,CAAC;YACF,IAAI,cAAc,EAAE,CAAC;gBACnB,KAAK,CAAC,IAAI,CAAC,eAAe,YAAY,EAAE,CAAC,CAAC;YAC5C,CAAC;YACD,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;SAAM,IAAI,gBAAgB,EAAE,CAAC;QAC5B,MAAM,mBAAmB,GAAG,MAAM,wBAAwB,CAAC;YACzD,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,SAAS,EAAE,YAAY;YACvB,WAAW;YACX,QAAQ,EAAE,gBAAgB,CAAC,eAAe,IAAI,gBAAgB,CAAC,QAAQ;YACvE,QAAQ,EAAE,gBAAgB,CAAC,QAAQ;YACnC,gBAAgB,EAAE,gBAAgB,CAAC,gBAAgB;SACpD,CAAC,CAAC;QAEH,IAAI,mBAAmB,EAAE,CAAC;YACxB,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC3B,MAAM,WAAW,CAAC,GAAG,WAAW,SAAS,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;YACpD,KAAK,CAAC,KAAK,CACT,KAAK,CAAC,GAAG,CACP,6CAA6C,OAAO,CAAC,IAAI,iBAAiB,YAAY,EAAE,CACzF,CACF,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,IAAI,cAAc,EAAE,CAAC;QACnB,KAAK,CAAC,KAAK,CACT,KAAK,CAAC,GAAG,CACP,uFAAuF,CACxF,CACF,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,QAAQ,GAAG,GAAS,EAAE;QAC1B,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC3B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAEhC,OAAO,MAAM,IAAI,OAAO,CAAQ,GAAG,EAAE;QACnC,sCAAsC;IACxC,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * When the install script is piped (`curl … | bash`), stdin is the pipe — not the
3
+ * keyboard. Re-attach stdio to /dev/tty so @clack/prompts can read input.
4
+ */
5
+ export declare function attachToTerminal(): void;
6
+ export declare function clearScreen(): void;
7
+ //# sourceMappingURL=tty.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tty.d.ts","sourceRoot":"","sources":["../../src/installer/tty.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAgCvC;AAED,wBAAgB,WAAW,IAAI,IAAI,CAElC"}
@@ -0,0 +1,37 @@
1
+ import { openSync } from "node:fs";
2
+ import { ReadStream, WriteStream } from "node:tty";
3
+ /**
4
+ * When the install script is piped (`curl … | bash`), stdin is the pipe — not the
5
+ * keyboard. Re-attach stdio to /dev/tty so @clack/prompts can read input.
6
+ */
7
+ export function attachToTerminal() {
8
+ if (process.stdin.isTTY) {
9
+ return;
10
+ }
11
+ if (process.platform !== "darwin" && process.platform !== "linux") {
12
+ return;
13
+ }
14
+ try {
15
+ const fdIn = openSync("/dev/tty", "r");
16
+ const fdOut = openSync("/dev/tty", "w");
17
+ const stdin = new ReadStream(fdIn);
18
+ const stdout = new WriteStream(fdOut);
19
+ Object.assign(process, { stdin, stdout });
20
+ Object.defineProperty(process.stdin, "isTTY", {
21
+ value: true,
22
+ configurable: true,
23
+ });
24
+ Object.defineProperty(process.stdout, "isTTY", {
25
+ value: true,
26
+ configurable: true,
27
+ });
28
+ }
29
+ catch {
30
+ console.error("\nInteractive terminal required.\n\nTry:\n bash <(curl -fsSL YOUR_URL/install)\n");
31
+ process.exit(1);
32
+ }
33
+ }
34
+ export function clearScreen() {
35
+ process.stdout.write("\x1B[2J\x1B[H");
36
+ }
37
+ //# sourceMappingURL=tty.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tty.js","sourceRoot":"","sources":["../../src/installer/tty.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEnD;;;GAGG;AACH,MAAM,UAAU,gBAAgB;IAC9B,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACxB,OAAO;IACT,CAAC;IAED,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QAClE,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,QAAQ,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;QACvC,MAAM,KAAK,GAAG,QAAQ,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;QAExC,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;QACnC,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,KAAK,CAAC,CAAC;QAEtC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAE1C,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE;YAC5C,KAAK,EAAE,IAAI;YACX,YAAY,EAAE,IAAI;SACnB,CAAC,CAAC;QACH,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE;YAC7C,KAAK,EAAE,IAAI;YACX,YAAY,EAAE,IAAI;SACnB,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,KAAK,CACX,mFAAmF,CACpF,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;AACxC,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { InstallerOptions } from "./types.js";
2
+ import type { LicenseInfo } from "./types.js";
3
+ export declare function showIntro(): void;
4
+ export declare function resolveLicenseInteractive(options: InstallerOptions): Promise<{
5
+ options: InstallerOptions;
6
+ license: LicenseInfo;
7
+ }>;
8
+ export declare function promptSiteSelection(options: InstallerOptions): Promise<InstallerOptions | null>;
9
+ export declare function showSuccessOutro(params: {
10
+ blockedCount: number;
11
+ remoteMcpUrl?: string;
12
+ authToken?: string;
13
+ }): void;
14
+ //# sourceMappingURL=tui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tui.d.ts","sourceRoot":"","sources":["../../src/installer/tui.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAoB9C,wBAAgB,SAAS,IAAI,IAAI,CAKhC;AA6CD,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC;IAAE,OAAO,EAAE,gBAAgB,CAAC;IAAC,OAAO,EAAE,WAAW,CAAA;CAAE,CAAC,CAqD9D;AAED,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAwClC;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE;IACvC,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,IAAI,CAqBP"}
@@ -0,0 +1,150 @@
1
+ import * as clack from "@clack/prompts";
2
+ import color from "picocolors";
3
+ import { APP_NAME } from "../brand.js";
4
+ import { defaultSelectedPresetIds, SITE_PRESETS, } from "./presets.js";
5
+ import { verifyViaBrowserLogin, verifyLicenseKey, loadCachedLicense, } from "./license.js";
6
+ import { clearScreen } from "./tty.js";
7
+ function parseList(value) {
8
+ return value
9
+ .split(",")
10
+ .map((item) => item.trim())
11
+ .filter(Boolean);
12
+ }
13
+ function purchaseUrl() {
14
+ const appUrl = process.env.MDB_APP_URL ?? "http://localhost:3001";
15
+ return `${appUrl}/login?redirect=checkout`;
16
+ }
17
+ export function showIntro() {
18
+ clearScreen();
19
+ clack.intro(`${color.bold(APP_NAME)}\n${color.dim("System-level focus · $9.99 lifetime license")}`);
20
+ }
21
+ async function promptLicenseMethod() {
22
+ const method = await clack.select({
23
+ message: "How do you want to verify your license?",
24
+ options: [
25
+ {
26
+ value: "browser",
27
+ label: "Sign in via browser",
28
+ hint: "recommended — opens automatically",
29
+ },
30
+ {
31
+ value: "key",
32
+ label: "Enter license key",
33
+ hint: "from your dashboard",
34
+ },
35
+ ],
36
+ initialValue: "browser",
37
+ });
38
+ if (clack.isCancel(method)) {
39
+ clack.cancel("Cancelled.");
40
+ process.exit(0);
41
+ }
42
+ return method;
43
+ }
44
+ async function verifyEnteredLicenseKey(key) {
45
+ const spinner = clack.spinner();
46
+ spinner.start("Verifying license key...");
47
+ try {
48
+ const license = await verifyLicenseKey(key);
49
+ if (license.tier !== "pro") {
50
+ spinner.stop(color.red("Pro license required"));
51
+ throw new Error(`Pro license required. Get yours at ${purchaseUrl()}`);
52
+ }
53
+ spinner.stop(color.green(`Verified — ${license.email ?? "Pro user"}`));
54
+ return license;
55
+ }
56
+ catch (error) {
57
+ spinner.stop(color.red("Verification failed"));
58
+ throw error;
59
+ }
60
+ }
61
+ export async function resolveLicenseInteractive(options) {
62
+ showIntro();
63
+ if (options.licenseKey) {
64
+ const spinner = clack.spinner();
65
+ spinner.start("Verifying license key...");
66
+ const license = await verifyLicenseKey(options.licenseKey);
67
+ if (license.tier !== "pro") {
68
+ spinner.stop(color.red("Pro license required"));
69
+ throw new Error(`Pro license required. Get yours at ${purchaseUrl()}`);
70
+ }
71
+ spinner.stop(color.green(`Verified — ${license.email ?? "Pro user"}`));
72
+ return { options, license };
73
+ }
74
+ const cached = await loadCachedLicense();
75
+ if (cached?.tier === "pro") {
76
+ clack.log.success(`Using saved license${cached.email ? ` (${cached.email})` : ""}`);
77
+ return { options, license: cached };
78
+ }
79
+ const method = await promptLicenseMethod();
80
+ let license;
81
+ if (method === "browser") {
82
+ license = await verifyViaBrowserLogin();
83
+ }
84
+ else {
85
+ const keyInput = await clack.text({
86
+ message: "License key",
87
+ placeholder: "mdb_pro_...",
88
+ validate: (value) => {
89
+ if (!value?.trim())
90
+ return "License key is required";
91
+ return undefined;
92
+ },
93
+ });
94
+ if (clack.isCancel(keyInput)) {
95
+ clack.cancel("Cancelled.");
96
+ process.exit(0);
97
+ }
98
+ license = await verifyEnteredLicenseKey(keyInput);
99
+ }
100
+ if (license.tier !== "pro") {
101
+ throw new Error(`Pro license required. Purchase at ${purchaseUrl()}`);
102
+ }
103
+ return { options, license };
104
+ }
105
+ export async function promptSiteSelection(options) {
106
+ const presetOptions = SITE_PRESETS.map((preset) => ({
107
+ value: preset.id,
108
+ label: preset.label,
109
+ hint: preset.domain,
110
+ }));
111
+ clack.note(color.dim("↑↓ navigate · space toggle · enter confirm"), "Site selection");
112
+ const selectedSites = await clack.multiselect({
113
+ message: "What should we block?",
114
+ options: presetOptions,
115
+ initialValues: defaultSelectedPresetIds(),
116
+ required: true,
117
+ });
118
+ if (clack.isCancel(selectedSites)) {
119
+ clack.cancel("Cancelled.");
120
+ return null;
121
+ }
122
+ options.selectedPresetIds = selectedSites;
123
+ const customDomains = await clack.text({
124
+ message: "Custom domains (optional)",
125
+ placeholder: "news.ycombinator.com, old.reddit.com",
126
+ });
127
+ if (clack.isCancel(customDomains)) {
128
+ clack.cancel("Cancelled.");
129
+ return null;
130
+ }
131
+ options.customDomains = parseList(customDomains ?? "");
132
+ options.skipTunnel = false;
133
+ return options;
134
+ }
135
+ export function showSuccessOutro(params) {
136
+ const hasRemoteRelay = Boolean(params.remoteMcpUrl?.startsWith("https://"));
137
+ const lines = [
138
+ `${color.green("▸")} ${params.blockedCount} domain(s) blocked`,
139
+ `${color.green("▸")} MCP server running`,
140
+ ];
141
+ if (hasRemoteRelay && params.remoteMcpUrl) {
142
+ lines.push(`${color.green("▸")} Remote URL: ${params.remoteMcpUrl}`);
143
+ }
144
+ lines.push("", color.dim("Connect your AI agent next (Poke, Claude, or ChatGPT)."));
145
+ if (params.authToken) {
146
+ lines.push("", color.dim("Credentials are saved in ~/.mac-distraction-blocker/setup-manifest.json"));
147
+ }
148
+ clack.note(lines.join("\n"), "Done");
149
+ }
150
+ //# sourceMappingURL=tui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tui.js","sourceRoot":"","sources":["../../src/installer/tui.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { PlatformInfo } from "./types.js";
2
+ export declare function installCloudflaredLaunchAgent(params: {
3
+ tunnelToken: string;
4
+ platform: PlatformInfo;
5
+ autoInstallTunnel: boolean;
6
+ }): Promise<string>;
7
+ export declare function installQuickTunnelLaunchAgent(params: {
8
+ port: number;
9
+ platform: PlatformInfo;
10
+ autoInstallTunnel: boolean;
11
+ }): Promise<string>;
12
+ export declare function isCloudflaredLaunchAgentInstalled(): Promise<boolean>;
13
+ //# sourceMappingURL=tunnel-daemon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tunnel-daemon.d.ts","sourceRoot":"","sources":["../../src/installer/tunnel-daemon.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAc/C,wBAAsB,6BAA6B,CAAC,MAAM,EAAE;IAC1D,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,YAAY,CAAC;IACvB,iBAAiB,EAAE,OAAO,CAAC;CAC5B,GAAG,OAAO,CAAC,MAAM,CAAC,CAyElB;AAED,wBAAsB,6BAA6B,CAAC,MAAM,EAAE;IAC1D,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,YAAY,CAAC;IACvB,iBAAiB,EAAE,OAAO,CAAC;CAC5B,GAAG,OAAO,CAAC,MAAM,CAAC,CAqElB;AAED,wBAAsB,iCAAiC,IAAI,OAAO,CAAC,OAAO,CAAC,CAc1E"}