fushiguro-mcp 0.1.0

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 (76) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +278 -0
  3. package/catalog/agents/backend-api.md +71 -0
  4. package/catalog/agents/content-editor.md +59 -0
  5. package/catalog/agents/customer-support.md +60 -0
  6. package/catalog/agents/data-analyst.md +66 -0
  7. package/catalog/agents/database.md +65 -0
  8. package/catalog/agents/docs.md +52 -0
  9. package/catalog/agents/process-automation.md +61 -0
  10. package/catalog/agents/research-analyst.md +57 -0
  11. package/catalog/agents/security.md +68 -0
  12. package/catalog/agents/testing.md +63 -0
  13. package/catalog/agents/ux-ui-specialist.md +87 -0
  14. package/catalog/connectors/crm.md +24 -0
  15. package/catalog/connectors/data-warehouse.md +26 -0
  16. package/catalog/connectors/document-store.md +23 -0
  17. package/catalog/connectors/helpdesk.md +24 -0
  18. package/catalog/knowledge/platform/using-this-catalog.md +50 -0
  19. package/catalog/runbooks/_TEMPLATE.md +52 -0
  20. package/catalog/runbooks/ai-use-case-intake.md +89 -0
  21. package/catalog/runbooks/change-release.md +54 -0
  22. package/catalog/runbooks/customer-escalation.md +67 -0
  23. package/catalog/skills/cite-sources.md +18 -0
  24. package/catalog/skills/clarify-scope.md +18 -0
  25. package/catalog/skills/data-quality-check.md +22 -0
  26. package/catalog/skills/risk-and-compliance-check.md +21 -0
  27. package/catalog/skills/stakeholder-summary.md +21 -0
  28. package/catalog/tools/knowledge-search.md +14 -0
  29. package/catalog/tools/shell.md +15 -0
  30. package/catalog/tools/web-fetch.md +15 -0
  31. package/catalog/tools/web-search.md +15 -0
  32. package/catalog/topics/ai-adoption.md +25 -0
  33. package/catalog/topics/customer-operations.md +21 -0
  34. package/catalog/topics/data-and-reporting.md +20 -0
  35. package/catalog/topics/marketing-content.md +19 -0
  36. package/catalog/topics/product-engineering.md +20 -0
  37. package/dist/catalog.d.ts +34 -0
  38. package/dist/catalog.js +412 -0
  39. package/dist/catalog.js.map +1 -0
  40. package/dist/config.d.ts +17 -0
  41. package/dist/config.js +48 -0
  42. package/dist/config.js.map +1 -0
  43. package/dist/index.d.ts +10 -0
  44. package/dist/index.js +46 -0
  45. package/dist/index.js.map +1 -0
  46. package/dist/init.d.ts +5 -0
  47. package/dist/init.js +159 -0
  48. package/dist/init.js.map +1 -0
  49. package/dist/knowledge.d.ts +31 -0
  50. package/dist/knowledge.js +126 -0
  51. package/dist/knowledge.js.map +1 -0
  52. package/dist/main.d.ts +1 -0
  53. package/dist/main.js +22 -0
  54. package/dist/main.js.map +1 -0
  55. package/dist/memory.d.ts +85 -0
  56. package/dist/memory.js +374 -0
  57. package/dist/memory.js.map +1 -0
  58. package/dist/quiet.d.ts +1 -0
  59. package/dist/quiet.js +21 -0
  60. package/dist/quiet.js.map +1 -0
  61. package/dist/registry.d.ts +15 -0
  62. package/dist/registry.js +128 -0
  63. package/dist/registry.js.map +1 -0
  64. package/dist/router.d.ts +55 -0
  65. package/dist/router.js +358 -0
  66. package/dist/router.js.map +1 -0
  67. package/dist/server.d.ts +6 -0
  68. package/dist/server.js +529 -0
  69. package/dist/server.js.map +1 -0
  70. package/dist/text.d.ts +20 -0
  71. package/dist/text.js +72 -0
  72. package/dist/text.js.map +1 -0
  73. package/dist/types.d.ts +195 -0
  74. package/dist/types.js +3 -0
  75. package/dist/types.js.map +1 -0
  76. package/package.json +57 -0
