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,36 @@
|
|
|
1
|
+
import { homedir } from "node:os";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { buildPokeMcpAddCommand } from "./poke.js";
|
|
4
|
+
export const CHATGPT_CONNECTORS_URL = "https://chatgpt.com/#settings/Connectors";
|
|
5
|
+
export function agentConnectionDetails(params) {
|
|
6
|
+
const claudeConfigPath = process.platform === "darwin"
|
|
7
|
+
? join(homedir(), "Library", "Application Support", "Claude", "claude_desktop_config.json")
|
|
8
|
+
: join(homedir(), ".config", "Claude", "claude_desktop_config.json");
|
|
9
|
+
return {
|
|
10
|
+
authToken: params.authToken,
|
|
11
|
+
remoteMcpUrl: params.remoteMcpUrl,
|
|
12
|
+
pokeIntegrationUrl: params.pokeIntegrationUrl,
|
|
13
|
+
poke: {
|
|
14
|
+
mcpUrl: params.remoteMcpUrl,
|
|
15
|
+
mcpAddCommand: buildPokeMcpAddCommand({
|
|
16
|
+
publicMcpUrl: params.remoteMcpUrl.replace(/\/mcp$/, ""),
|
|
17
|
+
mcpAuthToken: params.authToken,
|
|
18
|
+
}),
|
|
19
|
+
},
|
|
20
|
+
claude: {
|
|
21
|
+
mcpUrl: params.remoteMcpUrl,
|
|
22
|
+
configPath: claudeConfigPath,
|
|
23
|
+
},
|
|
24
|
+
chatgpt: {
|
|
25
|
+
mcpUrl: params.remoteMcpUrl,
|
|
26
|
+
settingsUrl: CHATGPT_CONNECTORS_URL,
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
export function formatCredentialsCard(details) {
|
|
31
|
+
return [
|
|
32
|
+
`Remote MCP URL: ${details.remoteMcpUrl}`,
|
|
33
|
+
`API key: ${details.authToken}`,
|
|
34
|
+
].join("\n");
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=agent-instructions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-instructions.js","sourceRoot":"","sources":["../../src/installer/agent-instructions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AAEnD,MAAM,CAAC,MAAM,sBAAsB,GAAG,0CAA0C,CAAC;AAoBjF,MAAM,UAAU,sBAAsB,CAAC,MAItC;IACC,MAAM,gBAAgB,GACpB,OAAO,CAAC,QAAQ,KAAK,QAAQ;QAC3B,CAAC,CAAC,IAAI,CACF,OAAO,EAAE,EACT,SAAS,EACT,qBAAqB,EACrB,QAAQ,EACR,4BAA4B,CAC7B;QACH,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,4BAA4B,CAAC,CAAC;IAEzE,OAAO;QACL,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,kBAAkB,EAAE,MAAM,CAAC,kBAAkB;QAC7C,IAAI,EAAE;YACJ,MAAM,EAAE,MAAM,CAAC,YAAY;YAC3B,aAAa,EAAE,sBAAsB,CAAC;gBACpC,YAAY,EAAE,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;gBACvD,YAAY,EAAE,MAAM,CAAC,SAAS;aAC/B,CAAC;SACH;QACD,MAAM,EAAE;YACN,MAAM,EAAE,MAAM,CAAC,YAAY;YAC3B,UAAU,EAAE,gBAAgB;SAC7B;QACD,OAAO,EAAE;YACP,MAAM,EAAE,MAAM,CAAC,YAAY;YAC3B,WAAW,EAAE,sBAAsB;SACpC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAA+B;IACnE,OAAO;QACL,mBAAmB,OAAO,CAAC,YAAY,EAAE;QACzC,mBAAmB,OAAO,CAAC,SAAS,EAAE;KACvC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface ConnectAgentParams {
|
|
2
|
+
remoteMcpUrl: string;
|
|
3
|
+
pokeIntegrationUrl: string;
|
|
4
|
+
authToken?: string;
|
|
5
|
+
publicTunnelVerified: boolean;
|
|
6
|
+
}
|
|
7
|
+
export declare function promptConnectAgent(params: ConnectAgentParams): Promise<void>;
|
|
8
|
+
export { promptBackgroundService, installBackgroundService } from "./background-service.js";
|
|
9
|
+
//# sourceMappingURL=agents.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/installer/agents.ts"],"names":[],"mappings":"AAmBA,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oBAAoB,EAAE,OAAO,CAAC;CAC/B;AA+ND,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC,IAAI,CAAC,CAyDf;AAED,OAAO,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import { readFile, writeFile, mkdir } from "node:fs/promises";
|
|
3
|
+
import { dirname, join } from "node:path";
|
|
4
|
+
import { promisify } from "node:util";
|
|
5
|
+
import * as clack from "@clack/prompts";
|
|
6
|
+
import color from "picocolors";
|
|
7
|
+
import { APP_NAME } from "../brand.js";
|
|
8
|
+
import { agentConnectionDetails, CHATGPT_CONNECTORS_URL, formatCredentialsCard, } from "./agent-instructions.js";
|
|
9
|
+
import { copyToClipboard } from "./clipboard.js";
|
|
10
|
+
import { getInstallDir, openBrowser } from "./platform.js";
|
|
11
|
+
import { buildPokeLoginCommand, POKE_LOCKIN_RECIPE_URL } from "./poke.js";
|
|
12
|
+
import { isPokeLoggedIn } from "./poke.js";
|
|
13
|
+
const execFileAsync = promisify(execFile);
|
|
14
|
+
async function mergeMcpServersConfig(configPath, serverKey, serverConfig) {
|
|
15
|
+
let config = {};
|
|
16
|
+
try {
|
|
17
|
+
const raw = await readFile(configPath, "utf8");
|
|
18
|
+
config = JSON.parse(raw);
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
// new config file
|
|
22
|
+
}
|
|
23
|
+
const servers = config.mcpServers && typeof config.mcpServers === "object"
|
|
24
|
+
? config.mcpServers
|
|
25
|
+
: {};
|
|
26
|
+
servers[serverKey] = serverConfig;
|
|
27
|
+
config.mcpServers = servers;
|
|
28
|
+
await mkdir(dirname(configPath), { recursive: true });
|
|
29
|
+
await writeFile(configPath, `${JSON.stringify(config, null, 2)}\n`);
|
|
30
|
+
}
|
|
31
|
+
function remoteServerConfig(url, authToken) {
|
|
32
|
+
const config = { url };
|
|
33
|
+
if (authToken) {
|
|
34
|
+
config.headers = { Authorization: `Bearer ${authToken}` };
|
|
35
|
+
}
|
|
36
|
+
return config;
|
|
37
|
+
}
|
|
38
|
+
async function ensurePokeLogin() {
|
|
39
|
+
if (await isPokeLoggedIn()) {
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
const loginCmd = buildPokeLoginCommand();
|
|
43
|
+
clack.note([
|
|
44
|
+
"Poke needs a one-time login in your browser.",
|
|
45
|
+
"",
|
|
46
|
+
color.cyan(loginCmd),
|
|
47
|
+
].join("\n"), "Poke login");
|
|
48
|
+
const copyLogin = await clack.confirm({
|
|
49
|
+
message: "Copy login command to clipboard?",
|
|
50
|
+
initialValue: true,
|
|
51
|
+
});
|
|
52
|
+
if (!clack.isCancel(copyLogin) && copyLogin) {
|
|
53
|
+
const copied = await copyToClipboard(loginCmd);
|
|
54
|
+
if (copied) {
|
|
55
|
+
clack.log.success("Login command copied — run it, then return here");
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
const loggedIn = await clack.confirm({
|
|
59
|
+
message: "I've logged in to Poke",
|
|
60
|
+
initialValue: false,
|
|
61
|
+
});
|
|
62
|
+
if (clack.isCancel(loggedIn) || !loggedIn) {
|
|
63
|
+
clack.log.warn("Run the login command, then re-run the installer to finish Poke setup.");
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
if (!(await isPokeLoggedIn())) {
|
|
67
|
+
clack.log.warn("Poke login not detected yet. Check ~/.config/poke/credentials.json exists, then try again.");
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
clack.log.success("Poke login verified");
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
async function setupPoke(details, relayReady) {
|
|
74
|
+
const loggedIn = await ensurePokeLogin();
|
|
75
|
+
if (!loggedIn) {
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
if (!relayReady) {
|
|
79
|
+
clack.log.warn("Relay was not verified during install. If Poke rejects the URL, finish background service setup and retry.");
|
|
80
|
+
}
|
|
81
|
+
clack.log.info("Opening Poke integration form (URL + API key pre-filled)...");
|
|
82
|
+
await openBrowser(details.pokeIntegrationUrl);
|
|
83
|
+
const spinner = clack.spinner();
|
|
84
|
+
spinner.start("Registering LockIn MCP with Poke CLI...");
|
|
85
|
+
try {
|
|
86
|
+
await execFileAsync("npx", [
|
|
87
|
+
"-y",
|
|
88
|
+
"poke@latest",
|
|
89
|
+
"mcp",
|
|
90
|
+
"add",
|
|
91
|
+
details.poke.mcpUrl,
|
|
92
|
+
"-n",
|
|
93
|
+
APP_NAME,
|
|
94
|
+
"--api-key",
|
|
95
|
+
details.authToken,
|
|
96
|
+
], { timeout: 120_000 });
|
|
97
|
+
spinner.stop(color.green("Poke integration registered via CLI"));
|
|
98
|
+
clack.log.info("Install the LockIn recipe for best results:");
|
|
99
|
+
clack.log.info(color.cyan(POKE_LOCKIN_RECIPE_URL));
|
|
100
|
+
const openRecipe = await clack.confirm({
|
|
101
|
+
message: "Open LockIn recipe in browser?",
|
|
102
|
+
initialValue: true,
|
|
103
|
+
});
|
|
104
|
+
if (!clack.isCancel(openRecipe) && openRecipe) {
|
|
105
|
+
await openBrowser(POKE_LOCKIN_RECIPE_URL);
|
|
106
|
+
}
|
|
107
|
+
clack.log.info("Start a new Poke chat to use LockIn tools.");
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
spinner.stop(color.yellow("CLI register skipped — use the browser tab"));
|
|
112
|
+
}
|
|
113
|
+
clack.note([
|
|
114
|
+
"In the Poke tab that just opened:",
|
|
115
|
+
`1. Confirm URL: ${color.cyan(details.poke.mcpUrl)}`,
|
|
116
|
+
`2. Confirm API key is filled in`,
|
|
117
|
+
"3. Click Create Integration",
|
|
118
|
+
`4. Install the LockIn recipe: ${color.cyan(POKE_LOCKIN_RECIPE_URL)}`,
|
|
119
|
+
"5. Start a new Poke chat",
|
|
120
|
+
].join("\n"), "Poke setup");
|
|
121
|
+
await copyToClipboard(details.authToken);
|
|
122
|
+
clack.log.success("API key copied to clipboard");
|
|
123
|
+
}
|
|
124
|
+
async function setupClaude(details) {
|
|
125
|
+
await mergeMcpServersConfig(details.claude.configPath, "lockin-mcp", remoteServerConfig(details.claude.mcpUrl, details.authToken));
|
|
126
|
+
clack.log.success(`Added lockin-mcp to ${details.claude.configPath}`);
|
|
127
|
+
clack.log.info("Restart Claude Desktop to load the server.");
|
|
128
|
+
}
|
|
129
|
+
async function setupChatGPT(details) {
|
|
130
|
+
clack.note([
|
|
131
|
+
"1. Open ChatGPT → Settings → Connectors",
|
|
132
|
+
`2. Add MCP server URL: ${color.cyan(details.chatgpt.mcpUrl)}`,
|
|
133
|
+
`3. API key / auth: ${color.cyan(details.authToken)}`,
|
|
134
|
+
"4. Save and start a new chat",
|
|
135
|
+
].join("\n"), "ChatGPT setup");
|
|
136
|
+
const action = await clack.select({
|
|
137
|
+
message: "What should we do next?",
|
|
138
|
+
options: [
|
|
139
|
+
{ value: "url", label: "Copy MCP URL" },
|
|
140
|
+
{ value: "key", label: "Copy API key" },
|
|
141
|
+
{ value: "open", label: "Open ChatGPT Connectors settings" },
|
|
142
|
+
{ value: "skip", label: "Done" },
|
|
143
|
+
],
|
|
144
|
+
});
|
|
145
|
+
if (clack.isCancel(action) || action === "skip") {
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
if (action === "url") {
|
|
149
|
+
await copyToClipboard(details.chatgpt.mcpUrl);
|
|
150
|
+
clack.log.success("MCP URL copied");
|
|
151
|
+
}
|
|
152
|
+
if (action === "key") {
|
|
153
|
+
await copyToClipboard(details.authToken);
|
|
154
|
+
clack.log.success("API key copied");
|
|
155
|
+
}
|
|
156
|
+
if (action === "open") {
|
|
157
|
+
await openBrowser(CHATGPT_CONNECTORS_URL);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
function showCredentialsCard(details) {
|
|
161
|
+
const manifestPath = join(getInstallDir(), "setup-manifest.json");
|
|
162
|
+
clack.note([
|
|
163
|
+
formatCredentialsCard(details),
|
|
164
|
+
"",
|
|
165
|
+
color.dim("One URL for all agents. Poke uses the same server automatically."),
|
|
166
|
+
color.dim(`Saved in ${manifestPath}`),
|
|
167
|
+
].join("\n"), "Your LockIn MCP credentials");
|
|
168
|
+
}
|
|
169
|
+
export async function promptConnectAgent(params) {
|
|
170
|
+
if (!params.authToken) {
|
|
171
|
+
clack.log.warn("Missing MCP API key — see setup manifest.");
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
const details = agentConnectionDetails({
|
|
175
|
+
remoteMcpUrl: params.remoteMcpUrl,
|
|
176
|
+
pokeIntegrationUrl: params.pokeIntegrationUrl,
|
|
177
|
+
authToken: params.authToken,
|
|
178
|
+
});
|
|
179
|
+
showCredentialsCard(details);
|
|
180
|
+
const choice = await clack.select({
|
|
181
|
+
message: "Connect your AI agent",
|
|
182
|
+
options: [
|
|
183
|
+
{
|
|
184
|
+
value: "poke",
|
|
185
|
+
label: "Poke",
|
|
186
|
+
hint: "opens poke.com/integrations/new",
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
value: "claude",
|
|
190
|
+
label: "Claude Desktop",
|
|
191
|
+
hint: "writes claude_desktop_config.json",
|
|
192
|
+
},
|
|
193
|
+
{
|
|
194
|
+
value: "chatgpt",
|
|
195
|
+
label: "ChatGPT",
|
|
196
|
+
hint: "copy URL + API key into Connectors",
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
value: "skip",
|
|
200
|
+
label: "Skip for now",
|
|
201
|
+
hint: "credentials above + setup manifest",
|
|
202
|
+
},
|
|
203
|
+
],
|
|
204
|
+
});
|
|
205
|
+
if (clack.isCancel(choice) || choice === "skip") {
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
switch (choice) {
|
|
209
|
+
case "poke":
|
|
210
|
+
await setupPoke(details, params.publicTunnelVerified);
|
|
211
|
+
break;
|
|
212
|
+
case "claude":
|
|
213
|
+
await setupClaude(details);
|
|
214
|
+
break;
|
|
215
|
+
case "chatgpt":
|
|
216
|
+
await setupChatGPT(details);
|
|
217
|
+
break;
|
|
218
|
+
default:
|
|
219
|
+
break;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
export { promptBackgroundService, installBackgroundService } from "./background-service.js";
|
|
223
|
+
//# sourceMappingURL=agents.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agents.js","sourceRoot":"","sources":["../../src/installer/agents.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface BackgroundServiceParams {
|
|
2
|
+
port: number;
|
|
3
|
+
authToken?: string;
|
|
4
|
+
serverEntry: string;
|
|
5
|
+
relayUrl?: string;
|
|
6
|
+
deviceId?: string;
|
|
7
|
+
relayDeviceToken?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function installBackgroundService(params: BackgroundServiceParams): Promise<boolean>;
|
|
10
|
+
export declare function promptBackgroundService(params: BackgroundServiceParams): Promise<boolean>;
|
|
11
|
+
//# sourceMappingURL=background-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"background-service.d.ts","sourceRoot":"","sources":["../../src/installer/background-service.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,uBAAuB,GAC9B,OAAO,CAAC,OAAO,CAAC,CA2BlB;AAED,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,uBAAuB,GAC9B,OAAO,CAAC,OAAO,CAAC,CAmBlB"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import * as clack from "@clack/prompts";
|
|
2
|
+
import { APP_NAME } from "../brand.js";
|
|
3
|
+
import { commandExists } from "./platform.js";
|
|
4
|
+
export async function installBackgroundService(params) {
|
|
5
|
+
switch (process.platform) {
|
|
6
|
+
case "darwin": {
|
|
7
|
+
const { installLaunchAgent } = await import("./daemon.js");
|
|
8
|
+
const plistPath = await installLaunchAgent(params);
|
|
9
|
+
clack.log.success(`Background service installed (${plistPath})`);
|
|
10
|
+
return true;
|
|
11
|
+
}
|
|
12
|
+
case "linux": {
|
|
13
|
+
if (!(await commandExists("systemctl"))) {
|
|
14
|
+
clack.log.warn("systemctl not found — background service skipped");
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
const { installSystemdUserService } = await import("./daemon-linux.js");
|
|
18
|
+
const unitPath = await installSystemdUserService(params);
|
|
19
|
+
clack.log.success(`Background service installed (${unitPath})`);
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
22
|
+
case "win32": {
|
|
23
|
+
const { installWindowsScheduledTask } = await import("./daemon-windows.js");
|
|
24
|
+
const scriptPath = await installWindowsScheduledTask(params);
|
|
25
|
+
clack.log.success(`Background task installed (${scriptPath})`);
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
default:
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export async function promptBackgroundService(params) {
|
|
33
|
+
if (process.platform !== "darwin" &&
|
|
34
|
+
process.platform !== "linux" &&
|
|
35
|
+
process.platform !== "win32") {
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
const choice = await clack.confirm({
|
|
39
|
+
message: `Run ${APP_NAME} in the background (starts on login)?`,
|
|
40
|
+
initialValue: true,
|
|
41
|
+
});
|
|
42
|
+
if (clack.isCancel(choice) || !choice) {
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
return installBackgroundService(params);
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=background-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"background-service.js","sourceRoot":"","sources":["../../src/installer/background-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAW9C,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,MAA+B;IAE/B,QAAQ,OAAO,CAAC,QAAQ,EAAE,CAAC;QACzB,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;YAC3D,MAAM,SAAS,GAAG,MAAM,kBAAkB,CAAC,MAAM,CAAC,CAAC;YACnD,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,iCAAiC,SAAS,GAAG,CAAC,CAAC;YACjE,OAAO,IAAI,CAAC;QACd,CAAC;QACD,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,IAAI,CAAC,CAAC,MAAM,aAAa,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC;gBACxC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;gBACnE,OAAO,KAAK,CAAC;YACf,CAAC;YACD,MAAM,EAAE,yBAAyB,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;YACxE,MAAM,QAAQ,GAAG,MAAM,yBAAyB,CAAC,MAAM,CAAC,CAAC;YACzD,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,iCAAiC,QAAQ,GAAG,CAAC,CAAC;YAChE,OAAO,IAAI,CAAC;QACd,CAAC;QACD,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,EAAE,2BAA2B,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;YAC5E,MAAM,UAAU,GAAG,MAAM,2BAA2B,CAAC,MAAM,CAAC,CAAC;YAC7D,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,8BAA8B,UAAU,GAAG,CAAC,CAAC;YAC/D,OAAO,IAAI,CAAC;QACd,CAAC;QACD;YACE,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,MAA+B;IAE/B,IACE,OAAO,CAAC,QAAQ,KAAK,QAAQ;QAC7B,OAAO,CAAC,QAAQ,KAAK,OAAO;QAC5B,OAAO,CAAC,QAAQ,KAAK,OAAO,EAC5B,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC;QACjC,OAAO,EAAE,OAAO,QAAQ,uCAAuC;QAC/D,YAAY,EAAE,IAAI;KACnB,CAAC,CAAC;IAEH,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACtC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,wBAAwB,CAAC,MAAM,CAAC,CAAC;AAC1C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clipboard.d.ts","sourceRoot":"","sources":["../../src/installer/clipboard.ts"],"names":[],"mappings":"AAEA,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CA6BpE"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
export async function copyToClipboard(text) {
|
|
3
|
+
const commands = process.platform === "darwin"
|
|
4
|
+
? [{ cmd: "pbcopy", args: [] }]
|
|
5
|
+
: process.platform === "win32"
|
|
6
|
+
? [{ cmd: "clip", args: [] }]
|
|
7
|
+
: [
|
|
8
|
+
{ cmd: "xclip", args: ["-selection", "clipboard"] },
|
|
9
|
+
{ cmd: "wl-copy", args: [] },
|
|
10
|
+
];
|
|
11
|
+
for (const { cmd, args } of commands) {
|
|
12
|
+
try {
|
|
13
|
+
await new Promise((resolve, reject) => {
|
|
14
|
+
const child = spawn(cmd, args, { stdio: ["pipe", "ignore", "ignore"] });
|
|
15
|
+
child.on("error", reject);
|
|
16
|
+
child.on("close", (code) => code === 0 ? resolve() : reject(new Error(`${cmd} exited ${code}`)));
|
|
17
|
+
child.stdin.write(text);
|
|
18
|
+
child.stdin.end();
|
|
19
|
+
});
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
// try next clipboard backend
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=clipboard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clipboard.js","sourceRoot":"","sources":["../../src/installer/clipboard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAY;IAChD,MAAM,QAAQ,GACZ,OAAO,CAAC,QAAQ,KAAK,QAAQ;QAC3B,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;QAC/B,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO;YAC5B,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;YAC7B,CAAC,CAAC;gBACE,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,YAAY,EAAE,WAAW,CAAC,EAAE;gBACnD,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE;aAC7B,CAAC;IAEV,KAAK,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,QAAQ,EAAE,CAAC;QACrC,IAAI,CAAC;YACH,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBAC1C,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;gBACxE,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;gBAC1B,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CACzB,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,GAAG,WAAW,IAAI,EAAE,CAAC,CAAC,CACpE,CAAC;gBACF,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACxB,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;YACpB,CAAC,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,6BAA6B;QAC/B,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare function installSystemdUserService(params: {
|
|
2
|
+
port: number;
|
|
3
|
+
authToken?: string;
|
|
4
|
+
serverEntry: string;
|
|
5
|
+
relayUrl?: string;
|
|
6
|
+
deviceId?: string;
|
|
7
|
+
relayDeviceToken?: string;
|
|
8
|
+
}): Promise<string>;
|
|
9
|
+
export declare function isSystemdServiceInstalled(): Promise<boolean>;
|
|
10
|
+
//# sourceMappingURL=daemon-linux.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon-linux.d.ts","sourceRoot":"","sources":["../../src/installer/daemon-linux.ts"],"names":[],"mappings":"AAaA,wBAAsB,yBAAyB,CAAC,MAAM,EAAE;IACtD,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,GAAG,OAAO,CAAC,MAAM,CAAC,CA8ClB;AAED,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,OAAO,CAAC,CAWlE"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { mkdir, writeFile } from "node:fs/promises";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { promisify } from "node:util";
|
|
5
|
+
import { execFile } from "node:child_process";
|
|
6
|
+
const execFileAsync = promisify(execFile);
|
|
7
|
+
const SERVICE_NAME = "lockin-mcp.service";
|
|
8
|
+
function unitPath() {
|
|
9
|
+
return join(homedir(), ".config", "systemd", "user", SERVICE_NAME);
|
|
10
|
+
}
|
|
11
|
+
export async function installSystemdUserService(params) {
|
|
12
|
+
const unitFile = unitPath();
|
|
13
|
+
await mkdir(join(homedir(), ".config", "systemd", "user"), { recursive: true });
|
|
14
|
+
const envLines = [];
|
|
15
|
+
if (params.authToken) {
|
|
16
|
+
envLines.push(`Environment=MDB_MCP_AUTH_TOKEN=${params.authToken}`);
|
|
17
|
+
}
|
|
18
|
+
if (params.relayUrl) {
|
|
19
|
+
envLines.push(`Environment=MDB_RELAY_URL=${params.relayUrl}`);
|
|
20
|
+
}
|
|
21
|
+
if (params.deviceId) {
|
|
22
|
+
envLines.push(`Environment=MDB_DEVICE_ID=${params.deviceId}`);
|
|
23
|
+
}
|
|
24
|
+
if (params.relayDeviceToken) {
|
|
25
|
+
envLines.push(`Environment=MDB_RELAY_DEVICE_TOKEN=${params.relayDeviceToken}`);
|
|
26
|
+
}
|
|
27
|
+
envLines.push(`Environment=MDB_HTTP_PORT=${params.port}`);
|
|
28
|
+
if (process.env.MDB_LICENSE_API_URL) {
|
|
29
|
+
envLines.push(`Environment=MDB_LICENSE_API_URL=${process.env.MDB_LICENSE_API_URL}`);
|
|
30
|
+
}
|
|
31
|
+
if (process.env.MDB_APP_URL) {
|
|
32
|
+
envLines.push(`Environment=MDB_APP_URL=${process.env.MDB_APP_URL}`);
|
|
33
|
+
}
|
|
34
|
+
const unit = `[Unit]
|
|
35
|
+
Description=LockIn MCP distraction blocker
|
|
36
|
+
After=network.target
|
|
37
|
+
|
|
38
|
+
[Service]
|
|
39
|
+
Type=simple
|
|
40
|
+
ExecStart=${process.execPath} ${params.serverEntry} --http --port ${params.port}
|
|
41
|
+
Restart=always
|
|
42
|
+
RestartSec=5
|
|
43
|
+
${envLines.join("\n")}
|
|
44
|
+
|
|
45
|
+
[Install]
|
|
46
|
+
WantedBy=default.target
|
|
47
|
+
`;
|
|
48
|
+
await writeFile(unitFile, unit, { mode: 0o644 });
|
|
49
|
+
await execFileAsync("systemctl", ["--user", "daemon-reload"]);
|
|
50
|
+
await execFileAsync("systemctl", ["--user", "enable", "--now", SERVICE_NAME]);
|
|
51
|
+
return unitFile;
|
|
52
|
+
}
|
|
53
|
+
export async function isSystemdServiceInstalled() {
|
|
54
|
+
try {
|
|
55
|
+
const { stdout } = await execFileAsync("systemctl", [
|
|
56
|
+
"--user",
|
|
57
|
+
"is-enabled",
|
|
58
|
+
SERVICE_NAME,
|
|
59
|
+
]);
|
|
60
|
+
return stdout.trim() === "enabled";
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=daemon-linux.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon-linux.js","sourceRoot":"","sources":["../../src/installer/daemon-linux.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare function installWindowsScheduledTask(params: {
|
|
2
|
+
port: number;
|
|
3
|
+
authToken?: string;
|
|
4
|
+
serverEntry: string;
|
|
5
|
+
relayUrl?: string;
|
|
6
|
+
deviceId?: string;
|
|
7
|
+
relayDeviceToken?: string;
|
|
8
|
+
}): Promise<string>;
|
|
9
|
+
export declare function isWindowsTaskInstalled(): Promise<boolean>;
|
|
10
|
+
//# sourceMappingURL=daemon-windows.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon-windows.d.ts","sourceRoot":"","sources":["../../src/installer/daemon-windows.ts"],"names":[],"mappings":"AA4CA,wBAAsB,2BAA2B,CAAC,MAAM,EAAE;IACxD,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,GAAG,OAAO,CAAC,MAAM,CAAC,CAgDlB;AAED,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,OAAO,CAAC,CAO/D"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { mkdir, writeFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { promisify } from "node:util";
|
|
4
|
+
import { execFile } from "node:child_process";
|
|
5
|
+
import { getInstallDir } from "./platform.js";
|
|
6
|
+
const execFileAsync = promisify(execFile);
|
|
7
|
+
const TASK_NAME = "LockInMCP";
|
|
8
|
+
function buildStartScript(params) {
|
|
9
|
+
const envPairs = [];
|
|
10
|
+
if (params.authToken) {
|
|
11
|
+
envPairs.push(`set MDB_MCP_AUTH_TOKEN=${params.authToken}`);
|
|
12
|
+
}
|
|
13
|
+
if (params.relayUrl) {
|
|
14
|
+
envPairs.push(`set MDB_RELAY_URL=${params.relayUrl}`);
|
|
15
|
+
}
|
|
16
|
+
if (params.deviceId) {
|
|
17
|
+
envPairs.push(`set MDB_DEVICE_ID=${params.deviceId}`);
|
|
18
|
+
}
|
|
19
|
+
if (params.relayDeviceToken) {
|
|
20
|
+
envPairs.push(`set MDB_RELAY_DEVICE_TOKEN=${params.relayDeviceToken}`);
|
|
21
|
+
}
|
|
22
|
+
envPairs.push(`set MDB_HTTP_PORT=${params.port}`);
|
|
23
|
+
if (process.env.MDB_LICENSE_API_URL) {
|
|
24
|
+
envPairs.push(`set MDB_LICENSE_API_URL=${process.env.MDB_LICENSE_API_URL}`);
|
|
25
|
+
}
|
|
26
|
+
if (process.env.MDB_APP_URL) {
|
|
27
|
+
envPairs.push(`set MDB_APP_URL=${process.env.MDB_APP_URL}`);
|
|
28
|
+
}
|
|
29
|
+
return `@echo off
|
|
30
|
+
${envPairs.join("\n")}
|
|
31
|
+
"${process.execPath}" "${params.serverEntry}" --http --port ${params.port}
|
|
32
|
+
`;
|
|
33
|
+
}
|
|
34
|
+
export async function installWindowsScheduledTask(params) {
|
|
35
|
+
const installDir = getInstallDir();
|
|
36
|
+
await mkdir(installDir, { recursive: true });
|
|
37
|
+
const scriptPath = join(installDir, "start-mcp.bat");
|
|
38
|
+
await writeFile(scriptPath, buildStartScript(params), "utf8");
|
|
39
|
+
const xmlPath = join(installDir, "lockin-mcp-task.xml");
|
|
40
|
+
const taskXml = `<?xml version="1.0" encoding="UTF-16"?>
|
|
41
|
+
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
|
|
42
|
+
<Triggers>
|
|
43
|
+
<LogonTrigger>
|
|
44
|
+
<Enabled>true</Enabled>
|
|
45
|
+
</LogonTrigger>
|
|
46
|
+
</Triggers>
|
|
47
|
+
<Principals>
|
|
48
|
+
<Principal id="Author">
|
|
49
|
+
<LogonType>InteractiveToken</LogonType>
|
|
50
|
+
<RunLevel>LeastPrivilege</RunLevel>
|
|
51
|
+
</Principal>
|
|
52
|
+
</Principals>
|
|
53
|
+
<Settings>
|
|
54
|
+
<MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
|
|
55
|
+
<RestartOnFailure>
|
|
56
|
+
<Interval>PT1M</Interval>
|
|
57
|
+
<Count>3</Count>
|
|
58
|
+
</RestartOnFailure>
|
|
59
|
+
<StartWhenAvailable>true</StartWhenAvailable>
|
|
60
|
+
<Enabled>true</Enabled>
|
|
61
|
+
</Settings>
|
|
62
|
+
<Actions Context="Author">
|
|
63
|
+
<Exec>
|
|
64
|
+
<Command>${scriptPath}</Command>
|
|
65
|
+
</Exec>
|
|
66
|
+
</Actions>
|
|
67
|
+
</Task>`;
|
|
68
|
+
await writeFile(xmlPath, taskXml, "utf16le");
|
|
69
|
+
await execFileAsync("schtasks", [
|
|
70
|
+
"/Create",
|
|
71
|
+
"/F",
|
|
72
|
+
"/TN",
|
|
73
|
+
TASK_NAME,
|
|
74
|
+
"/XML",
|
|
75
|
+
xmlPath,
|
|
76
|
+
]);
|
|
77
|
+
return scriptPath;
|
|
78
|
+
}
|
|
79
|
+
export async function isWindowsTaskInstalled() {
|
|
80
|
+
try {
|
|
81
|
+
await execFileAsync("schtasks", ["/Query", "/TN", TASK_NAME]);
|
|
82
|
+
return true;
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=daemon-windows.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon-windows.js","sourceRoot":"","sources":["../../src/installer/daemon-windows.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare function installLaunchAgent(params: {
|
|
2
|
+
port: number;
|
|
3
|
+
authToken?: string;
|
|
4
|
+
serverEntry: string;
|
|
5
|
+
relayUrl?: string;
|
|
6
|
+
deviceId?: string;
|
|
7
|
+
relayDeviceToken?: string;
|
|
8
|
+
}): Promise<string>;
|
|
9
|
+
export declare function isLaunchAgentInstalled(): Promise<boolean>;
|
|
10
|
+
//# sourceMappingURL=daemon.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../src/installer/daemon.ts"],"names":[],"mappings":"AAkBA,wBAAsB,kBAAkB,CAAC,MAAM,EAAE;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,GAAG,OAAO,CAAC,MAAM,CAAC,CAyFlB;AAED,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,OAAO,CAAC,CAc/D"}
|