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,128 @@
1
+ import { APP_NAME } from "../brand.js";
2
+ import { defaultSelectedPresetIds, resolveDomainsFromSelection, SITE_PRESETS, } from "./presets.js";
3
+ import { DEFAULT_LOCKIN_MCP_PORT } from "./port.js";
4
+ export function parseList(value) {
5
+ return value
6
+ .split(",")
7
+ .map((item) => item.trim())
8
+ .filter(Boolean);
9
+ }
10
+ function parsePresetSelection(inputValue, defaults) {
11
+ const trimmed = inputValue.trim();
12
+ if (!trimmed) {
13
+ return defaults;
14
+ }
15
+ if (trimmed.toLowerCase() === "all") {
16
+ return SITE_PRESETS.map((preset) => preset.id);
17
+ }
18
+ const numbers = parseList(trimmed).map((item) => Number(item));
19
+ if (numbers.every((num) => Number.isInteger(num) && num > 0)) {
20
+ return numbers
21
+ .map((num) => SITE_PRESETS[num - 1]?.id)
22
+ .filter((id) => Boolean(id));
23
+ }
24
+ return trimmed
25
+ .split(/[,\s]+/)
26
+ .map((item) => item.trim().toLowerCase())
27
+ .map((item) => SITE_PRESETS.find((preset) => preset.id === item)?.id)
28
+ .filter((id) => Boolean(id));
29
+ }
30
+ export function parseInstallerArgs(argv) {
31
+ const options = {
32
+ nonInteractive: false,
33
+ useBrowserLogin: true,
34
+ port: DEFAULT_LOCKIN_MCP_PORT,
35
+ selectedPresetIds: defaultSelectedPresetIds(),
36
+ customDomains: [],
37
+ skipBlock: false,
38
+ skipTunnel: false,
39
+ skipPoke: false,
40
+ pokeRecipe: false,
41
+ };
42
+ for (let i = 0; i < argv.length; i += 1) {
43
+ const arg = argv[i];
44
+ const next = argv[i + 1];
45
+ switch (arg) {
46
+ case "--yes":
47
+ case "-y":
48
+ options.nonInteractive = true;
49
+ break;
50
+ case "--license-key":
51
+ options.licenseKey = next;
52
+ i += 1;
53
+ break;
54
+ case "--browser-login":
55
+ options.useBrowserLogin = true;
56
+ break;
57
+ case "--port":
58
+ options.port = Number(next) || DEFAULT_LOCKIN_MCP_PORT;
59
+ i += 1;
60
+ break;
61
+ case "--sites":
62
+ options.selectedPresetIds = parsePresetSelection(next ?? "", defaultSelectedPresetIds());
63
+ i += 1;
64
+ break;
65
+ case "--custom-domains":
66
+ options.customDomains = parseList(next ?? "");
67
+ i += 1;
68
+ break;
69
+ case "--skip-block":
70
+ options.skipBlock = true;
71
+ break;
72
+ case "--skip-tunnel":
73
+ options.skipTunnel = true;
74
+ break;
75
+ case "--skip-poke":
76
+ options.skipPoke = true;
77
+ break;
78
+ case "--poke-recipe":
79
+ options.pokeRecipe = true;
80
+ break;
81
+ case "--mcp-auth-token":
82
+ options.mcpAuthToken = next;
83
+ i += 1;
84
+ break;
85
+ case "--help":
86
+ case "-h":
87
+ printInstallerHelp();
88
+ process.exit(0);
89
+ break;
90
+ default:
91
+ break;
92
+ }
93
+ }
94
+ if (options.nonInteractive &&
95
+ !options.licenseKey &&
96
+ !options.useBrowserLogin) {
97
+ options.useBrowserLogin = true;
98
+ }
99
+ return options;
100
+ }
101
+ export function printInstallerHelp() {
102
+ console.log(`${APP_NAME} installer
103
+
104
+ Usage:
105
+ npx -y lockin-mcp mdb-install
106
+
107
+ Options:
108
+ --yes, -y Non-interactive mode with defaults
109
+ --license-key <key> Pro license key
110
+ --browser-login Verify Pro via secure browser login (default)
111
+ --port <number> Local MCP HTTP port (default: ${DEFAULT_LOCKIN_MCP_PORT})
112
+ --sites <list> Preset IDs, numbers, or "all"
113
+ --custom-domains <list> Extra comma-separated domains
114
+ --skip-block Skip initial domain blocking
115
+ --skip-tunnel Skip relay setup (local MCP only)
116
+ --skip-poke Skip Poke URL generation
117
+ --poke-recipe Generate Poke recipe URL
118
+ --mcp-auth-token <token> Bearer token for tunneled MCP endpoint
119
+
120
+ Requires a $9.99 lifetime Pro license. Purchase at your dashboard.
121
+ `);
122
+ }
123
+ export function summarizeSelections(options) {
124
+ return {
125
+ domains: resolveDomainsFromSelection(options.selectedPresetIds, options.customDomains),
126
+ };
127
+ }
128
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/installer/prompts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ export interface RelayCredentials {
2
+ deviceId: string;
3
+ relayDeviceToken: string;
4
+ /** Public HTTPS base (agent-facing URLs). */
5
+ relayUrl: string;
6
+ /** Worker origin for outbound WebSocket (/connect). */
7
+ relayConnectUrl?: string;
8
+ mcpUrl: string;
9
+ sseUrl: string;
10
+ healthUrl: string;
11
+ localPort: number;
12
+ }
13
+ export declare function writeRelayCredentials(credentials: RelayCredentials): Promise<string>;
14
+ export declare function readRelayCredentials(): Promise<RelayCredentials | null>;
15
+ export declare function relayCredentialsMatchPort(credentials: RelayCredentials, port: number): boolean;
16
+ export declare function relayEnvFromCredentials(credentials: RelayCredentials, mcpAuthToken?: string): NodeJS.ProcessEnv;
17
+ export declare function toRelayProvisionResult(credentials: RelayCredentials): {
18
+ deviceId: string;
19
+ relayDeviceToken: string;
20
+ relayUrl: string;
21
+ relayConnectUrl: string;
22
+ mcpUrl: string;
23
+ sseUrl: string;
24
+ healthUrl: string;
25
+ };
26
+ //# sourceMappingURL=relay-credentials.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relay-credentials.d.ts","sourceRoot":"","sources":["../../src/installer/relay-credentials.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,6CAA6C;IAC7C,QAAQ,EAAE,MAAM,CAAC;IACjB,uDAAuD;IACvD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAoBD,wBAAsB,qBAAqB,CACzC,WAAW,EAAE,gBAAgB,GAC5B,OAAO,CAAC,MAAM,CAAC,CAoBjB;AAED,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAS7E;AAED,wBAAgB,yBAAyB,CACvC,WAAW,EAAE,gBAAgB,EAC7B,IAAI,EAAE,MAAM,GACX,OAAO,CAKT;AAED,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,gBAAgB,EAC7B,YAAY,CAAC,EAAE,MAAM,GACpB,MAAM,CAAC,UAAU,CAcnB;AAED,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,gBAAgB,GAC5B;IACD,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB,CAUA"}
@@ -0,0 +1,75 @@
1
+ import { mkdir, readFile, writeFile } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { getInstallDir } from "./platform.js";
4
+ import { canonicalizeRelayFields } from "../relay-urls.js";
5
+ const CREDENTIALS_FILE = "relay-credentials.json";
6
+ function credentialsEqual(a, b) {
7
+ return (a.deviceId === b.deviceId &&
8
+ a.relayDeviceToken === b.relayDeviceToken &&
9
+ a.relayUrl === b.relayUrl &&
10
+ (a.relayConnectUrl ?? a.relayUrl) === (b.relayConnectUrl ?? b.relayUrl) &&
11
+ a.mcpUrl === b.mcpUrl &&
12
+ a.sseUrl === b.sseUrl &&
13
+ a.healthUrl === b.healthUrl &&
14
+ a.localPort === b.localPort);
15
+ }
16
+ export async function writeRelayCredentials(credentials) {
17
+ const normalized = canonicalizeRelayFields(credentials);
18
+ const dir = getInstallDir();
19
+ await mkdir(dir, { recursive: true });
20
+ const path = join(dir, CREDENTIALS_FILE);
21
+ try {
22
+ const raw = await readFile(path, "utf8");
23
+ const existing = JSON.parse(raw);
24
+ if (credentialsEqual(existing, normalized)) {
25
+ return path;
26
+ }
27
+ }
28
+ catch {
29
+ // no existing file
30
+ }
31
+ await writeFile(path, `${JSON.stringify(normalized, null, 2)}\n`, {
32
+ mode: 0o600,
33
+ });
34
+ return path;
35
+ }
36
+ export async function readRelayCredentials() {
37
+ try {
38
+ const path = join(getInstallDir(), CREDENTIALS_FILE);
39
+ const raw = await readFile(path, "utf8");
40
+ const parsed = JSON.parse(raw);
41
+ return canonicalizeRelayFields(parsed);
42
+ }
43
+ catch {
44
+ return null;
45
+ }
46
+ }
47
+ export function relayCredentialsMatchPort(credentials, port) {
48
+ return (credentials.localPort === port &&
49
+ Boolean(credentials.deviceId && credentials.relayDeviceToken && credentials.mcpUrl));
50
+ }
51
+ export function relayEnvFromCredentials(credentials, mcpAuthToken) {
52
+ const env = {
53
+ ...process.env,
54
+ MDB_RELAY_URL: credentials.relayConnectUrl ?? credentials.relayUrl,
55
+ MDB_DEVICE_ID: credentials.deviceId,
56
+ MDB_RELAY_DEVICE_TOKEN: credentials.relayDeviceToken,
57
+ MDB_HTTP_PORT: String(credentials.localPort),
58
+ };
59
+ if (mcpAuthToken) {
60
+ env.MDB_MCP_AUTH_TOKEN = mcpAuthToken;
61
+ }
62
+ return env;
63
+ }
64
+ export function toRelayProvisionResult(credentials) {
65
+ return {
66
+ deviceId: credentials.deviceId,
67
+ relayDeviceToken: credentials.relayDeviceToken,
68
+ relayUrl: credentials.relayUrl,
69
+ relayConnectUrl: credentials.relayConnectUrl ?? credentials.relayUrl,
70
+ mcpUrl: credentials.mcpUrl,
71
+ sseUrl: credentials.sseUrl,
72
+ healthUrl: credentials.healthUrl,
73
+ };
74
+ }
75
+ //# sourceMappingURL=relay-credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relay-credentials.js","sourceRoot":"","sources":["../../src/installer/relay-credentials.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ export interface RelayProvisionResult {
2
+ deviceId: string;
3
+ relayDeviceToken: string;
4
+ relayUrl: string;
5
+ relayConnectUrl: string;
6
+ mcpUrl: string;
7
+ sseUrl: string;
8
+ healthUrl: string;
9
+ }
10
+ export interface RelayRefreshResult {
11
+ deviceId: string;
12
+ relayUrl: string;
13
+ relayConnectUrl: string;
14
+ mcpUrl: string;
15
+ sseUrl: string;
16
+ healthUrl: string;
17
+ }
18
+ export declare function provisionRelayDevice(params: {
19
+ licenseToken: string;
20
+ port: number;
21
+ }): Promise<RelayProvisionResult>;
22
+ export declare function refreshRelayRegistration(params: {
23
+ licenseToken: string;
24
+ port: number;
25
+ }): Promise<RelayRefreshResult>;
26
+ //# sourceMappingURL=relay-provision.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relay-provision.d.ts","sourceRoot":"","sources":["../../src/installer/relay-provision.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AA6BD,wBAAsB,oBAAoB,CAAC,MAAM,EAAE;IACjD,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;CACd,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAiBhC;AAED,wBAAsB,wBAAwB,CAAC,MAAM,EAAE;IACrD,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;CACd,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA4B9B"}
@@ -0,0 +1,57 @@
1
+ import { canonicalizeRelayFields } from "../relay-urls.js";
2
+ const LICENSE_API_URL = process.env.MDB_LICENSE_API_URL ?? "http://localhost:3001/api/v1";
3
+ function parseRelayResponse(body) {
4
+ if (!body.deviceId || !body.relayDeviceToken || !body.mcpUrl) {
5
+ throw new Error("Relay provision returned incomplete data");
6
+ }
7
+ return canonicalizeRelayFields({
8
+ deviceId: body.deviceId,
9
+ relayDeviceToken: body.relayDeviceToken,
10
+ relayUrl: body.relayUrl ?? body.mcpUrl.replace(/\/device\/[^/]+\/mcp$/, ""),
11
+ relayConnectUrl: body.relayConnectUrl ?? body.relayUrl ?? "",
12
+ mcpUrl: body.mcpUrl,
13
+ sseUrl: body.sseUrl ?? body.mcpUrl,
14
+ healthUrl: body.healthUrl ?? body.mcpUrl.replace(/\/mcp$/, "/health"),
15
+ });
16
+ }
17
+ export async function provisionRelayDevice(params) {
18
+ const response = await fetch(`${LICENSE_API_URL}/tunnel/provision`, {
19
+ method: "POST",
20
+ headers: {
21
+ "Content-Type": "application/json",
22
+ Authorization: `Bearer ${params.licenseToken}`,
23
+ },
24
+ body: JSON.stringify({ port: params.port }),
25
+ });
26
+ const body = (await response.json());
27
+ if (!response.ok) {
28
+ throw new Error(body.error ?? `Relay provision failed (${response.status})`);
29
+ }
30
+ return parseRelayResponse(body);
31
+ }
32
+ export async function refreshRelayRegistration(params) {
33
+ const response = await fetch(`${LICENSE_API_URL}/tunnel/provision`, {
34
+ method: "POST",
35
+ headers: {
36
+ "Content-Type": "application/json",
37
+ Authorization: `Bearer ${params.licenseToken}`,
38
+ },
39
+ body: JSON.stringify({ port: params.port, refresh: true }),
40
+ });
41
+ const body = (await response.json());
42
+ if (!response.ok) {
43
+ throw new Error(body.error ?? `Relay refresh failed (${response.status})`);
44
+ }
45
+ if (!body.deviceId || !body.mcpUrl) {
46
+ throw new Error("Relay refresh returned incomplete data");
47
+ }
48
+ return canonicalizeRelayFields({
49
+ deviceId: body.deviceId,
50
+ relayUrl: body.relayUrl ?? body.mcpUrl.replace(/\/device\/[^/]+\/mcp$/, ""),
51
+ relayConnectUrl: body.relayConnectUrl ?? body.relayUrl ?? "",
52
+ mcpUrl: body.mcpUrl,
53
+ sseUrl: body.sseUrl ?? body.mcpUrl,
54
+ healthUrl: body.healthUrl ?? body.mcpUrl.replace(/\/mcp$/, "/health"),
55
+ });
56
+ }
57
+ //# sourceMappingURL=relay-provision.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relay-provision.js","sourceRoot":"","sources":["../../src/installer/relay-provision.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function runInstaller(argv: string[]): Promise<never>;
2
+ //# sourceMappingURL=run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/installer/run.ts"],"names":[],"mappings":"AAqJA,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,CA0VjE"}