@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 +1 -1
- package/dist/tools/graph_helpers.d.ts +1 -4
- package/dist/tools/graph_helpers.d.ts.map +1 -1
- package/dist/tools/graph_helpers.js +4 -41
- package/dist/tools/graph_helpers.js.map +1 -1
- package/dist/tools/search.d.ts +3 -3
- package/dist/tools/search.d.ts.map +1 -1
- package/dist/tools/search.js +18 -40
- package/dist/tools/search.js.map +1 -1
- package/dist/tools/traverse.d.ts +1 -7
- package/dist/tools/traverse.d.ts.map +1 -1
- package/dist/tools/traverse.js +200 -54
- package/dist/tools/traverse.js.map +1 -1
- package/package.json +1 -1
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
|
|
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;
|
|
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
|
|
192
|
-
//
|
|
193
|
-
//
|
|
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":"AAAA;;;;;;;;;;;;;;GAcG;AAiBH;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAC3B,CAAY,EACZ,SAAiB;IAEjB,IAAI,OAAO,CAAC,CAAC,EAAE,KAAK,QAAQ,EAAE,CAAC;QAC7B,8EAA8E;QAC9E,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,aAAa,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;IAC1F,CAAC;IACD,MAAM,GAAG,GAAI,CAAC,CAAC,WAAsB,IAAI,SAAS,CAAC;IACnD,MAAM,GAAG,GAAI,CAAC,CAAC,WAAsB,IAAI,SAAS,CAAC;IACnD,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC,aAAa,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;AACnF,CAAC;
|
|
1
|
+
{"version":3,"file":"graph_helpers.js","sourceRoot":"","sources":["../../src/tools/graph_helpers.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/search.d.ts
CHANGED
|
@@ -4,9 +4,9 @@
|
|
|
4
4
|
* Tool: hebbian_search
|
|
5
5
|
* Search the workspace for nodes matching a query.
|
|
6
6
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
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;
|
|
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"}
|
package/dist/tools/search.js
CHANGED
|
@@ -4,12 +4,12 @@
|
|
|
4
4
|
* Tool: hebbian_search
|
|
5
5
|
* Search the workspace for nodes matching a query.
|
|
6
6
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
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 {
|
|
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
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
//
|
|
58
|
-
//
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
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);
|
package/dist/tools/search.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/traverse.d.ts
CHANGED
|
@@ -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
|
-
*
|
|
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
|
|
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"}
|
package/dist/tools/traverse.js
CHANGED
|
@@ -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
|
-
*
|
|
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.
|
|
36
|
-
"
|
|
37
|
-
"
|
|
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
|
|
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
|
|
118
|
+
const deduplicated = deduplicateNeighbourhoodNodes(graph.nodes);
|
|
56
119
|
const byUuid = new Map();
|
|
57
|
-
for (const
|
|
58
|
-
byUuid.set(
|
|
59
|
-
|
|
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
|
-
//
|
|
70
|
-
const visited = new Set([
|
|
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
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
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
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
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
|
-
|
|
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
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
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.
|
|
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",
|