chat-recall 0.5.5 → 0.5.7

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 (90) hide show
  1. package/README.md +332 -0
  2. package/dist/cli.js +11473 -8310
  3. package/dist/cli.js.map +1 -1
  4. package/dist/code-index-cursor.d.ts +18 -0
  5. package/dist/code-index-cursor.d.ts.map +1 -0
  6. package/dist/code-index-cursor.js +89 -0
  7. package/dist/code-index-cursor.js.map +1 -0
  8. package/dist/daemon-log.d.ts +44 -0
  9. package/dist/daemon-log.d.ts.map +1 -0
  10. package/dist/daemon-log.js +74 -0
  11. package/dist/daemon-log.js.map +1 -0
  12. package/dist/derived.d.ts +20 -0
  13. package/dist/derived.d.ts.map +1 -0
  14. package/dist/derived.js +106 -0
  15. package/dist/derived.js.map +1 -0
  16. package/dist/install-skills.d.ts.map +1 -1
  17. package/dist/install-skills.js +6 -1
  18. package/dist/install-skills.js.map +1 -1
  19. package/dist/log-rotate.d.ts +16 -0
  20. package/dist/log-rotate.d.ts.map +1 -0
  21. package/dist/log-rotate.js +50 -0
  22. package/dist/log-rotate.js.map +1 -0
  23. package/dist/mcp-diagnostics.d.ts.map +1 -1
  24. package/dist/mcp-diagnostics.js +10 -8
  25. package/dist/mcp-diagnostics.js.map +1 -1
  26. package/dist/mcp.d.ts.map +1 -1
  27. package/dist/mcp.js +5763 -3045
  28. package/dist/mcp.js.map +1 -1
  29. package/dist/project-tasks.d.ts.map +1 -1
  30. package/dist/project-tasks.js +13 -8
  31. package/dist/project-tasks.js.map +1 -1
  32. package/dist/redact-deep.d.ts +4 -0
  33. package/dist/redact-deep.d.ts.map +1 -0
  34. package/dist/redact-deep.js +26 -0
  35. package/dist/redact-deep.js.map +1 -0
  36. package/dist/scan-pool.d.ts +56 -0
  37. package/dist/scan-pool.d.ts.map +1 -0
  38. package/dist/scan-pool.js +245 -0
  39. package/dist/scan-pool.js.map +1 -0
  40. package/dist/scan-worker.d.ts +78 -0
  41. package/dist/scan-worker.d.ts.map +1 -0
  42. package/dist/scan-worker.js +11175 -0
  43. package/dist/scan-worker.js.map +1 -0
  44. package/dist/self-restart.d.ts +20 -2
  45. package/dist/self-restart.d.ts.map +1 -1
  46. package/dist/self-restart.js +16 -6
  47. package/dist/self-restart.js.map +1 -1
  48. package/dist/server-probe.d.ts +76 -0
  49. package/dist/server-probe.d.ts.map +1 -0
  50. package/dist/server-probe.js +106 -0
  51. package/dist/server-probe.js.map +1 -0
  52. package/dist/service-installer.d.ts +1 -1
  53. package/dist/service-installer.d.ts.map +1 -1
  54. package/dist/service-installer.js +20 -6
  55. package/dist/service-installer.js.map +1 -1
  56. package/dist/sync-client.d.ts +25 -0
  57. package/dist/sync-client.d.ts.map +1 -1
  58. package/dist/sync-client.js +590 -176
  59. package/dist/sync-client.js.map +1 -1
  60. package/dist/sync-ledger.d.ts +22 -0
  61. package/dist/sync-ledger.d.ts.map +1 -1
  62. package/dist/sync-ledger.js +108 -1
  63. package/dist/sync-ledger.js.map +1 -1
  64. package/dist/target-breaker.d.ts +61 -0
  65. package/dist/target-breaker.d.ts.map +1 -0
  66. package/dist/target-breaker.js +85 -0
  67. package/dist/target-breaker.js.map +1 -0
  68. package/dist/telemetry-consent.d.ts +31 -0
  69. package/dist/telemetry-consent.d.ts.map +1 -0
  70. package/dist/telemetry-consent.js +115 -0
  71. package/dist/telemetry-consent.js.map +1 -0
  72. package/dist/telemetry.d.ts +22 -0
  73. package/dist/telemetry.d.ts.map +1 -0
  74. package/dist/telemetry.js +125 -0
  75. package/dist/telemetry.js.map +1 -0
  76. package/dist/tick-queue.d.ts +67 -0
  77. package/dist/tick-queue.d.ts.map +1 -0
  78. package/dist/tick-queue.js +104 -0
  79. package/dist/tick-queue.js.map +1 -0
  80. package/dist/transport-safety.d.ts +43 -0
  81. package/dist/transport-safety.d.ts.map +1 -0
  82. package/dist/transport-safety.js +100 -0
  83. package/dist/transport-safety.js.map +1 -0
  84. package/dist/verify-repair.js +1 -1
  85. package/dist/verify-repair.js.map +1 -1
  86. package/dist/watch.js +8887 -6028
  87. package/hooks/chat_recall_escalate_hook.sh +28 -2
  88. package/hooks/chat_recall_save_hook.sh +17 -11
  89. package/hooks/chat_recall_wakeup_hook.sh +27 -1
  90. package/package.json +27 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tick-queue.js","sourceRoot":"","sources":["../src/tick-queue.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Refuse to ship a transcript over a connection anyone can read.
