@hebbianvault/mcp 0.5.0 → 0.6.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.
package/README.md CHANGED
@@ -128,7 +128,7 @@ Write `~/.config/hebbian/mcp-tenant.json`:
128
128
 
129
129
  ## Token scope
130
130
 
131
- Your token decides what the adapter can see and do — a personal-workspace token gives access to your own knowledge; a company-workspace token gives access to the shared company workspace (where your role allows). Scope is decided by the Hebbian service. Search uses server-side full-text retrieval for employee-scope tokens. Traverse and provenance route company-scoped tokens to the company graph and other tokens to the workspace graph; search retains that company-graph path until an org-wide search endpoint is available. If the advisory scope probe fails, the adapter caches the employee fallback for its process lifetime; restarting the MCP process clears that cached fallback.
131
+ Your token decides what the adapter can see and do — a personal-workspace token gives access to your own knowledge; a company-workspace token gives access to the shared company workspace (where your role allows). Scope is decided by the Hebbian service. Search uses server-side full-text retrieval for every token scope, and the service decides which workspace a token searches. Traverse and provenance route company-scoped tokens to the company graph and other tokens to the workspace graph. If the advisory scope probe fails, the adapter caches the employee fallback for its process lifetime; restarting the MCP process clears that cached fallback.
132
132
 
133
133
  ## Tools
134
134
 
