@hiveai/mcp 0.2.2 → 0.2.4

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/index.js CHANGED
@@ -86,6 +86,8 @@ var MemListInputSchema = {
86
86
  type: z3.enum(["convention", "decision", "gotcha", "architecture", "glossary"]).optional(),
87
87
  module: z3.string().optional(),
88
88
  tag: z3.string().optional(),
89
+ status: z3.enum(["draft", "proposed", "validated", "deprecated", "stale", "rejected"]).optional().describe("Filter by a single status. Omit to return all statuses."),
90
+ exclude_rejected: z3.boolean().default(false).describe("When true, exclude memories with status=rejected from results."),
89
91
  include_body: z3.boolean().default(false).describe("Include full body text. Default false to save tokens \u2014 use mem_get for a single memory's full content.")
90
92
  };
91
93
  async function memList(input, ctx) {
@@ -99,6 +101,8 @@ async function memList(input, ctx) {
99
101
  if (input.type && fm.type !== input.type) return false;
100
102
  if (input.module && fm.module !== input.module) return false;
101
103
  if (input.tag && !fm.tags.includes(input.tag)) return false;
104
+ if (input.status && fm.status !== input.status) return false;
105
+ if (input.exclude_rejected && fm.status === "rejected") return false;
102
106
  return true;
103
107
  });
