chat-recall 0.7.10 → 0.7.12
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/dist/auto-update.d.ts +31 -0
- package/dist/auto-update.d.ts.map +1 -1
- package/dist/auto-update.js +81 -15
- package/dist/auto-update.js.map +1 -1
- package/dist/cli.js +241 -29
- package/dist/cli.js.map +1 -1
- package/dist/mcp-relay.js +1 -1
- package/dist/mcp.js +235 -27
- package/dist/scan-worker.d.ts.map +1 -1
- package/dist/scan-worker.js +199 -100
- package/dist/scan-worker.js.map +1 -1
- package/dist/sync-client.js +2 -2
- package/dist/sync-client.js.map +1 -1
- package/dist/watch.js +241 -28
- package/package.json +1 -1
package/dist/mcp-relay.js
CHANGED
|
@@ -192,7 +192,7 @@ function bridge(input, output, sock, exit, opts = {}) {
|
|
|
192
192
|
}
|
|
193
193
|
|
|
194
194
|
// src/mcp-relay.ts
|
|
195
|
-
var VERSION = true ? "0.7.
|
|
195
|
+
var VERSION = true ? "0.7.12" : "0.0.0";
|
|
196
196
|
var SERVER_URL = new URL("./mcp.js", import.meta.url);
|
|
197
197
|
var SERVER_PATH = fileURLToPath(SERVER_URL);
|
|
198
198
|
var START_TIMEOUT_MS = 15e3;
|
package/dist/mcp.js
CHANGED
|
@@ -5065,8 +5065,15 @@ var init_claude_prompt_origin = __esm({
|
|
|
5065
5065
|
INJECTED_PREFIXES = [
|
|
5066
5066
|
["<task-notification", "task-notification"],
|
|
5067
5067
|
["<agent-message", "peer"],
|
|
5068
|
+
["<cross-session-message", "peer"],
|
|
5069
|
+
["[Cross-session delivery notice]", "peer"],
|
|
5068
5070
|
["Another Claude session sent a message:", "peer"],
|
|
5069
|
-
["Stop hook feedback:", "hook"]
|
|
5071
|
+
["Stop hook feedback:", "hook"],
|
|
5072
|
+
["<bash-stdout>", "command-output"],
|
|
5073
|
+
["<bash-stderr>", "command-output"],
|
|
5074
|
+
["<local-command-stdout>", "command-output"],
|
|
5075
|
+
["<local-command-stderr>", "command-output"],
|
|
5076
|
+
["<<autonomous-loop", "meta"]
|
|
5070
5077
|
];
|
|
5071
5078
|
}
|
|
5072
5079
|
});
|
|
@@ -6041,7 +6048,7 @@ var init_session_sentiment = __esm({
|
|
|
6041
6048
|
DIRECTIVE_HEAD = /^(?:please\s+)?(?:use|implement|build|make|add|create|fix|remove|delete|update|refactor|run|deploy|push|merge|test|check|investigate|find|search|show|list|generate|set\s+up|ensure)\b/i;
|
|
6042
6049
|
CLARIFY_PHRASES = /\b(?:wdym|what do you mean|explain|clarify|what is|what's|huh\??|i don'?t understand)\b/i;
|
|
6043
6050
|
FRUSTRATED_PHRASES = /\b(?:why (?:the )?(?:fuck|hell)|wtf|are you (?:kidding|serious)|stop slacking|stop making|why did you|why didn'?t you|i (?:fucking )?(?:asked|told you)|are you (?:listening|even)|come\s*on|just\s+do)\b/i;
|
|
6044
|
-
MARKERS_VERSION =
|
|
6051
|
+
MARKERS_VERSION = 3;
|
|
6045
6052
|
}
|
|
6046
6053
|
});
|
|
6047
6054
|
|
|
@@ -11619,7 +11626,11 @@ __export(raw_exports, {
|
|
|
11619
11626
|
gzipContainer: () => gzipContainer,
|
|
11620
11627
|
mapContainerText: () => mapContainerText,
|
|
11621
11628
|
parseOpenCodeDumpText: () => parseOpenCodeDumpText,
|
|
11622
|
-
parseTranscriptFromContainer: () => parseTranscriptFromContainer
|
|
11629
|
+
parseTranscriptFromContainer: () => parseTranscriptFromContainer,
|
|
11630
|
+
redactContainer: () => redactContainer,
|
|
11631
|
+
redactJsonLine: () => redactJsonLine,
|
|
11632
|
+
repairContainer: () => repairContainer,
|
|
11633
|
+
repairRedactedJsonl: () => repairRedactedJsonl
|
|
11623
11634
|
});
|
|
11624
11635
|
import { gzipSync, gunzipSync } from "zlib";
|
|
11625
11636
|
import { createHash as createHash3 } from "crypto";
|
|
@@ -11660,6 +11671,134 @@ function gunzipContainer(gz) {
|
|
|
11660
11671
|
function mapContainerText(c, fn) {
|
|
11661
11672
|
return { ...c, files: c.files.map((f) => ({ name: f.name, text: fn(f.text) })) };
|
|
11662
11673
|
}
|
|
11674
|
+
function repairRedactedJsonl(text) {
|
|
11675
|
+
let repaired = 0;
|
|
11676
|
+
const parts = [];
|
|
11677
|
+
let copied = 0;
|
|
11678
|
+
let at = text.indexOf("[REDACTED:");
|
|
11679
|
+
while (at >= 0) {
|
|
11680
|
+
const start = text.lastIndexOf("\n", at) + 1;
|
|
11681
|
+
let end = text.indexOf("\n", at);
|
|
11682
|
+
if (end < 0)
|
|
11683
|
+
end = text.length;
|
|
11684
|
+
const fixed = repairLine(text.slice(start, end));
|
|
11685
|
+
if (fixed !== null) {
|
|
11686
|
+
parts.push(text.slice(copied, start), fixed);
|
|
11687
|
+
copied = end;
|
|
11688
|
+
repaired++;
|
|
11689
|
+
}
|
|
11690
|
+
at = text.indexOf("[REDACTED:", end);
|
|
11691
|
+
}
|
|
11692
|
+
if (repaired === 0)
|
|
11693
|
+
return { text, repaired: 0 };
|
|
11694
|
+
parts.push(text.slice(copied));
|
|
11695
|
+
return { text: parts.join(""), repaired };
|
|
11696
|
+
}
|
|
11697
|
+
function parseError(line) {
|
|
11698
|
+
try {
|
|
11699
|
+
JSON.parse(line);
|
|
11700
|
+
return null;
|
|
11701
|
+
} catch (e) {
|
|
11702
|
+
const m = /position (\d+)/.exec(e instanceof Error ? e.message : "");
|
|
11703
|
+
return m ? Number(m[1]) : line.length;
|
|
11704
|
+
}
|
|
11705
|
+
}
|
|
11706
|
+
function repairLine(line) {
|
|
11707
|
+
if (!line.includes("[REDACTED:") || parseError(line) === null)
|
|
11708
|
+
return null;
|
|
11709
|
+
let out = line.replace(/(?<!\\)((?:\\\\)*)\\(\[REDACTED:)/g, "$1$2");
|
|
11710
|
+
for (let attempt = 0; attempt < 64; attempt++) {
|
|
11711
|
+
const at = parseError(out);
|
|
11712
|
+
if (at === null)
|
|
11713
|
+
return out;
|
|
11714
|
+
let site = -1;
|
|
11715
|
+
for (const m of out.matchAll(MARKER_QUOTE)) {
|
|
11716
|
+
const q = m.index + m[0].length - 1;
|
|
11717
|
+
if (q < at)
|
|
11718
|
+
site = q;
|
|
11719
|
+
}
|
|
11720
|
+
if (site < 0)
|
|
11721
|
+
return null;
|
|
11722
|
+
out = out.slice(0, site) + "\\" + out.slice(site);
|
|
11723
|
+
}
|
|
11724
|
+
return null;
|
|
11725
|
+
}
|
|
11726
|
+
function redactJsonLine(line, redact) {
|
|
11727
|
+
if (!line.includes('"'))
|
|
11728
|
+
return redact(line);
|
|
11729
|
+
try {
|
|
11730
|
+
JSON.parse(line);
|
|
11731
|
+
} catch {
|
|
11732
|
+
return redact(line);
|
|
11733
|
+
}
|
|
11734
|
+
const decoded = mapJsonStrings(line, redact, true);
|
|
11735
|
+
const out = redact(decoded);
|
|
11736
|
+
try {
|
|
11737
|
+
JSON.parse(out);
|
|
11738
|
+
return out;
|
|
11739
|
+
} catch {
|
|
11740
|
+
return mapJsonStrings(decoded, redact, false);
|
|
11741
|
+
}
|
|
11742
|
+
}
|
|
11743
|
+
function mapJsonStrings(line, fn, escapedOnly) {
|
|
11744
|
+
let out = "";
|
|
11745
|
+
let i = 0;
|
|
11746
|
+
for (; ; ) {
|
|
11747
|
+
const q = line.indexOf('"', i);
|
|
11748
|
+
if (q < 0)
|
|
11749
|
+
return out + line.slice(i);
|
|
11750
|
+
let j = q + 1;
|
|
11751
|
+
while (j < line.length) {
|
|
11752
|
+
const c = line.charCodeAt(j);
|
|
11753
|
+
if (c === 92)
|
|
11754
|
+
j += 2;
|
|
11755
|
+
else if (c === 34)
|
|
11756
|
+
break;
|
|
11757
|
+
else
|
|
11758
|
+
j++;
|
|
11759
|
+
}
|
|
11760
|
+
const token = line.slice(q, j + 1);
|
|
11761
|
+
out += line.slice(i, q);
|
|
11762
|
+
i = j + 1;
|
|
11763
|
+
const body2 = token.slice(1, -1);
|
|
11764
|
+
const escaped = body2.includes("\\");
|
|
11765
|
+
if (escapedOnly && !escaped) {
|
|
11766
|
+
out += token;
|
|
11767
|
+
continue;
|
|
11768
|
+
}
|
|
11769
|
+
let value = body2;
|
|
11770
|
+
if (escaped) {
|
|
11771
|
+
try {
|
|
11772
|
+
value = JSON.parse(token);
|
|
11773
|
+
} catch {
|
|
11774
|
+
out += token;
|
|
11775
|
+
continue;
|
|
11776
|
+
}
|
|
11777
|
+
}
|
|
11778
|
+
const next = fn(value);
|
|
11779
|
+
out += next === value ? token : JSON.stringify(next);
|
|
11780
|
+
}
|
|
11781
|
+
}
|
|
11782
|
+
function redactContainer(c, redact) {
|
|
11783
|
+
return {
|
|
11784
|
+
...c,
|
|
11785
|
+
files: c.files.map((f) => ({
|
|
11786
|
+
name: f.name,
|
|
11787
|
+
text: f.name.endsWith(".jsonl") ? f.text.split("\n").map((l) => l ? redactJsonLine(l, redact) : l).join("\n") : redact(f.text)
|
|
11788
|
+
}))
|
|
11789
|
+
};
|
|
11790
|
+
}
|
|
11791
|
+
function repairContainer(c) {
|
|
11792
|
+
let repaired = 0;
|
|
11793
|
+
const files = c.files.map((f) => {
|
|
11794
|
+
if (!f.name.endsWith(".jsonl"))
|
|
11795
|
+
return f;
|
|
11796
|
+
const r = repairRedactedJsonl(f.text);
|
|
11797
|
+
repaired += r.repaired;
|
|
11798
|
+
return r.repaired > 0 ? { name: f.name, text: r.text } : f;
|
|
11799
|
+
});
|
|
11800
|
+
return repaired > 0 ? { container: { ...c, files }, repaired } : { container: c, repaired: 0 };
|
|
11801
|
+
}
|
|
11663
11802
|
function subagentKind(id) {
|
|
11664
11803
|
return id.includes("acompact") ? "compact" : id.includes("aside_question") ? "aside" : id.includes("explore") || /^agent-a[0-9a-f]{16,}$/i.test(id) ? "explore" : "other";
|
|
11665
11804
|
}
|
|
@@ -11830,6 +11969,7 @@ function requireFs() {
|
|
|
11830
11969
|
function requirePath() {
|
|
11831
11970
|
return pathMod;
|
|
11832
11971
|
}
|
|
11972
|
+
var MARKER_QUOTE;
|
|
11833
11973
|
var init_raw = __esm({
|
|
11834
11974
|
"../engine/dist/transcript/raw.js"() {
|
|
11835
11975
|
"use strict";
|
|
@@ -11837,6 +11977,7 @@ var init_raw = __esm({
|
|
|
11837
11977
|
init_claude2();
|
|
11838
11978
|
init_codex2();
|
|
11839
11979
|
init_from_events();
|
|
11980
|
+
MARKER_QUOTE = /\[REDACTED:[A-Za-z0-9_-]+\]"/g;
|
|
11840
11981
|
}
|
|
11841
11982
|
});
|
|
11842
11983
|
|
|
@@ -13173,7 +13314,13 @@ function redactSecrets(text, opts = {}) {
|
|
|
13173
13314
|
return whole;
|
|
13174
13315
|
if (opts.count)
|
|
13175
13316
|
opts.count.redactions++;
|
|
13176
|
-
|
|
13317
|
+
let last = args.length - 1;
|
|
13318
|
+
if (typeof args[last] === "object")
|
|
13319
|
+
last--;
|
|
13320
|
+
const source = args[last];
|
|
13321
|
+
const secretStart = args[last - 1] + whole.length - secret.length;
|
|
13322
|
+
const head = escapeHead(source, secretStart, secret.length);
|
|
13323
|
+
return whole.slice(0, whole.length - secret.length + head) + `[REDACTED:${r.label}]` + escapeKept(whole, whole.length);
|
|
13177
13324
|
});
|
|
13178
13325
|
}
|
|
13179
13326
|
const ctx = findContextualSecrets(out);
|
|
@@ -13181,10 +13328,25 @@ function redactSecrets(text, opts = {}) {
|
|
|
13181
13328
|
const { start, end } = ctx[i];
|
|
13182
13329
|
if (opts.count)
|
|
13183
13330
|
opts.count.redactions++;
|
|
13184
|
-
|
|
13331
|
+
const head = escapeHead(out, start, end - start);
|
|
13332
|
+
out = out.slice(0, start + head) + "[REDACTED:secret-context]" + escapeKept(out, end) + out.slice(end);
|
|
13185
13333
|
}
|
|
13186
13334
|
return out;
|
|
13187
13335
|
}
|
|
13336
|
+
function escapeKept(text, end) {
|
|
13337
|
+
let run = 0;
|
|
13338
|
+
while (run < end && text.charCodeAt(end - 1 - run) === 92)
|
|
13339
|
+
run++;
|
|
13340
|
+
return run % 2 === 1 ? "\\" : "";
|
|
13341
|
+
}
|
|
13342
|
+
function escapeHead(text, start, length) {
|
|
13343
|
+
let run = 0;
|
|
13344
|
+
while (run < start && text.charCodeAt(start - 1 - run) === 92)
|
|
13345
|
+
run++;
|
|
13346
|
+
if (run % 2 === 0)
|
|
13347
|
+
return 0;
|
|
13348
|
+
return Math.min(text[start] === "u" ? 5 : 1, length);
|
|
13349
|
+
}
|
|
13188
13350
|
function maskSecret(s) {
|
|
13189
13351
|
if (!s)
|
|
13190
13352
|
return "";
|
|
@@ -13291,7 +13453,12 @@ var init_secret_redactor = __esm({
|
|
|
13291
13453
|
// userinfo URL walked through in cleartext — and a `jdbc:postgresql://…`
|
|
13292
13454
|
// prefix broke the \b anchor for the one family it did cover. Any scheme
|
|
13293
13455
|
// followed by userinfo is a credential, so match the shape, not a list.
|
|
13294
|
-
|
|
13456
|
+
//
|
|
13457
|
+
// A quote in userinfo is percent-encoded, so neither part takes a `"`. The
|
|
13458
|
+
// sync redacts JSONL text, and a match that ran on through `","is_error":`
|
|
13459
|
+
// to a later `@` replaced JSON structure: 4 lines on one machine stopped
|
|
13460
|
+
// parsing, and their records were dropped.
|
|
13461
|
+
{ label: "url-password", secret: 1, pattern: /\b[a-zA-Z][a-zA-Z0-9+.-]{1,31}:\/\/[^:@\s/"]{1,64}:([^@\s/"]{1,256})(?=@)/g },
|
|
13295
13462
|
// Bare AWS secret-access-key VALUE: EXACTLY 40 base64 chars, word-bounded,
|
|
13296
13463
|
// containing upper+lower+digit. This is the gitleaks heuristic — the mixed-case
|
|
13297
13464
|
// requirement excludes 40-char lowercase-hex git SHAs, and the exact-40 bound
|
|
@@ -19564,7 +19731,7 @@ var init_sync_fields = __esm({
|
|
|
19564
19731
|
import { existsSync as existsSync43, mkdirSync as mkdirSync11, openSync as openSync9, writeFileSync as writeFileSync8, readFileSync as readFileSync35, rmSync as rmSync4, statSync as statSync40, closeSync as closeSync9 } from "fs";
|
|
19565
19732
|
import { dirname as dirname18, join as join47 } from "path";
|
|
19566
19733
|
function acquireIndexLock(opts) {
|
|
19567
|
-
const lockPath = lockFilePath();
|
|
19734
|
+
const lockPath = lockFilePath(opts.file);
|
|
19568
19735
|
mkdirSync11(dirname18(lockPath), { recursive: true });
|
|
19569
19736
|
if (existsSync43(lockPath)) {
|
|
19570
19737
|
if (!stealStaleLock(lockPath, opts.staleAfterMs ?? 10 * 6e4)) {
|
|
@@ -19606,8 +19773,8 @@ function acquireIndexLock(opts) {
|
|
|
19606
19773
|
}
|
|
19607
19774
|
};
|
|
19608
19775
|
}
|
|
19609
|
-
function lockFilePath() {
|
|
19610
|
-
return join47(getIndexDir(),
|
|
19776
|
+
function lockFilePath(file = ".compact.lock") {
|
|
19777
|
+
return join47(getIndexDir(), file);
|
|
19611
19778
|
}
|
|
19612
19779
|
function stealStaleLock(lockPath, staleAfterMs) {
|
|
19613
19780
|
try {
|
|
@@ -19677,7 +19844,7 @@ var init_http = __esm({
|
|
|
19677
19844
|
CLI_VERSION = JSON.parse(readFileSync36(new URL("../package.json", import.meta.url), "utf-8")).version || CLI_VERSION;
|
|
19678
19845
|
} catch {
|
|
19679
19846
|
try {
|
|
19680
|
-
if (true) CLI_VERSION = "0.7.
|
|
19847
|
+
if (true) CLI_VERSION = "0.7.12";
|
|
19681
19848
|
} catch {
|
|
19682
19849
|
}
|
|
19683
19850
|
}
|
|
@@ -20175,7 +20342,7 @@ var init_telemetry = __esm({
|
|
|
20175
20342
|
init_sync_client();
|
|
20176
20343
|
cliVersion2 = () => {
|
|
20177
20344
|
try {
|
|
20178
|
-
return true ? "0.7.
|
|
20345
|
+
return true ? "0.7.12" : "dev";
|
|
20179
20346
|
} catch {
|
|
20180
20347
|
return "dev";
|
|
20181
20348
|
}
|
|
@@ -20325,6 +20492,8 @@ var init_server_probe = __esm({
|
|
|
20325
20492
|
// src/auto-update.ts
|
|
20326
20493
|
var auto_update_exports = {};
|
|
20327
20494
|
__export(auto_update_exports, {
|
|
20495
|
+
LOCKED_REASON: () => LOCKED_REASON,
|
|
20496
|
+
STOPPING_REASON: () => STOPPING_REASON,
|
|
20328
20497
|
clearUpdateFailures: () => clearUpdateFailures,
|
|
20329
20498
|
compareVersions: () => compareVersions,
|
|
20330
20499
|
executeAutoUpdate: () => executeAutoUpdate,
|
|
@@ -20336,8 +20505,10 @@ __export(auto_update_exports, {
|
|
|
20336
20505
|
planAutoUpdate: () => planAutoUpdate,
|
|
20337
20506
|
readUpdateState: () => readUpdateState,
|
|
20338
20507
|
resolveNpm: () => resolveNpm,
|
|
20508
|
+
restartCommand: () => restartCommand,
|
|
20339
20509
|
runAutoUpdate: () => runAutoUpdate,
|
|
20340
20510
|
runningPrefix: () => runningPrefix,
|
|
20511
|
+
stopAutoUpdates: () => stopAutoUpdates,
|
|
20341
20512
|
sweepStaleStaging: () => sweepStaleStaging,
|
|
20342
20513
|
tarballUrl: () => tarballUrl
|
|
20343
20514
|
});
|
|
@@ -20433,6 +20604,10 @@ async function executeAutoUpdate(plan, deps) {
|
|
|
20433
20604
|
};
|
|
20434
20605
|
const tgz = join48(dir, "chat-recall.tgz");
|
|
20435
20606
|
writeFileSync9(tgz, buf);
|
|
20607
|
+
if (deps.stopping?.()) {
|
|
20608
|
+
discardStaging();
|
|
20609
|
+
return { updated: false, reason: STOPPING_REASON };
|
|
20610
|
+
}
|
|
20436
20611
|
try {
|
|
20437
20612
|
deps.install(tgz);
|
|
20438
20613
|
} catch (e) {
|
|
@@ -20447,9 +20622,11 @@ async function executeAutoUpdate(plan, deps) {
|
|
|
20447
20622
|
reason: `install reported success but ${landed} is still on disk (wanted ${plan.to}) \u2014 the package that runs is not the one npm wrote. Reinstall by hand: npm install -g ${plan.url}`
|
|
20448
20623
|
};
|
|
20449
20624
|
}
|
|
20450
|
-
|
|
20451
|
-
|
|
20452
|
-
|
|
20625
|
+
if (!deps.stopping?.()) {
|
|
20626
|
+
try {
|
|
20627
|
+
deps.restart(deps.platform ?? process.platform);
|
|
20628
|
+
} catch {
|
|
20629
|
+
}
|
|
20453
20630
|
}
|
|
20454
20631
|
return { updated: true, reason: `updated ${plan.from} \u2192 ${plan.to}`, from: plan.from, to: plan.to };
|
|
20455
20632
|
}
|
|
@@ -20508,10 +20685,18 @@ function realInstall(tgz) {
|
|
|
20508
20685
|
npmInstall(npm, ["install", "-g", "--prefix", join48(homedir17(), ".local"), tgz]);
|
|
20509
20686
|
}
|
|
20510
20687
|
}
|
|
20688
|
+
function acquireUpdateLock() {
|
|
20689
|
+
return acquireIndexLock({ kind: "auto-update", file: ".update.lock", staleAfterMs: 10 * 6e4 });
|
|
20690
|
+
}
|
|
20691
|
+
function restartCommand(platform2) {
|
|
20692
|
+
if (platform2 === "linux") return { cmd: "systemctl --user --no-block restart chat-recall-watch.service" };
|
|
20693
|
+
if (platform2 === "darwin") return { cmd: "launchctl kickstart -k gui/$(id -u)/com.chat-recall.watch", shell: "/bin/bash" };
|
|
20694
|
+
if (platform2 === "win32") return { cmd: "schtasks /End /TN chat-recall-watch & schtasks /Run /TN chat-recall-watch" };
|
|
20695
|
+
return null;
|
|
20696
|
+
}
|
|
20511
20697
|
function realRestart(platform2) {
|
|
20512
|
-
|
|
20513
|
-
|
|
20514
|
-
else if (platform2 === "win32") execSync4("schtasks /End /TN chat-recall-watch & schtasks /Run /TN chat-recall-watch", { stdio: "ignore" });
|
|
20698
|
+
const c = restartCommand(platform2);
|
|
20699
|
+
if (c) execSync4(c.cmd, { stdio: "ignore", ...c.shell ? { shell: c.shell } : {} });
|
|
20515
20700
|
}
|
|
20516
20701
|
function updateStatePath() {
|
|
20517
20702
|
const dir = process.env.CHAT_RECALL_DATA_DIR || join48(homedir17(), ".chat-recall");
|
|
@@ -20544,6 +20729,9 @@ function noteUpdateFailure(target) {
|
|
|
20544
20729
|
function clearUpdateFailures() {
|
|
20545
20730
|
writeUpdateState({});
|
|
20546
20731
|
}
|
|
20732
|
+
function stopAutoUpdates() {
|
|
20733
|
+
stopRequested = true;
|
|
20734
|
+
}
|
|
20547
20735
|
async function runAutoUpdate(base, authHeaders, ownVersion2, deps) {
|
|
20548
20736
|
let caps;
|
|
20549
20737
|
try {
|
|
@@ -20570,12 +20758,28 @@ async function runAutoUpdate(base, authHeaders, ownVersion2, deps) {
|
|
|
20570
20758
|
if (target && hasGivenUpOn(target)) {
|
|
20571
20759
|
return { updated: false, reason: `gave up installing ${plan.to} after ${GIVE_UP_AFTER} failed attempts \u2014 run \`npm install -g chat-recall\` by hand` };
|
|
20572
20760
|
}
|
|
20573
|
-
const
|
|
20574
|
-
|
|
20575
|
-
|
|
20576
|
-
|
|
20577
|
-
|
|
20578
|
-
|
|
20761
|
+
const stopping = deps?.stopping ?? (() => stopRequested);
|
|
20762
|
+
if (stopping()) return { updated: false, reason: STOPPING_REASON };
|
|
20763
|
+
const lock = (deps?.acquireLock ?? acquireUpdateLock)();
|
|
20764
|
+
if (!lock) return { updated: false, reason: LOCKED_REASON };
|
|
20765
|
+
let result;
|
|
20766
|
+
try {
|
|
20767
|
+
const onDisk = (deps?.onDisk ?? installedVersion)();
|
|
20768
|
+
if (onDisk && plan.to && compareVersions(onDisk, plan.to) >= 0) {
|
|
20769
|
+
return { updated: false, reason: `already current: ${onDisk} is on disk` };
|
|
20770
|
+
}
|
|
20771
|
+
result = await executeAutoUpdate(plan, {
|
|
20772
|
+
download: deps?.download ?? realDownload,
|
|
20773
|
+
install: deps?.install ?? realInstall,
|
|
20774
|
+
restart: deps?.restart ?? realRestart,
|
|
20775
|
+
platform: deps?.platform,
|
|
20776
|
+
verify: deps?.verify,
|
|
20777
|
+
stopping
|
|
20778
|
+
});
|
|
20779
|
+
} finally {
|
|
20780
|
+
lock.release();
|
|
20781
|
+
}
|
|
20782
|
+
if (result.reason === STOPPING_REASON) return result;
|
|
20579
20783
|
if (!result.updated) {
|
|
20580
20784
|
const failures = target ? noteUpdateFailure(target) : 1;
|
|
20581
20785
|
if (failures <= GIVE_UP_AFTER) {
|
|
@@ -20591,14 +20795,18 @@ async function runAutoUpdate(base, authHeaders, ownVersion2, deps) {
|
|
|
20591
20795
|
}
|
|
20592
20796
|
return result;
|
|
20593
20797
|
}
|
|
20594
|
-
var tarballUrl, GIVE_UP_AFTER, reportedStandingSkip;
|
|
20798
|
+
var tarballUrl, GIVE_UP_AFTER, reportedStandingSkip, STOPPING_REASON, LOCKED_REASON, stopRequested;
|
|
20595
20799
|
var init_auto_update = __esm({
|
|
20596
20800
|
"src/auto-update.ts"() {
|
|
20597
20801
|
"use strict";
|
|
20598
20802
|
init_http();
|
|
20803
|
+
init_index_lock();
|
|
20599
20804
|
tarballUrl = (base, version2) => `${base.replace(/\/+$/, "")}/install/${version2 ? `chat-recall-${version2}.tgz` : "chat-recall.tgz"}`;
|
|
20600
20805
|
GIVE_UP_AFTER = 3;
|
|
20601
20806
|
reportedStandingSkip = /* @__PURE__ */ new Set();
|
|
20807
|
+
STOPPING_REASON = "not installed: this process is shutting down";
|
|
20808
|
+
LOCKED_REASON = "another process is installing an update";
|
|
20809
|
+
stopRequested = false;
|
|
20602
20810
|
}
|
|
20603
20811
|
});
|
|
20604
20812
|
|
|
@@ -22097,7 +22305,7 @@ async function buildConversationSync(ref, mtime, opts = {}) {
|
|
|
22097
22305
|
} else {
|
|
22098
22306
|
try {
|
|
22099
22307
|
const count2 = { redactions: 0 };
|
|
22100
|
-
const redacted =
|
|
22308
|
+
const redacted = redactContainer(container, (t) => redactSecrets(t, { force: true, count: count2 }));
|
|
22101
22309
|
count.redactions += count2.redactions;
|
|
22102
22310
|
const { gz, size } = gzipContainer(redacted);
|
|
22103
22311
|
if (gz.length <= 8 * 1024 * 1024) {
|
|
@@ -22297,7 +22505,7 @@ var init_sync_client = __esm({
|
|
|
22297
22505
|
ownVersion = JSON.parse(readFileSync38(join49(dir, "../package.json"), "utf-8")).version || ownVersion;
|
|
22298
22506
|
} catch {
|
|
22299
22507
|
try {
|
|
22300
|
-
if (true) ownVersion = "0.7.
|
|
22508
|
+
if (true) ownVersion = "0.7.12";
|
|
22301
22509
|
} catch {
|
|
22302
22510
|
}
|
|
22303
22511
|
}
|
|
@@ -29246,7 +29454,7 @@ function installCrashGuards() {
|
|
|
29246
29454
|
reportClientEvent2("mcp_crash", { message: err.stack || err.message });
|
|
29247
29455
|
});
|
|
29248
29456
|
}
|
|
29249
|
-
var RELAY_VERSION = true ? "0.7.
|
|
29457
|
+
var RELAY_VERSION = true ? "0.7.12" : "0.0.0";
|
|
29250
29458
|
function daemonIdleSecs() {
|
|
29251
29459
|
const raw = process.env.CHAT_RECALL_DAEMON_IDLE_SECS;
|
|
29252
29460
|
if (raw === void 0) return 900;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scan-worker.d.ts","sourceRoot":"","sources":["../src/scan-worker.ts"],"names":[],"mappings":"AA8BA,OAAO,EAEL,KAAK,cAAc,EAAE,KAAK,eAAe,EAC1C,MAAM,6CAA6C,CAAC;
|
|
1
|
+
{"version":3,"file":"scan-worker.d.ts","sourceRoot":"","sources":["../src/scan-worker.ts"],"names":[],"mappings":"AA8BA,OAAO,EAEL,KAAK,cAAc,EAAE,KAAK,eAAe,EAC1C,MAAM,6CAA6C,CAAC;AAGrD,oEAAoE;AACpE,MAAM,WAAW,QAAQ;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE;AAExD;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,SAAS,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,cAAc,EAAE,CAAA;KAAE,CAAC;IACpD,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,OAAO,CAAA;SAAE,CAAC,CAAC;QAAC,WAAW,EAAE,OAAO,GAAG,IAAI,CAAA;KAAE,GAAG,IAAI,CAAC;IAChJ,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,2EAA2E;IAC3E,SAAS,EAAE;QAAE,CAAC,EAAE,CAAC,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACnE,gEAAgE;IAChE,UAAU,EAAE,OAAO,CAAC;IACpB,qEAAqE;IACrE,WAAW,EAAE,MAAM,CAAC;IACpB,gFAAgF;IAChF,IAAI,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,cAAc,EAAE,CAAA;KAAE,CAAC;IACpD,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,2EAA2E;IAC3E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
|