@velvetmonkey/flywheel-memory 2.3.3 → 2.4.1

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 (2) hide show
  1. package/dist/index.js +31 -16
  2. package/package.json +2 -2
package/dist/index.js CHANGED
@@ -10389,10 +10389,10 @@ async function initToolRouting() {
10389
10389
  function hasToolRouting() {
10390
10390
  return routingIndex !== null && routingIndex.length > 0;
10391
10391
  }
10392
- function getToolRoutingMode(toolTierMode2) {
10392
+ function getToolRoutingMode(isFullToolset) {
10393
10393
  const env = process.env.FLYWHEEL_TOOL_ROUTING?.trim().toLowerCase();
10394
10394
  if (env === "pattern" || env === "hybrid" || env === "semantic") return env;
10395
- return toolTierMode2 === "tiered" ? "hybrid" : "pattern";
10395
+ return isFullToolset ? "hybrid" : "pattern";
10396
10396
  }
10397
10397
  async function getSemanticActivations(query) {
10398
10398
  return rankAndCollapse(query, routingIndex, hasToolRouting(), manifestModel ?? "");
@@ -11738,6 +11738,7 @@ var ALL_CATEGORIES = [
11738
11738
  var PRESETS = {
11739
11739
  // Presets
11740
11740
  full: [...ALL_CATEGORIES],
11741
+ auto: [...ALL_CATEGORIES],
11741
11742
  agent: ["search", "read", "write", "tasks", "memory"],
11742
11743
  // Composable bundles (one per category)
11743
11744
  graph: ["graph"],
@@ -11816,16 +11817,19 @@ function resolveToolConfig(envValue) {
11816
11817
  return {
11817
11818
  categories: new Set(PRESETS[DEFAULT_PRESET]),
11818
11819
  preset: DEFAULT_PRESET,
11819
- isFullToolset: true
11820
+ isFullToolset: true,
11821
+ enableProgressiveDisclosure: false
11820
11822
  };
11821
11823
  }
11822
11824
  const lowerValue = raw.toLowerCase();
11823
11825
  if (PRESETS[lowerValue]) {
11824
11826
  const cats = new Set(PRESETS[lowerValue]);
11827
+ const isFullToolset = cats.size === ALL_CATEGORIES.length && ALL_CATEGORIES.every((c) => cats.has(c));
11825
11828
  return {
11826
11829
  categories: cats,
11827
11830
  preset: lowerValue,
11828
- isFullToolset: cats.size === ALL_CATEGORIES.length && ALL_CATEGORIES.every((c) => cats.has(c))
11831
+ isFullToolset,
11832
+ enableProgressiveDisclosure: lowerValue === "auto"
11829
11833
  };
11830
11834
  }
11831
11835
  if (DEPRECATED_ALIASES[lowerValue]) {
@@ -11835,7 +11839,8 @@ function resolveToolConfig(envValue) {
11835
11839
  return {
11836
11840
  categories: cats,
11837
11841
  preset: resolved,
11838
- isFullToolset: cats.size === ALL_CATEGORIES.length && ALL_CATEGORIES.every((c) => cats.has(c))
11842
+ isFullToolset: cats.size === ALL_CATEGORIES.length && ALL_CATEGORIES.every((c) => cats.has(c)),
11843
+ enableProgressiveDisclosure: resolved === "auto"
11839
11844
  };
11840
11845
  }
11841
11846
  }
@@ -11843,7 +11848,8 @@ function resolveToolConfig(envValue) {
11843
11848
  return {
11844
11849
  categories,
11845
11850
  preset: null,
11846
- isFullToolset: categories.size === ALL_CATEGORIES.length && ALL_CATEGORIES.every((c) => categories.has(c))
11851
+ isFullToolset: categories.size === ALL_CATEGORIES.length && ALL_CATEGORIES.every((c) => categories.has(c)),
11852
+ enableProgressiveDisclosure: false
11847
11853
  };
11848
11854
  }
11849
11855
  var TOOL_CATEGORY = {
@@ -16079,10 +16085,17 @@ function registerHealthTools(server2, getIndex, getVaultPath, getConfig2 = () =>
16079
16085
  checks.push({ name: "embedding_coverage", status: "ok", detail: `${embCount}/${noteCount} notes embedded (${coverage}%), model: ${getActiveModelId() || "default"}` });
16080
16086
  }
16081
16087
  const entityEmbCount = getEntityEmbeddingsCount();
16082
- const entityCount = indexBuilt ? index.entities.size : 0;
16088
+ const entityCount = (() => {
16089
+ if (!stateDb2) return 0;
16090
+ try {
16091
+ return stateDb2.db.prepare("SELECT COUNT(*) as cnt FROM entities").get()?.cnt ?? 0;
16092
+ } catch {
16093
+ return 0;
16094
+ }
16095
+ })();
16083
16096
  if (entityCount > 0) {
16084
16097
  const entityCoverage = Math.round(entityEmbCount / entityCount * 100);
16085
- checks.push({ name: "entity_embedding_coverage", status: entityCoverage < 50 ? "warning" : "ok", detail: `${entityEmbCount}/${entityCount} entities embedded (${entityCoverage}%)` });
16098
+ checks.push({ name: "entity_embedding_coverage", status: entityCoverage < 50 ? "warning" : "ok", detail: `${entityEmbCount}/${entityCount} canonical entities embedded (${entityCoverage}%)` });
16086
16099
  }
16087
16100
  } else if (!embReady) {
16088
16101
  checks.push({ name: "embedding_coverage", status: "warning", detail: "Semantic embeddings not built", fix: "Run init_semantic to enable hybrid search" });
@@ -26758,7 +26771,7 @@ function unionSignalsByCategory(signals) {
26758
26771
  }
26759
26772
  return Array.from(best.entries()).map(([category, tier]) => ({ category, tier }));
26760
26773
  }
26761
- async function getActivationSignals(toolName, params, searchMethod, toolTierMode2 = "off") {
26774
+ async function getActivationSignals(toolName, params, searchMethod, isFullToolset = false) {
26762
26775
  if (toolName !== "search" && toolName !== "brief") return [];
26763
26776
  if (!params || typeof params !== "object") return [];
26764
26777
  const raw = [
@@ -26766,7 +26779,7 @@ async function getActivationSignals(toolName, params, searchMethod, toolTierMode
26766
26779
  typeof params.focus === "string" ? params.focus : ""
26767
26780
  ].filter(Boolean).join(" ");
26768
26781
  if (!raw) return [];
26769
- const routingMode = getToolRoutingMode(toolTierMode2);
26782
+ const routingMode = getToolRoutingMode(isFullToolset);
26770
26783
  const patternSignals = routingMode !== "semantic" ? getPatternSignals(raw) : [];
26771
26784
  let semanticSignals = [];
26772
26785
  if (routingMode !== "pattern" && searchMethod === "hybrid" && hasToolRouting()) {
@@ -26790,7 +26803,7 @@ function extractSearchMethod(result) {
26790
26803
  }
26791
26804
  return void 0;
26792
26805
  }
26793
- function applyToolGating(targetServer, categories, getDb4, registry, getVaultPath, vaultCallbacks, tierMode = "off", onTierStateChange) {
26806
+ function applyToolGating(targetServer, categories, getDb4, registry, getVaultPath, vaultCallbacks, tierMode = "off", onTierStateChange, isFullToolset = false) {
26794
26807
  let _registered = 0;
26795
26808
  let _skipped = 0;
26796
26809
  let tierOverride = "auto";
@@ -26851,7 +26864,7 @@ function applyToolGating(targetServer, categories, getDb4, registry, getVaultPat
26851
26864
  async function maybeActivateFromContext(toolName, params, searchMethod) {
26852
26865
  if (tierMode !== "tiered" || tierOverride === "full") return [];
26853
26866
  const newlyEnabled = [];
26854
- for (const { category, tier } of await getActivationSignals(toolName, params, searchMethod, tierMode)) {
26867
+ for (const { category, tier } of await getActivationSignals(toolName, params, searchMethod, isFullToolset)) {
26855
26868
  newlyEnabled.push(...enableCategory(category, tier));
26856
26869
  }
26857
26870
  return newlyEnabled;
@@ -27283,7 +27296,7 @@ function registerAllTools(targetServer, ctx, controller) {
27283
27296
  registerCalibrationExportTools(targetServer, gvi, gsd, gcf);
27284
27297
  registerMemoryTools(targetServer, gsd);
27285
27298
  registerBriefTools(targetServer, gsd);
27286
- if (controller) {
27299
+ if (controller && controller.mode === "tiered") {
27287
27300
  registerDiscoveryTools(targetServer, controller);
27288
27301
  }
27289
27302
  registerVaultResources(targetServer, () => gvi() ?? null);
@@ -27318,7 +27331,7 @@ function getWatcherStatus() {
27318
27331
  }
27319
27332
  var toolConfig = resolveToolConfig();
27320
27333
  var enabledCategories = toolConfig.categories;
27321
- var toolTierMode = toolConfig.isFullToolset ? "tiered" : "off";
27334
+ var toolTierMode = toolConfig.enableProgressiveDisclosure ? "tiered" : "off";
27322
27335
  var runtimeToolTierOverride = INITIAL_TIER_OVERRIDE;
27323
27336
  var runtimeActiveCategoryTiers = /* @__PURE__ */ new Map();
27324
27337
  var primaryToolTierController = null;
@@ -27369,7 +27382,8 @@ function createConfiguredServer() {
27369
27382
  ctx.getVaultPath,
27370
27383
  buildVaultCallbacks(),
27371
27384
  toolTierMode,
27372
- handleTierStateChange
27385
+ handleTierStateChange,
27386
+ toolConfig.isFullToolset
27373
27387
  );
27374
27388
  registerAllTools(s, ctx, toolTierController);
27375
27389
  toolTierController.setOverride(runtimeToolTierOverride);
@@ -27422,7 +27436,8 @@ var _gatingResult = applyToolGating(
27422
27436
  _registryCtx.getVaultPath,
27423
27437
  buildVaultCallbacks(),
27424
27438
  toolTierMode,
27425
- handleTierStateChange
27439
+ handleTierStateChange,
27440
+ toolConfig.isFullToolset
27426
27441
  );
27427
27442
  registerAllTools(server, _registryCtx, _gatingResult);
27428
27443
  _gatingResult.setOverride(runtimeToolTierOverride);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@velvetmonkey/flywheel-memory",
3
- "version": "2.3.3",
3
+ "version": "2.4.1",
4
4
  "description": "MCP tools that search, write, and auto-link your Obsidian vault — and learn from your edits.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -55,7 +55,7 @@
55
55
  "dependencies": {
56
56
  "@huggingface/transformers": "^3.8.1",
57
57
  "@modelcontextprotocol/sdk": "^1.25.1",
58
- "@velvetmonkey/vault-core": "^2.3.3",
58
+ "@velvetmonkey/vault-core": "^2.4.1",
59
59
  "better-sqlite3": "^12.0.0",
60
60
  "chokidar": "^4.0.0",
61
61
  "gray-matter": "^4.0.3",