3
+ *
4
+ * ── The hole this closes ─────────────────────────────────────────────────
5
+ * TLS to the hosted service was never in doubt — valid cert, HSTS for a year,
6
+ * plain HTTP redirected. But NOTHING in the collector required it. A user who
7
+ * typed `chat-recall login http://recall.mycompany.com` got exactly what they
8
+ * asked for: every transcript on the machine, in cleartext, over the open
9
+ * internet, with no warning at any point. `isLocalHost()` existed to relax
10
+ * upload pacing for LAN targets, not to gate the scheme, so a public host over
11
+ * plain HTTP passed every check.
12
+ *
13
+ * The payload makes this worse than a generic cleartext warning deserves. A sync
14
+ * body carries whole transcripts: source code, file paths, and — despite
15
+ * client-side redaction being good — whatever the detectors did not recognise as
16
+ * a secret. This is the single highest-value thing the product ever puts on a
17
+ * wire.
18
+ *
19
+ * ── Where the line is ────────────────────────────────────────────────────
20
+ * Plain HTTP is fine to a host only YOU can reach, and that is the whole
21
+ * exception. Loopback, mDNS/`.lan` names, RFC1918, IPv6 loopback and ULA, and
22
+ * the CGNAT range Tailscale hands out — a self-hoster on any of those has no
23
+ * public path to intercept. Everything else needs TLS.
24
+ *
25
+ * `CHAT_RECALL_ALLOW_INSECURE_HTTP=1` overrides it, for the real case this
26
+ * would otherwise break: a corporate host reached through a VPN whose name and
27
+ * address both look public. That is a deliberate, per-machine decision, which is
28
+ * exactly the bar an override like this should meet.
29
+ */
30
+ /** Hosts only reachable from the user's own machine or network. */
31
+ export declare function isPrivateHost(serverUrl: string): boolean;
32
+ /** Explicit, per-machine opt-out for a VPN-reached host that looks public. */
33
+ export declare function insecureHttpAllowed(env?: NodeJS.ProcessEnv): boolean;
34
+ /**
35
+ * Why this target must not be used, or null when it is safe.
36
+ *
37
+ * Pure, so both the login gate and the sync-time gate can share one rule and a
38
+ * test can pin it without a network.
39
+ */
40
+ export declare function transportRisk(serverUrl: string, env?: NodeJS.ProcessEnv): string | null;
41
+ /** Throwing form, for the login path. */
42
+ export declare function assertTransportSafe(serverUrl: string, env?: NodeJS.ProcessEnv): void;
43
+ //# sourceMappingURL=transport-safety.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport-safety.d.ts","sourceRoot":"","sources":["../src/transport-safety.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,mEAAmE;AACnE,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAgBxD;AAED,8EAA8E;AAC9E,wBAAgB,mBAAmB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAGjF;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,SAAS,EAAE,MAAM,EACjB,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,GAAG,IAAI,CAWf;AAED,yCAAyC;AACzC,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,IAAI,CAGjG"}
@@ -0,0 +1,100 @@
1
+ /**
2
+ * Refuse to ship a transcript over a connection anyone can read.
3
+ *
4
+ * ── The hole this closes ─────────────────────────────────────────────────
5
+ * TLS to the hosted service was never in doubt — valid cert, HSTS for a year,
6
+ * plain HTTP redirected. But NOTHING in the collector required it. A user who
7
+ * typed `chat-recall login http://recall.mycompany.com` got exactly what they
8
+ * asked for: every transcript on the machine, in cleartext, over the open
9
+ * internet, with no warning at any point. `isLocalHost()` existed to relax
10
+ * upload pacing for LAN targets, not to gate the scheme, so a public host over
11
+ * plain HTTP passed every check.
12
+ *
13
+ * The payload makes this worse than a generic cleartext warning deserves. A sync
14
+ * body carries whole transcripts: source code, file paths, and — despite
15
+ * client-side redaction being good — whatever the detectors did not recognise as
16
+ * a secret. This is the single highest-value thing the product ever puts on a
17
+ * wire.
18
+ *
19
+ * ── Where the line is ────────────────────────────────────────────────────
20
+ * Plain HTTP is fine to a host only YOU can reach, and that is the whole
21
+ * exception. Loopback, mDNS/`.lan` names, RFC1918, IPv6 loopback and ULA, and
22
+ * the CGNAT range Tailscale hands out — a self-hoster on any of those has no
23
+ * public path to intercept. Everything else needs TLS.
24
+ *
25
+ * `CHAT_RECALL_ALLOW_INSECURE_HTTP=1` overrides it, for the real case this
26
+ * would otherwise break: a corporate host reached through a VPN whose name and
27
+ * address both look public. That is a deliberate, per-machine decision, which is
28
+ * exactly the bar an override like this should meet.
29
+ */
30
+ /** Hosts only reachable from the user's own machine or network. */
31
+ export function isPrivateHost(serverUrl) {
32
+ let host = '';
33
+ try {
34
+ host = new URL(serverUrl).hostname.toLowerCase();
35
+ }
36
+ catch {
37
+ return false;
38
+ }
39
+ // IPv6 arrives bracket-stripped from URL.hostname.
40
+ if (host === 'localhost' || host === '127.0.0.1' || host === '::1' || host === '0.0.0.0')
41
+ return true;
42
+ if (host.endsWith('.local') || host.endsWith('.lan') || host.endsWith('.internal'))
43
+ return true;
44
+ if (/^10\./.test(host))
45
+ return true; // 10.0.0.0/8
46
+ if (/^192\.168\./.test(host))
47
+ return true; // 192.168.0.0/16
48
+ if (/^172\.(1[6-9]|2\d|3[01])\./.test(host))
49
+ return true; // 172.16.0.0/12
50
+ if (/^127\./.test(host))
51
+ return true; // loopback/8
52
+ // 100.64.0.0/10 — CGNAT, and what Tailscale assigns. A self-hoster reaching
53
+ // their box over a tailnet is on a private path by construction.
54
+ if (/^100\.(6[4-9]|[7-9]\d|1[01]\d|12[0-7])\./.test(host))
55
+ return true;
56
+ if (/^f[cd][0-9a-f]{2}:/.test(host))
57
+ return true; // IPv6 ULA fc00::/7
58
+ if (/^fe80:/.test(host))
59
+ return true; // IPv6 link-local
60
+ return false;
61
+ }
62
+ /** Explicit, per-machine opt-out for a VPN-reached host that looks public. */
63
+ export function insecureHttpAllowed(env = process.env) {
64
+ const v = (env.CHAT_RECALL_ALLOW_INSECURE_HTTP || '').trim().toLowerCase();
65
+ return v === '1' || v === 'true' || v === 'yes';
66
+ }
67
+ /**
68
+ * Why this target must not be used, or null when it is safe.
69
+ *
70
+ * Pure, so both the login gate and the sync-time gate can share one rule and a
71
+ * test can pin it without a network.
72
+ */
73
+ export function transportRisk(serverUrl, env = process.env) {
74
+ let url;
75
+ try {
76
+ url = new URL(serverUrl);
77
+ }
78
+ catch {
79
+ return `not a valid server URL: ${serverUrl}`;
80
+ }
81
+ if (url.protocol === 'https:')
82
+ return null;
83
+ if (url.protocol !== 'http:')
84
+ return `unsupported scheme '${url.protocol}' — use https://`;
85
+ if (isPrivateHost(serverUrl))
86
+ return null; // your own network
87
+ if (insecureHttpAllowed(env))
88
+ return null; // deliberate override
89
+ return `refusing to sync to ${url.host} over plain HTTP — your transcripts, `
90
+ + 'file paths and any secret the redactor did not catch would cross the '
91
+ + `internet in cleartext. Use https://${url.host} instead. If this host is `
92
+ + 'only reachable through a VPN, set CHAT_RECALL_ALLOW_INSECURE_HTTP=1.';
93
+ }
94
+ /** Throwing form, for the login path. */
95
+ export function assertTransportSafe(serverUrl, env = process.env) {
96
+ const risk = transportRisk(serverUrl, env);
97
+ if (risk)
98
+ throw new Error(risk);
99
+ }
100
+ //# sourceMappingURL=transport-safety.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport-safety.js","sourceRoot":"","sources":["../src/transport-safety.ts"],"names":[],"mappings":"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"}
@@ -35,7 +35,7 @@ export function forceFullResync(server, sessionIds) {
35
35
  let cleared = 0;
36
36
  for (const key of Object.keys(data)) {
37
37
  // Ledger keys are prefixed ids for non-Claude tools; match either form.
38
- const bare = key.replace(/^(opencode_|gemini_|codex_|agy_)/, '');
38
+ const bare = key.replace(/^(opencode_|gemini_|codex_|agy_|cursor_)/, '');
39
39
  if (!wanted.has(key) && !wanted.has(bare))
40
40
  continue;
41
41
  const row = data[key];
@@ -1 +1 @@
1
- {"version":3,"file":"verify-repair.js","sourceRoot":"","sources":["../src/verify-repair.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEpF;qEACqE;AACrE,MAAM,UAAU,eAAe,CAAC,MAAc,EAAE,UAAoB;IAClE,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAEtC,MAAM,IAAI,GAAG,cAAc,EAAE,CAAC;IAC9B,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACrB,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC9E,IAAI,CAAC;YAAC,YAAY,CAAC,IAAI,EAAE,GAAG,IAAI,QAAQ,KAAK,EAAE,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,wBAAwB,CAAC,CAAC;IACxF,CAAC;IAED,MAAM,IAAI,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IACnC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;IACnC,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,wEAAwE;QACxE,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,kCAAkC,EAAE,EAAE,CAAC,CAAC;QACjE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,SAAS;QACpD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QACtB,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;YAAC,OAAO,EAAE,CAAC;YAAC,SAAS;QAAC,CAAC;QACvF,MAAM,CAAC,GAAG,GAAyC,CAAC;QACpD,OAAO,CAAC,CAAC,CAAC,CAAC,CAAM,cAAc;QAC/B,OAAO,CAAC,CAAC,CAAC,CAAC,CAAM,sBAAsB;QACvC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAM,4DAA4D;QAC7E,OAAO,CAAC,CAAC,CAAC,CAAC,CAAM,sDAAsD;QACvE,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,OAAO,GAAG,CAAC;QAAE,iBAAiB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACjD,OAAO,OAAO,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"verify-repair.js","sourceRoot":"","sources":["../src/verify-repair.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEpF;qEACqE;AACrE,MAAM,UAAU,eAAe,CAAC,MAAc,EAAE,UAAoB;IAClE,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAEtC,MAAM,IAAI,GAAG,cAAc,EAAE,CAAC;IAC9B,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACrB,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC9E,IAAI,CAAC;YAAC,YAAY,CAAC,IAAI,EAAE,GAAG,IAAI,QAAQ,KAAK,EAAE,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,wBAAwB,CAAC,CAAC;IACxF,CAAC;IAED,MAAM,IAAI,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IACnC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;IACnC,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,wEAAwE;QACxE,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,0CAA0C,EAAE,EAAE,CAAC,CAAC;QACzE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,SAAS;QACpD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QACtB,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;YAAC,OAAO,EAAE,CAAC;YAAC,SAAS;QAAC,CAAC;QACvF,MAAM,CAAC,GAAG,GAAyC,CAAC;QACpD,OAAO,CAAC,CAAC,CAAC,CAAC,CAAM,cAAc;QAC/B,OAAO,CAAC,CAAC,CAAC,CAAC,CAAM,sBAAsB;QACvC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAM,4DAA4D;QAC7E,OAAO,CAAC,CAAC,CAAC,CAAC,CAAM,sDAAsD;QACvE,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,OAAO,GAAG,CAAC;QAAE,iBAAiB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACjD,OAAO,OAAO,CAAC;AACjB,CAAC"}