lockin-mcp 1.0.8 → 1.0.10

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 (85) hide show
  1. package/README.md +7 -2
  2. package/dist/agent-activity.d.ts +5 -0
  3. package/dist/agent-activity.d.ts.map +1 -0
  4. package/dist/agent-activity.js +46 -0
  5. package/dist/agent-activity.js.map +1 -0
  6. package/dist/agent-activity.test.d.ts +2 -0
  7. package/dist/agent-activity.test.d.ts.map +1 -0
  8. package/dist/agent-activity.test.js +26 -0
  9. package/dist/agent-activity.test.js.map +1 -0
  10. package/dist/agent-guidelines.d.ts +11 -0
  11. package/dist/agent-guidelines.d.ts.map +1 -0
  12. package/dist/agent-guidelines.js +122 -0
  13. package/dist/agent-guidelines.js.map +1 -0
  14. package/dist/agent-guidelines.test.d.ts +2 -0
  15. package/dist/agent-guidelines.test.d.ts.map +1 -0
  16. package/dist/agent-guidelines.test.js +20 -0
  17. package/dist/agent-guidelines.test.js.map +1 -0
  18. package/dist/blocker.d.ts.map +1 -1
  19. package/dist/blocker.js +3 -7
  20. package/dist/blocker.js.map +1 -1
  21. package/dist/cloud-activity.d.ts +3 -1
  22. package/dist/cloud-activity.d.ts.map +1 -1
  23. package/dist/cloud-activity.js +7 -26
  24. package/dist/cloud-activity.js.map +1 -1
  25. package/dist/focus-tracker.d.ts +5 -0
  26. package/dist/focus-tracker.d.ts.map +1 -0
  27. package/dist/focus-tracker.js +41 -0
  28. package/dist/focus-tracker.js.map +1 -0
  29. package/dist/focus-tracker.test.d.ts +2 -0
  30. package/dist/focus-tracker.test.d.ts.map +1 -0
  31. package/dist/focus-tracker.test.js +57 -0
  32. package/dist/focus-tracker.test.js.map +1 -0
  33. package/dist/index.js +21 -4
  34. package/dist/index.js.map +1 -1
  35. package/dist/installer/agents.d.ts +2 -0
  36. package/dist/installer/agents.d.ts.map +1 -1
  37. package/dist/installer/agents.js +36 -26
  38. package/dist/installer/agents.js.map +1 -1
  39. package/dist/installer/auto-update.d.ts +1 -0
  40. package/dist/installer/auto-update.d.ts.map +1 -1
  41. package/dist/installer/auto-update.js +49 -5
  42. package/dist/installer/auto-update.js.map +1 -1
  43. package/dist/installer/auto-update.test.d.ts +2 -0
  44. package/dist/installer/auto-update.test.d.ts.map +1 -0
  45. package/dist/installer/auto-update.test.js +84 -0
  46. package/dist/installer/auto-update.test.js.map +1 -0
  47. package/dist/installer/claude-desktop-config.d.ts.map +1 -1
  48. package/dist/installer/claude-desktop-config.js +4 -1
  49. package/dist/installer/claude-desktop-config.js.map +1 -1
  50. package/dist/installer/claude-desktop-config.test.js +4 -0
  51. package/dist/installer/claude-desktop-config.test.js.map +1 -1
  52. package/dist/installer/connect-agent.d.ts +9 -0
  53. package/dist/installer/connect-agent.d.ts.map +1 -0
  54. package/dist/installer/connect-agent.js +109 -0
  55. package/dist/installer/connect-agent.js.map +1 -0
  56. package/dist/installer/daemon-linux.d.ts.map +1 -1
  57. package/dist/installer/daemon-linux.js +2 -0
  58. package/dist/installer/daemon-linux.js.map +1 -1
  59. package/dist/installer/daemon-path.d.ts +3 -0
  60. package/dist/installer/daemon-path.d.ts.map +1 -0
  61. package/dist/installer/daemon-path.js +6 -0
  62. package/dist/installer/daemon-path.js.map +1 -0
  63. package/dist/installer/daemon-windows.d.ts.map +1 -1
  64. package/dist/installer/daemon-windows.js +12 -7
  65. package/dist/installer/daemon-windows.js.map +1 -1
  66. package/dist/installer/daemon.d.ts.map +1 -1
  67. package/dist/installer/daemon.js +2 -0
  68. package/dist/installer/daemon.js.map +1 -1
  69. package/dist/installer/npm-resolve.d.ts +8 -0
  70. package/dist/installer/npm-resolve.d.ts.map +1 -0
  71. package/dist/installer/npm-resolve.js +134 -0
  72. package/dist/installer/npm-resolve.js.map +1 -0
  73. package/dist/installer/poke.js +1 -1
  74. package/dist/installer/poke.js.map +1 -1
  75. package/dist/installer/prompts.d.ts.map +1 -1
  76. package/dist/installer/prompts.js +1 -0
  77. package/dist/installer/prompts.js.map +1 -1
  78. package/dist/license-check.d.ts +1 -1
  79. package/dist/license-check.d.ts.map +1 -1
  80. package/dist/license-check.js +6 -2
  81. package/dist/license-check.js.map +1 -1
  82. package/dist/server.d.ts.map +1 -1
  83. package/dist/server.js +15 -7
  84. package/dist/server.js.map +1 -1
  85. package/package.json +1 -1
