agenthub-multiagent-mcp 1.38.1 → 1.38.3
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/dist/grounding.d.ts +1 -0
- package/dist/grounding.d.ts.map +1 -1
- package/dist/grounding.js +54 -7
- package/dist/grounding.js.map +1 -1
- package/dist/grounding.test.js +21 -5
- package/dist/grounding.test.js.map +1 -1
- package/package.json +1 -1
package/dist/grounding.d.ts
CHANGED
|
@@ -24,6 +24,7 @@ export interface GroundingParams {
|
|
|
24
24
|
k: number;
|
|
25
25
|
timeoutMs: number;
|
|
26
26
|
}
|
|
27
|
+
export declare function searchTerms(query: string): string;
|
|
27
28
|
/**
|
|
28
29
|
* retrieveContext queries all three knowledge sources in parallel and returns a
|
|
29
30
|
* single formatted context block, capped to MAX_CONTEXT_CHARS. Returns "" when
|
package/dist/grounding.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grounding.d.ts","sourceRoot":"","sources":["../src/grounding.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,CAAC,EAAE,MAAM,CAAC;IACV,SAAS,EAAE,MAAM,CAAC;CACnB;
|
|
1
|
+
{"version":3,"file":"grounding.d.ts","sourceRoot":"","sources":["../src/grounding.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,CAAC,EAAE,MAAM,CAAC;IACV,SAAS,EAAE,MAAM,CAAC;CACnB;AAiCD,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAejD;AA2FD;;;;GAIG;AACH,wBAAsB,eAAe,CAAC,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAgBzE"}
|
package/dist/grounding.js
CHANGED
|
@@ -19,6 +19,42 @@ function authHeaders(p) {
|
|
|
19
19
|
// Caps so the grounded prompt never balloons: per-snippet and total.
|
|
20
20
|
const MAX_SNIPPET_CHARS = 600;
|
|
21
21
|
const MAX_CONTEXT_CHARS = 6000;
|
|
22
|
+
// The brain/code/knowledge endpoints are substring/keyword matchers, NOT
|
|
23
|
+
// semantic — a full natural-language question ("what does X do?") matches
|
|
24
|
+
// nothing. searchTerms strips question boilerplate + domain framing words and
|
|
25
|
+
// keeps the meaningful tokens IN ORDER (substring match needs original order),
|
|
26
|
+
// so "In the AgentHub codebase what does the requireOrg middleware do" →
|
|
27
|
+
// "requireOrg middleware", which hits. Identifier-like tokens survive intact.
|
|
28
|
+
const STOPWORDS = new Set([
|
|
29
|
+
"the", "a", "an", "is", "are", "was", "were", "be", "been", "do", "does", "did", "done",
|
|
30
|
+
"what", "which", "who", "whom", "whose", "how", "why", "when", "where", "whether",
|
|
31
|
+
"in", "on", "of", "for", "to", "and", "or", "but", "with", "without", "this", "that",
|
|
32
|
+
"these", "those", "it", "its", "as", "at", "by", "from", "into", "about", "over", "up",
|
|
33
|
+
"can", "could", "should", "would", "will", "shall", "may", "might", "must", "not",
|
|
34
|
+
"i", "you", "we", "they", "he", "she", "me", "us", "them", "your", "our", "their", "my",
|
|
35
|
+
"please", "tell", "explain", "describe", "give", "answer", "summarize", "summarise",
|
|
36
|
+
"sentence", "sentences", "one", "two", "three", "word", "words", "line", "lines",
|
|
37
|
+
"use", "using", "used", "get", "got", "there", "here", "also", "just", "like", "does",
|
|
38
|
+
// domain framing noise users add around the real question
|
|
39
|
+
"agenthub", "codebase", "code", "repo", "repository", "platform", "system", "project",
|
|
40
|
+
]);
|
|
41
|
+
export function searchTerms(query) {
|
|
42
|
+
const toks = query.replace(/[^A-Za-z0-9_\-]+/g, " ").split(/\s+/).filter(Boolean);
|
|
43
|
+
const kept = toks.filter((t) => t.length > 2 && !STOPWORDS.has(t.toLowerCase()));
|
|
44
|
+
if (!kept.length)
|
|
45
|
+
return query.trim();
|
|
46
|
+
// These endpoints substring-match, so a multi-word query only hits if the
|
|
47
|
+
// exact phrase is contiguous in the source — too brittle. A SINGLE
|
|
48
|
+
// high-signal token is far more reliable. Prefer a true identifier
|
|
49
|
+
// (camelCase / snake_case — usually the subject of the question, e.g.
|
|
50
|
+
// "requireOrg"), else the longest remaining word.
|
|
51
|
+
const isIdent = (t) => /[a-z]/.test(t) && /[A-Z_]/.test(t.slice(1));
|
|
52
|
+
kept.sort((a, b) => {
|
|
53
|
+
const d = (isIdent(b) ? 1 : 0) - (isIdent(a) ? 1 : 0);
|
|
54
|
+
return d !== 0 ? d : b.length - a.length;
|
|
55
|
+
});
|
|
56
|
+
return kept[0];
|
|
57
|
+
}
|
|
22
58
|
/** Fetch + parse JSON, bounded by an abort timeout. Returns null on any failure. */
|
|
23
59
|
async function fetchJson(url, init, timeoutMs) {
|
|
24
60
|
const controller = new AbortController();
|
|
@@ -73,16 +109,24 @@ async function fromIntel(p) {
|
|
|
73
109
|
})
|
|
74
110
|
.filter(Boolean);
|
|
75
111
|
}
|
|
76
|
-
/**
|
|
112
|
+
/**
|
|
113
|
+
* Code brain — GET /api/brain/code/search?q&k → { hits: [{ Snippet,
|
|
114
|
+
* TitleOrSymbol, Path, Kind }] }. The Go handler serializes these fields
|
|
115
|
+
* PascalCase (no json tags), so read both casings defensively.
|
|
116
|
+
*/
|
|
77
117
|
async function fromCodeRecall(p) {
|
|
78
118
|
const url = `${p.apiUrl}/api/brain/code/search?q=${encodeURIComponent(p.query)}&k=${p.k}`;
|
|
79
119
|
const data = (await fetchJson(url, { headers: authHeaders(p) }, p.timeoutMs));
|
|
80
120
|
return (data?.hits ?? [])
|
|
81
121
|
.slice(0, p.k)
|
|
82
122
|
.map((it) => {
|
|
83
|
-
const
|
|
84
|
-
const
|
|
85
|
-
|
|
123
|
+
const snippet = (it.Snippet ?? it.snippet);
|
|
124
|
+
const sym = (it.TitleOrSymbol ?? it.title_or_symbol);
|
|
125
|
+
const path = (it.Path ?? it.path);
|
|
126
|
+
const kind = (it.Kind ?? it.kind);
|
|
127
|
+
const body = (snippet ?? sym ?? "").trim();
|
|
128
|
+
const loc = path ? ` (${path})` : "";
|
|
129
|
+
return body ? clip(`[code${kind ? `/${kind}` : ""}${loc}] ${body}`) : "";
|
|
86
130
|
})
|
|
87
131
|
.filter(Boolean);
|
|
88
132
|
}
|
|
@@ -92,10 +136,13 @@ async function fromCodeRecall(p) {
|
|
|
92
136
|
* nothing useful comes back; the caller then answers ungrounded. Never throws.
|
|
93
137
|
*/
|
|
94
138
|
export async function retrieveContext(p) {
|
|
139
|
+
// Refine the natural-language question into keyword terms the substring/
|
|
140
|
+
// keyword endpoints can actually match.
|
|
141
|
+
const refined = { ...p, query: searchTerms(p.query) };
|
|
95
142
|
const [brain, intel, code] = await Promise.all([
|
|
96
|
-
fromOrgBrain(
|
|
97
|
-
fromIntel(
|
|
98
|
-
fromCodeRecall(
|
|
143
|
+
fromOrgBrain(refined).catch(() => []),
|
|
144
|
+
fromIntel(refined).catch(() => []),
|
|
145
|
+
fromCodeRecall(refined).catch(() => []),
|
|
99
146
|
]);
|
|
100
147
|
let block = "";
|
|
101
148
|
for (const line of [...brain, ...intel, ...code]) {
|
package/dist/grounding.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grounding.js","sourceRoot":"","sources":["../src/grounding.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAkBH,gFAAgF;AAChF,SAAS,WAAW,CAAC,CAAkB;IACrC,MAAM,CAAC,GAA2B,EAAE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;IAC5D,IAAI,CAAC,CAAC,YAAY;QAAE,CAAC,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC;IAC1D,OAAO,CAAC,CAAC;AACX,CAAC;AAED,qEAAqE;AACrE,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAC9B,MAAM,iBAAiB,GAAG,IAAI,CAAC;AAE/B,oFAAoF;AACpF,KAAK,UAAU,SAAS,CACtB,GAAW,EACX,IAAiB,EACjB,SAAiB;IAEjB,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAC;IAC9D,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;QACtE,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;QAC1B,OAAO,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;AACH,CAAC;AAED,SAAS,IAAI,CAAC,CAAS;IACrB,OAAO,CAAC,CAAC,MAAM,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1E,CAAC;AAED,kGAAkG;AAClG,KAAK,UAAU,YAAY,CAAC,CAAkB;IAC5C,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,MAAM,0BAA0B,kBAAkB,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5F,MAAM,IAAI,GAAG,CAAC,MAAM,SAAS,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,CAEpE,CAAC;IACT,OAAO,CAAC,IAAI,EAAE,SAAS,IAAI,EAAE,CAAC;SAC3B,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;SACb,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE;QACV,MAAM,IAAI,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzD,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7F,CAAC,CAAC;SACD,MAAM,CAAC,OAAO,CAAC,CAAC;AACrB,CAAC;AAED,+EAA+E;AAC/E,KAAK,UAAU,SAAS,CAAC,CAAkB;IACzC,MAAM,IAAI,GAAG,CAAC,MAAM,SAAS,CAC3B,GAAG,CAAC,CAAC,MAAM,mBAAmB,EAC9B;QACE,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,EAAE;QAClE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,CAAC,EAAE,CAAC,CAAC,CAAC;YACN,gBAAgB,EAAE,IAAI;YACtB,UAAU,EAAE,CAAC,CAAC,SAAS;SACxB,CAAC;KACH,EACD,CAAC,CAAC,SAAS,CACZ,CAAmF,CAAC;IACrF,OAAO,CAAC,IAAI,EAAE,OAAO,IAAI,EAAE,CAAC;SACzB,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;SACb,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE;QACV,MAAM,IAAI,GAAG,CAAC,EAAE,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACvC,MAAM,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3C,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAClF,CAAC,CAAC;SACD,MAAM,CAAC,OAAO,CAAC,CAAC;AACrB,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"grounding.js","sourceRoot":"","sources":["../src/grounding.ts"],"names":[],"mappings":"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"}
|
package/dist/grounding.test.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { describe, it, expect, vi, afterEach } from "vitest";
|
|
2
|
-
import { retrieveContext } from "./grounding.js";
|
|
2
|
+
import { retrieveContext, searchTerms } from "./grounding.js";
|
|
3
3
|
// add-employee-fastpath-cliproxy Phase 2 — Expert RAG grounding.
|
|
4
4
|
const params = {
|
|
5
5
|
apiUrl: "https://agenthub.test",
|
|
@@ -32,7 +32,8 @@ describe("retrieveContext", () => {
|
|
|
32
32
|
vi.stubGlobal("fetch", routeFetch({
|
|
33
33
|
brain: { knowledge: [{ fact: "Drip runs on a 30-min cycle", detail: "per zone", category: "decision" }] },
|
|
34
34
|
intel: { results: [{ snippet: "scheduler.go computes the cycle", path: "server/sched.go", kind: "code" }] },
|
|
35
|
-
|
|
35
|
+
// Code endpoint serializes PascalCase (Go struct, no json tags).
|
|
36
|
+
code: { hits: [{ Snippet: "func NextCycle()", TitleOrSymbol: "NextCycle", Path: "sched.go", Kind: "symbols" }] },
|
|
36
37
|
}));
|
|
37
38
|
const ctx = await retrieveContext(params);
|
|
38
39
|
expect(ctx).toContain("[brain/decision] Drip runs on a 30-min cycle — per zone");
|
|
@@ -62,16 +63,31 @@ describe("retrieveContext", () => {
|
|
|
62
63
|
});
|
|
63
64
|
vi.stubGlobal("fetch", fetchMock);
|
|
64
65
|
await retrieveContext(params);
|
|
66
|
+
// retrieveContext refines "how does drip irrigation scheduling work" to the
|
|
67
|
+
// single best token "irrigation" (longest non-stopword; ties keep order).
|
|
65
68
|
const urls = fetchMock.mock.calls.map((c) => c[0]);
|
|
66
|
-
expect(urls.some((u) => u.includes("/api/brain/knowledge?q=
|
|
69
|
+
expect(urls.some((u) => u.includes("/api/brain/knowledge?q=irrigation"))).toBe(true);
|
|
67
70
|
expect(urls.some((u) => u.includes("/api/intel/search"))).toBe(true);
|
|
68
|
-
expect(urls.some((u) => u.includes("/api/brain/code/search?q=
|
|
71
|
+
expect(urls.some((u) => u.includes("/api/brain/code/search?q=irrigation"))).toBe(true);
|
|
69
72
|
const intelCall = fetchMock.mock.calls.find((c) => c[0].includes("/intel/search"));
|
|
70
73
|
const body = JSON.parse(intelCall[1].body);
|
|
71
|
-
expect(body.query).toBe(
|
|
74
|
+
expect(body.query).toBe("irrigation");
|
|
72
75
|
expect(body.k).toBe(4);
|
|
73
76
|
expect(body.include_snippets).toBe(true);
|
|
74
77
|
});
|
|
78
|
+
});
|
|
79
|
+
describe("searchTerms", () => {
|
|
80
|
+
it("returns the identifier token (subject) for a 'what does X do' question", () => {
|
|
81
|
+
expect(searchTerms("In the AgentHub codebase what does the requireOrg middleware do"))
|
|
82
|
+
.toBe("requireOrg");
|
|
83
|
+
});
|
|
84
|
+
it("falls back to the longest word when there is no identifier", () => {
|
|
85
|
+
expect(searchTerms("what is the employee daemon identity bootstrap and which MCP version"))
|
|
86
|
+
.toBe("bootstrap");
|
|
87
|
+
});
|
|
88
|
+
it("falls back to the raw query when everything is a stopword", () => {
|
|
89
|
+
expect(searchTerms("what is it")).toBe("what is it");
|
|
90
|
+
});
|
|
75
91
|
it("sends X-Connect-Token (org context) on all three calls when provided", async () => {
|
|
76
92
|
const fetchMock = routeFetch({ brain: { knowledge: [{ fact: "f" }] } });
|
|
77
93
|
vi.stubGlobal("fetch", fetchMock);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grounding.test.js","sourceRoot":"","sources":["../src/grounding.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAwB,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"grounding.test.js","sourceRoot":"","sources":["../src/grounding.test.ts"],"names":[],"mappings":"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"}
|