@@ -39,6 +39,7 @@ export interface GraphNode {
39
39
  title?: string;
40
40
  summary?: string;
41
41
  detail?: string;
42
+ excerpt?: string;
42
43
  domain?: string;
43
44
  archetype?: string;
44
45
  actor?: string;
@@ -60,10 +61,6 @@ export declare function isCompanyScope(client: HebbianClient): Promise<boolean>;
60
61
  export declare function fetchGraph(client: HebbianClient): Promise<GraphFetchResult>;
61
62
  /** Clear the short-lived graph cache after a successful graph mutation. */
62
63
  export declare function invalidateGraphCache(client: HebbianClient): void;
63
- /** Score a node against query terms. Returns 0 when no term matches. */
64
- export declare function scoreNode(n: GraphNode, terms: string[]): number;
65
- /** Split a query string into lower-cased terms. */
66
- export declare function queryTerms(q: string): string[];
67
64
  /** A compact node summary for search/traverse result lists. */
68
65
  export declare function summarise(n: GraphNode): Record<string, unknown>;
69
66
  //# sourceMappingURL=graph_helpers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"graph_helpers.d.ts","sourceRoot":"","sources":["../../src/tools/graph_helpers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,MAAM,WAAW,SAAS;IAIxB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,IAAI,GAAG,KAAK,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,CAAC,EAAE,SAAS,EACZ,SAAS,EAAE,MAAM,GAChB;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAQxE;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,CAAC,EAAE,SAAS,EAAE,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACtB;AAQD,eAAO,MAAM,gBAAgB,OAAQ,CAAC;AACtC,eAAO,MAAM,eAAe,KAAK,CAAC;AAClC,eAAO,MAAM,kBAAkB,QAAS,CAAC;AAczC,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;CACpB;AAmCD,oEAAoE;AACpE,wBAAsB,cAAc,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAE5E;AAED,mEAAmE;AACnE,wBAAsB,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAmBjF;AAED,2EAA2E;AAC3E,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAEhE;AA4ED,wEAAwE;AACxE,wBAAgB,SAAS,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAW/D;AAED,mDAAmD;AACnD,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAM9C;AAED,+DAA+D;AAC/D,wBAAgB,SAAS,CAAC,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAqB/D"}
1
+ {"version":3,"file":"graph_helpers.d.ts","sourceRoot":"","sources":["../../src/tools/graph_helpers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,MAAM,WAAW,SAAS;IAIxB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,IAAI,GAAG,KAAK,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,CAAC,EAAE,SAAS,EACZ,SAAS,EAAE,MAAM,GAChB;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAQxE;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,CAAC,EAAE,SAAS,EAAE,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACtB;AAQD,eAAO,MAAM,gBAAgB,OAAQ,CAAC;AACtC,eAAO,MAAM,eAAe,KAAK,CAAC;AAClC,eAAO,MAAM,kBAAkB,QAAS,CAAC;AAczC,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;CACpB;AAmCD,oEAAoE;AACpE,wBAAsB,cAAc,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAE5E;AAED,mEAAmE;AACnE,wBAAsB,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAmBjF;AAED,2EAA2E;AAC3E,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAEhE;AA+DD,+DAA+D;AAC/D,wBAAgB,SAAS,CAAC,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAqB/D"}
@@ -149,49 +149,12 @@ async function fetchGraphUncached(client) {
149
149
  }
150
150
  return { nodes, truncated: false };
151
151
  }
152
- /** Lower-cased haystack of a node's searchable text fields. */
153
- function nodeHaystack(n) {
154
- const parts = [
155
- n.title,
156
- n.summary,
157
- n.detail,
158
- n.domain,
159
- n.archetype,
160
- ...(Array.isArray(n.tags) ? n.tags : []),
161
- ];
162
- return parts.filter(Boolean).join(" \n ").toLowerCase();
163
- }
164
- /** Score a node against query terms. Returns 0 when no term matches. */
165
- export function scoreNode(n, terms) {
166
- if (terms.length === 0)
167
- return 0;
168
- const hay = nodeHaystack(n);
169
- const title = (n.title ?? "").toLowerCase();
170
- let score = 0;
171
- for (const t of terms) {
172
- if (!t)
173
- continue;
174
- if (title.includes(t))
175
- score += 3; // title hits weigh more
176
- else if (hay.includes(t))
177
- score += 1;
178
- }
179
- return score;
180
- }
181
- /** Split a query string into lower-cased terms. */
182
- export function queryTerms(q) {
183
- return q
184
- .toLowerCase()
185
- .split(/\s+/)
186
- .map((t) => t.trim())
187
- .filter((t) => t.length > 0);
188
- }
189
152
  /** A compact node summary for search/traverse result lists. */
190
153
  export function summarise(n) {
191
- // /vault/search intentionally omits body from its lightweight result shape;
192
- // title is therefore the only reliable readable fallback when a note lacks a
193
- // stored summary. `detail` remains for legacy graph responses.
194
- const source = [n.summary, n.detail, n.title].find((value) => typeof value === "string" && value.trim().length > 0) ?? "";
154
+ // /vault/search returns a body `excerpt` rather than the full body, so it
155
+ // leads. Graph responses carry no excerpt and fall through to summary;
156
+ // `detail` remains for legacy graph responses and title is the last resort.
157
+ const source = [n.excerpt, n.summary, n.detail, n.title].find((value) => typeof value === "string" && value.trim().length > 0) ?? "";
195
158
  const text = source.trim();
196
159
  const head = text.slice(0, 281);
197
160
  const boundary = Math.max(head.lastIndexOf("\n"), head.lastIndexOf(" "));
@@ -1 +1 @@
1
- {"version":3,"file":"graph_helpers.js","sourceRoot":"","sources":["../../src/tools/graph_helpers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"graph_helpers.js","sourceRoot":"","sources":["../../src/tools/graph_helpers.ts"],"names":[],"mappings":"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"}
@@ -4,9 +4,9 @@
4
4
  * Tool: hebbian_search
5
5
  * Search the workspace for nodes matching a query.
6
6
  *
7
- * Employee-scoped search uses the API's full-text endpoint so matches in note
8
- * bodies are returned. Company-scoped tokens retain the company-graph fallback
9
- * because /vault/search intentionally uses the employee-union RLS view.
7
+ * Every token scope uses the API's full-text endpoint. The server resolves the
8
+ * scope from the token (company tokens search the company pool) and owns the
9
+ * ranking; this client only filters by domain and shapes the result list.
10
10
  */
11
11
  import type { Tool } from "@modelcontextprotocol/sdk/types.js";
12
12
  import type { HebbianClient } from "../client.js";
@@ -1 +1 @@
1
- {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAYlD,eAAO,MAAM,cAAc,EAAE,IAiC5B,CAAC;AAEF,UAAU,UAAU;IAClB,CAAC,EAAE,MAAM,CAAC;IACV,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAMD,wBAAsB,YAAY,CAChC,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE,UAAU,GACf,OAAO,CAAC,MAAM,CAAC,CA6DjB"}
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAKlD,eAAO,MAAM,cAAc,EAAE,IAiC5B,CAAC;AAKF,UAAU,UAAU;IAClB,CAAC,EAAE,MAAM,CAAC;IACV,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAMD,wBAAsB,YAAY,CAChC,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE,UAAU,GACf,OAAO,CAAC,MAAM,CAAC,CAuCjB"}
@@ -4,12 +4,12 @@
4
4
  * Tool: hebbian_search
5
5
  * Search the workspace for nodes matching a query.
6
6
  *
7
- * Employee-scoped search uses the API's full-text endpoint so matches in note
8
- * bodies are returned. Company-scoped tokens retain the company-graph fallback
9
- * because /vault/search intentionally uses the employee-union RLS view.
7
+ * Every token scope uses the API's full-text endpoint. The server resolves the
8
+ * scope from the token (company tokens search the company pool) and owns the
9
+ * ranking; this client only filters by domain and shapes the result list.
10
10
  */
11
11
  import { HebbianApiError } from "../client.js";
12
- import { fetchGraph, isCompanyScope, queryTerms, scoreNode, summarise, } from "./graph_helpers.js";
12
+ import { summarise } from "./graph_helpers.js";
13
13
  import { stringifyUntrustedResult } from "./untrusted_content.js";
14
14
  export const HEBBIAN_SEARCH = {
15
15
  name: "hebbian_search",
@@ -43,6 +43,8 @@ export const HEBBIAN_SEARCH = {
43
43
  additionalProperties: false,
44
44
  },
45
45
  };
46
+ /** Largest `limit` GET /vault/search accepts (server `_SEARCH_MAX_LIMIT`). */
47
+ const SERVER_SEARCH_MAX_LIMIT = 100;
46
48
  export async function handleSearch(client, args) {
47
49
  const { q, domain, limit = 10 } = args;
48
50
  if (!q || typeof q !== "string" || q.trim().length === 0) {
@@ -51,49 +53,25 @@ export async function handleSearch(client, args) {
51
53
  const cap = Math.min(Math.max(1, limit), 50);
52
54
  const trimmedQuery = q.trim();
53
55
  try {
54
- let ranked;
55
- let truncated = false;
56
- if (await isCompanyScope(client)) {
57
- // /vault/search is employee-union scoped even for company tokens. Keep
58
- // Plan 2.1's company-graph behaviour until the API offers an org-wide FTS view.
59
- const graph = await fetchGraph(client);
60
- let nodes = graph.nodes;
61
- truncated = graph.truncated;
62
- if (domain) {
63
- const d = domain.toLowerCase();
64
- nodes = nodes.filter((n) => (n.domain ?? "").toLowerCase() === d);
65
- }
66
- const terms = queryTerms(trimmedQuery);
67
- ranked = nodes
68
- .map((n) => ({ n, score: scoreNode(n, terms) }))
69
- .filter((x) => x.score > 0)
70
- .sort((a, b) => b.score - a.score)
71
- .slice(0, cap)
72
- .map((x) => summarise(x.n));
73
- }
74
- else {
75
- const response = (await client.get("/vault/search", {
76
- q: trimmedQuery,
77
- // Domain filtering happens locally because the FTS endpoint does not
78
- // accept a domain filter. Fetch the client maximum first so matches
79
- // ranked below the caller's window are not lost before filtering.
80
- limit: domain ? 50 : cap,
81
- }));
82
- let results = Array.isArray(response.results) ? response.results : [];
83
- if (domain) {
84
- const d = domain.toLowerCase();
85
- results = results.filter((n) => (n.domain ?? "").toLowerCase() === d);
86
- }
87
- ranked = results.slice(0, cap).map(summarise);
56
+ const response = (await client.get("/vault/search", {
57
+ q: trimmedQuery,
58
+ // Domain filtering happens locally because the FTS endpoint does not
59
+ // accept a domain filter. Fetch the server maximum first so matches
60
+ // ranked below the caller's window are not lost before filtering.
61
+ limit: domain ? SERVER_SEARCH_MAX_LIMIT : cap,
62
+ }));
63
+ let results = Array.isArray(response.results) ? response.results : [];
64
+ if (domain) {
65
+ const d = domain.toLowerCase();
66
+ results = results.filter((n) => (n.domain ?? "").toLowerCase() === d);
88
67
  }
68
+ const ranked = results.slice(0, cap).map(summarise);
89
69
  const result = {
90
70
  query: trimmedQuery,
91
71
  domain: domain ?? null,
92
72
  count: ranked.length,
93
73
  results: ranked,
94
74
  };
95
- if (truncated)
96
- result.truncated = true;
97
75
  if (ranked.length === 0)
98
76
  result.message = "No matching nodes found.";
99
77
  return stringifyUntrustedResult(result);
@@ -1 +1 @@
1
- {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"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"}
@@ -1,13 +1,7 @@
1
1
  /**
2
- * src/tools/traverse.ts
3
- *
4
2
  * Tool: hebbian_traverse
5
- * Walk the workspace graph outward from a starting node up to N hops.
6
3
  *
7
- * Built over the scoped workspace graph (GET /vault/graph), where each node
8
- * carries its inline edges. We do a breadth-first walk from the start node;
9
- * only nodes the caller's token may see are present in the graph, so traversal
10
- * never crosses an access boundary.
4
+ * Return a bounded, weight-ranked neighbourhood from the scoped workspace graph.
11
5
  */
12
6
  import type { Tool } from "@modelcontextprotocol/sdk/types.js";
13
7
  import type { HebbianClient } from "../client.js";
@@ -1 +1 @@
1
- {"version":3,"file":"traverse.d.ts","sourceRoot":"","sources":["../../src/tools/traverse.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAQlD,eAAO,MAAM,gBAAgB,EAAE,IA+B9B,CAAC;AAEF,UAAU,YAAY;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AASD,wBAAsB,cAAc,CAClC,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC,MAAM,CAAC,CAwFjB"}
1
+ {"version":3,"file":"traverse.d.ts","sourceRoot":"","sources":["../../src/tools/traverse.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAgBlD,eAAO,MAAM,gBAAgB,EAAE,IAgC9B,CAAC;AAEF,UAAU,YAAY;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAyFD,wBAAsB,cAAc,CAClC,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC,MAAM,CAAC,CA8LjB"}
@@ -1,19 +1,21 @@
1
1
  /**
2
- * src/tools/traverse.ts
3
- *
4
2
  * Tool: hebbian_traverse
5
- * Walk the workspace graph outward from a starting node up to N hops.
6
3
  *
7
- * Built over the scoped workspace graph (GET /vault/graph), where each node
8
- * carries its inline edges. We do a breadth-first walk from the start node;
9
- * only nodes the caller's token may see are present in the graph, so traversal
10
- * never crosses an access boundary.
4
+ * Return a bounded, weight-ranked neighbourhood from the scoped workspace graph.
11
5
  */
12
6
  import { HebbianApiError } from "../client.js";
13
7
  import { fetchGraph, normaliseEdge, summarise } from "./graph_helpers.js";
14
- import { stringifyUntrustedResult } from "./untrusted_content.js";
8
+ import { frameUntrustedText, stringifyUntrustedResult } from "./untrusted_content.js";
15
9
  const MAX_HOPS = 3;
16
10
  const DEFAULT_HOPS = 2;
11
+ // neighbourhood_v0 response budgets. PROVISIONAL — not ratified by any lane, including
12
+ // graph. Ported from the Python reference (py/src/hebbianvault_mcp/tools.py:39-41), but the
13
+ // two runtimes do NOT measure the same byte stream: Python frames untrusted text per field,
14
+ // TypeScript frames the whole response once at the MCP boundary (src/index.ts:185). Retune
15
+ // here, in one place, and only against measurements taken on THIS runtime.
16
+ const NEIGHBOURHOOD_MAX_NODES = 50;
17
+ const NEIGHBOURHOOD_MAX_CHARS = 15_000;
18
+ const NEIGHBOURHOOD_MAX_DEPTH = 3;
17
19
  export const HEBBIAN_TRAVERSE = {
18
20
  name: "hebbian_traverse",
19
21
  description: "Walk your Hebbian workspace graph from a starting node, returning connected " +
@@ -32,9 +34,10 @@ export const HEBBIAN_TRAVERSE = {
32
34
  max_hops: {
33
35
  type: "number",
34
36
  description: `Maximum number of hops to traverse. Default: ${DEFAULT_HOPS}. Max: ${MAX_HOPS}. ` +
35
- "Each extra hop multiplies the size of the response, not its relevance. On a " +
36
- "dense workspace a 3-hop walk already returns hundreds of thousands of " +
37
- "characters. Start at 1 or 2 and widen only if the answer is genuinely missing.",
37
+ "Each extra hop multiplies the size of the response, not its relevance. The " +
38
+ "response is bounded to about 50 nodes and 15,000 characters; inspect " +
39
+ "truncated_at_hop, bound_hit, and nodes_dropped to detect truncation. Start " +
40
+ "at 1 or 2 and widen only if the answer is genuinely missing.",
38
41
  minimum: 1,
39
42
  maximum: MAX_HOPS,
40
43
  },
@@ -43,76 +46,219 @@ export const HEBBIAN_TRAVERSE = {
43
46
  additionalProperties: false,
44
47
  },
45
48
  };
49
+ function isUuidV5(uuid) {
50
+ const groups = uuid.split("-");
51
+ return groups.length >= 3 && groups[2].length > 0 && groups[2].startsWith("5");
52
+ }
53
+ function deduplicateNeighbourhoodNodes(nodes) {
54
+ const twinsByTitle = new Map();
55
+ for (const [index, node] of nodes.entries()) {
56
+ if (typeof node.uuid !== "string" || node.uuid.length === 0)
57
+ continue;
58
+ const title = typeof node.title === "string" && node.title.length > 0
59
+ ? node.title
60
+ : `__uuid__:${node.uuid}`;
61
+ const twins = twinsByTitle.get(title) ?? [];
62
+ twins.push({ node, index });
63
+ twinsByTitle.set(title, twins);
64
+ }
65
+ const winners = [];
66
+ const aliases = new Map();
67
+ let duplicatesDropped = 0;
68
+ for (const twins of twinsByTitle.values()) {
69
+ const winner = twins.reduce((best, candidate) => {
70
+ const bestHasTags = Array.isArray(best.node.tags) && best.node.tags.length > 0;
71
+ const candidateHasTags = Array.isArray(candidate.node.tags) && candidate.node.tags.length > 0;
72
+ if (isUuidV5(candidate.node.uuid) !== isUuidV5(best.node.uuid)) {
73
+ return isUuidV5(candidate.node.uuid) ? candidate : best;
74
+ }
75
+ if (candidateHasTags !== bestHasTags)
76
+ return candidateHasTags ? candidate : best;
77
+ return candidate.index < best.index ? candidate : best;
78
+ });
79
+ winners.push(winner);
80
+ for (const twin of twins)
81
+ aliases.set(twin.node.uuid, winner.node.uuid);
82
+ duplicatesDropped += twins.length - 1;
83
+ }
84
+ winners.sort((left, right) => left.index - right.index);
85
+ return { nodes: winners.map(({ node }) => node), aliases, duplicatesDropped };
86
+ }
87
+ function neighbourhoodWeight(value) {
88
+ if (typeof value !== "number" && typeof value !== "string")
89
+ return 0;
90
+ const weight = Number(value);
91
+ return Number.isFinite(weight) ? weight : 0;
92
+ }
93
+ function neighbourhoodSummary(node, depth) {
94
+ const result = summarise(node);
95
+ for (const key of ["domain", "archetype", "tags"]) {
96
+ const value = result[key];
97
+ if (Array.isArray(value) ? value.length === 0 : !value)
98
+ delete result[key];
99
+ }
100
+ if (depth > 1) {
101
+ const snippet = result.snippet;
102
+ delete result.snippet;
103
+ if (snippet)
104
+ result.snippet_withheld = "depth_policy";
105
+ }
106
+ return result;
107
+ }
46
108
  export async function handleTraverse(client, args) {
47
109
  const { start_uuid, max_hops = DEFAULT_HOPS } = args;
48
110
  if (!start_uuid || typeof start_uuid !== "string" || start_uuid.trim().length === 0) {
49
111
  throw new Error("start_uuid is required and must be a non-empty string");
50
112
  }
51
- const hops = Math.min(Math.max(1, max_hops), MAX_HOPS);
113
+ const requestedHops = Math.max(1, typeof max_hops === "number" && Number.isFinite(max_hops) ? Math.trunc(max_hops) : DEFAULT_HOPS);
114
+ const hops = Math.min(requestedHops, MAX_HOPS);
52
115
  const start = start_uuid.trim();
53
116
  try {
54
117
  const graph = await fetchGraph(client);
55
- const { nodes } = graph;
118
+ const deduplicated = deduplicateNeighbourhoodNodes(graph.nodes);
56
119
  const byUuid = new Map();
57
- for (const n of nodes)
58
- byUuid.set(n.uuid, n);
59
- if (!byUuid.has(start)) {
120
+ for (const node of deduplicated.nodes)
121
+ byUuid.set(node.uuid, node);
122
+ const canonicalStart = deduplicated.aliases.get(start) ?? start;
123
+ const emptyDiagnostics = {
124
+ truncated_at_hop: null,
125
+ nodes_dropped: 0,
126
+ duplicates_dropped: deduplicated.duplicatesDropped,
127
+ bound_hit: null,
128
+ weight_spread: null,
129
+ distinct_weights: 0,
130
+ edges_considered: 0,
131
+ };
132
+ if (!byUuid.has(canonicalStart)) {
60
133
  return JSON.stringify({
61
134
  start_uuid: start,
62
135
  message: "Start node not found in the visible workspace graph. It may not exist " +
63
136
  "or may be outside your token's scope.",
64
137
  nodes: [],
65
138
  edges: [],
139
+ ...emptyDiagnostics,
66
140
  ...(graph.truncated ? { truncated: true } : {}),
67
141
  }, null, 2);
68
142
  }
69
- // BFS over inline edges.
70
- const visited = new Set([start]);
143
+ // The start is hop 0 and, like every accepted node, consumes response budget.
144
+ const visited = new Set([canonicalStart]);
145
+ const resultNodes = [neighbourhoodSummary(byUuid.get(canonicalStart), 0)];
71
146
  const collectedEdges = [];
72
- const edgeSeen = new Set();
73
- let frontier = [start];
74
- for (let hop = 0; hop < hops; hop++) {
75
- const next = [];
76
- for (const uuid of frontier) {
147
+ let frontier = [{ uuid: canonicalStart, score: 0 }];
148
+ const weights = [];
149
+ let edgesConsidered = 0;
150
+ let truncatedAtHop = null;
151
+ let nodesDropped = 0;
152
+ let boundHit = null;
153
+ const payload = (nodes, edges, markerHop, dropped, hit) => {
154
+ const minWeight = weights.length > 0 ? Math.min(...weights) : null;
155
+ const weightSpread = minWeight !== null && minWeight > 0
156
+ ? Number(((Math.max(...weights) - minWeight) / minWeight).toFixed(5))
157
+ : null;
158
+ return {
159
+ start_uuid: start,
160
+ max_hops: hops,
161
+ node_count: nodes.length,
162
+ edge_count: edges.length,
163
+ nodes,
164
+ edges,
165
+ truncated_at_hop: markerHop,
166
+ nodes_dropped: dropped,
167
+ duplicates_dropped: deduplicated.duplicatesDropped,
168
+ bound_hit: hit,
169
+ weight_spread: weightSpread,
170
+ distinct_weights: new Set(weights).size,
171
+ edges_considered: edgesConsidered,
172
+ ...(graph.truncated ? { truncated: true } : {}),
173
+ };
174
+ };
175
+ const expandFrontier = (activeFrontier) => {
176
+ const candidates = new Map();
177
+ let discoveryIndex = 0;
178
+ for (const { uuid, score: accumulatedWeight } of activeFrontier) {
77
179
  const node = byUuid.get(uuid);
78
180
  if (!node || !Array.isArray(node.edges))
79
181
  continue;
80
- for (const e of node.edges) {
81
- const { source: src, target: tgt, relation, weight } = normaliseEdge(e, uuid);
82
- const neighbour = src === uuid ? tgt : src;
83
- const key = `${src}->${tgt}:${relation ?? ""}`;
84
- if (!edgeSeen.has(key)) {
85
- edgeSeen.add(key);
86
- collectedEdges.push({
87
- source_uuid: src,
88
- target_uuid: tgt,
89
- relation_type: relation,
90
- weight,
91
- });
92
- }
93
- if (neighbour && !visited.has(neighbour) && byUuid.has(neighbour)) {
94
- visited.add(neighbour);
95
- next.push(neighbour);
96
- }
182
+ for (const rawEdge of node.edges) {
183
+ if (rawEdge === null || typeof rawEdge !== "object" || Array.isArray(rawEdge))
184
+ continue;
185
+ edgesConsidered += 1;
186
+ const normalised = normaliseEdge(rawEdge, uuid);
187
+ const source = deduplicated.aliases.get(normalised.source) ?? normalised.source;
188
+ const target = deduplicated.aliases.get(normalised.target) ?? normalised.target;
189
+ const rawWeight = normalised.weight;
190
+ const weight = neighbourhoodWeight(rawWeight);
191
+ weights.push(weight);
192
+ const neighbour = source === uuid ? target : source;
193
+ if (visited.has(neighbour) || !byUuid.has(neighbour))
194
+ continue;
195
+ const candidate = {
196
+ uuid: neighbour,
197
+ score: accumulatedWeight + weight,
198
+ edge: { source, target, relation: normalised.relation, weight: rawWeight },
199
+ discoveryIndex,
200
+ };
201
+ const existing = candidates.get(neighbour);
202
+ if (!existing || candidate.score > existing.score)
203
+ candidates.set(neighbour, candidate);
204
+ discoveryIndex += 1;
205
+ }
206
+ }
207
+ return [...candidates.values()].sort((left, right) => right.score - left.score || left.discoveryIndex - right.discoveryIndex);
208
+ };
209
+ for (let depth = 1; depth <= requestedHops; depth += 1) {
210
+ const candidates = expandFrontier(frontier);
211
+ if (depth > NEIGHBOURHOOD_MAX_DEPTH) {
212
+ if (candidates.length > 0) {
213
+ truncatedAtHop = NEIGHBOURHOOD_MAX_DEPTH;
214
+ nodesDropped = candidates.length;
215
+ boundHit = "depth";
97
216
  }
217
+ break;
98
218
  }
99
- frontier = next;
219
+ if (candidates.length === 0)
220
+ break;
221
+ const nextFrontier = [];
222
+ for (let position = 0; position < candidates.length; position += 1) {
223
+ const candidate = candidates[position];
224
+ if (resultNodes.length >= NEIGHBOURHOOD_MAX_NODES) {
225
+ truncatedAtHop = depth;
226
+ nodesDropped = candidates.length - position;
227
+ boundHit = "nodes";
228
+ break;
229
+ }
230
+ const nodeSummary = neighbourhoodSummary(byUuid.get(candidate.uuid), depth);
231
+ const edgeSummary = {
232
+ source_uuid: candidate.edge.source,
233
+ target_uuid: candidate.edge.target,
234
+ relation_type: candidate.edge.relation,
235
+ weight: candidate.edge.weight,
236
+ };
237
+ const candidatePayload = payload([...resultNodes, nodeSummary], [...collectedEdges, edgeSummary], depth, candidates.length - position, "chars");
238
+ if (frameUntrustedText(stringifyUntrustedResult(candidatePayload)).length > NEIGHBOURHOOD_MAX_CHARS) {
239
+ truncatedAtHop = depth;
240
+ nodesDropped = candidates.length - position;
241
+ boundHit = "chars";
242
+ break;
243
+ }
244
+ visited.add(candidate.uuid);
245
+ resultNodes.push(nodeSummary);
246
+ collectedEdges.push(edgeSummary);
247
+ nextFrontier.push({ uuid: candidate.uuid, score: candidate.score });
248
+ }
249
+ if (boundHit)
250
+ break;
251
+ frontier = nextFrontier;
100
252
  if (frontier.length === 0)
101
253
  break;
102
254
  }
103
- const resultNodes = [...visited]
104
- .map((u) => byUuid.get(u))
105
- .filter((n) => Boolean(n))
106
- .map(summarise);
107
- return stringifyUntrustedResult({
108
- start_uuid: start,
109
- max_hops: hops,
110
- node_count: resultNodes.length,
111
- edge_count: collectedEdges.length,
112
- nodes: resultNodes,
113
- edges: collectedEdges,
114
- ...(graph.truncated ? { truncated: true } : {}),
115
- });
255
+ if (boundHit === null &&
256
+ frameUntrustedText(stringifyUntrustedResult(payload(resultNodes, collectedEdges, 0, 0, "chars"))).length >
257
+ NEIGHBOURHOOD_MAX_CHARS) {
258
+ truncatedAtHop = 0;
259
+ boundHit = "chars";
260
+ }
261
+ return stringifyUntrustedResult(payload(resultNodes, collectedEdges, truncatedAtHop, nodesDropped, boundHit));
116
262
  }
117
263
  catch (err) {
118
264
  if (err instanceof HebbianApiError) {
@@ -1 +1 @@
1
- {"version":3,"file":"traverse.js","sourceRoot":"","sources":["../../src/tools/traverse.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"traverse.js","sourceRoot":"","sources":["../../src/tools/traverse.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hebbianvault/mcp",
3
- "version": "0.5.0",
3
+ "version": "0.6.1",
4
4
  "description": "Customer-installable MCP server for the Hebbian tenant brain. One package, scope-by-token (Employee or Company). Install in Claude Code, Claude Desktop, Cursor, Cowork, or any MCP-compatible agent.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",