package/dist/server.js ADDED
@@ -0,0 +1,529 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { z } from "zod";
3
+ import { Catalog } from "./catalog.js";
4
+ import { catalogSources } from "./config.js";
5
+ import { KnowledgeIndex } from "./knowledge.js";
6
+ import { MemoryStore } from "./memory.js";
7
+ import { Router } from "./router.js";
8
+ const KINDS = ["preference", "constraint", "correction", "style", "fact"];
9
+ const OUTCOMES = ["accepted", "revised", "rejected", "wrong_agent"];
10
+ const SCOPE_CHOICES = ["global", "project", "both"];
11
+ const ENTITY_KINDS = [
12
+ "agent",
13
+ "skill",
14
+ "knowledge",
15
+ "runbook",
16
+ "topic",
17
+ "tool",
18
+ "connector",
19
+ ];
20
+ function text(body) {
21
+ return { content: [{ type: "text", text: body }] };
22
+ }
23
+ function renderMemory(m) {
24
+ return `- [#${m.id} ${m.kind}${m.agent ? ` @${m.agent}` : ""}] ${m.text}${m.why ? ` — why: ${m.why}` : ""}`;
25
+ }
26
+ /** `[base]`, `[custom]`, or `[base+custom]`, so it is always clear what is in play. */
27
+ function layerTag(entity) {
28
+ return `[${entity.layer}]`;
29
+ }
30
+ export function createServer(config) {
31
+ const catalog = new Catalog(catalogSources(config));
32
+ const memory = new MemoryStore(config.dbPath);
33
+ const knowledge = new KnowledgeIndex(config.dbPath);
34
+ const router = new Router(catalog, memory, knowledge, {
35
+ minScore: config.minScore,
36
+ ambiguityRatio: config.ambiguityRatio,
37
+ });
38
+ /** Reindex before any retrieval, so an edited knowledge file is live immediately. */
39
+ const syncKnowledge = () => {
40
+ catalog.refresh();
41
+ return knowledge.sync(catalog.chunks(), catalog.knowledgeSignature());
42
+ };
43
+ syncKnowledge();
44
+ const projectScope = `project:${config.projectRoot}`;
45
+ const scopesFor = (choice) => choice === "global"
46
+ ? ["global"]
47
+ : choice === "project"
48
+ ? [projectScope]
49
+ : ["global", projectScope];
50
+ const server = new McpServer({ name: "fushiguro", version: "0.1.0" }, {
51
+ instructions: [
52
+ "Fushiguro is this organisation's AI operating layer. It holds a catalog of",
53
+ "agents, skills, knowledge, runbooks, topics, tools, and connectors, and it",
54
+ "remembers how this user wants work done.",
55
+ "",
56
+ "Normal flow for any substantial task:",
57
+ "1. Call `brief` with the user's request.",
58
+ "2. Spawn a subagent with the returned system prompt, verbatim. It already",
59
+ " contains the agent's instructions, the skills and runbooks that apply,",
60
+ " retrieved knowledge, and the user's standing preferences.",
61
+ "3. When the user reacts, call `record_outcome`, and call `remember` for any",
62
+ " durable preference they state. That is what makes routing improve.",
63
+ "",
64
+ "Use `search_knowledge` on its own for a direct factual lookup, and",
65
+ "`list_catalog` to show what this organisation has configured.",
66
+ "",
67
+ "Call `remember` only for durable tastes, rules, and corrections",
68
+ '("always X", "never Y", "we prefer Z") — never for one-off task instructions.',
69
+ ].join("\n"),
70
+ });
71
+ // ------------------------------------------------------------- briefing
72
+ function renderBriefing(briefing) {
73
+ const { agent, route } = briefing;
74
+ const header = [
75
+ `Agent: ${agent.title} (\`${agent.name}\`) ${layerTag(agent)}`,
76
+ `Confidence: ${route.confidence}${route.ambiguous ? " — AMBIGUOUS, consider confirming with the user" : ""}`,
77
+ agent.model ? `Model hint: ${agent.model}` : null,
78
+ agent.tools.length ? `Tools to grant: ${agent.tools.join(", ")}` : null,
79
+ `Why: ${route.chosen?.why.join("; ") || "closest match in the catalog"}`,
80
+ route.alternatives.length
81
+ ? `Alternatives: ${route.alternatives.map((a) => `${a.name} (${a.score})`).join(", ")}`
82
+ : null,
83
+ "",
84
+ "Assembled from:",
85
+ `- topics: ${briefing.topics.map((t) => t.name).join(", ") || "none"}`,
86
+ `- skills: ${briefing.skills.map((s) => `${s.name} ${layerTag(s)}`).join(", ") || "none"}`,
87
+ `- runbooks: ${briefing.runbooks.map((r) => `${r.name}${r.template ? " (TEMPLATE — not yet filled in)" : ""}`).join(", ") || "none"}`,
88
+ `- knowledge: ${briefing.knowledge.length} chunk(s)${briefing.knowledge.length ? ` — ${briefing.knowledge.map((k) => k.id).join(", ")}` : ""}`,
89
+ `- connectors: ${briefing.connectors.map((c) => `${c.name}(${c.status})`).join(", ") || "none"}`,
90
+ `- memories: ${briefing.memories.length}`,
91
+ ]
92
+ .filter((line) => line !== null)
93
+ .join("\n");
94
+ return [
95
+ header,
96
+ "",
97
+ "--- BEGIN SYSTEM PROMPT (pass verbatim to the subagent) ---",
98
+ briefing.systemPrompt,
99
+ "--- END SYSTEM PROMPT ---",
100
+ "",
101
+ `When the user reacts, call \`record_outcome\` with agent="${agent.name}".`,
102
+ ].join("\n");
103
+ }
104
+ server.registerTool("brief", {
105
+ title: "Assemble a specialist briefing for a task",
106
+ description: "Route a task to the right agent and return a ready-to-use system prompt with " +
107
+ "its skills, runbooks, retrieved knowledge, tools, connectors, and this user's " +
108
+ "standing preferences already folded in. Spawn a subagent with the returned " +
109
+ "prompt; do not answer from this tool's output yourself.",
110
+ inputSchema: {
111
+ task: z.string().min(1).describe("The user's request, in their own words."),
112
+ context: z
113
+ .string()
114
+ .optional()
115
+ .describe("Extra routing signal: file paths, system names, error text, customer tier."),
116
+ agent: z
117
+ .string()
118
+ .optional()
119
+ .describe("Force a specific agent by slug, bypassing the router."),
120
+ scope: z.enum(SCOPE_CHOICES).default("both").describe("Memory scopes to draw from."),
121
+ memory_limit: z.number().int().min(0).max(40).default(10),
122
+ knowledge_limit: z
123
+ .number()
124
+ .int()
125
+ .min(0)
126
+ .max(20)
127
+ .default(6)
128
+ .describe("How many knowledge chunks to retrieve. 0 disables retrieval."),
129
+ },
130
+ annotations: { readOnlyHint: false, openWorldHint: false },
131
+ }, async ({ task, context, agent, scope, memory_limit, knowledge_limit }) => {
132
+ syncKnowledge();
133
+ if (agent && !catalog.get("agent", agent)) {
134
+ return {
135
+ ...text(`No agent named '${agent}'. Available: ${catalog.agents().map((a) => a.name).join(", ") || "(none)"}`),
136
+ isError: true,
137
+ };
138
+ }
139
+ const result = router.brief(task, context ?? "", {
140
+ scopes: scopesFor(scope),
141
+ memoryLimit: memory_limit,
142
+ knowledgeLimit: knowledge_limit,
143
+ agentName: agent,
144
+ });
145
+ const problems = catalog.errors();
146
+ if (!("agent" in result)) {
147
+ const lines = [
148
+ "No agent matched confidently.",
149
+ catalog.agents().length === 0
150
+ ? `The catalog has no agents. Add them to ${config.customCatalogDir}/agents/.`
151
+ : `Closest: ${result.route.alternatives.map((a) => `${a.name} (${a.score})`).join(", ") || "none"}`,
152
+ "",
153
+ "Handle this yourself, or ask the user which agent to use.",
154
+ ];
155
+ if (problems.length)
156
+ lines.push("", `Catalog problems: ${problems.join("; ")}`);
157
+ return {
158
+ ...text(lines.join("\n")),
159
+ structuredContent: { chosen: null, route: result.route },
160
+ };
161
+ }
162
+ const body = problems.length
163
+ ? `${renderBriefing(result)}\n\nCatalog problems: ${problems.join("; ")}`
164
+ : renderBriefing(result);
165
+ return {
166
+ ...text(body),
167
+ structuredContent: {
168
+ agent: {
169
+ name: result.agent.name,
170
+ title: result.agent.title,
171
+ layer: result.agent.layer,
172
+ model: result.agent.model ?? null,
173
+ tools: result.agent.tools,
174
+ },
175
+ route: result.route,
176
+ system_prompt: result.systemPrompt,
177
+ topics: result.topics.map((t) => t.name),
178
+ skills: result.skills.map((s) => ({ name: s.name, layer: s.layer })),
179
+ runbooks: result.runbooks.map((r) => ({ name: r.name, steps: r.steps.length })),
180
+ knowledge: result.knowledge.map((k) => ({
181
+ id: k.id,
182
+ doc: k.docName,
183
+ heading: k.heading,
184
+ score: k.score,
185
+ })),
186
+ connectors: result.connectors.map((c) => ({ name: c.name, status: c.status })),
187
+ memories: result.memories.map((m) => ({ id: m.id, kind: m.kind, text: m.text })),
188
+ },
189
+ };
190
+ });
191
+ // -------------------------------------------------------------- catalog
192
+ server.registerTool("list_catalog", {
193
+ title: "List what this organisation has configured",
194
+ description: "Show catalog entries — agents, skills, knowledge, runbooks, topics, tools, " +
195
+ "connectors — each tagged base, custom, or base+custom.",
196
+ inputSchema: {
197
+ kind: z
198
+ .enum(ENTITY_KINDS)
199
+ .optional()
200
+ .describe("Limit to one kind. Omit for a summary of everything."),
201
+ topic: z.string().optional().describe("Limit to entries in one topic."),
202
+ },
203
+ annotations: { readOnlyHint: true, openWorldHint: false },
204
+ }, async ({ kind, topic }) => {
205
+ catalog.refresh();
206
+ const problems = catalog.errors();
207
+ const kinds = (kind ? [kind] : ENTITY_KINDS);
208
+ const lines = [];
209
+ for (const k of kinds) {
210
+ let entries = catalog.all(k);
211
+ if (topic)
212
+ entries = entries.filter((e) => e.topics.includes(topic));
213
+ if (entries.length === 0) {
214
+ if (kind)
215
+ lines.push(`No ${k} entries${topic ? ` in topic '${topic}'` : ""}.`);
216
+ continue;
217
+ }
218
+ lines.push(`## ${k}s (${entries.length})`);
219
+ for (const entry of entries.sort((a, b) => a.name.localeCompare(b.name))) {
220
+ const note = entry.kind === "runbook" && entry.template
221
+ ? ` **TEMPLATE** (${entry.placeholders} field(s) to fill in)`
222
+ : "";
223
+ lines.push(`- \`${entry.name}\` ${layerTag(entry)}${note} — ${entry.title}: ${entry.description}`);
224
+ }
225
+ lines.push("");
226
+ }
227
+ lines.push(`Base catalog: ${config.baseCatalogDir}`, `Custom catalog: ${config.customCatalogDir}`);
228
+ if (problems.length)
229
+ lines.push("", `Problems: ${problems.join("; ")}`);
230
+ return {
231
+ ...text(lines.join("\n")),
232
+ structuredContent: {
233
+ counts: catalog.counts(),
234
+ entries: kinds.flatMap((k) => catalog.all(k).map((e) => ({
235
+ kind: k,
236
+ name: e.name,
237
+ title: e.title,
238
+ layer: e.layer,
239
+ topics: e.topics,
240
+ file: e.file,
241
+ }))),
242
+ problems,
243
+ },
244
+ };
245
+ });
246
+ server.registerTool("get_entry", {
247
+ title: "Read one catalog entry in full",
248
+ description: "Fetch the full content of one catalog entry — an agent's prompt, a skill, a " +
249
+ "runbook with its table of contents, a connector's guardrails.",
250
+ inputSchema: {
251
+ kind: z.enum(ENTITY_KINDS),
252
+ name: z.string().describe("The entry's slug."),
253
+ },
254
+ annotations: { readOnlyHint: true, openWorldHint: false },
255
+ }, async ({ kind, name }) => {
256
+ const entry = catalog.get(kind, name);
257
+ if (!entry) {
258
+ const available = catalog.all(kind).map((e) => e.name).join(", ") || "(none)";
259
+ return { ...text(`No ${kind} named '${name}'. Available: ${available}`), isError: true };
260
+ }
261
+ const header = [
262
+ `${entry.title} (\`${entry.name}\`) ${layerTag(entry)}`,
263
+ entry.description,
264
+ `Source: ${entry.file}`,
265
+ entry.topics.length ? `Topics: ${entry.topics.join(", ")}` : null,
266
+ entry.kind === "runbook" && entry.template
267
+ ? `TEMPLATE — ${entry.placeholders} [FILL: ...] field(s) still to complete.`
268
+ : null,
269
+ entry.kind === "runbook" && entry.toc.length
270
+ ? `\nContents:\n${entry.toc.map((s) => `${" ".repeat(s.level - 1)}- ${s.title}`).join("\n")}`
271
+ : null,
272
+ ]
273
+ .filter(Boolean)
274
+ .join("\n");
275
+ return {
276
+ ...text(`${header}\n\n---\n\n${entry.body}`),
277
+ structuredContent: { ...entry, patterns: entry.patterns.map(String) },
278
+ };
279
+ });
280
+ server.registerTool("search_knowledge", {
281
+ title: "Search the organisation's knowledge base",
282
+ description: "Retrieve passages from the organisation's own documentation. Use for a direct " +
283
+ "factual lookup. Cite the returned chunk id when you use a passage, and say so " +
284
+ "plainly when the answer is not in the corpus rather than filling the gap.",
285
+ inputSchema: {
286
+ query: z.string().min(1),
287
+ collections: z
288
+ .array(z.string())
289
+ .optional()
290
+ .describe("Limit to these knowledge collections (the folder under knowledge/)."),
291
+ limit: z.number().int().min(1).max(20).default(6),
292
+ },
293
+ annotations: { readOnlyHint: true, openWorldHint: false },
294
+ }, async ({ query, collections, limit }) => {
295
+ syncKnowledge();
296
+ const hits = knowledge.search(query, { collections, limit });
297
+ if (hits.length === 0) {
298
+ const stats = knowledge.stats();
299
+ return text(`No passages matched. The corpus holds ${stats.chunks} chunk(s) across: ` +
300
+ `${Object.keys(stats.collections).join(", ") || "no collections"}.`);
301
+ }
302
+ const body = hits
303
+ .map((h) => `## [${h.id}] ${h.docName}${h.heading ? ` — ${h.heading}` : ""} (score ${h.score})\n${h.text}`)
304
+ .join("\n\n");
305
+ return {
306
+ ...text(`${hits.length} passage(s):\n\n${body}`),
307
+ structuredContent: { hits },
308
+ };
309
+ });
310
+ // --------------------------------------------------------------- memory
311
+ server.registerTool("remember", {
312
+ title: "Store a durable preference",
313
+ description: "Record a preference, rule, or correction so future briefings honour it. " +
314
+ "Restating an existing preference reinforces it rather than duplicating; a " +
315
+ "constraint or correction that contradicts a softer memory retires the old one. " +
316
+ "Use for standing rules, never for one-off task instructions.",
317
+ inputSchema: {
318
+ text: z.string().min(1).describe("The preference, stated as a durable rule."),
319
+ kind: z
320
+ .enum(KINDS)
321
+ .default("preference")
322
+ .describe("constraint = hard rule; correction = fixing a past mistake; " +
323
+ "preference/style = soft taste; fact = context about the user or business."),
324
+ agent: z.string().optional().describe("Agent slug this applies to. Omit for all agents."),
325
+ scope: z
326
+ .enum(["global", "project"])
327
+ .default("global")
328
+ .describe("'project' keys the memory to this codebase or workspace only."),
329
+ why: z.string().optional().describe("The reason behind it — carried into briefings."),
330
+ confidence: z.number().min(0).max(1).default(0.6),
331
+ },
332
+ annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: false },
333
+ }, async (args) => {
334
+ if (args.agent && !catalog.get("agent", args.agent)) {
335
+ return {
336
+ ...text(`No agent named '${args.agent}'. Available: ${catalog.agents().map((a) => a.name).join(", ") || "(none)"}`),
337
+ isError: true,
338
+ };
339
+ }
340
+ const result = memory.remember({
341
+ text: args.text,
342
+ kind: args.kind,
343
+ scope: args.scope === "project" ? projectScope : "global",
344
+ agent: args.agent ?? null,
345
+ why: args.why ?? null,
346
+ confidence: args.confidence,
347
+ source: "mcp:remember",
348
+ });
349
+ const verb = result.action === "created"
350
+ ? "Stored"
351
+ : result.action === "reinforced"
352
+ ? "Reinforced existing"
353
+ : `Stored, superseding #${result.supersededId}:`;
354
+ return {
355
+ ...text(`${verb} memory #${result.id} (confidence ${result.memory.confidence.toFixed(2)}).\n${renderMemory(result.memory)}`),
356
+ structuredContent: { id: result.id, action: result.action, memory: result.memory },
357
+ };
358
+ });
359
+ server.registerTool("recall", {
360
+ title: "Search stored preferences",
361
+ description: "Search remembered preferences, ranked by relevance and how binding they are.",
362
+ inputSchema: {
363
+ query: z.string().optional().describe("Omit to list the most recent memories."),
364
+ agent: z.string().optional(),
365
+ scope: z.enum(SCOPE_CHOICES).default("both"),
366
+ limit: z.number().int().min(1).max(50).default(12),
367
+ },
368
+ annotations: { readOnlyHint: true, openWorldHint: false },
369
+ }, async ({ query, agent, scope, limit }) => {
370
+ const results = memory.recall({
371
+ query,
372
+ agent: agent ?? null,
373
+ scopes: scopesFor(scope),
374
+ limit,
375
+ });
376
+ if (results.length === 0)
377
+ return text("No matching memories.");
378
+ return {
379
+ ...text([`${results.length} memory/memories:`, ...results.map(renderMemory)].join("\n")),
380
+ structuredContent: { memories: results },
381
+ };
382
+ });
383
+ server.registerTool("forget", {
384
+ title: "Delete a stored preference",
385
+ description: "Permanently delete one memory by id. Use when the user says a preference is wrong or obsolete.",
386
+ inputSchema: { id: z.number().int().describe("Memory id, as shown by recall.") },
387
+ annotations: {
388
+ readOnlyHint: false,
389
+ destructiveHint: true,
390
+ idempotentHint: true,
391
+ openWorldHint: false,
392
+ },
393
+ }, async ({ id }) => {
394
+ const existing = memory.get(id);
395
+ if (!existing)
396
+ return { ...text(`No memory #${id}.`), isError: true };
397
+ memory.forget(id);
398
+ return text(`Deleted memory #${id}: ${existing.text}`);
399
+ });
400
+ server.registerTool("record_outcome", {
401
+ title: "Report how a briefed task went",
402
+ description: "Tell the router whether the agent it chose was right. This adjusts the " +
403
+ "term-to-agent weights it consults, so routing improves with use. Call after " +
404
+ "the user reacts to a subagent's work.",
405
+ inputSchema: {
406
+ task: z.string().describe("The original task text, so the same terms get reweighted."),
407
+ agent: z.string().describe("The agent that was used."),
408
+ outcome: z
409
+ .enum(OUTCOMES)
410
+ .describe("accepted = good; revised = needed edits; rejected = unusable; wrong_agent = wrong specialist."),
411
+ correct_agent: z
412
+ .string()
413
+ .optional()
414
+ .describe("For 'wrong_agent': the agent that should have handled it."),
415
+ notes: z.string().optional(),
416
+ },
417
+ annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: false },
418
+ }, async ({ task, agent, outcome, correct_agent, notes }) => {
419
+ const result = memory.recordOutcome({
420
+ task,
421
+ agent,
422
+ outcome,
423
+ notes: notes ?? null,
424
+ correctAgent: correct_agent ?? null,
425
+ });
426
+ return {
427
+ ...text(`Recorded '${outcome}' for '${agent}' (decision #${result.decisionId}). ` +
428
+ `Reweighted ${result.adjusted} term(s)${correct_agent ? ` and towards '${correct_agent}'` : ""}.`),
429
+ structuredContent: result,
430
+ };
431
+ });
432
+ server.registerTool("status", {
433
+ title: "Catalog and memory overview",
434
+ description: "What is loaded: catalog counts by kind and layer, knowledge index size, stored " +
435
+ "preferences, and any files that failed to parse.",
436
+ inputSchema: {},
437
+ annotations: { readOnlyHint: true, openWorldHint: false },
438
+ }, async () => {
439
+ syncKnowledge();
440
+ const counts = catalog.counts();
441
+ const memStats = memory.stats();
442
+ const kbStats = knowledge.stats();
443
+ const templates = catalog.runbooks().filter((r) => r.template);
444
+ const byLayer = (kind) => {
445
+ const entries = catalog.all(kind);
446
+ const tally = { base: 0, custom: 0, "base+custom": 0 };
447
+ for (const e of entries)
448
+ tally[e.layer] += 1;
449
+ return `${entries.length} (base ${tally.base}, custom ${tally.custom}, merged ${tally["base+custom"]})`;
450
+ };
451
+ const lines = [
452
+ `Base catalog: ${config.baseCatalogDir}`,
453
+ `Custom catalog: ${config.customCatalogDir}`,
454
+ `Memory db: ${config.dbPath}`,
455
+ `Project scope: ${config.projectRoot}`,
456
+ "",
457
+ ...ENTITY_KINDS.map((k) => `${k.padEnd(10)} ${byLayer(k)}`),
458
+ "",
459
+ `Knowledge index: ${kbStats.chunks} chunk(s) across ${Object.keys(kbStats.collections).length} collection(s)`,
460
+ `Memories: ${memStats.total} active, ${memStats.superseded} superseded, ${memStats.decisions} decision(s) logged`,
461
+ `By kind: ${Object.entries(memStats.byKind).map(([k, v]) => `${k}=${v}`).join(", ") || "none"}`,
462
+ ...(templates.length
463
+ ? [
464
+ "",
465
+ "Runbooks still unfilled templates — complete these for your business:",
466
+ ...templates.map((r) => `- ${r.name} (${r.placeholders} field(s)) — ${r.file}`),
467
+ ]
468
+ : []),
469
+ ];
470
+ if (memStats.topUsed.length > 0) {
471
+ lines.push("", "Most-used memories:", ...memStats.topUsed.map((m) => `- #${m.id} (${m.hits}x) ${m.text}`));
472
+ }
473
+ const problems = catalog.errors();
474
+ if (problems.length)
475
+ lines.push("", "Catalog problems:", ...problems.map((p) => `- ${p}`));
476
+ return {
477
+ ...text(lines.join("\n")),
478
+ structuredContent: { counts, memory: memStats, knowledge: kbStats, problems },
479
+ };
480
+ });
481
+ // ------------------------------------------------- resources and prompts
482
+ server.registerResource("catalog", "fushiguro://catalog", {
483
+ title: "Catalog index",
484
+ description: "Every agent, skill, knowledge doc, runbook, topic, tool, and connector.",
485
+ mimeType: "application/json",
486
+ }, async (uri) => ({
487
+ contents: [
488
+ {
489
+ uri: uri.href,
490
+ mimeType: "application/json",
491
+ text: JSON.stringify(Object.fromEntries(ENTITY_KINDS.map((kind) => [
492
+ kind,
493
+ catalog.all(kind).map((e) => ({
494
+ name: e.name,
495
+ title: e.title,
496
+ description: e.description,
497
+ layer: e.layer,
498
+ topics: e.topics,
499
+ })),
500
+ ])), null, 2),
501
+ },
502
+ ],
503
+ }));
504
+ server.registerPrompt("delegate", {
505
+ title: "Delegate a task to a specialist",
506
+ description: "Brief the right agent and hand its prompt to a subagent.",
507
+ argsSchema: { task: z.string().describe("What you want done.") },
508
+ }, ({ task }) => ({
509
+ messages: [
510
+ {
511
+ role: "user",
512
+ content: {
513
+ type: "text",
514
+ text: "Call `brief` with this task, then spawn a subagent using the system prompt " +
515
+ "it returns, verbatim. Report the subagent's result, then call `record_outcome`." +
516
+ `\n\nTask: ${task}`,
517
+ },
518
+ },
519
+ ],
520
+ }));
521
+ return {
522
+ server,
523
+ close: () => {
524
+ memory.close();
525
+ knowledge.close();
526
+ },
527
+ };
528
+ }
529
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
package/dist/text.d.ts ADDED
@@ -0,0 +1,20 @@
1
+ /** Tokenising and FTS helpers shared by the memory store, knowledge index, and router. */
2
+ /** Lowercase alphanumeric tokens with stopwords dropped. */
3
+ export declare function tokenize(text: string): string[];
4
+ /** Overlap of two token sets, 0..1. */
5
+ export declare function jaccard(a: string[], b: string[]): number;
6
+ /**
7
+ * How much of the *smaller* token set is contained in the larger. Catches a
8
+ * preference restated at greater length, which Jaccard scores badly because the
9
+ * extra words inflate the union.
10
+ */
11
+ export declare function containment(a: string[], b: string[]): number;
12
+ /** Count of distinct tokens present in both sets. */
13
+ export declare function sharedTokens(a: string[], b: string[]): number;
14
+ /** Fraction of `a`'s distinct tokens that appear in `b`. */
15
+ export declare function coverage(a: string[], b: string[]): number;
16
+ /**
17
+ * Turns free text into a safe FTS5 MATCH expression. Every token is quoted, so
18
+ * user text can never inject FTS operators and break the query.
19
+ */
20
+ export declare function ftsQuery(text: string): string | null;
package/dist/text.js ADDED
@@ -0,0 +1,72 @@
1
+ /** Tokenising and FTS helpers shared by the memory store, knowledge index, and router. */
2
+ const STOPWORDS = new Set([
3
+ "a", "an", "and", "are", "as", "at", "be", "but", "by", "can", "do", "for",
4
+ "from", "how", "i", "if", "in", "into", "is", "it", "its", "me", "my", "no",
5
+ "not", "of", "on", "or", "our", "so", "than", "that", "the", "then", "there",
6
+ "these", "they", "this", "to", "up", "use", "was", "we", "what", "when",
7
+ "which", "will", "with", "would", "you", "your",
8
+ ]);
9
+ /** Lowercase alphanumeric tokens with stopwords dropped. */
10
+ export function tokenize(text) {
11
+ return (text.toLowerCase().match(/[a-z0-9][a-z0-9+#.-]*/g) ?? []).filter((t) => t.length > 1 && !STOPWORDS.has(t));
12
+ }
13
+ /** Overlap of two token sets, 0..1. */
14
+ export function jaccard(a, b) {
15
+ const setA = new Set(a);
16
+ const setB = new Set(b);
17
+ if (setA.size === 0 || setB.size === 0)
18
+ return 0;
19
+ let shared = 0;
20
+ for (const t of setA)
21
+ if (setB.has(t))
22
+ shared += 1;
23
+ return shared / (setA.size + setB.size - shared);
24
+ }
25
+ /**
26
+ * How much of the *smaller* token set is contained in the larger. Catches a
27
+ * preference restated at greater length, which Jaccard scores badly because the
28
+ * extra words inflate the union.
29
+ */
30
+ export function containment(a, b) {
31
+ const setA = new Set(a);
32
+ const setB = new Set(b);
33
+ if (setA.size === 0 || setB.size === 0)
34
+ return 0;
35
+ let shared = 0;
36
+ for (const t of setA)
37
+ if (setB.has(t))
38
+ shared += 1;
39
+ return shared / Math.min(setA.size, setB.size);
40
+ }
41
+ /** Count of distinct tokens present in both sets. */
42
+ export function sharedTokens(a, b) {
43
+ const setB = new Set(b);
44
+ let shared = 0;
45
+ for (const t of new Set(a))
46
+ if (setB.has(t))
47
+ shared += 1;
48
+ return shared;
49
+ }
50
+ /** Fraction of `a`'s distinct tokens that appear in `b`. */
51
+ export function coverage(a, b) {
52
+ if (a.length === 0 || b.length === 0)
53
+ return 0;
54
+ const setB = new Set(b);
55
+ const setA = new Set(a);
56
+ let shared = 0;
57
+ for (const t of setA)
58
+ if (setB.has(t))
59
+ shared += 1;
60
+ return shared / setA.size;
61
+ }
62
+ /**
63
+ * Turns free text into a safe FTS5 MATCH expression. Every token is quoted, so
64
+ * user text can never inject FTS operators and break the query.
65
+ */
66
+ export function ftsQuery(text) {
67
+ const tokens = [...new Set(tokenize(text))].slice(0, 24);
68
+ if (tokens.length === 0)
69
+ return null;
70
+ return tokens.map((t) => `"${t.replace(/"/g, '""')}"`).join(" OR ");
71
+ }
72
+ //# sourceMappingURL=text.js.map