104
108
  const memories = filtered.map(({ memory, filePath }) => {
@@ -197,6 +201,8 @@ var MemSearchInputSchema = {
197
201
  scope: z5.enum(["personal", "team", "module"]).optional().describe("Restrict results to a single scope"),
198
202
  type: z5.enum(["convention", "decision", "gotcha", "architecture", "glossary"]).optional().describe("Restrict results to a memory type"),
199
203
  module: z5.string().optional().describe("Restrict results to a module"),
204
+ status: z5.enum(["draft", "proposed", "validated", "deprecated", "stale", "rejected"]).optional().describe("Filter by a single status. Omit to return all statuses."),
205
+ exclude_rejected: z5.boolean().default(false).describe("When true, exclude memories with status=rejected from results."),
200
206
  limit: z5.number().int().positive().max(100).default(20).describe("Max results"),
201
207
  semantic: z5.boolean().default(false).describe(
202
208
  "Use semantic similarity from the embeddings index (requires `haive embeddings index`)."
@@ -238,6 +244,8 @@ function passesFilters(fm, input) {
238
244
  if (input.scope && fm.scope !== input.scope) return false;
239
245
  if (input.type && fm.type !== input.type) return false;
240
246
  if (input.module && fm.module !== input.module) return false;
247
+ if (input.status && fm.status !== input.status) return false;
248
+ if (input.exclude_rejected && fm.status === "rejected") return false;
241
249
  return true;
242
250
  }
243
251
  function buildLiteralResult(input, filtered, usage) {
@@ -428,7 +436,11 @@ async function memReject(input, ctx) {
428
436
  await writeFile4(
429
437
  loaded.filePath,
430
438
  serializeMemory3({
431
- frontmatter: { ...loaded.memory.frontmatter, status: "rejected" },
439
+ frontmatter: {
440
+ ...loaded.memory.frontmatter,
441
+ status: "rejected",
442
+ stale_reason: input.reason ?? loaded.memory.frontmatter.stale_reason ?? null
443
+ },
432
444
  body: loaded.memory.body
433
445
  }),
434
446
  "utf8"
@@ -1079,7 +1091,7 @@ ${template}\`\`\`
1079
1091
 
1080
1092
  // src/server.ts
1081
1093
  var SERVER_NAME = "haive";
1082
- var SERVER_VERSION = "0.2.2";
1094
+ var SERVER_VERSION = "0.2.4";
1083
1095
  function jsonResult(data) {
1084
1096
  return {
1085
1097
  content: [
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/server.ts","../src/context.ts","../src/tools/bootstrap-project-save.ts","../src/tools/get-project-context.ts","../src/tools/mem-list.ts","../src/tools/mem-save.ts","../src/tools/mem-search.ts","../src/tools/mem-verify.ts","../src/tools/mem-reject.ts","../src/tools/mem-for-files.ts","../src/tools/mem-get.ts","../src/tools/mem-delete.ts","../src/tools/mem-update.ts","../src/tools/mem-pending.ts","../src/tools/mem-approve.ts","../src/tools/get-briefing.ts","../src/tools/code-map.ts","../src/prompts/bootstrap-project.ts"],"sourcesContent":["import { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { createHaiveServer, SERVER_VERSION } from \"./server.js\";\n\nfunction parseArgs(argv: string[]): { root?: string } {\n const out: { root?: string } = {};\n for (let i = 2; i < argv.length; i++) {\n const arg = argv[i];\n if (arg === \"--root\" || arg === \"-r\") {\n out.root = argv[++i];\n } else if (arg?.startsWith(\"--root=\")) {\n out.root = arg.slice(\"--root=\".length);\n }\n }\n return out;\n}\n\nasync function main(): Promise<void> {\n const { root } = parseArgs(process.argv);\n const { server, context } = createHaiveServer({ root });\n // stderr is safe — stdio transport uses stdin/stdout exclusively for MCP frames.\n console.error(\n `[haive-mcp] starting server v${SERVER_VERSION} (project root: ${context.paths.root})`,\n );\n const transport = new StdioServerTransport();\n await server.connect(transport);\n}\n\nmain().catch((err: unknown) => {\n console.error(\"[haive-mcp] fatal:\", err instanceof Error ? err.message : err);\n process.exit(1);\n});\n","import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { createContext, type CreateContextOptions, type HaiveContext } from \"./context.js\";\nimport {\n BootstrapProjectSaveInputSchema,\n bootstrapProjectSave,\n type BootstrapProjectSaveInput,\n} from \"./tools/bootstrap-project-save.js\";\nimport {\n GetProjectContextInputSchema,\n getProjectContext,\n type GetProjectContextInput,\n} from \"./tools/get-project-context.js\";\nimport { MemListInputSchema, memList, type MemListInput } from \"./tools/mem-list.js\";\nimport { MemSaveInputSchema, memSave, type MemSaveInput } from \"./tools/mem-save.js\";\nimport {\n MemSearchInputSchema,\n memSearch,\n type MemSearchInput,\n} from \"./tools/mem-search.js\";\nimport {\n MemVerifyInputSchema,\n memVerify,\n type MemVerifyInput,\n} from \"./tools/mem-verify.js\";\nimport {\n MemRejectInputSchema,\n memReject,\n type MemRejectInput,\n} from \"./tools/mem-reject.js\";\nimport {\n MemForFilesInputSchema,\n memForFiles,\n type MemForFilesInput,\n} from \"./tools/mem-for-files.js\";\nimport { MemGetInputSchema, memGet, type MemGetInput } from \"./tools/mem-get.js\";\nimport {\n MemDeleteInputSchema,\n memDelete,\n type MemDeleteInput,\n} from \"./tools/mem-delete.js\";\nimport {\n MemUpdateInputSchema,\n memUpdate,\n type MemUpdateInput,\n} from \"./tools/mem-update.js\";\nimport {\n MemPendingInputSchema,\n memPending,\n type MemPendingInput,\n} from \"./tools/mem-pending.js\";\nimport {\n MemApproveInputSchema,\n memApprove,\n type MemApproveInput,\n} from \"./tools/mem-approve.js\";\nimport {\n GetBriefingInputSchema,\n getBriefing,\n type GetBriefingInput,\n} from \"./tools/get-briefing.js\";\nimport {\n CodeMapInputSchema,\n codeMapTool,\n type CodeMapInput,\n} from \"./tools/code-map.js\";\nimport {\n BootstrapProjectArgsSchema,\n bootstrapProjectPrompt,\n type BootstrapProjectArgs,\n} from \"./prompts/bootstrap-project.js\";\n\ndeclare const __HAIVE_VERSION__: string;\n\nexport const SERVER_NAME = \"haive\";\nexport const SERVER_VERSION = __HAIVE_VERSION__;\n\nfunction jsonResult(data: unknown) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: JSON.stringify(data, null, 2),\n },\n ],\n };\n}\n\nexport function createHaiveServer(\n options: CreateContextOptions = {},\n): { server: McpServer; context: HaiveContext } {\n const context = createContext(options);\n const server = new McpServer(\n { name: SERVER_NAME, version: SERVER_VERSION },\n { capabilities: { tools: {}, prompts: {} } },\n );\n\n server.tool(\n \"mem_save\",\n \"Save a new memory (default scope=personal). Use scope=team for shared memories.\",\n MemSaveInputSchema,\n async (input: MemSaveInput) => jsonResult(await memSave(input, context)),\n );\n\n server.tool(\n \"mem_search\",\n \"Search memories by substring across id, tags, and body. Optional filters by scope/type/module.\",\n MemSearchInputSchema,\n async (input: MemSearchInput) => jsonResult(await memSearch(input, context)),\n );\n\n server.tool(\n \"mem_list\",\n \"List memories with optional filters by scope/type/module/tag.\",\n MemListInputSchema,\n async (input: MemListInput) => jsonResult(await memList(input, context)),\n );\n\n server.tool(\n \"get_project_context\",\n \"Read the shared .ai/project-context.md (and optionally a module context).\",\n GetProjectContextInputSchema,\n async (input: GetProjectContextInput) =>\n jsonResult(await getProjectContext(input, context)),\n );\n\n server.tool(\n \"get_briefing\",\n \"One-shot onboarding: returns project context + module contexts + ranked relevant memories under a token budget. Replaces 4–5 separate calls when an agent starts a task.\",\n GetBriefingInputSchema,\n async (input: GetBriefingInput) => jsonResult(await getBriefing(input, context)),\n );\n\n server.tool(\n \"code_map\",\n \"Browse the project's pre-computed code map (file → exports + 1-line description) instead of grepping. Requires `haive index code`.\",\n CodeMapInputSchema,\n async (input: CodeMapInput) => jsonResult(await codeMapTool(input, context)),\n );\n\n server.tool(\n \"bootstrap_project_save\",\n \"Persist a project (or module) context document analyzed by the AI client.\",\n BootstrapProjectSaveInputSchema,\n async (input: BootstrapProjectSaveInput) =>\n jsonResult(await bootstrapProjectSave(input, context)),\n );\n\n server.tool(\n \"mem_verify\",\n \"Check anchor freshness for one or every memory; optionally write status updates back to disk.\",\n MemVerifyInputSchema,\n async (input: MemVerifyInput) => jsonResult(await memVerify(input, context)),\n );\n\n server.tool(\n \"mem_reject\",\n \"Record a rejection for a memory (blocks auto-promotion and lowers its trust signal).\",\n MemRejectInputSchema,\n async (input: MemRejectInput) => jsonResult(await memReject(input, context)),\n );\n\n server.tool(\n \"mem_for_files\",\n \"Given the file paths the agent is currently working on, return relevant memories grouped by reason (anchor overlap, module, domain) plus any matching .ai/modules/<name>/context.md contents.\",\n MemForFilesInputSchema,\n async (input: MemForFilesInput) => jsonResult(await memForFiles(input, context)),\n );\n\n server.tool(\n \"mem_get\",\n \"Fetch a single memory by id, including its body, anchor, usage, and confidence.\",\n MemGetInputSchema,\n async (input: MemGetInput) => jsonResult(await memGet(input, context)),\n );\n\n server.tool(\n \"mem_delete\",\n \"Delete a memory by id (and its usage entry by default).\",\n MemDeleteInputSchema,\n async (input: MemDeleteInput) => jsonResult(await memDelete(input, context)),\n );\n\n server.tool(\n \"mem_update\",\n \"Update the body, tags, or anchor of an existing memory without changing its id or losing usage history.\",\n MemUpdateInputSchema,\n async (input: MemUpdateInput) => jsonResult(await memUpdate(input, context)),\n );\n\n server.tool(\n \"mem_pending\",\n \"List 'proposed' memories awaiting review, sorted by reads (most-read first).\",\n MemPendingInputSchema,\n async (input: MemPendingInput) => jsonResult(await memPending(input, context)),\n );\n\n server.tool(\n \"mem_approve\",\n \"Mark a memory as validated immediately (explicit team review).\",\n MemApproveInputSchema,\n async (input: MemApproveInput) => jsonResult(await memApprove(input, context)),\n );\n\n server.prompt(\n \"bootstrap_project\",\n \"Instructions for the AI client to analyze the project and save the context.\",\n BootstrapProjectArgsSchema,\n (args: BootstrapProjectArgs) => bootstrapProjectPrompt(args, context),\n );\n\n return { server, context };\n}\n","import { findProjectRoot, resolveHaivePaths, type HaivePaths } from \"@hiveai/core\";\n\nexport interface HaiveContext {\n paths: HaivePaths;\n}\n\nexport interface CreateContextOptions {\n root?: string;\n env?: NodeJS.ProcessEnv;\n cwd?: string;\n}\n\nexport function createContext(options: CreateContextOptions = {}): HaiveContext {\n const env = options.env ?? process.env;\n const cwd = options.cwd ?? process.cwd();\n const root =\n options.root ??\n env.HAIVE_PROJECT_ROOT ??\n findProjectRoot(cwd);\n return { paths: resolveHaivePaths(root) };\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const BootstrapProjectSaveInputSchema = {\n content: z\n .string()\n .min(1)\n .describe(\"Full Markdown content for the project (or module) context file\"),\n module: z\n .string()\n .optional()\n .describe(\n \"If provided, save under .ai/modules/<module>/context.md instead of .ai/project-context.md\",\n ),\n overwrite: z\n .boolean()\n .default(false)\n .describe(\"Overwrite an existing file instead of failing\"),\n};\n\nexport type BootstrapProjectSaveInput = {\n [K in keyof typeof BootstrapProjectSaveInputSchema]: z.infer<\n (typeof BootstrapProjectSaveInputSchema)[K]\n >;\n};\n\nexport interface BootstrapProjectSaveOutput {\n file_path: string;\n action: \"created\" | \"overwritten\";\n}\n\nexport async function bootstrapProjectSave(\n input: BootstrapProjectSaveInput,\n ctx: HaiveContext,\n): Promise<BootstrapProjectSaveOutput> {\n const target = input.module\n ? path.join(ctx.paths.modulesContextDir, input.module, \"context.md\")\n : ctx.paths.projectContext;\n\n const exists = existsSync(target);\n if (exists && !input.overwrite) {\n throw new Error(\n `${target} already exists. Pass overwrite=true to replace it.`,\n );\n }\n\n await mkdir(path.dirname(target), { recursive: true });\n await writeFile(target, input.content, \"utf8\");\n\n return {\n file_path: target,\n action: exists ? \"overwritten\" : \"created\",\n };\n}\n","import { readFile, readdir } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const GetProjectContextInputSchema = {\n module: z\n .string()\n .optional()\n .describe(\"If provided, also include the matching module's context file\"),\n list_modules: z\n .boolean()\n .default(false)\n .describe(\"Return the list of available module context files\"),\n};\n\nexport type GetProjectContextInput = {\n [K in keyof typeof GetProjectContextInputSchema]: z.infer<\n (typeof GetProjectContextInputSchema)[K]\n >;\n};\n\nexport interface GetProjectContextOutput {\n root_context: string | null;\n module_context?: { name: string; content: string };\n available_modules?: string[];\n}\n\nexport async function getProjectContext(\n input: GetProjectContextInput,\n ctx: HaiveContext,\n): Promise<GetProjectContextOutput> {\n const out: GetProjectContextOutput = { root_context: null };\n\n if (existsSync(ctx.paths.projectContext)) {\n out.root_context = await readFile(ctx.paths.projectContext, \"utf8\");\n }\n\n if (input.module) {\n const modFile = path.join(ctx.paths.modulesContextDir, input.module, \"context.md\");\n if (existsSync(modFile)) {\n out.module_context = {\n name: input.module,\n content: await readFile(modFile, \"utf8\"),\n };\n }\n }\n\n if (input.list_modules) {\n out.available_modules = await listModules(ctx.paths.modulesContextDir);\n }\n\n return out;\n}\n\nasync function listModules(modulesDir: string): Promise<string[]> {\n if (!existsSync(modulesDir)) return [];\n const entries = await readdir(modulesDir, { withFileTypes: true });\n return entries.filter((e) => e.isDirectory()).map((e) => e.name).sort();\n}\n","import { existsSync } from \"node:fs\";\nimport { loadMemoriesFromDir } from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemListInputSchema = {\n scope: z.enum([\"personal\", \"team\", \"module\"]).optional(),\n type: z\n .enum([\"convention\", \"decision\", \"gotcha\", \"architecture\", \"glossary\"])\n .optional(),\n module: z.string().optional(),\n tag: z.string().optional(),\n include_body: z\n .boolean()\n .default(false)\n .describe(\"Include full body text. Default false to save tokens — use mem_get for a single memory's full content.\"),\n};\n\nexport type MemListInput = {\n [K in keyof typeof MemListInputSchema]: z.infer<(typeof MemListInputSchema)[K]>;\n};\n\nexport interface MemSummary {\n id: string;\n scope: string;\n type: string;\n module?: string;\n status: string;\n tags: string[];\n snippet: string;\n file_path: string;\n body?: string;\n}\n\nexport async function memList(\n input: MemListInput,\n ctx: HaiveContext,\n): Promise<{ memories: MemSummary[] }> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n return { memories: [] };\n }\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const filtered = all.filter(({ memory }) => {\n const fm = memory.frontmatter;\n if (input.scope && fm.scope !== input.scope) return false;\n if (input.type && fm.type !== input.type) return false;\n if (input.module && fm.module !== input.module) return false;\n if (input.tag && !fm.tags.includes(input.tag)) return false;\n return true;\n });\n const memories: MemSummary[] = filtered.map(({ memory, filePath }) => {\n const fm = memory.frontmatter;\n const snippet = memory.body.replace(/\\s+/g, \" \").trim().slice(0, 120);\n return {\n id: fm.id,\n scope: fm.scope,\n type: fm.type,\n ...(fm.module ? { module: fm.module } : {}),\n status: fm.status,\n tags: fm.tags,\n snippet,\n file_path: filePath,\n ...(input.include_body ? { body: memory.body } : {}),\n };\n });\n return { memories };\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport {\n buildFrontmatter,\n memoryFilePath,\n serializeMemory,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemSaveInputSchema = {\n type: z\n .enum([\"convention\", \"decision\", \"gotcha\", \"architecture\", \"glossary\"])\n .describe(\"Kind of memory being saved\"),\n slug: z\n .string()\n .min(1)\n .describe(\"Short human-readable identifier — becomes part of the filename\"),\n body: z\n .string()\n .describe(\"Markdown body of the memory\"),\n scope: z\n .enum([\"personal\", \"team\", \"module\"])\n .default(\"personal\")\n .describe(\"Visibility scope: personal | team | module\"),\n module: z\n .string()\n .optional()\n .describe(\"Module name (required when scope=module)\"),\n tags: z.array(z.string()).default([]).describe(\"Tags for filtering\"),\n domain: z.string().optional().describe(\"Domain (e.g. transactions, billing)\"),\n author: z.string().optional().describe(\"Author handle or email\"),\n paths: z\n .array(z.string())\n .default([])\n .describe(\"Anchor paths (file paths this memory references)\"),\n symbols: z\n .array(z.string())\n .default([])\n .describe(\"Anchor symbols (function/class names this memory references)\"),\n commit: z\n .string()\n .optional()\n .describe(\"Anchor commit SHA (for staleness detection later)\"),\n};\n\nexport type MemSaveInput = {\n [K in keyof typeof MemSaveInputSchema]: z.infer<(typeof MemSaveInputSchema)[K]>;\n};\n\nexport interface MemSaveOutput {\n id: string;\n scope: string;\n file_path: string;\n}\n\nexport async function memSave(\n input: MemSaveInput,\n ctx: HaiveContext,\n): Promise<MemSaveOutput> {\n if (!existsSync(ctx.paths.haiveDir)) {\n throw new Error(\n `No .ai/ directory at ${ctx.paths.root}. Run 'haive init' first.`,\n );\n }\n\n const frontmatter = buildFrontmatter({\n type: input.type,\n slug: input.slug,\n scope: input.scope,\n module: input.module,\n tags: input.tags,\n domain: input.domain,\n author: input.author,\n paths: input.paths,\n symbols: input.symbols,\n commit: input.commit,\n });\n\n const file = memoryFilePath(\n ctx.paths,\n frontmatter.scope,\n frontmatter.id,\n frontmatter.module,\n );\n await mkdir(path.dirname(file), { recursive: true });\n\n if (existsSync(file)) {\n throw new Error(`Memory already exists at ${file}`);\n }\n\n await writeFile(file, serializeMemory({ frontmatter, body: input.body }), \"utf8\");\n\n return {\n id: frontmatter.id,\n scope: frontmatter.scope,\n file_path: file,\n };\n}\n","import { existsSync } from \"node:fs\";\nimport {\n deriveConfidence,\n extractSnippet,\n getUsage,\n literalMatchesAllTokens,\n loadMemoriesFromDir,\n loadUsageIndex,\n pickSnippetNeedle,\n tokenizeQuery,\n trackReads,\n type ConfidenceLevel,\n type LoadedMemory,\n type UsageIndex,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemSearchInputSchema = {\n query: z.string().describe(\"Substring matched against id, tags, and body\"),\n scope: z\n .enum([\"personal\", \"team\", \"module\"])\n .optional()\n .describe(\"Restrict results to a single scope\"),\n type: z\n .enum([\"convention\", \"decision\", \"gotcha\", \"architecture\", \"glossary\"])\n .optional()\n .describe(\"Restrict results to a memory type\"),\n module: z.string().optional().describe(\"Restrict results to a module\"),\n limit: z.number().int().positive().max(100).default(20).describe(\"Max results\"),\n semantic: z\n .boolean()\n .default(false)\n .describe(\n \"Use semantic similarity from the embeddings index (requires `haive embeddings index`).\",\n ),\n min_score: z\n .number()\n .min(0)\n .max(1)\n .default(0)\n .describe(\"Minimum cosine similarity (semantic mode only)\"),\n track: z\n .boolean()\n .default(true)\n .describe(\"Increment read_count on returned memories (used for passive validation)\"),\n};\n\nexport type MemSearchInput = {\n [K in keyof typeof MemSearchInputSchema]: z.infer<(typeof MemSearchInputSchema)[K]>;\n};\n\nexport interface MemSearchHit {\n id: string;\n scope: string;\n type: string;\n module?: string;\n tags: string[];\n status: string;\n confidence: ConfidenceLevel;\n read_count: number;\n snippet: string;\n file_path: string;\n score?: number;\n}\n\nexport interface MemSearchOutput {\n matches: MemSearchHit[];\n total: number;\n mode: \"literal\" | \"semantic\" | \"literal_fallback\";\n notice?: string;\n}\n\nexport async function memSearch(\n input: MemSearchInput,\n ctx: HaiveContext,\n): Promise<MemSearchOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n return { matches: [], total: 0, mode: input.semantic ? \"literal_fallback\" : \"literal\" };\n }\n\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const filtered = all.filter(({ memory }) => passesFilters(memory.frontmatter, input));\n const usage = await loadUsageIndex(ctx.paths);\n\n let result: MemSearchOutput;\n if (input.semantic) {\n const semantic = await trySemanticSearch(ctx, input, filtered, usage);\n if (semantic) {\n result = semantic;\n } else {\n result = {\n ...buildLiteralResult(input, filtered, usage),\n mode: \"literal_fallback\",\n notice:\n \"Semantic search unavailable (embeddings index missing or @hiveai/embeddings not installed). Falling back to literal search.\",\n };\n }\n } else {\n result = buildLiteralResult(input, filtered, usage);\n }\n\n if (input.track && result.matches.length > 0) {\n await trackReads(\n ctx.paths,\n result.matches.map((m) => m.id),\n );\n }\n\n return result;\n}\n\nfunction passesFilters(\n fm: LoadedMemory[\"memory\"][\"frontmatter\"],\n input: MemSearchInput,\n): boolean {\n if (input.scope && fm.scope !== input.scope) return false;\n if (input.type && fm.type !== input.type) return false;\n if (input.module && fm.module !== input.module) return false;\n return true;\n}\n\nfunction buildLiteralResult(\n input: MemSearchInput,\n filtered: LoadedMemory[],\n usage: UsageIndex,\n): { matches: MemSearchHit[]; total: number; mode: \"literal\" } {\n const tokens = tokenizeQuery(input.query);\n const matched = filtered.filter(({ memory }) => literalMatchesAllTokens(memory, tokens));\n const snippetNeedle = pickSnippetNeedle(input.query);\n const top = matched.slice(0, input.limit);\n return {\n matches: top.map((loaded) => toHit(loaded, snippetNeedle, usage)),\n total: matched.length,\n mode: \"literal\",\n };\n}\n\nasync function trySemanticSearch(\n ctx: HaiveContext,\n input: MemSearchInput,\n filtered: LoadedMemory[],\n usage: UsageIndex,\n): Promise<MemSearchOutput | null> {\n let mod: typeof import(\"@hiveai/embeddings\");\n try {\n mod = await import(\"@hiveai/embeddings\");\n } catch {\n return null;\n }\n const result = await mod.semanticSearch(ctx.paths, input.query, {\n limit: Math.min(input.limit * 3, 100),\n minScore: input.min_score,\n });\n if (!result) return null;\n\n const allowedIds = new Set(filtered.map((m) => m.memory.frontmatter.id));\n const byId = new Map(filtered.map((m) => [m.memory.frontmatter.id, m]));\n\n const ranked = result.hits\n .filter((h) => allowedIds.has(h.id))\n .slice(0, input.limit);\n\n const matches: MemSearchHit[] = ranked.map((hit) => {\n const loaded = byId.get(hit.id);\n if (!loaded) {\n return {\n id: hit.id,\n scope: \"unknown\",\n type: \"unknown\",\n tags: [],\n status: \"unknown\",\n confidence: \"unverified\" as const,\n read_count: 0,\n snippet: \"\",\n file_path: hit.file_path,\n score: hit.score,\n };\n }\n const base = toHit(loaded, input.query.toLowerCase(), usage);\n return { ...base, score: hit.score };\n });\n\n return {\n matches,\n total: ranked.length,\n mode: \"semantic\",\n };\n}\n\nfunction toHit(loaded: LoadedMemory, needle: string, usage: UsageIndex): MemSearchHit {\n const fm = loaded.memory.frontmatter;\n const u = getUsage(usage, fm.id);\n return {\n id: fm.id,\n scope: fm.scope,\n type: fm.type,\n ...(fm.module ? { module: fm.module } : {}),\n tags: fm.tags,\n status: fm.status,\n confidence: deriveConfidence(fm, u),\n read_count: u.read_count,\n snippet: extractSnippet(loaded.memory.body, needle),\n file_path: loaded.filePath,\n };\n}\n","import { writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport {\n loadMemoriesFromDir,\n serializeMemory,\n verifyAnchor,\n type Memory,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemVerifyInputSchema = {\n id: z.string().optional().describe(\"If set, verify only this memory id\"),\n update: z\n .boolean()\n .default(false)\n .describe(\"Write the resulting status back to disk (status=stale or validated)\"),\n};\n\nexport type MemVerifyInput = {\n [K in keyof typeof MemVerifyInputSchema]: z.infer<(typeof MemVerifyInputSchema)[K]>;\n};\n\nexport interface MemVerifyHit {\n id: string;\n file_path: string;\n stale: boolean;\n reason: string | null;\n status_after: string;\n skipped?: boolean;\n}\n\nexport interface MemVerifyOutput {\n results: MemVerifyHit[];\n summary: {\n checked: number;\n fresh: number;\n stale: number;\n anchorless_skipped: number;\n updated: number;\n };\n}\n\nexport async function memVerify(\n input: MemVerifyInput,\n ctx: HaiveContext,\n): Promise<MemVerifyOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n return {\n results: [],\n summary: { checked: 0, fresh: 0, stale: 0, anchorless_skipped: 0, updated: 0 },\n };\n }\n\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const targets = input.id\n ? all.filter((m) => m.memory.frontmatter.id === input.id)\n : all;\n\n const results: MemVerifyHit[] = [];\n let fresh = 0;\n let stale = 0;\n let anchorless = 0;\n let updated = 0;\n\n for (const { memory, filePath } of targets) {\n const isAnchored =\n memory.frontmatter.anchor.paths.length > 0 ||\n memory.frontmatter.anchor.symbols.length > 0;\n if (!isAnchored) {\n anchorless++;\n results.push({\n id: memory.frontmatter.id,\n file_path: filePath,\n stale: false,\n reason: null,\n status_after: memory.frontmatter.status,\n skipped: true,\n });\n continue;\n }\n const result = await verifyAnchor(memory, { projectRoot: ctx.paths.root });\n if (result.stale) stale++;\n else fresh++;\n\n let statusAfter = memory.frontmatter.status;\n if (input.update) {\n const next = applyVerification(memory, result);\n await writeFile(filePath, serializeMemory(next), \"utf8\");\n statusAfter = next.frontmatter.status;\n updated++;\n }\n\n results.push({\n id: memory.frontmatter.id,\n file_path: filePath,\n stale: result.stale,\n reason: result.reason,\n status_after: statusAfter,\n });\n }\n\n return {\n results,\n summary: {\n checked: results.length + anchorless,\n fresh,\n stale,\n anchorless_skipped: anchorless,\n updated,\n },\n };\n}\n\nfunction applyVerification(\n mem: Memory,\n result: { stale: boolean; reason: string | null },\n): Memory {\n const verifiedAt = new Date().toISOString();\n if (result.stale) {\n return {\n frontmatter: {\n ...mem.frontmatter,\n status: \"stale\",\n verified_at: verifiedAt,\n stale_reason: result.reason,\n },\n body: mem.body,\n };\n }\n const nextStatus =\n mem.frontmatter.status === \"stale\" || mem.frontmatter.status === \"draft\"\n ? \"validated\"\n : mem.frontmatter.status;\n return {\n frontmatter: {\n ...mem.frontmatter,\n status: nextStatus,\n verified_at: verifiedAt,\n stale_reason: null,\n },\n body: mem.body,\n };\n}\n","import { writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport {\n loadMemoriesFromDir,\n loadUsageIndex,\n recordRejection,\n saveUsageIndex,\n serializeMemory,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemRejectInputSchema = {\n id: z.string().min(1).describe(\"Memory id being rejected\"),\n reason: z\n .string()\n .optional()\n .describe(\"Why this memory is being rejected (recorded for review)\"),\n};\n\nexport type MemRejectInput = {\n [K in keyof typeof MemRejectInputSchema]: z.infer<(typeof MemRejectInputSchema)[K]>;\n};\n\nexport interface MemRejectOutput {\n id: string;\n status: string;\n rejected_count: number;\n last_rejected_at: string | null;\n rejection_reason: string | null;\n}\n\nexport async function memReject(\n input: MemRejectInput,\n ctx: HaiveContext,\n): Promise<MemRejectOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n throw new Error(`No .ai/memories at ${ctx.paths.root}.`);\n }\n\n const memories = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const loaded = memories.find((m) => m.memory.frontmatter.id === input.id);\n if (!loaded) throw new Error(`No memory with id \"${input.id}\".`);\n\n // Write rejected status to disk\n await writeFile(\n loaded.filePath,\n serializeMemory({\n frontmatter: { ...loaded.memory.frontmatter, status: \"rejected\" },\n body: loaded.memory.body,\n }),\n \"utf8\",\n );\n\n const idx = await loadUsageIndex(ctx.paths);\n recordRejection(idx, input.id, input.reason ?? null);\n await saveUsageIndex(ctx.paths, idx);\n const u = idx.by_id[input.id];\n return {\n id: input.id,\n status: \"rejected\",\n rejected_count: u?.rejected_count ?? 0,\n last_rejected_at: u?.last_rejected_at ?? null,\n rejection_reason: u?.rejection_reason ?? null,\n };\n}\n","import { readFile, readdir } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport {\n deriveConfidence,\n getUsage,\n inferModulesFromPaths,\n loadMemoriesFromDir,\n loadUsageIndex,\n memoryMatchesAnchorPaths,\n trackReads,\n type ConfidenceLevel,\n type LoadedMemory,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemForFilesInputSchema = {\n files: z\n .array(z.string())\n .min(1)\n .describe(\"Project-relative file paths the agent is currently working on\"),\n include_module_contexts: z\n .boolean()\n .default(true)\n .describe(\"Inline the matching .ai/modules/<name>/context.md contents\"),\n track: z\n .boolean()\n .default(true)\n .describe(\"Increment read_count on returned memories\"),\n};\n\nexport type MemForFilesInput = {\n [K in keyof typeof MemForFilesInputSchema]: z.infer<(typeof MemForFilesInputSchema)[K]>;\n};\n\nexport interface MemMatch {\n id: string;\n scope: string;\n type: string;\n module?: string;\n tags: string[];\n status: string;\n confidence: ConfidenceLevel;\n read_count: number;\n reason: \"anchor_overlap\" | \"module\" | \"domain\";\n file_path: string;\n body: string;\n}\n\nexport interface MemForFilesOutput {\n inferred_modules: string[];\n by_anchor: MemMatch[];\n by_module: MemMatch[];\n by_domain: MemMatch[];\n module_contexts: Array<{ name: string; content: string }>;\n}\n\nexport async function memForFiles(\n input: MemForFilesInput,\n ctx: HaiveContext,\n): Promise<MemForFilesOutput> {\n const inferred = inferModulesFromPaths(input.files);\n\n if (!existsSync(ctx.paths.memoriesDir)) {\n return {\n inferred_modules: inferred,\n by_anchor: [],\n by_module: [],\n by_domain: [],\n module_contexts: await loadModuleContexts(ctx, inferred, input.include_module_contexts),\n };\n }\n\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const usage = await loadUsageIndex(ctx.paths);\n const seen = new Set<string>();\n\n const byAnchor: MemMatch[] = [];\n const byModule: MemMatch[] = [];\n const byDomain: MemMatch[] = [];\n\n for (const loaded of all) {\n if (memoryMatchesAnchorPaths(loaded.memory, input.files)) {\n byAnchor.push(toMatch(loaded, \"anchor_overlap\", usage));\n seen.add(loaded.memory.frontmatter.id);\n }\n }\n\n for (const loaded of all) {\n if (seen.has(loaded.memory.frontmatter.id)) continue;\n const fm = loaded.memory.frontmatter;\n const moduleHit =\n (fm.module && inferred.includes(fm.module)) ||\n fm.tags.some((t) => inferred.includes(t));\n if (moduleHit) {\n byModule.push(toMatch(loaded, \"module\", usage));\n seen.add(fm.id);\n }\n }\n\n for (const loaded of all) {\n if (seen.has(loaded.memory.frontmatter.id)) continue;\n const domain = loaded.memory.frontmatter.domain;\n if (domain && inferred.includes(domain)) {\n byDomain.push(toMatch(loaded, \"domain\", usage));\n seen.add(loaded.memory.frontmatter.id);\n }\n }\n\n if (input.track) {\n await trackReads(ctx.paths, [...seen]);\n }\n\n return {\n inferred_modules: inferred,\n by_anchor: byAnchor,\n by_module: byModule,\n by_domain: byDomain,\n module_contexts: await loadModuleContexts(ctx, inferred, input.include_module_contexts),\n };\n}\n\nfunction toMatch(\n loaded: LoadedMemory,\n reason: MemMatch[\"reason\"],\n usage: Parameters<typeof getUsage>[0],\n): MemMatch {\n const fm = loaded.memory.frontmatter;\n const u = getUsage(usage, fm.id);\n return {\n id: fm.id,\n scope: fm.scope,\n type: fm.type,\n ...(fm.module ? { module: fm.module } : {}),\n tags: fm.tags,\n status: fm.status,\n confidence: deriveConfidence(fm, u),\n read_count: u.read_count,\n reason,\n file_path: loaded.filePath,\n body: loaded.memory.body,\n };\n}\n\nasync function loadModuleContexts(\n ctx: HaiveContext,\n modules: string[],\n enabled: boolean,\n): Promise<Array<{ name: string; content: string }>> {\n if (!enabled || modules.length === 0) return [];\n if (!existsSync(ctx.paths.modulesContextDir)) return [];\n const available = new Set(\n (await readdir(ctx.paths.modulesContextDir, { withFileTypes: true }))\n .filter((d) => d.isDirectory())\n .map((d) => d.name),\n );\n const out: Array<{ name: string; content: string }> = [];\n for (const m of modules) {\n if (!available.has(m)) continue;\n const file = path.join(ctx.paths.modulesContextDir, m, \"context.md\");\n if (existsSync(file)) {\n out.push({ name: m, content: await readFile(file, \"utf8\") });\n }\n }\n return out;\n}\n","import { existsSync } from \"node:fs\";\nimport {\n deriveConfidence,\n getUsage,\n loadMemoriesFromDir,\n loadUsageIndex,\n type ConfidenceLevel,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemGetInputSchema = {\n id: z.string().min(1).describe(\"Memory id to fetch\"),\n};\n\nexport type MemGetInput = {\n [K in keyof typeof MemGetInputSchema]: z.infer<(typeof MemGetInputSchema)[K]>;\n};\n\nexport interface MemGetOutput {\n id: string;\n scope: string;\n type: string;\n module?: string;\n tags: string[];\n status: string;\n confidence: ConfidenceLevel;\n read_count: number;\n rejected_count: number;\n created_at: string;\n verified_at: string | null;\n stale_reason: string | null;\n anchor: { commit?: string; paths: string[]; symbols: string[] };\n body: string;\n file_path: string;\n}\n\nexport async function memGet(input: MemGetInput, ctx: HaiveContext): Promise<MemGetOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n throw new Error(`No .ai/memories at ${ctx.paths.root}.`);\n }\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const found = all.find((m) => m.memory.frontmatter.id === input.id);\n if (!found) throw new Error(`No memory with id \"${input.id}\".`);\n const fm = found.memory.frontmatter;\n const u = getUsage(await loadUsageIndex(ctx.paths), fm.id);\n return {\n id: fm.id,\n scope: fm.scope,\n type: fm.type,\n ...(fm.module ? { module: fm.module } : {}),\n tags: fm.tags,\n status: fm.status,\n confidence: deriveConfidence(fm, u),\n read_count: u.read_count,\n rejected_count: u.rejected_count,\n created_at: fm.created_at,\n verified_at: fm.verified_at,\n stale_reason: fm.stale_reason,\n anchor: {\n ...(fm.anchor.commit ? { commit: fm.anchor.commit } : {}),\n paths: fm.anchor.paths,\n symbols: fm.anchor.symbols,\n },\n body: found.memory.body,\n file_path: found.filePath,\n };\n}\n","import { existsSync } from \"node:fs\";\nimport { unlink } from \"node:fs/promises\";\nimport {\n loadMemoriesFromDir,\n loadUsageIndex,\n saveUsageIndex,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemDeleteInputSchema = {\n id: z.string().min(1).describe(\"Memory id to delete\"),\n keep_usage: z\n .boolean()\n .default(false)\n .describe(\"Keep the usage.json entry instead of removing it alongside the file\"),\n};\n\nexport type MemDeleteInput = {\n [K in keyof typeof MemDeleteInputSchema]: z.infer<(typeof MemDeleteInputSchema)[K]>;\n};\n\nexport interface MemDeleteOutput {\n id: string;\n deleted_file: string;\n usage_removed: boolean;\n}\n\nexport async function memDelete(\n input: MemDeleteInput,\n ctx: HaiveContext,\n): Promise<MemDeleteOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n throw new Error(`No .ai/memories at ${ctx.paths.root}.`);\n }\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const found = all.find((m) => m.memory.frontmatter.id === input.id);\n if (!found) throw new Error(`No memory with id \"${input.id}\".`);\n\n await unlink(found.filePath);\n\n let usageRemoved = false;\n if (!input.keep_usage) {\n const idx = await loadUsageIndex(ctx.paths);\n if (idx.by_id[input.id]) {\n delete idx.by_id[input.id];\n await saveUsageIndex(ctx.paths, idx);\n usageRemoved = true;\n }\n }\n\n return { id: input.id, deleted_file: found.filePath, usage_removed: usageRemoved };\n}\n","import { writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { loadMemoriesFromDir, serializeMemory } from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemUpdateInputSchema = {\n id: z.string().min(1).describe(\"Id of the memory to update\"),\n body: z.string().optional().describe(\"New Markdown body — replaces the existing body\"),\n tags: z\n .array(z.string())\n .optional()\n .describe(\"New tags array — fully replaces existing tags\"),\n paths: z\n .array(z.string())\n .optional()\n .describe(\"New anchor paths — fully replaces existing anchor.paths\"),\n symbols: z\n .array(z.string())\n .optional()\n .describe(\"New anchor symbols — fully replaces existing anchor.symbols\"),\n commit: z.string().optional().describe(\"New anchor commit SHA\"),\n domain: z.string().optional().describe(\"New domain label\"),\n author: z.string().optional().describe(\"New author handle or email\"),\n};\n\nexport type MemUpdateInput = {\n [K in keyof typeof MemUpdateInputSchema]: z.infer<(typeof MemUpdateInputSchema)[K]>;\n};\n\nexport interface MemUpdateOutput {\n id: string;\n file_path: string;\n updated_fields: string[];\n}\n\nexport async function memUpdate(\n input: MemUpdateInput,\n ctx: HaiveContext,\n): Promise<MemUpdateOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n throw new Error(`No .ai/memories at ${ctx.paths.root}.`);\n }\n\n const memories = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const loaded = memories.find((m) => m.memory.frontmatter.id === input.id);\n if (!loaded) throw new Error(`No memory with id \"${input.id}\".`);\n\n const { frontmatter, body } = loaded.memory;\n const updated_fields: string[] = [];\n\n const newAnchor = { ...frontmatter.anchor };\n if (input.paths !== undefined) { newAnchor.paths = input.paths; updated_fields.push(\"anchor.paths\"); }\n if (input.symbols !== undefined) { newAnchor.symbols = input.symbols; updated_fields.push(\"anchor.symbols\"); }\n if (input.commit !== undefined) { newAnchor.commit = input.commit; updated_fields.push(\"anchor.commit\"); }\n\n const newFrontmatter = {\n ...frontmatter,\n anchor: newAnchor,\n ...(input.tags !== undefined ? { tags: input.tags } : {}),\n ...(input.domain !== undefined ? { domain: input.domain } : {}),\n ...(input.author !== undefined ? { author: input.author } : {}),\n };\n\n if (input.tags !== undefined) updated_fields.push(\"tags\");\n if (input.domain !== undefined) updated_fields.push(\"domain\");\n if (input.author !== undefined) updated_fields.push(\"author\");\n\n const newBody = input.body !== undefined ? input.body : body;\n if (input.body !== undefined) updated_fields.push(\"body\");\n\n if (updated_fields.length === 0) {\n throw new Error(\"No fields to update — provide at least one of: body, tags, paths, symbols, commit, domain, author.\");\n }\n\n await writeFile(\n loaded.filePath,\n serializeMemory({ frontmatter: newFrontmatter, body: newBody }),\n \"utf8\",\n );\n\n return { id: input.id, file_path: loaded.filePath, updated_fields };\n}\n","import { existsSync } from \"node:fs\";\nimport {\n getUsage,\n loadMemoriesFromDir,\n loadUsageIndex,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemPendingInputSchema = {\n scope: z.enum([\"personal\", \"team\", \"module\"]).optional(),\n};\n\nexport type MemPendingInput = {\n [K in keyof typeof MemPendingInputSchema]: z.infer<(typeof MemPendingInputSchema)[K]>;\n};\n\nexport interface MemPendingHit {\n id: string;\n scope: string;\n type: string;\n module?: string;\n tags: string[];\n age_days: number;\n read_count: number;\n rejected_count: number;\n file_path: string;\n}\n\nexport interface MemPendingOutput {\n pending: MemPendingHit[];\n}\n\nexport async function memPending(\n input: MemPendingInput,\n ctx: HaiveContext,\n): Promise<MemPendingOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) return { pending: [] };\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const usage = await loadUsageIndex(ctx.paths);\n const now = Date.now();\n const proposed = all.filter(({ memory }) => {\n if (memory.frontmatter.status !== \"proposed\") return false;\n if (input.scope && memory.frontmatter.scope !== input.scope) return false;\n return true;\n });\n\n proposed.sort(\n (a, b) =>\n getUsage(usage, b.memory.frontmatter.id).read_count -\n getUsage(usage, a.memory.frontmatter.id).read_count,\n );\n\n return {\n pending: proposed.map(({ memory, filePath }) => {\n const fm = memory.frontmatter;\n const u = getUsage(usage, fm.id);\n return {\n id: fm.id,\n scope: fm.scope,\n type: fm.type,\n ...(fm.module ? { module: fm.module } : {}),\n tags: fm.tags,\n age_days: Math.floor((now - new Date(fm.created_at).getTime()) / 86_400_000),\n read_count: u.read_count,\n rejected_count: u.rejected_count,\n file_path: filePath,\n };\n }),\n };\n}\n","import { writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport {\n loadMemoriesFromDir,\n serializeMemory,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemApproveInputSchema = {\n id: z.string().min(1).describe(\"Memory id to approve (sets status=validated immediately)\"),\n};\n\nexport type MemApproveInput = {\n [K in keyof typeof MemApproveInputSchema]: z.infer<(typeof MemApproveInputSchema)[K]>;\n};\n\nexport interface MemApproveOutput {\n id: string;\n previous_status: string;\n status: \"validated\";\n file_path: string;\n}\n\nexport async function memApprove(\n input: MemApproveInput,\n ctx: HaiveContext,\n): Promise<MemApproveOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n throw new Error(`No .ai/memories at ${ctx.paths.root}.`);\n }\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const found = all.find((m) => m.memory.frontmatter.id === input.id);\n if (!found) throw new Error(`No memory with id \"${input.id}\".`);\n\n const previous = found.memory.frontmatter.status;\n const next = {\n frontmatter: { ...found.memory.frontmatter, status: \"validated\" as const },\n body: found.memory.body,\n };\n await writeFile(found.filePath, serializeMemory(next), \"utf8\");\n return {\n id: input.id,\n previous_status: previous,\n status: \"validated\",\n file_path: found.filePath,\n };\n}\n","import { readFile, readdir } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport {\n allocateBudget,\n deriveConfidence,\n estimateTokens,\n getUsage,\n inferModulesFromPaths,\n literalMatchesAllTokens,\n loadMemoriesFromDir,\n loadUsageIndex,\n memoryMatchesAnchorPaths,\n tokenizeQuery,\n trackReads,\n truncateToTokens,\n type ConfidenceLevel,\n type LoadedMemory,\n type UsageIndex,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const GetBriefingInputSchema = {\n task: z\n .string()\n .optional()\n .describe(\n \"What you are about to do, in 1–2 sentences. Used to rank relevant memories semantically.\",\n ),\n files: z\n .array(z.string())\n .default([])\n .describe(\"Project-relative file paths the agent is currently looking at or about to edit\"),\n max_tokens: z\n .number()\n .int()\n .positive()\n .default(8000)\n .describe(\n \"Approximate token budget for the entire briefing. Each section is allocated a share and truncated to fit.\",\n ),\n max_memories: z\n .number()\n .int()\n .positive()\n .default(8)\n .describe(\"Cap on memories surfaced regardless of token budget\"),\n include_project_context: z.boolean().default(true),\n include_module_contexts: z.boolean().default(true),\n semantic: z\n .boolean()\n .default(true)\n .describe(\n \"Use semantic ranking when a task is provided (requires `haive embeddings index`).\",\n ),\n track: z.boolean().default(true).describe(\"Increment read_count on returned memories\"),\n};\n\nexport type GetBriefingInput = {\n [K in keyof typeof GetBriefingInputSchema]: z.infer<(typeof GetBriefingInputSchema)[K]>;\n};\n\nexport interface BriefingMemory {\n id: string;\n scope: string;\n type: string;\n module?: string;\n tags: string[];\n status: string;\n confidence: ConfidenceLevel;\n read_count: number;\n reasons: Array<\"anchor\" | \"module\" | \"domain\" | \"semantic\">;\n semantic_score?: number;\n body: string;\n file_path: string;\n}\n\nexport interface BriefingOutput {\n task?: string;\n search_mode: \"semantic\" | \"literal_fallback\" | \"literal\";\n inferred_modules: string[];\n project_context: { content: string; truncated: boolean } | null;\n module_contexts: Array<{ name: string; content: string; truncated: boolean }>;\n memories: BriefingMemory[];\n estimated_tokens: number;\n budget: { max_tokens: number; spent: { project: number; modules: number; memories: number } };\n}\n\nexport async function getBriefing(\n input: GetBriefingInput,\n ctx: HaiveContext,\n): Promise<BriefingOutput> {\n const inferred = inferModulesFromPaths(input.files);\n const memories: BriefingMemory[] = [];\n let searchMode: BriefingOutput[\"search_mode\"] = \"literal\";\n\n if (existsSync(ctx.paths.memoriesDir)) {\n const allMemories = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const usage = await loadUsageIndex(ctx.paths);\n const semanticHits = input.task && input.semantic\n ? await trySemanticHits(ctx, input.task, allMemories.length * 2)\n : null;\n\n if (input.task && input.semantic) {\n searchMode = semanticHits ? \"semantic\" : \"literal_fallback\";\n }\n\n const seen = new Map<string, BriefingMemory>();\n\n const addOrUpdate = (\n loaded: LoadedMemory,\n reason: BriefingMemory[\"reasons\"][number],\n score?: number,\n ): void => {\n const fm = loaded.memory.frontmatter;\n const existing = seen.get(fm.id);\n if (existing) {\n if (!existing.reasons.includes(reason)) existing.reasons.push(reason);\n if (score !== undefined && (existing.semantic_score ?? 0) < score) {\n existing.semantic_score = score;\n }\n return;\n }\n const u = getUsage(usage, fm.id);\n seen.set(fm.id, {\n id: fm.id,\n scope: fm.scope,\n type: fm.type,\n ...(fm.module ? { module: fm.module } : {}),\n tags: fm.tags,\n status: fm.status,\n confidence: deriveConfidence(fm, u),\n read_count: u.read_count,\n reasons: [reason],\n ...(score !== undefined ? { semantic_score: score } : {}),\n body: loaded.memory.body,\n file_path: loaded.filePath,\n });\n };\n\n if (input.files.length > 0) {\n for (const loaded of allMemories) {\n if (memoryMatchesAnchorPaths(loaded.memory, input.files)) addOrUpdate(loaded, \"anchor\");\n }\n for (const loaded of allMemories) {\n const fm = loaded.memory.frontmatter;\n if (fm.module && inferred.includes(fm.module)) addOrUpdate(loaded, \"module\");\n if (fm.domain && inferred.includes(fm.domain)) addOrUpdate(loaded, \"domain\");\n if (fm.tags.some((t) => inferred.includes(t))) addOrUpdate(loaded, \"module\");\n }\n }\n\n if (input.task) {\n const tokens = tokenizeQuery(input.task);\n for (const loaded of allMemories) {\n if (literalMatchesAllTokens(loaded.memory, tokens)) {\n addOrUpdate(loaded, \"semantic\");\n }\n }\n if (semanticHits) {\n const byId = new Map(allMemories.map((m) => [m.memory.frontmatter.id, m]));\n for (const hit of semanticHits) {\n const loaded = byId.get(hit.id);\n if (loaded) addOrUpdate(loaded, \"semantic\", hit.score);\n }\n }\n }\n\n const ranked = [...seen.values()].sort((a, b) => {\n const reasonScore = (m: BriefingMemory): number =>\n (m.reasons.includes(\"anchor\") ? 4 : 0) +\n (m.reasons.includes(\"module\") ? 2 : 0) +\n (m.reasons.includes(\"semantic\") ? 2 : 0) +\n (m.reasons.includes(\"domain\") ? 1 : 0);\n const confidenceScore = (m: BriefingMemory): number =>\n m.confidence === \"authoritative\" ? 4 :\n m.confidence === \"trusted\" ? 3 :\n m.confidence === \"low\" ? 1 :\n m.confidence === \"stale\" ? -2 : 0;\n const sa = reasonScore(a) + confidenceScore(a) + (a.semantic_score ?? 0);\n const sb = reasonScore(b) + confidenceScore(b) + (b.semantic_score ?? 0);\n return sb - sa;\n });\n\n memories.push(...ranked.slice(0, input.max_memories));\n\n if (input.track && memories.length > 0) {\n await trackReads(ctx.paths, memories.map((m) => m.id));\n }\n }\n\n // Build raw section payloads\n const projectContext =\n input.include_project_context && existsSync(ctx.paths.projectContext)\n ? await readFile(ctx.paths.projectContext, \"utf8\")\n : \"\";\n\n const moduleContents = input.include_module_contexts\n ? await loadModuleContexts(ctx, inferred)\n : [];\n\n const memoriesText = memories\n .map((m) => `### ${m.id} (${m.scope}/${m.type}, ${m.confidence})\\n${m.body.trim()}`)\n .join(\"\\n\\n---\\n\\n\");\n\n // Allocate budget across the three large pieces\n const slices = allocateBudget(\n [\n { key: \"project\", text: projectContext, weight: 3, mode: \"head\" },\n {\n key: \"modules\",\n text: moduleContents.map((m) => `## ${m.name}\\n${m.content}`).join(\"\\n\\n---\\n\\n\"),\n weight: 3,\n mode: \"head\",\n },\n { key: \"memories\", text: memoriesText, weight: 4, mode: \"head\" },\n ],\n input.max_tokens,\n );\n\n const projectSlice = slices.find((s) => s.key === \"project\")!;\n const modulesSlice = slices.find((s) => s.key === \"modules\")!;\n const memoriesSlice = slices.find((s) => s.key === \"memories\")!;\n\n const trimmedModules: BriefingOutput[\"module_contexts\"] = [];\n if (modulesSlice.text.length > 0 && moduleContents.length > 0) {\n // Distribute the modules slice across module entries proportionally\n const subSlices = allocateBudget(\n moduleContents.map((m) => ({ key: m.name, text: m.content, weight: 1, mode: \"head\" as const })),\n modulesSlice.allocatedTokens,\n );\n for (const m of moduleContents) {\n const sub = subSlices.find((s) => s.key === m.name)!;\n trimmedModules.push({ name: m.name, content: sub.text, truncated: sub.truncated });\n }\n }\n\n const trimmedMemoriesText = memoriesSlice.text;\n\n // Recompute memory bodies to fit. We slice the joined text but also expose\n // the truncated body per memory so the AI can render either form.\n const trimmedMemories = memories.map((m): BriefingMemory => {\n if (!memoriesSlice.truncated) return m;\n const tokensPer = Math.floor(memoriesSlice.allocatedTokens / Math.max(1, memories.length));\n const t = truncateToTokens(m.body, { maxTokens: tokensPer, mode: \"head\" });\n return { ...m, body: t.text };\n });\n\n const totalTokens =\n projectSlice.estimatedTokens + modulesSlice.estimatedTokens + memoriesSlice.estimatedTokens;\n\n return {\n ...(input.task ? { task: input.task } : {}),\n search_mode: searchMode,\n inferred_modules: inferred,\n project_context: projectContext\n ? { content: projectSlice.text, truncated: projectSlice.truncated }\n : null,\n module_contexts: trimmedModules,\n memories: trimmedMemories,\n estimated_tokens: totalTokens,\n budget: {\n max_tokens: input.max_tokens,\n spent: {\n project: projectSlice.estimatedTokens,\n modules: modulesSlice.estimatedTokens,\n memories: memoriesSlice.estimatedTokens,\n },\n },\n };\n}\n\nasync function trySemanticHits(\n ctx: HaiveContext,\n task: string,\n limit: number,\n): Promise<Array<{ id: string; score: number }> | null> {\n let mod: typeof import(\"@hiveai/embeddings\");\n try {\n mod = await import(\"@hiveai/embeddings\");\n } catch {\n return null;\n }\n const result = await mod.semanticSearch(ctx.paths, task, { limit });\n if (!result) return null;\n return result.hits.map((h) => ({ id: h.id, score: h.score }));\n}\n\nasync function loadModuleContexts(\n ctx: HaiveContext,\n modules: string[],\n): Promise<Array<{ name: string; content: string }>> {\n if (modules.length === 0) return [];\n if (!existsSync(ctx.paths.modulesContextDir)) return [];\n const available = new Set(\n (await readdir(ctx.paths.modulesContextDir, { withFileTypes: true }))\n .filter((d) => d.isDirectory())\n .map((d) => d.name),\n );\n const out: Array<{ name: string; content: string }> = [];\n for (const m of modules) {\n if (!available.has(m)) continue;\n const file = path.join(ctx.paths.modulesContextDir, m, \"context.md\");\n if (existsSync(file)) {\n out.push({ name: m, content: await readFile(file, \"utf8\") });\n }\n }\n return out;\n}\n\n// Re-export estimateTokens at the module level for tests.\nexport { estimateTokens };\n","import { loadCodeMap, queryCodeMap } from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const CodeMapInputSchema = {\n file: z\n .string()\n .optional()\n .describe(\"Filter to files whose path contains this substring\"),\n symbol: z\n .string()\n .optional()\n .describe(\"Filter to files exporting a symbol whose name contains this substring\"),\n max_files: z\n .number()\n .int()\n .positive()\n .default(40)\n .describe(\"Cap on returned files\"),\n};\n\nexport type CodeMapInput = {\n [K in keyof typeof CodeMapInputSchema]: z.infer<(typeof CodeMapInputSchema)[K]>;\n};\n\nexport interface CodeMapToolOutput {\n available: boolean;\n generated_at?: string;\n total_files?: number;\n files: Array<{\n path: string;\n summary?: string;\n loc: number;\n exports: Array<{ name: string; kind: string; description?: string; line: number }>;\n }>;\n notice?: string;\n}\n\nexport async function codeMapTool(\n input: CodeMapInput,\n ctx: HaiveContext,\n): Promise<CodeMapToolOutput> {\n const map = await loadCodeMap(ctx.paths);\n if (!map) {\n return {\n available: false,\n files: [],\n notice: \"No code map found. Run `haive index code` to generate `.ai/code-map.json`.\",\n };\n }\n const { files } = queryCodeMap(map, { file: input.file, symbol: input.symbol });\n return {\n available: true,\n generated_at: map.generated_at,\n total_files: Object.keys(map.files).length,\n files: files.slice(0, input.max_files).map((f) => ({\n path: f.path,\n ...(f.entry.summary ? { summary: f.entry.summary } : {}),\n loc: f.entry.loc,\n exports: f.entry.exports,\n })),\n };\n}\n","import { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const BootstrapProjectArgsSchema = {\n module: z\n .string()\n .optional()\n .describe(\n \"Optional module name to scope the analysis to (writes to .ai/modules/<module>/context.md)\",\n ),\n focus: z\n .string()\n .optional()\n .describe(\"Optional area to emphasize (e.g. 'data layer', 'API surface')\"),\n};\n\nexport type BootstrapProjectArgs = {\n [K in keyof typeof BootstrapProjectArgsSchema]: z.infer<\n (typeof BootstrapProjectArgsSchema)[K]\n >;\n};\n\nconst ROOT_TEMPLATE = `# Project context\n\n## Architecture\n<one or two paragraphs on the high-level architecture>\n\n## Key modules\n- <module-name>: <one line on its purpose>\n- ...\n\n## Conventions\n- <convention>: <why it matters here>\n- ...\n\n## Glossary\n- <term>: <definition in this codebase>\n- ...\n\n## Gotchas\n- <surprising behavior, hidden coupling, or known traps>\n- ...\n`;\n\nconst MODULE_TEMPLATE = `# Module context — {module}\n\n## Purpose\n<what this module is for>\n\n## Public surface\n- <exported symbol>: <one line>\n- ...\n\n## Internals\n<key files / classes / functions and how they connect>\n\n## Conventions specific to this module\n- ...\n\n## Gotchas\n- ...\n`;\n\nexport function bootstrapProjectPrompt(\n args: BootstrapProjectArgs,\n ctx: HaiveContext,\n): { description: string; messages: Array<{ role: \"user\"; content: { type: \"text\"; text: string } }> } {\n const target = args.module\n ? `\\`.ai/modules/${args.module}/context.md\\``\n : \"`.ai/project-context.md`\";\n const template = args.module\n ? MODULE_TEMPLATE.replace(\"{module}\", args.module)\n : ROOT_TEMPLATE;\n const focusLine = args.focus\n ? `\\nEmphasis area for this analysis: **${args.focus}**.\\n`\n : \"\";\n\n const text = `You are bootstrapping a hAIve shared project context for the team.\n\nProject root: \\`${ctx.paths.root}\\`\nTarget file: ${target}\n${focusLine}\n## What to do\n\n1. Explore the codebase: read the package manifests, top-level directories, build configs, and a representative sample of source files. Do not read every file — pick what gives you the highest signal per file (entry points, config, README if present, main domain models).\n2. Synthesize a concise, high-signal context document. Prefer load-bearing facts over exhaustive enumeration. A new teammate (human or AI) should be able to read it in 5 minutes and feel oriented.\n3. Match the structure of the template below. Keep each section short — link to files instead of repeating large code chunks.\n4. When you are done, call the \\`bootstrap_project_save\\` tool with the full Markdown content. Use \\`overwrite=true\\` only if the file already exists and you intend to replace it.\n\n## Template to fill\n\n\\`\\`\\`markdown\n${template}\\`\\`\\`\n\n## Tips\n\n- Anchor claims to file paths so future readers can verify them.\n- Write what is true *now*, not aspirational. Note open questions explicitly.\n- Skip sections that have nothing meaningful to say rather than padding them.\n`;\n\n return {\n description: args.module\n ? `Bootstrap context for module \"${args.module}\"`\n : \"Bootstrap the root project context\",\n messages: [\n {\n role: \"user\",\n content: { type: \"text\", text },\n },\n ],\n };\n}\n"],"mappings":"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","names":["existsSync","path","z","existsSync","z","mkdir","writeFile","existsSync","path","z","existsSync","loadMemoriesFromDir","z","writeFile","existsSync","loadMemoriesFromDir","serializeMemory","z","writeFile","existsSync","loadMemoriesFromDir","loadUsageIndex","serializeMemory","z","readFile","readdir","existsSync","path","deriveConfidence","getUsage","loadMemoriesFromDir","loadUsageIndex","trackReads","z","existsSync","deriveConfidence","getUsage","loadMemoriesFromDir","loadUsageIndex","z","existsSync","loadMemoriesFromDir","loadUsageIndex","saveUsageIndex","z","writeFile","existsSync","loadMemoriesFromDir","serializeMemory","z","existsSync","getUsage","loadMemoriesFromDir","loadUsageIndex","z","writeFile","existsSync","loadMemoriesFromDir","serializeMemory","z","readFile","readdir","existsSync","path","deriveConfidence","getUsage","inferModulesFromPaths","literalMatchesAllTokens","loadMemoriesFromDir","loadUsageIndex","memoryMatchesAnchorPaths","tokenizeQuery","trackReads","z","loadModuleContexts","z","z"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/server.ts","../src/context.ts","../src/tools/bootstrap-project-save.ts","../src/tools/get-project-context.ts","../src/tools/mem-list.ts","../src/tools/mem-save.ts","../src/tools/mem-search.ts","../src/tools/mem-verify.ts","../src/tools/mem-reject.ts","../src/tools/mem-for-files.ts","../src/tools/mem-get.ts","../src/tools/mem-delete.ts","../src/tools/mem-update.ts","../src/tools/mem-pending.ts","../src/tools/mem-approve.ts","../src/tools/get-briefing.ts","../src/tools/code-map.ts","../src/prompts/bootstrap-project.ts"],"sourcesContent":["import { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { createHaiveServer, SERVER_VERSION } from \"./server.js\";\n\nfunction parseArgs(argv: string[]): { root?: string } {\n const out: { root?: string } = {};\n for (let i = 2; i < argv.length; i++) {\n const arg = argv[i];\n if (arg === \"--root\" || arg === \"-r\") {\n out.root = argv[++i];\n } else if (arg?.startsWith(\"--root=\")) {\n out.root = arg.slice(\"--root=\".length);\n }\n }\n return out;\n}\n\nasync function main(): Promise<void> {\n const { root } = parseArgs(process.argv);\n const { server, context } = createHaiveServer({ root });\n // stderr is safe — stdio transport uses stdin/stdout exclusively for MCP frames.\n console.error(\n `[haive-mcp] starting server v${SERVER_VERSION} (project root: ${context.paths.root})`,\n );\n const transport = new StdioServerTransport();\n await server.connect(transport);\n}\n\nmain().catch((err: unknown) => {\n console.error(\"[haive-mcp] fatal:\", err instanceof Error ? err.message : err);\n process.exit(1);\n});\n","import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { createContext, type CreateContextOptions, type HaiveContext } from \"./context.js\";\nimport {\n BootstrapProjectSaveInputSchema,\n bootstrapProjectSave,\n type BootstrapProjectSaveInput,\n} from \"./tools/bootstrap-project-save.js\";\nimport {\n GetProjectContextInputSchema,\n getProjectContext,\n type GetProjectContextInput,\n} from \"./tools/get-project-context.js\";\nimport { MemListInputSchema, memList, type MemListInput } from \"./tools/mem-list.js\";\nimport { MemSaveInputSchema, memSave, type MemSaveInput } from \"./tools/mem-save.js\";\nimport {\n MemSearchInputSchema,\n memSearch,\n type MemSearchInput,\n} from \"./tools/mem-search.js\";\nimport {\n MemVerifyInputSchema,\n memVerify,\n type MemVerifyInput,\n} from \"./tools/mem-verify.js\";\nimport {\n MemRejectInputSchema,\n memReject,\n type MemRejectInput,\n} from \"./tools/mem-reject.js\";\nimport {\n MemForFilesInputSchema,\n memForFiles,\n type MemForFilesInput,\n} from \"./tools/mem-for-files.js\";\nimport { MemGetInputSchema, memGet, type MemGetInput } from \"./tools/mem-get.js\";\nimport {\n MemDeleteInputSchema,\n memDelete,\n type MemDeleteInput,\n} from \"./tools/mem-delete.js\";\nimport {\n MemUpdateInputSchema,\n memUpdate,\n type MemUpdateInput,\n} from \"./tools/mem-update.js\";\nimport {\n MemPendingInputSchema,\n memPending,\n type MemPendingInput,\n} from \"./tools/mem-pending.js\";\nimport {\n MemApproveInputSchema,\n memApprove,\n type MemApproveInput,\n} from \"./tools/mem-approve.js\";\nimport {\n GetBriefingInputSchema,\n getBriefing,\n type GetBriefingInput,\n} from \"./tools/get-briefing.js\";\nimport {\n CodeMapInputSchema,\n codeMapTool,\n type CodeMapInput,\n} from \"./tools/code-map.js\";\nimport {\n BootstrapProjectArgsSchema,\n bootstrapProjectPrompt,\n type BootstrapProjectArgs,\n} from \"./prompts/bootstrap-project.js\";\n\ndeclare const __HAIVE_VERSION__: string;\n\nexport const SERVER_NAME = \"haive\";\nexport const SERVER_VERSION = __HAIVE_VERSION__;\n\nfunction jsonResult(data: unknown) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: JSON.stringify(data, null, 2),\n },\n ],\n };\n}\n\nexport function createHaiveServer(\n options: CreateContextOptions = {},\n): { server: McpServer; context: HaiveContext } {\n const context = createContext(options);\n const server = new McpServer(\n { name: SERVER_NAME, version: SERVER_VERSION },\n { capabilities: { tools: {}, prompts: {} } },\n );\n\n server.tool(\n \"mem_save\",\n \"Save a new memory (default scope=personal). Use scope=team for shared memories.\",\n MemSaveInputSchema,\n async (input: MemSaveInput) => jsonResult(await memSave(input, context)),\n );\n\n server.tool(\n \"mem_search\",\n \"Search memories by substring across id, tags, and body. Optional filters by scope/type/module.\",\n MemSearchInputSchema,\n async (input: MemSearchInput) => jsonResult(await memSearch(input, context)),\n );\n\n server.tool(\n \"mem_list\",\n \"List memories with optional filters by scope/type/module/tag.\",\n MemListInputSchema,\n async (input: MemListInput) => jsonResult(await memList(input, context)),\n );\n\n server.tool(\n \"get_project_context\",\n \"Read the shared .ai/project-context.md (and optionally a module context).\",\n GetProjectContextInputSchema,\n async (input: GetProjectContextInput) =>\n jsonResult(await getProjectContext(input, context)),\n );\n\n server.tool(\n \"get_briefing\",\n \"One-shot onboarding: returns project context + module contexts + ranked relevant memories under a token budget. Replaces 4–5 separate calls when an agent starts a task.\",\n GetBriefingInputSchema,\n async (input: GetBriefingInput) => jsonResult(await getBriefing(input, context)),\n );\n\n server.tool(\n \"code_map\",\n \"Browse the project's pre-computed code map (file → exports + 1-line description) instead of grepping. Requires `haive index code`.\",\n CodeMapInputSchema,\n async (input: CodeMapInput) => jsonResult(await codeMapTool(input, context)),\n );\n\n server.tool(\n \"bootstrap_project_save\",\n \"Persist a project (or module) context document analyzed by the AI client.\",\n BootstrapProjectSaveInputSchema,\n async (input: BootstrapProjectSaveInput) =>\n jsonResult(await bootstrapProjectSave(input, context)),\n );\n\n server.tool(\n \"mem_verify\",\n \"Check anchor freshness for one or every memory; optionally write status updates back to disk.\",\n MemVerifyInputSchema,\n async (input: MemVerifyInput) => jsonResult(await memVerify(input, context)),\n );\n\n server.tool(\n \"mem_reject\",\n \"Record a rejection for a memory (blocks auto-promotion and lowers its trust signal).\",\n MemRejectInputSchema,\n async (input: MemRejectInput) => jsonResult(await memReject(input, context)),\n );\n\n server.tool(\n \"mem_for_files\",\n \"Given the file paths the agent is currently working on, return relevant memories grouped by reason (anchor overlap, module, domain) plus any matching .ai/modules/<name>/context.md contents.\",\n MemForFilesInputSchema,\n async (input: MemForFilesInput) => jsonResult(await memForFiles(input, context)),\n );\n\n server.tool(\n \"mem_get\",\n \"Fetch a single memory by id, including its body, anchor, usage, and confidence.\",\n MemGetInputSchema,\n async (input: MemGetInput) => jsonResult(await memGet(input, context)),\n );\n\n server.tool(\n \"mem_delete\",\n \"Delete a memory by id (and its usage entry by default).\",\n MemDeleteInputSchema,\n async (input: MemDeleteInput) => jsonResult(await memDelete(input, context)),\n );\n\n server.tool(\n \"mem_update\",\n \"Update the body, tags, or anchor of an existing memory without changing its id or losing usage history.\",\n MemUpdateInputSchema,\n async (input: MemUpdateInput) => jsonResult(await memUpdate(input, context)),\n );\n\n server.tool(\n \"mem_pending\",\n \"List 'proposed' memories awaiting review, sorted by reads (most-read first).\",\n MemPendingInputSchema,\n async (input: MemPendingInput) => jsonResult(await memPending(input, context)),\n );\n\n server.tool(\n \"mem_approve\",\n \"Mark a memory as validated immediately (explicit team review).\",\n MemApproveInputSchema,\n async (input: MemApproveInput) => jsonResult(await memApprove(input, context)),\n );\n\n server.prompt(\n \"bootstrap_project\",\n \"Instructions for the AI client to analyze the project and save the context.\",\n BootstrapProjectArgsSchema,\n (args: BootstrapProjectArgs) => bootstrapProjectPrompt(args, context),\n );\n\n return { server, context };\n}\n","import { findProjectRoot, resolveHaivePaths, type HaivePaths } from \"@hiveai/core\";\n\nexport interface HaiveContext {\n paths: HaivePaths;\n}\n\nexport interface CreateContextOptions {\n root?: string;\n env?: NodeJS.ProcessEnv;\n cwd?: string;\n}\n\nexport function createContext(options: CreateContextOptions = {}): HaiveContext {\n const env = options.env ?? process.env;\n const cwd = options.cwd ?? process.cwd();\n const root =\n options.root ??\n env.HAIVE_PROJECT_ROOT ??\n findProjectRoot(cwd);\n return { paths: resolveHaivePaths(root) };\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const BootstrapProjectSaveInputSchema = {\n content: z\n .string()\n .min(1)\n .describe(\"Full Markdown content for the project (or module) context file\"),\n module: z\n .string()\n .optional()\n .describe(\n \"If provided, save under .ai/modules/<module>/context.md instead of .ai/project-context.md\",\n ),\n overwrite: z\n .boolean()\n .default(false)\n .describe(\"Overwrite an existing file instead of failing\"),\n};\n\nexport type BootstrapProjectSaveInput = {\n [K in keyof typeof BootstrapProjectSaveInputSchema]: z.infer<\n (typeof BootstrapProjectSaveInputSchema)[K]\n >;\n};\n\nexport interface BootstrapProjectSaveOutput {\n file_path: string;\n action: \"created\" | \"overwritten\";\n}\n\nexport async function bootstrapProjectSave(\n input: BootstrapProjectSaveInput,\n ctx: HaiveContext,\n): Promise<BootstrapProjectSaveOutput> {\n const target = input.module\n ? path.join(ctx.paths.modulesContextDir, input.module, \"context.md\")\n : ctx.paths.projectContext;\n\n const exists = existsSync(target);\n if (exists && !input.overwrite) {\n throw new Error(\n `${target} already exists. Pass overwrite=true to replace it.`,\n );\n }\n\n await mkdir(path.dirname(target), { recursive: true });\n await writeFile(target, input.content, \"utf8\");\n\n return {\n file_path: target,\n action: exists ? \"overwritten\" : \"created\",\n };\n}\n","import { readFile, readdir } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const GetProjectContextInputSchema = {\n module: z\n .string()\n .optional()\n .describe(\"If provided, also include the matching module's context file\"),\n list_modules: z\n .boolean()\n .default(false)\n .describe(\"Return the list of available module context files\"),\n};\n\nexport type GetProjectContextInput = {\n [K in keyof typeof GetProjectContextInputSchema]: z.infer<\n (typeof GetProjectContextInputSchema)[K]\n >;\n};\n\nexport interface GetProjectContextOutput {\n root_context: string | null;\n module_context?: { name: string; content: string };\n available_modules?: string[];\n}\n\nexport async function getProjectContext(\n input: GetProjectContextInput,\n ctx: HaiveContext,\n): Promise<GetProjectContextOutput> {\n const out: GetProjectContextOutput = { root_context: null };\n\n if (existsSync(ctx.paths.projectContext)) {\n out.root_context = await readFile(ctx.paths.projectContext, \"utf8\");\n }\n\n if (input.module) {\n const modFile = path.join(ctx.paths.modulesContextDir, input.module, \"context.md\");\n if (existsSync(modFile)) {\n out.module_context = {\n name: input.module,\n content: await readFile(modFile, \"utf8\"),\n };\n }\n }\n\n if (input.list_modules) {\n out.available_modules = await listModules(ctx.paths.modulesContextDir);\n }\n\n return out;\n}\n\nasync function listModules(modulesDir: string): Promise<string[]> {\n if (!existsSync(modulesDir)) return [];\n const entries = await readdir(modulesDir, { withFileTypes: true });\n return entries.filter((e) => e.isDirectory()).map((e) => e.name).sort();\n}\n","import { existsSync } from \"node:fs\";\nimport { loadMemoriesFromDir } from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemListInputSchema = {\n scope: z.enum([\"personal\", \"team\", \"module\"]).optional(),\n type: z\n .enum([\"convention\", \"decision\", \"gotcha\", \"architecture\", \"glossary\"])\n .optional(),\n module: z.string().optional(),\n tag: z.string().optional(),\n status: z\n .enum([\"draft\", \"proposed\", \"validated\", \"deprecated\", \"stale\", \"rejected\"])\n .optional()\n .describe(\"Filter by a single status. Omit to return all statuses.\"),\n exclude_rejected: z\n .boolean()\n .default(false)\n .describe(\"When true, exclude memories with status=rejected from results.\"),\n include_body: z\n .boolean()\n .default(false)\n .describe(\"Include full body text. Default false to save tokens — use mem_get for a single memory's full content.\"),\n};\n\nexport type MemListInput = {\n [K in keyof typeof MemListInputSchema]: z.infer<(typeof MemListInputSchema)[K]>;\n};\n\nexport interface MemSummary {\n id: string;\n scope: string;\n type: string;\n module?: string;\n status: string;\n tags: string[];\n snippet: string;\n file_path: string;\n body?: string;\n}\n\nexport async function memList(\n input: MemListInput,\n ctx: HaiveContext,\n): Promise<{ memories: MemSummary[] }> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n return { memories: [] };\n }\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const filtered = all.filter(({ memory }) => {\n const fm = memory.frontmatter;\n if (input.scope && fm.scope !== input.scope) return false;\n if (input.type && fm.type !== input.type) return false;\n if (input.module && fm.module !== input.module) return false;\n if (input.tag && !fm.tags.includes(input.tag)) return false;\n if (input.status && fm.status !== input.status) return false;\n if (input.exclude_rejected && fm.status === \"rejected\") return false;\n return true;\n });\n const memories: MemSummary[] = filtered.map(({ memory, filePath }) => {\n const fm = memory.frontmatter;\n const snippet = memory.body.replace(/\\s+/g, \" \").trim().slice(0, 120);\n return {\n id: fm.id,\n scope: fm.scope,\n type: fm.type,\n ...(fm.module ? { module: fm.module } : {}),\n status: fm.status,\n tags: fm.tags,\n snippet,\n file_path: filePath,\n ...(input.include_body ? { body: memory.body } : {}),\n };\n });\n return { memories };\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport {\n buildFrontmatter,\n memoryFilePath,\n serializeMemory,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemSaveInputSchema = {\n type: z\n .enum([\"convention\", \"decision\", \"gotcha\", \"architecture\", \"glossary\"])\n .describe(\"Kind of memory being saved\"),\n slug: z\n .string()\n .min(1)\n .describe(\"Short human-readable identifier — becomes part of the filename\"),\n body: z\n .string()\n .describe(\"Markdown body of the memory\"),\n scope: z\n .enum([\"personal\", \"team\", \"module\"])\n .default(\"personal\")\n .describe(\"Visibility scope: personal | team | module\"),\n module: z\n .string()\n .optional()\n .describe(\"Module name (required when scope=module)\"),\n tags: z.array(z.string()).default([]).describe(\"Tags for filtering\"),\n domain: z.string().optional().describe(\"Domain (e.g. transactions, billing)\"),\n author: z.string().optional().describe(\"Author handle or email\"),\n paths: z\n .array(z.string())\n .default([])\n .describe(\"Anchor paths (file paths this memory references)\"),\n symbols: z\n .array(z.string())\n .default([])\n .describe(\"Anchor symbols (function/class names this memory references)\"),\n commit: z\n .string()\n .optional()\n .describe(\"Anchor commit SHA (for staleness detection later)\"),\n};\n\nexport type MemSaveInput = {\n [K in keyof typeof MemSaveInputSchema]: z.infer<(typeof MemSaveInputSchema)[K]>;\n};\n\nexport interface MemSaveOutput {\n id: string;\n scope: string;\n file_path: string;\n}\n\nexport async function memSave(\n input: MemSaveInput,\n ctx: HaiveContext,\n): Promise<MemSaveOutput> {\n if (!existsSync(ctx.paths.haiveDir)) {\n throw new Error(\n `No .ai/ directory at ${ctx.paths.root}. Run 'haive init' first.`,\n );\n }\n\n const frontmatter = buildFrontmatter({\n type: input.type,\n slug: input.slug,\n scope: input.scope,\n module: input.module,\n tags: input.tags,\n domain: input.domain,\n author: input.author,\n paths: input.paths,\n symbols: input.symbols,\n commit: input.commit,\n });\n\n const file = memoryFilePath(\n ctx.paths,\n frontmatter.scope,\n frontmatter.id,\n frontmatter.module,\n );\n await mkdir(path.dirname(file), { recursive: true });\n\n if (existsSync(file)) {\n throw new Error(`Memory already exists at ${file}`);\n }\n\n await writeFile(file, serializeMemory({ frontmatter, body: input.body }), \"utf8\");\n\n return {\n id: frontmatter.id,\n scope: frontmatter.scope,\n file_path: file,\n };\n}\n","import { existsSync } from \"node:fs\";\nimport {\n deriveConfidence,\n extractSnippet,\n getUsage,\n literalMatchesAllTokens,\n loadMemoriesFromDir,\n loadUsageIndex,\n pickSnippetNeedle,\n tokenizeQuery,\n trackReads,\n type ConfidenceLevel,\n type LoadedMemory,\n type UsageIndex,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemSearchInputSchema = {\n query: z.string().describe(\"Substring matched against id, tags, and body\"),\n scope: z\n .enum([\"personal\", \"team\", \"module\"])\n .optional()\n .describe(\"Restrict results to a single scope\"),\n type: z\n .enum([\"convention\", \"decision\", \"gotcha\", \"architecture\", \"glossary\"])\n .optional()\n .describe(\"Restrict results to a memory type\"),\n module: z.string().optional().describe(\"Restrict results to a module\"),\n status: z\n .enum([\"draft\", \"proposed\", \"validated\", \"deprecated\", \"stale\", \"rejected\"])\n .optional()\n .describe(\"Filter by a single status. Omit to return all statuses.\"),\n exclude_rejected: z\n .boolean()\n .default(false)\n .describe(\"When true, exclude memories with status=rejected from results.\"),\n limit: z.number().int().positive().max(100).default(20).describe(\"Max results\"),\n semantic: z\n .boolean()\n .default(false)\n .describe(\n \"Use semantic similarity from the embeddings index (requires `haive embeddings index`).\",\n ),\n min_score: z\n .number()\n .min(0)\n .max(1)\n .default(0)\n .describe(\"Minimum cosine similarity (semantic mode only)\"),\n track: z\n .boolean()\n .default(true)\n .describe(\"Increment read_count on returned memories (used for passive validation)\"),\n};\n\nexport type MemSearchInput = {\n [K in keyof typeof MemSearchInputSchema]: z.infer<(typeof MemSearchInputSchema)[K]>;\n};\n\nexport interface MemSearchHit {\n id: string;\n scope: string;\n type: string;\n module?: string;\n tags: string[];\n status: string;\n confidence: ConfidenceLevel;\n read_count: number;\n snippet: string;\n file_path: string;\n score?: number;\n}\n\nexport interface MemSearchOutput {\n matches: MemSearchHit[];\n total: number;\n mode: \"literal\" | \"semantic\" | \"literal_fallback\";\n notice?: string;\n}\n\nexport async function memSearch(\n input: MemSearchInput,\n ctx: HaiveContext,\n): Promise<MemSearchOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n return { matches: [], total: 0, mode: input.semantic ? \"literal_fallback\" : \"literal\" };\n }\n\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const filtered = all.filter(({ memory }) => passesFilters(memory.frontmatter, input));\n const usage = await loadUsageIndex(ctx.paths);\n\n let result: MemSearchOutput;\n if (input.semantic) {\n const semantic = await trySemanticSearch(ctx, input, filtered, usage);\n if (semantic) {\n result = semantic;\n } else {\n result = {\n ...buildLiteralResult(input, filtered, usage),\n mode: \"literal_fallback\",\n notice:\n \"Semantic search unavailable (embeddings index missing or @hiveai/embeddings not installed). Falling back to literal search.\",\n };\n }\n } else {\n result = buildLiteralResult(input, filtered, usage);\n }\n\n if (input.track && result.matches.length > 0) {\n await trackReads(\n ctx.paths,\n result.matches.map((m) => m.id),\n );\n }\n\n return result;\n}\n\nfunction passesFilters(\n fm: LoadedMemory[\"memory\"][\"frontmatter\"],\n input: MemSearchInput,\n): boolean {\n if (input.scope && fm.scope !== input.scope) return false;\n if (input.type && fm.type !== input.type) return false;\n if (input.module && fm.module !== input.module) return false;\n if (input.status && fm.status !== input.status) return false;\n if (input.exclude_rejected && fm.status === \"rejected\") return false;\n return true;\n}\n\nfunction buildLiteralResult(\n input: MemSearchInput,\n filtered: LoadedMemory[],\n usage: UsageIndex,\n): { matches: MemSearchHit[]; total: number; mode: \"literal\" } {\n const tokens = tokenizeQuery(input.query);\n const matched = filtered.filter(({ memory }) => literalMatchesAllTokens(memory, tokens));\n const snippetNeedle = pickSnippetNeedle(input.query);\n const top = matched.slice(0, input.limit);\n return {\n matches: top.map((loaded) => toHit(loaded, snippetNeedle, usage)),\n total: matched.length,\n mode: \"literal\",\n };\n}\n\nasync function trySemanticSearch(\n ctx: HaiveContext,\n input: MemSearchInput,\n filtered: LoadedMemory[],\n usage: UsageIndex,\n): Promise<MemSearchOutput | null> {\n let mod: typeof import(\"@hiveai/embeddings\");\n try {\n mod = await import(\"@hiveai/embeddings\");\n } catch {\n return null;\n }\n const result = await mod.semanticSearch(ctx.paths, input.query, {\n limit: Math.min(input.limit * 3, 100),\n minScore: input.min_score,\n });\n if (!result) return null;\n\n const allowedIds = new Set(filtered.map((m) => m.memory.frontmatter.id));\n const byId = new Map(filtered.map((m) => [m.memory.frontmatter.id, m]));\n\n const ranked = result.hits\n .filter((h) => allowedIds.has(h.id))\n .slice(0, input.limit);\n\n const matches: MemSearchHit[] = ranked.map((hit) => {\n const loaded = byId.get(hit.id);\n if (!loaded) {\n return {\n id: hit.id,\n scope: \"unknown\",\n type: \"unknown\",\n tags: [],\n status: \"unknown\",\n confidence: \"unverified\" as const,\n read_count: 0,\n snippet: \"\",\n file_path: hit.file_path,\n score: hit.score,\n };\n }\n const base = toHit(loaded, input.query.toLowerCase(), usage);\n return { ...base, score: hit.score };\n });\n\n return {\n matches,\n total: ranked.length,\n mode: \"semantic\",\n };\n}\n\nfunction toHit(loaded: LoadedMemory, needle: string, usage: UsageIndex): MemSearchHit {\n const fm = loaded.memory.frontmatter;\n const u = getUsage(usage, fm.id);\n return {\n id: fm.id,\n scope: fm.scope,\n type: fm.type,\n ...(fm.module ? { module: fm.module } : {}),\n tags: fm.tags,\n status: fm.status,\n confidence: deriveConfidence(fm, u),\n read_count: u.read_count,\n snippet: extractSnippet(loaded.memory.body, needle),\n file_path: loaded.filePath,\n };\n}\n","import { writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport {\n loadMemoriesFromDir,\n serializeMemory,\n verifyAnchor,\n type Memory,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemVerifyInputSchema = {\n id: z.string().optional().describe(\"If set, verify only this memory id\"),\n update: z\n .boolean()\n .default(false)\n .describe(\"Write the resulting status back to disk (status=stale or validated)\"),\n};\n\nexport type MemVerifyInput = {\n [K in keyof typeof MemVerifyInputSchema]: z.infer<(typeof MemVerifyInputSchema)[K]>;\n};\n\nexport interface MemVerifyHit {\n id: string;\n file_path: string;\n stale: boolean;\n reason: string | null;\n status_after: string;\n skipped?: boolean;\n}\n\nexport interface MemVerifyOutput {\n results: MemVerifyHit[];\n summary: {\n checked: number;\n fresh: number;\n stale: number;\n anchorless_skipped: number;\n updated: number;\n };\n}\n\nexport async function memVerify(\n input: MemVerifyInput,\n ctx: HaiveContext,\n): Promise<MemVerifyOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n return {\n results: [],\n summary: { checked: 0, fresh: 0, stale: 0, anchorless_skipped: 0, updated: 0 },\n };\n }\n\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const targets = input.id\n ? all.filter((m) => m.memory.frontmatter.id === input.id)\n : all;\n\n const results: MemVerifyHit[] = [];\n let fresh = 0;\n let stale = 0;\n let anchorless = 0;\n let updated = 0;\n\n for (const { memory, filePath } of targets) {\n const isAnchored =\n memory.frontmatter.anchor.paths.length > 0 ||\n memory.frontmatter.anchor.symbols.length > 0;\n if (!isAnchored) {\n anchorless++;\n results.push({\n id: memory.frontmatter.id,\n file_path: filePath,\n stale: false,\n reason: null,\n status_after: memory.frontmatter.status,\n skipped: true,\n });\n continue;\n }\n const result = await verifyAnchor(memory, { projectRoot: ctx.paths.root });\n if (result.stale) stale++;\n else fresh++;\n\n let statusAfter = memory.frontmatter.status;\n if (input.update) {\n const next = applyVerification(memory, result);\n await writeFile(filePath, serializeMemory(next), \"utf8\");\n statusAfter = next.frontmatter.status;\n updated++;\n }\n\n results.push({\n id: memory.frontmatter.id,\n file_path: filePath,\n stale: result.stale,\n reason: result.reason,\n status_after: statusAfter,\n });\n }\n\n return {\n results,\n summary: {\n checked: results.length + anchorless,\n fresh,\n stale,\n anchorless_skipped: anchorless,\n updated,\n },\n };\n}\n\nfunction applyVerification(\n mem: Memory,\n result: { stale: boolean; reason: string | null },\n): Memory {\n const verifiedAt = new Date().toISOString();\n if (result.stale) {\n return {\n frontmatter: {\n ...mem.frontmatter,\n status: \"stale\",\n verified_at: verifiedAt,\n stale_reason: result.reason,\n },\n body: mem.body,\n };\n }\n const nextStatus =\n mem.frontmatter.status === \"stale\" || mem.frontmatter.status === \"draft\"\n ? \"validated\"\n : mem.frontmatter.status;\n return {\n frontmatter: {\n ...mem.frontmatter,\n status: nextStatus,\n verified_at: verifiedAt,\n stale_reason: null,\n },\n body: mem.body,\n };\n}\n","import { writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport {\n loadMemoriesFromDir,\n loadUsageIndex,\n recordRejection,\n saveUsageIndex,\n serializeMemory,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemRejectInputSchema = {\n id: z.string().min(1).describe(\"Memory id being rejected\"),\n reason: z\n .string()\n .optional()\n .describe(\"Why this memory is being rejected (recorded for review)\"),\n};\n\nexport type MemRejectInput = {\n [K in keyof typeof MemRejectInputSchema]: z.infer<(typeof MemRejectInputSchema)[K]>;\n};\n\nexport interface MemRejectOutput {\n id: string;\n status: string;\n rejected_count: number;\n last_rejected_at: string | null;\n rejection_reason: string | null;\n}\n\nexport async function memReject(\n input: MemRejectInput,\n ctx: HaiveContext,\n): Promise<MemRejectOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n throw new Error(`No .ai/memories at ${ctx.paths.root}.`);\n }\n\n const memories = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const loaded = memories.find((m) => m.memory.frontmatter.id === input.id);\n if (!loaded) throw new Error(`No memory with id \"${input.id}\".`);\n\n // Write rejected status and reason to disk\n await writeFile(\n loaded.filePath,\n serializeMemory({\n frontmatter: {\n ...loaded.memory.frontmatter,\n status: \"rejected\",\n stale_reason: input.reason ?? loaded.memory.frontmatter.stale_reason ?? null,\n },\n body: loaded.memory.body,\n }),\n \"utf8\",\n );\n\n const idx = await loadUsageIndex(ctx.paths);\n recordRejection(idx, input.id, input.reason ?? null);\n await saveUsageIndex(ctx.paths, idx);\n const u = idx.by_id[input.id];\n return {\n id: input.id,\n status: \"rejected\",\n rejected_count: u?.rejected_count ?? 0,\n last_rejected_at: u?.last_rejected_at ?? null,\n rejection_reason: u?.rejection_reason ?? null,\n };\n}\n","import { readFile, readdir } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport {\n deriveConfidence,\n getUsage,\n inferModulesFromPaths,\n loadMemoriesFromDir,\n loadUsageIndex,\n memoryMatchesAnchorPaths,\n trackReads,\n type ConfidenceLevel,\n type LoadedMemory,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemForFilesInputSchema = {\n files: z\n .array(z.string())\n .min(1)\n .describe(\"Project-relative file paths the agent is currently working on\"),\n include_module_contexts: z\n .boolean()\n .default(true)\n .describe(\"Inline the matching .ai/modules/<name>/context.md contents\"),\n track: z\n .boolean()\n .default(true)\n .describe(\"Increment read_count on returned memories\"),\n};\n\nexport type MemForFilesInput = {\n [K in keyof typeof MemForFilesInputSchema]: z.infer<(typeof MemForFilesInputSchema)[K]>;\n};\n\nexport interface MemMatch {\n id: string;\n scope: string;\n type: string;\n module?: string;\n tags: string[];\n status: string;\n confidence: ConfidenceLevel;\n read_count: number;\n reason: \"anchor_overlap\" | \"module\" | \"domain\";\n file_path: string;\n body: string;\n}\n\nexport interface MemForFilesOutput {\n inferred_modules: string[];\n by_anchor: MemMatch[];\n by_module: MemMatch[];\n by_domain: MemMatch[];\n module_contexts: Array<{ name: string; content: string }>;\n}\n\nexport async function memForFiles(\n input: MemForFilesInput,\n ctx: HaiveContext,\n): Promise<MemForFilesOutput> {\n const inferred = inferModulesFromPaths(input.files);\n\n if (!existsSync(ctx.paths.memoriesDir)) {\n return {\n inferred_modules: inferred,\n by_anchor: [],\n by_module: [],\n by_domain: [],\n module_contexts: await loadModuleContexts(ctx, inferred, input.include_module_contexts),\n };\n }\n\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const usage = await loadUsageIndex(ctx.paths);\n const seen = new Set<string>();\n\n const byAnchor: MemMatch[] = [];\n const byModule: MemMatch[] = [];\n const byDomain: MemMatch[] = [];\n\n for (const loaded of all) {\n if (memoryMatchesAnchorPaths(loaded.memory, input.files)) {\n byAnchor.push(toMatch(loaded, \"anchor_overlap\", usage));\n seen.add(loaded.memory.frontmatter.id);\n }\n }\n\n for (const loaded of all) {\n if (seen.has(loaded.memory.frontmatter.id)) continue;\n const fm = loaded.memory.frontmatter;\n const moduleHit =\n (fm.module && inferred.includes(fm.module)) ||\n fm.tags.some((t) => inferred.includes(t));\n if (moduleHit) {\n byModule.push(toMatch(loaded, \"module\", usage));\n seen.add(fm.id);\n }\n }\n\n for (const loaded of all) {\n if (seen.has(loaded.memory.frontmatter.id)) continue;\n const domain = loaded.memory.frontmatter.domain;\n if (domain && inferred.includes(domain)) {\n byDomain.push(toMatch(loaded, \"domain\", usage));\n seen.add(loaded.memory.frontmatter.id);\n }\n }\n\n if (input.track) {\n await trackReads(ctx.paths, [...seen]);\n }\n\n return {\n inferred_modules: inferred,\n by_anchor: byAnchor,\n by_module: byModule,\n by_domain: byDomain,\n module_contexts: await loadModuleContexts(ctx, inferred, input.include_module_contexts),\n };\n}\n\nfunction toMatch(\n loaded: LoadedMemory,\n reason: MemMatch[\"reason\"],\n usage: Parameters<typeof getUsage>[0],\n): MemMatch {\n const fm = loaded.memory.frontmatter;\n const u = getUsage(usage, fm.id);\n return {\n id: fm.id,\n scope: fm.scope,\n type: fm.type,\n ...(fm.module ? { module: fm.module } : {}),\n tags: fm.tags,\n status: fm.status,\n confidence: deriveConfidence(fm, u),\n read_count: u.read_count,\n reason,\n file_path: loaded.filePath,\n body: loaded.memory.body,\n };\n}\n\nasync function loadModuleContexts(\n ctx: HaiveContext,\n modules: string[],\n enabled: boolean,\n): Promise<Array<{ name: string; content: string }>> {\n if (!enabled || modules.length === 0) return [];\n if (!existsSync(ctx.paths.modulesContextDir)) return [];\n const available = new Set(\n (await readdir(ctx.paths.modulesContextDir, { withFileTypes: true }))\n .filter((d) => d.isDirectory())\n .map((d) => d.name),\n );\n const out: Array<{ name: string; content: string }> = [];\n for (const m of modules) {\n if (!available.has(m)) continue;\n const file = path.join(ctx.paths.modulesContextDir, m, \"context.md\");\n if (existsSync(file)) {\n out.push({ name: m, content: await readFile(file, \"utf8\") });\n }\n }\n return out;\n}\n","import { existsSync } from \"node:fs\";\nimport {\n deriveConfidence,\n getUsage,\n loadMemoriesFromDir,\n loadUsageIndex,\n type ConfidenceLevel,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemGetInputSchema = {\n id: z.string().min(1).describe(\"Memory id to fetch\"),\n};\n\nexport type MemGetInput = {\n [K in keyof typeof MemGetInputSchema]: z.infer<(typeof MemGetInputSchema)[K]>;\n};\n\nexport interface MemGetOutput {\n id: string;\n scope: string;\n type: string;\n module?: string;\n tags: string[];\n status: string;\n confidence: ConfidenceLevel;\n read_count: number;\n rejected_count: number;\n created_at: string;\n verified_at: string | null;\n stale_reason: string | null;\n anchor: { commit?: string; paths: string[]; symbols: string[] };\n body: string;\n file_path: string;\n}\n\nexport async function memGet(input: MemGetInput, ctx: HaiveContext): Promise<MemGetOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n throw new Error(`No .ai/memories at ${ctx.paths.root}.`);\n }\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const found = all.find((m) => m.memory.frontmatter.id === input.id);\n if (!found) throw new Error(`No memory with id \"${input.id}\".`);\n const fm = found.memory.frontmatter;\n const u = getUsage(await loadUsageIndex(ctx.paths), fm.id);\n return {\n id: fm.id,\n scope: fm.scope,\n type: fm.type,\n ...(fm.module ? { module: fm.module } : {}),\n tags: fm.tags,\n status: fm.status,\n confidence: deriveConfidence(fm, u),\n read_count: u.read_count,\n rejected_count: u.rejected_count,\n created_at: fm.created_at,\n verified_at: fm.verified_at,\n stale_reason: fm.stale_reason,\n anchor: {\n ...(fm.anchor.commit ? { commit: fm.anchor.commit } : {}),\n paths: fm.anchor.paths,\n symbols: fm.anchor.symbols,\n },\n body: found.memory.body,\n file_path: found.filePath,\n };\n}\n","import { existsSync } from \"node:fs\";\nimport { unlink } from \"node:fs/promises\";\nimport {\n loadMemoriesFromDir,\n loadUsageIndex,\n saveUsageIndex,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemDeleteInputSchema = {\n id: z.string().min(1).describe(\"Memory id to delete\"),\n keep_usage: z\n .boolean()\n .default(false)\n .describe(\"Keep the usage.json entry instead of removing it alongside the file\"),\n};\n\nexport type MemDeleteInput = {\n [K in keyof typeof MemDeleteInputSchema]: z.infer<(typeof MemDeleteInputSchema)[K]>;\n};\n\nexport interface MemDeleteOutput {\n id: string;\n deleted_file: string;\n usage_removed: boolean;\n}\n\nexport async function memDelete(\n input: MemDeleteInput,\n ctx: HaiveContext,\n): Promise<MemDeleteOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n throw new Error(`No .ai/memories at ${ctx.paths.root}.`);\n }\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const found = all.find((m) => m.memory.frontmatter.id === input.id);\n if (!found) throw new Error(`No memory with id \"${input.id}\".`);\n\n await unlink(found.filePath);\n\n let usageRemoved = false;\n if (!input.keep_usage) {\n const idx = await loadUsageIndex(ctx.paths);\n if (idx.by_id[input.id]) {\n delete idx.by_id[input.id];\n await saveUsageIndex(ctx.paths, idx);\n usageRemoved = true;\n }\n }\n\n return { id: input.id, deleted_file: found.filePath, usage_removed: usageRemoved };\n}\n","import { writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { loadMemoriesFromDir, serializeMemory } from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemUpdateInputSchema = {\n id: z.string().min(1).describe(\"Id of the memory to update\"),\n body: z.string().optional().describe(\"New Markdown body — replaces the existing body\"),\n tags: z\n .array(z.string())\n .optional()\n .describe(\"New tags array — fully replaces existing tags\"),\n paths: z\n .array(z.string())\n .optional()\n .describe(\"New anchor paths — fully replaces existing anchor.paths\"),\n symbols: z\n .array(z.string())\n .optional()\n .describe(\"New anchor symbols — fully replaces existing anchor.symbols\"),\n commit: z.string().optional().describe(\"New anchor commit SHA\"),\n domain: z.string().optional().describe(\"New domain label\"),\n author: z.string().optional().describe(\"New author handle or email\"),\n};\n\nexport type MemUpdateInput = {\n [K in keyof typeof MemUpdateInputSchema]: z.infer<(typeof MemUpdateInputSchema)[K]>;\n};\n\nexport interface MemUpdateOutput {\n id: string;\n file_path: string;\n updated_fields: string[];\n}\n\nexport async function memUpdate(\n input: MemUpdateInput,\n ctx: HaiveContext,\n): Promise<MemUpdateOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n throw new Error(`No .ai/memories at ${ctx.paths.root}.`);\n }\n\n const memories = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const loaded = memories.find((m) => m.memory.frontmatter.id === input.id);\n if (!loaded) throw new Error(`No memory with id \"${input.id}\".`);\n\n const { frontmatter, body } = loaded.memory;\n const updated_fields: string[] = [];\n\n const newAnchor = { ...frontmatter.anchor };\n if (input.paths !== undefined) { newAnchor.paths = input.paths; updated_fields.push(\"anchor.paths\"); }\n if (input.symbols !== undefined) { newAnchor.symbols = input.symbols; updated_fields.push(\"anchor.symbols\"); }\n if (input.commit !== undefined) { newAnchor.commit = input.commit; updated_fields.push(\"anchor.commit\"); }\n\n const newFrontmatter = {\n ...frontmatter,\n anchor: newAnchor,\n ...(input.tags !== undefined ? { tags: input.tags } : {}),\n ...(input.domain !== undefined ? { domain: input.domain } : {}),\n ...(input.author !== undefined ? { author: input.author } : {}),\n };\n\n if (input.tags !== undefined) updated_fields.push(\"tags\");\n if (input.domain !== undefined) updated_fields.push(\"domain\");\n if (input.author !== undefined) updated_fields.push(\"author\");\n\n const newBody = input.body !== undefined ? input.body : body;\n if (input.body !== undefined) updated_fields.push(\"body\");\n\n if (updated_fields.length === 0) {\n throw new Error(\"No fields to update — provide at least one of: body, tags, paths, symbols, commit, domain, author.\");\n }\n\n await writeFile(\n loaded.filePath,\n serializeMemory({ frontmatter: newFrontmatter, body: newBody }),\n \"utf8\",\n );\n\n return { id: input.id, file_path: loaded.filePath, updated_fields };\n}\n","import { existsSync } from \"node:fs\";\nimport {\n getUsage,\n loadMemoriesFromDir,\n loadUsageIndex,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemPendingInputSchema = {\n scope: z.enum([\"personal\", \"team\", \"module\"]).optional(),\n};\n\nexport type MemPendingInput = {\n [K in keyof typeof MemPendingInputSchema]: z.infer<(typeof MemPendingInputSchema)[K]>;\n};\n\nexport interface MemPendingHit {\n id: string;\n scope: string;\n type: string;\n module?: string;\n tags: string[];\n age_days: number;\n read_count: number;\n rejected_count: number;\n file_path: string;\n}\n\nexport interface MemPendingOutput {\n pending: MemPendingHit[];\n}\n\nexport async function memPending(\n input: MemPendingInput,\n ctx: HaiveContext,\n): Promise<MemPendingOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) return { pending: [] };\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const usage = await loadUsageIndex(ctx.paths);\n const now = Date.now();\n const proposed = all.filter(({ memory }) => {\n if (memory.frontmatter.status !== \"proposed\") return false;\n if (input.scope && memory.frontmatter.scope !== input.scope) return false;\n return true;\n });\n\n proposed.sort(\n (a, b) =>\n getUsage(usage, b.memory.frontmatter.id).read_count -\n getUsage(usage, a.memory.frontmatter.id).read_count,\n );\n\n return {\n pending: proposed.map(({ memory, filePath }) => {\n const fm = memory.frontmatter;\n const u = getUsage(usage, fm.id);\n return {\n id: fm.id,\n scope: fm.scope,\n type: fm.type,\n ...(fm.module ? { module: fm.module } : {}),\n tags: fm.tags,\n age_days: Math.floor((now - new Date(fm.created_at).getTime()) / 86_400_000),\n read_count: u.read_count,\n rejected_count: u.rejected_count,\n file_path: filePath,\n };\n }),\n };\n}\n","import { writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport {\n loadMemoriesFromDir,\n serializeMemory,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemApproveInputSchema = {\n id: z.string().min(1).describe(\"Memory id to approve (sets status=validated immediately)\"),\n};\n\nexport type MemApproveInput = {\n [K in keyof typeof MemApproveInputSchema]: z.infer<(typeof MemApproveInputSchema)[K]>;\n};\n\nexport interface MemApproveOutput {\n id: string;\n previous_status: string;\n status: \"validated\";\n file_path: string;\n}\n\nexport async function memApprove(\n input: MemApproveInput,\n ctx: HaiveContext,\n): Promise<MemApproveOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n throw new Error(`No .ai/memories at ${ctx.paths.root}.`);\n }\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const found = all.find((m) => m.memory.frontmatter.id === input.id);\n if (!found) throw new Error(`No memory with id \"${input.id}\".`);\n\n const previous = found.memory.frontmatter.status;\n const next = {\n frontmatter: { ...found.memory.frontmatter, status: \"validated\" as const },\n body: found.memory.body,\n };\n await writeFile(found.filePath, serializeMemory(next), \"utf8\");\n return {\n id: input.id,\n previous_status: previous,\n status: \"validated\",\n file_path: found.filePath,\n };\n}\n","import { readFile, readdir } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport {\n allocateBudget,\n deriveConfidence,\n estimateTokens,\n getUsage,\n inferModulesFromPaths,\n literalMatchesAllTokens,\n loadMemoriesFromDir,\n loadUsageIndex,\n memoryMatchesAnchorPaths,\n tokenizeQuery,\n trackReads,\n truncateToTokens,\n type ConfidenceLevel,\n type LoadedMemory,\n type UsageIndex,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const GetBriefingInputSchema = {\n task: z\n .string()\n .optional()\n .describe(\n \"What you are about to do, in 1–2 sentences. Used to rank relevant memories semantically.\",\n ),\n files: z\n .array(z.string())\n .default([])\n .describe(\"Project-relative file paths the agent is currently looking at or about to edit\"),\n max_tokens: z\n .number()\n .int()\n .positive()\n .default(8000)\n .describe(\n \"Approximate token budget for the entire briefing. Each section is allocated a share and truncated to fit.\",\n ),\n max_memories: z\n .number()\n .int()\n .positive()\n .default(8)\n .describe(\"Cap on memories surfaced regardless of token budget\"),\n include_project_context: z.boolean().default(true),\n include_module_contexts: z.boolean().default(true),\n semantic: z\n .boolean()\n .default(true)\n .describe(\n \"Use semantic ranking when a task is provided (requires `haive embeddings index`).\",\n ),\n track: z.boolean().default(true).describe(\"Increment read_count on returned memories\"),\n};\n\nexport type GetBriefingInput = {\n [K in keyof typeof GetBriefingInputSchema]: z.infer<(typeof GetBriefingInputSchema)[K]>;\n};\n\nexport interface BriefingMemory {\n id: string;\n scope: string;\n type: string;\n module?: string;\n tags: string[];\n status: string;\n confidence: ConfidenceLevel;\n read_count: number;\n reasons: Array<\"anchor\" | \"module\" | \"domain\" | \"semantic\">;\n semantic_score?: number;\n body: string;\n file_path: string;\n}\n\nexport interface BriefingOutput {\n task?: string;\n search_mode: \"semantic\" | \"literal_fallback\" | \"literal\";\n inferred_modules: string[];\n project_context: { content: string; truncated: boolean } | null;\n module_contexts: Array<{ name: string; content: string; truncated: boolean }>;\n memories: BriefingMemory[];\n estimated_tokens: number;\n budget: { max_tokens: number; spent: { project: number; modules: number; memories: number } };\n}\n\nexport async function getBriefing(\n input: GetBriefingInput,\n ctx: HaiveContext,\n): Promise<BriefingOutput> {\n const inferred = inferModulesFromPaths(input.files);\n const memories: BriefingMemory[] = [];\n let searchMode: BriefingOutput[\"search_mode\"] = \"literal\";\n\n if (existsSync(ctx.paths.memoriesDir)) {\n const allMemories = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const usage = await loadUsageIndex(ctx.paths);\n const semanticHits = input.task && input.semantic\n ? await trySemanticHits(ctx, input.task, allMemories.length * 2)\n : null;\n\n if (input.task && input.semantic) {\n searchMode = semanticHits ? \"semantic\" : \"literal_fallback\";\n }\n\n const seen = new Map<string, BriefingMemory>();\n\n const addOrUpdate = (\n loaded: LoadedMemory,\n reason: BriefingMemory[\"reasons\"][number],\n score?: number,\n ): void => {\n const fm = loaded.memory.frontmatter;\n const existing = seen.get(fm.id);\n if (existing) {\n if (!existing.reasons.includes(reason)) existing.reasons.push(reason);\n if (score !== undefined && (existing.semantic_score ?? 0) < score) {\n existing.semantic_score = score;\n }\n return;\n }\n const u = getUsage(usage, fm.id);\n seen.set(fm.id, {\n id: fm.id,\n scope: fm.scope,\n type: fm.type,\n ...(fm.module ? { module: fm.module } : {}),\n tags: fm.tags,\n status: fm.status,\n confidence: deriveConfidence(fm, u),\n read_count: u.read_count,\n reasons: [reason],\n ...(score !== undefined ? { semantic_score: score } : {}),\n body: loaded.memory.body,\n file_path: loaded.filePath,\n });\n };\n\n if (input.files.length > 0) {\n for (const loaded of allMemories) {\n if (memoryMatchesAnchorPaths(loaded.memory, input.files)) addOrUpdate(loaded, \"anchor\");\n }\n for (const loaded of allMemories) {\n const fm = loaded.memory.frontmatter;\n if (fm.module && inferred.includes(fm.module)) addOrUpdate(loaded, \"module\");\n if (fm.domain && inferred.includes(fm.domain)) addOrUpdate(loaded, \"domain\");\n if (fm.tags.some((t) => inferred.includes(t))) addOrUpdate(loaded, \"module\");\n }\n }\n\n if (input.task) {\n const tokens = tokenizeQuery(input.task);\n for (const loaded of allMemories) {\n if (literalMatchesAllTokens(loaded.memory, tokens)) {\n addOrUpdate(loaded, \"semantic\");\n }\n }\n if (semanticHits) {\n const byId = new Map(allMemories.map((m) => [m.memory.frontmatter.id, m]));\n for (const hit of semanticHits) {\n const loaded = byId.get(hit.id);\n if (loaded) addOrUpdate(loaded, \"semantic\", hit.score);\n }\n }\n }\n\n const ranked = [...seen.values()].sort((a, b) => {\n const reasonScore = (m: BriefingMemory): number =>\n (m.reasons.includes(\"anchor\") ? 4 : 0) +\n (m.reasons.includes(\"module\") ? 2 : 0) +\n (m.reasons.includes(\"semantic\") ? 2 : 0) +\n (m.reasons.includes(\"domain\") ? 1 : 0);\n const confidenceScore = (m: BriefingMemory): number =>\n m.confidence === \"authoritative\" ? 4 :\n m.confidence === \"trusted\" ? 3 :\n m.confidence === \"low\" ? 1 :\n m.confidence === \"stale\" ? -2 : 0;\n const sa = reasonScore(a) + confidenceScore(a) + (a.semantic_score ?? 0);\n const sb = reasonScore(b) + confidenceScore(b) + (b.semantic_score ?? 0);\n return sb - sa;\n });\n\n memories.push(...ranked.slice(0, input.max_memories));\n\n if (input.track && memories.length > 0) {\n await trackReads(ctx.paths, memories.map((m) => m.id));\n }\n }\n\n // Build raw section payloads\n const projectContext =\n input.include_project_context && existsSync(ctx.paths.projectContext)\n ? await readFile(ctx.paths.projectContext, \"utf8\")\n : \"\";\n\n const moduleContents = input.include_module_contexts\n ? await loadModuleContexts(ctx, inferred)\n : [];\n\n const memoriesText = memories\n .map((m) => `### ${m.id} (${m.scope}/${m.type}, ${m.confidence})\\n${m.body.trim()}`)\n .join(\"\\n\\n---\\n\\n\");\n\n // Allocate budget across the three large pieces\n const slices = allocateBudget(\n [\n { key: \"project\", text: projectContext, weight: 3, mode: \"head\" },\n {\n key: \"modules\",\n text: moduleContents.map((m) => `## ${m.name}\\n${m.content}`).join(\"\\n\\n---\\n\\n\"),\n weight: 3,\n mode: \"head\",\n },\n { key: \"memories\", text: memoriesText, weight: 4, mode: \"head\" },\n ],\n input.max_tokens,\n );\n\n const projectSlice = slices.find((s) => s.key === \"project\")!;\n const modulesSlice = slices.find((s) => s.key === \"modules\")!;\n const memoriesSlice = slices.find((s) => s.key === \"memories\")!;\n\n const trimmedModules: BriefingOutput[\"module_contexts\"] = [];\n if (modulesSlice.text.length > 0 && moduleContents.length > 0) {\n // Distribute the modules slice across module entries proportionally\n const subSlices = allocateBudget(\n moduleContents.map((m) => ({ key: m.name, text: m.content, weight: 1, mode: \"head\" as const })),\n modulesSlice.allocatedTokens,\n );\n for (const m of moduleContents) {\n const sub = subSlices.find((s) => s.key === m.name)!;\n trimmedModules.push({ name: m.name, content: sub.text, truncated: sub.truncated });\n }\n }\n\n const trimmedMemoriesText = memoriesSlice.text;\n\n // Recompute memory bodies to fit. We slice the joined text but also expose\n // the truncated body per memory so the AI can render either form.\n const trimmedMemories = memories.map((m): BriefingMemory => {\n if (!memoriesSlice.truncated) return m;\n const tokensPer = Math.floor(memoriesSlice.allocatedTokens / Math.max(1, memories.length));\n const t = truncateToTokens(m.body, { maxTokens: tokensPer, mode: \"head\" });\n return { ...m, body: t.text };\n });\n\n const totalTokens =\n projectSlice.estimatedTokens + modulesSlice.estimatedTokens + memoriesSlice.estimatedTokens;\n\n return {\n ...(input.task ? { task: input.task } : {}),\n search_mode: searchMode,\n inferred_modules: inferred,\n project_context: projectContext\n ? { content: projectSlice.text, truncated: projectSlice.truncated }\n : null,\n module_contexts: trimmedModules,\n memories: trimmedMemories,\n estimated_tokens: totalTokens,\n budget: {\n max_tokens: input.max_tokens,\n spent: {\n project: projectSlice.estimatedTokens,\n modules: modulesSlice.estimatedTokens,\n memories: memoriesSlice.estimatedTokens,\n },\n },\n };\n}\n\nasync function trySemanticHits(\n ctx: HaiveContext,\n task: string,\n limit: number,\n): Promise<Array<{ id: string; score: number }> | null> {\n let mod: typeof import(\"@hiveai/embeddings\");\n try {\n mod = await import(\"@hiveai/embeddings\");\n } catch {\n return null;\n }\n const result = await mod.semanticSearch(ctx.paths, task, { limit });\n if (!result) return null;\n return result.hits.map((h) => ({ id: h.id, score: h.score }));\n}\n\nasync function loadModuleContexts(\n ctx: HaiveContext,\n modules: string[],\n): Promise<Array<{ name: string; content: string }>> {\n if (modules.length === 0) return [];\n if (!existsSync(ctx.paths.modulesContextDir)) return [];\n const available = new Set(\n (await readdir(ctx.paths.modulesContextDir, { withFileTypes: true }))\n .filter((d) => d.isDirectory())\n .map((d) => d.name),\n );\n const out: Array<{ name: string; content: string }> = [];\n for (const m of modules) {\n if (!available.has(m)) continue;\n const file = path.join(ctx.paths.modulesContextDir, m, \"context.md\");\n if (existsSync(file)) {\n out.push({ name: m, content: await readFile(file, \"utf8\") });\n }\n }\n return out;\n}\n\n// Re-export estimateTokens at the module level for tests.\nexport { estimateTokens };\n","import { loadCodeMap, queryCodeMap } from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const CodeMapInputSchema = {\n file: z\n .string()\n .optional()\n .describe(\"Filter to files whose path contains this substring\"),\n symbol: z\n .string()\n .optional()\n .describe(\"Filter to files exporting a symbol whose name contains this substring\"),\n max_files: z\n .number()\n .int()\n .positive()\n .default(40)\n .describe(\"Cap on returned files\"),\n};\n\nexport type CodeMapInput = {\n [K in keyof typeof CodeMapInputSchema]: z.infer<(typeof CodeMapInputSchema)[K]>;\n};\n\nexport interface CodeMapToolOutput {\n available: boolean;\n generated_at?: string;\n total_files?: number;\n files: Array<{\n path: string;\n summary?: string;\n loc: number;\n exports: Array<{ name: string; kind: string; description?: string; line: number }>;\n }>;\n notice?: string;\n}\n\nexport async function codeMapTool(\n input: CodeMapInput,\n ctx: HaiveContext,\n): Promise<CodeMapToolOutput> {\n const map = await loadCodeMap(ctx.paths);\n if (!map) {\n return {\n available: false,\n files: [],\n notice: \"No code map found. Run `haive index code` to generate `.ai/code-map.json`.\",\n };\n }\n const { files } = queryCodeMap(map, { file: input.file, symbol: input.symbol });\n return {\n available: true,\n generated_at: map.generated_at,\n total_files: Object.keys(map.files).length,\n files: files.slice(0, input.max_files).map((f) => ({\n path: f.path,\n ...(f.entry.summary ? { summary: f.entry.summary } : {}),\n loc: f.entry.loc,\n exports: f.entry.exports,\n })),\n };\n}\n","import { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const BootstrapProjectArgsSchema = {\n module: z\n .string()\n .optional()\n .describe(\n \"Optional module name to scope the analysis to (writes to .ai/modules/<module>/context.md)\",\n ),\n focus: z\n .string()\n .optional()\n .describe(\"Optional area to emphasize (e.g. 'data layer', 'API surface')\"),\n};\n\nexport type BootstrapProjectArgs = {\n [K in keyof typeof BootstrapProjectArgsSchema]: z.infer<\n (typeof BootstrapProjectArgsSchema)[K]\n >;\n};\n\nconst ROOT_TEMPLATE = `# Project context\n\n## Architecture\n<one or two paragraphs on the high-level architecture>\n\n## Key modules\n- <module-name>: <one line on its purpose>\n- ...\n\n## Conventions\n- <convention>: <why it matters here>\n- ...\n\n## Glossary\n- <term>: <definition in this codebase>\n- ...\n\n## Gotchas\n- <surprising behavior, hidden coupling, or known traps>\n- ...\n`;\n\nconst MODULE_TEMPLATE = `# Module context — {module}\n\n## Purpose\n<what this module is for>\n\n## Public surface\n- <exported symbol>: <one line>\n- ...\n\n## Internals\n<key files / classes / functions and how they connect>\n\n## Conventions specific to this module\n- ...\n\n## Gotchas\n- ...\n`;\n\nexport function bootstrapProjectPrompt(\n args: BootstrapProjectArgs,\n ctx: HaiveContext,\n): { description: string; messages: Array<{ role: \"user\"; content: { type: \"text\"; text: string } }> } {\n const target = args.module\n ? `\\`.ai/modules/${args.module}/context.md\\``\n : \"`.ai/project-context.md`\";\n const template = args.module\n ? MODULE_TEMPLATE.replace(\"{module}\", args.module)\n : ROOT_TEMPLATE;\n const focusLine = args.focus\n ? `\\nEmphasis area for this analysis: **${args.focus}**.\\n`\n : \"\";\n\n const text = `You are bootstrapping a hAIve shared project context for the team.\n\nProject root: \\`${ctx.paths.root}\\`\nTarget file: ${target}\n${focusLine}\n## What to do\n\n1. Explore the codebase: read the package manifests, top-level directories, build configs, and a representative sample of source files. Do not read every file — pick what gives you the highest signal per file (entry points, config, README if present, main domain models).\n2. Synthesize a concise, high-signal context document. Prefer load-bearing facts over exhaustive enumeration. A new teammate (human or AI) should be able to read it in 5 minutes and feel oriented.\n3. Match the structure of the template below. Keep each section short — link to files instead of repeating large code chunks.\n4. When you are done, call the \\`bootstrap_project_save\\` tool with the full Markdown content. Use \\`overwrite=true\\` only if the file already exists and you intend to replace it.\n\n## Template to fill\n\n\\`\\`\\`markdown\n${template}\\`\\`\\`\n\n## Tips\n\n- Anchor claims to file paths so future readers can verify them.\n- Write what is true *now*, not aspirational. Note open questions explicitly.\n- Skip sections that have nothing meaningful to say rather than padding them.\n`;\n\n return {\n description: args.module\n ? `Bootstrap context for module \"${args.module}\"`\n : \"Bootstrap the root project context\",\n messages: [\n {\n role: \"user\",\n content: { type: \"text\", text },\n },\n ],\n };\n}\n"],"mappings":"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","names":["existsSync","path","z","existsSync","z","mkdir","writeFile","existsSync","path","z","existsSync","loadMemoriesFromDir","z","writeFile","existsSync","loadMemoriesFromDir","serializeMemory","z","writeFile","existsSync","loadMemoriesFromDir","loadUsageIndex","serializeMemory","z","readFile","readdir","existsSync","path","deriveConfidence","getUsage","loadMemoriesFromDir","loadUsageIndex","trackReads","z","existsSync","deriveConfidence","getUsage","loadMemoriesFromDir","loadUsageIndex","z","existsSync","loadMemoriesFromDir","loadUsageIndex","saveUsageIndex","z","writeFile","existsSync","loadMemoriesFromDir","serializeMemory","z","existsSync","getUsage","loadMemoriesFromDir","loadUsageIndex","z","writeFile","existsSync","loadMemoriesFromDir","serializeMemory","z","readFile","readdir","existsSync","path","deriveConfidence","getUsage","inferModulesFromPaths","literalMatchesAllTokens","loadMemoriesFromDir","loadUsageIndex","memoryMatchesAnchorPaths","tokenizeQuery","trackReads","z","loadModuleContexts","z","z"]}
package/dist/server.js CHANGED
@@ -81,6 +81,8 @@ var MemListInputSchema = {
81
81
  type: z3.enum(["convention", "decision", "gotcha", "architecture", "glossary"]).optional(),
82
82
  module: z3.string().optional(),
83
83
  tag: z3.string().optional(),
84
+ status: z3.enum(["draft", "proposed", "validated", "deprecated", "stale", "rejected"]).optional().describe("Filter by a single status. Omit to return all statuses."),
85
+ exclude_rejected: z3.boolean().default(false).describe("When true, exclude memories with status=rejected from results."),
84
86
  include_body: z3.boolean().default(false).describe("Include full body text. Default false to save tokens \u2014 use mem_get for a single memory's full content.")
85
87
  };
86
88
  async function memList(input, ctx) {
@@ -94,6 +96,8 @@ async function memList(input, ctx) {
94
96
  if (input.type && fm.type !== input.type) return false;
95
97
  if (input.module && fm.module !== input.module) return false;
96
98
  if (input.tag && !fm.tags.includes(input.tag)) return false;
99
+ if (input.status && fm.status !== input.status) return false;
100
+ if (input.exclude_rejected && fm.status === "rejected") return false;
97
101
  return true;
98
102
  });
99
103
  const memories = filtered.map(({ memory, filePath }) => {
@@ -192,6 +196,8 @@ var MemSearchInputSchema = {
192
196
  scope: z5.enum(["personal", "team", "module"]).optional().describe("Restrict results to a single scope"),
193
197
  type: z5.enum(["convention", "decision", "gotcha", "architecture", "glossary"]).optional().describe("Restrict results to a memory type"),
194
198
  module: z5.string().optional().describe("Restrict results to a module"),
199
+ status: z5.enum(["draft", "proposed", "validated", "deprecated", "stale", "rejected"]).optional().describe("Filter by a single status. Omit to return all statuses."),
200
+ exclude_rejected: z5.boolean().default(false).describe("When true, exclude memories with status=rejected from results."),
195
201
  limit: z5.number().int().positive().max(100).default(20).describe("Max results"),
196
202
  semantic: z5.boolean().default(false).describe(
197
203
  "Use semantic similarity from the embeddings index (requires `haive embeddings index`)."
@@ -233,6 +239,8 @@ function passesFilters(fm, input) {
233
239
  if (input.scope && fm.scope !== input.scope) return false;
234
240
  if (input.type && fm.type !== input.type) return false;
235
241
  if (input.module && fm.module !== input.module) return false;
242
+ if (input.status && fm.status !== input.status) return false;
243
+ if (input.exclude_rejected && fm.status === "rejected") return false;
236
244
  return true;
237
245
  }
238
246
  function buildLiteralResult(input, filtered, usage) {
@@ -423,7 +431,11 @@ async function memReject(input, ctx) {
423
431
  await writeFile4(
424
432
  loaded.filePath,
425
433
  serializeMemory3({
426
- frontmatter: { ...loaded.memory.frontmatter, status: "rejected" },
434
+ frontmatter: {
435
+ ...loaded.memory.frontmatter,
436
+ status: "rejected",
437
+ stale_reason: input.reason ?? loaded.memory.frontmatter.stale_reason ?? null
438
+ },
427
439
  body: loaded.memory.body
428
440
  }),
429
441
  "utf8"
@@ -1074,7 +1086,7 @@ ${template}\`\`\`
1074
1086
 
1075
1087
  // src/server.ts
1076
1088
  var SERVER_NAME = "haive";
1077
- var SERVER_VERSION = "0.2.2";
1089
+ var SERVER_VERSION = "0.2.4";
1078
1090
  function jsonResult(data) {
1079
1091
  return {
1080
1092
  content: [
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/server.ts","../src/context.ts","../src/tools/bootstrap-project-save.ts","../src/tools/get-project-context.ts","../src/tools/mem-list.ts","../src/tools/mem-save.ts","../src/tools/mem-search.ts","../src/tools/mem-verify.ts","../src/tools/mem-reject.ts","../src/tools/mem-for-files.ts","../src/tools/mem-get.ts","../src/tools/mem-delete.ts","../src/tools/mem-update.ts","../src/tools/mem-pending.ts","../src/tools/mem-approve.ts","../src/tools/get-briefing.ts","../src/tools/code-map.ts","../src/prompts/bootstrap-project.ts"],"sourcesContent":["import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { createContext, type CreateContextOptions, type HaiveContext } from \"./context.js\";\nimport {\n BootstrapProjectSaveInputSchema,\n bootstrapProjectSave,\n type BootstrapProjectSaveInput,\n} from \"./tools/bootstrap-project-save.js\";\nimport {\n GetProjectContextInputSchema,\n getProjectContext,\n type GetProjectContextInput,\n} from \"./tools/get-project-context.js\";\nimport { MemListInputSchema, memList, type MemListInput } from \"./tools/mem-list.js\";\nimport { MemSaveInputSchema, memSave, type MemSaveInput } from \"./tools/mem-save.js\";\nimport {\n MemSearchInputSchema,\n memSearch,\n type MemSearchInput,\n} from \"./tools/mem-search.js\";\nimport {\n MemVerifyInputSchema,\n memVerify,\n type MemVerifyInput,\n} from \"./tools/mem-verify.js\";\nimport {\n MemRejectInputSchema,\n memReject,\n type MemRejectInput,\n} from \"./tools/mem-reject.js\";\nimport {\n MemForFilesInputSchema,\n memForFiles,\n type MemForFilesInput,\n} from \"./tools/mem-for-files.js\";\nimport { MemGetInputSchema, memGet, type MemGetInput } from \"./tools/mem-get.js\";\nimport {\n MemDeleteInputSchema,\n memDelete,\n type MemDeleteInput,\n} from \"./tools/mem-delete.js\";\nimport {\n MemUpdateInputSchema,\n memUpdate,\n type MemUpdateInput,\n} from \"./tools/mem-update.js\";\nimport {\n MemPendingInputSchema,\n memPending,\n type MemPendingInput,\n} from \"./tools/mem-pending.js\";\nimport {\n MemApproveInputSchema,\n memApprove,\n type MemApproveInput,\n} from \"./tools/mem-approve.js\";\nimport {\n GetBriefingInputSchema,\n getBriefing,\n type GetBriefingInput,\n} from \"./tools/get-briefing.js\";\nimport {\n CodeMapInputSchema,\n codeMapTool,\n type CodeMapInput,\n} from \"./tools/code-map.js\";\nimport {\n BootstrapProjectArgsSchema,\n bootstrapProjectPrompt,\n type BootstrapProjectArgs,\n} from \"./prompts/bootstrap-project.js\";\n\ndeclare const __HAIVE_VERSION__: string;\n\nexport const SERVER_NAME = \"haive\";\nexport const SERVER_VERSION = __HAIVE_VERSION__;\n\nfunction jsonResult(data: unknown) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: JSON.stringify(data, null, 2),\n },\n ],\n };\n}\n\nexport function createHaiveServer(\n options: CreateContextOptions = {},\n): { server: McpServer; context: HaiveContext } {\n const context = createContext(options);\n const server = new McpServer(\n { name: SERVER_NAME, version: SERVER_VERSION },\n { capabilities: { tools: {}, prompts: {} } },\n );\n\n server.tool(\n \"mem_save\",\n \"Save a new memory (default scope=personal). Use scope=team for shared memories.\",\n MemSaveInputSchema,\n async (input: MemSaveInput) => jsonResult(await memSave(input, context)),\n );\n\n server.tool(\n \"mem_search\",\n \"Search memories by substring across id, tags, and body. Optional filters by scope/type/module.\",\n MemSearchInputSchema,\n async (input: MemSearchInput) => jsonResult(await memSearch(input, context)),\n );\n\n server.tool(\n \"mem_list\",\n \"List memories with optional filters by scope/type/module/tag.\",\n MemListInputSchema,\n async (input: MemListInput) => jsonResult(await memList(input, context)),\n );\n\n server.tool(\n \"get_project_context\",\n \"Read the shared .ai/project-context.md (and optionally a module context).\",\n GetProjectContextInputSchema,\n async (input: GetProjectContextInput) =>\n jsonResult(await getProjectContext(input, context)),\n );\n\n server.tool(\n \"get_briefing\",\n \"One-shot onboarding: returns project context + module contexts + ranked relevant memories under a token budget. Replaces 4–5 separate calls when an agent starts a task.\",\n GetBriefingInputSchema,\n async (input: GetBriefingInput) => jsonResult(await getBriefing(input, context)),\n );\n\n server.tool(\n \"code_map\",\n \"Browse the project's pre-computed code map (file → exports + 1-line description) instead of grepping. Requires `haive index code`.\",\n CodeMapInputSchema,\n async (input: CodeMapInput) => jsonResult(await codeMapTool(input, context)),\n );\n\n server.tool(\n \"bootstrap_project_save\",\n \"Persist a project (or module) context document analyzed by the AI client.\",\n BootstrapProjectSaveInputSchema,\n async (input: BootstrapProjectSaveInput) =>\n jsonResult(await bootstrapProjectSave(input, context)),\n );\n\n server.tool(\n \"mem_verify\",\n \"Check anchor freshness for one or every memory; optionally write status updates back to disk.\",\n MemVerifyInputSchema,\n async (input: MemVerifyInput) => jsonResult(await memVerify(input, context)),\n );\n\n server.tool(\n \"mem_reject\",\n \"Record a rejection for a memory (blocks auto-promotion and lowers its trust signal).\",\n MemRejectInputSchema,\n async (input: MemRejectInput) => jsonResult(await memReject(input, context)),\n );\n\n server.tool(\n \"mem_for_files\",\n \"Given the file paths the agent is currently working on, return relevant memories grouped by reason (anchor overlap, module, domain) plus any matching .ai/modules/<name>/context.md contents.\",\n MemForFilesInputSchema,\n async (input: MemForFilesInput) => jsonResult(await memForFiles(input, context)),\n );\n\n server.tool(\n \"mem_get\",\n \"Fetch a single memory by id, including its body, anchor, usage, and confidence.\",\n MemGetInputSchema,\n async (input: MemGetInput) => jsonResult(await memGet(input, context)),\n );\n\n server.tool(\n \"mem_delete\",\n \"Delete a memory by id (and its usage entry by default).\",\n MemDeleteInputSchema,\n async (input: MemDeleteInput) => jsonResult(await memDelete(input, context)),\n );\n\n server.tool(\n \"mem_update\",\n \"Update the body, tags, or anchor of an existing memory without changing its id or losing usage history.\",\n MemUpdateInputSchema,\n async (input: MemUpdateInput) => jsonResult(await memUpdate(input, context)),\n );\n\n server.tool(\n \"mem_pending\",\n \"List 'proposed' memories awaiting review, sorted by reads (most-read first).\",\n MemPendingInputSchema,\n async (input: MemPendingInput) => jsonResult(await memPending(input, context)),\n );\n\n server.tool(\n \"mem_approve\",\n \"Mark a memory as validated immediately (explicit team review).\",\n MemApproveInputSchema,\n async (input: MemApproveInput) => jsonResult(await memApprove(input, context)),\n );\n\n server.prompt(\n \"bootstrap_project\",\n \"Instructions for the AI client to analyze the project and save the context.\",\n BootstrapProjectArgsSchema,\n (args: BootstrapProjectArgs) => bootstrapProjectPrompt(args, context),\n );\n\n return { server, context };\n}\n","import { findProjectRoot, resolveHaivePaths, type HaivePaths } from \"@hiveai/core\";\n\nexport interface HaiveContext {\n paths: HaivePaths;\n}\n\nexport interface CreateContextOptions {\n root?: string;\n env?: NodeJS.ProcessEnv;\n cwd?: string;\n}\n\nexport function createContext(options: CreateContextOptions = {}): HaiveContext {\n const env = options.env ?? process.env;\n const cwd = options.cwd ?? process.cwd();\n const root =\n options.root ??\n env.HAIVE_PROJECT_ROOT ??\n findProjectRoot(cwd);\n return { paths: resolveHaivePaths(root) };\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const BootstrapProjectSaveInputSchema = {\n content: z\n .string()\n .min(1)\n .describe(\"Full Markdown content for the project (or module) context file\"),\n module: z\n .string()\n .optional()\n .describe(\n \"If provided, save under .ai/modules/<module>/context.md instead of .ai/project-context.md\",\n ),\n overwrite: z\n .boolean()\n .default(false)\n .describe(\"Overwrite an existing file instead of failing\"),\n};\n\nexport type BootstrapProjectSaveInput = {\n [K in keyof typeof BootstrapProjectSaveInputSchema]: z.infer<\n (typeof BootstrapProjectSaveInputSchema)[K]\n >;\n};\n\nexport interface BootstrapProjectSaveOutput {\n file_path: string;\n action: \"created\" | \"overwritten\";\n}\n\nexport async function bootstrapProjectSave(\n input: BootstrapProjectSaveInput,\n ctx: HaiveContext,\n): Promise<BootstrapProjectSaveOutput> {\n const target = input.module\n ? path.join(ctx.paths.modulesContextDir, input.module, \"context.md\")\n : ctx.paths.projectContext;\n\n const exists = existsSync(target);\n if (exists && !input.overwrite) {\n throw new Error(\n `${target} already exists. Pass overwrite=true to replace it.`,\n );\n }\n\n await mkdir(path.dirname(target), { recursive: true });\n await writeFile(target, input.content, \"utf8\");\n\n return {\n file_path: target,\n action: exists ? \"overwritten\" : \"created\",\n };\n}\n","import { readFile, readdir } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const GetProjectContextInputSchema = {\n module: z\n .string()\n .optional()\n .describe(\"If provided, also include the matching module's context file\"),\n list_modules: z\n .boolean()\n .default(false)\n .describe(\"Return the list of available module context files\"),\n};\n\nexport type GetProjectContextInput = {\n [K in keyof typeof GetProjectContextInputSchema]: z.infer<\n (typeof GetProjectContextInputSchema)[K]\n >;\n};\n\nexport interface GetProjectContextOutput {\n root_context: string | null;\n module_context?: { name: string; content: string };\n available_modules?: string[];\n}\n\nexport async function getProjectContext(\n input: GetProjectContextInput,\n ctx: HaiveContext,\n): Promise<GetProjectContextOutput> {\n const out: GetProjectContextOutput = { root_context: null };\n\n if (existsSync(ctx.paths.projectContext)) {\n out.root_context = await readFile(ctx.paths.projectContext, \"utf8\");\n }\n\n if (input.module) {\n const modFile = path.join(ctx.paths.modulesContextDir, input.module, \"context.md\");\n if (existsSync(modFile)) {\n out.module_context = {\n name: input.module,\n content: await readFile(modFile, \"utf8\"),\n };\n }\n }\n\n if (input.list_modules) {\n out.available_modules = await listModules(ctx.paths.modulesContextDir);\n }\n\n return out;\n}\n\nasync function listModules(modulesDir: string): Promise<string[]> {\n if (!existsSync(modulesDir)) return [];\n const entries = await readdir(modulesDir, { withFileTypes: true });\n return entries.filter((e) => e.isDirectory()).map((e) => e.name).sort();\n}\n","import { existsSync } from \"node:fs\";\nimport { loadMemoriesFromDir } from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemListInputSchema = {\n scope: z.enum([\"personal\", \"team\", \"module\"]).optional(),\n type: z\n .enum([\"convention\", \"decision\", \"gotcha\", \"architecture\", \"glossary\"])\n .optional(),\n module: z.string().optional(),\n tag: z.string().optional(),\n include_body: z\n .boolean()\n .default(false)\n .describe(\"Include full body text. Default false to save tokens — use mem_get for a single memory's full content.\"),\n};\n\nexport type MemListInput = {\n [K in keyof typeof MemListInputSchema]: z.infer<(typeof MemListInputSchema)[K]>;\n};\n\nexport interface MemSummary {\n id: string;\n scope: string;\n type: string;\n module?: string;\n status: string;\n tags: string[];\n snippet: string;\n file_path: string;\n body?: string;\n}\n\nexport async function memList(\n input: MemListInput,\n ctx: HaiveContext,\n): Promise<{ memories: MemSummary[] }> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n return { memories: [] };\n }\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const filtered = all.filter(({ memory }) => {\n const fm = memory.frontmatter;\n if (input.scope && fm.scope !== input.scope) return false;\n if (input.type && fm.type !== input.type) return false;\n if (input.module && fm.module !== input.module) return false;\n if (input.tag && !fm.tags.includes(input.tag)) return false;\n return true;\n });\n const memories: MemSummary[] = filtered.map(({ memory, filePath }) => {\n const fm = memory.frontmatter;\n const snippet = memory.body.replace(/\\s+/g, \" \").trim().slice(0, 120);\n return {\n id: fm.id,\n scope: fm.scope,\n type: fm.type,\n ...(fm.module ? { module: fm.module } : {}),\n status: fm.status,\n tags: fm.tags,\n snippet,\n file_path: filePath,\n ...(input.include_body ? { body: memory.body } : {}),\n };\n });\n return { memories };\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport {\n buildFrontmatter,\n memoryFilePath,\n serializeMemory,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemSaveInputSchema = {\n type: z\n .enum([\"convention\", \"decision\", \"gotcha\", \"architecture\", \"glossary\"])\n .describe(\"Kind of memory being saved\"),\n slug: z\n .string()\n .min(1)\n .describe(\"Short human-readable identifier — becomes part of the filename\"),\n body: z\n .string()\n .describe(\"Markdown body of the memory\"),\n scope: z\n .enum([\"personal\", \"team\", \"module\"])\n .default(\"personal\")\n .describe(\"Visibility scope: personal | team | module\"),\n module: z\n .string()\n .optional()\n .describe(\"Module name (required when scope=module)\"),\n tags: z.array(z.string()).default([]).describe(\"Tags for filtering\"),\n domain: z.string().optional().describe(\"Domain (e.g. transactions, billing)\"),\n author: z.string().optional().describe(\"Author handle or email\"),\n paths: z\n .array(z.string())\n .default([])\n .describe(\"Anchor paths (file paths this memory references)\"),\n symbols: z\n .array(z.string())\n .default([])\n .describe(\"Anchor symbols (function/class names this memory references)\"),\n commit: z\n .string()\n .optional()\n .describe(\"Anchor commit SHA (for staleness detection later)\"),\n};\n\nexport type MemSaveInput = {\n [K in keyof typeof MemSaveInputSchema]: z.infer<(typeof MemSaveInputSchema)[K]>;\n};\n\nexport interface MemSaveOutput {\n id: string;\n scope: string;\n file_path: string;\n}\n\nexport async function memSave(\n input: MemSaveInput,\n ctx: HaiveContext,\n): Promise<MemSaveOutput> {\n if (!existsSync(ctx.paths.haiveDir)) {\n throw new Error(\n `No .ai/ directory at ${ctx.paths.root}. Run 'haive init' first.`,\n );\n }\n\n const frontmatter = buildFrontmatter({\n type: input.type,\n slug: input.slug,\n scope: input.scope,\n module: input.module,\n tags: input.tags,\n domain: input.domain,\n author: input.author,\n paths: input.paths,\n symbols: input.symbols,\n commit: input.commit,\n });\n\n const file = memoryFilePath(\n ctx.paths,\n frontmatter.scope,\n frontmatter.id,\n frontmatter.module,\n );\n await mkdir(path.dirname(file), { recursive: true });\n\n if (existsSync(file)) {\n throw new Error(`Memory already exists at ${file}`);\n }\n\n await writeFile(file, serializeMemory({ frontmatter, body: input.body }), \"utf8\");\n\n return {\n id: frontmatter.id,\n scope: frontmatter.scope,\n file_path: file,\n };\n}\n","import { existsSync } from \"node:fs\";\nimport {\n deriveConfidence,\n extractSnippet,\n getUsage,\n literalMatchesAllTokens,\n loadMemoriesFromDir,\n loadUsageIndex,\n pickSnippetNeedle,\n tokenizeQuery,\n trackReads,\n type ConfidenceLevel,\n type LoadedMemory,\n type UsageIndex,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemSearchInputSchema = {\n query: z.string().describe(\"Substring matched against id, tags, and body\"),\n scope: z\n .enum([\"personal\", \"team\", \"module\"])\n .optional()\n .describe(\"Restrict results to a single scope\"),\n type: z\n .enum([\"convention\", \"decision\", \"gotcha\", \"architecture\", \"glossary\"])\n .optional()\n .describe(\"Restrict results to a memory type\"),\n module: z.string().optional().describe(\"Restrict results to a module\"),\n limit: z.number().int().positive().max(100).default(20).describe(\"Max results\"),\n semantic: z\n .boolean()\n .default(false)\n .describe(\n \"Use semantic similarity from the embeddings index (requires `haive embeddings index`).\",\n ),\n min_score: z\n .number()\n .min(0)\n .max(1)\n .default(0)\n .describe(\"Minimum cosine similarity (semantic mode only)\"),\n track: z\n .boolean()\n .default(true)\n .describe(\"Increment read_count on returned memories (used for passive validation)\"),\n};\n\nexport type MemSearchInput = {\n [K in keyof typeof MemSearchInputSchema]: z.infer<(typeof MemSearchInputSchema)[K]>;\n};\n\nexport interface MemSearchHit {\n id: string;\n scope: string;\n type: string;\n module?: string;\n tags: string[];\n status: string;\n confidence: ConfidenceLevel;\n read_count: number;\n snippet: string;\n file_path: string;\n score?: number;\n}\n\nexport interface MemSearchOutput {\n matches: MemSearchHit[];\n total: number;\n mode: \"literal\" | \"semantic\" | \"literal_fallback\";\n notice?: string;\n}\n\nexport async function memSearch(\n input: MemSearchInput,\n ctx: HaiveContext,\n): Promise<MemSearchOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n return { matches: [], total: 0, mode: input.semantic ? \"literal_fallback\" : \"literal\" };\n }\n\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const filtered = all.filter(({ memory }) => passesFilters(memory.frontmatter, input));\n const usage = await loadUsageIndex(ctx.paths);\n\n let result: MemSearchOutput;\n if (input.semantic) {\n const semantic = await trySemanticSearch(ctx, input, filtered, usage);\n if (semantic) {\n result = semantic;\n } else {\n result = {\n ...buildLiteralResult(input, filtered, usage),\n mode: \"literal_fallback\",\n notice:\n \"Semantic search unavailable (embeddings index missing or @hiveai/embeddings not installed). Falling back to literal search.\",\n };\n }\n } else {\n result = buildLiteralResult(input, filtered, usage);\n }\n\n if (input.track && result.matches.length > 0) {\n await trackReads(\n ctx.paths,\n result.matches.map((m) => m.id),\n );\n }\n\n return result;\n}\n\nfunction passesFilters(\n fm: LoadedMemory[\"memory\"][\"frontmatter\"],\n input: MemSearchInput,\n): boolean {\n if (input.scope && fm.scope !== input.scope) return false;\n if (input.type && fm.type !== input.type) return false;\n if (input.module && fm.module !== input.module) return false;\n return true;\n}\n\nfunction buildLiteralResult(\n input: MemSearchInput,\n filtered: LoadedMemory[],\n usage: UsageIndex,\n): { matches: MemSearchHit[]; total: number; mode: \"literal\" } {\n const tokens = tokenizeQuery(input.query);\n const matched = filtered.filter(({ memory }) => literalMatchesAllTokens(memory, tokens));\n const snippetNeedle = pickSnippetNeedle(input.query);\n const top = matched.slice(0, input.limit);\n return {\n matches: top.map((loaded) => toHit(loaded, snippetNeedle, usage)),\n total: matched.length,\n mode: \"literal\",\n };\n}\n\nasync function trySemanticSearch(\n ctx: HaiveContext,\n input: MemSearchInput,\n filtered: LoadedMemory[],\n usage: UsageIndex,\n): Promise<MemSearchOutput | null> {\n let mod: typeof import(\"@hiveai/embeddings\");\n try {\n mod = await import(\"@hiveai/embeddings\");\n } catch {\n return null;\n }\n const result = await mod.semanticSearch(ctx.paths, input.query, {\n limit: Math.min(input.limit * 3, 100),\n minScore: input.min_score,\n });\n if (!result) return null;\n\n const allowedIds = new Set(filtered.map((m) => m.memory.frontmatter.id));\n const byId = new Map(filtered.map((m) => [m.memory.frontmatter.id, m]));\n\n const ranked = result.hits\n .filter((h) => allowedIds.has(h.id))\n .slice(0, input.limit);\n\n const matches: MemSearchHit[] = ranked.map((hit) => {\n const loaded = byId.get(hit.id);\n if (!loaded) {\n return {\n id: hit.id,\n scope: \"unknown\",\n type: \"unknown\",\n tags: [],\n status: \"unknown\",\n confidence: \"unverified\" as const,\n read_count: 0,\n snippet: \"\",\n file_path: hit.file_path,\n score: hit.score,\n };\n }\n const base = toHit(loaded, input.query.toLowerCase(), usage);\n return { ...base, score: hit.score };\n });\n\n return {\n matches,\n total: ranked.length,\n mode: \"semantic\",\n };\n}\n\nfunction toHit(loaded: LoadedMemory, needle: string, usage: UsageIndex): MemSearchHit {\n const fm = loaded.memory.frontmatter;\n const u = getUsage(usage, fm.id);\n return {\n id: fm.id,\n scope: fm.scope,\n type: fm.type,\n ...(fm.module ? { module: fm.module } : {}),\n tags: fm.tags,\n status: fm.status,\n confidence: deriveConfidence(fm, u),\n read_count: u.read_count,\n snippet: extractSnippet(loaded.memory.body, needle),\n file_path: loaded.filePath,\n };\n}\n","import { writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport {\n loadMemoriesFromDir,\n serializeMemory,\n verifyAnchor,\n type Memory,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemVerifyInputSchema = {\n id: z.string().optional().describe(\"If set, verify only this memory id\"),\n update: z\n .boolean()\n .default(false)\n .describe(\"Write the resulting status back to disk (status=stale or validated)\"),\n};\n\nexport type MemVerifyInput = {\n [K in keyof typeof MemVerifyInputSchema]: z.infer<(typeof MemVerifyInputSchema)[K]>;\n};\n\nexport interface MemVerifyHit {\n id: string;\n file_path: string;\n stale: boolean;\n reason: string | null;\n status_after: string;\n skipped?: boolean;\n}\n\nexport interface MemVerifyOutput {\n results: MemVerifyHit[];\n summary: {\n checked: number;\n fresh: number;\n stale: number;\n anchorless_skipped: number;\n updated: number;\n };\n}\n\nexport async function memVerify(\n input: MemVerifyInput,\n ctx: HaiveContext,\n): Promise<MemVerifyOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n return {\n results: [],\n summary: { checked: 0, fresh: 0, stale: 0, anchorless_skipped: 0, updated: 0 },\n };\n }\n\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const targets = input.id\n ? all.filter((m) => m.memory.frontmatter.id === input.id)\n : all;\n\n const results: MemVerifyHit[] = [];\n let fresh = 0;\n let stale = 0;\n let anchorless = 0;\n let updated = 0;\n\n for (const { memory, filePath } of targets) {\n const isAnchored =\n memory.frontmatter.anchor.paths.length > 0 ||\n memory.frontmatter.anchor.symbols.length > 0;\n if (!isAnchored) {\n anchorless++;\n results.push({\n id: memory.frontmatter.id,\n file_path: filePath,\n stale: false,\n reason: null,\n status_after: memory.frontmatter.status,\n skipped: true,\n });\n continue;\n }\n const result = await verifyAnchor(memory, { projectRoot: ctx.paths.root });\n if (result.stale) stale++;\n else fresh++;\n\n let statusAfter = memory.frontmatter.status;\n if (input.update) {\n const next = applyVerification(memory, result);\n await writeFile(filePath, serializeMemory(next), \"utf8\");\n statusAfter = next.frontmatter.status;\n updated++;\n }\n\n results.push({\n id: memory.frontmatter.id,\n file_path: filePath,\n stale: result.stale,\n reason: result.reason,\n status_after: statusAfter,\n });\n }\n\n return {\n results,\n summary: {\n checked: results.length + anchorless,\n fresh,\n stale,\n anchorless_skipped: anchorless,\n updated,\n },\n };\n}\n\nfunction applyVerification(\n mem: Memory,\n result: { stale: boolean; reason: string | null },\n): Memory {\n const verifiedAt = new Date().toISOString();\n if (result.stale) {\n return {\n frontmatter: {\n ...mem.frontmatter,\n status: \"stale\",\n verified_at: verifiedAt,\n stale_reason: result.reason,\n },\n body: mem.body,\n };\n }\n const nextStatus =\n mem.frontmatter.status === \"stale\" || mem.frontmatter.status === \"draft\"\n ? \"validated\"\n : mem.frontmatter.status;\n return {\n frontmatter: {\n ...mem.frontmatter,\n status: nextStatus,\n verified_at: verifiedAt,\n stale_reason: null,\n },\n body: mem.body,\n };\n}\n","import { writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport {\n loadMemoriesFromDir,\n loadUsageIndex,\n recordRejection,\n saveUsageIndex,\n serializeMemory,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemRejectInputSchema = {\n id: z.string().min(1).describe(\"Memory id being rejected\"),\n reason: z\n .string()\n .optional()\n .describe(\"Why this memory is being rejected (recorded for review)\"),\n};\n\nexport type MemRejectInput = {\n [K in keyof typeof MemRejectInputSchema]: z.infer<(typeof MemRejectInputSchema)[K]>;\n};\n\nexport interface MemRejectOutput {\n id: string;\n status: string;\n rejected_count: number;\n last_rejected_at: string | null;\n rejection_reason: string | null;\n}\n\nexport async function memReject(\n input: MemRejectInput,\n ctx: HaiveContext,\n): Promise<MemRejectOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n throw new Error(`No .ai/memories at ${ctx.paths.root}.`);\n }\n\n const memories = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const loaded = memories.find((m) => m.memory.frontmatter.id === input.id);\n if (!loaded) throw new Error(`No memory with id \"${input.id}\".`);\n\n // Write rejected status to disk\n await writeFile(\n loaded.filePath,\n serializeMemory({\n frontmatter: { ...loaded.memory.frontmatter, status: \"rejected\" },\n body: loaded.memory.body,\n }),\n \"utf8\",\n );\n\n const idx = await loadUsageIndex(ctx.paths);\n recordRejection(idx, input.id, input.reason ?? null);\n await saveUsageIndex(ctx.paths, idx);\n const u = idx.by_id[input.id];\n return {\n id: input.id,\n status: \"rejected\",\n rejected_count: u?.rejected_count ?? 0,\n last_rejected_at: u?.last_rejected_at ?? null,\n rejection_reason: u?.rejection_reason ?? null,\n };\n}\n","import { readFile, readdir } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport {\n deriveConfidence,\n getUsage,\n inferModulesFromPaths,\n loadMemoriesFromDir,\n loadUsageIndex,\n memoryMatchesAnchorPaths,\n trackReads,\n type ConfidenceLevel,\n type LoadedMemory,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemForFilesInputSchema = {\n files: z\n .array(z.string())\n .min(1)\n .describe(\"Project-relative file paths the agent is currently working on\"),\n include_module_contexts: z\n .boolean()\n .default(true)\n .describe(\"Inline the matching .ai/modules/<name>/context.md contents\"),\n track: z\n .boolean()\n .default(true)\n .describe(\"Increment read_count on returned memories\"),\n};\n\nexport type MemForFilesInput = {\n [K in keyof typeof MemForFilesInputSchema]: z.infer<(typeof MemForFilesInputSchema)[K]>;\n};\n\nexport interface MemMatch {\n id: string;\n scope: string;\n type: string;\n module?: string;\n tags: string[];\n status: string;\n confidence: ConfidenceLevel;\n read_count: number;\n reason: \"anchor_overlap\" | \"module\" | \"domain\";\n file_path: string;\n body: string;\n}\n\nexport interface MemForFilesOutput {\n inferred_modules: string[];\n by_anchor: MemMatch[];\n by_module: MemMatch[];\n by_domain: MemMatch[];\n module_contexts: Array<{ name: string; content: string }>;\n}\n\nexport async function memForFiles(\n input: MemForFilesInput,\n ctx: HaiveContext,\n): Promise<MemForFilesOutput> {\n const inferred = inferModulesFromPaths(input.files);\n\n if (!existsSync(ctx.paths.memoriesDir)) {\n return {\n inferred_modules: inferred,\n by_anchor: [],\n by_module: [],\n by_domain: [],\n module_contexts: await loadModuleContexts(ctx, inferred, input.include_module_contexts),\n };\n }\n\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const usage = await loadUsageIndex(ctx.paths);\n const seen = new Set<string>();\n\n const byAnchor: MemMatch[] = [];\n const byModule: MemMatch[] = [];\n const byDomain: MemMatch[] = [];\n\n for (const loaded of all) {\n if (memoryMatchesAnchorPaths(loaded.memory, input.files)) {\n byAnchor.push(toMatch(loaded, \"anchor_overlap\", usage));\n seen.add(loaded.memory.frontmatter.id);\n }\n }\n\n for (const loaded of all) {\n if (seen.has(loaded.memory.frontmatter.id)) continue;\n const fm = loaded.memory.frontmatter;\n const moduleHit =\n (fm.module && inferred.includes(fm.module)) ||\n fm.tags.some((t) => inferred.includes(t));\n if (moduleHit) {\n byModule.push(toMatch(loaded, \"module\", usage));\n seen.add(fm.id);\n }\n }\n\n for (const loaded of all) {\n if (seen.has(loaded.memory.frontmatter.id)) continue;\n const domain = loaded.memory.frontmatter.domain;\n if (domain && inferred.includes(domain)) {\n byDomain.push(toMatch(loaded, \"domain\", usage));\n seen.add(loaded.memory.frontmatter.id);\n }\n }\n\n if (input.track) {\n await trackReads(ctx.paths, [...seen]);\n }\n\n return {\n inferred_modules: inferred,\n by_anchor: byAnchor,\n by_module: byModule,\n by_domain: byDomain,\n module_contexts: await loadModuleContexts(ctx, inferred, input.include_module_contexts),\n };\n}\n\nfunction toMatch(\n loaded: LoadedMemory,\n reason: MemMatch[\"reason\"],\n usage: Parameters<typeof getUsage>[0],\n): MemMatch {\n const fm = loaded.memory.frontmatter;\n const u = getUsage(usage, fm.id);\n return {\n id: fm.id,\n scope: fm.scope,\n type: fm.type,\n ...(fm.module ? { module: fm.module } : {}),\n tags: fm.tags,\n status: fm.status,\n confidence: deriveConfidence(fm, u),\n read_count: u.read_count,\n reason,\n file_path: loaded.filePath,\n body: loaded.memory.body,\n };\n}\n\nasync function loadModuleContexts(\n ctx: HaiveContext,\n modules: string[],\n enabled: boolean,\n): Promise<Array<{ name: string; content: string }>> {\n if (!enabled || modules.length === 0) return [];\n if (!existsSync(ctx.paths.modulesContextDir)) return [];\n const available = new Set(\n (await readdir(ctx.paths.modulesContextDir, { withFileTypes: true }))\n .filter((d) => d.isDirectory())\n .map((d) => d.name),\n );\n const out: Array<{ name: string; content: string }> = [];\n for (const m of modules) {\n if (!available.has(m)) continue;\n const file = path.join(ctx.paths.modulesContextDir, m, \"context.md\");\n if (existsSync(file)) {\n out.push({ name: m, content: await readFile(file, \"utf8\") });\n }\n }\n return out;\n}\n","import { existsSync } from \"node:fs\";\nimport {\n deriveConfidence,\n getUsage,\n loadMemoriesFromDir,\n loadUsageIndex,\n type ConfidenceLevel,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemGetInputSchema = {\n id: z.string().min(1).describe(\"Memory id to fetch\"),\n};\n\nexport type MemGetInput = {\n [K in keyof typeof MemGetInputSchema]: z.infer<(typeof MemGetInputSchema)[K]>;\n};\n\nexport interface MemGetOutput {\n id: string;\n scope: string;\n type: string;\n module?: string;\n tags: string[];\n status: string;\n confidence: ConfidenceLevel;\n read_count: number;\n rejected_count: number;\n created_at: string;\n verified_at: string | null;\n stale_reason: string | null;\n anchor: { commit?: string; paths: string[]; symbols: string[] };\n body: string;\n file_path: string;\n}\n\nexport async function memGet(input: MemGetInput, ctx: HaiveContext): Promise<MemGetOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n throw new Error(`No .ai/memories at ${ctx.paths.root}.`);\n }\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const found = all.find((m) => m.memory.frontmatter.id === input.id);\n if (!found) throw new Error(`No memory with id \"${input.id}\".`);\n const fm = found.memory.frontmatter;\n const u = getUsage(await loadUsageIndex(ctx.paths), fm.id);\n return {\n id: fm.id,\n scope: fm.scope,\n type: fm.type,\n ...(fm.module ? { module: fm.module } : {}),\n tags: fm.tags,\n status: fm.status,\n confidence: deriveConfidence(fm, u),\n read_count: u.read_count,\n rejected_count: u.rejected_count,\n created_at: fm.created_at,\n verified_at: fm.verified_at,\n stale_reason: fm.stale_reason,\n anchor: {\n ...(fm.anchor.commit ? { commit: fm.anchor.commit } : {}),\n paths: fm.anchor.paths,\n symbols: fm.anchor.symbols,\n },\n body: found.memory.body,\n file_path: found.filePath,\n };\n}\n","import { existsSync } from \"node:fs\";\nimport { unlink } from \"node:fs/promises\";\nimport {\n loadMemoriesFromDir,\n loadUsageIndex,\n saveUsageIndex,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemDeleteInputSchema = {\n id: z.string().min(1).describe(\"Memory id to delete\"),\n keep_usage: z\n .boolean()\n .default(false)\n .describe(\"Keep the usage.json entry instead of removing it alongside the file\"),\n};\n\nexport type MemDeleteInput = {\n [K in keyof typeof MemDeleteInputSchema]: z.infer<(typeof MemDeleteInputSchema)[K]>;\n};\n\nexport interface MemDeleteOutput {\n id: string;\n deleted_file: string;\n usage_removed: boolean;\n}\n\nexport async function memDelete(\n input: MemDeleteInput,\n ctx: HaiveContext,\n): Promise<MemDeleteOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n throw new Error(`No .ai/memories at ${ctx.paths.root}.`);\n }\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const found = all.find((m) => m.memory.frontmatter.id === input.id);\n if (!found) throw new Error(`No memory with id \"${input.id}\".`);\n\n await unlink(found.filePath);\n\n let usageRemoved = false;\n if (!input.keep_usage) {\n const idx = await loadUsageIndex(ctx.paths);\n if (idx.by_id[input.id]) {\n delete idx.by_id[input.id];\n await saveUsageIndex(ctx.paths, idx);\n usageRemoved = true;\n }\n }\n\n return { id: input.id, deleted_file: found.filePath, usage_removed: usageRemoved };\n}\n","import { writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { loadMemoriesFromDir, serializeMemory } from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemUpdateInputSchema = {\n id: z.string().min(1).describe(\"Id of the memory to update\"),\n body: z.string().optional().describe(\"New Markdown body — replaces the existing body\"),\n tags: z\n .array(z.string())\n .optional()\n .describe(\"New tags array — fully replaces existing tags\"),\n paths: z\n .array(z.string())\n .optional()\n .describe(\"New anchor paths — fully replaces existing anchor.paths\"),\n symbols: z\n .array(z.string())\n .optional()\n .describe(\"New anchor symbols — fully replaces existing anchor.symbols\"),\n commit: z.string().optional().describe(\"New anchor commit SHA\"),\n domain: z.string().optional().describe(\"New domain label\"),\n author: z.string().optional().describe(\"New author handle or email\"),\n};\n\nexport type MemUpdateInput = {\n [K in keyof typeof MemUpdateInputSchema]: z.infer<(typeof MemUpdateInputSchema)[K]>;\n};\n\nexport interface MemUpdateOutput {\n id: string;\n file_path: string;\n updated_fields: string[];\n}\n\nexport async function memUpdate(\n input: MemUpdateInput,\n ctx: HaiveContext,\n): Promise<MemUpdateOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n throw new Error(`No .ai/memories at ${ctx.paths.root}.`);\n }\n\n const memories = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const loaded = memories.find((m) => m.memory.frontmatter.id === input.id);\n if (!loaded) throw new Error(`No memory with id \"${input.id}\".`);\n\n const { frontmatter, body } = loaded.memory;\n const updated_fields: string[] = [];\n\n const newAnchor = { ...frontmatter.anchor };\n if (input.paths !== undefined) { newAnchor.paths = input.paths; updated_fields.push(\"anchor.paths\"); }\n if (input.symbols !== undefined) { newAnchor.symbols = input.symbols; updated_fields.push(\"anchor.symbols\"); }\n if (input.commit !== undefined) { newAnchor.commit = input.commit; updated_fields.push(\"anchor.commit\"); }\n\n const newFrontmatter = {\n ...frontmatter,\n anchor: newAnchor,\n ...(input.tags !== undefined ? { tags: input.tags } : {}),\n ...(input.domain !== undefined ? { domain: input.domain } : {}),\n ...(input.author !== undefined ? { author: input.author } : {}),\n };\n\n if (input.tags !== undefined) updated_fields.push(\"tags\");\n if (input.domain !== undefined) updated_fields.push(\"domain\");\n if (input.author !== undefined) updated_fields.push(\"author\");\n\n const newBody = input.body !== undefined ? input.body : body;\n if (input.body !== undefined) updated_fields.push(\"body\");\n\n if (updated_fields.length === 0) {\n throw new Error(\"No fields to update — provide at least one of: body, tags, paths, symbols, commit, domain, author.\");\n }\n\n await writeFile(\n loaded.filePath,\n serializeMemory({ frontmatter: newFrontmatter, body: newBody }),\n \"utf8\",\n );\n\n return { id: input.id, file_path: loaded.filePath, updated_fields };\n}\n","import { existsSync } from \"node:fs\";\nimport {\n getUsage,\n loadMemoriesFromDir,\n loadUsageIndex,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemPendingInputSchema = {\n scope: z.enum([\"personal\", \"team\", \"module\"]).optional(),\n};\n\nexport type MemPendingInput = {\n [K in keyof typeof MemPendingInputSchema]: z.infer<(typeof MemPendingInputSchema)[K]>;\n};\n\nexport interface MemPendingHit {\n id: string;\n scope: string;\n type: string;\n module?: string;\n tags: string[];\n age_days: number;\n read_count: number;\n rejected_count: number;\n file_path: string;\n}\n\nexport interface MemPendingOutput {\n pending: MemPendingHit[];\n}\n\nexport async function memPending(\n input: MemPendingInput,\n ctx: HaiveContext,\n): Promise<MemPendingOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) return { pending: [] };\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const usage = await loadUsageIndex(ctx.paths);\n const now = Date.now();\n const proposed = all.filter(({ memory }) => {\n if (memory.frontmatter.status !== \"proposed\") return false;\n if (input.scope && memory.frontmatter.scope !== input.scope) return false;\n return true;\n });\n\n proposed.sort(\n (a, b) =>\n getUsage(usage, b.memory.frontmatter.id).read_count -\n getUsage(usage, a.memory.frontmatter.id).read_count,\n );\n\n return {\n pending: proposed.map(({ memory, filePath }) => {\n const fm = memory.frontmatter;\n const u = getUsage(usage, fm.id);\n return {\n id: fm.id,\n scope: fm.scope,\n type: fm.type,\n ...(fm.module ? { module: fm.module } : {}),\n tags: fm.tags,\n age_days: Math.floor((now - new Date(fm.created_at).getTime()) / 86_400_000),\n read_count: u.read_count,\n rejected_count: u.rejected_count,\n file_path: filePath,\n };\n }),\n };\n}\n","import { writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport {\n loadMemoriesFromDir,\n serializeMemory,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemApproveInputSchema = {\n id: z.string().min(1).describe(\"Memory id to approve (sets status=validated immediately)\"),\n};\n\nexport type MemApproveInput = {\n [K in keyof typeof MemApproveInputSchema]: z.infer<(typeof MemApproveInputSchema)[K]>;\n};\n\nexport interface MemApproveOutput {\n id: string;\n previous_status: string;\n status: \"validated\";\n file_path: string;\n}\n\nexport async function memApprove(\n input: MemApproveInput,\n ctx: HaiveContext,\n): Promise<MemApproveOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n throw new Error(`No .ai/memories at ${ctx.paths.root}.`);\n }\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const found = all.find((m) => m.memory.frontmatter.id === input.id);\n if (!found) throw new Error(`No memory with id \"${input.id}\".`);\n\n const previous = found.memory.frontmatter.status;\n const next = {\n frontmatter: { ...found.memory.frontmatter, status: \"validated\" as const },\n body: found.memory.body,\n };\n await writeFile(found.filePath, serializeMemory(next), \"utf8\");\n return {\n id: input.id,\n previous_status: previous,\n status: \"validated\",\n file_path: found.filePath,\n };\n}\n","import { readFile, readdir } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport {\n allocateBudget,\n deriveConfidence,\n estimateTokens,\n getUsage,\n inferModulesFromPaths,\n literalMatchesAllTokens,\n loadMemoriesFromDir,\n loadUsageIndex,\n memoryMatchesAnchorPaths,\n tokenizeQuery,\n trackReads,\n truncateToTokens,\n type ConfidenceLevel,\n type LoadedMemory,\n type UsageIndex,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const GetBriefingInputSchema = {\n task: z\n .string()\n .optional()\n .describe(\n \"What you are about to do, in 1–2 sentences. Used to rank relevant memories semantically.\",\n ),\n files: z\n .array(z.string())\n .default([])\n .describe(\"Project-relative file paths the agent is currently looking at or about to edit\"),\n max_tokens: z\n .number()\n .int()\n .positive()\n .default(8000)\n .describe(\n \"Approximate token budget for the entire briefing. Each section is allocated a share and truncated to fit.\",\n ),\n max_memories: z\n .number()\n .int()\n .positive()\n .default(8)\n .describe(\"Cap on memories surfaced regardless of token budget\"),\n include_project_context: z.boolean().default(true),\n include_module_contexts: z.boolean().default(true),\n semantic: z\n .boolean()\n .default(true)\n .describe(\n \"Use semantic ranking when a task is provided (requires `haive embeddings index`).\",\n ),\n track: z.boolean().default(true).describe(\"Increment read_count on returned memories\"),\n};\n\nexport type GetBriefingInput = {\n [K in keyof typeof GetBriefingInputSchema]: z.infer<(typeof GetBriefingInputSchema)[K]>;\n};\n\nexport interface BriefingMemory {\n id: string;\n scope: string;\n type: string;\n module?: string;\n tags: string[];\n status: string;\n confidence: ConfidenceLevel;\n read_count: number;\n reasons: Array<\"anchor\" | \"module\" | \"domain\" | \"semantic\">;\n semantic_score?: number;\n body: string;\n file_path: string;\n}\n\nexport interface BriefingOutput {\n task?: string;\n search_mode: \"semantic\" | \"literal_fallback\" | \"literal\";\n inferred_modules: string[];\n project_context: { content: string; truncated: boolean } | null;\n module_contexts: Array<{ name: string; content: string; truncated: boolean }>;\n memories: BriefingMemory[];\n estimated_tokens: number;\n budget: { max_tokens: number; spent: { project: number; modules: number; memories: number } };\n}\n\nexport async function getBriefing(\n input: GetBriefingInput,\n ctx: HaiveContext,\n): Promise<BriefingOutput> {\n const inferred = inferModulesFromPaths(input.files);\n const memories: BriefingMemory[] = [];\n let searchMode: BriefingOutput[\"search_mode\"] = \"literal\";\n\n if (existsSync(ctx.paths.memoriesDir)) {\n const allMemories = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const usage = await loadUsageIndex(ctx.paths);\n const semanticHits = input.task && input.semantic\n ? await trySemanticHits(ctx, input.task, allMemories.length * 2)\n : null;\n\n if (input.task && input.semantic) {\n searchMode = semanticHits ? \"semantic\" : \"literal_fallback\";\n }\n\n const seen = new Map<string, BriefingMemory>();\n\n const addOrUpdate = (\n loaded: LoadedMemory,\n reason: BriefingMemory[\"reasons\"][number],\n score?: number,\n ): void => {\n const fm = loaded.memory.frontmatter;\n const existing = seen.get(fm.id);\n if (existing) {\n if (!existing.reasons.includes(reason)) existing.reasons.push(reason);\n if (score !== undefined && (existing.semantic_score ?? 0) < score) {\n existing.semantic_score = score;\n }\n return;\n }\n const u = getUsage(usage, fm.id);\n seen.set(fm.id, {\n id: fm.id,\n scope: fm.scope,\n type: fm.type,\n ...(fm.module ? { module: fm.module } : {}),\n tags: fm.tags,\n status: fm.status,\n confidence: deriveConfidence(fm, u),\n read_count: u.read_count,\n reasons: [reason],\n ...(score !== undefined ? { semantic_score: score } : {}),\n body: loaded.memory.body,\n file_path: loaded.filePath,\n });\n };\n\n if (input.files.length > 0) {\n for (const loaded of allMemories) {\n if (memoryMatchesAnchorPaths(loaded.memory, input.files)) addOrUpdate(loaded, \"anchor\");\n }\n for (const loaded of allMemories) {\n const fm = loaded.memory.frontmatter;\n if (fm.module && inferred.includes(fm.module)) addOrUpdate(loaded, \"module\");\n if (fm.domain && inferred.includes(fm.domain)) addOrUpdate(loaded, \"domain\");\n if (fm.tags.some((t) => inferred.includes(t))) addOrUpdate(loaded, \"module\");\n }\n }\n\n if (input.task) {\n const tokens = tokenizeQuery(input.task);\n for (const loaded of allMemories) {\n if (literalMatchesAllTokens(loaded.memory, tokens)) {\n addOrUpdate(loaded, \"semantic\");\n }\n }\n if (semanticHits) {\n const byId = new Map(allMemories.map((m) => [m.memory.frontmatter.id, m]));\n for (const hit of semanticHits) {\n const loaded = byId.get(hit.id);\n if (loaded) addOrUpdate(loaded, \"semantic\", hit.score);\n }\n }\n }\n\n const ranked = [...seen.values()].sort((a, b) => {\n const reasonScore = (m: BriefingMemory): number =>\n (m.reasons.includes(\"anchor\") ? 4 : 0) +\n (m.reasons.includes(\"module\") ? 2 : 0) +\n (m.reasons.includes(\"semantic\") ? 2 : 0) +\n (m.reasons.includes(\"domain\") ? 1 : 0);\n const confidenceScore = (m: BriefingMemory): number =>\n m.confidence === \"authoritative\" ? 4 :\n m.confidence === \"trusted\" ? 3 :\n m.confidence === \"low\" ? 1 :\n m.confidence === \"stale\" ? -2 : 0;\n const sa = reasonScore(a) + confidenceScore(a) + (a.semantic_score ?? 0);\n const sb = reasonScore(b) + confidenceScore(b) + (b.semantic_score ?? 0);\n return sb - sa;\n });\n\n memories.push(...ranked.slice(0, input.max_memories));\n\n if (input.track && memories.length > 0) {\n await trackReads(ctx.paths, memories.map((m) => m.id));\n }\n }\n\n // Build raw section payloads\n const projectContext =\n input.include_project_context && existsSync(ctx.paths.projectContext)\n ? await readFile(ctx.paths.projectContext, \"utf8\")\n : \"\";\n\n const moduleContents = input.include_module_contexts\n ? await loadModuleContexts(ctx, inferred)\n : [];\n\n const memoriesText = memories\n .map((m) => `### ${m.id} (${m.scope}/${m.type}, ${m.confidence})\\n${m.body.trim()}`)\n .join(\"\\n\\n---\\n\\n\");\n\n // Allocate budget across the three large pieces\n const slices = allocateBudget(\n [\n { key: \"project\", text: projectContext, weight: 3, mode: \"head\" },\n {\n key: \"modules\",\n text: moduleContents.map((m) => `## ${m.name}\\n${m.content}`).join(\"\\n\\n---\\n\\n\"),\n weight: 3,\n mode: \"head\",\n },\n { key: \"memories\", text: memoriesText, weight: 4, mode: \"head\" },\n ],\n input.max_tokens,\n );\n\n const projectSlice = slices.find((s) => s.key === \"project\")!;\n const modulesSlice = slices.find((s) => s.key === \"modules\")!;\n const memoriesSlice = slices.find((s) => s.key === \"memories\")!;\n\n const trimmedModules: BriefingOutput[\"module_contexts\"] = [];\n if (modulesSlice.text.length > 0 && moduleContents.length > 0) {\n // Distribute the modules slice across module entries proportionally\n const subSlices = allocateBudget(\n moduleContents.map((m) => ({ key: m.name, text: m.content, weight: 1, mode: \"head\" as const })),\n modulesSlice.allocatedTokens,\n );\n for (const m of moduleContents) {\n const sub = subSlices.find((s) => s.key === m.name)!;\n trimmedModules.push({ name: m.name, content: sub.text, truncated: sub.truncated });\n }\n }\n\n const trimmedMemoriesText = memoriesSlice.text;\n\n // Recompute memory bodies to fit. We slice the joined text but also expose\n // the truncated body per memory so the AI can render either form.\n const trimmedMemories = memories.map((m): BriefingMemory => {\n if (!memoriesSlice.truncated) return m;\n const tokensPer = Math.floor(memoriesSlice.allocatedTokens / Math.max(1, memories.length));\n const t = truncateToTokens(m.body, { maxTokens: tokensPer, mode: \"head\" });\n return { ...m, body: t.text };\n });\n\n const totalTokens =\n projectSlice.estimatedTokens + modulesSlice.estimatedTokens + memoriesSlice.estimatedTokens;\n\n return {\n ...(input.task ? { task: input.task } : {}),\n search_mode: searchMode,\n inferred_modules: inferred,\n project_context: projectContext\n ? { content: projectSlice.text, truncated: projectSlice.truncated }\n : null,\n module_contexts: trimmedModules,\n memories: trimmedMemories,\n estimated_tokens: totalTokens,\n budget: {\n max_tokens: input.max_tokens,\n spent: {\n project: projectSlice.estimatedTokens,\n modules: modulesSlice.estimatedTokens,\n memories: memoriesSlice.estimatedTokens,\n },\n },\n };\n}\n\nasync function trySemanticHits(\n ctx: HaiveContext,\n task: string,\n limit: number,\n): Promise<Array<{ id: string; score: number }> | null> {\n let mod: typeof import(\"@hiveai/embeddings\");\n try {\n mod = await import(\"@hiveai/embeddings\");\n } catch {\n return null;\n }\n const result = await mod.semanticSearch(ctx.paths, task, { limit });\n if (!result) return null;\n return result.hits.map((h) => ({ id: h.id, score: h.score }));\n}\n\nasync function loadModuleContexts(\n ctx: HaiveContext,\n modules: string[],\n): Promise<Array<{ name: string; content: string }>> {\n if (modules.length === 0) return [];\n if (!existsSync(ctx.paths.modulesContextDir)) return [];\n const available = new Set(\n (await readdir(ctx.paths.modulesContextDir, { withFileTypes: true }))\n .filter((d) => d.isDirectory())\n .map((d) => d.name),\n );\n const out: Array<{ name: string; content: string }> = [];\n for (const m of modules) {\n if (!available.has(m)) continue;\n const file = path.join(ctx.paths.modulesContextDir, m, \"context.md\");\n if (existsSync(file)) {\n out.push({ name: m, content: await readFile(file, \"utf8\") });\n }\n }\n return out;\n}\n\n// Re-export estimateTokens at the module level for tests.\nexport { estimateTokens };\n","import { loadCodeMap, queryCodeMap } from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const CodeMapInputSchema = {\n file: z\n .string()\n .optional()\n .describe(\"Filter to files whose path contains this substring\"),\n symbol: z\n .string()\n .optional()\n .describe(\"Filter to files exporting a symbol whose name contains this substring\"),\n max_files: z\n .number()\n .int()\n .positive()\n .default(40)\n .describe(\"Cap on returned files\"),\n};\n\nexport type CodeMapInput = {\n [K in keyof typeof CodeMapInputSchema]: z.infer<(typeof CodeMapInputSchema)[K]>;\n};\n\nexport interface CodeMapToolOutput {\n available: boolean;\n generated_at?: string;\n total_files?: number;\n files: Array<{\n path: string;\n summary?: string;\n loc: number;\n exports: Array<{ name: string; kind: string; description?: string; line: number }>;\n }>;\n notice?: string;\n}\n\nexport async function codeMapTool(\n input: CodeMapInput,\n ctx: HaiveContext,\n): Promise<CodeMapToolOutput> {\n const map = await loadCodeMap(ctx.paths);\n if (!map) {\n return {\n available: false,\n files: [],\n notice: \"No code map found. Run `haive index code` to generate `.ai/code-map.json`.\",\n };\n }\n const { files } = queryCodeMap(map, { file: input.file, symbol: input.symbol });\n return {\n available: true,\n generated_at: map.generated_at,\n total_files: Object.keys(map.files).length,\n files: files.slice(0, input.max_files).map((f) => ({\n path: f.path,\n ...(f.entry.summary ? { summary: f.entry.summary } : {}),\n loc: f.entry.loc,\n exports: f.entry.exports,\n })),\n };\n}\n","import { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const BootstrapProjectArgsSchema = {\n module: z\n .string()\n .optional()\n .describe(\n \"Optional module name to scope the analysis to (writes to .ai/modules/<module>/context.md)\",\n ),\n focus: z\n .string()\n .optional()\n .describe(\"Optional area to emphasize (e.g. 'data layer', 'API surface')\"),\n};\n\nexport type BootstrapProjectArgs = {\n [K in keyof typeof BootstrapProjectArgsSchema]: z.infer<\n (typeof BootstrapProjectArgsSchema)[K]\n >;\n};\n\nconst ROOT_TEMPLATE = `# Project context\n\n## Architecture\n<one or two paragraphs on the high-level architecture>\n\n## Key modules\n- <module-name>: <one line on its purpose>\n- ...\n\n## Conventions\n- <convention>: <why it matters here>\n- ...\n\n## Glossary\n- <term>: <definition in this codebase>\n- ...\n\n## Gotchas\n- <surprising behavior, hidden coupling, or known traps>\n- ...\n`;\n\nconst MODULE_TEMPLATE = `# Module context — {module}\n\n## Purpose\n<what this module is for>\n\n## Public surface\n- <exported symbol>: <one line>\n- ...\n\n## Internals\n<key files / classes / functions and how they connect>\n\n## Conventions specific to this module\n- ...\n\n## Gotchas\n- ...\n`;\n\nexport function bootstrapProjectPrompt(\n args: BootstrapProjectArgs,\n ctx: HaiveContext,\n): { description: string; messages: Array<{ role: \"user\"; content: { type: \"text\"; text: string } }> } {\n const target = args.module\n ? `\\`.ai/modules/${args.module}/context.md\\``\n : \"`.ai/project-context.md`\";\n const template = args.module\n ? MODULE_TEMPLATE.replace(\"{module}\", args.module)\n : ROOT_TEMPLATE;\n const focusLine = args.focus\n ? `\\nEmphasis area for this analysis: **${args.focus}**.\\n`\n : \"\";\n\n const text = `You are bootstrapping a hAIve shared project context for the team.\n\nProject root: \\`${ctx.paths.root}\\`\nTarget file: ${target}\n${focusLine}\n## What to do\n\n1. Explore the codebase: read the package manifests, top-level directories, build configs, and a representative sample of source files. Do not read every file — pick what gives you the highest signal per file (entry points, config, README if present, main domain models).\n2. Synthesize a concise, high-signal context document. Prefer load-bearing facts over exhaustive enumeration. A new teammate (human or AI) should be able to read it in 5 minutes and feel oriented.\n3. Match the structure of the template below. Keep each section short — link to files instead of repeating large code chunks.\n4. When you are done, call the \\`bootstrap_project_save\\` tool with the full Markdown content. Use \\`overwrite=true\\` only if the file already exists and you intend to replace it.\n\n## Template to fill\n\n\\`\\`\\`markdown\n${template}\\`\\`\\`\n\n## Tips\n\n- Anchor claims to file paths so future readers can verify them.\n- Write what is true *now*, not aspirational. Note open questions explicitly.\n- Skip sections that have nothing meaningful to say rather than padding them.\n`;\n\n return {\n description: args.module\n ? `Bootstrap context for module \"${args.module}\"`\n : \"Bootstrap the root project context\",\n messages: [\n {\n role: \"user\",\n content: { type: \"text\", text },\n },\n ],\n };\n}\n"],"mappings":"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","names":["existsSync","path","z","existsSync","z","mkdir","writeFile","existsSync","path","z","existsSync","loadMemoriesFromDir","z","writeFile","existsSync","loadMemoriesFromDir","serializeMemory","z","writeFile","existsSync","loadMemoriesFromDir","loadUsageIndex","serializeMemory","z","readFile","readdir","existsSync","path","deriveConfidence","getUsage","loadMemoriesFromDir","loadUsageIndex","trackReads","z","existsSync","deriveConfidence","getUsage","loadMemoriesFromDir","loadUsageIndex","z","existsSync","loadMemoriesFromDir","loadUsageIndex","saveUsageIndex","z","writeFile","existsSync","loadMemoriesFromDir","serializeMemory","z","existsSync","getUsage","loadMemoriesFromDir","loadUsageIndex","z","writeFile","existsSync","loadMemoriesFromDir","serializeMemory","z","readFile","readdir","existsSync","path","deriveConfidence","getUsage","inferModulesFromPaths","literalMatchesAllTokens","loadMemoriesFromDir","loadUsageIndex","memoryMatchesAnchorPaths","tokenizeQuery","trackReads","z","loadModuleContexts","z","z"]}
1
+ {"version":3,"sources":["../src/server.ts","../src/context.ts","../src/tools/bootstrap-project-save.ts","../src/tools/get-project-context.ts","../src/tools/mem-list.ts","../src/tools/mem-save.ts","../src/tools/mem-search.ts","../src/tools/mem-verify.ts","../src/tools/mem-reject.ts","../src/tools/mem-for-files.ts","../src/tools/mem-get.ts","../src/tools/mem-delete.ts","../src/tools/mem-update.ts","../src/tools/mem-pending.ts","../src/tools/mem-approve.ts","../src/tools/get-briefing.ts","../src/tools/code-map.ts","../src/prompts/bootstrap-project.ts"],"sourcesContent":["import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { createContext, type CreateContextOptions, type HaiveContext } from \"./context.js\";\nimport {\n BootstrapProjectSaveInputSchema,\n bootstrapProjectSave,\n type BootstrapProjectSaveInput,\n} from \"./tools/bootstrap-project-save.js\";\nimport {\n GetProjectContextInputSchema,\n getProjectContext,\n type GetProjectContextInput,\n} from \"./tools/get-project-context.js\";\nimport { MemListInputSchema, memList, type MemListInput } from \"./tools/mem-list.js\";\nimport { MemSaveInputSchema, memSave, type MemSaveInput } from \"./tools/mem-save.js\";\nimport {\n MemSearchInputSchema,\n memSearch,\n type MemSearchInput,\n} from \"./tools/mem-search.js\";\nimport {\n MemVerifyInputSchema,\n memVerify,\n type MemVerifyInput,\n} from \"./tools/mem-verify.js\";\nimport {\n MemRejectInputSchema,\n memReject,\n type MemRejectInput,\n} from \"./tools/mem-reject.js\";\nimport {\n MemForFilesInputSchema,\n memForFiles,\n type MemForFilesInput,\n} from \"./tools/mem-for-files.js\";\nimport { MemGetInputSchema, memGet, type MemGetInput } from \"./tools/mem-get.js\";\nimport {\n MemDeleteInputSchema,\n memDelete,\n type MemDeleteInput,\n} from \"./tools/mem-delete.js\";\nimport {\n MemUpdateInputSchema,\n memUpdate,\n type MemUpdateInput,\n} from \"./tools/mem-update.js\";\nimport {\n MemPendingInputSchema,\n memPending,\n type MemPendingInput,\n} from \"./tools/mem-pending.js\";\nimport {\n MemApproveInputSchema,\n memApprove,\n type MemApproveInput,\n} from \"./tools/mem-approve.js\";\nimport {\n GetBriefingInputSchema,\n getBriefing,\n type GetBriefingInput,\n} from \"./tools/get-briefing.js\";\nimport {\n CodeMapInputSchema,\n codeMapTool,\n type CodeMapInput,\n} from \"./tools/code-map.js\";\nimport {\n BootstrapProjectArgsSchema,\n bootstrapProjectPrompt,\n type BootstrapProjectArgs,\n} from \"./prompts/bootstrap-project.js\";\n\ndeclare const __HAIVE_VERSION__: string;\n\nexport const SERVER_NAME = \"haive\";\nexport const SERVER_VERSION = __HAIVE_VERSION__;\n\nfunction jsonResult(data: unknown) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: JSON.stringify(data, null, 2),\n },\n ],\n };\n}\n\nexport function createHaiveServer(\n options: CreateContextOptions = {},\n): { server: McpServer; context: HaiveContext } {\n const context = createContext(options);\n const server = new McpServer(\n { name: SERVER_NAME, version: SERVER_VERSION },\n { capabilities: { tools: {}, prompts: {} } },\n );\n\n server.tool(\n \"mem_save\",\n \"Save a new memory (default scope=personal). Use scope=team for shared memories.\",\n MemSaveInputSchema,\n async (input: MemSaveInput) => jsonResult(await memSave(input, context)),\n );\n\n server.tool(\n \"mem_search\",\n \"Search memories by substring across id, tags, and body. Optional filters by scope/type/module.\",\n MemSearchInputSchema,\n async (input: MemSearchInput) => jsonResult(await memSearch(input, context)),\n );\n\n server.tool(\n \"mem_list\",\n \"List memories with optional filters by scope/type/module/tag.\",\n MemListInputSchema,\n async (input: MemListInput) => jsonResult(await memList(input, context)),\n );\n\n server.tool(\n \"get_project_context\",\n \"Read the shared .ai/project-context.md (and optionally a module context).\",\n GetProjectContextInputSchema,\n async (input: GetProjectContextInput) =>\n jsonResult(await getProjectContext(input, context)),\n );\n\n server.tool(\n \"get_briefing\",\n \"One-shot onboarding: returns project context + module contexts + ranked relevant memories under a token budget. Replaces 4–5 separate calls when an agent starts a task.\",\n GetBriefingInputSchema,\n async (input: GetBriefingInput) => jsonResult(await getBriefing(input, context)),\n );\n\n server.tool(\n \"code_map\",\n \"Browse the project's pre-computed code map (file → exports + 1-line description) instead of grepping. Requires `haive index code`.\",\n CodeMapInputSchema,\n async (input: CodeMapInput) => jsonResult(await codeMapTool(input, context)),\n );\n\n server.tool(\n \"bootstrap_project_save\",\n \"Persist a project (or module) context document analyzed by the AI client.\",\n BootstrapProjectSaveInputSchema,\n async (input: BootstrapProjectSaveInput) =>\n jsonResult(await bootstrapProjectSave(input, context)),\n );\n\n server.tool(\n \"mem_verify\",\n \"Check anchor freshness for one or every memory; optionally write status updates back to disk.\",\n MemVerifyInputSchema,\n async (input: MemVerifyInput) => jsonResult(await memVerify(input, context)),\n );\n\n server.tool(\n \"mem_reject\",\n \"Record a rejection for a memory (blocks auto-promotion and lowers its trust signal).\",\n MemRejectInputSchema,\n async (input: MemRejectInput) => jsonResult(await memReject(input, context)),\n );\n\n server.tool(\n \"mem_for_files\",\n \"Given the file paths the agent is currently working on, return relevant memories grouped by reason (anchor overlap, module, domain) plus any matching .ai/modules/<name>/context.md contents.\",\n MemForFilesInputSchema,\n async (input: MemForFilesInput) => jsonResult(await memForFiles(input, context)),\n );\n\n server.tool(\n \"mem_get\",\n \"Fetch a single memory by id, including its body, anchor, usage, and confidence.\",\n MemGetInputSchema,\n async (input: MemGetInput) => jsonResult(await memGet(input, context)),\n );\n\n server.tool(\n \"mem_delete\",\n \"Delete a memory by id (and its usage entry by default).\",\n MemDeleteInputSchema,\n async (input: MemDeleteInput) => jsonResult(await memDelete(input, context)),\n );\n\n server.tool(\n \"mem_update\",\n \"Update the body, tags, or anchor of an existing memory without changing its id or losing usage history.\",\n MemUpdateInputSchema,\n async (input: MemUpdateInput) => jsonResult(await memUpdate(input, context)),\n );\n\n server.tool(\n \"mem_pending\",\n \"List 'proposed' memories awaiting review, sorted by reads (most-read first).\",\n MemPendingInputSchema,\n async (input: MemPendingInput) => jsonResult(await memPending(input, context)),\n );\n\n server.tool(\n \"mem_approve\",\n \"Mark a memory as validated immediately (explicit team review).\",\n MemApproveInputSchema,\n async (input: MemApproveInput) => jsonResult(await memApprove(input, context)),\n );\n\n server.prompt(\n \"bootstrap_project\",\n \"Instructions for the AI client to analyze the project and save the context.\",\n BootstrapProjectArgsSchema,\n (args: BootstrapProjectArgs) => bootstrapProjectPrompt(args, context),\n );\n\n return { server, context };\n}\n","import { findProjectRoot, resolveHaivePaths, type HaivePaths } from \"@hiveai/core\";\n\nexport interface HaiveContext {\n paths: HaivePaths;\n}\n\nexport interface CreateContextOptions {\n root?: string;\n env?: NodeJS.ProcessEnv;\n cwd?: string;\n}\n\nexport function createContext(options: CreateContextOptions = {}): HaiveContext {\n const env = options.env ?? process.env;\n const cwd = options.cwd ?? process.cwd();\n const root =\n options.root ??\n env.HAIVE_PROJECT_ROOT ??\n findProjectRoot(cwd);\n return { paths: resolveHaivePaths(root) };\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const BootstrapProjectSaveInputSchema = {\n content: z\n .string()\n .min(1)\n .describe(\"Full Markdown content for the project (or module) context file\"),\n module: z\n .string()\n .optional()\n .describe(\n \"If provided, save under .ai/modules/<module>/context.md instead of .ai/project-context.md\",\n ),\n overwrite: z\n .boolean()\n .default(false)\n .describe(\"Overwrite an existing file instead of failing\"),\n};\n\nexport type BootstrapProjectSaveInput = {\n [K in keyof typeof BootstrapProjectSaveInputSchema]: z.infer<\n (typeof BootstrapProjectSaveInputSchema)[K]\n >;\n};\n\nexport interface BootstrapProjectSaveOutput {\n file_path: string;\n action: \"created\" | \"overwritten\";\n}\n\nexport async function bootstrapProjectSave(\n input: BootstrapProjectSaveInput,\n ctx: HaiveContext,\n): Promise<BootstrapProjectSaveOutput> {\n const target = input.module\n ? path.join(ctx.paths.modulesContextDir, input.module, \"context.md\")\n : ctx.paths.projectContext;\n\n const exists = existsSync(target);\n if (exists && !input.overwrite) {\n throw new Error(\n `${target} already exists. Pass overwrite=true to replace it.`,\n );\n }\n\n await mkdir(path.dirname(target), { recursive: true });\n await writeFile(target, input.content, \"utf8\");\n\n return {\n file_path: target,\n action: exists ? \"overwritten\" : \"created\",\n };\n}\n","import { readFile, readdir } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const GetProjectContextInputSchema = {\n module: z\n .string()\n .optional()\n .describe(\"If provided, also include the matching module's context file\"),\n list_modules: z\n .boolean()\n .default(false)\n .describe(\"Return the list of available module context files\"),\n};\n\nexport type GetProjectContextInput = {\n [K in keyof typeof GetProjectContextInputSchema]: z.infer<\n (typeof GetProjectContextInputSchema)[K]\n >;\n};\n\nexport interface GetProjectContextOutput {\n root_context: string | null;\n module_context?: { name: string; content: string };\n available_modules?: string[];\n}\n\nexport async function getProjectContext(\n input: GetProjectContextInput,\n ctx: HaiveContext,\n): Promise<GetProjectContextOutput> {\n const out: GetProjectContextOutput = { root_context: null };\n\n if (existsSync(ctx.paths.projectContext)) {\n out.root_context = await readFile(ctx.paths.projectContext, \"utf8\");\n }\n\n if (input.module) {\n const modFile = path.join(ctx.paths.modulesContextDir, input.module, \"context.md\");\n if (existsSync(modFile)) {\n out.module_context = {\n name: input.module,\n content: await readFile(modFile, \"utf8\"),\n };\n }\n }\n\n if (input.list_modules) {\n out.available_modules = await listModules(ctx.paths.modulesContextDir);\n }\n\n return out;\n}\n\nasync function listModules(modulesDir: string): Promise<string[]> {\n if (!existsSync(modulesDir)) return [];\n const entries = await readdir(modulesDir, { withFileTypes: true });\n return entries.filter((e) => e.isDirectory()).map((e) => e.name).sort();\n}\n","import { existsSync } from \"node:fs\";\nimport { loadMemoriesFromDir } from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemListInputSchema = {\n scope: z.enum([\"personal\", \"team\", \"module\"]).optional(),\n type: z\n .enum([\"convention\", \"decision\", \"gotcha\", \"architecture\", \"glossary\"])\n .optional(),\n module: z.string().optional(),\n tag: z.string().optional(),\n status: z\n .enum([\"draft\", \"proposed\", \"validated\", \"deprecated\", \"stale\", \"rejected\"])\n .optional()\n .describe(\"Filter by a single status. Omit to return all statuses.\"),\n exclude_rejected: z\n .boolean()\n .default(false)\n .describe(\"When true, exclude memories with status=rejected from results.\"),\n include_body: z\n .boolean()\n .default(false)\n .describe(\"Include full body text. Default false to save tokens — use mem_get for a single memory's full content.\"),\n};\n\nexport type MemListInput = {\n [K in keyof typeof MemListInputSchema]: z.infer<(typeof MemListInputSchema)[K]>;\n};\n\nexport interface MemSummary {\n id: string;\n scope: string;\n type: string;\n module?: string;\n status: string;\n tags: string[];\n snippet: string;\n file_path: string;\n body?: string;\n}\n\nexport async function memList(\n input: MemListInput,\n ctx: HaiveContext,\n): Promise<{ memories: MemSummary[] }> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n return { memories: [] };\n }\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const filtered = all.filter(({ memory }) => {\n const fm = memory.frontmatter;\n if (input.scope && fm.scope !== input.scope) return false;\n if (input.type && fm.type !== input.type) return false;\n if (input.module && fm.module !== input.module) return false;\n if (input.tag && !fm.tags.includes(input.tag)) return false;\n if (input.status && fm.status !== input.status) return false;\n if (input.exclude_rejected && fm.status === \"rejected\") return false;\n return true;\n });\n const memories: MemSummary[] = filtered.map(({ memory, filePath }) => {\n const fm = memory.frontmatter;\n const snippet = memory.body.replace(/\\s+/g, \" \").trim().slice(0, 120);\n return {\n id: fm.id,\n scope: fm.scope,\n type: fm.type,\n ...(fm.module ? { module: fm.module } : {}),\n status: fm.status,\n tags: fm.tags,\n snippet,\n file_path: filePath,\n ...(input.include_body ? { body: memory.body } : {}),\n };\n });\n return { memories };\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport {\n buildFrontmatter,\n memoryFilePath,\n serializeMemory,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemSaveInputSchema = {\n type: z\n .enum([\"convention\", \"decision\", \"gotcha\", \"architecture\", \"glossary\"])\n .describe(\"Kind of memory being saved\"),\n slug: z\n .string()\n .min(1)\n .describe(\"Short human-readable identifier — becomes part of the filename\"),\n body: z\n .string()\n .describe(\"Markdown body of the memory\"),\n scope: z\n .enum([\"personal\", \"team\", \"module\"])\n .default(\"personal\")\n .describe(\"Visibility scope: personal | team | module\"),\n module: z\n .string()\n .optional()\n .describe(\"Module name (required when scope=module)\"),\n tags: z.array(z.string()).default([]).describe(\"Tags for filtering\"),\n domain: z.string().optional().describe(\"Domain (e.g. transactions, billing)\"),\n author: z.string().optional().describe(\"Author handle or email\"),\n paths: z\n .array(z.string())\n .default([])\n .describe(\"Anchor paths (file paths this memory references)\"),\n symbols: z\n .array(z.string())\n .default([])\n .describe(\"Anchor symbols (function/class names this memory references)\"),\n commit: z\n .string()\n .optional()\n .describe(\"Anchor commit SHA (for staleness detection later)\"),\n};\n\nexport type MemSaveInput = {\n [K in keyof typeof MemSaveInputSchema]: z.infer<(typeof MemSaveInputSchema)[K]>;\n};\n\nexport interface MemSaveOutput {\n id: string;\n scope: string;\n file_path: string;\n}\n\nexport async function memSave(\n input: MemSaveInput,\n ctx: HaiveContext,\n): Promise<MemSaveOutput> {\n if (!existsSync(ctx.paths.haiveDir)) {\n throw new Error(\n `No .ai/ directory at ${ctx.paths.root}. Run 'haive init' first.`,\n );\n }\n\n const frontmatter = buildFrontmatter({\n type: input.type,\n slug: input.slug,\n scope: input.scope,\n module: input.module,\n tags: input.tags,\n domain: input.domain,\n author: input.author,\n paths: input.paths,\n symbols: input.symbols,\n commit: input.commit,\n });\n\n const file = memoryFilePath(\n ctx.paths,\n frontmatter.scope,\n frontmatter.id,\n frontmatter.module,\n );\n await mkdir(path.dirname(file), { recursive: true });\n\n if (existsSync(file)) {\n throw new Error(`Memory already exists at ${file}`);\n }\n\n await writeFile(file, serializeMemory({ frontmatter, body: input.body }), \"utf8\");\n\n return {\n id: frontmatter.id,\n scope: frontmatter.scope,\n file_path: file,\n };\n}\n","import { existsSync } from \"node:fs\";\nimport {\n deriveConfidence,\n extractSnippet,\n getUsage,\n literalMatchesAllTokens,\n loadMemoriesFromDir,\n loadUsageIndex,\n pickSnippetNeedle,\n tokenizeQuery,\n trackReads,\n type ConfidenceLevel,\n type LoadedMemory,\n type UsageIndex,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemSearchInputSchema = {\n query: z.string().describe(\"Substring matched against id, tags, and body\"),\n scope: z\n .enum([\"personal\", \"team\", \"module\"])\n .optional()\n .describe(\"Restrict results to a single scope\"),\n type: z\n .enum([\"convention\", \"decision\", \"gotcha\", \"architecture\", \"glossary\"])\n .optional()\n .describe(\"Restrict results to a memory type\"),\n module: z.string().optional().describe(\"Restrict results to a module\"),\n status: z\n .enum([\"draft\", \"proposed\", \"validated\", \"deprecated\", \"stale\", \"rejected\"])\n .optional()\n .describe(\"Filter by a single status. Omit to return all statuses.\"),\n exclude_rejected: z\n .boolean()\n .default(false)\n .describe(\"When true, exclude memories with status=rejected from results.\"),\n limit: z.number().int().positive().max(100).default(20).describe(\"Max results\"),\n semantic: z\n .boolean()\n .default(false)\n .describe(\n \"Use semantic similarity from the embeddings index (requires `haive embeddings index`).\",\n ),\n min_score: z\n .number()\n .min(0)\n .max(1)\n .default(0)\n .describe(\"Minimum cosine similarity (semantic mode only)\"),\n track: z\n .boolean()\n .default(true)\n .describe(\"Increment read_count on returned memories (used for passive validation)\"),\n};\n\nexport type MemSearchInput = {\n [K in keyof typeof MemSearchInputSchema]: z.infer<(typeof MemSearchInputSchema)[K]>;\n};\n\nexport interface MemSearchHit {\n id: string;\n scope: string;\n type: string;\n module?: string;\n tags: string[];\n status: string;\n confidence: ConfidenceLevel;\n read_count: number;\n snippet: string;\n file_path: string;\n score?: number;\n}\n\nexport interface MemSearchOutput {\n matches: MemSearchHit[];\n total: number;\n mode: \"literal\" | \"semantic\" | \"literal_fallback\";\n notice?: string;\n}\n\nexport async function memSearch(\n input: MemSearchInput,\n ctx: HaiveContext,\n): Promise<MemSearchOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n return { matches: [], total: 0, mode: input.semantic ? \"literal_fallback\" : \"literal\" };\n }\n\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const filtered = all.filter(({ memory }) => passesFilters(memory.frontmatter, input));\n const usage = await loadUsageIndex(ctx.paths);\n\n let result: MemSearchOutput;\n if (input.semantic) {\n const semantic = await trySemanticSearch(ctx, input, filtered, usage);\n if (semantic) {\n result = semantic;\n } else {\n result = {\n ...buildLiteralResult(input, filtered, usage),\n mode: \"literal_fallback\",\n notice:\n \"Semantic search unavailable (embeddings index missing or @hiveai/embeddings not installed). Falling back to literal search.\",\n };\n }\n } else {\n result = buildLiteralResult(input, filtered, usage);\n }\n\n if (input.track && result.matches.length > 0) {\n await trackReads(\n ctx.paths,\n result.matches.map((m) => m.id),\n );\n }\n\n return result;\n}\n\nfunction passesFilters(\n fm: LoadedMemory[\"memory\"][\"frontmatter\"],\n input: MemSearchInput,\n): boolean {\n if (input.scope && fm.scope !== input.scope) return false;\n if (input.type && fm.type !== input.type) return false;\n if (input.module && fm.module !== input.module) return false;\n if (input.status && fm.status !== input.status) return false;\n if (input.exclude_rejected && fm.status === \"rejected\") return false;\n return true;\n}\n\nfunction buildLiteralResult(\n input: MemSearchInput,\n filtered: LoadedMemory[],\n usage: UsageIndex,\n): { matches: MemSearchHit[]; total: number; mode: \"literal\" } {\n const tokens = tokenizeQuery(input.query);\n const matched = filtered.filter(({ memory }) => literalMatchesAllTokens(memory, tokens));\n const snippetNeedle = pickSnippetNeedle(input.query);\n const top = matched.slice(0, input.limit);\n return {\n matches: top.map((loaded) => toHit(loaded, snippetNeedle, usage)),\n total: matched.length,\n mode: \"literal\",\n };\n}\n\nasync function trySemanticSearch(\n ctx: HaiveContext,\n input: MemSearchInput,\n filtered: LoadedMemory[],\n usage: UsageIndex,\n): Promise<MemSearchOutput | null> {\n let mod: typeof import(\"@hiveai/embeddings\");\n try {\n mod = await import(\"@hiveai/embeddings\");\n } catch {\n return null;\n }\n const result = await mod.semanticSearch(ctx.paths, input.query, {\n limit: Math.min(input.limit * 3, 100),\n minScore: input.min_score,\n });\n if (!result) return null;\n\n const allowedIds = new Set(filtered.map((m) => m.memory.frontmatter.id));\n const byId = new Map(filtered.map((m) => [m.memory.frontmatter.id, m]));\n\n const ranked = result.hits\n .filter((h) => allowedIds.has(h.id))\n .slice(0, input.limit);\n\n const matches: MemSearchHit[] = ranked.map((hit) => {\n const loaded = byId.get(hit.id);\n if (!loaded) {\n return {\n id: hit.id,\n scope: \"unknown\",\n type: \"unknown\",\n tags: [],\n status: \"unknown\",\n confidence: \"unverified\" as const,\n read_count: 0,\n snippet: \"\",\n file_path: hit.file_path,\n score: hit.score,\n };\n }\n const base = toHit(loaded, input.query.toLowerCase(), usage);\n return { ...base, score: hit.score };\n });\n\n return {\n matches,\n total: ranked.length,\n mode: \"semantic\",\n };\n}\n\nfunction toHit(loaded: LoadedMemory, needle: string, usage: UsageIndex): MemSearchHit {\n const fm = loaded.memory.frontmatter;\n const u = getUsage(usage, fm.id);\n return {\n id: fm.id,\n scope: fm.scope,\n type: fm.type,\n ...(fm.module ? { module: fm.module } : {}),\n tags: fm.tags,\n status: fm.status,\n confidence: deriveConfidence(fm, u),\n read_count: u.read_count,\n snippet: extractSnippet(loaded.memory.body, needle),\n file_path: loaded.filePath,\n };\n}\n","import { writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport {\n loadMemoriesFromDir,\n serializeMemory,\n verifyAnchor,\n type Memory,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemVerifyInputSchema = {\n id: z.string().optional().describe(\"If set, verify only this memory id\"),\n update: z\n .boolean()\n .default(false)\n .describe(\"Write the resulting status back to disk (status=stale or validated)\"),\n};\n\nexport type MemVerifyInput = {\n [K in keyof typeof MemVerifyInputSchema]: z.infer<(typeof MemVerifyInputSchema)[K]>;\n};\n\nexport interface MemVerifyHit {\n id: string;\n file_path: string;\n stale: boolean;\n reason: string | null;\n status_after: string;\n skipped?: boolean;\n}\n\nexport interface MemVerifyOutput {\n results: MemVerifyHit[];\n summary: {\n checked: number;\n fresh: number;\n stale: number;\n anchorless_skipped: number;\n updated: number;\n };\n}\n\nexport async function memVerify(\n input: MemVerifyInput,\n ctx: HaiveContext,\n): Promise<MemVerifyOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n return {\n results: [],\n summary: { checked: 0, fresh: 0, stale: 0, anchorless_skipped: 0, updated: 0 },\n };\n }\n\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const targets = input.id\n ? all.filter((m) => m.memory.frontmatter.id === input.id)\n : all;\n\n const results: MemVerifyHit[] = [];\n let fresh = 0;\n let stale = 0;\n let anchorless = 0;\n let updated = 0;\n\n for (const { memory, filePath } of targets) {\n const isAnchored =\n memory.frontmatter.anchor.paths.length > 0 ||\n memory.frontmatter.anchor.symbols.length > 0;\n if (!isAnchored) {\n anchorless++;\n results.push({\n id: memory.frontmatter.id,\n file_path: filePath,\n stale: false,\n reason: null,\n status_after: memory.frontmatter.status,\n skipped: true,\n });\n continue;\n }\n const result = await verifyAnchor(memory, { projectRoot: ctx.paths.root });\n if (result.stale) stale++;\n else fresh++;\n\n let statusAfter = memory.frontmatter.status;\n if (input.update) {\n const next = applyVerification(memory, result);\n await writeFile(filePath, serializeMemory(next), \"utf8\");\n statusAfter = next.frontmatter.status;\n updated++;\n }\n\n results.push({\n id: memory.frontmatter.id,\n file_path: filePath,\n stale: result.stale,\n reason: result.reason,\n status_after: statusAfter,\n });\n }\n\n return {\n results,\n summary: {\n checked: results.length + anchorless,\n fresh,\n stale,\n anchorless_skipped: anchorless,\n updated,\n },\n };\n}\n\nfunction applyVerification(\n mem: Memory,\n result: { stale: boolean; reason: string | null },\n): Memory {\n const verifiedAt = new Date().toISOString();\n if (result.stale) {\n return {\n frontmatter: {\n ...mem.frontmatter,\n status: \"stale\",\n verified_at: verifiedAt,\n stale_reason: result.reason,\n },\n body: mem.body,\n };\n }\n const nextStatus =\n mem.frontmatter.status === \"stale\" || mem.frontmatter.status === \"draft\"\n ? \"validated\"\n : mem.frontmatter.status;\n return {\n frontmatter: {\n ...mem.frontmatter,\n status: nextStatus,\n verified_at: verifiedAt,\n stale_reason: null,\n },\n body: mem.body,\n };\n}\n","import { writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport {\n loadMemoriesFromDir,\n loadUsageIndex,\n recordRejection,\n saveUsageIndex,\n serializeMemory,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemRejectInputSchema = {\n id: z.string().min(1).describe(\"Memory id being rejected\"),\n reason: z\n .string()\n .optional()\n .describe(\"Why this memory is being rejected (recorded for review)\"),\n};\n\nexport type MemRejectInput = {\n [K in keyof typeof MemRejectInputSchema]: z.infer<(typeof MemRejectInputSchema)[K]>;\n};\n\nexport interface MemRejectOutput {\n id: string;\n status: string;\n rejected_count: number;\n last_rejected_at: string | null;\n rejection_reason: string | null;\n}\n\nexport async function memReject(\n input: MemRejectInput,\n ctx: HaiveContext,\n): Promise<MemRejectOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n throw new Error(`No .ai/memories at ${ctx.paths.root}.`);\n }\n\n const memories = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const loaded = memories.find((m) => m.memory.frontmatter.id === input.id);\n if (!loaded) throw new Error(`No memory with id \"${input.id}\".`);\n\n // Write rejected status and reason to disk\n await writeFile(\n loaded.filePath,\n serializeMemory({\n frontmatter: {\n ...loaded.memory.frontmatter,\n status: \"rejected\",\n stale_reason: input.reason ?? loaded.memory.frontmatter.stale_reason ?? null,\n },\n body: loaded.memory.body,\n }),\n \"utf8\",\n );\n\n const idx = await loadUsageIndex(ctx.paths);\n recordRejection(idx, input.id, input.reason ?? null);\n await saveUsageIndex(ctx.paths, idx);\n const u = idx.by_id[input.id];\n return {\n id: input.id,\n status: \"rejected\",\n rejected_count: u?.rejected_count ?? 0,\n last_rejected_at: u?.last_rejected_at ?? null,\n rejection_reason: u?.rejection_reason ?? null,\n };\n}\n","import { readFile, readdir } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport {\n deriveConfidence,\n getUsage,\n inferModulesFromPaths,\n loadMemoriesFromDir,\n loadUsageIndex,\n memoryMatchesAnchorPaths,\n trackReads,\n type ConfidenceLevel,\n type LoadedMemory,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemForFilesInputSchema = {\n files: z\n .array(z.string())\n .min(1)\n .describe(\"Project-relative file paths the agent is currently working on\"),\n include_module_contexts: z\n .boolean()\n .default(true)\n .describe(\"Inline the matching .ai/modules/<name>/context.md contents\"),\n track: z\n .boolean()\n .default(true)\n .describe(\"Increment read_count on returned memories\"),\n};\n\nexport type MemForFilesInput = {\n [K in keyof typeof MemForFilesInputSchema]: z.infer<(typeof MemForFilesInputSchema)[K]>;\n};\n\nexport interface MemMatch {\n id: string;\n scope: string;\n type: string;\n module?: string;\n tags: string[];\n status: string;\n confidence: ConfidenceLevel;\n read_count: number;\n reason: \"anchor_overlap\" | \"module\" | \"domain\";\n file_path: string;\n body: string;\n}\n\nexport interface MemForFilesOutput {\n inferred_modules: string[];\n by_anchor: MemMatch[];\n by_module: MemMatch[];\n by_domain: MemMatch[];\n module_contexts: Array<{ name: string; content: string }>;\n}\n\nexport async function memForFiles(\n input: MemForFilesInput,\n ctx: HaiveContext,\n): Promise<MemForFilesOutput> {\n const inferred = inferModulesFromPaths(input.files);\n\n if (!existsSync(ctx.paths.memoriesDir)) {\n return {\n inferred_modules: inferred,\n by_anchor: [],\n by_module: [],\n by_domain: [],\n module_contexts: await loadModuleContexts(ctx, inferred, input.include_module_contexts),\n };\n }\n\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const usage = await loadUsageIndex(ctx.paths);\n const seen = new Set<string>();\n\n const byAnchor: MemMatch[] = [];\n const byModule: MemMatch[] = [];\n const byDomain: MemMatch[] = [];\n\n for (const loaded of all) {\n if (memoryMatchesAnchorPaths(loaded.memory, input.files)) {\n byAnchor.push(toMatch(loaded, \"anchor_overlap\", usage));\n seen.add(loaded.memory.frontmatter.id);\n }\n }\n\n for (const loaded of all) {\n if (seen.has(loaded.memory.frontmatter.id)) continue;\n const fm = loaded.memory.frontmatter;\n const moduleHit =\n (fm.module && inferred.includes(fm.module)) ||\n fm.tags.some((t) => inferred.includes(t));\n if (moduleHit) {\n byModule.push(toMatch(loaded, \"module\", usage));\n seen.add(fm.id);\n }\n }\n\n for (const loaded of all) {\n if (seen.has(loaded.memory.frontmatter.id)) continue;\n const domain = loaded.memory.frontmatter.domain;\n if (domain && inferred.includes(domain)) {\n byDomain.push(toMatch(loaded, \"domain\", usage));\n seen.add(loaded.memory.frontmatter.id);\n }\n }\n\n if (input.track) {\n await trackReads(ctx.paths, [...seen]);\n }\n\n return {\n inferred_modules: inferred,\n by_anchor: byAnchor,\n by_module: byModule,\n by_domain: byDomain,\n module_contexts: await loadModuleContexts(ctx, inferred, input.include_module_contexts),\n };\n}\n\nfunction toMatch(\n loaded: LoadedMemory,\n reason: MemMatch[\"reason\"],\n usage: Parameters<typeof getUsage>[0],\n): MemMatch {\n const fm = loaded.memory.frontmatter;\n const u = getUsage(usage, fm.id);\n return {\n id: fm.id,\n scope: fm.scope,\n type: fm.type,\n ...(fm.module ? { module: fm.module } : {}),\n tags: fm.tags,\n status: fm.status,\n confidence: deriveConfidence(fm, u),\n read_count: u.read_count,\n reason,\n file_path: loaded.filePath,\n body: loaded.memory.body,\n };\n}\n\nasync function loadModuleContexts(\n ctx: HaiveContext,\n modules: string[],\n enabled: boolean,\n): Promise<Array<{ name: string; content: string }>> {\n if (!enabled || modules.length === 0) return [];\n if (!existsSync(ctx.paths.modulesContextDir)) return [];\n const available = new Set(\n (await readdir(ctx.paths.modulesContextDir, { withFileTypes: true }))\n .filter((d) => d.isDirectory())\n .map((d) => d.name),\n );\n const out: Array<{ name: string; content: string }> = [];\n for (const m of modules) {\n if (!available.has(m)) continue;\n const file = path.join(ctx.paths.modulesContextDir, m, \"context.md\");\n if (existsSync(file)) {\n out.push({ name: m, content: await readFile(file, \"utf8\") });\n }\n }\n return out;\n}\n","import { existsSync } from \"node:fs\";\nimport {\n deriveConfidence,\n getUsage,\n loadMemoriesFromDir,\n loadUsageIndex,\n type ConfidenceLevel,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemGetInputSchema = {\n id: z.string().min(1).describe(\"Memory id to fetch\"),\n};\n\nexport type MemGetInput = {\n [K in keyof typeof MemGetInputSchema]: z.infer<(typeof MemGetInputSchema)[K]>;\n};\n\nexport interface MemGetOutput {\n id: string;\n scope: string;\n type: string;\n module?: string;\n tags: string[];\n status: string;\n confidence: ConfidenceLevel;\n read_count: number;\n rejected_count: number;\n created_at: string;\n verified_at: string | null;\n stale_reason: string | null;\n anchor: { commit?: string; paths: string[]; symbols: string[] };\n body: string;\n file_path: string;\n}\n\nexport async function memGet(input: MemGetInput, ctx: HaiveContext): Promise<MemGetOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n throw new Error(`No .ai/memories at ${ctx.paths.root}.`);\n }\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const found = all.find((m) => m.memory.frontmatter.id === input.id);\n if (!found) throw new Error(`No memory with id \"${input.id}\".`);\n const fm = found.memory.frontmatter;\n const u = getUsage(await loadUsageIndex(ctx.paths), fm.id);\n return {\n id: fm.id,\n scope: fm.scope,\n type: fm.type,\n ...(fm.module ? { module: fm.module } : {}),\n tags: fm.tags,\n status: fm.status,\n confidence: deriveConfidence(fm, u),\n read_count: u.read_count,\n rejected_count: u.rejected_count,\n created_at: fm.created_at,\n verified_at: fm.verified_at,\n stale_reason: fm.stale_reason,\n anchor: {\n ...(fm.anchor.commit ? { commit: fm.anchor.commit } : {}),\n paths: fm.anchor.paths,\n symbols: fm.anchor.symbols,\n },\n body: found.memory.body,\n file_path: found.filePath,\n };\n}\n","import { existsSync } from \"node:fs\";\nimport { unlink } from \"node:fs/promises\";\nimport {\n loadMemoriesFromDir,\n loadUsageIndex,\n saveUsageIndex,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemDeleteInputSchema = {\n id: z.string().min(1).describe(\"Memory id to delete\"),\n keep_usage: z\n .boolean()\n .default(false)\n .describe(\"Keep the usage.json entry instead of removing it alongside the file\"),\n};\n\nexport type MemDeleteInput = {\n [K in keyof typeof MemDeleteInputSchema]: z.infer<(typeof MemDeleteInputSchema)[K]>;\n};\n\nexport interface MemDeleteOutput {\n id: string;\n deleted_file: string;\n usage_removed: boolean;\n}\n\nexport async function memDelete(\n input: MemDeleteInput,\n ctx: HaiveContext,\n): Promise<MemDeleteOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n throw new Error(`No .ai/memories at ${ctx.paths.root}.`);\n }\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const found = all.find((m) => m.memory.frontmatter.id === input.id);\n if (!found) throw new Error(`No memory with id \"${input.id}\".`);\n\n await unlink(found.filePath);\n\n let usageRemoved = false;\n if (!input.keep_usage) {\n const idx = await loadUsageIndex(ctx.paths);\n if (idx.by_id[input.id]) {\n delete idx.by_id[input.id];\n await saveUsageIndex(ctx.paths, idx);\n usageRemoved = true;\n }\n }\n\n return { id: input.id, deleted_file: found.filePath, usage_removed: usageRemoved };\n}\n","import { writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { loadMemoriesFromDir, serializeMemory } from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemUpdateInputSchema = {\n id: z.string().min(1).describe(\"Id of the memory to update\"),\n body: z.string().optional().describe(\"New Markdown body — replaces the existing body\"),\n tags: z\n .array(z.string())\n .optional()\n .describe(\"New tags array — fully replaces existing tags\"),\n paths: z\n .array(z.string())\n .optional()\n .describe(\"New anchor paths — fully replaces existing anchor.paths\"),\n symbols: z\n .array(z.string())\n .optional()\n .describe(\"New anchor symbols — fully replaces existing anchor.symbols\"),\n commit: z.string().optional().describe(\"New anchor commit SHA\"),\n domain: z.string().optional().describe(\"New domain label\"),\n author: z.string().optional().describe(\"New author handle or email\"),\n};\n\nexport type MemUpdateInput = {\n [K in keyof typeof MemUpdateInputSchema]: z.infer<(typeof MemUpdateInputSchema)[K]>;\n};\n\nexport interface MemUpdateOutput {\n id: string;\n file_path: string;\n updated_fields: string[];\n}\n\nexport async function memUpdate(\n input: MemUpdateInput,\n ctx: HaiveContext,\n): Promise<MemUpdateOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n throw new Error(`No .ai/memories at ${ctx.paths.root}.`);\n }\n\n const memories = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const loaded = memories.find((m) => m.memory.frontmatter.id === input.id);\n if (!loaded) throw new Error(`No memory with id \"${input.id}\".`);\n\n const { frontmatter, body } = loaded.memory;\n const updated_fields: string[] = [];\n\n const newAnchor = { ...frontmatter.anchor };\n if (input.paths !== undefined) { newAnchor.paths = input.paths; updated_fields.push(\"anchor.paths\"); }\n if (input.symbols !== undefined) { newAnchor.symbols = input.symbols; updated_fields.push(\"anchor.symbols\"); }\n if (input.commit !== undefined) { newAnchor.commit = input.commit; updated_fields.push(\"anchor.commit\"); }\n\n const newFrontmatter = {\n ...frontmatter,\n anchor: newAnchor,\n ...(input.tags !== undefined ? { tags: input.tags } : {}),\n ...(input.domain !== undefined ? { domain: input.domain } : {}),\n ...(input.author !== undefined ? { author: input.author } : {}),\n };\n\n if (input.tags !== undefined) updated_fields.push(\"tags\");\n if (input.domain !== undefined) updated_fields.push(\"domain\");\n if (input.author !== undefined) updated_fields.push(\"author\");\n\n const newBody = input.body !== undefined ? input.body : body;\n if (input.body !== undefined) updated_fields.push(\"body\");\n\n if (updated_fields.length === 0) {\n throw new Error(\"No fields to update — provide at least one of: body, tags, paths, symbols, commit, domain, author.\");\n }\n\n await writeFile(\n loaded.filePath,\n serializeMemory({ frontmatter: newFrontmatter, body: newBody }),\n \"utf8\",\n );\n\n return { id: input.id, file_path: loaded.filePath, updated_fields };\n}\n","import { existsSync } from \"node:fs\";\nimport {\n getUsage,\n loadMemoriesFromDir,\n loadUsageIndex,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemPendingInputSchema = {\n scope: z.enum([\"personal\", \"team\", \"module\"]).optional(),\n};\n\nexport type MemPendingInput = {\n [K in keyof typeof MemPendingInputSchema]: z.infer<(typeof MemPendingInputSchema)[K]>;\n};\n\nexport interface MemPendingHit {\n id: string;\n scope: string;\n type: string;\n module?: string;\n tags: string[];\n age_days: number;\n read_count: number;\n rejected_count: number;\n file_path: string;\n}\n\nexport interface MemPendingOutput {\n pending: MemPendingHit[];\n}\n\nexport async function memPending(\n input: MemPendingInput,\n ctx: HaiveContext,\n): Promise<MemPendingOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) return { pending: [] };\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const usage = await loadUsageIndex(ctx.paths);\n const now = Date.now();\n const proposed = all.filter(({ memory }) => {\n if (memory.frontmatter.status !== \"proposed\") return false;\n if (input.scope && memory.frontmatter.scope !== input.scope) return false;\n return true;\n });\n\n proposed.sort(\n (a, b) =>\n getUsage(usage, b.memory.frontmatter.id).read_count -\n getUsage(usage, a.memory.frontmatter.id).read_count,\n );\n\n return {\n pending: proposed.map(({ memory, filePath }) => {\n const fm = memory.frontmatter;\n const u = getUsage(usage, fm.id);\n return {\n id: fm.id,\n scope: fm.scope,\n type: fm.type,\n ...(fm.module ? { module: fm.module } : {}),\n tags: fm.tags,\n age_days: Math.floor((now - new Date(fm.created_at).getTime()) / 86_400_000),\n read_count: u.read_count,\n rejected_count: u.rejected_count,\n file_path: filePath,\n };\n }),\n };\n}\n","import { writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport {\n loadMemoriesFromDir,\n serializeMemory,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemApproveInputSchema = {\n id: z.string().min(1).describe(\"Memory id to approve (sets status=validated immediately)\"),\n};\n\nexport type MemApproveInput = {\n [K in keyof typeof MemApproveInputSchema]: z.infer<(typeof MemApproveInputSchema)[K]>;\n};\n\nexport interface MemApproveOutput {\n id: string;\n previous_status: string;\n status: \"validated\";\n file_path: string;\n}\n\nexport async function memApprove(\n input: MemApproveInput,\n ctx: HaiveContext,\n): Promise<MemApproveOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n throw new Error(`No .ai/memories at ${ctx.paths.root}.`);\n }\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const found = all.find((m) => m.memory.frontmatter.id === input.id);\n if (!found) throw new Error(`No memory with id \"${input.id}\".`);\n\n const previous = found.memory.frontmatter.status;\n const next = {\n frontmatter: { ...found.memory.frontmatter, status: \"validated\" as const },\n body: found.memory.body,\n };\n await writeFile(found.filePath, serializeMemory(next), \"utf8\");\n return {\n id: input.id,\n previous_status: previous,\n status: \"validated\",\n file_path: found.filePath,\n };\n}\n","import { readFile, readdir } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport {\n allocateBudget,\n deriveConfidence,\n estimateTokens,\n getUsage,\n inferModulesFromPaths,\n literalMatchesAllTokens,\n loadMemoriesFromDir,\n loadUsageIndex,\n memoryMatchesAnchorPaths,\n tokenizeQuery,\n trackReads,\n truncateToTokens,\n type ConfidenceLevel,\n type LoadedMemory,\n type UsageIndex,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const GetBriefingInputSchema = {\n task: z\n .string()\n .optional()\n .describe(\n \"What you are about to do, in 1–2 sentences. Used to rank relevant memories semantically.\",\n ),\n files: z\n .array(z.string())\n .default([])\n .describe(\"Project-relative file paths the agent is currently looking at or about to edit\"),\n max_tokens: z\n .number()\n .int()\n .positive()\n .default(8000)\n .describe(\n \"Approximate token budget for the entire briefing. Each section is allocated a share and truncated to fit.\",\n ),\n max_memories: z\n .number()\n .int()\n .positive()\n .default(8)\n .describe(\"Cap on memories surfaced regardless of token budget\"),\n include_project_context: z.boolean().default(true),\n include_module_contexts: z.boolean().default(true),\n semantic: z\n .boolean()\n .default(true)\n .describe(\n \"Use semantic ranking when a task is provided (requires `haive embeddings index`).\",\n ),\n track: z.boolean().default(true).describe(\"Increment read_count on returned memories\"),\n};\n\nexport type GetBriefingInput = {\n [K in keyof typeof GetBriefingInputSchema]: z.infer<(typeof GetBriefingInputSchema)[K]>;\n};\n\nexport interface BriefingMemory {\n id: string;\n scope: string;\n type: string;\n module?: string;\n tags: string[];\n status: string;\n confidence: ConfidenceLevel;\n read_count: number;\n reasons: Array<\"anchor\" | \"module\" | \"domain\" | \"semantic\">;\n semantic_score?: number;\n body: string;\n file_path: string;\n}\n\nexport interface BriefingOutput {\n task?: string;\n search_mode: \"semantic\" | \"literal_fallback\" | \"literal\";\n inferred_modules: string[];\n project_context: { content: string; truncated: boolean } | null;\n module_contexts: Array<{ name: string; content: string; truncated: boolean }>;\n memories: BriefingMemory[];\n estimated_tokens: number;\n budget: { max_tokens: number; spent: { project: number; modules: number; memories: number } };\n}\n\nexport async function getBriefing(\n input: GetBriefingInput,\n ctx: HaiveContext,\n): Promise<BriefingOutput> {\n const inferred = inferModulesFromPaths(input.files);\n const memories: BriefingMemory[] = [];\n let searchMode: BriefingOutput[\"search_mode\"] = \"literal\";\n\n if (existsSync(ctx.paths.memoriesDir)) {\n const allMemories = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const usage = await loadUsageIndex(ctx.paths);\n const semanticHits = input.task && input.semantic\n ? await trySemanticHits(ctx, input.task, allMemories.length * 2)\n : null;\n\n if (input.task && input.semantic) {\n searchMode = semanticHits ? \"semantic\" : \"literal_fallback\";\n }\n\n const seen = new Map<string, BriefingMemory>();\n\n const addOrUpdate = (\n loaded: LoadedMemory,\n reason: BriefingMemory[\"reasons\"][number],\n score?: number,\n ): void => {\n const fm = loaded.memory.frontmatter;\n const existing = seen.get(fm.id);\n if (existing) {\n if (!existing.reasons.includes(reason)) existing.reasons.push(reason);\n if (score !== undefined && (existing.semantic_score ?? 0) < score) {\n existing.semantic_score = score;\n }\n return;\n }\n const u = getUsage(usage, fm.id);\n seen.set(fm.id, {\n id: fm.id,\n scope: fm.scope,\n type: fm.type,\n ...(fm.module ? { module: fm.module } : {}),\n tags: fm.tags,\n status: fm.status,\n confidence: deriveConfidence(fm, u),\n read_count: u.read_count,\n reasons: [reason],\n ...(score !== undefined ? { semantic_score: score } : {}),\n body: loaded.memory.body,\n file_path: loaded.filePath,\n });\n };\n\n if (input.files.length > 0) {\n for (const loaded of allMemories) {\n if (memoryMatchesAnchorPaths(loaded.memory, input.files)) addOrUpdate(loaded, \"anchor\");\n }\n for (const loaded of allMemories) {\n const fm = loaded.memory.frontmatter;\n if (fm.module && inferred.includes(fm.module)) addOrUpdate(loaded, \"module\");\n if (fm.domain && inferred.includes(fm.domain)) addOrUpdate(loaded, \"domain\");\n if (fm.tags.some((t) => inferred.includes(t))) addOrUpdate(loaded, \"module\");\n }\n }\n\n if (input.task) {\n const tokens = tokenizeQuery(input.task);\n for (const loaded of allMemories) {\n if (literalMatchesAllTokens(loaded.memory, tokens)) {\n addOrUpdate(loaded, \"semantic\");\n }\n }\n if (semanticHits) {\n const byId = new Map(allMemories.map((m) => [m.memory.frontmatter.id, m]));\n for (const hit of semanticHits) {\n const loaded = byId.get(hit.id);\n if (loaded) addOrUpdate(loaded, \"semantic\", hit.score);\n }\n }\n }\n\n const ranked = [...seen.values()].sort((a, b) => {\n const reasonScore = (m: BriefingMemory): number =>\n (m.reasons.includes(\"anchor\") ? 4 : 0) +\n (m.reasons.includes(\"module\") ? 2 : 0) +\n (m.reasons.includes(\"semantic\") ? 2 : 0) +\n (m.reasons.includes(\"domain\") ? 1 : 0);\n const confidenceScore = (m: BriefingMemory): number =>\n m.confidence === \"authoritative\" ? 4 :\n m.confidence === \"trusted\" ? 3 :\n m.confidence === \"low\" ? 1 :\n m.confidence === \"stale\" ? -2 : 0;\n const sa = reasonScore(a) + confidenceScore(a) + (a.semantic_score ?? 0);\n const sb = reasonScore(b) + confidenceScore(b) + (b.semantic_score ?? 0);\n return sb - sa;\n });\n\n memories.push(...ranked.slice(0, input.max_memories));\n\n if (input.track && memories.length > 0) {\n await trackReads(ctx.paths, memories.map((m) => m.id));\n }\n }\n\n // Build raw section payloads\n const projectContext =\n input.include_project_context && existsSync(ctx.paths.projectContext)\n ? await readFile(ctx.paths.projectContext, \"utf8\")\n : \"\";\n\n const moduleContents = input.include_module_contexts\n ? await loadModuleContexts(ctx, inferred)\n : [];\n\n const memoriesText = memories\n .map((m) => `### ${m.id} (${m.scope}/${m.type}, ${m.confidence})\\n${m.body.trim()}`)\n .join(\"\\n\\n---\\n\\n\");\n\n // Allocate budget across the three large pieces\n const slices = allocateBudget(\n [\n { key: \"project\", text: projectContext, weight: 3, mode: \"head\" },\n {\n key: \"modules\",\n text: moduleContents.map((m) => `## ${m.name}\\n${m.content}`).join(\"\\n\\n---\\n\\n\"),\n weight: 3,\n mode: \"head\",\n },\n { key: \"memories\", text: memoriesText, weight: 4, mode: \"head\" },\n ],\n input.max_tokens,\n );\n\n const projectSlice = slices.find((s) => s.key === \"project\")!;\n const modulesSlice = slices.find((s) => s.key === \"modules\")!;\n const memoriesSlice = slices.find((s) => s.key === \"memories\")!;\n\n const trimmedModules: BriefingOutput[\"module_contexts\"] = [];\n if (modulesSlice.text.length > 0 && moduleContents.length > 0) {\n // Distribute the modules slice across module entries proportionally\n const subSlices = allocateBudget(\n moduleContents.map((m) => ({ key: m.name, text: m.content, weight: 1, mode: \"head\" as const })),\n modulesSlice.allocatedTokens,\n );\n for (const m of moduleContents) {\n const sub = subSlices.find((s) => s.key === m.name)!;\n trimmedModules.push({ name: m.name, content: sub.text, truncated: sub.truncated });\n }\n }\n\n const trimmedMemoriesText = memoriesSlice.text;\n\n // Recompute memory bodies to fit. We slice the joined text but also expose\n // the truncated body per memory so the AI can render either form.\n const trimmedMemories = memories.map((m): BriefingMemory => {\n if (!memoriesSlice.truncated) return m;\n const tokensPer = Math.floor(memoriesSlice.allocatedTokens / Math.max(1, memories.length));\n const t = truncateToTokens(m.body, { maxTokens: tokensPer, mode: \"head\" });\n return { ...m, body: t.text };\n });\n\n const totalTokens =\n projectSlice.estimatedTokens + modulesSlice.estimatedTokens + memoriesSlice.estimatedTokens;\n\n return {\n ...(input.task ? { task: input.task } : {}),\n search_mode: searchMode,\n inferred_modules: inferred,\n project_context: projectContext\n ? { content: projectSlice.text, truncated: projectSlice.truncated }\n : null,\n module_contexts: trimmedModules,\n memories: trimmedMemories,\n estimated_tokens: totalTokens,\n budget: {\n max_tokens: input.max_tokens,\n spent: {\n project: projectSlice.estimatedTokens,\n modules: modulesSlice.estimatedTokens,\n memories: memoriesSlice.estimatedTokens,\n },\n },\n };\n}\n\nasync function trySemanticHits(\n ctx: HaiveContext,\n task: string,\n limit: number,\n): Promise<Array<{ id: string; score: number }> | null> {\n let mod: typeof import(\"@hiveai/embeddings\");\n try {\n mod = await import(\"@hiveai/embeddings\");\n } catch {\n return null;\n }\n const result = await mod.semanticSearch(ctx.paths, task, { limit });\n if (!result) return null;\n return result.hits.map((h) => ({ id: h.id, score: h.score }));\n}\n\nasync function loadModuleContexts(\n ctx: HaiveContext,\n modules: string[],\n): Promise<Array<{ name: string; content: string }>> {\n if (modules.length === 0) return [];\n if (!existsSync(ctx.paths.modulesContextDir)) return [];\n const available = new Set(\n (await readdir(ctx.paths.modulesContextDir, { withFileTypes: true }))\n .filter((d) => d.isDirectory())\n .map((d) => d.name),\n );\n const out: Array<{ name: string; content: string }> = [];\n for (const m of modules) {\n if (!available.has(m)) continue;\n const file = path.join(ctx.paths.modulesContextDir, m, \"context.md\");\n if (existsSync(file)) {\n out.push({ name: m, content: await readFile(file, \"utf8\") });\n }\n }\n return out;\n}\n\n// Re-export estimateTokens at the module level for tests.\nexport { estimateTokens };\n","import { loadCodeMap, queryCodeMap } from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const CodeMapInputSchema = {\n file: z\n .string()\n .optional()\n .describe(\"Filter to files whose path contains this substring\"),\n symbol: z\n .string()\n .optional()\n .describe(\"Filter to files exporting a symbol whose name contains this substring\"),\n max_files: z\n .number()\n .int()\n .positive()\n .default(40)\n .describe(\"Cap on returned files\"),\n};\n\nexport type CodeMapInput = {\n [K in keyof typeof CodeMapInputSchema]: z.infer<(typeof CodeMapInputSchema)[K]>;\n};\n\nexport interface CodeMapToolOutput {\n available: boolean;\n generated_at?: string;\n total_files?: number;\n files: Array<{\n path: string;\n summary?: string;\n loc: number;\n exports: Array<{ name: string; kind: string; description?: string; line: number }>;\n }>;\n notice?: string;\n}\n\nexport async function codeMapTool(\n input: CodeMapInput,\n ctx: HaiveContext,\n): Promise<CodeMapToolOutput> {\n const map = await loadCodeMap(ctx.paths);\n if (!map) {\n return {\n available: false,\n files: [],\n notice: \"No code map found. Run `haive index code` to generate `.ai/code-map.json`.\",\n };\n }\n const { files } = queryCodeMap(map, { file: input.file, symbol: input.symbol });\n return {\n available: true,\n generated_at: map.generated_at,\n total_files: Object.keys(map.files).length,\n files: files.slice(0, input.max_files).map((f) => ({\n path: f.path,\n ...(f.entry.summary ? { summary: f.entry.summary } : {}),\n loc: f.entry.loc,\n exports: f.entry.exports,\n })),\n };\n}\n","import { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const BootstrapProjectArgsSchema = {\n module: z\n .string()\n .optional()\n .describe(\n \"Optional module name to scope the analysis to (writes to .ai/modules/<module>/context.md)\",\n ),\n focus: z\n .string()\n .optional()\n .describe(\"Optional area to emphasize (e.g. 'data layer', 'API surface')\"),\n};\n\nexport type BootstrapProjectArgs = {\n [K in keyof typeof BootstrapProjectArgsSchema]: z.infer<\n (typeof BootstrapProjectArgsSchema)[K]\n >;\n};\n\nconst ROOT_TEMPLATE = `# Project context\n\n## Architecture\n<one or two paragraphs on the high-level architecture>\n\n## Key modules\n- <module-name>: <one line on its purpose>\n- ...\n\n## Conventions\n- <convention>: <why it matters here>\n- ...\n\n## Glossary\n- <term>: <definition in this codebase>\n- ...\n\n## Gotchas\n- <surprising behavior, hidden coupling, or known traps>\n- ...\n`;\n\nconst MODULE_TEMPLATE = `# Module context — {module}\n\n## Purpose\n<what this module is for>\n\n## Public surface\n- <exported symbol>: <one line>\n- ...\n\n## Internals\n<key files / classes / functions and how they connect>\n\n## Conventions specific to this module\n- ...\n\n## Gotchas\n- ...\n`;\n\nexport function bootstrapProjectPrompt(\n args: BootstrapProjectArgs,\n ctx: HaiveContext,\n): { description: string; messages: Array<{ role: \"user\"; content: { type: \"text\"; text: string } }> } {\n const target = args.module\n ? `\\`.ai/modules/${args.module}/context.md\\``\n : \"`.ai/project-context.md`\";\n const template = args.module\n ? MODULE_TEMPLATE.replace(\"{module}\", args.module)\n : ROOT_TEMPLATE;\n const focusLine = args.focus\n ? `\\nEmphasis area for this analysis: **${args.focus}**.\\n`\n : \"\";\n\n const text = `You are bootstrapping a hAIve shared project context for the team.\n\nProject root: \\`${ctx.paths.root}\\`\nTarget file: ${target}\n${focusLine}\n## What to do\n\n1. Explore the codebase: read the package manifests, top-level directories, build configs, and a representative sample of source files. Do not read every file — pick what gives you the highest signal per file (entry points, config, README if present, main domain models).\n2. Synthesize a concise, high-signal context document. Prefer load-bearing facts over exhaustive enumeration. A new teammate (human or AI) should be able to read it in 5 minutes and feel oriented.\n3. Match the structure of the template below. Keep each section short — link to files instead of repeating large code chunks.\n4. When you are done, call the \\`bootstrap_project_save\\` tool with the full Markdown content. Use \\`overwrite=true\\` only if the file already exists and you intend to replace it.\n\n## Template to fill\n\n\\`\\`\\`markdown\n${template}\\`\\`\\`\n\n## Tips\n\n- Anchor claims to file paths so future readers can verify them.\n- Write what is true *now*, not aspirational. Note open questions explicitly.\n- Skip sections that have nothing meaningful to say rather than padding them.\n`;\n\n return {\n description: args.module\n ? `Bootstrap context for module \"${args.module}\"`\n : \"Bootstrap the root project context\",\n messages: [\n {\n role: \"user\",\n content: { type: \"text\", text },\n },\n ],\n };\n}\n"],"mappings":"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","names":["existsSync","path","z","existsSync","z","mkdir","writeFile","existsSync","path","z","existsSync","loadMemoriesFromDir","z","writeFile","existsSync","loadMemoriesFromDir","serializeMemory","z","writeFile","existsSync","loadMemoriesFromDir","loadUsageIndex","serializeMemory","z","readFile","readdir","existsSync","path","deriveConfidence","getUsage","loadMemoriesFromDir","loadUsageIndex","trackReads","z","existsSync","deriveConfidence","getUsage","loadMemoriesFromDir","loadUsageIndex","z","existsSync","loadMemoriesFromDir","loadUsageIndex","saveUsageIndex","z","writeFile","existsSync","loadMemoriesFromDir","serializeMemory","z","existsSync","getUsage","loadMemoriesFromDir","loadUsageIndex","z","writeFile","existsSync","loadMemoriesFromDir","serializeMemory","z","readFile","readdir","existsSync","path","deriveConfidence","getUsage","inferModulesFromPaths","literalMatchesAllTokens","loadMemoriesFromDir","loadUsageIndex","memoryMatchesAnchorPaths","tokenizeQuery","trackReads","z","loadModuleContexts","z","z"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hiveai/mcp",
3
- "version": "0.2.2",
3
+ "version": "0.2.4",
4
4
  "description": "hAIve MCP server — exposes memory + project context to any MCP-compatible AI client",
5
5
  "license": "MIT",
6
6
  "repository": {