chat-recall 0.5.18 → 0.5.20
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 +1 -1
- package/dist/auto-update.d.ts +11 -0
- package/dist/auto-update.d.ts.map +1 -1
- package/dist/auto-update.js +50 -2
- package/dist/auto-update.js.map +1 -1
- package/dist/cli.js +125 -106
- package/dist/mcp.js +83 -54
- package/dist/watch.js +85 -66
- package/package.json +1 -1
package/dist/mcp.js
CHANGED
|
@@ -7333,8 +7333,8 @@ var init_claude = __esm({
|
|
|
7333
7333
|
|
|
7334
7334
|
// ../engine/dist/transcript/gemini.js
|
|
7335
7335
|
async function parseGeminiTranscript(sessionPath) {
|
|
7336
|
-
const { readFileSync:
|
|
7337
|
-
return parseGeminiTranscriptText(
|
|
7336
|
+
const { readFileSync: readFileSync44 } = await import("fs");
|
|
7337
|
+
return parseGeminiTranscriptText(readFileSync44(sessionPath, "utf-8"));
|
|
7338
7338
|
}
|
|
7339
7339
|
function parseGeminiTranscriptText(text) {
|
|
7340
7340
|
let content;
|
|
@@ -7790,11 +7790,11 @@ async function archiveRawSession(store2, sessionId) {
|
|
|
7790
7790
|
return await store2.putRawSession(sessionId, exp.tool, Math.floor(exp.mtime), gz, size);
|
|
7791
7791
|
}
|
|
7792
7792
|
function detectForkPredecessor(sessionPath) {
|
|
7793
|
-
const { readFileSync:
|
|
7794
|
-
const { dirname:
|
|
7793
|
+
const { readFileSync: readFileSync44, readdirSync: readdirSync34 } = requireFs();
|
|
7794
|
+
const { dirname: dirname20, join: join53, basename: basename25 } = requirePath();
|
|
7795
7795
|
let text;
|
|
7796
7796
|
try {
|
|
7797
|
-
text =
|
|
7797
|
+
text = readFileSync44(sessionPath, "utf-8");
|
|
7798
7798
|
} catch {
|
|
7799
7799
|
return null;
|
|
7800
7800
|
}
|
|
@@ -7816,7 +7816,7 @@ function detectForkPredecessor(sessionPath) {
|
|
|
7816
7816
|
return null;
|
|
7817
7817
|
if (text.includes(`"uuid":"${headParent}"`))
|
|
7818
7818
|
return null;
|
|
7819
|
-
const dir =
|
|
7819
|
+
const dir = dirname20(sessionPath);
|
|
7820
7820
|
const self = basename25(sessionPath);
|
|
7821
7821
|
let entries;
|
|
7822
7822
|
try {
|
|
@@ -7828,7 +7828,7 @@ function detectForkPredecessor(sessionPath) {
|
|
|
7828
7828
|
if (!f.endsWith(".jsonl") || f === self || f === "sessions-index.json")
|
|
7829
7829
|
continue;
|
|
7830
7830
|
try {
|
|
7831
|
-
if (
|
|
7831
|
+
if (readFileSync44(join53(dir, f), "utf-8").includes(`"uuid":"${headParent}"`)) {
|
|
7832
7832
|
return basename25(f, ".jsonl");
|
|
7833
7833
|
}
|
|
7834
7834
|
} catch {
|
|
@@ -20630,7 +20630,7 @@ var init_http = __esm({
|
|
|
20630
20630
|
CLI_VERSION = JSON.parse(readFileSync37(new URL("../package.json", import.meta.url), "utf-8")).version || CLI_VERSION;
|
|
20631
20631
|
} catch {
|
|
20632
20632
|
try {
|
|
20633
|
-
if (true) CLI_VERSION = "0.5.
|
|
20633
|
+
if (true) CLI_VERSION = "0.5.20";
|
|
20634
20634
|
} catch {
|
|
20635
20635
|
}
|
|
20636
20636
|
}
|
|
@@ -21142,7 +21142,7 @@ var init_telemetry = __esm({
|
|
|
21142
21142
|
init_sync_client();
|
|
21143
21143
|
cliVersion2 = () => {
|
|
21144
21144
|
try {
|
|
21145
|
-
return true ? "0.5.
|
|
21145
|
+
return true ? "0.5.20" : "dev";
|
|
21146
21146
|
} catch {
|
|
21147
21147
|
return "dev";
|
|
21148
21148
|
}
|
|
@@ -21157,14 +21157,18 @@ var auto_update_exports = {};
|
|
|
21157
21157
|
__export(auto_update_exports, {
|
|
21158
21158
|
compareVersions: () => compareVersions,
|
|
21159
21159
|
executeAutoUpdate: () => executeAutoUpdate,
|
|
21160
|
+
installedVersion: () => installedVersion,
|
|
21160
21161
|
isAutoUpdateEnabled: () => isAutoUpdateEnabled,
|
|
21162
|
+
newerOf: () => newerOf,
|
|
21161
21163
|
planAutoUpdate: () => planAutoUpdate,
|
|
21162
21164
|
runAutoUpdate: () => runAutoUpdate,
|
|
21163
21165
|
tarballUrl: () => tarballUrl
|
|
21164
21166
|
});
|
|
21165
21167
|
import { execSync as execSync4 } from "node:child_process";
|
|
21168
|
+
import { readFileSync as readFileSync38 } from "node:fs";
|
|
21169
|
+
import { fileURLToPath as fileURLToPath2 } from "node:url";
|
|
21166
21170
|
import { writeFileSync as writeFileSync9, mkdtempSync as mkdtempSync3 } from "node:fs";
|
|
21167
|
-
import { join as join48 } from "node:path";
|
|
21171
|
+
import { join as join48, dirname as dirname18 } from "node:path";
|
|
21168
21172
|
import { tmpdir as tmpdir2 } from "node:os";
|
|
21169
21173
|
import { createHash as createHash13 } from "node:crypto";
|
|
21170
21174
|
function compareVersions(a, b) {
|
|
@@ -21181,6 +21185,20 @@ function isAutoUpdateEnabled(_edition, flag) {
|
|
|
21181
21185
|
if (flag === "1" || flag === "true" || flag === "on") return true;
|
|
21182
21186
|
return true;
|
|
21183
21187
|
}
|
|
21188
|
+
function newerOf(a, b) {
|
|
21189
|
+
if (!b) return a;
|
|
21190
|
+
if (!a) return b;
|
|
21191
|
+
return compareVersions(a, b) >= 0 ? a : b;
|
|
21192
|
+
}
|
|
21193
|
+
function installedVersion() {
|
|
21194
|
+
try {
|
|
21195
|
+
const here = dirname18(fileURLToPath2(import.meta.url));
|
|
21196
|
+
const raw = readFileSync38(join48(here, "..", "package.json"), "utf-8");
|
|
21197
|
+
return JSON.parse(raw).version || null;
|
|
21198
|
+
} catch {
|
|
21199
|
+
return null;
|
|
21200
|
+
}
|
|
21201
|
+
}
|
|
21184
21202
|
function planAutoUpdate(base, caps, ownVersion2, flag) {
|
|
21185
21203
|
const rel = caps.cli;
|
|
21186
21204
|
if (!rel || !rel.version || !rel.sha256) return { update: false, reason: "server advertises no CLI release" };
|
|
@@ -21238,7 +21256,8 @@ async function runAutoUpdate(base, authHeaders, ownVersion2, deps) {
|
|
|
21238
21256
|
} catch (e) {
|
|
21239
21257
|
return { updated: false, reason: `capabilities unreachable: ${e instanceof Error ? e.message : e}` };
|
|
21240
21258
|
}
|
|
21241
|
-
const
|
|
21259
|
+
const effectiveOwn = newerOf(ownVersion2, installedVersion());
|
|
21260
|
+
const plan = planAutoUpdate(base, caps, effectiveOwn, process.env.CHAT_RECALL_AUTO_UPDATE);
|
|
21242
21261
|
if (!plan.update) return { updated: false, reason: plan.reason };
|
|
21243
21262
|
const result = await executeAutoUpdate(plan, {
|
|
21244
21263
|
download: deps?.download ?? realDownload,
|
|
@@ -21290,11 +21309,11 @@ __export(sync_client_exports, {
|
|
|
21290
21309
|
syncIncremental: () => syncIncremental,
|
|
21291
21310
|
syncSessions: () => syncSessions
|
|
21292
21311
|
});
|
|
21293
|
-
import { join as join49, dirname as
|
|
21294
|
-
import { readFileSync as
|
|
21312
|
+
import { join as join49, dirname as dirname19, basename as basename23 } from "node:path";
|
|
21313
|
+
import { readFileSync as readFileSync39, writeFileSync as writeFileSync10, mkdirSync as mkdirSync11, mkdtempSync as mkdtempSync4, rmSync as rmSync5, chmodSync as chmodSync5, unlinkSync as unlinkSync3, readdirSync as readdirSync32, statSync as statSync41 } from "node:fs";
|
|
21295
21314
|
import { tmpdir as tmpdir3, hostname as hostname2 } from "node:os";
|
|
21296
21315
|
import { createHash as createHash14 } from "node:crypto";
|
|
21297
|
-
import { fileURLToPath as
|
|
21316
|
+
import { fileURLToPath as fileURLToPath3 } from "node:url";
|
|
21298
21317
|
import { gzipSync as gzipSync3 } from "zlib";
|
|
21299
21318
|
function classifyError(msg) {
|
|
21300
21319
|
const m = msg.toLowerCase();
|
|
@@ -21311,7 +21330,7 @@ function classifyError(msg) {
|
|
|
21311
21330
|
}
|
|
21312
21331
|
function saveCredentials(c) {
|
|
21313
21332
|
assertTransportSafe(c.serverUrl);
|
|
21314
|
-
mkdirSync11(
|
|
21333
|
+
mkdirSync11(dirname19(credPath()), { recursive: true });
|
|
21315
21334
|
const targets = loadAllCredentials().filter((t) => t.serverUrl !== c.serverUrl);
|
|
21316
21335
|
targets.unshift(c);
|
|
21317
21336
|
writeFileSync10(credPath(), JSON.stringify({ targets }, null, 2));
|
|
@@ -21331,7 +21350,7 @@ function loadAllCredentials() {
|
|
|
21331
21350
|
const fromEnv = envCredentials();
|
|
21332
21351
|
if (fromEnv) return [{ serverUrl: fromEnv.serverUrl, token: fromEnv.token }];
|
|
21333
21352
|
try {
|
|
21334
|
-
const parsed = JSON.parse(
|
|
21353
|
+
const parsed = JSON.parse(readFileSync39(credPath(), "utf-8"));
|
|
21335
21354
|
if (Array.isArray(parsed?.targets)) return parsed.targets.filter((t) => t?.serverUrl).map((t) => ({ serverUrl: t.serverUrl, token: t.token || "" }));
|
|
21336
21355
|
if (parsed?.serverUrl) return [{ serverUrl: parsed.serverUrl, token: parsed.token || "" }];
|
|
21337
21356
|
} catch {
|
|
@@ -21397,7 +21416,7 @@ function syncConfigCachePath() {
|
|
|
21397
21416
|
}
|
|
21398
21417
|
function readPersistedSyncConfigs() {
|
|
21399
21418
|
try {
|
|
21400
|
-
return JSON.parse(
|
|
21419
|
+
return JSON.parse(readFileSync39(syncConfigCachePath(), "utf-8"));
|
|
21401
21420
|
} catch {
|
|
21402
21421
|
return {};
|
|
21403
21422
|
}
|
|
@@ -21406,7 +21425,7 @@ function persistSyncConfig(base, config2) {
|
|
|
21406
21425
|
try {
|
|
21407
21426
|
const all = readPersistedSyncConfigs();
|
|
21408
21427
|
all[base] = { fetchedAt: Date.now(), config: config2 };
|
|
21409
|
-
mkdirSync11(
|
|
21428
|
+
mkdirSync11(dirname19(syncConfigCachePath()), { recursive: true });
|
|
21410
21429
|
writeFileSync10(syncConfigCachePath(), JSON.stringify(all, null, 2));
|
|
21411
21430
|
} catch {
|
|
21412
21431
|
}
|
|
@@ -22779,11 +22798,11 @@ var init_sync_client = __esm({
|
|
|
22779
22798
|
init_backends();
|
|
22780
22799
|
ownVersion = "0.0.0";
|
|
22781
22800
|
try {
|
|
22782
|
-
const dir =
|
|
22783
|
-
ownVersion = JSON.parse(
|
|
22801
|
+
const dir = dirname19(fileURLToPath3(import.meta.url));
|
|
22802
|
+
ownVersion = JSON.parse(readFileSync39(join49(dir, "../package.json"), "utf-8")).version || ownVersion;
|
|
22784
22803
|
} catch {
|
|
22785
22804
|
try {
|
|
22786
|
-
if (true) ownVersion = "0.5.
|
|
22805
|
+
if (true) ownVersion = "0.5.20";
|
|
22787
22806
|
} catch {
|
|
22788
22807
|
}
|
|
22789
22808
|
}
|
|
@@ -22814,7 +22833,7 @@ __export(client_events_exports, {
|
|
|
22814
22833
|
isTelemetryEnabled: () => isTelemetryEnabled,
|
|
22815
22834
|
reportClientEvent: () => reportClientEvent2
|
|
22816
22835
|
});
|
|
22817
|
-
import { readFileSync as
|
|
22836
|
+
import { readFileSync as readFileSync40 } from "node:fs";
|
|
22818
22837
|
function scrub(msg) {
|
|
22819
22838
|
if (!msg) return "";
|
|
22820
22839
|
const noHome = msg.replace(/\/(?:home|Users)\/[^/\s]+/g, "~");
|
|
@@ -22867,7 +22886,7 @@ var init_client_events = __esm({
|
|
|
22867
22886
|
init_secret_redactor();
|
|
22868
22887
|
CLI_VERSION2 = "0.0.0";
|
|
22869
22888
|
try {
|
|
22870
|
-
CLI_VERSION2 = JSON.parse(
|
|
22889
|
+
CLI_VERSION2 = JSON.parse(readFileSync40(new URL("../package.json", import.meta.url), "utf-8")).version || CLI_VERSION2;
|
|
22871
22890
|
} catch {
|
|
22872
22891
|
}
|
|
22873
22892
|
}
|
|
@@ -22880,11 +22899,11 @@ __export(update_notice_exports, {
|
|
|
22880
22899
|
refreshUpdateCheck: () => refreshUpdateCheck,
|
|
22881
22900
|
updateNotice: () => updateNotice2
|
|
22882
22901
|
});
|
|
22883
|
-
import { readFileSync as
|
|
22902
|
+
import { readFileSync as readFileSync41, writeFileSync as writeFileSync11 } from "node:fs";
|
|
22884
22903
|
import { join as join50 } from "node:path";
|
|
22885
22904
|
function readCheck() {
|
|
22886
22905
|
try {
|
|
22887
|
-
const c = JSON.parse(
|
|
22906
|
+
const c = JSON.parse(readFileSync41(checkPath(), "utf-8"));
|
|
22888
22907
|
return c && typeof c.serverVersion === "string" ? c : null;
|
|
22889
22908
|
} catch {
|
|
22890
22909
|
return null;
|
|
@@ -22971,7 +22990,7 @@ __export(install_skills_exports, {
|
|
|
22971
22990
|
skillsSourceDir: () => skillsSourceDir,
|
|
22972
22991
|
uninstallSkills: () => uninstallSkills
|
|
22973
22992
|
});
|
|
22974
|
-
import { readdirSync as readdirSync33, existsSync as existsSync47, mkdirSync as mkdirSync12, rmSync as rmSync6, cpSync, writeFileSync as writeFileSync12, readFileSync as
|
|
22993
|
+
import { readdirSync as readdirSync33, existsSync as existsSync47, mkdirSync as mkdirSync12, rmSync as rmSync6, cpSync, writeFileSync as writeFileSync12, readFileSync as readFileSync42, statSync as statSync42, realpathSync as realpathSync4 } from "fs";
|
|
22975
22994
|
import { createHash as createHash15 } from "crypto";
|
|
22976
22995
|
import { join as join51, basename as basename24 } from "path";
|
|
22977
22996
|
function skillsSourceDir() {
|
|
@@ -22979,7 +22998,7 @@ function skillsSourceDir() {
|
|
|
22979
22998
|
}
|
|
22980
22999
|
function version() {
|
|
22981
23000
|
try {
|
|
22982
|
-
return JSON.parse(
|
|
23001
|
+
return JSON.parse(readFileSync42(new URL("../package.json", import.meta.url), "utf-8")).version || "0.0.0";
|
|
22983
23002
|
} catch {
|
|
22984
23003
|
return "0.0.0";
|
|
22985
23004
|
}
|
|
@@ -22990,7 +23009,7 @@ function skillsFingerprint() {
|
|
|
22990
23009
|
for (const name of bundledSkillNames()) {
|
|
22991
23010
|
for (const rel of filesUnder(join51(src, name)).sort()) {
|
|
22992
23011
|
h.update(name + "/" + rel);
|
|
22993
|
-
h.update(
|
|
23012
|
+
h.update(readFileSync42(join51(src, name, rel)));
|
|
22994
23013
|
}
|
|
22995
23014
|
}
|
|
22996
23015
|
return h.digest("hex").slice(0, 12);
|
|
@@ -23125,7 +23144,7 @@ function skillsNeedRefresh() {
|
|
|
23125
23144
|
const marker = join51(t.dir, name, MARKER);
|
|
23126
23145
|
if (!existsSync47(marker)) return true;
|
|
23127
23146
|
try {
|
|
23128
|
-
if (
|
|
23147
|
+
if (readFileSync42(marker, "utf-8").trim() !== cur) return true;
|
|
23129
23148
|
} catch {
|
|
23130
23149
|
return true;
|
|
23131
23150
|
}
|
|
@@ -23144,7 +23163,7 @@ function skillStatus() {
|
|
|
23144
23163
|
if (existsSync47(marker)) {
|
|
23145
23164
|
installed++;
|
|
23146
23165
|
try {
|
|
23147
|
-
ver =
|
|
23166
|
+
ver = readFileSync42(marker, "utf-8").trim();
|
|
23148
23167
|
} catch {
|
|
23149
23168
|
}
|
|
23150
23169
|
}
|
|
@@ -23184,9 +23203,9 @@ import { execSync as execSync5 } from "child_process";
|
|
|
23184
23203
|
import { existsSync as existsSync48, mkdirSync as mkdirSync13, rmSync as rmSync7, writeFileSync as writeFileSync13 } from "fs";
|
|
23185
23204
|
import { homedir as homedir17 } from "os";
|
|
23186
23205
|
import { join as join52 } from "path";
|
|
23187
|
-
import { fileURLToPath as
|
|
23206
|
+
import { fileURLToPath as fileURLToPath4 } from "url";
|
|
23188
23207
|
function resolveDaemonPaths() {
|
|
23189
|
-
const watchJs =
|
|
23208
|
+
const watchJs = fileURLToPath4(new URL("./watch.js", import.meta.url));
|
|
23190
23209
|
const node = process.execPath;
|
|
23191
23210
|
const dataDir = join52(homedir17(), ".chat-recall");
|
|
23192
23211
|
const logFile = join52(dataDir, "watch.log");
|
|
@@ -23392,7 +23411,7 @@ var init_service_installer = __esm({
|
|
|
23392
23411
|
// src/mcp.ts
|
|
23393
23412
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
23394
23413
|
import { spawn as spawn3 } from "child_process";
|
|
23395
|
-
import { fileURLToPath as
|
|
23414
|
+
import { fileURLToPath as fileURLToPath5 } from "node:url";
|
|
23396
23415
|
|
|
23397
23416
|
// ../engine/dist/mcp/tools.js
|
|
23398
23417
|
import { homedir as homedir6 } from "node:os";
|
|
@@ -23530,7 +23549,7 @@ function isMultiTenant() {
|
|
|
23530
23549
|
|
|
23531
23550
|
// ../engine/dist/mcp/tools.js
|
|
23532
23551
|
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
23533
|
-
import { CallToolRequestSchema, ListToolsRequestSchema } from "@modelcontextprotocol/sdk/types.js";
|
|
23552
|
+
import { CallToolRequestSchema, ListToolsRequestSchema, ListResourcesRequestSchema, ListPromptsRequestSchema } from "@modelcontextprotocol/sdk/types.js";
|
|
23534
23553
|
import { z } from "zod";
|
|
23535
23554
|
import { existsSync as existsSync23, readFileSync as readFileSync18, statSync as statSync19 } from "fs";
|
|
23536
23555
|
import { join as join26 } from "path";
|
|
@@ -24331,7 +24350,14 @@ function setServerVersion(version2) {
|
|
|
24331
24350
|
serverVersion = version2;
|
|
24332
24351
|
}
|
|
24333
24352
|
function createMcpServer() {
|
|
24334
|
-
const s = new Server(
|
|
24353
|
+
const s = new Server(
|
|
24354
|
+
{ name: "chat-recall", version: serverVersion },
|
|
24355
|
+
// resources and prompts are declared EMPTY rather than omitted: clients probe
|
|
24356
|
+
// them regardless of what is advertised, and an unregistered method answers
|
|
24357
|
+
// -32601, which every directory scan logs as a failure of a server that is
|
|
24358
|
+
// working correctly. See the handlers in attachHandlers.
|
|
24359
|
+
{ capabilities: { tools: {}, resources: {}, prompts: {} } }
|
|
24360
|
+
);
|
|
24335
24361
|
attachHandlers(s);
|
|
24336
24362
|
return s;
|
|
24337
24363
|
}
|
|
@@ -24455,6 +24481,8 @@ function annotate(t) {
|
|
|
24455
24481
|
};
|
|
24456
24482
|
}
|
|
24457
24483
|
function attachHandlers(server) {
|
|
24484
|
+
server.setRequestHandler(ListResourcesRequestSchema, async () => ({ resources: [] }));
|
|
24485
|
+
server.setRequestHandler(ListPromptsRequestSchema, async () => ({ prompts: [] }));
|
|
24458
24486
|
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
24459
24487
|
const all = [
|
|
24460
24488
|
{
|
|
@@ -24770,7 +24798,7 @@ with recall_show (pass the plan id).`,
|
|
|
24770
24798
|
description: "Filter by source types (default: all)"
|
|
24771
24799
|
},
|
|
24772
24800
|
project_filter: { type: "string", description: "Filter by project path" },
|
|
24773
|
-
provider: { type: "string", enum: ["ollama", "gemini"], default: "ollama" },
|
|
24801
|
+
provider: { type: "string", enum: ["ollama", "gemini"], default: "ollama", description: "Embedding provider, when the server has vector search configured. Ignored on a keyword-only server." },
|
|
24774
24802
|
scope: { type: "string", enum: ["local", "server"], default: "local", description: "server = synced cross-device history (needs chat-recall login)." },
|
|
24775
24803
|
semantic: { type: "boolean", default: false, description: "Reserved and currently ignored: the semantic tier is switched off server-side, so every search runs keyword FTS." }
|
|
24776
24804
|
},
|
|
@@ -24906,7 +24934,7 @@ lets the board verify the work actually shipped.`,
|
|
|
24906
24934
|
type: "object",
|
|
24907
24935
|
properties: {
|
|
24908
24936
|
title: { type: "string", description: "Task title" },
|
|
24909
|
-
description: { type: "string" },
|
|
24937
|
+
description: { type: "string", description: "What the work actually is. The title is the label; this is where the detail a future reader needs belongs." },
|
|
24910
24938
|
project: { type: "string", description: "project_id this task belongs to" },
|
|
24911
24939
|
assignee: { type: "string", description: "Teammate user id (sub) to assign" },
|
|
24912
24940
|
due: { type: "number", description: "Due date, epoch milliseconds. Set one when the work is time-bound; omit otherwise." },
|
|
@@ -24932,7 +24960,7 @@ WORKFLOW \u2014 do this whenever the user asks you to work on a task from the bo
|
|
|
24932
24960
|
id: { type: "string", description: "Task id (t_\u2026)" },
|
|
24933
24961
|
status: { type: "string", enum: [...TASK_STATUS_SETTABLE], description: "Set the card's state. There is no 'rejected' here on purpose: rejecting is the user's verdict, not yours." },
|
|
24934
24962
|
assignee: { type: "string", description: "Reassign to this user id (sub)" },
|
|
24935
|
-
title: { type: "string" },
|
|
24963
|
+
title: { type: "string", description: "Rename the card. Omit to leave the title alone." },
|
|
24936
24964
|
comment: { type: "string", description: "Add a comment" },
|
|
24937
24965
|
linked_session_id: { type: "string", description: "Session id to attach \u2014 pass YOUR OWN current session id when you start working on this task, so the board can check whether the work shipped. Null detaches." }
|
|
24938
24966
|
},
|
|
@@ -24966,7 +24994,7 @@ Use this to VERIFY facts before asserting them.`,
|
|
|
24966
24994
|
properties: {
|
|
24967
24995
|
entity: { type: "string", description: 'Entity to query (e.g., "Alice", "chat-recall")' },
|
|
24968
24996
|
as_of: { type: "string", description: "Date filter (YYYY-MM-DD, optional)" },
|
|
24969
|
-
direction: { type: "string", enum: ["outgoing", "incoming", "both"], default: "both" }
|
|
24997
|
+
direction: { type: "string", enum: ["outgoing", "incoming", "both"], default: "both", description: "Which edges to follow: facts where the entity is the subject (outgoing), the object (incoming), or both." }
|
|
24970
24998
|
},
|
|
24971
24999
|
required: ["entity"]
|
|
24972
25000
|
}
|
|
@@ -25179,8 +25207,8 @@ I asking yesterday?" or "what did I tell the agent in this session?".`,
|
|
|
25179
25207
|
type: "object",
|
|
25180
25208
|
properties: {
|
|
25181
25209
|
session_id: { type: "string", description: "If set, only that session's prompts" },
|
|
25182
|
-
since_days: { type: "number", default: 7 },
|
|
25183
|
-
limit: { type: "number", default: 50 }
|
|
25210
|
+
since_days: { type: "number", default: 7, description: "How far back to look, in days." },
|
|
25211
|
+
limit: { type: "number", default: 50, description: "Maximum prompts to return, newest first." }
|
|
25184
25212
|
}
|
|
25185
25213
|
}
|
|
25186
25214
|
},
|
|
@@ -25195,9 +25223,9 @@ something non-obvious that future sessions should remember.`,
|
|
|
25195
25223
|
subject: { type: "string", description: "What the decision is about" },
|
|
25196
25224
|
decision: { type: "string", description: "The decision itself" },
|
|
25197
25225
|
reason: { type: "string", description: "Why this was decided" },
|
|
25198
|
-
importance: { type: "number", minimum: 1, maximum: 5, default: 4 },
|
|
25199
|
-
session_id: { type: "string" },
|
|
25200
|
-
agent_name: { type: "string", default: "agent" }
|
|
25226
|
+
importance: { type: "number", minimum: 1, maximum: 5, default: 4, description: "1-5. Only 4 and 5 surface in the wake-up bundle, so reserve those for decisions a future session must not miss." },
|
|
25227
|
+
session_id: { type: "string", description: "Session this decision came out of. Pass your own current session id so the decision can be traced back to the conversation that made it." },
|
|
25228
|
+
agent_name: { type: "string", default: "agent", description: "Which agent is recording this, so diary entries stay separable per agent." }
|
|
25201
25229
|
},
|
|
25202
25230
|
required: ["subject", "decision"]
|
|
25203
25231
|
}
|
|
@@ -25226,9 +25254,9 @@ the start of a session to "remember who you are and what's true right now".`,
|
|
|
25226
25254
|
inputSchema: {
|
|
25227
25255
|
type: "object",
|
|
25228
25256
|
properties: {
|
|
25229
|
-
max_facts: { type: "number", default: 10 },
|
|
25230
|
-
max_kg_facts: { type: "number", default: 15 },
|
|
25231
|
-
identity: { type: "string" },
|
|
25257
|
+
max_facts: { type: "number", default: 10, description: "How many high-importance classifier facts to include." },
|
|
25258
|
+
max_kg_facts: { type: "number", default: 15, description: "How many current knowledge-graph facts to include." },
|
|
25259
|
+
identity: { type: "string", description: "Override the identity line at the top of the bundle. Defaults to ~/.chat-recall/identity.txt when present." },
|
|
25232
25260
|
project_filter: { type: "string", description: "Scope facts, KG entities and the task count to a project (substring match). Without it, facts are global." },
|
|
25233
25261
|
project: { type: "string", description: "Alias for project_filter \u2014 the name every sibling tool uses." }
|
|
25234
25262
|
}
|
|
@@ -25608,9 +25636,10 @@ Complements recall_memory_search: search finds candidates, this reads the specif
|
|
|
25608
25636
|
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
25609
25637
|
const result = await dispatchTool(request);
|
|
25610
25638
|
try {
|
|
25611
|
-
const
|
|
25612
|
-
const
|
|
25613
|
-
const
|
|
25639
|
+
const local = !isMultiTenant();
|
|
25640
|
+
const reported = local ? readCollectorHealth() : null;
|
|
25641
|
+
const health = local ? judgeHealth(reported) : { ok: true, summary: "" };
|
|
25642
|
+
const progress = local ? progressLine(reported) : null;
|
|
25614
25643
|
const state2 = await syncState();
|
|
25615
25644
|
const banners = [
|
|
25616
25645
|
health.ok ? null : `\u26A0 ${health.summary} Recent work may be missing from these answers. Tell the user, and suggest \`chat-recall doctor\`.`,
|
|
@@ -27866,9 +27895,9 @@ function openBrowser(url) {
|
|
|
27866
27895
|
// src/mcp.ts
|
|
27867
27896
|
init_client_events();
|
|
27868
27897
|
init_update_notice();
|
|
27869
|
-
import { readFileSync as
|
|
27898
|
+
import { readFileSync as readFileSync43 } from "node:fs";
|
|
27870
27899
|
setServerVersion(JSON.parse(
|
|
27871
|
-
|
|
27900
|
+
readFileSync43(new URL("../package.json", import.meta.url), "utf-8")
|
|
27872
27901
|
).version);
|
|
27873
27902
|
setEventReporter(reportClientEvent2);
|
|
27874
27903
|
setIndexRunner(runIndexChild2);
|
|
@@ -27887,7 +27916,7 @@ function startLoginChild(server) {
|
|
|
27887
27916
|
return new Promise((resolve3, reject) => {
|
|
27888
27917
|
let cliPath;
|
|
27889
27918
|
try {
|
|
27890
|
-
cliPath =
|
|
27919
|
+
cliPath = fileURLToPath5(new URL("./cli.js", import.meta.url));
|
|
27891
27920
|
} catch {
|
|
27892
27921
|
reject(new Error("could not locate the CLI entry point"));
|
|
27893
27922
|
return;
|
|
@@ -27938,7 +27967,7 @@ function runIndexChild2(force) {
|
|
|
27938
27967
|
return new Promise((resolve3) => {
|
|
27939
27968
|
let cliPath;
|
|
27940
27969
|
try {
|
|
27941
|
-
cliPath =
|
|
27970
|
+
cliPath = fileURLToPath5(new URL("./cli.js", import.meta.url));
|
|
27942
27971
|
} catch {
|
|
27943
27972
|
resolve3("Index unavailable: could not locate the CLI entry point.");
|
|
27944
27973
|
return;
|