lockin-mcp 1.0.5 → 1.0.8
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 +29 -21
- package/dist/blocker.d.ts +4 -1
- package/dist/blocker.d.ts.map +1 -1
- package/dist/blocker.js +18 -1
- package/dist/blocker.js.map +1 -1
- package/dist/brand.d.ts +1 -1
- package/dist/brand.d.ts.map +1 -1
- package/dist/brand.js +1 -1
- package/dist/brand.js.map +1 -1
- package/dist/cloud-activity.d.ts +10 -0
- package/dist/cloud-activity.d.ts.map +1 -0
- package/dist/cloud-activity.js +173 -0
- package/dist/cloud-activity.js.map +1 -0
- package/dist/http-auth.d.ts +4 -3
- package/dist/http-auth.d.ts.map +1 -1
- package/dist/http-auth.js +7 -3
- package/dist/http-auth.js.map +1 -1
- package/dist/http-auth.test.js +9 -3
- package/dist/http-auth.test.js.map +1 -1
- package/dist/index.js +131 -21
- package/dist/index.js.map +1 -1
- package/dist/install.js +9 -0
- package/dist/install.js.map +1 -1
- package/dist/installer/agent-instructions.d.ts.map +1 -1
- package/dist/installer/agent-instructions.js +0 -1
- package/dist/installer/agent-instructions.js.map +1 -1
- package/dist/installer/agents.d.ts +1 -1
- package/dist/installer/agents.d.ts.map +1 -1
- package/dist/installer/agents.js +14 -89
- package/dist/installer/agents.js.map +1 -1
- package/dist/installer/auto-update.d.ts +9 -0
- package/dist/installer/auto-update.d.ts.map +1 -0
- package/dist/installer/auto-update.js +194 -0
- package/dist/installer/auto-update.js.map +1 -0
- package/dist/installer/background-service.d.ts +9 -1
- package/dist/installer/background-service.d.ts.map +1 -1
- package/dist/installer/background-service.js +90 -3
- package/dist/installer/background-service.js.map +1 -1
- package/dist/installer/daemon-windows.d.ts +3 -0
- package/dist/installer/daemon-windows.d.ts.map +1 -1
- package/dist/installer/daemon-windows.js +12 -1
- package/dist/installer/daemon-windows.js.map +1 -1
- package/dist/installer/dev-reset.d.ts +16 -0
- package/dist/installer/dev-reset.d.ts.map +1 -0
- package/dist/installer/dev-reset.js +239 -0
- package/dist/installer/dev-reset.js.map +1 -0
- package/dist/installer/dev-reset.test.d.ts +2 -0
- package/dist/installer/dev-reset.test.d.ts.map +1 -0
- package/dist/installer/dev-reset.test.js +23 -0
- package/dist/installer/dev-reset.test.js.map +1 -0
- package/dist/installer/license.d.ts.map +1 -1
- package/dist/installer/license.js +1 -1
- package/dist/installer/license.js.map +1 -1
- package/dist/installer/port.d.ts +11 -0
- package/dist/installer/port.d.ts.map +1 -1
- package/dist/installer/port.js +142 -3
- package/dist/installer/port.js.map +1 -1
- package/dist/installer/port.test.d.ts +2 -0
- package/dist/installer/port.test.d.ts.map +1 -0
- package/dist/installer/port.test.js +55 -0
- package/dist/installer/port.test.js.map +1 -0
- package/dist/installer/relay-provision.d.ts +1 -0
- package/dist/installer/relay-provision.d.ts.map +1 -1
- package/dist/installer/relay-provision.js +2 -1
- package/dist/installer/relay-provision.js.map +1 -1
- package/dist/installer/run.d.ts.map +1 -1
- package/dist/installer/run.js +46 -24
- package/dist/installer/run.js.map +1 -1
- package/dist/license-check.d.ts.map +1 -1
- package/dist/license-check.js +3 -1
- package/dist/license-check.js.map +1 -1
- package/dist/license-check.test.js +10 -0
- package/dist/license-check.test.js.map +1 -1
- package/dist/license-guard.d.ts.map +1 -1
- package/dist/license-guard.js +30 -7
- package/dist/license-guard.js.map +1 -1
- package/dist/license-guard.test.js +35 -2
- package/dist/license-guard.test.js.map +1 -1
- package/dist/license-token.d.ts +5 -0
- package/dist/license-token.d.ts.map +1 -0
- package/dist/license-token.js +87 -0
- package/dist/license-token.js.map +1 -0
- package/dist/relay-client.d.ts.map +1 -1
- package/dist/relay-client.js +6 -0
- package/dist/relay-client.js.map +1 -1
- package/dist/relay-manager.d.ts +1 -0
- package/dist/relay-manager.d.ts.map +1 -1
- package/dist/relay-manager.js +9 -5
- package/dist/relay-manager.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +7 -0
- package/dist/server.js.map +1 -1
- package/package.json +7 -1
package/README.md
CHANGED
|
@@ -148,10 +148,10 @@ cd web && npx convex deploy
|
|
|
148
148
|
|
|
149
149
|
1. Convex `MDB_APP_URL` is `https://www.lockinmcp.com` (not `localhost`).
|
|
150
150
|
2. Vercel `MDB_SERVER_SECRET` === Convex `MDB_SERVER_SECRET`.
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
151
|
+
3. Stripe webhook enables `checkout.session.created` and `checkout.session.expired`.
|
|
152
|
+
4. Preview email: `./scripts/send-abandoned-checkout-preview.sh you@example.com`
|
|
153
|
+
5. Dev smoke test (60s delay): `npx convex env set CHECKOUT_FOLLOW_UP_DELAY_MS 60000` then `./scripts/test-abandoned-checkout-schedule.sh <userId>`
|
|
154
|
+
6. Inspect jobs: `./scripts/list-checkout-follow-ups.sh scheduled`
|
|
155
155
|
|
|
156
156
|
Optional Convex env: `CHECKOUT_FOLLOW_UP_DELAY_MS` (default `86400000` = 24h).
|
|
157
157
|
|
|
@@ -214,12 +214,12 @@ iwr -useb https://raw.githubusercontent.com/Kiog-Aser/LockIn/main/install.ps1 |
|
|
|
214
214
|
### npm
|
|
215
215
|
|
|
216
216
|
```bash
|
|
217
|
-
npx -y lockin-mcp@1.0.
|
|
217
|
+
npx -y lockin-mcp@1.0.7 install
|
|
218
218
|
# or from a local clone:
|
|
219
219
|
npm run install:local
|
|
220
220
|
```
|
|
221
221
|
|
|
222
|
-
The npm package `lockin-mcp` (v1.0.
|
|
222
|
+
The npm package `lockin-mcp` (v1.0.7) replaces the legacy `mac-distraction-blocker-mcp` name. Legacy bin aliases (`mac-distraction-blocker-mcp`, `mdb-install`) still work.
|
|
223
223
|
|
|
224
224
|
### What the installer does
|
|
225
225
|
|
|
@@ -229,7 +229,7 @@ The npm package `lockin-mcp` (v1.0.4) replaces the legacy `mac-distraction-block
|
|
|
229
229
|
4. **Applies initial blocks** to `/etc/hosts`
|
|
230
230
|
5. **Starts the MCP HTTP server** locally with an outbound relay connection (background LaunchAgent on macOS)
|
|
231
231
|
6. **Provisions a stable relay URL** (`https://relay.lockinmcp.com/device/{id}/mcp`) so Poke, Claude, and ChatGPT can reach your Mac
|
|
232
|
-
7. **Connects your AI agent** — Poke
|
|
232
|
+
7. **Connects your AI agent** — Poke, Claude (web), and ChatGPT use OAuth via lockinmcp.com; Claude Desktop uses your API key via mcp-remote
|
|
233
233
|
|
|
234
234
|
### Installer flags (non-interactive)
|
|
235
235
|
|
|
@@ -244,6 +244,9 @@ npx -y lockin-mcp install --license-key lockin_pro_xxx --sites all --poke-recipe
|
|
|
244
244
|
| `--license-key <key>` | Pro license key |
|
|
245
245
|
| `--browser-login` | Verify license via browser device flow (default) |
|
|
246
246
|
| `--skip-tunnel` | Local MCP only (no relay URL) |
|
|
247
|
+
| `--skip-block` | Skip initial domain blocking |
|
|
248
|
+
| `--skip-poke` | Skip Poke URL generation |
|
|
249
|
+
| `--port <number>` | Local MCP HTTP port (default 3000) |
|
|
247
250
|
| `--sites all` | Block all presets |
|
|
248
251
|
| `--custom-domains a.com,b.com` | Extra domains |
|
|
249
252
|
| `--poke-recipe` | Generate distraction-coach recipe URL |
|
|
@@ -287,12 +290,14 @@ Your MCP URL and API key are in `~/.lockin/setup-manifest.json`:
|
|
|
287
290
|
|
|
288
291
|
### Poke
|
|
289
292
|
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
293
|
+
The installer copies your relay MCP URL and opens [poke.com/integrations/new](https://poke.com/integrations/new). In Poke:
|
|
294
|
+
|
|
295
|
+
1. Paste the MCP URL (ends with `/mcp`)
|
|
296
|
+
2. Choose **OAuth** authentication (do not paste your API key in the integration form)
|
|
297
|
+
3. Sign in on lockinmcp.com when prompted
|
|
298
|
+
4. Install the [LockIn recipe](https://poke.com/r/KQ7myvC_Xpo)
|
|
294
299
|
|
|
295
|
-
|
|
300
|
+
Legacy CLI (optional): `npx poke@latest mcp add 'https://YOUR_RELAY_HOST/device/YOUR_ID/mcp' -n 'LockIn MCP'` with OAuth in the Poke UI.
|
|
296
301
|
|
|
297
302
|
### Claude (claude.ai)
|
|
298
303
|
|
|
@@ -431,14 +436,7 @@ Call `get_block_status` — `hostsFileWritable: true` means the server can updat
|
|
|
431
436
|
|
|
432
437
|
## Hooking up to [poke.com/kitchen](https://poke.com/kitchen)
|
|
433
438
|
|
|
434
|
-
The installer tunnels your local MCP over HTTPS so Poke can connect remotely — no extra terminal tab.
|
|
435
|
-
|
|
436
|
-
```bash
|
|
437
|
-
npx poke@latest login
|
|
438
|
-
npx poke@latest mcp add 'https://YOUR_RELAY_HOST/device/YOUR_ID/mcp' -n 'LockIn MCP' --api-key 'mdb_...'
|
|
439
|
-
```
|
|
440
|
-
|
|
441
|
-
The installer runs this automatically when you choose Poke. Credentials are in `setup-manifest.json`.
|
|
439
|
+
The installer tunnels your local MCP over HTTPS so Poke can connect remotely — no extra terminal tab. When you choose Poke during install, it copies your relay URL and opens the integrations page for OAuth setup.
|
|
442
440
|
|
|
443
441
|
### Recipe / Kitchen (recommended)
|
|
444
442
|
|
|
@@ -510,6 +508,16 @@ cd relay && npm test # relay token hashing tests
|
|
|
510
508
|
|
|
511
509
|
CI (`.github/workflows/ci.yml`) runs lint, test, build, and `npm audit --audit-level=high` for the MCP server, web app, and relay worker.
|
|
512
510
|
|
|
511
|
+
**Reset local install state** (development only):
|
|
512
|
+
|
|
513
|
+
```bash
|
|
514
|
+
npx lockin-mcp dev-reset # reset hosts, manifest, relay config
|
|
515
|
+
npx lockin-mcp dev-reset --full # also remove LaunchAgent / background service
|
|
516
|
+
npx lockin-mcp dev-reset --wipe-license # clear saved license
|
|
517
|
+
```
|
|
518
|
+
|
|
519
|
+
See `relay/README.md` for Cloudflare WebSocket hibernation details on the device relay worker.
|
|
520
|
+
|
|
513
521
|
## Troubleshooting
|
|
514
522
|
|
|
515
523
|
| Issue | Fix |
|
|
@@ -517,7 +525,7 @@ CI (`.github/workflows/ci.yml`) runs lint, test, build, and `npm audit --audit-l
|
|
|
517
525
|
| `EACCES` on block/unblock | Run with `sudo` or configure passwordless sudo (see above) |
|
|
518
526
|
| Site still loads | Hard-refresh browser; DNS cache may take a moment. Try private window. |
|
|
519
527
|
| Temp unblock didn't re-block | Keep the MCP server process running (expiry watcher runs in-process) |
|
|
520
|
-
| Poke can't connect | Check manifest relay URL + `/health` returns `lockin-mcp` with `relay.connected: true`. If offline, re-run `npx lockin-mcp install` once — the daemon self-heals reconnects automatically. |
|
|
528
|
+
| Poke can't connect | Re-run install and confirm OAuth completed in Poke. Check manifest relay URL + `/health` returns `lockin-mcp` with `relay.connected: true`. If offline, re-run `npx lockin-mcp install` once — the daemon self-heals reconnects automatically. |
|
|
521
529
|
| Wrong platform | macOS, Linux, and Windows are supported; DNS flush behavior differs by OS |
|
|
522
530
|
|
|
523
531
|
## License
|
package/dist/blocker.d.ts
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import { type BlockStatusResult, type BlockerState, type DomainStatus } from "./types.js";
|
|
2
2
|
export declare function startExpiryWatcher(intervalMs?: number): void;
|
|
3
3
|
export declare function stopExpiryWatcher(): void;
|
|
4
|
-
export declare function blockDomains(domains: string[]
|
|
4
|
+
export declare function blockDomains(domains: string[], options?: {
|
|
5
|
+
syncActivity?: boolean;
|
|
6
|
+
}): Promise<{
|
|
5
7
|
blocked: string[];
|
|
8
|
+
newlyBlocked: string[];
|
|
6
9
|
message: string;
|
|
7
10
|
}>;
|
|
8
11
|
export declare function unblockDomains(domains: string[]): Promise<{
|
package/dist/blocker.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blocker.d.ts","sourceRoot":"","sources":["../src/blocker.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"blocker.d.ts","sourceRoot":"","sources":["../src/blocker.ts"],"names":[],"mappings":"AAeA,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,YAAY,EACjB,KAAK,YAAY,EAGlB,MAAM,YAAY,CAAC;AAKpB,wBAAgB,kBAAkB,CAChC,UAAU,SAAS,GAClB,IAAI,CAUN;AAED,wBAAgB,iBAAiB,IAAI,IAAI,CAKxC;AAsCD,wBAAsB,YAAY,CAChC,OAAO,EAAE,MAAM,EAAE,EACjB,OAAO,CAAC,EAAE;IAAE,YAAY,CAAC,EAAE,OAAO,CAAA;CAAE,GACnC,OAAO,CAAC;IACT,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC,CAmDD;AAUD,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAC/D,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC,CAkCD;AAED,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,MAAM,EAAE,EACjB,eAAe,EAAE,MAAM,GACtB,OAAO,CAAC;IACT,oBAAoB,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnE,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC,CA4CD;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAiCjE;AAED,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAG7D;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,YAAY,CAgBhF;AAED,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAGzE"}
|
package/dist/blocker.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { canWriteHostsFile, syncHostsFile, } from "./hosts-manager.js";
|
|
2
|
+
import { pushCloudActivity } from "./cloud-activity.js";
|
|
2
3
|
import { dedupeDomains, getDomainsToBlockInHosts, getActiveTemporaryUnblock, isDomainBlocked, loadState, pruneExpiredUnblocks, saveState, appendAuditEntry, } from "./state.js";
|
|
3
4
|
import { isValidDomain, normalizeDomain, } from "./types.js";
|
|
4
5
|
let expiryTimer;
|
|
@@ -48,7 +49,8 @@ function validateDomains(domains) {
|
|
|
48
49
|
}
|
|
49
50
|
return normalized;
|
|
50
51
|
}
|
|
51
|
-
export async function blockDomains(domains) {
|
|
52
|
+
export async function blockDomains(domains, options) {
|
|
53
|
+
const syncActivity = options?.syncActivity !== false;
|
|
52
54
|
const validated = validateDomains(domains);
|
|
53
55
|
const state = await loadState();
|
|
54
56
|
const blockedSet = new Set(state.blockedDomains);
|
|
@@ -68,17 +70,29 @@ export async function blockDomains(domains) {
|
|
|
68
70
|
await saveState(nextState);
|
|
69
71
|
}
|
|
70
72
|
const method = await applyHostsFromState(nextState);
|
|
73
|
+
if (!stateUnchanged && syncActivity) {
|
|
74
|
+
void syncBlockingStatus(nextState);
|
|
75
|
+
}
|
|
71
76
|
if (method === "unchanged" && newDomains.length === 0) {
|
|
72
77
|
return {
|
|
73
78
|
blocked: validated,
|
|
79
|
+
newlyBlocked: [],
|
|
74
80
|
message: `${validated.length} site(s) already blocked.`,
|
|
75
81
|
};
|
|
76
82
|
}
|
|
77
83
|
return {
|
|
78
84
|
blocked: validated,
|
|
85
|
+
newlyBlocked: newDomains,
|
|
79
86
|
message: `Blocked ${validated.length} site(s) via /etc/hosts (${method}).`,
|
|
80
87
|
};
|
|
81
88
|
}
|
|
89
|
+
async function syncBlockingStatus(state) {
|
|
90
|
+
const activeDomains = getDomainsToBlockInHosts(state);
|
|
91
|
+
void pushCloudActivity({
|
|
92
|
+
blockingActive: activeDomains.length > 0,
|
|
93
|
+
blockedDomainCount: activeDomains.length,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
82
96
|
export async function unblockDomains(domains) {
|
|
83
97
|
const validated = validateDomains(domains);
|
|
84
98
|
const state = await loadState();
|
|
@@ -91,6 +105,9 @@ export async function unblockDomains(domains) {
|
|
|
91
105
|
}, "unblock_domains", unblocked);
|
|
92
106
|
await saveState(nextState);
|
|
93
107
|
const method = await applyHostsFromState(nextState);
|
|
108
|
+
if (unblocked.length > 0) {
|
|
109
|
+
void syncBlockingStatus(nextState);
|
|
110
|
+
}
|
|
94
111
|
return {
|
|
95
112
|
unblocked,
|
|
96
113
|
message: `Unblocked ${unblocked.length} domain(s) and updated /etc/hosts (${method}).`,
|
package/dist/blocker.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blocker.js","sourceRoot":"","sources":["../src/blocker.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,aAAa,GACd,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,aAAa,EACb,wBAAwB,EACxB,yBAAyB,EACzB,eAAe,EACf,SAAS,EACT,oBAAoB,EACpB,SAAS,EACT,gBAAgB,GACjB,MAAM,YAAY,CAAC;AACpB,OAAO,EAIL,aAAa,EACb,eAAe,GAChB,MAAM,YAAY,CAAC;AAEpB,IAAI,WAAuC,CAAC;AAC5C,IAAI,YAAY,GAAkB,IAAI,CAAC;AAEvC,MAAM,UAAU,kBAAkB,CAChC,UAAU,GAAG,MAAM;IAEnB,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO;IACT,CAAC;IAED,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE;QAC7B,KAAK,sBAAsB,EAAE,CAAC;IAChC,CAAC,EAAE,UAAU,CAAC,CAAC;IAEf,WAAW,CAAC,KAAK,EAAE,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,IAAI,WAAW,EAAE,CAAC;QAChB,aAAa,CAAC,WAAW,CAAC,CAAC;QAC3B,WAAW,GAAG,SAAS,CAAC;IAC1B,CAAC;AACH,CAAC;AAED,KAAK,UAAU,sBAAsB;IACnC,MAAM,KAAK,GAAG,MAAM,SAAS,EAAE,CAAC;IAChC,MAAM,MAAM,GAAG,oBAAoB,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;IAC7D,IAAI,MAAM,CAAC,MAAM,KAAK,KAAK,CAAC,iBAAiB,CAAC,MAAM,EAAE,CAAC;QACrD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,SAAS,GAAiB;QAC9B,GAAG,KAAK;QACR,iBAAiB,EAAE,MAAM;KAC1B,CAAC;IACF,MAAM,SAAS,CAAC,SAAS,CAAC,CAAC;IAC3B,MAAM,mBAAmB,CAAC,SAAS,CAAC,CAAC;IACrC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,mBAAmB,CAChC,KAAmB;IAEnB,MAAM,OAAO,GAAG,wBAAwB,CAAC,KAAK,CAAC,CAAC;IAChD,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC;IAC1C,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QAChC,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC5B,CAAC;IACD,OAAO,IAAI,CAAC,MAAM,CAAC;AACrB,CAAC;AAED,SAAS,eAAe,CAAC,OAAiB;IACxC,MAAM,UAAU,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;IACtE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,sBAAsB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC9D,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,
|
|
1
|
+
{"version":3,"file":"blocker.js","sourceRoot":"","sources":["../src/blocker.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,aAAa,GACd,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EACL,aAAa,EACb,wBAAwB,EACxB,yBAAyB,EACzB,eAAe,EACf,SAAS,EACT,oBAAoB,EACpB,SAAS,EACT,gBAAgB,GACjB,MAAM,YAAY,CAAC;AACpB,OAAO,EAIL,aAAa,EACb,eAAe,GAChB,MAAM,YAAY,CAAC;AAEpB,IAAI,WAAuC,CAAC;AAC5C,IAAI,YAAY,GAAkB,IAAI,CAAC;AAEvC,MAAM,UAAU,kBAAkB,CAChC,UAAU,GAAG,MAAM;IAEnB,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO;IACT,CAAC;IAED,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE;QAC7B,KAAK,sBAAsB,EAAE,CAAC;IAChC,CAAC,EAAE,UAAU,CAAC,CAAC;IAEf,WAAW,CAAC,KAAK,EAAE,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,IAAI,WAAW,EAAE,CAAC;QAChB,aAAa,CAAC,WAAW,CAAC,CAAC;QAC3B,WAAW,GAAG,SAAS,CAAC;IAC1B,CAAC;AACH,CAAC;AAED,KAAK,UAAU,sBAAsB;IACnC,MAAM,KAAK,GAAG,MAAM,SAAS,EAAE,CAAC;IAChC,MAAM,MAAM,GAAG,oBAAoB,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;IAC7D,IAAI,MAAM,CAAC,MAAM,KAAK,KAAK,CAAC,iBAAiB,CAAC,MAAM,EAAE,CAAC;QACrD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,SAAS,GAAiB;QAC9B,GAAG,KAAK;QACR,iBAAiB,EAAE,MAAM;KAC1B,CAAC;IACF,MAAM,SAAS,CAAC,SAAS,CAAC,CAAC;IAC3B,MAAM,mBAAmB,CAAC,SAAS,CAAC,CAAC;IACrC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,mBAAmB,CAChC,KAAmB;IAEnB,MAAM,OAAO,GAAG,wBAAwB,CAAC,KAAK,CAAC,CAAC;IAChD,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC;IAC1C,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QAChC,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC5B,CAAC;IACD,OAAO,IAAI,CAAC,MAAM,CAAC;AACrB,CAAC;AAED,SAAS,eAAe,CAAC,OAAiB;IACxC,MAAM,UAAU,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;IACtE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,sBAAsB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC9D,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,OAAiB,EACjB,OAAoC;IAMpC,MAAM,YAAY,GAAG,OAAO,EAAE,YAAY,KAAK,KAAK,CAAC;IACrD,MAAM,SAAS,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAG,MAAM,SAAS,EAAE,CAAC;IAEhC,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IACjD,MAAM,UAAU,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IACzE,KAAK,MAAM,MAAM,IAAI,SAAS,EAAE,CAAC;QAC/B,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACzB,CAAC;IAED,MAAM,SAAS,GAAiB,gBAAgB,CAC9C;QACE,cAAc,EAAE,CAAC,GAAG,UAAU,CAAC,CAAC,IAAI,EAAE;QACtC,iBAAiB,EAAE,KAAK,CAAC,iBAAiB,CAAC,MAAM,CAC/C,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAC7C;QACD,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;KACtB,EACD,eAAe,EACf,SAAS,CACV,CAAC;IAEF,MAAM,cAAc,GAClB,UAAU,CAAC,MAAM,KAAK,CAAC;QACvB,SAAS,CAAC,cAAc,CAAC,MAAM,KAAK,KAAK,CAAC,cAAc,CAAC,MAAM;QAC/D,SAAS,CAAC,iBAAiB,CAAC,MAAM,KAAK,KAAK,CAAC,iBAAiB,CAAC,MAAM,CAAC;IAExE,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,SAAS,CAAC,CAAC;IAEpD,IAAI,CAAC,cAAc,IAAI,YAAY,EAAE,CAAC;QACpC,KAAK,kBAAkB,CAAC,SAAS,CAAC,CAAC;IACrC,CAAC;IAED,IAAI,MAAM,KAAK,WAAW,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtD,OAAO;YACL,OAAO,EAAE,SAAS;YAClB,YAAY,EAAE,EAAE;YAChB,OAAO,EAAE,GAAG,SAAS,CAAC,MAAM,2BAA2B;SACxD,CAAC;IACJ,CAAC;IAED,OAAO;QACL,OAAO,EAAE,SAAS;QAClB,YAAY,EAAE,UAAU;QACxB,OAAO,EAAE,WAAW,SAAS,CAAC,MAAM,4BAA4B,MAAM,IAAI;KAC3E,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,KAAmB;IACnD,MAAM,aAAa,GAAG,wBAAwB,CAAC,KAAK,CAAC,CAAC;IACtD,KAAK,iBAAiB,CAAC;QACrB,cAAc,EAAE,aAAa,CAAC,MAAM,GAAG,CAAC;QACxC,kBAAkB,EAAE,aAAa,CAAC,MAAM;KACzC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAiB;IAIpD,MAAM,SAAS,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAG,MAAM,SAAS,EAAE,CAAC;IAChC,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;IAErC,MAAM,SAAS,GAAG,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CACvD,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CACtB,CAAC;IAEF,MAAM,SAAS,GAAiB,gBAAgB,CAC9C;QACE,cAAc,EAAE,KAAK,CAAC,cAAc,CAAC,MAAM,CACzC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CACnC;QACD,iBAAiB,EAAE,KAAK,CAAC,iBAAiB,CAAC,MAAM,CAC/C,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CACxC;QACD,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;KACtB,EACD,iBAAiB,EACjB,SAAS,CACV,CAAC;IAEF,MAAM,SAAS,CAAC,SAAS,CAAC,CAAC;IAC3B,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,SAAS,CAAC,CAAC;IAEpD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,KAAK,kBAAkB,CAAC,SAAS,CAAC,CAAC;IACrC,CAAC;IAED,OAAO;QACL,SAAS;QACT,OAAO,EAAE,aAAa,SAAS,CAAC,MAAM,sCAAsC,MAAM,IAAI;KACvF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,OAAiB,EACjB,eAAuB;IAKvB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,eAAe,IAAI,CAAC,EAAE,CAAC;QAC9D,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAChE,CAAC;IAED,MAAM,SAAS,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAG,MAAM,SAAS,EAAE,CAAC;IAChC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,eAAe,GAAG,IAAI,CAAC;IACtD,MAAM,iBAAiB,GAAG,CAAC,GAAG,KAAK,CAAC,iBAAiB,CAAC,CAAC;IAEvD,KAAK,MAAM,MAAM,IAAI,SAAS,EAAE,CAAC;QAC/B,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3C,MAAM,IAAI,KAAK,CACb,+BAA+B,MAAM,yCAAyC,CAC/E,CAAC;QACJ,CAAC;QAED,MAAM,aAAa,GAAG,iBAAiB,CAAC,SAAS,CAC/C,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,MAAM,CACnC,CAAC;QACF,MAAM,KAAK,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;QACpC,IAAI,aAAa,IAAI,CAAC,EAAE,CAAC;YACvB,iBAAiB,CAAC,aAAa,CAAC,GAAG,KAAK,CAAC;QAC3C,CAAC;aAAM,CAAC;YACN,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAAiB,gBAAgB,CAC9C;QACE,GAAG,KAAK;QACR,iBAAiB;KAClB,EACD,6BAA6B,EAC7B,SAAS,CACV,CAAC;IAEF,MAAM,SAAS,CAAC,SAAS,CAAC,CAAC;IAC3B,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,SAAS,CAAC,CAAC;IAEpD,OAAO;QACL,oBAAoB,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QACxE,OAAO,EAAE,yBAAyB,SAAS,CAAC,MAAM,kBAAkB,eAAe,MAAM,MAAM,IAAI;KACpG,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,MAAM,sBAAsB,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAG,MAAM,SAAS,EAAE,CAAC;IAChC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,iBAAiB,GAAG,MAAM,iBAAiB,EAAE,CAAC;IAEpD,MAAM,OAAO,GAAmB,EAAE,CAAC;IACnC,MAAM,oBAAoB,GAAmB,EAAE,CAAC;IAEhD,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;QAC1C,MAAM,IAAI,GAAG,yBAAyB,CAAC,MAAM,EAAE,KAAK,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC;QAC7E,IAAI,IAAI,EAAE,CAAC;YACT,oBAAoB,CAAC,IAAI,CAAC;gBACxB,MAAM;gBACN,MAAM,EAAE,uBAAuB;gBAC/B,SAAS,EAAE,IAAI,CAAC,SAAS;aAC1B,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,OAAO,CAAC,IAAI,CAAC;YACX,MAAM;YACN,MAAM,EAAE,SAAS;SAClB,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,OAAO;QACP,oBAAoB;QACpB,UAAU,EAAE,EAAE;QACd,iBAAiB;QACjB,YAAY;KACb,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACvC,MAAM,KAAK,GAAG,MAAM,SAAS,EAAE,CAAC;IAChC,OAAO,KAAK,CAAC,cAAc,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAc,EAAE,KAAmB;IAChE,MAAM,UAAU,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IAC3C,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/C,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;IACvD,CAAC;IAED,MAAM,IAAI,GAAG,yBAAyB,CAAC,UAAU,EAAE,KAAK,CAAC,iBAAiB,CAAC,CAAC;IAC5E,IAAI,IAAI,EAAE,CAAC;QACT,OAAO;YACL,MAAM,EAAE,UAAU;YAClB,MAAM,EAAE,uBAAuB;YAC/B,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;AACnD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,MAAc;IACrD,MAAM,KAAK,GAAG,MAAM,SAAS,EAAE,CAAC;IAChC,OAAO,eAAe,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AACxC,CAAC"}
|
package/dist/brand.d.ts
CHANGED
|
@@ -7,7 +7,7 @@ export declare const RELAY_HOST = "relay.lockinmcp.com";
|
|
|
7
7
|
export declare const RELAY_PUBLIC_ORIGIN = "https://relay.lockinmcp.com";
|
|
8
8
|
export declare const LICENSE_PRICE_ORIGINAL = "$19.99";
|
|
9
9
|
export declare const LICENSE_PRICE = "$9.99";
|
|
10
|
-
export declare const LICENSE_DISCOUNT_LABEL = "
|
|
10
|
+
export declare const LICENSE_DISCOUNT_LABEL = "Launch promo \u2014 50% off";
|
|
11
11
|
export declare const POKE_LOCKIN_RECIPE_URL = "https://poke.com/r/KQ7myvC_Xpo";
|
|
12
12
|
export declare const ICON_URL = "https://www.lockinmcp.com/icon.png";
|
|
13
13
|
//# sourceMappingURL=brand.d.ts.map
|
package/dist/brand.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"brand.d.ts","sourceRoot":"","sources":["../src/brand.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,QAAQ,eAAe,CAAC;AACrC,eAAO,MAAM,QAAQ,eAAe,CAAC;AACrC,eAAO,MAAM,WAAW,uCAAuC,CAAC;AAChE,eAAO,MAAM,UAAU,kBAAkB,CAAC;AAC1C,eAAO,MAAM,gBAAgB,8BAA8B,CAAC;AAC5D,eAAO,MAAM,UAAU,wBAAwB,CAAC;AAChD,eAAO,MAAM,mBAAmB,gCAA0B,CAAC;AAC3D,eAAO,MAAM,sBAAsB,WAAW,CAAC;AAC/C,eAAO,MAAM,aAAa,UAAU,CAAC;AACrC,eAAO,MAAM,sBAAsB,
|
|
1
|
+
{"version":3,"file":"brand.d.ts","sourceRoot":"","sources":["../src/brand.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,QAAQ,eAAe,CAAC;AACrC,eAAO,MAAM,QAAQ,eAAe,CAAC;AACrC,eAAO,MAAM,WAAW,uCAAuC,CAAC;AAChE,eAAO,MAAM,UAAU,kBAAkB,CAAC;AAC1C,eAAO,MAAM,gBAAgB,8BAA8B,CAAC;AAC5D,eAAO,MAAM,UAAU,wBAAwB,CAAC;AAChD,eAAO,MAAM,mBAAmB,gCAA0B,CAAC;AAC3D,eAAO,MAAM,sBAAsB,WAAW,CAAC;AAC/C,eAAO,MAAM,aAAa,UAAU,CAAC;AACrC,eAAO,MAAM,sBAAsB,gCAA2B,CAAC;AAC/D,eAAO,MAAM,sBAAsB,mCAAmC,CAAC;AACvE,eAAO,MAAM,QAAQ,uCAAiC,CAAC"}
|
package/dist/brand.js
CHANGED
|
@@ -7,7 +7,7 @@ export const RELAY_HOST = `relay.${APP_DOMAIN}`;
|
|
|
7
7
|
export const RELAY_PUBLIC_ORIGIN = `https://${RELAY_HOST}`;
|
|
8
8
|
export const LICENSE_PRICE_ORIGINAL = "$19.99";
|
|
9
9
|
export const LICENSE_PRICE = "$9.99";
|
|
10
|
-
export const LICENSE_DISCOUNT_LABEL = "50% off
|
|
10
|
+
export const LICENSE_DISCOUNT_LABEL = "Launch promo — 50% off";
|
|
11
11
|
export const POKE_LOCKIN_RECIPE_URL = "https://poke.com/r/KQ7myvC_Xpo";
|
|
12
12
|
export const ICON_URL = `${CANONICAL_ORIGIN}/icon.png`;
|
|
13
13
|
//# sourceMappingURL=brand.js.map
|
package/dist/brand.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"brand.js","sourceRoot":"","sources":["../src/brand.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,QAAQ,GAAG,YAAY,CAAC;AACrC,MAAM,CAAC,MAAM,QAAQ,GAAG,YAAY,CAAC;AACrC,MAAM,CAAC,MAAM,WAAW,GAAG,oCAAoC,CAAC;AAChE,MAAM,CAAC,MAAM,UAAU,GAAG,eAAe,CAAC;AAC1C,MAAM,CAAC,MAAM,gBAAgB,GAAG,2BAA2B,CAAC;AAC5D,MAAM,CAAC,MAAM,UAAU,GAAG,SAAS,UAAU,EAAE,CAAC;AAChD,MAAM,CAAC,MAAM,mBAAmB,GAAG,WAAW,UAAU,EAAE,CAAC;AAC3D,MAAM,CAAC,MAAM,sBAAsB,GAAG,QAAQ,CAAC;AAC/C,MAAM,CAAC,MAAM,aAAa,GAAG,OAAO,CAAC;AACrC,MAAM,CAAC,MAAM,sBAAsB,GAAG,
|
|
1
|
+
{"version":3,"file":"brand.js","sourceRoot":"","sources":["../src/brand.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,QAAQ,GAAG,YAAY,CAAC;AACrC,MAAM,CAAC,MAAM,QAAQ,GAAG,YAAY,CAAC;AACrC,MAAM,CAAC,MAAM,WAAW,GAAG,oCAAoC,CAAC;AAChE,MAAM,CAAC,MAAM,UAAU,GAAG,eAAe,CAAC;AAC1C,MAAM,CAAC,MAAM,gBAAgB,GAAG,2BAA2B,CAAC;AAC5D,MAAM,CAAC,MAAM,UAAU,GAAG,SAAS,UAAU,EAAE,CAAC;AAChD,MAAM,CAAC,MAAM,mBAAmB,GAAG,WAAW,UAAU,EAAE,CAAC;AAC3D,MAAM,CAAC,MAAM,sBAAsB,GAAG,QAAQ,CAAC;AAC/C,MAAM,CAAC,MAAM,aAAa,GAAG,OAAO,CAAC;AACrC,MAAM,CAAC,MAAM,sBAAsB,GAAG,wBAAwB,CAAC;AAC/D,MAAM,CAAC,MAAM,sBAAsB,GAAG,gCAAgC,CAAC;AACvE,MAAM,CAAC,MAAM,QAAQ,GAAG,GAAG,gBAAgB,WAAW,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare function pushCloudActivity(payload: {
|
|
2
|
+
focusMinutes?: number;
|
|
3
|
+
sessionDelta?: number;
|
|
4
|
+
blockingActive?: boolean;
|
|
5
|
+
blockedDomainCount?: number;
|
|
6
|
+
relayConnected?: boolean;
|
|
7
|
+
}): Promise<void>;
|
|
8
|
+
export declare function recordFocusSession(blockedDomainCount: number): Promise<void>;
|
|
9
|
+
export declare function pushRelayStatusSnapshot(): Promise<void>;
|
|
10
|
+
//# sourceMappingURL=cloud-activity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloud-activity.d.ts","sourceRoot":"","sources":["../src/cloud-activity.ts"],"names":[],"mappings":"AAgHA,wBAAsB,iBAAiB,CAAC,OAAO,EAAE;IAC/C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,GAAG,OAAO,CAAC,IAAI,CAAC,CA4DhB;AAED,wBAAsB,kBAAkB,CAAC,kBAAkB,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAOlF;AAED,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,IAAI,CAAC,CAgB7D"}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { randomBytes } from "node:crypto";
|
|
4
|
+
import { getBlockStatus } from "./blocker.js";
|
|
5
|
+
import { getLicenseApiUrl } from "./config.js";
|
|
6
|
+
import { refreshSyncTokenAfterAuthFailure, resolveSyncToken, } from "./license-token.js";
|
|
7
|
+
import { fetchLockInHealthSnapshot } from "./installer/port.js";
|
|
8
|
+
import { getInstallDir } from "./installer/platform.js";
|
|
9
|
+
const LOCAL_DEVICE_ID_FILE = "local-device-id";
|
|
10
|
+
const SETUP_MANIFEST_FILE = "setup-manifest.json";
|
|
11
|
+
let cachedDeviceId;
|
|
12
|
+
let deviceIdResolution;
|
|
13
|
+
async function resolveDeviceIdFromDisk() {
|
|
14
|
+
try {
|
|
15
|
+
const { readRelayCredentials } = await import("./installer/relay-credentials.js");
|
|
16
|
+
const credentials = await readRelayCredentials();
|
|
17
|
+
if (credentials?.deviceId) {
|
|
18
|
+
cachedDeviceId = credentials.deviceId;
|
|
19
|
+
return cachedDeviceId;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
// no relay credentials
|
|
24
|
+
}
|
|
25
|
+
try {
|
|
26
|
+
const raw = await readFile(join(getInstallDir(), SETUP_MANIFEST_FILE), "utf8");
|
|
27
|
+
const manifest = JSON.parse(raw);
|
|
28
|
+
if (manifest.relayDeviceId?.trim()) {
|
|
29
|
+
cachedDeviceId = manifest.relayDeviceId.trim();
|
|
30
|
+
return cachedDeviceId;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
// no manifest
|
|
35
|
+
}
|
|
36
|
+
const localIdPath = join(getInstallDir(), LOCAL_DEVICE_ID_FILE);
|
|
37
|
+
try {
|
|
38
|
+
const persisted = (await readFile(localIdPath, "utf8")).trim();
|
|
39
|
+
if (persisted) {
|
|
40
|
+
cachedDeviceId = persisted;
|
|
41
|
+
return cachedDeviceId;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
// generate below
|
|
46
|
+
}
|
|
47
|
+
const generated = `local_${randomBytes(16).toString("hex")}`;
|
|
48
|
+
try {
|
|
49
|
+
await mkdir(getInstallDir(), { recursive: true });
|
|
50
|
+
await writeFile(localIdPath, `${generated}\n`, { mode: 0o600 });
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
// Install dir may be unwritable — use in-memory id for this process.
|
|
54
|
+
}
|
|
55
|
+
cachedDeviceId = generated;
|
|
56
|
+
return cachedDeviceId;
|
|
57
|
+
}
|
|
58
|
+
function readDeviceIdFromEnv() {
|
|
59
|
+
return process.env.MDB_DEVICE_ID?.trim() || undefined;
|
|
60
|
+
}
|
|
61
|
+
/** Resolve a stable device id for cloud sync (env → relay creds → manifest → local file). */
|
|
62
|
+
async function resolveDeviceId() {
|
|
63
|
+
const fromEnv = readDeviceIdFromEnv();
|
|
64
|
+
if (fromEnv) {
|
|
65
|
+
return fromEnv;
|
|
66
|
+
}
|
|
67
|
+
if (cachedDeviceId) {
|
|
68
|
+
return cachedDeviceId;
|
|
69
|
+
}
|
|
70
|
+
deviceIdResolution ??= resolveDeviceIdFromDisk().finally(() => {
|
|
71
|
+
deviceIdResolution = undefined;
|
|
72
|
+
});
|
|
73
|
+
return deviceIdResolution;
|
|
74
|
+
}
|
|
75
|
+
async function readRelayConnected() {
|
|
76
|
+
const port = Number(process.env.MDB_HTTP_PORT ?? 3847);
|
|
77
|
+
const snapshot = await fetchLockInHealthSnapshot(port);
|
|
78
|
+
return snapshot?.relayConnected === true;
|
|
79
|
+
}
|
|
80
|
+
function deviceLocalDateKey() {
|
|
81
|
+
const date = new Date();
|
|
82
|
+
const year = date.getFullYear();
|
|
83
|
+
const month = String(date.getMonth() + 1).padStart(2, "0");
|
|
84
|
+
const day = String(date.getDate()).padStart(2, "0");
|
|
85
|
+
return `${year}-${month}-${day}`;
|
|
86
|
+
}
|
|
87
|
+
function formatSyncFailure(status, body) {
|
|
88
|
+
if (status === 404) {
|
|
89
|
+
return `${status} — activity sync API not deployed yet`;
|
|
90
|
+
}
|
|
91
|
+
const trimmed = body.replace(/\s+/g, " ").trim();
|
|
92
|
+
if (!trimmed || trimmed.startsWith("<!DOCTYPE") || trimmed.startsWith("<html")) {
|
|
93
|
+
return `${status}`;
|
|
94
|
+
}
|
|
95
|
+
return `${status} ${trimmed.slice(0, 120)}`;
|
|
96
|
+
}
|
|
97
|
+
export async function pushCloudActivity(payload) {
|
|
98
|
+
let token = await resolveSyncToken();
|
|
99
|
+
if (!token)
|
|
100
|
+
return;
|
|
101
|
+
const deviceId = await resolveDeviceId();
|
|
102
|
+
const relayConnected = payload.relayConnected ?? (await readRelayConnected());
|
|
103
|
+
const apiUrl = getLicenseApiUrl();
|
|
104
|
+
const body = {
|
|
105
|
+
deviceId,
|
|
106
|
+
relayConnected,
|
|
107
|
+
date: deviceLocalDateKey(),
|
|
108
|
+
};
|
|
109
|
+
if (payload.focusMinutes !== undefined) {
|
|
110
|
+
body.focusMinutes = payload.focusMinutes;
|
|
111
|
+
}
|
|
112
|
+
if (payload.sessionDelta !== undefined) {
|
|
113
|
+
body.sessionDelta = payload.sessionDelta;
|
|
114
|
+
}
|
|
115
|
+
if (payload.blockingActive !== undefined) {
|
|
116
|
+
body.blockingActive = payload.blockingActive;
|
|
117
|
+
}
|
|
118
|
+
if (payload.blockedDomainCount !== undefined) {
|
|
119
|
+
body.blockedDomainCount = payload.blockedDomainCount;
|
|
120
|
+
}
|
|
121
|
+
async function postOnce(authToken) {
|
|
122
|
+
return fetch(`${apiUrl}/activity/sync`, {
|
|
123
|
+
method: "POST",
|
|
124
|
+
headers: {
|
|
125
|
+
"Content-Type": "application/json",
|
|
126
|
+
Authorization: `Bearer ${authToken}`,
|
|
127
|
+
},
|
|
128
|
+
body: JSON.stringify(body),
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
try {
|
|
132
|
+
let response = await postOnce(token);
|
|
133
|
+
if (response.status === 401) {
|
|
134
|
+
const refreshed = await refreshSyncTokenAfterAuthFailure();
|
|
135
|
+
if (refreshed) {
|
|
136
|
+
token = refreshed;
|
|
137
|
+
response = await postOnce(token);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
if (!response.ok) {
|
|
141
|
+
const errorBody = await response.text();
|
|
142
|
+
console.warn(`[cloud-activity] sync failed: ${formatSyncFailure(response.status, errorBody)}`);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
console.warn("[cloud-activity] sync error:", error instanceof Error ? error.message : error);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
export async function recordFocusSession(blockedDomainCount) {
|
|
150
|
+
await pushCloudActivity({
|
|
151
|
+
focusMinutes: 30,
|
|
152
|
+
sessionDelta: 1,
|
|
153
|
+
blockingActive: true,
|
|
154
|
+
blockedDomainCount,
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
export async function pushRelayStatusSnapshot() {
|
|
158
|
+
let blockingActive;
|
|
159
|
+
let blockedDomainCount;
|
|
160
|
+
try {
|
|
161
|
+
const status = await getBlockStatus();
|
|
162
|
+
blockingActive = status.blocked.length > 0;
|
|
163
|
+
blockedDomainCount = status.blocked.length;
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
166
|
+
// Health snapshot still reports relay connectivity.
|
|
167
|
+
}
|
|
168
|
+
await pushCloudActivity({
|
|
169
|
+
blockingActive,
|
|
170
|
+
blockedDomainCount,
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=cloud-activity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloud-activity.js","sourceRoot":"","sources":["../src/cloud-activity.ts"],"names":[],"mappings":"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"}
|
package/dist/http-auth.d.ts
CHANGED
|
@@ -4,9 +4,10 @@ export interface HttpMcpAuthConfig {
|
|
|
4
4
|
relayUrl?: string;
|
|
5
5
|
deviceId?: string;
|
|
6
6
|
}
|
|
7
|
+
export declare function generateHttpMcpAuthToken(): string;
|
|
7
8
|
/**
|
|
8
|
-
* Resolves HTTP MCP bearer auth.
|
|
9
|
-
*
|
|
9
|
+
* Resolves HTTP MCP bearer auth. HTTP mode always requires a token; relay-backed
|
|
10
|
+
* installs must supply one from the installer manifest.
|
|
10
11
|
*/
|
|
11
|
-
export declare function resolveHttpMcpAuth(config: HttpMcpAuthConfig): string
|
|
12
|
+
export declare function resolveHttpMcpAuth(config: HttpMcpAuthConfig): string;
|
|
12
13
|
//# sourceMappingURL=http-auth.d.ts.map
|
package/dist/http-auth.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-auth.d.ts","sourceRoot":"","sources":["../src/http-auth.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"http-auth.d.ts","sourceRoot":"","sources":["../src/http-auth.ts"],"names":[],"mappings":"AAEA,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,SAAS,EAAE,MAAM,GAChB,OAAO,CAMT;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,wBAAwB,IAAI,MAAM,CAEjD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CAcpE"}
|
package/dist/http-auth.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { randomBytes } from "node:crypto";
|
|
1
2
|
export function bearerTokenMatches(header, authToken) {
|
|
2
3
|
if (!header) {
|
|
3
4
|
return false;
|
|
@@ -5,9 +6,12 @@ export function bearerTokenMatches(header, authToken) {
|
|
|
5
6
|
const match = header.match(/^Bearer\s+(.+)$/i);
|
|
6
7
|
return match?.[1] === authToken;
|
|
7
8
|
}
|
|
9
|
+
export function generateHttpMcpAuthToken() {
|
|
10
|
+
return `mdb_${randomBytes(24).toString("hex")}`;
|
|
11
|
+
}
|
|
8
12
|
/**
|
|
9
|
-
* Resolves HTTP MCP bearer auth.
|
|
10
|
-
*
|
|
13
|
+
* Resolves HTTP MCP bearer auth. HTTP mode always requires a token; relay-backed
|
|
14
|
+
* installs must supply one from the installer manifest.
|
|
11
15
|
*/
|
|
12
16
|
export function resolveHttpMcpAuth(config) {
|
|
13
17
|
if (config.authToken) {
|
|
@@ -16,6 +20,6 @@ export function resolveHttpMcpAuth(config) {
|
|
|
16
20
|
if (config.relayUrl || config.deviceId) {
|
|
17
21
|
throw new Error("Refusing to start relay-backed HTTP MCP without MDB_MCP_AUTH_TOKEN. Re-run the installer to generate credentials.");
|
|
18
22
|
}
|
|
19
|
-
|
|
23
|
+
throw new Error("Refusing to start HTTP MCP without MDB_MCP_AUTH_TOKEN. Run the installer or set MDB_MCP_AUTH_TOKEN.");
|
|
20
24
|
}
|
|
21
25
|
//# sourceMappingURL=http-auth.js.map
|
package/dist/http-auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-auth.js","sourceRoot":"","sources":["../src/http-auth.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,kBAAkB,CAChC,MAA0B,EAC1B,SAAiB;IAEjB,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;IAC/C,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC;AAClC,CAAC;AAQD;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAyB;IAC1D,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACrB,OAAO,MAAM,CAAC,SAAS,CAAC;IAC1B,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CACb,mHAAmH,CACpH,CAAC;IACJ,CAAC;IAED,
|
|
1
|
+
{"version":3,"file":"http-auth.js","sourceRoot":"","sources":["../src/http-auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,UAAU,kBAAkB,CAChC,MAA0B,EAC1B,SAAiB;IAEjB,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;IAC/C,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC;AAClC,CAAC;AAQD,MAAM,UAAU,wBAAwB;IACtC,OAAO,OAAO,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;AAClD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAyB;IAC1D,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACrB,OAAO,MAAM,CAAC,SAAS,CAAC;IAC1B,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CACb,mHAAmH,CACpH,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,KAAK,CACb,qGAAqG,CACtG,CAAC;AACJ,CAAC"}
|
package/dist/http-auth.test.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { describe, expect, it } from "vitest";
|
|
2
|
-
import { bearerTokenMatches, resolveHttpMcpAuth } from "./http-auth.js";
|
|
2
|
+
import { bearerTokenMatches, generateHttpMcpAuthToken, resolveHttpMcpAuth, } from "./http-auth.js";
|
|
3
3
|
describe("bearerTokenMatches", () => {
|
|
4
4
|
it("accepts a valid bearer token", () => {
|
|
5
5
|
expect(bearerTokenMatches("Bearer secret-token", "secret-token")).toBe(true);
|
|
@@ -11,12 +11,18 @@ describe("bearerTokenMatches", () => {
|
|
|
11
11
|
expect(bearerTokenMatches("Bearer other", "secret-token")).toBe(false);
|
|
12
12
|
});
|
|
13
13
|
});
|
|
14
|
+
describe("generateHttpMcpAuthToken", () => {
|
|
15
|
+
it("returns a prefixed hex token", () => {
|
|
16
|
+
const token = generateHttpMcpAuthToken();
|
|
17
|
+
expect(token).toMatch(/^mdb_[0-9a-f]{48}$/);
|
|
18
|
+
});
|
|
19
|
+
});
|
|
14
20
|
describe("resolveHttpMcpAuth", () => {
|
|
15
21
|
it("returns the configured auth token", () => {
|
|
16
22
|
expect(resolveHttpMcpAuth({ authToken: "token-123" })).toBe("token-123");
|
|
17
23
|
});
|
|
18
|
-
it("
|
|
19
|
-
expect(resolveHttpMcpAuth({})).
|
|
24
|
+
it("requires an auth token for local HTTP mode", () => {
|
|
25
|
+
expect(() => resolveHttpMcpAuth({})).toThrow(/Refusing to start HTTP MCP without MDB_MCP_AUTH_TOKEN/);
|
|
20
26
|
});
|
|
21
27
|
it("fails closed when relay credentials exist without MCP auth", () => {
|
|
22
28
|
expect(() => resolveHttpMcpAuth({ relayUrl: "wss://relay.example.com" })).toThrow(/Refusing to start relay-backed HTTP MCP/);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-auth.test.js","sourceRoot":"","sources":["../src/http-auth.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,
|
|
1
|
+
{"version":3,"file":"http-auth.test.js","sourceRoot":"","sources":["../src/http-auth.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACxB,kBAAkB,GACnB,MAAM,gBAAgB,CAAC;AAExB,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,CAAC,kBAAkB,CAAC,qBAAqB,EAAE,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7E,MAAM,CAAC,kBAAkB,CAAC,qBAAqB,EAAE,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,CAAC,kBAAkB,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClE,MAAM,CAAC,kBAAkB,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpE,MAAM,CAAC,kBAAkB,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,KAAK,GAAG,wBAAwB,EAAE,CAAC;QACzC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,CAAC,kBAAkB,CAAC,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAC1C,uDAAuD,CACxD,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;QACpE,MAAM,CAAC,GAAG,EAAE,CACV,kBAAkB,CAAC,EAAE,QAAQ,EAAE,yBAAyB,EAAE,CAAC,CAC5D,CAAC,OAAO,CAAC,yCAAyC,CAAC,CAAC;QAErD,MAAM,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,OAAO,CAChE,yCAAyC,CAC1C,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|