@hiveai/mcp 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +242 -6
- package/dist/index.js.map +1 -1
- package/dist/server.js +242 -6
- package/dist/server.js.map +1 -1
- package/package.json +9 -4
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-pending.ts","../src/tools/mem-approve.ts","../src/prompts/bootstrap-project.ts"],"sourcesContent":["import { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { createHaiveServer } 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 v0.1.0 (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 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 BootstrapProjectArgsSchema,\n bootstrapProjectPrompt,\n type BootstrapProjectArgs,\n} from \"./prompts/bootstrap-project.js\";\n\nexport const SERVER_NAME = \"haive\";\nexport const SERVER_VERSION = \"0.1.0\";\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 \"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_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};\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 file_path: 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 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 file_path: filePath,\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}\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 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 { existsSync } from \"node:fs\";\nimport {\n loadMemoriesFromDir,\n loadUsageIndex,\n recordRejection,\n saveUsageIndex,\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 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 exists = memories.some((m) => m.memory.frontmatter.id === input.id);\n if (!exists) {\n throw new Error(`No memory with id \"${input.id}\".`);\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 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 mod = loaded.memory.frontmatter.module;\n if (mod && inferred.includes(mod)) {\n byModule.push(toMatch(loaded, \"module\", 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 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 { 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 { 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":";;;AAAA,SAAS,4BAA4B;;;ACArC,SAAS,iBAAiB;;;ACA1B,SAAS,iBAAiB,yBAA0C;AAY7D,SAAS,cAAc,UAAgC,CAAC,GAAiB;AAC9E,QAAM,MAAM,QAAQ,OAAO,QAAQ;AACnC,QAAM,MAAM,QAAQ,OAAO,QAAQ,IAAI;AACvC,QAAM,OACJ,QAAQ,QACR,IAAI,sBACJ,gBAAgB,GAAG;AACrB,SAAO,EAAE,OAAO,kBAAkB,IAAI,EAAE;AAC1C;;;ACpBA,SAAS,OAAO,iBAAiB;AACjC,SAAS,kBAAkB;AAC3B,OAAO,UAAU;AACjB,SAAS,SAAS;AAGX,IAAM,kCAAkC;AAAA,EAC7C,SAAS,EACN,OAAO,EACP,IAAI,CAAC,EACL,SAAS,gEAAgE;AAAA,EAC5E,QAAQ,EACL,OAAO,EACP,SAAS,EACT;AAAA,IACC;AAAA,EACF;AAAA,EACF,WAAW,EACR,QAAQ,EACR,QAAQ,KAAK,EACb,SAAS,+CAA+C;AAC7D;AAaA,eAAsB,qBACpB,OACA,KACqC;AACrC,QAAM,SAAS,MAAM,SACjB,KAAK,KAAK,IAAI,MAAM,mBAAmB,MAAM,QAAQ,YAAY,IACjE,IAAI,MAAM;AAEd,QAAM,SAAS,WAAW,MAAM;AAChC,MAAI,UAAU,CAAC,MAAM,WAAW;AAC9B,UAAM,IAAI;AAAA,MACR,GAAG,MAAM;AAAA,IACX;AAAA,EACF;AAEA,QAAM,MAAM,KAAK,QAAQ,MAAM,GAAG,EAAE,WAAW,KAAK,CAAC;AACrD,QAAM,UAAU,QAAQ,MAAM,SAAS,MAAM;AAE7C,SAAO;AAAA,IACL,WAAW;AAAA,IACX,QAAQ,SAAS,gBAAgB;AAAA,EACnC;AACF;;;ACxDA,SAAS,UAAU,eAAe;AAClC,SAAS,cAAAA,mBAAkB;AAC3B,OAAOC,WAAU;AACjB,SAAS,KAAAC,UAAS;AAGX,IAAM,+BAA+B;AAAA,EAC1C,QAAQA,GACL,OAAO,EACP,SAAS,EACT,SAAS,8DAA8D;AAAA,EAC1E,cAAcA,GACX,QAAQ,EACR,QAAQ,KAAK,EACb,SAAS,mDAAmD;AACjE;AAcA,eAAsB,kBACpB,OACA,KACkC;AAClC,QAAM,MAA+B,EAAE,cAAc,KAAK;AAE1D,MAAIF,YAAW,IAAI,MAAM,cAAc,GAAG;AACxC,QAAI,eAAe,MAAM,SAAS,IAAI,MAAM,gBAAgB,MAAM;AAAA,EACpE;AAEA,MAAI,MAAM,QAAQ;AAChB,UAAM,UAAUC,MAAK,KAAK,IAAI,MAAM,mBAAmB,MAAM,QAAQ,YAAY;AACjF,QAAID,YAAW,OAAO,GAAG;AACvB,UAAI,iBAAiB;AAAA,QACnB,MAAM,MAAM;AAAA,QACZ,SAAS,MAAM,SAAS,SAAS,MAAM;AAAA,MACzC;AAAA,IACF;AAAA,EACF;AAEA,MAAI,MAAM,cAAc;AACtB,QAAI,oBAAoB,MAAM,YAAY,IAAI,MAAM,iBAAiB;AAAA,EACvE;AAEA,SAAO;AACT;AAEA,eAAe,YAAY,YAAuC;AAChE,MAAI,CAACA,YAAW,UAAU,EAAG,QAAO,CAAC;AACrC,QAAM,UAAU,MAAM,QAAQ,YAAY,EAAE,eAAe,KAAK,CAAC;AACjE,SAAO,QAAQ,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK;AACxE;;;AC5DA,SAAS,cAAAG,mBAAkB;AAC3B,SAAS,2BAA2B;AACpC,SAAS,KAAAC,UAAS;AAGX,IAAM,qBAAqB;AAAA,EAChC,OAAOA,GAAE,KAAK,CAAC,YAAY,QAAQ,QAAQ,CAAC,EAAE,SAAS;AAAA,EACvD,MAAMA,GACH,KAAK,CAAC,cAAc,YAAY,UAAU,gBAAgB,UAAU,CAAC,EACrE,SAAS;AAAA,EACZ,QAAQA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,KAAKA,GAAE,OAAO,EAAE,SAAS;AAC3B;AAgBA,eAAsB,QACpB,OACA,KACqC;AACrC,MAAI,CAACD,YAAW,IAAI,MAAM,WAAW,GAAG;AACtC,WAAO,EAAE,UAAU,CAAC,EAAE;AAAA,EACxB;AACA,QAAM,MAAM,MAAM,oBAAoB,IAAI,MAAM,WAAW;AAC3D,QAAM,WAAW,IAAI,OAAO,CAAC,EAAE,OAAO,MAAM;AAC1C,UAAM,KAAK,OAAO;AAClB,QAAI,MAAM,SAAS,GAAG,UAAU,MAAM,MAAO,QAAO;AACpD,QAAI,MAAM,QAAQ,GAAG,SAAS,MAAM,KAAM,QAAO;AACjD,QAAI,MAAM,UAAU,GAAG,WAAW,MAAM,OAAQ,QAAO;AACvD,QAAI,MAAM,OAAO,CAAC,GAAG,KAAK,SAAS,MAAM,GAAG,EAAG,QAAO;AACtD,WAAO;AAAA,EACT,CAAC;AACD,QAAM,WAAyB,SAAS,IAAI,CAAC,EAAE,QAAQ,SAAS,MAAM;AACpE,UAAM,KAAK,OAAO;AAClB,WAAO;AAAA,MACL,IAAI,GAAG;AAAA,MACP,OAAO,GAAG;AAAA,MACV,MAAM,GAAG;AAAA,MACT,GAAI,GAAG,SAAS,EAAE,QAAQ,GAAG,OAAO,IAAI,CAAC;AAAA,MACzC,QAAQ,GAAG;AAAA,MACX,MAAM,GAAG;AAAA,MACT,WAAW;AAAA,IACb;AAAA,EACF,CAAC;AACD,SAAO,EAAE,SAAS;AACpB;;;ACzDA,SAAS,SAAAE,QAAO,aAAAC,kBAAiB;AACjC,SAAS,cAAAC,mBAAkB;AAC3B,OAAOC,WAAU;AACjB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,KAAAC,UAAS;AAGX,IAAM,qBAAqB;AAAA,EAChC,MAAMA,GACH,KAAK,CAAC,cAAc,YAAY,UAAU,gBAAgB,UAAU,CAAC,EACrE,SAAS,4BAA4B;AAAA,EACxC,MAAMA,GACH,OAAO,EACP,IAAI,CAAC,EACL,SAAS,qEAAgE;AAAA,EAC5E,MAAMA,GACH,OAAO,EACP,SAAS,6BAA6B;AAAA,EACzC,OAAOA,GACJ,KAAK,CAAC,YAAY,QAAQ,QAAQ,CAAC,EACnC,QAAQ,UAAU,EAClB,SAAS,4CAA4C;AAAA,EACxD,QAAQA,GACL,OAAO,EACP,SAAS,EACT,SAAS,0CAA0C;AAAA,EACtD,MAAMA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE,SAAS,oBAAoB;AAAA,EACnE,QAAQA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,qCAAqC;AAAA,EAC5E,QAAQA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,wBAAwB;AAAA,EAC/D,OAAOA,GACJ,MAAMA,GAAE,OAAO,CAAC,EAChB,QAAQ,CAAC,CAAC,EACV,SAAS,kDAAkD;AAAA,EAC9D,SAASA,GACN,MAAMA,GAAE,OAAO,CAAC,EAChB,QAAQ,CAAC,CAAC,EACV,SAAS,8DAA8D;AAAA,EAC1E,QAAQA,GACL,OAAO,EACP,SAAS,EACT,SAAS,mDAAmD;AACjE;AAYA,eAAsB,QACpB,OACA,KACwB;AACxB,MAAI,CAACF,YAAW,IAAI,MAAM,QAAQ,GAAG;AACnC,UAAM,IAAI;AAAA,MACR,wBAAwB,IAAI,MAAM,IAAI;AAAA,IACxC;AAAA,EACF;AAEA,QAAM,cAAc,iBAAiB;AAAA,IACnC,MAAM,MAAM;AAAA,IACZ,MAAM,MAAM;AAAA,IACZ,OAAO,MAAM;AAAA,IACb,QAAQ,MAAM;AAAA,IACd,MAAM,MAAM;AAAA,IACZ,QAAQ,MAAM;AAAA,IACd,QAAQ,MAAM;AAAA,IACd,OAAO,MAAM;AAAA,IACb,SAAS,MAAM;AAAA,IACf,QAAQ,MAAM;AAAA,EAChB,CAAC;AAED,QAAM,OAAO;AAAA,IACX,IAAI;AAAA,IACJ,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,YAAY;AAAA,EACd;AACA,QAAMF,OAAMG,MAAK,QAAQ,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AAEnD,MAAID,YAAW,IAAI,GAAG;AACpB,UAAM,IAAI,MAAM,4BAA4B,IAAI,EAAE;AAAA,EACpD;AAEA,QAAMD,WAAU,MAAM,gBAAgB,EAAE,aAAa,MAAM,MAAM,KAAK,CAAC,GAAG,MAAM;AAEhF,SAAO;AAAA,IACL,IAAI,YAAY;AAAA,IAChB,OAAO,YAAY;AAAA,IACnB,WAAW;AAAA,EACb;AACF;;;ACnGA,SAAS,cAAAI,mBAAkB;AAC3B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,uBAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAIK;AACP,SAAS,KAAAC,UAAS;AAGX,IAAM,uBAAuB;AAAA,EAClC,OAAOA,GAAE,OAAO,EAAE,SAAS,8CAA8C;AAAA,EACzE,OAAOA,GACJ,KAAK,CAAC,YAAY,QAAQ,QAAQ,CAAC,EACnC,SAAS,EACT,SAAS,oCAAoC;AAAA,EAChD,MAAMA,GACH,KAAK,CAAC,cAAc,YAAY,UAAU,gBAAgB,UAAU,CAAC,EACrE,SAAS,EACT,SAAS,mCAAmC;AAAA,EAC/C,QAAQA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,8BAA8B;AAAA,EACrE,OAAOA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,GAAG,EAAE,QAAQ,EAAE,EAAE,SAAS,aAAa;AAAA,EAC9E,UAAUA,GACP,QAAQ,EACR,QAAQ,KAAK,EACb;AAAA,IACC;AAAA,EACF;AAAA,EACF,WAAWA,GACR,OAAO,EACP,IAAI,CAAC,EACL,IAAI,CAAC,EACL,QAAQ,CAAC,EACT,SAAS,gDAAgD;AAAA,EAC5D,OAAOA,GACJ,QAAQ,EACR,QAAQ,IAAI,EACZ,SAAS,yEAAyE;AACvF;AA2BA,eAAsB,UACpB,OACA,KAC0B;AAC1B,MAAI,CAACF,YAAW,IAAI,MAAM,WAAW,GAAG;AACtC,WAAO,EAAE,SAAS,CAAC,GAAG,OAAO,GAAG,MAAM,MAAM,WAAW,qBAAqB,UAAU;AAAA,EACxF;AAEA,QAAM,MAAM,MAAMC,qBAAoB,IAAI,MAAM,WAAW;AAC3D,QAAM,WAAW,IAAI,OAAO,CAAC,EAAE,OAAO,MAAM,cAAc,OAAO,aAAa,KAAK,CAAC;AACpF,QAAM,QAAQ,MAAM,eAAe,IAAI,KAAK;AAE5C,MAAI;AACJ,MAAI,MAAM,UAAU;AAClB,UAAM,WAAW,MAAM,kBAAkB,KAAK,OAAO,UAAU,KAAK;AACpE,QAAI,UAAU;AACZ,eAAS;AAAA,IACX,OAAO;AACL,eAAS;AAAA,QACP,GAAG,mBAAmB,OAAO,UAAU,KAAK;AAAA,QAC5C,MAAM;AAAA,QACN,QACE;AAAA,MACJ;AAAA,IACF;AAAA,EACF,OAAO;AACL,aAAS,mBAAmB,OAAO,UAAU,KAAK;AAAA,EACpD;AAEA,MAAI,MAAM,SAAS,OAAO,QAAQ,SAAS,GAAG;AAC5C,UAAM;AAAA,MACJ,IAAI;AAAA,MACJ,OAAO,QAAQ,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,IAChC;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,cACP,IACA,OACS;AACT,MAAI,MAAM,SAAS,GAAG,UAAU,MAAM,MAAO,QAAO;AACpD,MAAI,MAAM,QAAQ,GAAG,SAAS,MAAM,KAAM,QAAO;AACjD,MAAI,MAAM,UAAU,GAAG,WAAW,MAAM,OAAQ,QAAO;AACvD,SAAO;AACT;AAEA,SAAS,mBACP,OACA,UACA,OAC6D;AAC7D,QAAM,SAAS,cAAc,MAAM,KAAK;AACxC,QAAM,UAAU,SAAS,OAAO,CAAC,EAAE,OAAO,MAAM,wBAAwB,QAAQ,MAAM,CAAC;AACvF,QAAM,gBAAgB,kBAAkB,MAAM,KAAK;AACnD,QAAM,MAAM,QAAQ,MAAM,GAAG,MAAM,KAAK;AACxC,SAAO;AAAA,IACL,SAAS,IAAI,IAAI,CAAC,WAAW,MAAM,QAAQ,eAAe,KAAK,CAAC;AAAA,IAChE,OAAO,QAAQ;AAAA,IACf,MAAM;AAAA,EACR;AACF;AAEA,eAAe,kBACb,KACA,OACA,UACA,OACiC;AACjC,MAAI;AACJ,MAAI;AACF,UAAM,MAAM,OAAO,oBAAoB;AAAA,EACzC,QAAQ;AACN,WAAO;AAAA,EACT;AACA,QAAM,SAAS,MAAM,IAAI,eAAe,IAAI,OAAO,MAAM,OAAO;AAAA,IAC9D,OAAO,KAAK,IAAI,MAAM,QAAQ,GAAG,GAAG;AAAA,IACpC,UAAU,MAAM;AAAA,EAClB,CAAC;AACD,MAAI,CAAC,OAAQ,QAAO;AAEpB,QAAM,aAAa,IAAI,IAAI,SAAS,IAAI,CAAC,MAAM,EAAE,OAAO,YAAY,EAAE,CAAC;AACvE,QAAM,OAAO,IAAI,IAAI,SAAS,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,YAAY,IAAI,CAAC,CAAC,CAAC;AAEtE,QAAM,SAAS,OAAO,KACnB,OAAO,CAAC,MAAM,WAAW,IAAI,EAAE,EAAE,CAAC,EAClC,MAAM,GAAG,MAAM,KAAK;AAEvB,QAAM,UAA0B,OAAO,IAAI,CAAC,QAAQ;AAClD,UAAM,SAAS,KAAK,IAAI,IAAI,EAAE;AAC9B,QAAI,CAAC,QAAQ;AACX,aAAO;AAAA,QACL,IAAI,IAAI;AAAA,QACR,OAAO;AAAA,QACP,MAAM;AAAA,QACN,MAAM,CAAC;AAAA,QACP,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,YAAY;AAAA,QACZ,SAAS;AAAA,QACT,WAAW,IAAI;AAAA,QACf,OAAO,IAAI;AAAA,MACb;AAAA,IACF;AACA,UAAM,OAAO,MAAM,QAAQ,MAAM,MAAM,YAAY,GAAG,KAAK;AAC3D,WAAO,EAAE,GAAG,MAAM,OAAO,IAAI,MAAM;AAAA,EACrC,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA,OAAO,OAAO;AAAA,IACd,MAAM;AAAA,EACR;AACF;AAEA,SAAS,MAAM,QAAsB,QAAgB,OAAiC;AACpF,QAAM,KAAK,OAAO,OAAO;AACzB,QAAM,IAAI,SAAS,OAAO,GAAG,EAAE;AAC/B,SAAO;AAAA,IACL,IAAI,GAAG;AAAA,IACP,OAAO,GAAG;AAAA,IACV,MAAM,GAAG;AAAA,IACT,GAAI,GAAG,SAAS,EAAE,QAAQ,GAAG,OAAO,IAAI,CAAC;AAAA,IACzC,MAAM,GAAG;AAAA,IACT,QAAQ,GAAG;AAAA,IACX,YAAY,iBAAiB,IAAI,CAAC;AAAA,IAClC,YAAY,EAAE;AAAA,IACd,SAAS,eAAe,OAAO,OAAO,MAAM,MAAM;AAAA,IAClD,WAAW,OAAO;AAAA,EACpB;AACF;;;AC7MA,SAAS,aAAAE,kBAAiB;AAC1B,SAAS,cAAAC,mBAAkB;AAC3B;AAAA,EACE,uBAAAC;AAAA,EACA,mBAAAC;AAAA,EACA;AAAA,OAEK;AACP,SAAS,KAAAC,UAAS;AAGX,IAAM,uBAAuB;AAAA,EAClC,IAAIA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,oCAAoC;AAAA,EACvE,QAAQA,GACL,QAAQ,EACR,QAAQ,KAAK,EACb,SAAS,qEAAqE;AACnF;AAyBA,eAAsB,UACpB,OACA,KAC0B;AAC1B,MAAI,CAACH,YAAW,IAAI,MAAM,WAAW,GAAG;AACtC,WAAO;AAAA,MACL,SAAS,CAAC;AAAA,MACV,SAAS,EAAE,SAAS,GAAG,OAAO,GAAG,OAAO,GAAG,oBAAoB,GAAG,SAAS,EAAE;AAAA,IAC/E;AAAA,EACF;AAEA,QAAM,MAAM,MAAMC,qBAAoB,IAAI,MAAM,WAAW;AAC3D,QAAM,UAAU,MAAM,KAClB,IAAI,OAAO,CAAC,MAAM,EAAE,OAAO,YAAY,OAAO,MAAM,EAAE,IACtD;AAEJ,QAAM,UAA0B,CAAC;AACjC,MAAI,QAAQ;AACZ,MAAI,QAAQ;AACZ,MAAI,aAAa;AACjB,MAAI,UAAU;AAEd,aAAW,EAAE,QAAQ,SAAS,KAAK,SAAS;AAC1C,UAAM,aACJ,OAAO,YAAY,OAAO,MAAM,SAAS,KACzC,OAAO,YAAY,OAAO,QAAQ,SAAS;AAC7C,QAAI,CAAC,YAAY;AACf;AACA;AAAA,IACF;AACA,UAAM,SAAS,MAAM,aAAa,QAAQ,EAAE,aAAa,IAAI,MAAM,KAAK,CAAC;AACzE,QAAI,OAAO,MAAO;AAAA,QACb;AAEL,QAAI,cAAc,OAAO,YAAY;AACrC,QAAI,MAAM,QAAQ;AAChB,YAAM,OAAO,kBAAkB,QAAQ,MAAM;AAC7C,YAAMF,WAAU,UAAUG,iBAAgB,IAAI,GAAG,MAAM;AACvD,oBAAc,KAAK,YAAY;AAC/B;AAAA,IACF;AAEA,YAAQ,KAAK;AAAA,MACX,IAAI,OAAO,YAAY;AAAA,MACvB,WAAW;AAAA,MACX,OAAO,OAAO;AAAA,MACd,QAAQ,OAAO;AAAA,MACf,cAAc;AAAA,IAChB,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL;AAAA,IACA,SAAS;AAAA,MACP,SAAS,QAAQ,SAAS;AAAA,MAC1B;AAAA,MACA;AAAA,MACA,oBAAoB;AAAA,MACpB;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,kBACP,KACA,QACQ;AACR,QAAM,cAAa,oBAAI,KAAK,GAAE,YAAY;AAC1C,MAAI,OAAO,OAAO;AAChB,WAAO;AAAA,MACL,aAAa;AAAA,QACX,GAAG,IAAI;AAAA,QACP,QAAQ;AAAA,QACR,aAAa;AAAA,QACb,cAAc,OAAO;AAAA,MACvB;AAAA,MACA,MAAM,IAAI;AAAA,IACZ;AAAA,EACF;AACA,QAAM,aACJ,IAAI,YAAY,WAAW,WAAW,IAAI,YAAY,WAAW,UAC7D,cACA,IAAI,YAAY;AACtB,SAAO;AAAA,IACL,aAAa;AAAA,MACX,GAAG,IAAI;AAAA,MACP,QAAQ;AAAA,MACR,aAAa;AAAA,MACb,cAAc;AAAA,IAChB;AAAA,IACA,MAAM,IAAI;AAAA,EACZ;AACF;;;ACtIA,SAAS,cAAAE,mBAAkB;AAC3B;AAAA,EACE,uBAAAC;AAAA,EACA,kBAAAC;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,KAAAC,UAAS;AAGX,IAAM,uBAAuB;AAAA,EAClC,IAAIA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,0BAA0B;AAAA,EACzD,QAAQA,GACL,OAAO,EACP,SAAS,EACT,SAAS,yDAAyD;AACvE;AAaA,eAAsB,UACpB,OACA,KAC0B;AAC1B,MAAI,CAACH,YAAW,IAAI,MAAM,WAAW,GAAG;AACtC,UAAM,IAAI,MAAM,sBAAsB,IAAI,MAAM,IAAI,GAAG;AAAA,EACzD;AAEA,QAAM,WAAW,MAAMC,qBAAoB,IAAI,MAAM,WAAW;AAChE,QAAM,SAAS,SAAS,KAAK,CAAC,MAAM,EAAE,OAAO,YAAY,OAAO,MAAM,EAAE;AACxE,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,MAAM,sBAAsB,MAAM,EAAE,IAAI;AAAA,EACpD;AAEA,QAAM,MAAM,MAAMC,gBAAe,IAAI,KAAK;AAC1C,kBAAgB,KAAK,MAAM,IAAI,MAAM,UAAU,IAAI;AACnD,QAAM,eAAe,IAAI,OAAO,GAAG;AACnC,QAAM,IAAI,IAAI,MAAM,MAAM,EAAE;AAC5B,SAAO;AAAA,IACL,IAAI,MAAM;AAAA,IACV,gBAAgB,GAAG,kBAAkB;AAAA,IACrC,kBAAkB,GAAG,oBAAoB;AAAA,IACzC,kBAAkB,GAAG,oBAAoB;AAAA,EAC3C;AACF;;;ACrDA,SAAS,YAAAE,WAAU,WAAAC,gBAAe;AAClC,SAAS,cAAAC,mBAAkB;AAC3B,OAAOC,WAAU;AACjB;AAAA,EACE,oBAAAC;AAAA,EACA,YAAAC;AAAA,EACA;AAAA,EACA,uBAAAC;AAAA,EACA,kBAAAC;AAAA,EACA;AAAA,EACA,cAAAC;AAAA,OAGK;AACP,SAAS,KAAAC,UAAS;AAGX,IAAM,yBAAyB;AAAA,EACpC,OAAOA,GACJ,MAAMA,GAAE,OAAO,CAAC,EAChB,IAAI,CAAC,EACL,SAAS,+DAA+D;AAAA,EAC3E,yBAAyBA,GACtB,QAAQ,EACR,QAAQ,IAAI,EACZ,SAAS,4DAA4D;AAAA,EACxE,OAAOA,GACJ,QAAQ,EACR,QAAQ,IAAI,EACZ,SAAS,2CAA2C;AACzD;AA4BA,eAAsB,YACpB,OACA,KAC4B;AAC5B,QAAM,WAAW,sBAAsB,MAAM,KAAK;AAElD,MAAI,CAACP,YAAW,IAAI,MAAM,WAAW,GAAG;AACtC,WAAO;AAAA,MACL,kBAAkB;AAAA,MAClB,WAAW,CAAC;AAAA,MACZ,WAAW,CAAC;AAAA,MACZ,WAAW,CAAC;AAAA,MACZ,iBAAiB,MAAM,mBAAmB,KAAK,UAAU,MAAM,uBAAuB;AAAA,IACxF;AAAA,EACF;AAEA,QAAM,MAAM,MAAMI,qBAAoB,IAAI,MAAM,WAAW;AAC3D,QAAM,QAAQ,MAAMC,gBAAe,IAAI,KAAK;AAC5C,QAAM,OAAO,oBAAI,IAAY;AAE7B,QAAM,WAAuB,CAAC;AAC9B,QAAM,WAAuB,CAAC;AAC9B,QAAM,WAAuB,CAAC;AAE9B,aAAW,UAAU,KAAK;AACxB,QAAI,yBAAyB,OAAO,QAAQ,MAAM,KAAK,GAAG;AACxD,eAAS,KAAK,QAAQ,QAAQ,kBAAkB,KAAK,CAAC;AACtD,WAAK,IAAI,OAAO,OAAO,YAAY,EAAE;AAAA,IACvC;AAAA,EACF;AAEA,aAAW,UAAU,KAAK;AACxB,QAAI,KAAK,IAAI,OAAO,OAAO,YAAY,EAAE,EAAG;AAC5C,UAAM,MAAM,OAAO,OAAO,YAAY;AACtC,QAAI,OAAO,SAAS,SAAS,GAAG,GAAG;AACjC,eAAS,KAAK,QAAQ,QAAQ,UAAU,KAAK,CAAC;AAC9C,WAAK,IAAI,OAAO,OAAO,YAAY,EAAE;AAAA,IACvC;AAAA,EACF;AAEA,aAAW,UAAU,KAAK;AACxB,QAAI,KAAK,IAAI,OAAO,OAAO,YAAY,EAAE,EAAG;AAC5C,UAAM,SAAS,OAAO,OAAO,YAAY;AACzC,QAAI,UAAU,SAAS,SAAS,MAAM,GAAG;AACvC,eAAS,KAAK,QAAQ,QAAQ,UAAU,KAAK,CAAC;AAC9C,WAAK,IAAI,OAAO,OAAO,YAAY,EAAE;AAAA,IACvC;AAAA,EACF;AAEA,MAAI,MAAM,OAAO;AACf,UAAMC,YAAW,IAAI,OAAO,CAAC,GAAG,IAAI,CAAC;AAAA,EACvC;AAEA,SAAO;AAAA,IACL,kBAAkB;AAAA,IAClB,WAAW;AAAA,IACX,WAAW;AAAA,IACX,WAAW;AAAA,IACX,iBAAiB,MAAM,mBAAmB,KAAK,UAAU,MAAM,uBAAuB;AAAA,EACxF;AACF;AAEA,SAAS,QACP,QACA,QACA,OACU;AACV,QAAM,KAAK,OAAO,OAAO;AACzB,QAAM,IAAIH,UAAS,OAAO,GAAG,EAAE;AAC/B,SAAO;AAAA,IACL,IAAI,GAAG;AAAA,IACP,OAAO,GAAG;AAAA,IACV,MAAM,GAAG;AAAA,IACT,GAAI,GAAG,SAAS,EAAE,QAAQ,GAAG,OAAO,IAAI,CAAC;AAAA,IACzC,MAAM,GAAG;AAAA,IACT,QAAQ,GAAG;AAAA,IACX,YAAYD,kBAAiB,IAAI,CAAC;AAAA,IAClC,YAAY,EAAE;AAAA,IACd;AAAA,IACA,WAAW,OAAO;AAAA,IAClB,MAAM,OAAO,OAAO;AAAA,EACtB;AACF;AAEA,eAAe,mBACb,KACA,SACA,SACmD;AACnD,MAAI,CAAC,WAAW,QAAQ,WAAW,EAAG,QAAO,CAAC;AAC9C,MAAI,CAACF,YAAW,IAAI,MAAM,iBAAiB,EAAG,QAAO,CAAC;AACtD,QAAM,YAAY,IAAI;AAAA,KACnB,MAAMD,SAAQ,IAAI,MAAM,mBAAmB,EAAE,eAAe,KAAK,CAAC,GAChE,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,EAC7B,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,EACtB;AACA,QAAM,MAAgD,CAAC;AACvD,aAAW,KAAK,SAAS;AACvB,QAAI,CAAC,UAAU,IAAI,CAAC,EAAG;AACvB,UAAM,OAAOE,MAAK,KAAK,IAAI,MAAM,mBAAmB,GAAG,YAAY;AACnE,QAAID,YAAW,IAAI,GAAG;AACpB,UAAI,KAAK,EAAE,MAAM,GAAG,SAAS,MAAMF,UAAS,MAAM,MAAM,EAAE,CAAC;AAAA,IAC7D;AAAA,EACF;AACA,SAAO;AACT;;;ACnKA,SAAS,cAAAU,mBAAkB;AAC3B;AAAA,EACE,oBAAAC;AAAA,EACA,YAAAC;AAAA,EACA,uBAAAC;AAAA,EACA,kBAAAC;AAAA,OAEK;AACP,SAAS,KAAAC,UAAS;AAGX,IAAM,oBAAoB;AAAA,EAC/B,IAAIA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,oBAAoB;AACrD;AAwBA,eAAsB,OAAO,OAAoB,KAA0C;AACzF,MAAI,CAACL,YAAW,IAAI,MAAM,WAAW,GAAG;AACtC,UAAM,IAAI,MAAM,sBAAsB,IAAI,MAAM,IAAI,GAAG;AAAA,EACzD;AACA,QAAM,MAAM,MAAMG,qBAAoB,IAAI,MAAM,WAAW;AAC3D,QAAM,QAAQ,IAAI,KAAK,CAAC,MAAM,EAAE,OAAO,YAAY,OAAO,MAAM,EAAE;AAClE,MAAI,CAAC,MAAO,OAAM,IAAI,MAAM,sBAAsB,MAAM,EAAE,IAAI;AAC9D,QAAM,KAAK,MAAM,OAAO;AACxB,QAAM,IAAID,UAAS,MAAME,gBAAe,IAAI,KAAK,GAAG,GAAG,EAAE;AACzD,SAAO;AAAA,IACL,IAAI,GAAG;AAAA,IACP,OAAO,GAAG;AAAA,IACV,MAAM,GAAG;AAAA,IACT,GAAI,GAAG,SAAS,EAAE,QAAQ,GAAG,OAAO,IAAI,CAAC;AAAA,IACzC,MAAM,GAAG;AAAA,IACT,QAAQ,GAAG;AAAA,IACX,YAAYH,kBAAiB,IAAI,CAAC;AAAA,IAClC,YAAY,EAAE;AAAA,IACd,gBAAgB,EAAE;AAAA,IAClB,YAAY,GAAG;AAAA,IACf,aAAa,GAAG;AAAA,IAChB,cAAc,GAAG;AAAA,IACjB,QAAQ;AAAA,MACN,GAAI,GAAG,OAAO,SAAS,EAAE,QAAQ,GAAG,OAAO,OAAO,IAAI,CAAC;AAAA,MACvD,OAAO,GAAG,OAAO;AAAA,MACjB,SAAS,GAAG,OAAO;AAAA,IACrB;AAAA,IACA,MAAM,MAAM,OAAO;AAAA,IACnB,WAAW,MAAM;AAAA,EACnB;AACF;;;ACnEA,SAAS,cAAAK,oBAAkB;AAC3B,SAAS,cAAc;AACvB;AAAA,EACE,uBAAAC;AAAA,EACA,kBAAAC;AAAA,EACA,kBAAAC;AAAA,OACK;AACP,SAAS,KAAAC,WAAS;AAGX,IAAM,uBAAuB;AAAA,EAClC,IAAIA,IAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,qBAAqB;AAAA,EACpD,YAAYA,IACT,QAAQ,EACR,QAAQ,KAAK,EACb,SAAS,qEAAqE;AACnF;AAYA,eAAsB,UACpB,OACA,KAC0B;AAC1B,MAAI,CAACJ,aAAW,IAAI,MAAM,WAAW,GAAG;AACtC,UAAM,IAAI,MAAM,sBAAsB,IAAI,MAAM,IAAI,GAAG;AAAA,EACzD;AACA,QAAM,MAAM,MAAMC,qBAAoB,IAAI,MAAM,WAAW;AAC3D,QAAM,QAAQ,IAAI,KAAK,CAAC,MAAM,EAAE,OAAO,YAAY,OAAO,MAAM,EAAE;AAClE,MAAI,CAAC,MAAO,OAAM,IAAI,MAAM,sBAAsB,MAAM,EAAE,IAAI;AAE9D,QAAM,OAAO,MAAM,QAAQ;AAE3B,MAAI,eAAe;AACnB,MAAI,CAAC,MAAM,YAAY;AACrB,UAAM,MAAM,MAAMC,gBAAe,IAAI,KAAK;AAC1C,QAAI,IAAI,MAAM,MAAM,EAAE,GAAG;AACvB,aAAO,IAAI,MAAM,MAAM,EAAE;AACzB,YAAMC,gBAAe,IAAI,OAAO,GAAG;AACnC,qBAAe;AAAA,IACjB;AAAA,EACF;AAEA,SAAO,EAAE,IAAI,MAAM,IAAI,cAAc,MAAM,UAAU,eAAe,aAAa;AACnF;;;ACpDA,SAAS,cAAAE,oBAAkB;AAC3B;AAAA,EACE,YAAAC;AAAA,EACA,uBAAAC;AAAA,EACA,kBAAAC;AAAA,OACK;AACP,SAAS,KAAAC,WAAS;AAGX,IAAM,wBAAwB;AAAA,EACnC,OAAOA,IAAE,KAAK,CAAC,YAAY,QAAQ,QAAQ,CAAC,EAAE,SAAS;AACzD;AAsBA,eAAsB,WACpB,OACA,KAC2B;AAC3B,MAAI,CAACJ,aAAW,IAAI,MAAM,WAAW,EAAG,QAAO,EAAE,SAAS,CAAC,EAAE;AAC7D,QAAM,MAAM,MAAME,qBAAoB,IAAI,MAAM,WAAW;AAC3D,QAAM,QAAQ,MAAMC,gBAAe,IAAI,KAAK;AAC5C,QAAM,MAAM,KAAK,IAAI;AACrB,QAAM,WAAW,IAAI,OAAO,CAAC,EAAE,OAAO,MAAM;AAC1C,QAAI,OAAO,YAAY,WAAW,WAAY,QAAO;AACrD,QAAI,MAAM,SAAS,OAAO,YAAY,UAAU,MAAM,MAAO,QAAO;AACpE,WAAO;AAAA,EACT,CAAC;AAED,WAAS;AAAA,IACP,CAAC,GAAG,MACFF,UAAS,OAAO,EAAE,OAAO,YAAY,EAAE,EAAE,aACzCA,UAAS,OAAO,EAAE,OAAO,YAAY,EAAE,EAAE;AAAA,EAC7C;AAEA,SAAO;AAAA,IACL,SAAS,SAAS,IAAI,CAAC,EAAE,QAAQ,SAAS,MAAM;AAC9C,YAAM,KAAK,OAAO;AAClB,YAAM,IAAIA,UAAS,OAAO,GAAG,EAAE;AAC/B,aAAO;AAAA,QACL,IAAI,GAAG;AAAA,QACP,OAAO,GAAG;AAAA,QACV,MAAM,GAAG;AAAA,QACT,GAAI,GAAG,SAAS,EAAE,QAAQ,GAAG,OAAO,IAAI,CAAC;AAAA,QACzC,MAAM,GAAG;AAAA,QACT,UAAU,KAAK,OAAO,MAAM,IAAI,KAAK,GAAG,UAAU,EAAE,QAAQ,KAAK,KAAU;AAAA,QAC3E,YAAY,EAAE;AAAA,QACd,gBAAgB,EAAE;AAAA,QAClB,WAAW;AAAA,MACb;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;ACtEA,SAAS,aAAAI,kBAAiB;AAC1B,SAAS,cAAAC,oBAAkB;AAC3B;AAAA,EACE,uBAAAC;AAAA,EACA,mBAAAC;AAAA,OACK;AACP,SAAS,KAAAC,WAAS;AAGX,IAAM,wBAAwB;AAAA,EACnC,IAAIA,IAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS,0DAA0D;AAC3F;AAaA,eAAsB,WACpB,OACA,KAC2B;AAC3B,MAAI,CAACH,aAAW,IAAI,MAAM,WAAW,GAAG;AACtC,UAAM,IAAI,MAAM,sBAAsB,IAAI,MAAM,IAAI,GAAG;AAAA,EACzD;AACA,QAAM,MAAM,MAAMC,qBAAoB,IAAI,MAAM,WAAW;AAC3D,QAAM,QAAQ,IAAI,KAAK,CAAC,MAAM,EAAE,OAAO,YAAY,OAAO,MAAM,EAAE;AAClE,MAAI,CAAC,MAAO,OAAM,IAAI,MAAM,sBAAsB,MAAM,EAAE,IAAI;AAE9D,QAAM,WAAW,MAAM,OAAO,YAAY;AAC1C,QAAM,OAAO;AAAA,IACX,aAAa,EAAE,GAAG,MAAM,OAAO,aAAa,QAAQ,YAAqB;AAAA,IACzE,MAAM,MAAM,OAAO;AAAA,EACrB;AACA,QAAMF,WAAU,MAAM,UAAUG,iBAAgB,IAAI,GAAG,MAAM;AAC7D,SAAO;AAAA,IACL,IAAI,MAAM;AAAA,IACV,iBAAiB;AAAA,IACjB,QAAQ;AAAA,IACR,WAAW,MAAM;AAAA,EACnB;AACF;;;AC/CA,SAAS,KAAAE,WAAS;AAGX,IAAM,6BAA6B;AAAA,EACxC,QAAQA,IACL,OAAO,EACP,SAAS,EACT;AAAA,IACC;AAAA,EACF;AAAA,EACF,OAAOA,IACJ,OAAO,EACP,SAAS,EACT,SAAS,+DAA+D;AAC7E;AAQA,IAAM,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsBtB,IAAM,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmBjB,SAAS,uBACd,MACA,KACqG;AACrG,QAAM,SAAS,KAAK,SAChB,iBAAiB,KAAK,MAAM,kBAC5B;AACJ,QAAM,WAAW,KAAK,SAClB,gBAAgB,QAAQ,YAAY,KAAK,MAAM,IAC/C;AACJ,QAAM,YAAY,KAAK,QACnB;AAAA,qCAAwC,KAAK,KAAK;AAAA,IAClD;AAEJ,QAAM,OAAO;AAAA;AAAA,kBAEG,IAAI,MAAM,IAAI;AAAA,eACjB,MAAM;AAAA,EACnB,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWT,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASR,SAAO;AAAA,IACL,aAAa,KAAK,SACd,iCAAiC,KAAK,MAAM,MAC5C;AAAA,IACJ,UAAU;AAAA,MACR;AAAA,QACE,MAAM;AAAA,QACN,SAAS,EAAE,MAAM,QAAQ,KAAK;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AACF;;;AdxDO,IAAM,cAAc;AACpB,IAAM,iBAAiB;AAE9B,SAAS,WAAW,MAAe;AACjC,SAAO;AAAA,IACL,SAAS;AAAA,MACP;AAAA,QACE,MAAM;AAAA,QACN,MAAM,KAAK,UAAU,MAAM,MAAM,CAAC;AAAA,MACpC;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,kBACd,UAAgC,CAAC,GACa;AAC9C,QAAM,UAAU,cAAc,OAAO;AACrC,QAAM,SAAS,IAAI;AAAA,IACjB,EAAE,MAAM,aAAa,SAAS,eAAe;AAAA,IAC7C,EAAE,cAAc,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,EAAE,EAAE;AAAA,EAC7C;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,UAAwB,WAAW,MAAM,QAAQ,OAAO,OAAO,CAAC;AAAA,EACzE;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,UAA0B,WAAW,MAAM,UAAU,OAAO,OAAO,CAAC;AAAA,EAC7E;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,UAAwB,WAAW,MAAM,QAAQ,OAAO,OAAO,CAAC;AAAA,EACzE;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,UACL,WAAW,MAAM,kBAAkB,OAAO,OAAO,CAAC;AAAA,EACtD;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,UACL,WAAW,MAAM,qBAAqB,OAAO,OAAO,CAAC;AAAA,EACzD;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,UAA0B,WAAW,MAAM,UAAU,OAAO,OAAO,CAAC;AAAA,EAC7E;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,UAA0B,WAAW,MAAM,UAAU,OAAO,OAAO,CAAC;AAAA,EAC7E;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,UAA4B,WAAW,MAAM,YAAY,OAAO,OAAO,CAAC;AAAA,EACjF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,UAAuB,WAAW,MAAM,OAAO,OAAO,OAAO,CAAC;AAAA,EACvE;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,UAA0B,WAAW,MAAM,UAAU,OAAO,OAAO,CAAC;AAAA,EAC7E;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,UAA2B,WAAW,MAAM,WAAW,OAAO,OAAO,CAAC;AAAA,EAC/E;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,UAA2B,WAAW,MAAM,WAAW,OAAO,OAAO,CAAC;AAAA,EAC/E;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,CAAC,SAA+B,uBAAuB,MAAM,OAAO;AAAA,EACtE;AAEA,SAAO,EAAE,QAAQ,QAAQ;AAC3B;;;AD1KA,SAAS,UAAU,MAAmC;AACpD,QAAM,MAAyB,CAAC;AAChC,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,UAAM,MAAM,KAAK,CAAC;AAClB,QAAI,QAAQ,YAAY,QAAQ,MAAM;AACpC,UAAI,OAAO,KAAK,EAAE,CAAC;AAAA,IACrB,WAAW,KAAK,WAAW,SAAS,GAAG;AACrC,UAAI,OAAO,IAAI,MAAM,UAAU,MAAM;AAAA,IACvC;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAe,OAAsB;AACnC,QAAM,EAAE,KAAK,IAAI,UAAU,QAAQ,IAAI;AACvC,QAAM,EAAE,QAAQ,QAAQ,IAAI,kBAAkB,EAAE,KAAK,CAAC;AAEtD,UAAQ;AAAA,IACN,qDAAqD,QAAQ,MAAM,IAAI;AAAA,EACzE;AACA,QAAM,YAAY,IAAI,qBAAqB;AAC3C,QAAM,OAAO,QAAQ,SAAS;AAChC;AAEA,KAAK,EAAE,MAAM,CAAC,QAAiB;AAC7B,UAAQ,MAAM,sBAAsB,eAAe,QAAQ,IAAI,UAAU,GAAG;AAC5E,UAAQ,KAAK,CAAC;AAChB,CAAC;","names":["existsSync","path","z","existsSync","z","mkdir","writeFile","existsSync","path","z","existsSync","loadMemoriesFromDir","z","writeFile","existsSync","loadMemoriesFromDir","serializeMemory","z","existsSync","loadMemoriesFromDir","loadUsageIndex","z","readFile","readdir","existsSync","path","deriveConfidence","getUsage","loadMemoriesFromDir","loadUsageIndex","trackReads","z","existsSync","deriveConfidence","getUsage","loadMemoriesFromDir","loadUsageIndex","z","existsSync","loadMemoriesFromDir","loadUsageIndex","saveUsageIndex","z","existsSync","getUsage","loadMemoriesFromDir","loadUsageIndex","z","writeFile","existsSync","loadMemoriesFromDir","serializeMemory","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-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 } 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 v0.1.0 (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 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\nexport const SERVER_NAME = \"haive\";\nexport const SERVER_VERSION = \"0.1.0\";\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_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};\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 file_path: 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 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 file_path: filePath,\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}\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 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 { existsSync } from \"node:fs\";\nimport {\n loadMemoriesFromDir,\n loadUsageIndex,\n recordRejection,\n saveUsageIndex,\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 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 exists = memories.some((m) => m.memory.frontmatter.id === input.id);\n if (!exists) {\n throw new Error(`No memory with id \"${input.id}\".`);\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 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 { 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 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\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 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 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","existsSync","loadMemoriesFromDir","loadUsageIndex","z","readFile","readdir","existsSync","path","deriveConfidence","getUsage","loadMemoriesFromDir","loadUsageIndex","trackReads","z","existsSync","deriveConfidence","getUsage","loadMemoriesFromDir","loadUsageIndex","z","existsSync","loadMemoriesFromDir","loadUsageIndex","saveUsageIndex","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"]}
|