package/README.md CHANGED
@@ -6,6 +6,7 @@ A [Model Context Protocol (MCP)](https://modelcontextprotocol.io/) server that b
6
6
 
7
7
  | Tool | Description |
8
8
  |------|-------------|
9
+ | `get_agent_guidelines` | Coaching instructions for AI agents (when to enforce focus, how to handle unblock requests) |
9
10
  | `block_domains` | Block a list of domains (e.g. `youtube.com`, `x.com`, `tiktok.com`) |
10
11
  | `unblock_domains` | Permanently unblock specific domains |
11
12
  | `temporarily_unblock_domains` | Allow access for a limited time, then auto re-block |
@@ -14,7 +15,7 @@ A [Model Context Protocol (MCP)](https://modelcontextprotocol.io/) server that b
14
15
 
15
16
  Blocking redirects domains to `127.0.0.1` and `::1`, including `www.` variants.
16
17
 
17
- **Pro license required:** `block_domains`, `unblock_domains`, `temporarily_unblock_domains`, and `enter_focus_mode` require an active Pro license. `get_block_status` is read-only and works without Pro. For local development only, set `MDB_SKIP_LICENSE_CHECK=1`.
18
+ **Pro license required:** `block_domains`, `unblock_domains`, `temporarily_unblock_domains`, and `enter_focus_mode` require an active Pro license. `get_agent_guidelines` and `get_block_status` are read-only and work without Pro. For local development only, set `MDB_SKIP_LICENSE_CHECK=1`.
18
19
 
19
20
  ## Requirements
20
21
 
@@ -444,10 +445,14 @@ The installer tunnels your local MCP over HTTPS so Poke can connect remotely —
444
445
 
445
446
  https://poke.com/r/KQ7myvC_Xpo
446
447
 
447
- The recipe connects your MCP tools and coaches you through focus sessions. You can also build custom recipes in [poke.com/kitchen](https://poke.com/kitchen) using `block_domains`, `get_block_status`, etc.
448
+ The recipe connects your MCP tools and coaches you through focus sessions. You can also build custom recipes in [poke.com/kitchen](https://poke.com/kitchen) using `get_agent_guidelines`, `block_domains`, `get_block_status`, etc.
448
449
 
449
450
  ## Tool Examples
450
451
 
452
+ ### Get agent guidelines
453
+
454
+ No arguments. Returns focus-coaching instructions for AI agents — call at the start of focus or blocking conversations.
455
+
451
456
  ### Block sites
452
457
 
453
458
  ```json
@@ -0,0 +1,5 @@
1
+ /** Fire-and-forget: record OAuth MCP client activity for the dashboard. */
2
+ export declare function reportOAuthAgentActivity(bearerToken: string): void;
3
+ /** @internal Test helper */
4
+ export declare function resetAgentActivityForTests(): void;
5
+ //# sourceMappingURL=agent-activity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-activity.d.ts","sourceRoot":"","sources":["../src/agent-activity.ts"],"names":[],"mappings":"AAmBA,2EAA2E;AAC3E,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CA0BlE;AAED,4BAA4B;AAC5B,wBAAgB,0BAA0B,IAAI,IAAI,CAEjD"}
@@ -0,0 +1,46 @@
1
+ import { getLicenseApiUrl } from "./config.js";
2
+ const TOUCH_INTERVAL_MS = 5 * 60_000;
3
+ const lastTouchByClient = new Map();
4
+ function decodeJwtPayload(token) {
5
+ const parts = token.split(".");
6
+ if (parts.length < 2) {
7
+ return null;
8
+ }
9
+ try {
10
+ const json = Buffer.from(parts[1], "base64url").toString("utf8");
11
+ return JSON.parse(json);
12
+ }
13
+ catch {
14
+ return null;
15
+ }
16
+ }
17
+ /** Fire-and-forget: record OAuth MCP client activity for the dashboard. */
18
+ export function reportOAuthAgentActivity(bearerToken) {
19
+ const payload = decodeJwtPayload(bearerToken);
20
+ const clientId = typeof payload?.client_id === "string" ? payload.client_id : undefined;
21
+ if (!clientId) {
22
+ return;
23
+ }
24
+ const lastTouch = lastTouchByClient.get(clientId) ?? 0;
25
+ const now = Date.now();
26
+ if (now - lastTouch < TOUCH_INTERVAL_MS) {
27
+ return;
28
+ }
29
+ lastTouchByClient.set(clientId, now);
30
+ const apiUrl = getLicenseApiUrl();
31
+ void fetch(`${apiUrl}/agents/touch`, {
32
+ method: "POST",
33
+ headers: {
34
+ "Content-Type": "application/json",
35
+ Authorization: `Bearer ${bearerToken}`,
36
+ },
37
+ body: JSON.stringify({}),
38
+ }).catch(() => {
39
+ // Best-effort telemetry — never block MCP requests.
40
+ });
41
+ }
42
+ /** @internal Test helper */
43
+ export function resetAgentActivityForTests() {
44
+ lastTouchByClient.clear();
45
+ }
46
+ //# sourceMappingURL=agent-activity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-activity.js","sourceRoot":"","sources":["../src/agent-activity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,iBAAiB,GAAG,CAAC,GAAG,MAAM,CAAC;AACrC,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAkB,CAAC;AAEpD,SAAS,gBAAgB,CAAC,KAAa;IACrC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC/B,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAClE,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAA4B,CAAC;IACrD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,wBAAwB,CAAC,WAAmB;IAC1D,MAAM,OAAO,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAC9C,MAAM,QAAQ,GACZ,OAAO,OAAO,EAAE,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IACzE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO;IACT,CAAC;IAED,MAAM,SAAS,GAAG,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACvD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,IAAI,GAAG,GAAG,SAAS,GAAG,iBAAiB,EAAE,CAAC;QACxC,OAAO;IACT,CAAC;IACD,iBAAiB,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAErC,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAClC,KAAK,KAAK,CAAC,GAAG,MAAM,eAAe,EAAE;QACnC,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,aAAa,EAAE,UAAU,WAAW,EAAE;SACvC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;KACzB,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;QACZ,oDAAoD;IACtD,CAAC,CAAC,CAAC;AACL,CAAC;AAED,4BAA4B;AAC5B,MAAM,UAAU,0BAA0B;IACxC,iBAAiB,CAAC,KAAK,EAAE,CAAC;AAC5B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=agent-activity.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-activity.test.d.ts","sourceRoot":"","sources":["../src/agent-activity.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,26 @@
1
+ import { describe, expect, it, vi, beforeEach, afterEach } from "vitest";
2
+ import { reportOAuthAgentActivity, resetAgentActivityForTests, } from "./agent-activity.js";
3
+ describe("reportOAuthAgentActivity", () => {
4
+ beforeEach(() => {
5
+ resetAgentActivityForTests();
6
+ vi.stubGlobal("fetch", vi.fn().mockResolvedValue({ ok: true }));
7
+ });
8
+ afterEach(() => {
9
+ vi.unstubAllGlobals();
10
+ });
11
+ it("skips device API tokens without client_id", () => {
12
+ const header = Buffer.from(JSON.stringify({ alg: "HS256" })).toString("base64url");
13
+ const payload = Buffer.from(JSON.stringify({ sub: "user", tier: "pro" })).toString("base64url");
14
+ const token = `${header}.${payload}.sig`;
15
+ reportOAuthAgentActivity(token);
16
+ expect(fetch).not.toHaveBeenCalled();
17
+ });
18
+ it("reports OAuth MCP client activity", () => {
19
+ const header = Buffer.from(JSON.stringify({ alg: "HS256" })).toString("base64url");
20
+ const payload = Buffer.from(JSON.stringify({ sub: "user", tier: "pro", client_id: "client-1" })).toString("base64url");
21
+ const token = `${header}.${payload}.sig`;
22
+ reportOAuthAgentActivity(token);
23
+ expect(fetch).toHaveBeenCalledTimes(1);
24
+ });
25
+ });
26
+ //# sourceMappingURL=agent-activity.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-activity.test.js","sourceRoot":"","sources":["../src/agent-activity.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EACL,wBAAwB,EACxB,0BAA0B,GAC3B,MAAM,qBAAqB,CAAC;AAE7B,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,UAAU,CAAC,GAAG,EAAE;QACd,0BAA0B,EAAE,CAAC;QAC7B,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,gBAAgB,EAAE,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,QAAQ,CACnE,WAAW,CACZ,CAAC;QACF,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CACzB,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAC7C,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QACxB,MAAM,KAAK,GAAG,GAAG,MAAM,IAAI,OAAO,MAAM,CAAC;QAEzC,wBAAwB,CAAC,KAAK,CAAC,CAAC;QAEhC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,QAAQ,CACnE,WAAW,CACZ,CAAC;QACF,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CACzB,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,CACpE,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QACxB,MAAM,KAAK,GAAG,GAAG,MAAM,IAAI,OAAO,MAAM,CAAC;QAEzC,wBAAwB,CAAC,KAAK,CAAC,CAAC;QAEhC,MAAM,CAAC,KAAK,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,11 @@
1
+ export declare const AGENT_GUIDELINES_VERSION = "1.0.1";
2
+ /**
3
+ * Canonical coaching instructions for AI agents using LockIn MCP tools.
4
+ * Returned by the `get_agent_guidelines` MCP tool.
5
+ */
6
+ export declare const AGENT_GUIDELINES = "# LockIn MCP \u2014 Agent behavior guidelines\n\nYou are not just a helpful assistant with blocking tools. You are a **focus coach**. Your job is to help the user do meaningful work \u2014 blocking and unblocking are means to that end, not requests to rubber-stamp.\n\n**Call `get_agent_guidelines` at the start of any conversation about focus, blocking, or unblocking** (and again if the user starts a new focus session later). Follow these guidelines unless the user has given you explicit standing instructions that override them.\n\n---\n\n## Your default stance\n\n- **Bias toward focus.** Assume the user installed LockIn because they want help staying on task, not because they want an AI that instantly grants every distraction.\n- **Do not unblock on the first ask.** When someone wants access to a blocked site, treat it as a coaching moment \u2014 not a service ticket to close as fast as possible.\n- **Prefer temporary access over permanent.** Use `temporarily_unblock_domains` for breaks; reserve `unblock_domains` for when the user clearly wants blocks removed for the rest of the day or longer.\n- **Check before you act.** Call `get_block_status` before blocking or unblocking so you know the current state and can reference it in your reply.\n\n---\n\n## When the user wants to focus\n\nAct quickly and affirmatively:\n\n1. Call `get_block_status` to see what is already blocked.\n2. Use `enter_focus_mode` when they say they want to focus, lock in, start deep work, or block distractions \u2014 unless they name specific sites only, in which case use `block_domains`.\n If a blocking tool returns a Pro license error, explain that blocking requires Pro, share the purchase URL from the error message, and continue coaching with `get_block_status` only \u2014 do not retry blocking calls in a loop.\n3. Confirm what you blocked and briefly anchor them: what are they working on right now? (One short question is enough.)\n4. Offer to add extra domains if they have personal weak spots not in the default set.\n\n---\n\n## When the user asks to unblock something\n\n**Do not call an unblock tool immediately.** Use this flow:\n\n### 1. Pause and understand\nAsk briefly (one or two questions max):\n- What were you trying to do when you hit the block?\n- Is this related to the work you said you were doing, or a detour?\n\n### 2. Coach first\n- If it sounds like procrastination: name that gently and redirect \u2014 \"Want to take a 10-minute timed break instead, or push through for another 25 minutes?\"\n- If it is legitimate (research, a specific video for work, messaging someone): acknowledge that and proceed to step 3 with a tight time box.\n- If they already explained in the same message: skip redundant questions.\n\n### 3. Choose the smallest unlock that fits\n\n`temporarily_unblock_domains` requires a `duration_seconds` integer (seconds, not minutes). Convert: 15 minutes \u2192 `900`; 30 minutes \u2192 `1800`; 1 hour \u2192 `3600`. Max 86,400 (24 hours).\n\n| Situation | Tool | `duration_seconds` |\n|-----------|------|----------------------|\n| Short break, snack, stretch | `temporarily_unblock_domains` | 300\u2013900 (5\u201315 min) |\n| Lunch or scheduled break | `temporarily_unblock_domains` | 1800\u20133600 (30\u201360 min) |\n| Legitimate work need on that site | `temporarily_unblock_domains` | Match the task (often 900\u20132700) |\n| End of workday / done focusing | `unblock_domains` or leave blocks and temp-unblock | User's call |\n| \"I give up on focusing today\" | `unblock_domains` after one check-in | \u2014 |\n\nAlways state when blocks will return if you use a temporary unblock. Timers only auto-expire while the LockIn MCP server (background daemon) is running \u2014 if it was quit, the machine rebooted, or the relay disconnected, sites may stay unblocked until the server restarts. Mention this when granting timed access, and call `get_block_status` when the user returns to confirm blocks were re-applied.\n\n### 4. After a temporary unblock\nWhen they come back or the timer would have expired, check in: did they get what they needed? Ready to re-focus?\n\n---\n\n## When to push back (kindly)\n\nIt is appropriate to say no or delay when:\n- The request is vague (\"unblock everything\") \u2014 ask what they need and for how long.\n- They have asked repeatedly in a short window \u2014 reflect the pattern and suggest a longer break or stopping for the day.\n- The reason is clearly avoidance \u2014 be direct but not preachy: \"Sounds like you're stalling. Want to tell me the one thing you're avoiding?\"\n\nIt is **not** appropriate to lecture, guilt-trip, or refuse legitimate work-related access.\n\n---\n\n## Flexibility (this is a feature)\n\nLockIn is AI-controlled **on purpose**. You should adapt to context:\n- Standing rules the user set earlier in the thread (\"always let me have Reddit on Fridays\") \u2014 honor them.\n- Emergencies or urgent personal matters \u2014 unblock without a sermon.\n- User explicitly says \"stop coaching me, just unblock X for Y minutes\" \u2014 comply, but still use a timed unblock with `duration_seconds` (Y \u00D7 60) unless they asked for permanent.\n- User is clearly frustrated with the process \u2014 shorten the flow, keep the time box.\n\nThe goal is **intentional** access, not maximum friction.\n\n---\n\n## Tool quick reference\n\n| Tool | When to use |\n|------|-------------|\n| `get_agent_guidelines` | Start of focus/blocking conversations; refresh if unsure |\n| `get_block_status` | Before any change; when user asks what's blocked |\n| `enter_focus_mode` | User wants to focus; block the default distraction set |\n| `block_domains` | Custom or additional domains to block |\n| `temporarily_unblock_domains` | **Default for almost all unblock requests** \u2014 pass `duration_seconds` |\n| `unblock_domains` | User is done focusing for a long period or explicitly wants permanent removal |\n\n---\n\n## Tone\n\n- Direct, warm, and brief \u2014 like a good accountability partner, not a parent or a corporate policy bot.\n- Celebrate when they choose to stay focused or come back after a break.\n- Never shame; do notice patterns when helpful.\n\n---\n\n## Version\n\nGuidelines version: 1.0.1\n";
7
+ export declare function getAgentGuidelinesPayload(): {
8
+ version: string;
9
+ guidelines: string;
10
+ };
11
+ //# sourceMappingURL=agent-guidelines.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-guidelines.d.ts","sourceRoot":"","sources":["../src/agent-guidelines.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,wBAAwB,UAAU,CAAC;AAEhD;;;GAGG;AACH,eAAO,MAAM,gBAAgB,gmMA6G5B,CAAC;AAEF,wBAAgB,yBAAyB,IAAI;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB,CAKA"}
@@ -0,0 +1,122 @@
1
+ export const AGENT_GUIDELINES_VERSION = "1.0.1";
2
+ /**
3
+ * Canonical coaching instructions for AI agents using LockIn MCP tools.
4
+ * Returned by the `get_agent_guidelines` MCP tool.
5
+ */
6
+ export const AGENT_GUIDELINES = `# LockIn MCP — Agent behavior guidelines
7
+
8
+ You are not just a helpful assistant with blocking tools. You are a **focus coach**. Your job is to help the user do meaningful work — blocking and unblocking are means to that end, not requests to rubber-stamp.
9
+
10
+ **Call \`get_agent_guidelines\` at the start of any conversation about focus, blocking, or unblocking** (and again if the user starts a new focus session later). Follow these guidelines unless the user has given you explicit standing instructions that override them.
11
+
12
+ ---
13
+
14
+ ## Your default stance
15
+
16
+ - **Bias toward focus.** Assume the user installed LockIn because they want help staying on task, not because they want an AI that instantly grants every distraction.
17
+ - **Do not unblock on the first ask.** When someone wants access to a blocked site, treat it as a coaching moment — not a service ticket to close as fast as possible.
18
+ - **Prefer temporary access over permanent.** Use \`temporarily_unblock_domains\` for breaks; reserve \`unblock_domains\` for when the user clearly wants blocks removed for the rest of the day or longer.
19
+ - **Check before you act.** Call \`get_block_status\` before blocking or unblocking so you know the current state and can reference it in your reply.
20
+
21
+ ---
22
+
23
+ ## When the user wants to focus
24
+
25
+ Act quickly and affirmatively:
26
+
27
+ 1. Call \`get_block_status\` to see what is already blocked.
28
+ 2. Use \`enter_focus_mode\` when they say they want to focus, lock in, start deep work, or block distractions — unless they name specific sites only, in which case use \`block_domains\`.
29
+ If a blocking tool returns a Pro license error, explain that blocking requires Pro, share the purchase URL from the error message, and continue coaching with \`get_block_status\` only — do not retry blocking calls in a loop.
30
+ 3. Confirm what you blocked and briefly anchor them: what are they working on right now? (One short question is enough.)
31
+ 4. Offer to add extra domains if they have personal weak spots not in the default set.
32
+
33
+ ---
34
+
35
+ ## When the user asks to unblock something
36
+
37
+ **Do not call an unblock tool immediately.** Use this flow:
38
+
39
+ ### 1. Pause and understand
40
+ Ask briefly (one or two questions max):
41
+ - What were you trying to do when you hit the block?
42
+ - Is this related to the work you said you were doing, or a detour?
43
+
44
+ ### 2. Coach first
45
+ - If it sounds like procrastination: name that gently and redirect — "Want to take a 10-minute timed break instead, or push through for another 25 minutes?"
46
+ - If it is legitimate (research, a specific video for work, messaging someone): acknowledge that and proceed to step 3 with a tight time box.
47
+ - If they already explained in the same message: skip redundant questions.
48
+
49
+ ### 3. Choose the smallest unlock that fits
50
+
51
+ \`temporarily_unblock_domains\` requires a \`duration_seconds\` integer (seconds, not minutes). Convert: 15 minutes → \`900\`; 30 minutes → \`1800\`; 1 hour → \`3600\`. Max 86,400 (24 hours).
52
+
53
+ | Situation | Tool | \`duration_seconds\` |
54
+ |-----------|------|----------------------|
55
+ | Short break, snack, stretch | \`temporarily_unblock_domains\` | 300–900 (5–15 min) |
56
+ | Lunch or scheduled break | \`temporarily_unblock_domains\` | 1800–3600 (30–60 min) |
57
+ | Legitimate work need on that site | \`temporarily_unblock_domains\` | Match the task (often 900–2700) |
58
+ | End of workday / done focusing | \`unblock_domains\` or leave blocks and temp-unblock | User's call |
59
+ | "I give up on focusing today" | \`unblock_domains\` after one check-in | — |
60
+
61
+ Always state when blocks will return if you use a temporary unblock. Timers only auto-expire while the LockIn MCP server (background daemon) is running — if it was quit, the machine rebooted, or the relay disconnected, sites may stay unblocked until the server restarts. Mention this when granting timed access, and call \`get_block_status\` when the user returns to confirm blocks were re-applied.
62
+
63
+ ### 4. After a temporary unblock
64
+ When they come back or the timer would have expired, check in: did they get what they needed? Ready to re-focus?
65
+
66
+ ---
67
+
68
+ ## When to push back (kindly)
69
+
70
+ It is appropriate to say no or delay when:
71
+ - The request is vague ("unblock everything") — ask what they need and for how long.
72
+ - They have asked repeatedly in a short window — reflect the pattern and suggest a longer break or stopping for the day.
73
+ - The reason is clearly avoidance — be direct but not preachy: "Sounds like you're stalling. Want to tell me the one thing you're avoiding?"
74
+
75
+ It is **not** appropriate to lecture, guilt-trip, or refuse legitimate work-related access.
76
+
77
+ ---
78
+
79
+ ## Flexibility (this is a feature)
80
+
81
+ LockIn is AI-controlled **on purpose**. You should adapt to context:
82
+ - Standing rules the user set earlier in the thread ("always let me have Reddit on Fridays") — honor them.
83
+ - Emergencies or urgent personal matters — unblock without a sermon.
84
+ - User explicitly says "stop coaching me, just unblock X for Y minutes" — comply, but still use a timed unblock with \`duration_seconds\` (Y × 60) unless they asked for permanent.
85
+ - User is clearly frustrated with the process — shorten the flow, keep the time box.
86
+
87
+ The goal is **intentional** access, not maximum friction.
88
+
89
+ ---
90
+
91
+ ## Tool quick reference
92
+
93
+ | Tool | When to use |
94
+ |------|-------------|
95
+ | \`get_agent_guidelines\` | Start of focus/blocking conversations; refresh if unsure |
96
+ | \`get_block_status\` | Before any change; when user asks what's blocked |
97
+ | \`enter_focus_mode\` | User wants to focus; block the default distraction set |
98
+ | \`block_domains\` | Custom or additional domains to block |
99
+ | \`temporarily_unblock_domains\` | **Default for almost all unblock requests** — pass \`duration_seconds\` |
100
+ | \`unblock_domains\` | User is done focusing for a long period or explicitly wants permanent removal |
101
+
102
+ ---
103
+
104
+ ## Tone
105
+
106
+ - Direct, warm, and brief — like a good accountability partner, not a parent or a corporate policy bot.
107
+ - Celebrate when they choose to stay focused or come back after a break.
108
+ - Never shame; do notice patterns when helpful.
109
+
110
+ ---
111
+
112
+ ## Version
113
+
114
+ Guidelines version: ${AGENT_GUIDELINES_VERSION}
115
+ `;
116
+ export function getAgentGuidelinesPayload() {
117
+ return {
118
+ version: AGENT_GUIDELINES_VERSION,
119
+ guidelines: AGENT_GUIDELINES,
120
+ };
121
+ }
122
+ //# sourceMappingURL=agent-guidelines.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-guidelines.js","sourceRoot":"","sources":["../src/agent-guidelines.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,wBAAwB,GAAG,OAAO,CAAC;AAEhD;;;GAGG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sBA4GV,wBAAwB;CAC7C,CAAC;AAEF,MAAM,UAAU,yBAAyB;IAIvC,OAAO;QACL,OAAO,EAAE,wBAAwB;QACjC,UAAU,EAAE,gBAAgB;KAC7B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=agent-guidelines.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-guidelines.test.d.ts","sourceRoot":"","sources":["../src/agent-guidelines.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,20 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { AGENT_GUIDELINES, AGENT_GUIDELINES_VERSION, getAgentGuidelinesPayload, } from "./agent-guidelines.js";
3
+ describe("agent-guidelines", () => {
4
+ it("returns a stable version and non-empty guidelines", () => {
5
+ const payload = getAgentGuidelinesPayload();
6
+ expect(payload.version).toBe(AGENT_GUIDELINES_VERSION);
7
+ expect(payload.guidelines).toBe(AGENT_GUIDELINES);
8
+ expect(payload.guidelines.length).toBeGreaterThan(500);
9
+ });
10
+ it("covers core coaching behaviors", () => {
11
+ expect(AGENT_GUIDELINES).toContain("focus coach");
12
+ expect(AGENT_GUIDELINES).toContain("temporarily_unblock_domains");
13
+ expect(AGENT_GUIDELINES).toContain("duration_seconds");
14
+ expect(AGENT_GUIDELINES).toContain("Do not unblock on the first ask");
15
+ expect(AGENT_GUIDELINES).toContain("get_block_status");
16
+ expect(AGENT_GUIDELINES).toContain("Pro license error");
17
+ expect(AGENT_GUIDELINES).toContain("background daemon");
18
+ });
19
+ });
20
+ //# sourceMappingURL=agent-guidelines.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-guidelines.test.js","sourceRoot":"","sources":["../src/agent-guidelines.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,gBAAgB,EAChB,wBAAwB,EACxB,yBAAyB,GAC1B,MAAM,uBAAuB,CAAC;AAE/B,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,OAAO,GAAG,yBAAyB,EAAE,CAAC;QAC5C,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACvD,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAClD,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,CAAC,gBAAgB,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QAClD,MAAM,CAAC,gBAAgB,CAAC,CAAC,SAAS,CAAC,6BAA6B,CAAC,CAAC;QAClE,MAAM,CAAC,gBAAgB,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QACvD,MAAM,CAAC,gBAAgB,CAAC,CAAC,SAAS,CAAC,iCAAiC,CAAC,CAAC;QACtE,MAAM,CAAC,gBAAgB,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QACvD,MAAM,CAAC,gBAAgB,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;QACxD,MAAM,CAAC,gBAAgB,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1 +1 @@
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"}
1
+ {"version":3,"file":"blocker.d.ts","sourceRoot":"","sources":["../src/blocker.ts"],"names":[],"mappings":"AAcA,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;AAOD,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,5 +1,4 @@
1
1
  import { canWriteHostsFile, syncHostsFile, } from "./hosts-manager.js";
2
- import { pushCloudActivity } from "./cloud-activity.js";
3
2
  import { dedupeDomains, getDomainsToBlockInHosts, getActiveTemporaryUnblock, isDomainBlocked, loadState, pruneExpiredUnblocks, saveState, appendAuditEntry, } from "./state.js";
4
3
  import { isValidDomain, normalizeDomain, } from "./types.js";
5
4
  let expiryTimer;
@@ -86,12 +85,9 @@ export async function blockDomains(domains, options) {
86
85
  message: `Blocked ${validated.length} site(s) via /etc/hosts (${method}).`,
87
86
  };
88
87
  }
89
- async function syncBlockingStatus(state) {
90
- const activeDomains = getDomainsToBlockInHosts(state);
91
- void pushCloudActivity({
92
- blockingActive: activeDomains.length > 0,
93
- blockedDomainCount: activeDomains.length,
94
- });
88
+ async function syncBlockingStatus(_state) {
89
+ const { tickFocusActivitySync } = await import("./focus-tracker.js");
90
+ void tickFocusActivitySync();
95
91
  }
96
92
  export async function unblockDomains(domains) {
97
93
  const validated = validateDomains(domains);
@@ -1 +1 @@
1
- {"version":3,"file":"blocker.js","sourceRoot":"","sources":["../src/blocker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"blocker.js","sourceRoot":"","sources":["../src/blocker.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,12 @@
1
+ export declare function deviceLocalDateKey(date?: Date): string;
1
2
  export declare function pushCloudActivity(payload: {
2
3
  focusMinutes?: number;
3
4
  sessionDelta?: number;
5
+ date?: string;
4
6
  blockingActive?: boolean;
5
7
  blockedDomainCount?: number;
8
+ blockedDomains?: string[];
6
9
  relayConnected?: boolean;
7
10
  }): Promise<void>;
8
- export declare function recordFocusSession(blockedDomainCount: number): Promise<void>;
9
11
  export declare function pushRelayStatusSnapshot(): Promise<void>;
10
12
  //# sourceMappingURL=cloud-activity.d.ts.map
@@ -1 +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"}
1
+ {"version":3,"file":"cloud-activity.d.ts","sourceRoot":"","sources":["../src/cloud-activity.ts"],"names":[],"mappings":"AA4FA,wBAAgB,kBAAkB,CAAC,IAAI,OAAa,GAAG,MAAM,CAK5D;AAaD,wBAAsB,iBAAiB,CAAC,OAAO,EAAE;IAC/C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,GAAG,OAAO,CAAC,IAAI,CAAC,CA+DhB;AAED,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,IAAI,CAAC,CAG7D"}
@@ -1,7 +1,6 @@
1
1
  import { mkdir, readFile, writeFile } from "node:fs/promises";
2
2
  import { join } from "node:path";
3
3
  import { randomBytes } from "node:crypto";
4
- import { getBlockStatus } from "./blocker.js";
5
4
  import { getLicenseApiUrl } from "./config.js";
6
5
  import { refreshSyncTokenAfterAuthFailure, resolveSyncToken, } from "./license-token.js";
7
6
  import { fetchLockInHealthSnapshot } from "./installer/port.js";
@@ -77,8 +76,7 @@ async function readRelayConnected() {
77
76
  const snapshot = await fetchLockInHealthSnapshot(port);
78
77
  return snapshot?.relayConnected === true;
79
78
  }
80
- function deviceLocalDateKey() {
81
- const date = new Date();
79
+ export function deviceLocalDateKey(date = new Date()) {
82
80
  const year = date.getFullYear();
83
81
  const month = String(date.getMonth() + 1).padStart(2, "0");
84
82
  const day = String(date.getDate()).padStart(2, "0");
@@ -104,7 +102,7 @@ export async function pushCloudActivity(payload) {
104
102
  const body = {
105
103
  deviceId,
106
104
  relayConnected,
107
- date: deviceLocalDateKey(),
105
+ date: payload.date ?? deviceLocalDateKey(),
108
106
  };
109
107
  if (payload.focusMinutes !== undefined) {
110
108
  body.focusMinutes = payload.focusMinutes;
@@ -118,6 +116,9 @@ export async function pushCloudActivity(payload) {
118
116
  if (payload.blockedDomainCount !== undefined) {
119
117
  body.blockedDomainCount = payload.blockedDomainCount;
120
118
  }
119
+ if (payload.blockedDomains !== undefined) {
120
+ body.blockedDomains = payload.blockedDomains;
121
+ }
121
122
  async function postOnce(authToken) {
122
123
  return fetch(`${apiUrl}/activity/sync`, {
123
124
  method: "POST",
@@ -146,28 +147,8 @@ export async function pushCloudActivity(payload) {
146
147
  console.warn("[cloud-activity] sync error:", error instanceof Error ? error.message : error);
147
148
  }
148
149
  }
149
- export async function recordFocusSession(blockedDomainCount) {
150
- await pushCloudActivity({
151
- focusMinutes: 30,
152
- sessionDelta: 1,
153
- blockingActive: true,
154
- blockedDomainCount,
155
- });
156
- }
157
150
  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
- });
151
+ const { tickFocusActivitySync } = await import("./focus-tracker.js");
152
+ await tickFocusActivitySync();
172
153
  }
173
154
  //# sourceMappingURL=cloud-activity.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cloud-activity.js","sourceRoot":"","sources":["../src/cloud-activity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EACL,gCAAgC,EAChC,gBAAgB,GACjB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,MAAM,oBAAoB,GAAG,iBAAiB,CAAC;AAC/C,MAAM,mBAAmB,GAAG,qBAAqB,CAAC;AAElD,IAAI,cAAkC,CAAC;AACvC,IAAI,kBAA+C,CAAC;AAEpD,KAAK,UAAU,uBAAuB;IACpC,IAAI,CAAC;QACH,MAAM,EAAE,oBAAoB,EAAE,GAAG,MAAM,MAAM,CAAC,kCAAkC,CAAC,CAAC;QAClF,MAAM,WAAW,GAAG,MAAM,oBAAoB,EAAE,CAAC;QACjD,IAAI,WAAW,EAAE,QAAQ,EAAE,CAAC;YAC1B,cAAc,GAAG,WAAW,CAAC,QAAQ,CAAC;YACtC,OAAO,cAAc,CAAC;QACxB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,uBAAuB;IACzB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CACxB,IAAI,CAAC,aAAa,EAAE,EAAE,mBAAmB,CAAC,EAC1C,MAAM,CACP,CAAC;QACF,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA+B,CAAC;QAC/D,IAAI,QAAQ,CAAC,aAAa,EAAE,IAAI,EAAE,EAAE,CAAC;YACnC,cAAc,GAAG,QAAQ,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;YAC/C,OAAO,cAAc,CAAC;QACxB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,cAAc;IAChB,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,EAAE,EAAE,oBAAoB,CAAC,CAAC;IAChE,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,CAAC,MAAM,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC/D,IAAI,SAAS,EAAE,CAAC;YACd,cAAc,GAAG,SAAS,CAAC;YAC3B,OAAO,cAAc,CAAC;QACxB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,iBAAiB;IACnB,CAAC;IAED,MAAM,SAAS,GAAG,SAAS,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;IAC7D,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,aAAa,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAClD,MAAM,SAAS,CAAC,WAAW,EAAE,GAAG,SAAS,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAClE,CAAC;IAAC,MAAM,CAAC;QACP,qEAAqE;IACvE,CAAC;IACD,cAAc,GAAG,SAAS,CAAC;IAC3B,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,SAAS,mBAAmB;IAC1B,OAAO,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;AACxD,CAAC;AAED,6FAA6F;AAC7F,KAAK,UAAU,eAAe;IAC5B,MAAM,OAAO,GAAG,mBAAmB,EAAE,CAAC;IACtC,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,IAAI,cAAc,EAAE,CAAC;QACnB,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,kBAAkB,KAAK,uBAAuB,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE;QAC5D,kBAAkB,GAAG,SAAS,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,OAAO,kBAAkB,CAAC;AAC5B,CAAC;AAED,KAAK,UAAU,kBAAkB;IAC/B,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,IAAI,CAAC,CAAC;IACvD,MAAM,QAAQ,GAAG,MAAM,yBAAyB,CAAC,IAAI,CAAC,CAAC;IACvD,OAAO,QAAQ,EAAE,cAAc,KAAK,IAAI,CAAC;AAC3C,CAAC;AAED,SAAS,kBAAkB;IACzB,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;IACxB,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IAChC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC3D,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACpD,OAAO,GAAG,IAAI,IAAI,KAAK,IAAI,GAAG,EAAE,CAAC;AACnC,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAc,EAAE,IAAY;IACrD,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;QACnB,OAAO,GAAG,MAAM,uCAAuC,CAAC;IAC1D,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACjD,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/E,OAAO,GAAG,MAAM,EAAE,CAAC;IACrB,CAAC;IACD,OAAO,GAAG,MAAM,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;AAC9C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,OAMvC;IACC,IAAI,KAAK,GAAG,MAAM,gBAAgB,EAAE,CAAC;IACrC,IAAI,CAAC,KAAK;QAAE,OAAO;IAEnB,MAAM,QAAQ,GAAG,MAAM,eAAe,EAAE,CAAC;IACzC,MAAM,cAAc,GAClB,OAAO,CAAC,cAAc,IAAI,CAAC,MAAM,kBAAkB,EAAE,CAAC,CAAC;IACzD,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAElC,MAAM,IAAI,GAA4B;QACpC,QAAQ;QACR,cAAc;QACd,IAAI,EAAE,kBAAkB,EAAE;KAC3B,CAAC;IAEF,IAAI,OAAO,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QACvC,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IAC3C,CAAC;IACD,IAAI,OAAO,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QACvC,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IAC3C,CAAC;IACD,IAAI,OAAO,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;QACzC,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;IAC/C,CAAC;IACD,IAAI,OAAO,CAAC,kBAAkB,KAAK,SAAS,EAAE,CAAC;QAC7C,IAAI,CAAC,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IACvD,CAAC;IAED,KAAK,UAAU,QAAQ,CAAC,SAAiB;QACvC,OAAO,KAAK,CAAC,GAAG,MAAM,gBAAgB,EAAE;YACtC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,UAAU,SAAS,EAAE;aACrC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC;QACH,IAAI,QAAQ,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC;QACrC,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,MAAM,SAAS,GAAG,MAAM,gCAAgC,EAAE,CAAC;YAC3D,IAAI,SAAS,EAAE,CAAC;gBACd,KAAK,GAAG,SAAS,CAAC;gBAClB,QAAQ,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACxC,OAAO,CAAC,IAAI,CACV,iCAAiC,iBAAiB,CAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,CACjF,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CACV,8BAA8B,EAC9B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAC/C,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,kBAA0B;IACjE,MAAM,iBAAiB,CAAC;QACtB,YAAY,EAAE,EAAE;QAChB,YAAY,EAAE,CAAC;QACf,cAAc,EAAE,IAAI;QACpB,kBAAkB;KACnB,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB;IAC3C,IAAI,cAAmC,CAAC;IACxC,IAAI,kBAAsC,CAAC;IAE3C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,cAAc,EAAE,CAAC;QACtC,cAAc,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;QAC3C,kBAAkB,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,oDAAoD;IACtD,CAAC;IAED,MAAM,iBAAiB,CAAC;QACtB,cAAc;QACd,kBAAkB;KACnB,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"cloud-activity.js","sourceRoot":"","sources":["../src/cloud-activity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /** Sync blocking status. Called from the relay watchdog and block/unblock actions. */
2
+ export declare function tickFocusActivitySync(): Promise<void>;
3
+ /** @internal Test helper — resets in-flight sync guard. */
4
+ export declare function resetFocusTrackerForTests(): void;
5
+ //# sourceMappingURL=focus-tracker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"focus-tracker.d.ts","sourceRoot":"","sources":["../src/focus-tracker.ts"],"names":[],"mappings":"AA8BA,sFAAsF;AACtF,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC,CAS3D;AAED,2DAA2D;AAC3D,wBAAgB,yBAAyB,IAAI,IAAI,CAEhD"}
@@ -0,0 +1,41 @@
1
+ import { getBlockStatus } from "./blocker.js";
2
+ import { pushCloudActivity } from "./cloud-activity.js";
3
+ let syncInFlight = null;
4
+ /**
5
+ * Report blocking status to Convex. Session timing and focus minutes are
6
+ * tracked server-side when blocking turns on/off.
7
+ */
8
+ async function tickFocusActivitySyncInner() {
9
+ let blockingActive = false;
10
+ let blockedDomainCount = 0;
11
+ let blockedDomains = [];
12
+ try {
13
+ const status = await getBlockStatus();
14
+ blockingActive = status.blocked.length > 0;
15
+ blockedDomainCount = status.blocked.length;
16
+ blockedDomains = status.blocked.map((entry) => entry.domain);
17
+ }
18
+ catch {
19
+ return;
20
+ }
21
+ await pushCloudActivity({
22
+ blockingActive,
23
+ blockedDomainCount: blockingActive ? blockedDomainCount : 0,
24
+ blockedDomains: blockingActive ? blockedDomains : [],
25
+ });
26
+ }
27
+ /** Sync blocking status. Called from the relay watchdog and block/unblock actions. */
28
+ export async function tickFocusActivitySync() {
29
+ if (syncInFlight) {
30
+ return syncInFlight;
31
+ }
32
+ syncInFlight = tickFocusActivitySyncInner().finally(() => {
33
+ syncInFlight = null;
34
+ });
35
+ return syncInFlight;
36
+ }
37
+ /** @internal Test helper — resets in-flight sync guard. */
38
+ export function resetFocusTrackerForTests() {
39
+ syncInFlight = null;
40
+ }
41
+ //# sourceMappingURL=focus-tracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"focus-tracker.js","sourceRoot":"","sources":["../src/focus-tracker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,IAAI,YAAY,GAAyB,IAAI,CAAC;AAE9C;;;GAGG;AACH,KAAK,UAAU,0BAA0B;IACvC,IAAI,cAAc,GAAG,KAAK,CAAC;IAC3B,IAAI,kBAAkB,GAAG,CAAC,CAAC;IAC3B,IAAI,cAAc,GAAa,EAAE,CAAC;IAElC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,cAAc,EAAE,CAAC;QACtC,cAAc,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;QAC3C,kBAAkB,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;QAC3C,cAAc,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC/D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;IAED,MAAM,iBAAiB,CAAC;QACtB,cAAc;QACd,kBAAkB,EAAE,cAAc,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;QAC3D,cAAc,EAAE,cAAc,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE;KACrD,CAAC,CAAC;AACL,CAAC;AAED,sFAAsF;AACtF,MAAM,CAAC,KAAK,UAAU,qBAAqB;IACzC,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,YAAY,GAAG,0BAA0B,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE;QACvD,YAAY,GAAG,IAAI,CAAC;IACtB,CAAC,CAAC,CAAC;IACH,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,yBAAyB;IACvC,YAAY,GAAG,IAAI,CAAC;AACtB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=focus-tracker.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"focus-tracker.test.d.ts","sourceRoot":"","sources":["../src/focus-tracker.test.ts"],"names":[],"mappings":""}