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
package/dist/state.js ADDED
@@ -0,0 +1,91 @@
1
+ import { mkdir, readFile, writeFile } from "node:fs/promises";
2
+ import { homedir } from "node:os";
3
+ import { join } from "node:path";
4
+ import { STATE_DIR_NAME, STATE_FILE_NAME, AUDIT_LOG_MAX_ENTRIES, normalizeDomain, } from "./types.js";
5
+ const DEFAULT_STATE = {
6
+ blockedDomains: [],
7
+ temporaryUnblocks: [],
8
+ updatedAt: Date.now(),
9
+ };
10
+ export function getStateDir() {
11
+ return join(homedir(), STATE_DIR_NAME);
12
+ }
13
+ export function getStatePath() {
14
+ return join(getStateDir(), STATE_FILE_NAME);
15
+ }
16
+ export async function loadState() {
17
+ try {
18
+ const raw = await readFile(getStatePath(), "utf8");
19
+ const parsed = JSON.parse(raw);
20
+ return {
21
+ blockedDomains: dedupeDomains(parsed.blockedDomains ?? []),
22
+ temporaryUnblocks: (parsed.temporaryUnblocks ?? []).map((entry) => ({
23
+ domain: normalizeDomain(entry.domain),
24
+ expiresAt: entry.expiresAt,
25
+ })),
26
+ auditLog: parsed.auditLog ?? [],
27
+ updatedAt: parsed.updatedAt ?? Date.now(),
28
+ };
29
+ }
30
+ catch (error) {
31
+ if (error instanceof Error &&
32
+ "code" in error &&
33
+ error.code === "ENOENT") {
34
+ return { ...DEFAULT_STATE };
35
+ }
36
+ throw error;
37
+ }
38
+ }
39
+ export async function saveState(state) {
40
+ await mkdir(getStateDir(), { recursive: true });
41
+ const nextState = {
42
+ blockedDomains: dedupeDomains(state.blockedDomains),
43
+ temporaryUnblocks: state.temporaryUnblocks,
44
+ auditLog: state.auditLog ?? [],
45
+ updatedAt: Date.now(),
46
+ };
47
+ await writeFile(getStatePath(), `${JSON.stringify(nextState, null, 2)}\n`, {
48
+ mode: 0o600,
49
+ });
50
+ }
51
+ export function dedupeDomains(domains) {
52
+ const seen = new Set();
53
+ const result = [];
54
+ for (const domain of domains) {
55
+ const normalized = normalizeDomain(domain);
56
+ if (!normalized || seen.has(normalized)) {
57
+ continue;
58
+ }
59
+ seen.add(normalized);
60
+ result.push(normalized);
61
+ }
62
+ return result.sort();
63
+ }
64
+ export function pruneExpiredUnblocks(temporaryUnblocks, now = Date.now()) {
65
+ return temporaryUnblocks.filter((entry) => entry.expiresAt > now);
66
+ }
67
+ export function getActiveTemporaryUnblock(domain, temporaryUnblocks, now = Date.now()) {
68
+ const normalized = normalizeDomain(domain);
69
+ return temporaryUnblocks.find((entry) => entry.domain === normalized && entry.expiresAt > now);
70
+ }
71
+ export function isDomainBlocked(domain, state, now = Date.now()) {
72
+ const normalized = normalizeDomain(domain);
73
+ if (!state.blockedDomains.includes(normalized)) {
74
+ return false;
75
+ }
76
+ return !getActiveTemporaryUnblock(normalized, state.temporaryUnblocks, now);
77
+ }
78
+ export function appendAuditEntry(state, action, domains) {
79
+ const entry = {
80
+ action,
81
+ domains: dedupeDomains(domains),
82
+ timestamp: Date.now(),
83
+ };
84
+ const auditLog = [...(state.auditLog ?? []), entry].slice(-AUDIT_LOG_MAX_ENTRIES);
85
+ return { ...state, auditLog };
86
+ }
87
+ export function getDomainsToBlockInHosts(state, now = Date.now()) {
88
+ const activeUnblocks = new Set(pruneExpiredUnblocks(state.temporaryUnblocks, now).map((entry) => entry.domain));
89
+ return state.blockedDomains.filter((domain) => !activeUnblocks.has(domain));
90
+ }
91
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ export declare const MARKER = "# mac-distraction-blocker-mcp";
2
+ export declare const BLOCK_IP = "127.0.0.1";
3
+ export declare const BLOCK_IP_V6 = "::1";
4
+ export declare const STATE_DIR_NAME = ".mac-distraction-blocker";
5
+ export declare const STATE_FILE_NAME = "state.json";
6
+ export declare const AUDIT_LOG_MAX_ENTRIES = 50;
7
+ export declare function getHostsPath(): string;
8
+ /** @deprecated Use getHostsPath() for platform-aware path */
9
+ export declare const HOSTS_PATH = "/etc/hosts";
10
+ export interface AuditLogEntry {
11
+ action: string;
12
+ domains: string[];
13
+ timestamp: number;
14
+ }
15
+ export interface TemporaryUnblock {
16
+ domain: string;
17
+ expiresAt: number;
18
+ }
19
+ export interface BlockerState {
20
+ blockedDomains: string[];
21
+ temporaryUnblocks: TemporaryUnblock[];
22
+ updatedAt: number;
23
+ auditLog?: AuditLogEntry[];
24
+ }
25
+ export interface DomainStatus {
26
+ domain: string;
27
+ status: "blocked" | "temporarily_unblocked" | "not_blocked";
28
+ expiresAt?: number;
29
+ }
30
+ export interface BlockStatusResult {
31
+ blocked: DomainStatus[];
32
+ temporarilyUnblocked: DomainStatus[];
33
+ notBlocked: string[];
34
+ hostsFileWritable: boolean;
35
+ lastSyncedAt: number | null;
36
+ }
37
+ export declare function normalizeDomain(domain: string): string;
38
+ export declare function expandDomainVariants(domain: string): string[];
39
+ export declare function isValidDomain(domain: string): boolean;
40
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,MAAM,kCAAkC,CAAC;AACtD,eAAO,MAAM,QAAQ,cAAc,CAAC;AACpC,eAAO,MAAM,WAAW,QAAQ,CAAC;AACjC,eAAO,MAAM,cAAc,6BAA6B,CAAC;AACzD,eAAO,MAAM,eAAe,eAAe,CAAC;AAC5C,eAAO,MAAM,qBAAqB,KAAK,CAAC;AAExC,wBAAgB,YAAY,IAAI,MAAM,CAWrC;AAED,6DAA6D;AAC7D,eAAO,MAAM,UAAU,eAAe,CAAC;AAEvC,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,SAAS,GAAG,uBAAuB,GAAG,aAAa,CAAC;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,oBAAoB,EAAE,YAAY,EAAE,CAAC;IACrC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAOtD;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAS7D;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CASrD"}
package/dist/types.js ADDED
@@ -0,0 +1,41 @@
1
+ import { join } from "node:path";
2
+ export const MARKER = "# mac-distraction-blocker-mcp";
3
+ export const BLOCK_IP = "127.0.0.1";
4
+ export const BLOCK_IP_V6 = "::1";
5
+ export const STATE_DIR_NAME = ".mac-distraction-blocker";
6
+ export const STATE_FILE_NAME = "state.json";
7
+ export const AUDIT_LOG_MAX_ENTRIES = 50;
8
+ export function getHostsPath() {
9
+ if (process.platform === "win32") {
10
+ return join(process.env.SystemRoot ?? "C:\\Windows", "System32", "drivers", "etc", "hosts");
11
+ }
12
+ return "/etc/hosts";
13
+ }
14
+ /** @deprecated Use getHostsPath() for platform-aware path */
15
+ export const HOSTS_PATH = "/etc/hosts";
16
+ export function normalizeDomain(domain) {
17
+ return domain
18
+ .trim()
19
+ .toLowerCase()
20
+ .replace(/^https?:\/\//, "")
21
+ .replace(/\/.*$/, "")
22
+ .replace(/^www\./, "");
23
+ }
24
+ export function expandDomainVariants(domain) {
25
+ const normalized = normalizeDomain(domain);
26
+ if (!normalized) {
27
+ return [];
28
+ }
29
+ const variants = new Set([normalized]);
30
+ variants.add(`www.${normalized}`);
31
+ return [...variants];
32
+ }
33
+ export function isValidDomain(domain) {
34
+ const normalized = normalizeDomain(domain);
35
+ if (!normalized || normalized.length > 253) {
36
+ return false;
37
+ }
38
+ const domainPattern = /^(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z]{2,63}$/i;
39
+ return domainPattern.test(normalized);
40
+ }
41
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,CAAC,MAAM,MAAM,GAAG,+BAA+B,CAAC;AACtD,MAAM,CAAC,MAAM,QAAQ,GAAG,WAAW,CAAC;AACpC,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,CAAC;AACjC,MAAM,CAAC,MAAM,cAAc,GAAG,0BAA0B,CAAC;AACzD,MAAM,CAAC,MAAM,eAAe,GAAG,YAAY,CAAC;AAC5C,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,CAAC;AAExC,MAAM,UAAU,YAAY;IAC1B,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,OAAO,IAAI,CACT,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,aAAa,EACvC,UAAU,EACV,SAAS,EACT,KAAK,EACL,OAAO,CACR,CAAC;IACJ,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,6DAA6D;AAC7D,MAAM,CAAC,MAAM,UAAU,GAAG,YAAY,CAAC;AAkCvC,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,OAAO,MAAM;SACV,IAAI,EAAE;SACN,WAAW,EAAE;SACb,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC;SAC3B,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;SACpB,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAc;IACjD,MAAM,UAAU,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IAC3C,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAS,CAAC,UAAU,CAAC,CAAC,CAAC;IAC/C,QAAQ,CAAC,GAAG,CAAC,OAAO,UAAU,EAAE,CAAC,CAAC;IAClC,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAc;IAC1C,MAAM,UAAU,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IAC3C,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;QAC3C,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,aAAa,GACjB,2DAA2D,CAAC;IAC9D,OAAO,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AACxC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.test.d.ts","sourceRoot":"","sources":["../src/types.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,13 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { normalizeDomain, expandDomainVariants, isValidDomain, } from "./types.js";
3
+ describe("domain validation", () => {
4
+ it("normalizes domains", () => {
5
+ expect(normalizeDomain("HTTPS://WWW.YouTube.com/watch")).toBe("youtube.com");
6
+ expect(expandDomainVariants("youtube.com")).toEqual(expect.arrayContaining(["youtube.com", "www.youtube.com"]));
7
+ });
8
+ it("validates domains", () => {
9
+ expect(isValidDomain("youtube.com")).toBe(true);
10
+ expect(isValidDomain("not a domain")).toBe(false);
11
+ });
12
+ });
13
+ //# sourceMappingURL=types.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.test.js","sourceRoot":"","sources":["../src/types.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,aAAa,GACd,MAAM,YAAY,CAAC;AAEpB,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAC5B,MAAM,CAAC,eAAe,CAAC,+BAA+B,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC7E,MAAM,CAAC,oBAAoB,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CACjD,MAAM,CAAC,eAAe,CAAC,CAAC,aAAa,EAAE,iBAAiB,CAAC,CAAC,CAC3D,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mBAAmB,EAAE,GAAG,EAAE;QAC3B,MAAM,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChD,MAAM,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
package/install.ps1 ADDED
@@ -0,0 +1,41 @@
1
+ # LockIn MCP — Windows one-line installer
2
+ # Usage:
3
+ # iwr -useb https://raw.githubusercontent.com/Kiog-Aser/mac-distraction-blocker-mcp/main/install.ps1 | iex
4
+ # & ([ScriptBlock]::Create((iwr -useb https://raw.githubusercontent.com/Kiog-Aser/mac-distraction-blocker-mcp/main/install.ps1))) -BrowserLogin
5
+
6
+ param(
7
+ [string]$LicenseKey,
8
+ [switch]$BrowserLogin,
9
+ [switch]$Yes,
10
+ [int]$Port = 3000,
11
+ [switch]$PokeRecipe
12
+ )
13
+
14
+ $ErrorActionPreference = "Stop"
15
+ $Package = if ($env:MDB_NPM_PACKAGE) { $env:MDB_NPM_PACKAGE } else { "lockin-mcp" }
16
+
17
+ function Write-Info($Message) { Write-Host "→ $Message" }
18
+ function Write-Bold($Message) { Write-Host $Message -ForegroundColor Cyan }
19
+
20
+ function Ensure-Node {
21
+ if (Get-Command node -ErrorAction SilentlyContinue) {
22
+ $major = [int](node -p "process.versions.node.split('.')[0]")
23
+ if ($major -lt 18) { throw "Node.js 18+ required (found $(node -v))" }
24
+ return
25
+ }
26
+ throw "Node.js 18+ is required. Install from https://nodejs.org/ and rerun."
27
+ }
28
+
29
+ Ensure-Node
30
+
31
+ $argsList = @()
32
+ if ($Yes) { $argsList += "--yes" }
33
+ if ($LicenseKey) { $argsList += @("--license-key", $LicenseKey) }
34
+ if ($BrowserLogin) { $argsList += "--browser-login" }
35
+ if ($Port) { $argsList += @("--port", "$Port") }
36
+ if ($PokeRecipe) { $argsList += "--poke-recipe" }
37
+ if (-not $LicenseKey -and -not $BrowserLogin) {
38
+ $argsList += "--browser-login"
39
+ }
40
+
41
+ & npx -y -p $Package -- mdb-install @argsList
package/install.sh ADDED
@@ -0,0 +1,39 @@
1
+ #!/usr/bin/env bash
2
+ # LockIn MCP — one-line installer
3
+ # Preferred: npx -y lockin-mcp mdb-install
4
+ # Alternative: curl -fsSL https://your-domain.com/install | bash
5
+ set -euo pipefail
6
+
7
+ MDB_APP_URL="${MDB_APP_URL:-http://localhost:3001}"
8
+ MDB_LICENSE_API_URL="${MDB_LICENSE_API_URL:-${MDB_APP_URL%/}/api/v1}"
9
+ NPX_PKG="${MDB_NPM_PACKAGE:-lockin-mcp}"
10
+ PACKAGE="${MDB_NPM_PACKAGE:-lockin-mcp}"
11
+
12
+ die() { printf '✗ %s\n' "$*" >&2; exit 1; }
13
+
14
+ ensure_node() {
15
+ if command -v node >/dev/null 2>&1; then
16
+ local major
17
+ major="$(node -p "process.versions.node.split('.')[0]")"
18
+ [ "$major" -ge 18 ] || die "Node.js 18+ required (found $(node -v))"
19
+ return 0
20
+ fi
21
+ die "Node.js 18+ required. Install from https://nodejs.org/"
22
+ }
23
+
24
+ case "$(uname -s)" in
25
+ MINGW*|MSYS*|CYGWIN*) die "On Windows: iwr -useb ${MDB_APP_URL}/install.ps1 | iex" ;;
26
+ esac
27
+
28
+ ensure_node
29
+
30
+ export MDB_APP_URL
31
+ export MDB_LICENSE_API_URL
32
+
33
+ NPX=(npx -y -p "${PACKAGE}" mdb-install --browser-login "$@")
34
+
35
+ if [ ! -t 0 ] && [ -r /dev/tty ]; then
36
+ exec </dev/tty >/dev/tty 2>&1 "${NPX[@]}"
37
+ else
38
+ exec "${NPX[@]}"
39
+ fi
package/package.json ADDED
@@ -0,0 +1,64 @@
1
+ {
2
+ "name": "lockin-mcp",
3
+ "version": "1.0.0",
4
+ "description": "LockIn MCP — block distractions at the system level with AI-powered focus tools",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "bin": {
8
+ "lockin-mcp": "dist/index.js",
9
+ "mac-distraction-blocker-mcp": "dist/index.js",
10
+ "mdb-install": "dist/install.js"
11
+ },
12
+ "scripts": {
13
+ "build": "tsc",
14
+ "build:icons": "node scripts/generate-icons.mjs",
15
+ "prepare": "npm run build",
16
+ "prepublishOnly": "npm run build && npm run lint",
17
+ "start": "node dist/index.js",
18
+ "start:stdio": "node dist/index.js --stdio",
19
+ "start:http": "node dist/index.js --http",
20
+ "install:local": "node dist/install.js",
21
+ "dev": "tsc --watch",
22
+ "lint": "tsc --noEmit",
23
+ "test": "node --experimental-vm-modules node_modules/vitest/vitest.mjs run"
24
+ },
25
+ "engines": {
26
+ "node": ">=18"
27
+ },
28
+ "keywords": [
29
+ "mcp",
30
+ "lockin",
31
+ "macos",
32
+ "distraction-blocker",
33
+ "hosts",
34
+ "focus",
35
+ "poke"
36
+ ],
37
+ "license": "MIT",
38
+ "files": [
39
+ "dist",
40
+ "assets",
41
+ "install.sh",
42
+ "install.ps1",
43
+ "README.md"
44
+ ],
45
+ "publishConfig": {
46
+ "access": "public"
47
+ },
48
+ "dependencies": {
49
+ "@clack/prompts": "^1.5.1",
50
+ "@modelcontextprotocol/sdk": "^1.26.0",
51
+ "express": "^4.21.2",
52
+ "picocolors": "^1.1.1",
53
+ "ws": "^8.18.1",
54
+ "zod": "^3.24.2"
55
+ },
56
+ "devDependencies": {
57
+ "@resvg/resvg-js": "^2.6.2",
58
+ "@types/express": "^4.17.21",
59
+ "@types/node": "^22.13.10",
60
+ "@types/ws": "^8.5.14",
61
+ "typescript": "^5.8.2",
62
+ "vitest": "^3.0.9"
63
+ }
64
+ }