chat-recall 0.5.8 → 0.5.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.
@@ -1 +1 @@
1
- {"version":3,"file":"intent-drain.d.ts","sourceRoot":"","sources":["../src/intent-drain.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AA+DH,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAmDD;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,WAAW,CAAC,CA4D7F"}
1
+ {"version":3,"file":"intent-drain.d.ts","sourceRoot":"","sources":["../src/intent-drain.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AA+DH,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAoHD;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,WAAW,CAAC,CA6D7F"}
@@ -68,6 +68,59 @@ function applyCodeRecommendation(intent) {
68
68
  }
69
69
  }
70
70
  /** Run one intent and return the (status, result-json) to ack with. */
71
+ /**
72
+ * Install what the account holds onto THIS machine, from one server.
73
+ *
74
+ * Fetches the toolkit inventory and hands it to the engine's executor. Only an
75
+ * inventory travels, so what can actually be rebuilt is decided there — see
76
+ * toolkit-pull.ts. A type the server cannot reconstruct is reported, never
77
+ * silently dropped.
78
+ */
79
+ async function runPull(base, opts) {
80
+ const { executePull } = await import('@chat-recall/engine/core/toolkit-pull.js');
81
+ const { hostname } = await import('node:os');
82
+ const creds = loadAllCredentials().find((c) => c.serverUrl.replace(/\/+$/, '') === base.replace(/\/+$/, ''));
83
+ const headers = creds?.token ? { authorization: `Bearer ${creds.token}` } : {};
84
+ const wanted = opts.types?.length ? opts.types : ['mcp', 'skill', 'command', 'agent', 'instructions'];
85
+ const rows = [];
86
+ for (const type of wanted) {
87
+ try {
88
+ const res = await fetchWithTimeout(`${base}/api/toolkit/browse/${type}?limit=1000`, { headers });
89
+ if (!res.ok)
90
+ continue;
91
+ const body = (await res.json());
92
+ for (const it of body.items || [])
93
+ rows.push(it);
94
+ }
95
+ catch { /* one type failing must not abort the rest */ }
96
+ }
97
+ const filtered = opts.name
98
+ ? rows.filter((r) => {
99
+ try {
100
+ return (JSON.parse(r.extra_json || '{}').mcpName || r.title) === opts.name;
101
+ }
102
+ catch {
103
+ return r.title === opts.name;
104
+ }
105
+ })
106
+ : rows;
107
+ const report = executePull(filtered, { thisDeviceId: hostname(), types: wanted });
108
+ const written = report.outcomes.filter((o) => o.status === 'written');
109
+ const failed = report.outcomes.filter((o) => o.status === 'failed');
110
+ return {
111
+ // A skip is a reported outcome, not a failure — the artifact genuinely
112
+ // cannot be installed here and the reason travels back with the ack.
113
+ status: failed.length > 0 ? 'error' : 'done',
114
+ result: JSON.stringify({
115
+ installed: written.length,
116
+ present: report.outcomes.filter((o) => o.status === 'present').length,
117
+ skipped: report.outcomes.filter((o) => o.status === 'skipped').map((o) => `${o.name}: ${o.reason}`).slice(0, 20),
118
+ failed: failed.map((o) => `${o.name}: ${o.reason}`).slice(0, 20),
119
+ needsEnv: [...new Set(written.flatMap((o) => o.needsEnv || []))],
120
+ unsupported: report.unsupported,
121
+ }),
122
+ };
123
+ }
71
124
  async function runIntent(intent, ctx) {
72
125
  try {
73
126
  if (intent.kind === 'recheck_session') {
@@ -85,6 +138,18 @@ async function runIntent(intent, ctx) {
85
138
  if (intent.kind === 'code_apply') {
86
139
  return applyCodeRecommendation(intent);
87
140
  }
141
+ if (intent.kind === 'pull') {
142
+ // CROSS-DEVICE. `sync_all` copies between tools on THIS disk; `pull`
143
+ // installs what the account has, sourced from the server — the only
144
+ // kind that can set up a machine that has nothing yet.
145
+ const types = (intent.artifact_type || '')
146
+ .split(',').map((t) => t.trim()).filter(Boolean);
147
+ const r = await runPull(ctx.base, {
148
+ types: types.length ? types : undefined,
149
+ name: intent.name || undefined,
150
+ });
151
+ return r;
152
+ }
88
153
  if (intent.kind === 'sync_all') {
89
154
  const report = await executeSyncAll();
90
155
  const status = report.failed.length > 0 ? 'error' : 'done';
@@ -155,8 +220,9 @@ export async function drainSyncIntents(opts = {}) {
155
220
  out.errored++;
156
221
  if (opts.verbose) {
157
222
  const label = intent.kind === 'sync_all' ? 'sync_all'
158
- : intent.kind === 'recheck_session' ? `recheck ${intent.name}`
159
- : `${intent.artifact_type} "${intent.name}" ${intent.from_tool}→${intent.to_tool}`;
223
+ : intent.kind === 'pull' ? `pull ${intent.artifact_type || 'all'}${intent.name ? ` "${intent.name}"` : ''}`
224
+ : intent.kind === 'recheck_session' ? `recheck ${intent.name}`
225
+ : `${intent.artifact_type} "${intent.name}" ${intent.from_tool}→${intent.to_tool}`;
160
226
  console.error(`[sync-intent] ${label}: ${status}`);
161
227
  }
162
228
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"intent-drain.js","sourceRoot":"","sources":["../src/intent-drain.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"intent-drain.js","sourceRoot":"","sources":["../src/intent-drain.ts"],"names":[],"mappings":"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"}
package/dist/mcp.js CHANGED
@@ -17390,10 +17390,55 @@ var init_diary_source = __esm({
17390
17390
  }
17391
17391
  });
17392
17392
 
17393
+ // ../engine/dist/core/redact-inline.js
17394
+ function redactInlineSecrets(value) {
17395
+ let redacted = false;
17396
+ let out = value;
17397
+ out = out.replace(/(\w+:\/\/[^:/@\s]+:)([^@\s]{1,512})(@)/g, (_m, head, _pw, tail) => {
17398
+ redacted = true;
17399
+ return `${head}__SECRET_NOT_SYNCED__${tail}`;
17400
+ });
17401
+ const tokenShapes = [
17402
+ /\bsk-[A-Za-z0-9_-]{16,}\b/g,
17403
+ // OpenAI-style
17404
+ /\bgh[pousr]_[A-Za-z0-9]{16,}\b/g,
17405
+ // GitHub
17406
+ /\bAIza[0-9A-Za-z_-]{20,}\b/g,
17407
+ // Google
17408
+ /\bxox[baprs]-[A-Za-z0-9-]{10,}\b/g
17409
+ // Slack
17410
+ ];
17411
+ for (const re of tokenShapes) {
17412
+ out = out.replace(re, () => {
17413
+ redacted = true;
17414
+ return "__SECRET_NOT_SYNCED__";
17415
+ });
17416
+ }
17417
+ return { text: out, redacted };
17418
+ }
17419
+ var init_redact_inline = __esm({
17420
+ "../engine/dist/core/redact-inline.js"() {
17421
+ "use strict";
17422
+ }
17423
+ });
17424
+
17393
17425
  // ../engine/dist/parsers/skills-source.js
17394
17426
  import { existsSync as existsSync36, readdirSync as readdirSync26, readFileSync as readFileSync25, statSync as statSync31 } from "fs";
17395
17427
  import { homedir as homedir12 } from "os";
17396
17428
  import { join as join35 } from "path";
17429
+ function rebuildBody(content) {
17430
+ const { text, redacted } = redactInlineSecrets(content);
17431
+ const out = {};
17432
+ if (text.length > MAX_BODY_CHARS) {
17433
+ out.body = text.slice(0, MAX_BODY_CHARS);
17434
+ out.bodyTruncated = true;
17435
+ } else {
17436
+ out.body = text;
17437
+ }
17438
+ if (redacted)
17439
+ out.bodySecretsRedacted = true;
17440
+ return out;
17441
+ }
17397
17442
  function resolveRoots() {
17398
17443
  const home = homedir12();
17399
17444
  const all = [];
@@ -17437,7 +17482,7 @@ function parseFrontmatter3(text) {
17437
17482
  }
17438
17483
  return out;
17439
17484
  }
17440
- var MAX_CHUNK_CHARS12, SkillsSource;
17485
+ var MAX_CHUNK_CHARS12, MAX_BODY_CHARS, SkillsSource;
17441
17486
  var init_skills_source = __esm({
17442
17487
  "../engine/dist/parsers/skills-source.js"() {
17443
17488
  "use strict";
@@ -17446,7 +17491,9 @@ var init_skills_source = __esm({
17446
17491
  init_codex2();
17447
17492
  init_tool_paths();
17448
17493
  init_settings();
17494
+ init_redact_inline();
17449
17495
  MAX_CHUNK_CHARS12 = 2e3;
17496
+ MAX_BODY_CHARS = 512 * 1024;
17450
17497
  SkillsSource = class {
17451
17498
  sourceType = "skill";
17452
17499
  async *discover() {
@@ -17524,7 +17571,10 @@ var init_skills_source = __esm({
17524
17571
  skillName,
17525
17572
  description: fm.description || "",
17526
17573
  skillDir,
17527
- subdirs
17574
+ subdirs,
17575
+ // The whole file, so another machine can rebuild this skill. The
17576
+ // search chunk below stays capped at 2000 chars; this does not.
17577
+ ...rebuildBody(content)
17528
17578
  };
17529
17579
  if (root.readonly || pluginName !== void 0)
17530
17580
  extra.readonly = true;
@@ -17597,31 +17647,6 @@ function commandPreview(cfg) {
17597
17647
  }
17598
17648
  return "";
17599
17649
  }
17600
- function redactInlineSecrets(value) {
17601
- let redacted = false;
17602
- let out = value;
17603
- out = out.replace(/(\w+:\/\/[^:/@\s]+:)([^@\s]{1,512})(@)/g, (_m, head, _pw, tail) => {
17604
- redacted = true;
17605
- return `${head}__SECRET_NOT_SYNCED__${tail}`;
17606
- });
17607
- const tokenShapes = [
17608
- /\bsk-[A-Za-z0-9_-]{16,}\b/g,
17609
- // OpenAI-style
17610
- /\bgh[pousr]_[A-Za-z0-9]{16,}\b/g,
17611
- // GitHub
17612
- /\bAIza[0-9A-Za-z_-]{20,}\b/g,
17613
- // Google
17614
- /\bxox[baprs]-[A-Za-z0-9-]{10,}\b/g
17615
- // Slack
17616
- ];
17617
- for (const re of tokenShapes) {
17618
- out = out.replace(re, () => {
17619
- redacted = true;
17620
- return "__SECRET_NOT_SYNCED__";
17621
- });
17622
- }
17623
- return { text: out, redacted };
17624
- }
17625
17650
  function reconstructionSpec(cfg) {
17626
17651
  const out = {
17627
17652
  type: cfg.type || (cfg.url ? "remote" : "local"),
@@ -17658,6 +17683,7 @@ var init_mcps_source = __esm({
17658
17683
  init_codex2();
17659
17684
  init_settings();
17660
17685
  init_tool_paths();
17686
+ init_redact_inline();
17661
17687
  McpsSource = class {
17662
17688
  sourceType = "mcp";
17663
17689
  async *discover() {
@@ -17919,6 +17945,19 @@ var init_toolkit_format = __esm({
17919
17945
  // ../engine/dist/parsers/slash-commands-source.js
17920
17946
  import { existsSync as existsSync38, readdirSync as readdirSync28, readFileSync as readFileSync27, statSync as statSync33 } from "fs";
17921
17947
  import { join as join37, basename as basename20 } from "path";
17948
+ function rebuildBody2(content) {
17949
+ const { text, redacted } = redactInlineSecrets(content);
17950
+ const out = {};
17951
+ if (text.length > MAX_BODY_CHARS2) {
17952
+ out.body = text.slice(0, MAX_BODY_CHARS2);
17953
+ out.bodyTruncated = true;
17954
+ } else {
17955
+ out.body = text;
17956
+ }
17957
+ if (redacted)
17958
+ out.bodySecretsRedacted = true;
17959
+ return out;
17960
+ }
17922
17961
  function parseCommand(content, fallbackName, format) {
17923
17962
  if (format === "toml") {
17924
17963
  const t = parseScalarToml(content);
@@ -17935,7 +17974,7 @@ function parseCommand(content, fallbackName, format) {
17935
17974
  body: body.trim()
17936
17975
  };
17937
17976
  }
17938
- var MAX_CHUNK_CHARS13, SlashCommandsSource;
17977
+ var MAX_CHUNK_CHARS13, MAX_BODY_CHARS2, SlashCommandsSource;
17939
17978
  var init_slash_commands_source = __esm({
17940
17979
  "../engine/dist/parsers/slash-commands-source.js"() {
17941
17980
  "use strict";
@@ -17947,7 +17986,9 @@ var init_slash_commands_source = __esm({
17947
17986
  init_tool_paths();
17948
17987
  init_toolkit_format();
17949
17988
  init_project_dir_name();
17989
+ init_redact_inline();
17950
17990
  MAX_CHUNK_CHARS13 = 2e3;
17991
+ MAX_BODY_CHARS2 = 512 * 1024;
17951
17992
  SlashCommandsSource = class {
17952
17993
  sourceType = "command";
17953
17994
  roots() {
@@ -18011,7 +18052,10 @@ var init_slash_commands_source = __esm({
18011
18052
  commandName: parsed.name,
18012
18053
  description: parsed.description,
18013
18054
  scope: root.scope,
18014
- format: root.format
18055
+ format: root.format,
18056
+ // The whole file, so another machine can rebuild it. The search
18057
+ // chunk stays capped at 2000 chars; this does not.
18058
+ ...rebuildBody2(content)
18015
18059
  }
18016
18060
  };
18017
18061
  } catch {
@@ -18047,6 +18091,19 @@ var init_slash_commands_source = __esm({
18047
18091
  // ../engine/dist/parsers/subagents-source.js
18048
18092
  import { existsSync as existsSync39, readdirSync as readdirSync29, readFileSync as readFileSync28, statSync as statSync34 } from "fs";
18049
18093
  import { join as join38, basename as basename21 } from "path";
18094
+ function rebuildBody3(content) {
18095
+ const { text, redacted } = redactInlineSecrets(content);
18096
+ const out = {};
18097
+ if (text.length > MAX_BODY_CHARS3) {
18098
+ out.body = text.slice(0, MAX_BODY_CHARS3);
18099
+ out.bodyTruncated = true;
18100
+ } else {
18101
+ out.body = text;
18102
+ }
18103
+ if (redacted)
18104
+ out.bodySecretsRedacted = true;
18105
+ return out;
18106
+ }
18050
18107
  function parseAgent(content, fallbackName, format) {
18051
18108
  if (format === "toml") {
18052
18109
  const t = parseScalarToml(content);
@@ -18065,7 +18122,7 @@ function parseAgent(content, fallbackName, format) {
18065
18122
  body: body.trim()
18066
18123
  };
18067
18124
  }
18068
- var MAX_CHUNK_CHARS14, SubagentsSource;
18125
+ var MAX_CHUNK_CHARS14, MAX_BODY_CHARS3, SubagentsSource;
18069
18126
  var init_subagents_source = __esm({
18070
18127
  "../engine/dist/parsers/subagents-source.js"() {
18071
18128
  "use strict";
@@ -18077,7 +18134,9 @@ var init_subagents_source = __esm({
18077
18134
  init_tool_paths();
18078
18135
  init_toolkit_format();
18079
18136
  init_project_dir_name();
18137
+ init_redact_inline();
18080
18138
  MAX_CHUNK_CHARS14 = 2e3;
18139
+ MAX_BODY_CHARS3 = 512 * 1024;
18081
18140
  SubagentsSource = class {
18082
18141
  sourceType = "agent";
18083
18142
  roots() {
@@ -18142,7 +18201,10 @@ var init_subagents_source = __esm({
18142
18201
  description: parsed.description,
18143
18202
  tools: parsed.tools,
18144
18203
  scope: root.scope,
18145
- format: root.format
18204
+ format: root.format,
18205
+ // The whole file, so another machine can rebuild it. The search
18206
+ // chunk stays capped at 2000 chars; this does not.
18207
+ ...rebuildBody3(content)
18146
18208
  }
18147
18209
  };
18148
18210
  } catch {
@@ -18531,6 +18593,9 @@ var init_all_sources = __esm({
18531
18593
  });
18532
18594
 
18533
18595
  // ../engine/dist/core/extractor-version.js
18596
+ function extractorVersionForItem(id, sourceType) {
18597
+ return extractorVersionForTool(toolOfId(id)) + (ITEM_SOURCE_BUMP[sourceType] ?? 0);
18598
+ }
18534
18599
  function toolOfId(id) {
18535
18600
  if (id.startsWith("agy_"))
18536
18601
  return "agy";
@@ -18550,11 +18615,17 @@ function extractorVersionForTool(tool) {
18550
18615
  function extractorVersionForId(id) {
18551
18616
  return extractorVersionForTool(toolOfId(id));
18552
18617
  }
18553
- var BASE_EXTRACTOR_VERSION, TOOL_EXTRACTOR_BUMP, EXTRACTOR_VERSION;
18618
+ var BASE_EXTRACTOR_VERSION, ITEM_SOURCE_BUMP, TOOL_EXTRACTOR_BUMP, EXTRACTOR_VERSION;
18554
18619
  var init_extractor_version = __esm({
18555
18620
  "../engine/dist/core/extractor-version.js"() {
18556
18621
  "use strict";
18557
18622
  BASE_EXTRACTOR_VERSION = 2;
18623
+ ITEM_SOURCE_BUMP = {
18624
+ mcp: 1,
18625
+ skill: 1,
18626
+ agent: 1,
18627
+ command: 1
18628
+ };
18558
18629
  TOOL_EXTRACTOR_BUMP = {
18559
18630
  agy: 2,
18560
18631
  claude: 1,
@@ -18935,7 +19006,7 @@ var init_http = __esm({
18935
19006
  CLI_VERSION = JSON.parse(readFileSync33(new URL("../package.json", import.meta.url), "utf-8")).version || CLI_VERSION;
18936
19007
  } catch {
18937
19008
  try {
18938
- if (true) CLI_VERSION = "0.5.8";
19009
+ if (true) CLI_VERSION = "0.5.10";
18939
19010
  } catch {
18940
19011
  }
18941
19012
  }
@@ -19447,7 +19518,7 @@ var init_telemetry = __esm({
19447
19518
  init_sync_client();
19448
19519
  cliVersion2 = () => {
19449
19520
  try {
19450
- return true ? "0.5.8" : "dev";
19521
+ return true ? "0.5.10" : "dev";
19451
19522
  } catch {
19452
19523
  return "dev";
19453
19524
  }
@@ -20611,6 +20682,7 @@ async function syncToTargetInScope(cred, opts = {}) {
20611
20682
  }
20612
20683
  const itemVersions = loadItemVersions(base);
20613
20684
  const seenTools = /* @__PURE__ */ new Set();
20685
+ const seenItemKeys = /* @__PURE__ */ new Map();
20614
20686
  const registry = buildSourceRegistry();
20615
20687
  for (const sourceType of registry.getRegisteredTypes()) {
20616
20688
  if (sourceType === "session") continue;
@@ -20625,7 +20697,9 @@ async function syncToTargetInScope(cred, opts = {}) {
20625
20697
  for await (const item of discovered) {
20626
20698
  const itemTool = toolOfId(item.id);
20627
20699
  seenTools.add(itemTool);
20628
- const versionStale = (itemVersions[itemTool] ?? EXTRACTOR_VERSION) < extractorVersionForId(item.id);
20700
+ const itemKey = `${itemTool}:${item.sourceType}`;
20701
+ seenItemKeys.set(itemKey, extractorVersionForItem(item.id, item.sourceType));
20702
+ const versionStale = (itemVersions[itemKey] ?? EXTRACTOR_VERSION) < extractorVersionForItem(item.id, item.sourceType);
20629
20703
  if ((item.mtime || 0) < (opts.sinceMs ?? 0) && !versionStale) continue;
20630
20704
  if (excluded(item.projectPath || "")) continue;
20631
20705
  if (!includedProject(item.projectPath || "")) continue;
@@ -20708,6 +20782,7 @@ async function syncToTargetInScope(cred, opts = {}) {
20708
20782
  try {
20709
20783
  const rec = {};
20710
20784
  for (const t of seenTools) rec[t] = extractorVersionForTool(t);
20785
+ for (const [k, v] of seenItemKeys) rec[k] = v;
20711
20786
  saveItemVersions(base, rec);
20712
20787
  } catch {
20713
20788
  }
@@ -21147,7 +21222,7 @@ var init_sync_client = __esm({
21147
21222
  ownVersion = JSON.parse(readFileSync35(join45(dir, "../package.json"), "utf-8")).version || ownVersion;
21148
21223
  } catch {
21149
21224
  try {
21150
- if (true) ownVersion = "0.5.8";
21225
+ if (true) ownVersion = "0.5.10";
21151
21226
  } catch {
21152
21227
  }
21153
21228
  }
@@ -23537,7 +23612,7 @@ var RecallMemorySearchSchema = z.object({
23537
23612
  top_k: z.number().optional().default(10).describe("Number of results"),
23538
23613
  source_types: z.array(z.enum(["session", "plan", "task", "claude_md", "paste", "history", "diary"])).optional().describe("Filter by source types (default: all)"),
23539
23614
  project_filter: z.string().optional().describe("Filter by project path"),
23540
- semantic: z.boolean().optional().default(false).describe("Run the pgvector semantic tier as well as keyword FTS (needs an embedder configured server-side; ignored otherwise).")
23615
+ semantic: z.boolean().optional().default(false).describe("Reserved and currently ignored: the semantic tier is switched off server-side, so every search runs keyword FTS.")
23541
23616
  });
23542
23617
  var RecallSmartResumeSchema = z.object({
23543
23618
  session_id: z.string().describe("Session ID to get smart resume context for")
@@ -23739,6 +23814,16 @@ var RecallSecurityDismissSchema = z.object({
23739
23814
  status: z.enum(["rotated", "false_positive", "dismissed", "undismissed"]).describe("Why this finding is no longer actionable \u2014 or `undismissed` to put it BACK on the action-required list (the inverse this tool was missing)."),
23740
23815
  reason: z.string().optional().describe("Optional note")
23741
23816
  });
23817
+ var TOOLKIT_TYPES = ["mcp", "skill", "command", "agent", "instructions"];
23818
+ var RecallToolkitStatusSchema = z.object({
23819
+ type: z.enum(TOOLKIT_TYPES).optional().describe("Restrict to one artifact type. Omit for every type.")
23820
+ });
23821
+ var RecallToolkitSyncSchema = z.object({
23822
+ types: z.array(z.enum(TOOLKIT_TYPES)).optional().describe("Which artifact types to install. Omit for all of them."),
23823
+ name: z.string().optional().describe("Install ONE named artifact. Requires exactly one entry in `types`."),
23824
+ device: z.string().optional().describe("Hostname of the machine to install on. Omit to target EVERY device on the account."),
23825
+ scope: z.enum(["pull", "fan_out"]).optional().default("pull").describe("pull = install what the account has onto the device(s), from the server (cross-device). fan_out = copy what a device already has between its own tools (single-machine).")
23826
+ });
23742
23827
  var RecallSecurityRulesSchema = z.object({
23743
23828
  action: z.enum(["list", "test"]).optional().default("list").describe("list = return tenant rules; test = try a regex against sample text (does not persist)"),
23744
23829
  name: z.string().optional().describe("For test: rule name"),
@@ -24121,7 +24206,7 @@ with recall_show (pass the plan id).`,
24121
24206
  project_filter: { type: "string", description: "Filter by project path" },
24122
24207
  provider: { type: "string", enum: ["ollama", "gemini"], default: "ollama" },
24123
24208
  scope: { type: "string", enum: ["local", "server"], default: "local", description: "server = synced cross-device history (needs chat-recall login)." },
24124
- semantic: { type: "boolean", default: false, description: "Also run the pgvector semantic tier, not just keyword FTS. Needs an embedder configured server-side; ignored otherwise." }
24209
+ semantic: { type: "boolean", default: false, description: "Reserved and currently ignored: the semantic tier is switched off server-side, so every search runs keyword FTS." }
24125
24210
  },
24126
24211
  required: ["query"]
24127
24212
  }
@@ -24661,6 +24746,59 @@ secret. The dismissal syncs across devices.`,
24661
24746
  required: ["preview", "status"]
24662
24747
  }
24663
24748
  },
24749
+ {
24750
+ name: "recall_toolkit_status",
24751
+ description: `Which MCP servers, skills, commands and agents exist, on which AI tool, on which device.
24752
+
24753
+ Use it before recall_toolkit_sync to see what is missing where, and after, to
24754
+ confirm what landed. Counts are per (type, tool) and rows name the device that
24755
+ uploaded them, so you can tell "my laptop has it" from "my desktop has it".
24756
+
24757
+ NOTE: the server holds an INVENTORY. MCP registrations carry enough to rebuild
24758
+ elsewhere; skills and agents do not (their file content is not uploaded), and
24759
+ this tool says which is which.`,
24760
+ inputSchema: {
24761
+ type: "object",
24762
+ properties: {
24763
+ type: { type: "string", enum: [...TOOLKIT_TYPES], description: "Restrict to one artifact type. Omit for every type." }
24764
+ }
24765
+ }
24766
+ },
24767
+ {
24768
+ name: "recall_toolkit_sync",
24769
+ description: `Install the account's MCP servers / skills / agents onto a device, or fan a device's own artifacts out across its tools.
24770
+
24771
+ TWO DIFFERENT OPERATIONS \u2014 pick with \`scope\`:
24772
+
24773
+ scope: 'pull' Install what the ACCOUNT has onto the target device, sourced
24774
+ from the server. This is the cross-device one: it is what
24775
+ sets up a new laptop. Omit \`device\` to target every device.
24776
+
24777
+ scope: 'fan_out' Copy what ONE device already has between that device's own
24778
+ tools (claude \u2192 codex \u2192 cursor \u2026). Single machine only; it
24779
+ reads that machine's disk.
24780
+
24781
+ Examples:
24782
+ everything, everywhere { }
24783
+ every MCP, everywhere { types: ['mcp'] }
24784
+ every MCP on one machine { types: ['mcp'], device: 'my-laptop' }
24785
+ one artifact { types: ['mcp'], name: 'acme-mcp' }
24786
+ fan a machine's own set out { scope: 'fan_out', device: 'my-laptop' }
24787
+
24788
+ The work is QUEUED, not done inline: the target device performs it on its next
24789
+ drain (the watch daemon polls, or run \`chat-recall toolkit drain\`). Only that
24790
+ device can write its own config files, so nothing else could do it. Read the
24791
+ outcome back with recall_toolkit_status.`,
24792
+ inputSchema: {
24793
+ type: "object",
24794
+ properties: {
24795
+ types: { type: "array", items: { type: "string", enum: [...TOOLKIT_TYPES] }, description: "Artifact types to install. Omit for all." },
24796
+ name: { type: "string", description: "Install ONE named artifact. Requires exactly one entry in types." },
24797
+ device: { type: "string", description: "Hostname of the target machine. Omit to target every device on the account." },
24798
+ scope: { type: "string", enum: ["pull", "fan_out"], default: "pull", description: "pull = install from the server (cross-device). fan_out = copy between one machine's own tools." }
24799
+ }
24800
+ }
24801
+ },
24664
24802
  {
24665
24803
  name: "recall_security_rules",
24666
24804
  description: `List tenant custom secret-detection rules, or test a regex in the sandbox.
@@ -26615,6 +26753,88 @@ ${row.value}`
26615
26753
  });
26616
26754
  return { content: [{ type: "text", text: `Dismissed \`${params.preview}\` as ${params.status}.` }] };
26617
26755
  }
26756
+ case "recall_toolkit_status": {
26757
+ const params = RecallToolkitStatusSchema.parse(args);
26758
+ requireRemote();
26759
+ const types = params.type ? [params.type] : [...TOOLKIT_TYPES];
26760
+ const REBUILDABLE = {
26761
+ mcp: "yes \u2014 a registration is config, and the whole entry is stored",
26762
+ skill: "yes \u2014 the full file is stored, so it can be written on any machine",
26763
+ agent: "yes \u2014 the body is converted to each tool's own encoding (markdown or TOML)",
26764
+ command: "yes \u2014 same as agents, converted per tool",
26765
+ instructions: "no, deliberately \u2014 a CLAUDE.md belongs to a repo, not to a machine"
26766
+ };
26767
+ const lines = ["# Toolkit inventory", ""];
26768
+ for (const type of types) {
26769
+ let items = [];
26770
+ try {
26771
+ const r = await remoteGetQS(`/api/toolkit/browse/${type}`, { limit: 1e3 });
26772
+ items = r.items || [];
26773
+ } catch (err) {
26774
+ lines.push(`## ${type}`, `_could not read: ${err instanceof Error ? err.message : err}_`, "");
26775
+ continue;
26776
+ }
26777
+ const byTool = /* @__PURE__ */ new Map();
26778
+ const byDevice = /* @__PURE__ */ new Map();
26779
+ let rebuildable = 0;
26780
+ for (const it of items) {
26781
+ let e = {};
26782
+ try {
26783
+ e = JSON.parse(it.extra_json || "{}");
26784
+ } catch {
26785
+ }
26786
+ byTool.set(String(e.tool || "?"), (byTool.get(String(e.tool || "?")) || 0) + 1);
26787
+ byDevice.set(String(e.syncedDeviceId || "?"), (byDevice.get(String(e.syncedDeviceId || "?")) || 0) + 1);
26788
+ if (type === "mcp" && e.spec) rebuildable++;
26789
+ if ((type === "skill" || type === "agent" || type === "command") && typeof e.body === "string" && e.body) rebuildable++;
26790
+ }
26791
+ lines.push(`## ${type} \u2014 ${items.length}`);
26792
+ if (byTool.size) lines.push(`- by tool: ${[...byTool].map(([k, v]) => `${k} ${v}`).join(" \xB7 ")}`);
26793
+ if (byDevice.size) lines.push(`- by device: ${[...byDevice].map(([k, v]) => `${k} ${v}`).join(" \xB7 ")}`);
26794
+ lines.push(`- installable on another device: ${REBUILDABLE[type]}`);
26795
+ if (type === "skill" || type === "agent" || type === "command") {
26796
+ lines.push(`- carrying a full body: ${rebuildable}/${items.length}` + (rebuildable < items.length ? " \u2014 the rest need a re-index on their source device" : ""));
26797
+ }
26798
+ if (type === "mcp") {
26799
+ lines.push(`- carrying a rebuild spec: ${rebuildable}/${items.length}` + (rebuildable < items.length ? " \u2014 the rest need a re-index on their source device" : ""));
26800
+ }
26801
+ lines.push("");
26802
+ }
26803
+ lines.push("Queue an install with `recall_toolkit_sync`.");
26804
+ return { content: [{ type: "text", text: lines.join("\n") }] };
26805
+ }
26806
+ case "recall_toolkit_sync": {
26807
+ const params = RecallToolkitSyncSchema.parse(args);
26808
+ requireRemote();
26809
+ if (params.name && (params.types?.length ?? 0) !== 1) {
26810
+ return { content: [{ type: "text", text: "A `name` needs exactly one entry in `types`, so the artifact is unambiguous." }] };
26811
+ }
26812
+ if (params.scope === "fan_out" && !params.device) {
26813
+ return { content: [{ type: "text", text: "`fan_out` copies between ONE machine's own tools \u2014 name the machine with `device`." }] };
26814
+ }
26815
+ const body = params.scope === "fan_out" ? { kind: "sync_all", deviceId: params.device } : { kind: "pull", types: params.types, name: params.name, deviceId: params.device ?? null };
26816
+ const r = await remotePost("/api/sync-intents", body);
26817
+ if (!r.id) return { content: [{ type: "text", text: `Queue refused it: ${r.error || "unknown error"}` }] };
26818
+ const what = params.name ? `"${params.name}"` : params.types?.length ? params.types.join(", ") : "every artifact type";
26819
+ const where = params.device ? `on ${params.device}` : "on every device on this account";
26820
+ return {
26821
+ content: [{
26822
+ type: "text",
26823
+ text: [
26824
+ `Queued: ${params.scope === "fan_out" ? "fan out" : "install"} ${what} ${where}.`,
26825
+ `Intent id: ${r.id}`,
26826
+ "",
26827
+ // The queue accepting is NOT the work happening. Saying so stops
26828
+ // an agent reporting success for something that has not run.
26829
+ "QUEUED, NOT DONE. Only the target device can write its own config",
26830
+ "files, so it performs this on its next drain \u2014 the watch daemon polls,",
26831
+ "or run `chat-recall toolkit drain` there to do it now.",
26832
+ "",
26833
+ "Check the result with `recall_toolkit_status`."
26834
+ ].join("\n")
26835
+ }]
26836
+ };
26837
+ }
26618
26838
  case "recall_security_rules": {
26619
26839
  const params = RecallSecurityRulesSchema.parse(args);
26620
26840
  requireRemote();