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.
- package/README.md +349 -0
- package/assets/icon-256.png +0 -0
- package/assets/icon-32.png +0 -0
- package/assets/icon.svg +4 -0
- package/dist/blocker.d.ts +23 -0
- package/dist/blocker.d.ts.map +1 -0
- package/dist/blocker.js +184 -0
- package/dist/blocker.js.map +1 -0
- package/dist/brand.d.ts +12 -0
- package/dist/brand.d.ts.map +1 -0
- package/dist/brand.js +12 -0
- package/dist/brand.js.map +1 -0
- package/dist/hosts-manager.d.ts +14 -0
- package/dist/hosts-manager.d.ts.map +1 -0
- package/dist/hosts-manager.js +233 -0
- package/dist/hosts-manager.js.map +1 -0
- package/dist/hosts-manager.test.d.ts +2 -0
- package/dist/hosts-manager.test.d.ts.map +1 -0
- package/dist/hosts-manager.test.js +19 -0
- package/dist/hosts-manager.test.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +296 -0
- package/dist/index.js.map +1 -0
- package/dist/install.d.ts +3 -0
- package/dist/install.d.ts.map +1 -0
- package/dist/install.js +15 -0
- package/dist/install.js.map +1 -0
- package/dist/installer/agent-instructions.d.ts +25 -0
- package/dist/installer/agent-instructions.d.ts.map +1 -0
- package/dist/installer/agent-instructions.js +36 -0
- package/dist/installer/agent-instructions.js.map +1 -0
- package/dist/installer/agents.d.ts +9 -0
- package/dist/installer/agents.d.ts.map +1 -0
- package/dist/installer/agents.js +223 -0
- package/dist/installer/agents.js.map +1 -0
- package/dist/installer/background-service.d.ts +11 -0
- package/dist/installer/background-service.d.ts.map +1 -0
- package/dist/installer/background-service.js +47 -0
- package/dist/installer/background-service.js.map +1 -0
- package/dist/installer/clipboard.d.ts +2 -0
- package/dist/installer/clipboard.d.ts.map +1 -0
- package/dist/installer/clipboard.js +28 -0
- package/dist/installer/clipboard.js.map +1 -0
- package/dist/installer/daemon-linux.d.ts +10 -0
- package/dist/installer/daemon-linux.d.ts.map +1 -0
- package/dist/installer/daemon-linux.js +66 -0
- package/dist/installer/daemon-linux.js.map +1 -0
- package/dist/installer/daemon-windows.d.ts +10 -0
- package/dist/installer/daemon-windows.d.ts.map +1 -0
- package/dist/installer/daemon-windows.js +88 -0
- package/dist/installer/daemon-windows.js.map +1 -0
- package/dist/installer/daemon.d.ts +10 -0
- package/dist/installer/daemon.d.ts.map +1 -0
- package/dist/installer/daemon.js +96 -0
- package/dist/installer/daemon.js.map +1 -0
- package/dist/installer/hosts-sudo.d.ts +6 -0
- package/dist/installer/hosts-sudo.d.ts.map +1 -0
- package/dist/installer/hosts-sudo.js +111 -0
- package/dist/installer/hosts-sudo.js.map +1 -0
- package/dist/installer/legacy-tunnels.d.ts +2 -0
- package/dist/installer/legacy-tunnels.d.ts.map +1 -0
- package/dist/installer/legacy-tunnels.js +27 -0
- package/dist/installer/legacy-tunnels.js.map +1 -0
- package/dist/installer/license.d.ts +9 -0
- package/dist/installer/license.d.ts.map +1 -0
- package/dist/installer/license.js +193 -0
- package/dist/installer/license.js.map +1 -0
- package/dist/installer/mcp-cleanup.d.ts +3 -0
- package/dist/installer/mcp-cleanup.d.ts.map +1 -0
- package/dist/installer/mcp-cleanup.js +28 -0
- package/dist/installer/mcp-cleanup.js.map +1 -0
- package/dist/installer/platform.d.ts +7 -0
- package/dist/installer/platform.d.ts.map +1 -0
- package/dist/installer/platform.js +76 -0
- package/dist/installer/platform.js.map +1 -0
- package/dist/installer/poke-daemon.d.ts +14 -0
- package/dist/installer/poke-daemon.d.ts.map +1 -0
- package/dist/installer/poke-daemon.js +161 -0
- package/dist/installer/poke-daemon.js.map +1 -0
- package/dist/installer/poke.d.ts +43 -0
- package/dist/installer/poke.d.ts.map +1 -0
- package/dist/installer/poke.js +154 -0
- package/dist/installer/poke.js.map +1 -0
- package/dist/installer/port.d.ts +6 -0
- package/dist/installer/port.d.ts.map +1 -0
- package/dist/installer/port.js +76 -0
- package/dist/installer/port.js.map +1 -0
- package/dist/installer/presets.d.ts +5 -0
- package/dist/installer/presets.d.ts.map +1 -0
- package/dist/installer/presets.js +22 -0
- package/dist/installer/presets.js.map +1 -0
- package/dist/installer/prompts.d.ts +8 -0
- package/dist/installer/prompts.d.ts.map +1 -0
- package/dist/installer/prompts.js +128 -0
- package/dist/installer/prompts.js.map +1 -0
- package/dist/installer/relay-credentials.d.ts +26 -0
- package/dist/installer/relay-credentials.d.ts.map +1 -0
- package/dist/installer/relay-credentials.js +75 -0
- package/dist/installer/relay-credentials.js.map +1 -0
- package/dist/installer/relay-provision.d.ts +26 -0
- package/dist/installer/relay-provision.d.ts.map +1 -0
- package/dist/installer/relay-provision.js +57 -0
- package/dist/installer/relay-provision.js.map +1 -0
- package/dist/installer/run.d.ts +2 -0
- package/dist/installer/run.d.ts.map +1 -0
- package/dist/installer/run.js +365 -0
- package/dist/installer/run.js.map +1 -0
- package/dist/installer/tty.d.ts +7 -0
- package/dist/installer/tty.d.ts.map +1 -0
- package/dist/installer/tty.js +37 -0
- package/dist/installer/tty.js.map +1 -0
- package/dist/installer/tui.d.ts +14 -0
- package/dist/installer/tui.d.ts.map +1 -0
- package/dist/installer/tui.js +150 -0
- package/dist/installer/tui.js.map +1 -0
- package/dist/installer/tunnel-daemon.d.ts +13 -0
- package/dist/installer/tunnel-daemon.d.ts.map +1 -0
- package/dist/installer/tunnel-daemon.js +129 -0
- package/dist/installer/tunnel-daemon.js.map +1 -0
- package/dist/installer/tunnel-provision.d.ts +14 -0
- package/dist/installer/tunnel-provision.d.ts.map +1 -0
- package/dist/installer/tunnel-provision.js +31 -0
- package/dist/installer/tunnel-provision.js.map +1 -0
- package/dist/installer/tunnel.d.ts +12 -0
- package/dist/installer/tunnel.d.ts.map +1 -0
- package/dist/installer/tunnel.js +91 -0
- package/dist/installer/tunnel.js.map +1 -0
- package/dist/installer/types.d.ts +59 -0
- package/dist/installer/types.d.ts.map +1 -0
- package/dist/installer/types.js +2 -0
- package/dist/installer/types.js.map +1 -0
- package/dist/license-check.d.ts +12 -0
- package/dist/license-check.d.ts.map +1 -0
- package/dist/license-check.js +59 -0
- package/dist/license-check.js.map +1 -0
- package/dist/license-guard.d.ts +14 -0
- package/dist/license-guard.d.ts.map +1 -0
- package/dist/license-guard.js +56 -0
- package/dist/license-guard.js.map +1 -0
- package/dist/license-guard.test.d.ts +2 -0
- package/dist/license-guard.test.d.ts.map +1 -0
- package/dist/license-guard.test.js +34 -0
- package/dist/license-guard.test.js.map +1 -0
- package/dist/relay-client.d.ts +32 -0
- package/dist/relay-client.d.ts.map +1 -0
- package/dist/relay-client.js +249 -0
- package/dist/relay-client.js.map +1 -0
- package/dist/relay-types.d.ts +30 -0
- package/dist/relay-types.d.ts.map +1 -0
- package/dist/relay-types.js +2 -0
- package/dist/relay-types.js.map +1 -0
- package/dist/relay-urls.d.ts +22 -0
- package/dist/relay-urls.d.ts.map +1 -0
- package/dist/relay-urls.js +57 -0
- package/dist/relay-urls.js.map +1 -0
- package/dist/server.d.ts +6 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +164 -0
- package/dist/server.js.map +1 -0
- package/dist/state.d.ts +12 -0
- package/dist/state.d.ts.map +1 -0
- package/dist/state.js +91 -0
- package/dist/state.js.map +1 -0
- package/dist/types.d.ts +40 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +41 -0
- package/dist/types.js.map +1 -0
- package/dist/types.test.d.ts +2 -0
- package/dist/types.test.d.ts.map +1 -0
- package/dist/types.test.js +13 -0
- package/dist/types.test.js.map +1 -0
- package/install.ps1 +41 -0
- package/install.sh +39 -0
- package/package.json +64 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"poke-daemon.d.ts","sourceRoot":"","sources":["../../src/installer/poke-daemon.ts"],"names":[],"mappings":"AAmBA,wBAAgB,aAAa,IAAI,MAAM,CAItC;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC,CAQvD;AAOD,wBAAsB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA6BvE;AAED,wBAAsB,qBAAqB,CAAC,MAAM,EAAE;IAClD,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,GAAG,OAAO,CAAC,MAAM,CAAC,CAiClB;AAED,wBAAsB,4BAA4B,CAAC,MAAM,EAAE;IACzD,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,GAAG,OAAO,CAAC,MAAM,CAAC,CAiElB;AAED,wBAAsB,gCAAgC,IAAI,OAAO,CAAC,OAAO,CAAC,CAczE;AAED,wBAAsB,8BAA8B,IAAI,OAAO,CAAC,IAAI,CAAC,CAcpE"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import { access, chmod, mkdir, writeFile } from "node:fs/promises";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
import { dirname, join } from "node:path";
|
|
5
|
+
import { promisify } from "node:util";
|
|
6
|
+
import { APP_NAME } from "../brand.js";
|
|
7
|
+
import { getInstallDir } from "./platform.js";
|
|
8
|
+
const execFileAsync = promisify(execFile);
|
|
9
|
+
const POKE_TUNNEL_LABEL = "com.lockin.poke-tunnel";
|
|
10
|
+
function escapeXml(value) {
|
|
11
|
+
return value
|
|
12
|
+
.replace(/&/g, "&")
|
|
13
|
+
.replace(/</g, "<")
|
|
14
|
+
.replace(/>/g, ">")
|
|
15
|
+
.replace(/"/g, """);
|
|
16
|
+
}
|
|
17
|
+
export function pokeConfigDir() {
|
|
18
|
+
const xdg = process.env.XDG_CONFIG_HOME;
|
|
19
|
+
const home = homedir();
|
|
20
|
+
return xdg ? join(xdg, "poke") : join(home, ".config", "poke");
|
|
21
|
+
}
|
|
22
|
+
export async function isPokeLoggedIn() {
|
|
23
|
+
try {
|
|
24
|
+
const raw = await readCredentialsFile();
|
|
25
|
+
const creds = JSON.parse(raw);
|
|
26
|
+
return Boolean(creds.token);
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
async function readCredentialsFile() {
|
|
33
|
+
const { readFile } = await import("node:fs/promises");
|
|
34
|
+
return readFile(join(pokeConfigDir(), "credentials.json"), "utf8");
|
|
35
|
+
}
|
|
36
|
+
export async function ensurePokeCli(installDir) {
|
|
37
|
+
const pokeCliDir = join(installDir, "poke-cli");
|
|
38
|
+
const cliPath = join(pokeCliDir, "node_modules", "poke", "dist", "cli.cjs");
|
|
39
|
+
try {
|
|
40
|
+
await access(cliPath);
|
|
41
|
+
return cliPath;
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
await mkdir(pokeCliDir, { recursive: true });
|
|
45
|
+
await execFileAsync("npm", [
|
|
46
|
+
"install",
|
|
47
|
+
"--prefix",
|
|
48
|
+
pokeCliDir,
|
|
49
|
+
"poke@latest",
|
|
50
|
+
"--omit=dev",
|
|
51
|
+
"--no-fund",
|
|
52
|
+
"--no-audit",
|
|
53
|
+
], {
|
|
54
|
+
env: {
|
|
55
|
+
...process.env,
|
|
56
|
+
npm_config_update_notifier: "false",
|
|
57
|
+
},
|
|
58
|
+
});
|
|
59
|
+
return cliPath;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
export async function writePokeTunnelScript(params) {
|
|
63
|
+
const installDir = getInstallDir();
|
|
64
|
+
const scriptPath = join(installDir, "poke-tunnel.sh");
|
|
65
|
+
const name = params.integrationName ?? APP_NAME;
|
|
66
|
+
const script = `#!/bin/bash
|
|
67
|
+
set -euo pipefail
|
|
68
|
+
INSTALL_DIR="${installDir}"
|
|
69
|
+
PORT="${params.port}"
|
|
70
|
+
NAME="${name.replace(/"/g, '\\"')}"
|
|
71
|
+
POKE_CLI="$INSTALL_DIR/poke-cli/node_modules/poke/dist/cli.cjs"
|
|
72
|
+
PATH="/usr/local/bin:/opt/homebrew/bin:$HOME/.local/bin:/usr/bin:/bin:$PATH"
|
|
73
|
+
export PATH
|
|
74
|
+
|
|
75
|
+
if [[ ! -f "$POKE_CLI" ]]; then
|
|
76
|
+
npm install --prefix "$INSTALL_DIR/poke-cli" poke@latest --omit=dev --no-fund --no-audit >/dev/null 2>&1 || true
|
|
77
|
+
fi
|
|
78
|
+
|
|
79
|
+
for _ in $(seq 1 180); do
|
|
80
|
+
if curl -sf "http://127.0.0.1:$PORT/health" 2>/dev/null | grep -q 'lockin-mcp'; then
|
|
81
|
+
exec node "$POKE_CLI" tunnel "http://127.0.0.1:$PORT/mcp" -n "$NAME"
|
|
82
|
+
fi
|
|
83
|
+
sleep 2
|
|
84
|
+
done
|
|
85
|
+
|
|
86
|
+
echo "LockIn MCP not reachable on port $PORT (is com.lockin.mcp running?)" >&2
|
|
87
|
+
exit 1
|
|
88
|
+
`;
|
|
89
|
+
await mkdir(installDir, { recursive: true });
|
|
90
|
+
await writeFile(scriptPath, script, { mode: 0o755 });
|
|
91
|
+
await chmod(scriptPath, 0o755);
|
|
92
|
+
return scriptPath;
|
|
93
|
+
}
|
|
94
|
+
export async function installPokeTunnelLaunchAgent(params) {
|
|
95
|
+
const installDir = getInstallDir();
|
|
96
|
+
await ensurePokeCli(installDir);
|
|
97
|
+
const scriptPath = await writePokeTunnelScript(params);
|
|
98
|
+
const stdoutLog = join(installDir, "poke-tunnel.stdout.log");
|
|
99
|
+
const stderrLog = join(installDir, "poke-tunnel.stderr.log");
|
|
100
|
+
const plistPath = join(homedir(), "Library", "LaunchAgents", `${POKE_TUNNEL_LABEL}.plist`);
|
|
101
|
+
await mkdir(dirname(plistPath), { recursive: true });
|
|
102
|
+
const home = homedir();
|
|
103
|
+
const pathEnv = "/usr/local/bin:/opt/homebrew/bin:/usr/bin:/bin:" +
|
|
104
|
+
`${home}/.local/bin`;
|
|
105
|
+
const plist = `<?xml version="1.0" encoding="UTF-8"?>
|
|
106
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
107
|
+
<plist version="1.0">
|
|
108
|
+
<dict>
|
|
109
|
+
<key>Label</key>
|
|
110
|
+
<string>${POKE_TUNNEL_LABEL}</string>
|
|
111
|
+
<key>ProgramArguments</key>
|
|
112
|
+
<array>
|
|
113
|
+
<string>/bin/bash</string>
|
|
114
|
+
<string>${escapeXml(scriptPath)}</string>
|
|
115
|
+
</array>
|
|
116
|
+
<key>EnvironmentVariables</key>
|
|
117
|
+
<dict>
|
|
118
|
+
<key>HOME</key>
|
|
119
|
+
<string>${escapeXml(home)}</string>
|
|
120
|
+
<key>PATH</key>
|
|
121
|
+
<string>${escapeXml(pathEnv)}</string>
|
|
122
|
+
<key>LOCKIN_MCP_PORT</key>
|
|
123
|
+
<string>${params.port}</string>
|
|
124
|
+
</dict>
|
|
125
|
+
<key>RunAtLoad</key>
|
|
126
|
+
<true/>
|
|
127
|
+
<key>KeepAlive</key>
|
|
128
|
+
<true/>
|
|
129
|
+
<key>ThrottleInterval</key>
|
|
130
|
+
<integer>30</integer>
|
|
131
|
+
<key>StandardOutPath</key>
|
|
132
|
+
<string>${escapeXml(stdoutLog)}</string>
|
|
133
|
+
<key>StandardErrorPath</key>
|
|
134
|
+
<string>${escapeXml(stderrLog)}</string>
|
|
135
|
+
</dict>
|
|
136
|
+
</plist>
|
|
137
|
+
`;
|
|
138
|
+
await writeFile(plistPath, plist, { mode: 0o644 });
|
|
139
|
+
const guiDomain = `gui/${process.getuid?.() ?? process.env.UID ?? "501"}`;
|
|
140
|
+
await execFileAsync("launchctl", ["bootout", guiDomain, plistPath]).catch(() => undefined);
|
|
141
|
+
await execFileAsync("launchctl", ["bootstrap", guiDomain, plistPath]);
|
|
142
|
+
return plistPath;
|
|
143
|
+
}
|
|
144
|
+
export async function isPokeTunnelLaunchAgentInstalled() {
|
|
145
|
+
const plistPath = join(homedir(), "Library", "LaunchAgents", `${POKE_TUNNEL_LABEL}.plist`);
|
|
146
|
+
try {
|
|
147
|
+
await access(plistPath);
|
|
148
|
+
return true;
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
return false;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
export async function uninstallPokeTunnelLaunchAgent() {
|
|
155
|
+
const plistPath = join(homedir(), "Library", "LaunchAgents", `${POKE_TUNNEL_LABEL}.plist`);
|
|
156
|
+
const guiDomain = `gui/${process.getuid?.() ?? process.env.UID ?? "501"}`;
|
|
157
|
+
await execFileAsync("launchctl", ["bootout", guiDomain, plistPath]).catch(() => undefined);
|
|
158
|
+
const { unlink } = await import("node:fs/promises");
|
|
159
|
+
await unlink(plistPath).catch(() => undefined);
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=poke-daemon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"poke-daemon.js","sourceRoot":"","sources":["../../src/installer/poke-daemon.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { SetupManifest } from "./types.js";
|
|
2
|
+
export interface PokeUrls {
|
|
3
|
+
integrationUrl: string;
|
|
4
|
+
recipeUrl: string;
|
|
5
|
+
kitchenTemplateUrl: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function publicMcpUrl(publicBaseUrl: string): string;
|
|
8
|
+
/** @deprecated Use {@link publicMcpUrl} — Poke uses streamable HTTP (/mcp). */
|
|
9
|
+
export declare function publicSseMcpUrl(publicBaseUrl: string): string;
|
|
10
|
+
export declare function publicStreamableMcpUrl(publicBaseUrl: string): string;
|
|
11
|
+
/** Shell-safe single-quoted string for copy/paste into terminal. */
|
|
12
|
+
export declare function shellQuote(value: string): string;
|
|
13
|
+
export declare function buildPokeMcpAddCommand(params: {
|
|
14
|
+
publicMcpUrl: string;
|
|
15
|
+
mcpAuthToken?: string;
|
|
16
|
+
integrationName?: string;
|
|
17
|
+
}): string;
|
|
18
|
+
export declare function buildPokeLoginCommand(): string;
|
|
19
|
+
/** Poke `tunnel` forwards localhost to Poke — no API-key flag; set key in Poke UI after. */
|
|
20
|
+
export declare function buildPokeLocalTunnelCommand(params: {
|
|
21
|
+
localMcpUrl: string;
|
|
22
|
+
integrationName?: string;
|
|
23
|
+
}): string;
|
|
24
|
+
export { POKE_LOCKIN_RECIPE_URL } from "../brand.js";
|
|
25
|
+
export declare const POKE_INTEGRATIONS_NEW_URL: string;
|
|
26
|
+
export declare const POKE_INTEGRATIONS_URL: string;
|
|
27
|
+
export declare function buildPokeUrls(params: {
|
|
28
|
+
publicMcpUrl?: string;
|
|
29
|
+
remoteMcpUrl?: string;
|
|
30
|
+
mcpAuthToken?: string;
|
|
31
|
+
integrationName?: string;
|
|
32
|
+
recipeName?: string;
|
|
33
|
+
recipeDescription?: string;
|
|
34
|
+
prefilledFirstText?: string;
|
|
35
|
+
}): PokeUrls;
|
|
36
|
+
export declare function tryPokeRecipeCli(params: {
|
|
37
|
+
localMcpUrl: string;
|
|
38
|
+
integrationName: string;
|
|
39
|
+
}): Promise<string | null>;
|
|
40
|
+
export declare function formatSetupSummary(manifest: SetupManifest, urls: PokeUrls): string;
|
|
41
|
+
export declare function pokeConfigDir(): string;
|
|
42
|
+
export declare function isPokeLoggedIn(): Promise<boolean>;
|
|
43
|
+
//# sourceMappingURL=poke.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"poke.d.ts","sourceRoot":"","sources":["../../src/installer/poke.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAKhD,MAAM,WAAW,QAAQ;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED,wBAAgB,YAAY,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAG1D;AAED,+EAA+E;AAC/E,wBAAgB,eAAe,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED,wBAAgB,sBAAsB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAEpE;AAED,oEAAoE;AACpE,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE;IAC7C,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,GAAG,MAAM,CAaT;AAED,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAED,4FAA4F;AAC5F,wBAAgB,2BAA2B,CAAC,MAAM,EAAE;IAClD,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,GAAG,MAAM,CAST;AAED,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACrD,eAAO,MAAM,yBAAyB,QAAsC,CAAC;AAC7E,eAAO,MAAM,qBAAqB,QAAkC,CAAC;AAErE,wBAAgB,aAAa,CAAC,MAAM,EAAE;IACpC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,GAAG,QAAQ,CAqDX;AAED,wBAAsB,gBAAgB,CAAC,MAAM,EAAE;IAC7C,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;CACzB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAqBzB;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,GAAG,MAAM,CAyClF;AAED,wBAAgB,aAAa,IAAI,MAAM,CAItC;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC,CAWvD"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { APP_NAME, POKE_LOCKIN_RECIPE_URL } from "../brand.js";
|
|
2
|
+
import { execFile } from "node:child_process";
|
|
3
|
+
import { readFile } from "node:fs/promises";
|
|
4
|
+
import { homedir } from "node:os";
|
|
5
|
+
import { join } from "node:path";
|
|
6
|
+
import { promisify } from "node:util";
|
|
7
|
+
const execFileAsync = promisify(execFile);
|
|
8
|
+
const POKE_FRONTEND = process.env.POKE_FRONTEND ?? "https://poke.com";
|
|
9
|
+
export function publicMcpUrl(publicBaseUrl) {
|
|
10
|
+
const base = publicBaseUrl.replace(/\/$/, "");
|
|
11
|
+
return base.endsWith("/mcp") ? base : `${base}/mcp`;
|
|
12
|
+
}
|
|
13
|
+
/** @deprecated Use {@link publicMcpUrl} — Poke uses streamable HTTP (/mcp). */
|
|
14
|
+
export function publicSseMcpUrl(publicBaseUrl) {
|
|
15
|
+
return publicMcpUrl(publicBaseUrl);
|
|
16
|
+
}
|
|
17
|
+
export function publicStreamableMcpUrl(publicBaseUrl) {
|
|
18
|
+
return publicMcpUrl(publicBaseUrl);
|
|
19
|
+
}
|
|
20
|
+
/** Shell-safe single-quoted string for copy/paste into terminal. */
|
|
21
|
+
export function shellQuote(value) {
|
|
22
|
+
return `'${value.replace(/'/g, "'\\''")}'`;
|
|
23
|
+
}
|
|
24
|
+
export function buildPokeMcpAddCommand(params) {
|
|
25
|
+
const mcpUrl = publicMcpUrl(params.publicMcpUrl);
|
|
26
|
+
const name = params.integrationName ?? APP_NAME;
|
|
27
|
+
const parts = [
|
|
28
|
+
"npx poke@latest mcp add",
|
|
29
|
+
shellQuote(mcpUrl),
|
|
30
|
+
"-n",
|
|
31
|
+
shellQuote(name),
|
|
32
|
+
];
|
|
33
|
+
if (params.mcpAuthToken) {
|
|
34
|
+
parts.push("--api-key", shellQuote(params.mcpAuthToken));
|
|
35
|
+
}
|
|
36
|
+
return parts.join(" ");
|
|
37
|
+
}
|
|
38
|
+
export function buildPokeLoginCommand() {
|
|
39
|
+
return "npx poke@latest login";
|
|
40
|
+
}
|
|
41
|
+
/** Poke `tunnel` forwards localhost to Poke — no API-key flag; set key in Poke UI after. */
|
|
42
|
+
export function buildPokeLocalTunnelCommand(params) {
|
|
43
|
+
const name = params.integrationName ?? APP_NAME;
|
|
44
|
+
const mcpUrl = `${params.localMcpUrl.replace(/\/$/, "")}/mcp`;
|
|
45
|
+
return [
|
|
46
|
+
"npx poke@latest tunnel",
|
|
47
|
+
mcpUrl,
|
|
48
|
+
"-n",
|
|
49
|
+
shellQuote(name),
|
|
50
|
+
].join(" ");
|
|
51
|
+
}
|
|
52
|
+
export { POKE_LOCKIN_RECIPE_URL } from "../brand.js";
|
|
53
|
+
export const POKE_INTEGRATIONS_NEW_URL = `${POKE_FRONTEND}/integrations/new`;
|
|
54
|
+
export const POKE_INTEGRATIONS_URL = `${POKE_FRONTEND}/integrations`;
|
|
55
|
+
export function buildPokeUrls(params) {
|
|
56
|
+
const integrationName = params.integrationName ?? APP_NAME;
|
|
57
|
+
const recipeName = params.recipeName ?? "Distraction Coach";
|
|
58
|
+
const recipeDescription = params.recipeDescription ??
|
|
59
|
+
"An AI focus coach that blocks distracting sites and helps you stay on task.";
|
|
60
|
+
const prefilledFirstText = params.prefilledFirstText ??
|
|
61
|
+
"Help me stay focused. Check what sites are blocked and coach me when I ask to unblock something.";
|
|
62
|
+
const mcpUrl = params.remoteMcpUrl ??
|
|
63
|
+
(params.publicMcpUrl ? publicMcpUrl(params.publicMcpUrl) : "");
|
|
64
|
+
if (!mcpUrl) {
|
|
65
|
+
throw new Error("remoteMcpUrl or publicMcpUrl required for Poke URLs");
|
|
66
|
+
}
|
|
67
|
+
const integrationQuery = new URLSearchParams({
|
|
68
|
+
name: integrationName,
|
|
69
|
+
url: mcpUrl,
|
|
70
|
+
iconUrl: process.env.MDB_ICON_URL ?? `https://lockinmcp.com/icon.png`,
|
|
71
|
+
});
|
|
72
|
+
if (params.mcpAuthToken) {
|
|
73
|
+
integrationQuery.set("apiKey", params.mcpAuthToken);
|
|
74
|
+
}
|
|
75
|
+
const recipeQuery = new URLSearchParams({
|
|
76
|
+
name: recipeName,
|
|
77
|
+
description: recipeDescription,
|
|
78
|
+
prefilledFirstText,
|
|
79
|
+
integrationName,
|
|
80
|
+
integrationUrl: mcpUrl,
|
|
81
|
+
});
|
|
82
|
+
if (params.mcpAuthToken) {
|
|
83
|
+
recipeQuery.set("integrationApiKey", params.mcpAuthToken);
|
|
84
|
+
}
|
|
85
|
+
const templateQuery = new URLSearchParams({
|
|
86
|
+
name: integrationName,
|
|
87
|
+
url: mcpUrl,
|
|
88
|
+
});
|
|
89
|
+
if (params.mcpAuthToken) {
|
|
90
|
+
templateQuery.set("apiKey", params.mcpAuthToken);
|
|
91
|
+
}
|
|
92
|
+
return {
|
|
93
|
+
integrationUrl: `${POKE_FRONTEND}/integrations/new?${integrationQuery.toString()}`,
|
|
94
|
+
recipeUrl: `${POKE_FRONTEND}/kitchen/recipes/new?${recipeQuery.toString()}`,
|
|
95
|
+
kitchenTemplateUrl: `${POKE_FRONTEND}/kitchen/templates/new?${templateQuery.toString()}`,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
export async function tryPokeRecipeCli(params) {
|
|
99
|
+
try {
|
|
100
|
+
const { stdout } = await execFileAsync("npx", [
|
|
101
|
+
"-y",
|
|
102
|
+
"poke@latest",
|
|
103
|
+
"tunnel",
|
|
104
|
+
`${params.localMcpUrl}/mcp`,
|
|
105
|
+
"-n",
|
|
106
|
+
params.integrationName,
|
|
107
|
+
"--recipe",
|
|
108
|
+
], { timeout: 120_000 });
|
|
109
|
+
const recipeMatch = stdout.match(/https:\/\/poke\.com\/r\/[A-Za-z0-9_-]+/);
|
|
110
|
+
return recipeMatch?.[0] ?? null;
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
export function formatSetupSummary(manifest, urls) {
|
|
117
|
+
const lines = [
|
|
118
|
+
"",
|
|
119
|
+
"════════════════════════════════════════════════════════",
|
|
120
|
+
` ${APP_NAME} — setup complete`,
|
|
121
|
+
"════════════════════════════════════════════════════════",
|
|
122
|
+
"",
|
|
123
|
+
`Blocked domains: ${manifest.blockedDomains.join(", ") || "(none)"}`,
|
|
124
|
+
`Local MCP URL: ${manifest.localMcpUrl}/mcp`,
|
|
125
|
+
];
|
|
126
|
+
if (manifest.publicMcpUrl) {
|
|
127
|
+
lines.push(`Public MCP URL: ${publicMcpUrl(manifest.publicMcpUrl)}`);
|
|
128
|
+
}
|
|
129
|
+
if (manifest.mcpAuthToken) {
|
|
130
|
+
lines.push(`MCP API key: ${manifest.mcpAuthToken}`);
|
|
131
|
+
}
|
|
132
|
+
lines.push("", "Poke — recommended: install the LockIn recipe for best focus coaching:", ` ${POKE_LOCKIN_RECIPE_URL}`, "", "Poke — integration setup (credentials pre-filled where supported):", ` Integration: ${urls.integrationUrl}`, ` Recipe: ${urls.recipeUrl}`, ` Template: ${urls.kitchenTemplateUrl}`);
|
|
133
|
+
if (manifest.pokeRecipeUrl) {
|
|
134
|
+
lines.push(` CLI recipe: ${manifest.pokeRecipeUrl}`);
|
|
135
|
+
}
|
|
136
|
+
lines.push("", `Setup manifest: ~/.mac-distraction-blocker/setup-manifest.json`, "");
|
|
137
|
+
return lines.join("\n");
|
|
138
|
+
}
|
|
139
|
+
export function pokeConfigDir() {
|
|
140
|
+
const xdg = process.env.XDG_CONFIG_HOME;
|
|
141
|
+
const home = homedir();
|
|
142
|
+
return xdg ? join(xdg, "poke") : join(home, ".config", "poke");
|
|
143
|
+
}
|
|
144
|
+
export async function isPokeLoggedIn() {
|
|
145
|
+
try {
|
|
146
|
+
const raw = await readFile(join(pokeConfigDir(), "credentials.json"), "utf8");
|
|
147
|
+
const creds = JSON.parse(raw);
|
|
148
|
+
return Boolean(creds.token);
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
return false;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=poke.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"poke.js","sourceRoot":"","sources":["../../src/installer/poke.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare const DEFAULT_LOCKIN_MCP_PORT = 3847;
|
|
2
|
+
export declare function fetchLockInHealth(port: number): Promise<boolean>;
|
|
3
|
+
export declare function isPortAvailable(port: number): Promise<boolean>;
|
|
4
|
+
export declare function describePortConflict(port: number): Promise<string | null>;
|
|
5
|
+
export declare function resolveMcpPort(preferred: number): Promise<number>;
|
|
6
|
+
//# sourceMappingURL=port.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"port.d.ts","sourceRoot":"","sources":["../../src/installer/port.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,uBAAuB,OAAO,CAAC;AAE5C,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAatE;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CASpE;AAED,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAuB/E;AAED,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA4BvE"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { createServer } from "node:net";
|
|
2
|
+
export const DEFAULT_LOCKIN_MCP_PORT = 3847;
|
|
3
|
+
export async function fetchLockInHealth(port) {
|
|
4
|
+
try {
|
|
5
|
+
const response = await fetch(`http://127.0.0.1:${port}/health`, {
|
|
6
|
+
signal: AbortSignal.timeout(2000),
|
|
7
|
+
});
|
|
8
|
+
if (!response.ok) {
|
|
9
|
+
return false;
|
|
10
|
+
}
|
|
11
|
+
const body = (await response.json());
|
|
12
|
+
return body.service === "lockin-mcp";
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export async function isPortAvailable(port) {
|
|
19
|
+
return new Promise((resolve) => {
|
|
20
|
+
const server = createServer();
|
|
21
|
+
server.once("error", () => resolve(false));
|
|
22
|
+
server.once("listening", () => {
|
|
23
|
+
server.close(() => resolve(true));
|
|
24
|
+
});
|
|
25
|
+
server.listen(port, "127.0.0.1");
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
export async function describePortConflict(port) {
|
|
29
|
+
try {
|
|
30
|
+
const response = await fetch(`http://127.0.0.1:${port}/health`, {
|
|
31
|
+
signal: AbortSignal.timeout(2000),
|
|
32
|
+
});
|
|
33
|
+
if (!response.ok) {
|
|
34
|
+
return `Port ${port} responds but /health failed (${response.status})`;
|
|
35
|
+
}
|
|
36
|
+
const body = (await response.json());
|
|
37
|
+
if (body.service === "lockin-mcp") {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
const hint = typeof body.service === "string"
|
|
41
|
+
? body.service
|
|
42
|
+
: typeof body.status === "string"
|
|
43
|
+
? body.status
|
|
44
|
+
: "another app";
|
|
45
|
+
return `Port ${port} is used by ${hint}, not LockIn MCP`;
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
const available = await isPortAvailable(port);
|
|
49
|
+
return available ? null : `Port ${port} is already in use`;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
export async function resolveMcpPort(preferred) {
|
|
53
|
+
if (await fetchLockInHealth(preferred)) {
|
|
54
|
+
return preferred;
|
|
55
|
+
}
|
|
56
|
+
if (await isPortAvailable(preferred)) {
|
|
57
|
+
return preferred;
|
|
58
|
+
}
|
|
59
|
+
const candidates = [DEFAULT_LOCKIN_MCP_PORT];
|
|
60
|
+
for (let offset = 1; offset < 20; offset += 1) {
|
|
61
|
+
candidates.push(DEFAULT_LOCKIN_MCP_PORT + offset);
|
|
62
|
+
}
|
|
63
|
+
if (!candidates.includes(preferred)) {
|
|
64
|
+
candidates.unshift(preferred);
|
|
65
|
+
}
|
|
66
|
+
for (const port of candidates) {
|
|
67
|
+
if (await fetchLockInHealth(port)) {
|
|
68
|
+
return port;
|
|
69
|
+
}
|
|
70
|
+
if (await isPortAvailable(port)) {
|
|
71
|
+
return port;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
throw new Error(`No free port found for LockIn MCP (tried ${preferred} and ${DEFAULT_LOCKIN_MCP_PORT}–${DEFAULT_LOCKIN_MCP_PORT + 19})`);
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=port.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"port.js","sourceRoot":"","sources":["../../src/installer/port.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { SitePreset } from "./types.js";
|
|
2
|
+
export declare const SITE_PRESETS: SitePreset[];
|
|
3
|
+
export declare function resolveDomainsFromSelection(selectedPresetIds: string[], customDomains: string[]): string[];
|
|
4
|
+
export declare function defaultSelectedPresetIds(): string[];
|
|
5
|
+
//# sourceMappingURL=presets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presets.d.ts","sourceRoot":"","sources":["../../src/installer/presets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,eAAO,MAAM,YAAY,EAAE,UAAU,EAapC,CAAC;AAEF,wBAAgB,2BAA2B,CACzC,iBAAiB,EAAE,MAAM,EAAE,EAC3B,aAAa,EAAE,MAAM,EAAE,GACtB,MAAM,EAAE,CAMV;AAED,wBAAgB,wBAAwB,IAAI,MAAM,EAAE,CAInD"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export const SITE_PRESETS = [
|
|
2
|
+
{ id: "youtube", label: "YouTube", domain: "youtube.com", defaultSelected: true },
|
|
3
|
+
{ id: "x", label: "X (Twitter)", domain: "x.com", defaultSelected: true },
|
|
4
|
+
{ id: "tiktok", label: "TikTok", domain: "tiktok.com", defaultSelected: true },
|
|
5
|
+
{ id: "instagram", label: "Instagram", domain: "instagram.com", defaultSelected: true },
|
|
6
|
+
{ id: "reddit", label: "Reddit", domain: "reddit.com", defaultSelected: true },
|
|
7
|
+
{ id: "facebook", label: "Facebook", domain: "facebook.com", defaultSelected: false },
|
|
8
|
+
{ id: "netflix", label: "Netflix", domain: "netflix.com", defaultSelected: false },
|
|
9
|
+
{ id: "twitch", label: "Twitch", domain: "twitch.tv", defaultSelected: false },
|
|
10
|
+
{ id: "discord", label: "Discord", domain: "discord.com", defaultSelected: false },
|
|
11
|
+
{ id: "linkedin", label: "LinkedIn", domain: "linkedin.com", defaultSelected: false },
|
|
12
|
+
{ id: "buzzfeed", label: "BuzzFeed", domain: "buzzfeed.com", defaultSelected: false },
|
|
13
|
+
{ id: "pinterest", label: "Pinterest", domain: "pinterest.com", defaultSelected: false },
|
|
14
|
+
];
|
|
15
|
+
export function resolveDomainsFromSelection(selectedPresetIds, customDomains) {
|
|
16
|
+
const presetDomains = SITE_PRESETS.filter((preset) => selectedPresetIds.includes(preset.id)).map((preset) => preset.domain);
|
|
17
|
+
return [...new Set([...presetDomains, ...customDomains])];
|
|
18
|
+
}
|
|
19
|
+
export function defaultSelectedPresetIds() {
|
|
20
|
+
return SITE_PRESETS.filter((preset) => preset.defaultSelected).map((preset) => preset.id);
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=presets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presets.js","sourceRoot":"","sources":["../../src/installer/presets.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,YAAY,GAAiB;IACxC,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,eAAe,EAAE,IAAI,EAAE;IACjF,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE;IACzE,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,eAAe,EAAE,IAAI,EAAE;IAC9E,EAAE,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,eAAe,EAAE,eAAe,EAAE,IAAI,EAAE;IACvF,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,eAAe,EAAE,IAAI,EAAE;IAC9E,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,cAAc,EAAE,eAAe,EAAE,KAAK,EAAE;IACrF,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,eAAe,EAAE,KAAK,EAAE;IAClF,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,eAAe,EAAE,KAAK,EAAE;IAC9E,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,eAAe,EAAE,KAAK,EAAE;IAClF,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,cAAc,EAAE,eAAe,EAAE,KAAK,EAAE;IACrF,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,cAAc,EAAE,eAAe,EAAE,KAAK,EAAE;IACrF,EAAE,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,eAAe,EAAE,eAAe,EAAE,KAAK,EAAE;CACzF,CAAC;AAEF,MAAM,UAAU,2BAA2B,CACzC,iBAA2B,EAC3B,aAAuB;IAEvB,MAAM,aAAa,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CACnD,iBAAiB,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CACtC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAEjC,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,aAAa,EAAE,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,wBAAwB;IACtC,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,GAAG,CAChE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CACtB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { InstallerOptions } from "./types.js";
|
|
2
|
+
export declare function parseList(value: string): string[];
|
|
3
|
+
export declare function parseInstallerArgs(argv: string[]): InstallerOptions;
|
|
4
|
+
export declare function printInstallerHelp(): void;
|
|
5
|
+
export declare function summarizeSelections(options: InstallerOptions): {
|
|
6
|
+
domains: string[];
|
|
7
|
+
};
|
|
8
|
+
//# sourceMappingURL=prompts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/installer/prompts.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAGnD,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAKjD;AA6BD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,gBAAgB,CA+EnE;AAED,wBAAgB,kBAAkB,IAAI,IAAI,CAqBzC;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,gBAAgB,GAAG;IAC9D,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB,CAOA"}
|