@hiveai/mcp 0.21.0 → 0.24.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.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/server.ts","../src/context.ts","../src/tools/bootstrap-project-save.ts","../src/tools/get-project-context.ts","../src/tools/mem-list.ts","../src/tools/mem-save.ts","../src/tools/mem-search.ts","../src/tools/mem-verify.ts","../src/tools/mem-reject.ts","../src/tools/mem-feedback.ts","../src/tools/mem-for-files.ts","../src/tools/mem-get.ts","../src/tools/mem-delete.ts","../src/tools/mem-update.ts","../src/tools/mem-pending.ts","../src/tools/mem-approve.ts","../src/tools/mem-tried.ts","../src/tools/ingest-findings.ts","../src/tools/mem-observe.ts","../src/tools/mem-session-end.ts","../src/session-tracker.ts","../src/tools/get-briefing.ts","../src/tools/briefing-helpers.ts","../src/tools/code-map.ts","../src/tools/mem-diff.ts","../src/tools/get-recap.ts","../src/tools/mem-relevant-to.ts","../src/tools/code-search.ts","../src/tools/why-this-file.ts","../src/tools/anti-patterns-check.ts","../src/tools/mem-distill.ts","../src/tools/why-this-decision.ts","../src/tools/mem-conflicts.ts","../src/tools/precommit-check.ts","../src/tools/pattern-detect.ts","../src/tools/mem-conflict-candidates.ts","../src/tools/mem-resolve-project.ts","../src/tools/mem-suggest-topic.ts","../src/tools/mem-timeline.ts","../src/tools/runtime-journal-append.ts","../src/tools/runtime-journal-tail.ts","../src/prompts/bootstrap-project.ts","../src/prompts/post-task.ts","../src/prompts/import-docs.ts","../src/index.ts"],"sourcesContent":["import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.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 MemFeedbackInputSchema,\n memFeedback,\n type MemFeedbackInput,\n} from \"./tools/mem-feedback.js\";\nimport {\n MemForFilesInputSchema,\n memForFiles,\n type MemForFilesInput,\n} from \"./tools/mem-for-files.js\";\nimport { MemGetInputSchema, memGet, type MemGetInput } from \"./tools/mem-get.js\";\nimport {\n MemDeleteInputSchema,\n memDelete,\n type MemDeleteInput,\n} from \"./tools/mem-delete.js\";\nimport {\n MemUpdateInputSchema,\n memUpdate,\n type MemUpdateInput,\n} from \"./tools/mem-update.js\";\nimport {\n MemPendingInputSchema,\n memPending,\n type MemPendingInput,\n} from \"./tools/mem-pending.js\";\nimport {\n MemApproveInputSchema,\n memApprove,\n type MemApproveInput,\n} from \"./tools/mem-approve.js\";\nimport {\n MemTriedInputSchema,\n memTried,\n type MemTriedInput,\n} from \"./tools/mem-tried.js\";\nimport {\n IngestFindingsInputSchema,\n ingestFindings,\n type IngestFindingsInput,\n} from \"./tools/ingest-findings.js\";\nimport {\n MemObserveInputSchema,\n memObserve,\n type MemObserveInput,\n} from \"./tools/mem-observe.js\";\nimport {\n MemSessionEndInputSchema,\n memSessionEnd,\n type MemSessionEndInput,\n} from \"./tools/mem-session-end.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 MemDiffInputSchema,\n memDiff,\n type MemDiffInput,\n} from \"./tools/mem-diff.js\";\nimport {\n GetRecapInputSchema,\n getRecap,\n type GetRecapInput,\n} from \"./tools/get-recap.js\";\nimport {\n MemRelevantToInputSchema,\n memRelevantTo,\n type MemRelevantToInput,\n} from \"./tools/mem-relevant-to.js\";\nimport {\n CodeSearchInputSchema,\n codeSearch,\n type CodeSearchInput,\n} from \"./tools/code-search.js\";\nimport {\n WhyThisFileInputSchema,\n whyThisFile,\n type WhyThisFileInput,\n} from \"./tools/why-this-file.js\";\nimport {\n AntiPatternsCheckInputSchema,\n antiPatternsCheck,\n type AntiPatternsCheckInput,\n} from \"./tools/anti-patterns-check.js\";\nimport {\n MemDistillInputSchema,\n memDistill,\n type MemDistillInput,\n} from \"./tools/mem-distill.js\";\nimport {\n WhyThisDecisionInputSchema,\n whyThisDecision,\n type WhyThisDecisionInput,\n} from \"./tools/why-this-decision.js\";\nimport {\n MemConflictsInputSchema,\n memConflicts,\n type MemConflictsInput,\n} from \"./tools/mem-conflicts.js\";\nimport {\n PreCommitCheckInputSchema,\n preCommitCheck,\n type PreCommitCheckInput,\n} from \"./tools/precommit-check.js\";\nimport {\n PatternDetectInputSchema,\n patternDetect,\n type PatternDetectInput,\n} from \"./tools/pattern-detect.js\";\nimport {\n MemConflictCandidatesInputSchema,\n memConflictCandidates,\n type MemConflictCandidatesInput,\n} from \"./tools/mem-conflict-candidates.js\";\nimport {\n MemResolveProjectInputSchema,\n memResolveProject,\n type MemResolveProjectInput,\n} from \"./tools/mem-resolve-project.js\";\nimport {\n MemSuggestTopicInputSchema,\n memSuggestTopic,\n type MemSuggestTopicInput,\n} from \"./tools/mem-suggest-topic.js\";\nimport {\n MemTimelineInputSchema,\n memTimeline,\n type MemTimelineInput,\n} from \"./tools/mem-timeline.js\";\nimport {\n RuntimeJournalAppendInputSchema,\n runtimeJournalAppend,\n type RuntimeJournalAppendInput,\n} from \"./tools/runtime-journal-append.js\";\nimport {\n RuntimeJournalTailInputSchema,\n runtimeJournalTail,\n type RuntimeJournalTailInput,\n} from \"./tools/runtime-journal-tail.js\";\nimport {\n BootstrapProjectArgsSchema,\n bootstrapProjectPrompt,\n type BootstrapProjectArgs,\n} from \"./prompts/bootstrap-project.js\";\nimport {\n PostTaskArgsSchema,\n postTaskPrompt,\n type PostTaskArgs,\n} from \"./prompts/post-task.js\";\nimport {\n ImportDocsArgsSchema,\n importDocsPrompt,\n type ImportDocsArgs,\n} from \"./prompts/import-docs.js\";\nimport { SessionTracker } from \"./session-tracker.js\";\nimport { hasRecentBriefingMarker, loadConfigSync } from \"@hiveai/core\";\n\n// Re-export tool implementations so `@hiveai/cli` (and integrators) can call\n// them programmatically without going through the MCP stdio transport.\n// These are the same handlers the MCP server registers below.\nexport {\n getBriefing,\n type GetBriefingInput,\n type BriefingOutput,\n} from \"./tools/get-briefing.js\";\nexport {\n codeMapTool,\n type CodeMapInput,\n type CodeMapToolOutput,\n} from \"./tools/code-map.js\";\nexport {\n getRecap,\n type GetRecapInput,\n type GetRecapOutput,\n} from \"./tools/get-recap.js\";\nexport {\n memRelevantTo,\n type MemRelevantToInput,\n type MemRelevantToOutput,\n} from \"./tools/mem-relevant-to.js\";\nexport {\n codeSearch,\n type CodeSearchInput,\n type CodeSearchOutput,\n} from \"./tools/code-search.js\";\nexport {\n whyThisFile,\n type WhyThisFileInput,\n type WhyThisFileOutput,\n} from \"./tools/why-this-file.js\";\nexport {\n antiPatternsCheck,\n type AntiPatternsCheckInput,\n type AntiPatternsCheckOutput,\n} from \"./tools/anti-patterns-check.js\";\nexport {\n memDistill,\n type MemDistillInput,\n type MemDistillOutput,\n} from \"./tools/mem-distill.js\";\nexport {\n whyThisDecision,\n type WhyThisDecisionInput,\n type WhyThisDecisionOutput,\n} from \"./tools/why-this-decision.js\";\nexport {\n memConflicts,\n type MemConflictsInput,\n type MemConflictsOutput,\n} from \"./tools/mem-conflicts.js\";\nexport {\n preCommitCheck,\n type PreCommitCheckInput,\n type PreCommitCheckOutput,\n} from \"./tools/precommit-check.js\";\nexport {\n patternDetect,\n type PatternDetectInput,\n type PatternDetectOutput,\n} from \"./tools/pattern-detect.js\";\nexport {\n memResolveProject,\n type MemResolveProjectInput,\n} from \"./tools/mem-resolve-project.js\";\nexport {\n memSuggestTopic,\n type MemSuggestTopicInput,\n} from \"./tools/mem-suggest-topic.js\";\nexport {\n memTimeline,\n type MemTimelineInput,\n} from \"./tools/mem-timeline.js\";\nexport {\n memConflictCandidates,\n type MemConflictCandidatesInput,\n} from \"./tools/mem-conflict-candidates.js\";\nexport {\n runtimeJournalAppend,\n type RuntimeJournalAppendInput,\n} from \"./tools/runtime-journal-append.js\";\nexport {\n runtimeJournalTail,\n type RuntimeJournalTailInput,\n} from \"./tools/runtime-journal-tail.js\";\n\ndeclare const __HAIVE_VERSION__: string;\n\nexport const SERVER_NAME = \"haive\";\nexport const SERVER_VERSION = __HAIVE_VERSION__;\nexport type ToolProfile = \"enforcement\" | \"maintenance\" | \"experimental\" | \"full\";\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 const ENFORCEMENT_PROFILE_TOOLS = [\n \"get_briefing\",\n \"mem_save\",\n \"mem_tried\",\n \"mem_search\",\n \"mem_get\",\n \"mem_verify\",\n \"mem_relevant_to\",\n \"code_map\",\n \"code_search\",\n \"pre_commit_check\",\n \"mem_session_end\",\n] as const;\n\nexport const MAINTENANCE_PROFILE_TOOLS = [\n ...ENFORCEMENT_PROFILE_TOOLS,\n \"mem_suggest_topic\",\n \"mem_for_files\",\n \"mem_list\",\n \"get_project_context\",\n \"bootstrap_project_save\",\n \"mem_resolve_project\",\n \"mem_update\",\n \"mem_approve\",\n \"mem_reject\",\n \"mem_pending\",\n \"mem_delete\",\n \"mem_diff\",\n \"get_recap\",\n \"anti_patterns_check\",\n \"mem_distill\",\n \"mem_timeline\",\n \"mem_conflict_candidates\",\n \"mem_feedback\",\n \"ingest_findings\",\n] as const;\n\nexport const EXPERIMENTAL_PROFILE_TOOLS = [\n ...MAINTENANCE_PROFILE_TOOLS,\n \"mem_observe\",\n \"why_this_file\",\n \"why_this_decision\",\n \"mem_conflicts_with\",\n \"pattern_detect\",\n \"runtime_journal_append\",\n \"runtime_journal_tail\",\n] as const;\n\nexport const TOOL_PROFILES: Record<Exclude<ToolProfile, \"full\">, ReadonlySet<string>> = {\n enforcement: new Set(ENFORCEMENT_PROFILE_TOOLS),\n maintenance: new Set(MAINTENANCE_PROFILE_TOOLS),\n experimental: new Set(EXPERIMENTAL_PROFILE_TOOLS),\n};\n\nexport function getAllowedToolsForProfile(profile: ToolProfile): ReadonlySet<string> {\n if (profile === \"full\") return TOOL_PROFILES.experimental;\n return TOOL_PROFILES[profile] ?? TOOL_PROFILES.enforcement;\n}\n\nconst BRIEFING_TOOLS = new Set([\"get_briefing\", \"mem_relevant_to\"]);\n\nconst MUTATING_TOOLS = new Set([\n \"mem_save\",\n \"mem_tried\",\n \"mem_observe\",\n \"mem_session_end\",\n \"bootstrap_project_save\",\n \"mem_update\",\n \"mem_approve\",\n \"mem_reject\",\n \"mem_delete\",\n \"mem_feedback\",\n \"runtime_journal_append\",\n \"pattern_detect\",\n \"ingest_findings\",\n]);\n\nexport function createHaiveServer(\n options: CreateContextOptions = {},\n): { server: McpServer; context: HaiveContext; tracker: SessionTracker } {\n const context = createContext(options);\n const config = loadConfigSync(context.paths);\n const toolProfile =\n (options.env?.HAIVE_TOOL_PROFILE as ToolProfile | undefined) ??\n config.enforcement?.toolProfile ??\n \"enforcement\";\n const requireBriefingFirst =\n options.env?.HAIVE_REQUIRE_BRIEFING_FIRST === \"0\"\n ? false\n : config.enforcement?.requireBriefingFirst ?? true;\n let briefingLoaded = false;\n const tracker = new SessionTracker(context);\n // Init is async — fire-and-forget at startup (registers shutdown handler if autopilot)\n void tracker.init();\n\n const server = new McpServer(\n { name: SERVER_NAME, version: SERVER_VERSION },\n { capabilities: { tools: {}, prompts: {} } },\n );\n\n const allowedTools = getAllowedToolsForProfile(toolProfile);\n\n const shouldRegisterTool = (name: string): boolean => allowedTools.has(name);\n\n const registerTool = <TInput>(\n name: string,\n description: string,\n schema: Record<string, unknown>,\n handler: (input: TInput) => Promise<unknown> | unknown,\n ): void => {\n if (!shouldRegisterTool(name)) return;\n const tool = server.tool.bind(server) as (\n toolName: string,\n toolDescription: string,\n toolSchema: Record<string, unknown>,\n toolHandler: (input: unknown) => Promise<unknown> | unknown,\n ) => unknown;\n tool(\n name,\n description,\n schema,\n async (input: unknown) => {\n if (BRIEFING_TOOLS.has(name)) {\n briefingLoaded = true;\n return await handler(input as TInput);\n }\n if (requireBriefingFirst && MUTATING_TOOLS.has(name) && !briefingLoaded) {\n // Fall back to the disk-persisted marker before blocking — covers client\n // reconnections where the server process is fresh but a recent briefing ran.\n const hasDiskMarker = await hasRecentBriefingMarker(context.paths).catch(() => false);\n if (hasDiskMarker) {\n briefingLoaded = true;\n } else {\n return jsonResult({\n error: \"haive_briefing_required\",\n message:\n \"This hAIve project requires get_briefing or mem_relevant_to before state-changing hAIve tools. Call get_briefing({ task: '...' }) first.\",\n tool: name,\n });\n }\n }\n return await handler(input as TInput);\n },\n );\n };\n\n const shouldRegisterPrompt = (name: string): boolean => {\n if (name === \"bootstrap_project\" || name === \"post_task\") return true;\n if (name === \"import_docs\") return toolProfile !== \"enforcement\";\n return toolProfile === \"experimental\" || toolProfile === \"full\";\n };\n\n // ── Memory creation ────────────────────────────────────────────────────\n\n registerTool(\n \"mem_save\",\n [\n \"Save a piece of knowledge as a persistent memory that survives across AI sessions.\",\n \"\",\n \"USE THIS WHEN you discover something worth remembering for future sessions:\",\n \" - A project convention (how things are done here)\",\n \" - An architectural decision and its rationale\",\n \" - A gotcha or non-obvious behavior that surprised you\",\n \" - A domain term and what it means in this codebase\",\n \"\",\n \"DO NOT USE for failed approaches → use mem_tried instead (better structure).\",\n \"DO NOT USE for code discoveries during exploration → use mem_observe instead.\",\n \"\",\n \"PARAMETERS:\",\n \" type — convention | decision | gotcha | architecture | glossary | attempt\",\n \" slug — short kebab-case id (e.g. 'flyway-no-modify-existing')\",\n \" body — Markdown content with the full knowledge\",\n \" scope — team (shared with all devs) | personal (private) | module (component-scoped)\",\n \" paths — anchor to source files for staleness detection (STRONGLY recommended)\",\n \" topic — stable key for upsert: if a memory with same topic+scope exists, update it in-place\",\n \"\",\n \"RETURNS: { id, scope, file_path, action: 'created'|'updated', warning?, invalid_paths? }\",\n \"WARNING: if paths point to non-existent files, they will be immediately stale after haive sync.\",\n \"DEDUP: identical body content within the same scope is rejected — use mem_update to modify.\",\n ].join(\"\\n\"),\n MemSaveInputSchema,\n async (input: MemSaveInput) => {\n tracker.record(\"mem_save\", input.slug);\n return jsonResult(await memSave(input, context));\n },\n );\n\n registerTool(\n \"mem_suggest_topic\",\n [\n \"Propose a stable `topic` key (topic-upsert) from type + short title.\",\n \"\",\n \"USE BEFORE mem_save when you want deterministic updates to the same memory over time;\",\n \"families mimic Engram-style grouping (architecture/*, bug/*, decision/*, …).\",\n \"\",\n \"PARAMETERS:\",\n \" type — convention | decision | gotcha | architecture | glossary | attempt | session_recap\",\n \" title — phrase to slugify under the suggested family prefix\",\n \"\",\n \"RETURNS: { topic_key, family, type }\",\n ].join(\"\\n\"),\n MemSuggestTopicInputSchema,\n async (input: MemSuggestTopicInput) =>\n jsonResult(await memSuggestTopic(input, context)),\n );\n\n registerTool(\n \"mem_tried\",\n [\n \"Record a FAILED approach so future agents don't repeat the same mistake.\",\n \"\",\n \"USE THIS IMMEDIATELY when you try something and it doesn't work. This is the\",\n \"most valuable type of negative knowledge — it saves hours of debugging for\",\n \"future agents working on the same codebase.\",\n \"\",\n \"Auto-validated (no approval cycle). Surfaced FIRST in future get_briefing calls\",\n \"so it's impossible to miss.\",\n \"\",\n \"PARAMETERS:\",\n \" what — short title of what you tried (e.g. 'importing X with ESM dynamic import')\",\n \" why_failed — the exact error or reason it failed\",\n \" instead — what to do instead (the correct approach)\",\n \" scope — team (default) | personal\",\n \" paths — source files where the issue lives\",\n \"\",\n \"RETURNS: { id, file_path, action: 'created' }\",\n ].join(\"\\n\"),\n MemTriedInputSchema,\n async (input: MemTriedInput) => {\n tracker.record(\"mem_tried\", input.what.slice(0, 80));\n return jsonResult(await memTried(input, context));\n },\n );\n\n registerTool(\n \"ingest_findings\",\n [\n \"Turn scanner findings (SonarQube / SARIF) into proposed, anchored memories with sensors.\",\n \"\",\n \"USE THIS to seed hAIve from your existing quality tooling: each real defect a scanner\",\n \"found becomes a `gotcha`/`convention` memory anchored to the file, pre-filled with a\",\n \"conservative `warn` sensor — so the next agent is steered away from it before re-writing it.\",\n \"This closes the review↔memory loop and kills the cold-start problem.\",\n \"\",\n \"SAFETY: drafts are status=proposed and sensors are warn-only + autogen. This tool NEVER\",\n \"auto-validates and NEVER auto-blocks. A human reviews (mem_pending) and promotes the sensor.\",\n \"\",\n \"PARAMETERS:\",\n \" format — 'sarif' (ESLint/Semgrep/CodeQL) | 'sonar' (SonarQube issues JSON)\",\n \" report_path — project-relative path to the report file (OR pass `report` inline)\",\n \" report — inline JSON content (OR pass `report_path`)\",\n \" type — gotcha (default) | convention\",\n \" scope — team (default) | personal | module\",\n \" min_severity — drop findings below this severity\",\n \" dry_run — preview what would be created without writing\",\n \"\",\n \"RETURNS: { format, parsed, new, skipped_existing, created[], notice }\",\n ].join(\"\\n\"),\n IngestFindingsInputSchema,\n async (input: IngestFindingsInput) => {\n tracker.record(\"ingest_findings\", `${input.format}:${input.report_path ?? \"inline\"}`);\n return jsonResult(await ingestFindings(input, context));\n },\n );\n\n registerTool(\n \"mem_observe\",\n [\n \"Capture a code-level discovery made WHILE READING existing code.\",\n \"\",\n \"USE THIS when you read a file and spot something the team may not know about:\",\n \" - A bug or race condition hiding in the code\",\n \" - A security gap or missing validation\",\n \" - An inconsistency between two files\",\n \" - A missing configuration or environment variable\",\n \" - Anything that could silently break in production\",\n \"\",\n \"DIFFERENCE from mem_save: mem_observe is for REACTIVE discoveries during code\",\n \"reading. mem_save is for deliberate knowledge capture (conventions, decisions).\",\n \"\",\n \"Auto-validated, anchored to file paths for staleness detection.\",\n \"\",\n \"PARAMETERS:\",\n \" what — one-line title (e.g. 'MobilePaymentController: duplicate @RequestBody')\",\n \" where — file path(s) where the issue lives\",\n \" impact — what breaks or could break because of this\",\n \" fix — suggested fix (optional)\",\n \" scope — team (default, since discoveries benefit everyone)\",\n \"\",\n \"RETURNS: { id, file_path }\",\n ].join(\"\\n\"),\n MemObserveInputSchema,\n async (input: MemObserveInput) => {\n tracker.record(\"mem_observe\", input.where);\n return jsonResult(await memObserve(input, context));\n },\n );\n\n registerTool(\n \"mem_session_end\",\n [\n \"Save an end-of-session recap so the NEXT session starts with fresh context.\",\n \"\",\n \"CALL THIS before closing any significant working session. In autopilot mode,\",\n \"the MCP server saves a minimal recap automatically on exit — but calling this\",\n \"manually produces a richer, more useful recap.\",\n \"\",\n \"HOW IT WORKS: uses topic-upsert — one recap per scope is kept and updated\",\n \"in-place (revision_count increments). get_briefing surfaces the latest recap\",\n \"at the very top of the next session's briefing, before project context.\",\n \"\",\n \"PARAMETERS:\",\n \" goal — what you were trying to accomplish (1–2 sentences)\",\n \" accomplished — what was actually done (bullet list recommended)\",\n \" discoveries — bugs, surprises, missing knowledge found during this session\",\n \" files_touched — key files read or modified (used as anchor for staleness)\",\n \" next_steps — what should happen in the next session or for a teammate\",\n \" scope — personal (default) | team\",\n \"\",\n \"RETURNS: { id, scope, action: 'created'|'updated', revision_count }\",\n ].join(\"\\n\"),\n MemSessionEndInputSchema,\n async (input: MemSessionEndInput) => {\n tracker.record(\"mem_session_end\", input.goal.slice(0, 80));\n return jsonResult(await memSessionEnd(input, context));\n },\n );\n\n // ── Memory retrieval ───────────────────────────────────────────────────\n\n registerTool(\n \"get_briefing\",\n [\n \"⭐ DEFAULT-FIRST for coding agents on any repo where `haive init` ran: call this BEFORE\",\n \"changing source or project config for the current goal (unless the developer explicitly opts out).\",\n \"One-shot onboarding: everything relevant in a single call under a token budget.\",\n \"\",\n \"PROGRESSIVE DISCLOSURE — after this, drill down only if needed:\",\n \" mem_relevant_to / mem_search (compact lists) → mem_get (full body + anchors).\",\n \"\",\n \"RETURNS (in order of priority):\",\n \" 0. action_required — ⚠️ HANDLE THIS FIRST if non-empty (see protocol below)\",\n \" 1. last_session — recap of the previous session (goal, what was done, next steps)\",\n \" 2. project_context — .ai/project-context.md (auto-generated from code-map if template)\",\n \" 3. module_contexts — relevant .ai/modules/<name>/context.md based on files being edited\",\n \" 4. memories — ranked team memories relevant to your task\",\n \" 5. symbol_locations — file:line:kind for any requested symbols (no grep needed)\",\n \" 6. setup_warnings — actionable warnings if setup is incomplete\",\n \" 7. decay_warnings — memories not read in >90 days (consider reviewing)\",\n \"\",\n \"⚠️ ACTION_REQUIRED PROTOCOL — MANDATORY:\",\n \" If action_required[] is non-empty, STOP and for each item:\",\n \" 1. Show the developer the exact developer_message field verbatim\",\n \" 2. Wait for explicit human confirmation ('yes', 'go ahead', 'oui', etc.)\",\n \" 3. Only then proceed with any code changes\",\n \" NEVER act autonomously on cross-repo breaking changes, dep bumps, or contract diffs.\",\n \"\",\n \"KEY PARAMETERS:\",\n \" task — what you are about to do (1–2 sentences) — ALWAYS provide this\",\n \" files — files you are about to edit — surfaces anchored memories\",\n \" symbols — symbol names to look up in the code-map (e.g. ['PaymentService'])\",\n \" format — 'full' (default) | 'compact' (1-line) | 'actions' (bullet-first excerpts)\",\n \" budget_preset — 'quick' | 'balanced' | 'deep' — scales max_tokens/memories/module contexts\",\n \"\",\n \"EXAMPLE USAGE:\",\n \" get_briefing({ task: 'add a Stripe payment integration', files: ['src/payments/'], symbols: ['PaymentService'] })\",\n \"\",\n \"CONFIDENCE LEVELS in memories:\",\n \" authoritative — validated + read 10+ times (highest trust)\",\n \" trusted — validated or proposed + read 3+ times\",\n \" low — proposed, few reads (take with caution)\",\n \" unverified — draft (unverified: true flag set)\",\n \"\",\n \"Replaces 4–5 separate tool calls. Prefer this first; use mem_search / mem_get only for follow-up.\",\n ].join(\"\\n\"),\n GetBriefingInputSchema,\n async (input: GetBriefingInput) => {\n tracker.record(\"get_briefing\", input.task ?? \"\");\n return jsonResult(await getBriefing(input, context));\n },\n );\n\n registerTool(\n \"mem_search\",\n [\n \"Search memories by keyword or semantic similarity.\",\n \"\",\n \"USE WHEN you need to find a specific memory and don't know its id.\",\n \"For session onboarding, use get_briefing instead (richer, ranked, budgeted).\",\n \"\",\n \"SEARCH MODES:\",\n \" Literal (default): AND search across id, tags, and body — all tokens must match.\",\n \" Falls back to OR automatically if no AND results (partial match).\",\n \" Lexical rank (lexical_rank: true, semantic: false): Okapi-BM25-style scoring on the\",\n \" filtered corpus — good for phrase-like queries without embeddings.\",\n \" Semantic (semantic: true): embedding-based similarity — finds related memories\",\n \" even with different wording. Requires haive embeddings index to be built.\",\n \"\",\n \"PARAMETERS:\",\n \" query — search terms or natural language question\",\n \" scope — filter by personal | team | module\",\n \" type — filter by convention | decision | gotcha | architecture | glossary\",\n \" semantic — true for embedding-based search (requires @hiveai/embeddings)\",\n \" lexical_rank — BM25-style ranking (ignored when semantic is true)\",\n \" limit — max results (default 10)\",\n \"\",\n \"RETURNS: array of { id, type, scope, status, confidence, body, match_quality }\",\n ].join(\"\\n\"),\n MemSearchInputSchema,\n async (input: MemSearchInput) => {\n tracker.record(\"mem_search\", input.query.slice(0, 80));\n return jsonResult(await memSearch(input, context));\n },\n );\n\n registerTool(\n \"mem_timeline\",\n [\n \"Chronological view of related memories: by shared frontmatter.topic OR expanded from a seed id\",\n \"(related_ids, same topic, overlapping anchor paths — one extra hop on related_ids).\",\n \"\",\n \"PARAMETERS:\",\n \" memory_id — optional seed memory id\",\n \" topic — optional topic key (required if memory_id omitted)\",\n \" limit — max entries (default 30)\",\n \"\",\n \"RETURNS: { entries: [{ id, type, scope, created_at, one_line, topic? }], total, notice? }\",\n ].join(\"\\n\"),\n MemTimelineInputSchema,\n async (input: MemTimelineInput) => jsonResult(await memTimeline(input, context)),\n );\n\n registerTool(\n \"mem_for_files\",\n [\n \"Surface memories relevant to the files you are currently editing.\",\n \"\",\n \"USE WHEN starting work on specific files and you want to know:\",\n \" - What conventions apply to these files\",\n \" - What gotchas are anchored to these paths\",\n \" - What decisions were made about this module\",\n \"\",\n \"Matching strategy (in priority order):\",\n \" 1. Anchor overlap — memories whose paths overlap with your files\",\n \" 2. Module context — .ai/modules/<name>/context.md if module is inferred\",\n \" 3. Domain/tag match — memories whose tags include path segments\",\n \"\",\n \"PARAMETERS:\",\n \" files — list of project-relative file paths you are editing\",\n \" scope — filter by scope (default: all)\",\n \"\",\n \"RETURNS: { memories: [...], module_contexts: [...] }\",\n ].join(\"\\n\"),\n MemForFilesInputSchema,\n async (input: MemForFilesInput) => jsonResult(await memForFiles(input, context)),\n );\n\n registerTool(\n \"mem_get\",\n [\n \"Fetch a single memory by its full id with all details.\",\n \"\",\n \"USE WHEN get_briefing / mem_relevant_to / mem_search returned a compact hit and you need\",\n \"the full body, or when you know the exact id of a memory.\",\n \"\",\n \"PARAMETERS:\",\n \" id — full memory id (e.g. '2026-04-28-gotcha-flyway-strict-no-ddl')\",\n \"\",\n \"RETURNS: { id, type, scope, status, confidence, body, anchor, tags, usage }\",\n ].join(\"\\n\"),\n MemGetInputSchema,\n async (input: MemGetInput) => jsonResult(await memGet(input, context)),\n );\n\n registerTool(\n \"mem_list\",\n [\n \"List memories with optional filters. Use for browsing, not for task onboarding.\",\n \"\",\n \"For task onboarding use get_briefing (ranked + budgeted).\",\n \"For keyword search use mem_search.\",\n \"\",\n \"PARAMETERS:\",\n \" scope — personal | team | module\",\n \" type — convention | decision | gotcha | architecture | glossary\",\n \" status — draft | proposed | validated | stale | rejected\",\n \" tags — filter by tags (AND match)\",\n \" module — filter by module name\",\n \"\",\n \"RETURNS: array of { id, type, scope, status, confidence, tags, created_at }\",\n ].join(\"\\n\"),\n MemListInputSchema,\n async (input: MemListInput) => jsonResult(await memList(input, context)),\n );\n\n // ── Project context ────────────────────────────────────────────────────\n\n registerTool(\n \"get_project_context\",\n [\n \"Read .ai/project-context.md (and optionally a module context) directly.\",\n \"\",\n \"USE WHEN you need the full project context without the memory ranking and\",\n \"token budgeting of get_briefing — e.g. for a reference architecture review.\",\n \"\",\n \"For normal task onboarding, use get_briefing instead (more efficient).\",\n \"\",\n \"PARAMETERS:\",\n \" module — also load .ai/modules/<module>/context.md if provided\",\n \"\",\n \"RETURNS: { content: string, module_context?: string }\",\n ].join(\"\\n\"),\n GetProjectContextInputSchema,\n async (input: GetProjectContextInput) =>\n jsonResult(await getProjectContext(input, context)),\n );\n\n registerTool(\n \"bootstrap_project_save\",\n [\n \"Persist the project context document (.ai/project-context.md) or a module\",\n \"context (.ai/modules/<name>/context.md) analyzed by the AI.\",\n \"\",\n \"USE AFTER the bootstrap_project MCP prompt: the prompt tells you how to\",\n \"analyze the codebase; this tool saves the result.\",\n \"\",\n \"PARAMETERS:\",\n \" content — full Markdown content of the context document\",\n \" module — if provided, saves as a module context (not root project context)\",\n \"\",\n \"RETURNS: { file_path, module? }\",\n ].join(\"\\n\"),\n BootstrapProjectSaveInputSchema,\n async (input: BootstrapProjectSaveInput) =>\n jsonResult(await bootstrapProjectSave(input, context)),\n );\n\n registerTool(\n \"code_map\",\n [\n \"Look up where symbols (classes, functions, interfaces) are defined in the codebase.\",\n \"\",\n \"USE INSTEAD OF grepping when you need to find where something lives.\",\n \"Requires haive index code to have been run (done automatically in autopilot mode).\",\n \"\",\n \"TIP: include symbols in get_briefing directly for auto-lookup at session start.\",\n \"\",\n \"PARAMETERS:\",\n \" symbol — name or partial name to search (e.g. 'PaymentService')\",\n \" file — filter by file path substring\",\n \" max_files — cap on results (default 40)\",\n \"\",\n \"RETURNS: { available: bool, files: [{ path, exports: [{ name, kind, line, description }] }] }\",\n \"If available: false → run haive index code first.\",\n ].join(\"\\n\"),\n CodeMapInputSchema,\n async (input: CodeMapInput) => jsonResult(await codeMapTool(input, context)),\n );\n\n registerTool(\n \"mem_resolve_project\",\n [\n \"Diagnostics: resolve which project root hAIve is using (never throws).\",\n \"\",\n \"USE IN multi-root workspaces or when the agent CWD may not be the repo root —\",\n \"mirrors HAIVE_PROJECT_ROOT, findProjectRoot markers, and presence of .ai/memories.\",\n \"\",\n \"PARAMETERS:\",\n \" cwd — optional directory used for discovery when HAIVE_PROJECT_ROOT is unset\",\n \"\",\n \"RETURNS: { ok: true, info: { cwd, resolved_root, haive_project_root_env, … } }\",\n ].join(\"\\n\"),\n MemResolveProjectInputSchema,\n async (input: MemResolveProjectInput) =>\n jsonResult(await memResolveProject(input, context)),\n );\n\n // ── Memory lifecycle ───────────────────────────────────────────────────\n\n registerTool(\n \"mem_update\",\n [\n \"Update the body, tags, or anchor of an existing memory in-place.\",\n \"\",\n \"USE WHEN a memory exists but its content has become outdated or incomplete.\",\n \"This preserves the memory's id, usage history, and read_count.\",\n \"\",\n \"For evolving memories that you will update repeatedly, use mem_save with a\",\n \"topic key instead (topic-upsert pattern).\",\n \"\",\n \"PARAMETERS:\",\n \" id — full memory id to update\",\n \" body — new Markdown content (replaces existing body)\",\n \" tags — new tag list (replaces existing tags)\",\n \" paths — new anchor paths (replaces existing paths)\",\n \" symbols — new anchor symbols (replaces existing symbols)\",\n \"\",\n \"RETURNS: { id, file_path, updated_fields: string[] }\",\n ].join(\"\\n\"),\n MemUpdateInputSchema,\n async (input: MemUpdateInput) => jsonResult(await memUpdate(input, context)),\n );\n\n registerTool(\n \"mem_verify\",\n [\n \"Check whether memory anchor paths and symbols still exist in the current code.\",\n \"\",\n \"USE WHEN you want to know if a specific memory is still valid after a refactor,\",\n \"or to check all memories for staleness (haive sync does this automatically).\",\n \"\",\n \"PARAMETERS:\",\n \" id — check a single memory (omit to check all)\",\n \" update — write 'stale' or 'validated' status back to disk\",\n \"\",\n \"RETURNS: { results: [{ id, status: 'fresh'|'stale'|'anchorless', reason? }] }\",\n \"Stale means the anchored file/symbol no longer exists at that path.\",\n \"Anchorless means the memory has no paths/symbols — staleness is undetectable.\",\n ].join(\"\\n\"),\n MemVerifyInputSchema,\n async (input: MemVerifyInput) => jsonResult(await memVerify(input, context)),\n );\n\n registerTool(\n \"mem_approve\",\n [\n \"Mark a memory as validated (trusted, approved by a human or the team).\",\n \"\",\n \"In autopilot mode, memories are validated automatically — you rarely need this.\",\n \"In manual mode, call this after reviewing a proposed memory to activate it.\",\n \"\",\n \"PARAMETERS:\",\n \" id — full memory id to approve\",\n \"\",\n \"RETURNS: { id, previous_status, new_status: 'validated' }\",\n ].join(\"\\n\"),\n MemApproveInputSchema,\n async (input: MemApproveInput) => jsonResult(await memApprove(input, context)),\n );\n\n registerTool(\n \"mem_reject\",\n [\n \"Mark a memory as rejected and record a reason.\",\n \"\",\n \"USE WHEN a memory is factually wrong, outdated, or not useful.\",\n \"Rejection blocks auto-promotion and lowers the memory's trust signal.\",\n \"Rejected memories are excluded from get_briefing by default.\",\n \"\",\n \"PARAMETERS:\",\n \" id — full memory id to reject\",\n \" reason — why this memory is being rejected (stored in frontmatter)\",\n \"\",\n \"RETURNS: { id, previous_status, new_status: 'rejected' }\",\n ].join(\"\\n\"),\n MemRejectInputSchema,\n async (input: MemRejectInput) => jsonResult(await memReject(input, context)),\n );\n\n registerTool(\n \"mem_feedback\",\n [\n \"Record whether a memory actually HELPED — the closed-loop utility signal.\",\n \"\",\n \"USE right after a memory changed (or failed to change) what you did:\",\n \" - outcome='applied' → the memory steered your work (strong positive signal)\",\n \" - outcome='rejected' → it was wrong/outdated/unhelpful (negative signal)\",\n \"\",\n \"A read only means a memory was surfaced; 'applied' means it demonstrably helped.\",\n \"This powers `haive memory impact` (impact tiers + prune candidates) and future ranking.\",\n \"\",\n \"PARAMETERS:\",\n \" id — full memory id the feedback is about\",\n \" outcome — 'applied' | 'rejected'\",\n \" reason — why it was rejected (optional, stored on the usage record)\",\n \"\",\n \"RETURNS: { ok, id, outcome, usage:{read_count,applied_count,rejected_count}, impact:{score,tier,signals} }\",\n ].join(\"\\n\"),\n MemFeedbackInputSchema,\n async (input: MemFeedbackInput) => jsonResult(await memFeedback(input, context)),\n );\n\n registerTool(\n \"mem_pending\",\n [\n \"List memories in 'proposed' status awaiting review, sorted by read count.\",\n \"\",\n \"USE IN MANUAL MODE to see what memories are waiting for human review.\",\n \"In autopilot mode, proposed memories auto-approve after 72h.\",\n \"\",\n \"High read_count on a proposed memory = many agents found it useful without\",\n \"rejecting it = strong signal to approve.\",\n \"\",\n \"RETURNS: array of { id, type, scope, read_count, created_at, body_preview }\",\n ].join(\"\\n\"),\n MemPendingInputSchema,\n async (input: MemPendingInput) => jsonResult(await memPending(input, context)),\n );\n\n registerTool(\n \"mem_delete\",\n [\n \"Permanently delete a memory by id.\",\n \"\",\n \"USE WITH CAUTION — prefer mem_reject for outdated memories (preserves history).\",\n \"Use delete only for accidentally created memories or duplicates.\",\n \"\",\n \"PARAMETERS:\",\n \" id — full memory id to delete\",\n \" delete_usage — also delete usage stats (default: true)\",\n \"\",\n \"RETURNS: { deleted: true, id }\",\n ].join(\"\\n\"),\n MemDeleteInputSchema,\n async (input: MemDeleteInput) => jsonResult(await memDelete(input, context)),\n );\n\n // ── v0.5.0: granular alternatives to get_briefing ─────────────────────\n // Use these when you don't need the full one-shot briefing payload.\n\n registerTool(\n \"get_recap\",\n [\n \"Return ONLY the most recent session_recap. Cheaper than get_briefing when\",\n \"you just want to know 'what was I doing last time?' and don't need project\",\n \"context, modules, or memory ranking.\",\n \"\",\n \"PARAMETERS:\",\n \" scope — 'personal' | 'team' | 'any' (default 'any', returns the most recent across both)\",\n \"\",\n \"RETURNS: { recap: { id, scope, revision_count, created_at, body } | null, notice? }\",\n ].join(\"\\n\"),\n GetRecapInputSchema,\n async (input: GetRecapInput) => {\n tracker.record(\"get_recap\", input.scope);\n return jsonResult(await getRecap(input, context));\n },\n );\n\n registerTool(\n \"mem_relevant_to\",\n [\n \"One-shot ranked memories for a task — use instead of get_briefing when\",\n \"project context is already loaded and you only want the relevant memory layer.\",\n \"\",\n \"Second step in progressive disclosure (after get_briefing): narrow here, then mem_get for full text.\",\n \"\",\n \"Reuses the same ranking pipeline (anchor / module / literal / semantic) but\",\n \"skips project_context, modules, action_required, etc.\",\n \"\",\n \"PARAMETERS:\",\n \" task — 1–2 sentences describing what you are about to do (required)\",\n \" files — files you'll edit (surfaces anchored memories)\",\n \" limit — cap on returned memories (default 8)\",\n \" min_semantic_score — drop weak semantic hits below this cosine (default 0.25)\",\n \" format — 'full' | 'compact' | 'actions' (inherits get_briefing memory framing)\",\n \"\",\n \"RETURNS: { task, search_mode, memories: [...], hints?: [...], empty?: true }\",\n ].join(\"\\n\"),\n MemRelevantToInputSchema,\n async (input: MemRelevantToInput) => {\n tracker.record(\"mem_relevant_to\", input.task.slice(0, 80));\n return jsonResult(await memRelevantTo(input, context));\n },\n );\n\n // ── v0.5.0: code semantic search ──────────────────────────────────────\n\n registerTool(\n \"code_search\",\n [\n \"Semantic search over the codebase — finds exported symbols (functions, classes,\",\n \"interfaces) related to a natural-language query. Replaces blind grep when you\",\n \"don't know the exact symbol name.\",\n \"\",\n \"Requires `haive index code-search` to have been run (builds embeddings for every\",\n \"exported symbol from the code-map). Falls back to a notice when index is missing.\",\n \"\",\n \"PARAMETERS:\",\n \" query — natural language (e.g. 'function that hashes passwords', 'JWT signing')\",\n \" k — number of top hits (default 5)\",\n \" min_score — minimum cosine similarity (default 0.2; try 0.3+ for stricter)\",\n \"\",\n \"RETURNS: { available: bool, hits: [{ file, name, kind, line, description?, score }] }\",\n ].join(\"\\n\"),\n CodeSearchInputSchema,\n async (input: CodeSearchInput) => {\n tracker.record(\"code_search\", input.query.slice(0, 80));\n return jsonResult(await codeSearch(input, context));\n },\n );\n\n // ── v0.5.0: file-context lookup ───────────────────────────────────────\n\n registerTool(\n \"why_this_file\",\n [\n \"One-shot file-context lookup: combines recent git history, memories anchored\",\n \"to the path, and the code-map entry. Answers 'why is this file the way it is?'\",\n \"in a single call instead of 3-4 manual ones.\",\n \"\",\n \"PARAMETERS:\",\n \" path — project-relative path (required)\",\n \" git_log_limit — recent commits to include (default 5)\",\n \" memory_limit — anchored memories cap (default 5)\",\n \"\",\n \"RETURNS: { file, exists, recent_commits: [...], memories: [...], code_map_entry, hints? }\",\n ].join(\"\\n\"),\n WhyThisFileInputSchema,\n async (input: WhyThisFileInput) => {\n tracker.record(\"why_this_file\", input.path);\n return jsonResult(await whyThisFile(input, context));\n },\n );\n\n // ── v0.5.0: anti-patterns check ───────────────────────────────────────\n\n registerTool(\n \"anti_patterns_check\",\n [\n \"Scan a diff (or set of paths) against documented attempt/gotcha memories.\",\n \"[Diff-scan layer: the MEMORY-MATCH component. `pre_commit_check` combines this with sensors + stale checks; `haive enforce check` is the gate.]\",\n \"Surfaces 'you are about to repeat a known mistake' warnings BEFORE you commit.\",\n \"\",\n \"USE BEFORE finalizing a non-trivial change. Cheap and high-signal: the only\",\n \"memories scanned are 'attempt' and 'gotcha' types.\",\n \"\",\n \"PARAMETERS:\",\n \" diff — raw unified diff text (or any code snippet) — optional if `paths` provided\",\n \" paths — affected file paths (optional if `diff` provided)\",\n \" limit — cap on returned warnings (default 8)\",\n \" semantic — also use semantic search (default true; requires embeddings index)\",\n \"\",\n \"RETURNS: { scanned, warnings: [{ id, type, scope, confidence, body_preview, reasons, semantic_score? }] }\",\n ].join(\"\\n\"),\n AntiPatternsCheckInputSchema,\n async (input: AntiPatternsCheckInput) => {\n tracker.record(\"anti_patterns_check\", input.paths.join(\",\").slice(0, 80));\n return jsonResult(await antiPatternsCheck(input, context));\n },\n );\n\n // ── v0.6.0 additions ───────────────────────────────────────────────────\n\n registerTool(\n \"mem_distill\",\n [\n \"Cluster recurring observations / failed attempts so a human can collapse\",\n \"N similar memories into one richer convention/gotcha. Cheap heuristic\",\n \"(anchor path overlap + body keyword overlap) — no embeddings required.\",\n \"\",\n \"USE periodically (e.g. monthly) to prevent memory pollution from agents\",\n \"saving the same observation many times.\",\n \"\",\n \"PARAMETERS:\",\n \" since_days — only consider memories from the last N days (default 30)\",\n \" min_cluster — minimum cluster size to surface (default 3)\",\n \" type_filter — 'gotcha' | 'attempt' | 'all' (default 'gotcha')\",\n \" scope — 'personal' | 'team' | 'module' | 'any' (default 'any')\",\n \"\",\n \"RETURNS: { scanned, singletons, clusters: [{ suggested_topic, member_ids, ... }] }\",\n \"Output is advisory — nothing is written to disk.\",\n ].join(\"\\n\"),\n MemDistillInputSchema,\n async (input: MemDistillInput) => {\n tracker.record(\"mem_distill\", `${input.type_filter}/since=${input.since_days}d`);\n return jsonResult(await memDistill(input, context));\n },\n );\n\n registerTool(\n \"why_this_decision\",\n [\n \"Trace the genealogy of a memory (especially decision/architecture):\",\n \"the memory itself + memories explicitly linked via related_ids + memories\",\n \"anchored to overlapping paths + recent commits touching those paths.\",\n \"\",\n \"USE WHEN you find a memory and need to understand WHY it was made and\",\n \"what surrounds it. One call instead of 4-5 manual lookups.\",\n \"\",\n \"PARAMETERS:\",\n \" id — memory id (required)\",\n \" git_log_limit — how many recent commits per anchor path (default 5)\",\n \"\",\n \"RETURNS: { decision, related: [...], path_neighbors: [...], recent_commits: [...] }\",\n ].join(\"\\n\"),\n WhyThisDecisionInputSchema,\n async (input: WhyThisDecisionInput) => {\n tracker.record(\"why_this_decision\", input.id);\n return jsonResult(await whyThisDecision(input, context));\n },\n );\n\n registerTool(\n \"mem_conflicts_with\",\n [\n \"Detect memories that potentially CONTRADICT a given memory.\",\n \"\",\n \"USE BEFORE relying on a memory's advice — surfaces 'another memory says\",\n \"the opposite'. Detection uses several heuristics layered together:\",\n \"\",\n \" 1. Opposite status — validated vs rejected on overlapping topic\",\n \" 2. attempt-vs-convention on overlapping anchor paths\",\n \" 3. Polarity keywords — 'use X' vs 'do not use X' among semantic neighbors\",\n \" 4. Explicit #contradicts:<id> tags in either body\",\n \"\",\n \"PARAMETERS:\",\n \" id — memory id to check (required)\",\n \" min_score — minimum cosine similarity for semantic neighbors (default 0.5)\",\n \" semantic — use embeddings (default true)\",\n \"\",\n \"RETURNS: { found, target, scanned, conflicts: [{ id, reasons, similarity, ... }] }\",\n ].join(\"\\n\"),\n MemConflictsInputSchema,\n async (input: MemConflictsInput) => {\n tracker.record(\"mem_conflicts_with\", input.id);\n return jsonResult(await memConflicts(input, context));\n },\n );\n\n registerTool(\n \"mem_conflict_candidates\",\n [\n \"Bulk scan for conflict CANDIDATES (not proof):\",\n \"\",\n \" 1. Lexical similarity (Jaccard) on decision/architecture-like pairs\",\n \" 2. Same frontmatter.topic with validated vs rejected — quick human-review signal\",\n \"\",\n \"Advisory only — follow with mem_conflicts_with on specific ids.\",\n \"\",\n \"PARAMETERS:\",\n \" since_days, types, min_jaccard, max_pairs, max_scan, max_topic_pairs\",\n \"\",\n \"RETURNS: { pairs, topic_status_pairs, scanned, truncated, notice? }\",\n ].join(\"\\n\"),\n MemConflictCandidatesInputSchema,\n async (input: MemConflictCandidatesInput) => {\n tracker.record(\"mem_conflict_candidates\", `${input.since_days}d`);\n return jsonResult(await memConflictCandidates(input, context));\n },\n );\n\n registerTool(\n \"runtime_journal_append\",\n [\n \"Append one line to `.ai/.runtime/session-journal.ndjson` — machine-local session continuity.\",\n \"\",\n \"Does NOT replace team memories; complements mem_session_end recaps for local traces.\",\n \"\",\n \"PARAMETERS: message, kind (note|session_end|mcp), optional tool\",\n \"\",\n \"RETURNS: { ok, path_hint }\",\n ].join(\"\\n\"),\n RuntimeJournalAppendInputSchema,\n async (input: RuntimeJournalAppendInput) =>\n jsonResult(await runtimeJournalAppend(input, context)),\n );\n\n registerTool(\n \"runtime_journal_tail\",\n [\n \"Read the last N entries from the runtime session journal (parsed JSON lines).\",\n \"\",\n \"PARAMETERS: limit (default 30, max 500)\",\n \"\",\n \"RETURNS: { entries: [...], empty?: true }\",\n ].join(\"\\n\"),\n RuntimeJournalTailInputSchema,\n async (input: RuntimeJournalTailInput) =>\n jsonResult(await runtimeJournalTail(input, context)),\n );\n\n registerTool(\n \"pre_commit_check\",\n [\n \"One-shot 'should I block this commit?' check. Combines three signals:\",\n \"[Diff-scan layer: the COMBINED check (sensors + anti-patterns + stale). `haive enforce check` is the gate that runs this at commit time.]\",\n \"\",\n \" 1. anti_patterns_check — known gotchas/attempts that match the diff\",\n \" 2. mem_for_files — conventions/decisions anchored to touched files\",\n \" 3. mem_verify — memories whose anchors are stale (knowledge may be wrong)\",\n \"\",\n \"USE FROM A GIT HOOK or before finalizing a non-trivial change.\",\n \"\",\n \"PARAMETERS:\",\n \" diff — raw unified diff text (e.g. `git diff --cached`)\",\n \" paths — affected file paths (project-relative)\",\n \" block_on — 'any' | 'high-confidence' (default) | 'never'\",\n \" semantic — use embeddings in anti_patterns_check (default true)\",\n \"\",\n \"RETURNS: { should_block, summary, warnings, relevant_memories, stale_anchors }\",\n ].join(\"\\n\"),\n PreCommitCheckInputSchema,\n async (input: PreCommitCheckInput) => {\n tracker.record(\"pre_commit_check\", `${input.paths.length}p`);\n return jsonResult(await preCommitCheck(input, context));\n },\n );\n\n registerTool(\n \"pattern_detect\",\n [\n \"Heuristic memory detector — finds knowledge worth saving WITHOUT calling an LLM.\",\n \"\",\n \"Runs three signals over local git history and the tool-usage log:\",\n \" 1. CONFIG_CHANGE — config files modified recently (tsconfig, eslint, prettier, …)\",\n \" → proposes a convention memory with the git diff as body.\",\n \" 2. REPEATED_PATH — same file appears ≥3× in mem_tried/mem_observe events\",\n \" → proposes a gotcha memory anchored to that path.\",\n \" 3. HOT_FILE — source file referenced ≥3× in writing-tool events\",\n \" → proposes a convention memory (frequent edits = pattern emerging).\",\n \"\",\n \"Saves memories with status='proposed'. They feed into auto-promote (Phase 4)\",\n \"or are surfaced in the next post_task distillation for LLM review.\",\n \"\",\n \"USE periodically (e.g. end of sprint) or trigger from post-commit hook.\",\n \"\",\n \"PARAMETERS:\",\n \" since_days — look-back window in days (default 7)\",\n \" dry_run — report matches without saving (default false)\",\n \" scope — 'team' (default) | 'personal'\",\n \"\",\n \"RETURNS: { scanned_events, matches: [{kind, signal, proposed_type, …}], saved, saved_ids }\",\n ].join(\"\\n\"),\n PatternDetectInputSchema,\n async (input: PatternDetectInput) => {\n tracker.record(\"pattern_detect\", `since=${input.since_days}d/dry_run=${input.dry_run}`);\n return jsonResult(await patternDetect(input, context));\n },\n );\n\n registerTool(\n \"mem_diff\",\n [\n \"Compare two memories side-by-side to decide if they should be merged.\",\n \"\",\n \"USE BEFORE merging or deduplicating similar memories.\",\n \"Shows: frontmatter fields that differ + lines unique to each body.\",\n \"\",\n \"PARAMETERS:\",\n \" id_a — first memory id\",\n \" id_b — second memory id\",\n \"\",\n \"RETURNS: { frontmatter_diff: {...}, body_only_in_a: [...], body_only_in_b: [...] }\",\n ].join(\"\\n\"),\n MemDiffInputSchema,\n async (input: MemDiffInput) => jsonResult(await memDiff(input, context)),\n );\n\n if (shouldRegisterPrompt(\"bootstrap_project\")) {\n server.prompt(\n \"bootstrap_project\",\n [\n \"Analyze the project codebase and write .ai/project-context.md — run once after haive init.\",\n \"The AI explores the directory structure, reads key files (package.json, README, config),\",\n \"identifies the tech stack, architectural patterns, key modules, and conventions,\",\n \"then persists everything via bootstrap_project_save.\",\n \"For multi-component projects, run with module param to create .ai/modules/<name>/context.md.\",\n ].join(\" \"),\n BootstrapProjectArgsSchema,\n (args: BootstrapProjectArgs) => bootstrapProjectPrompt(args, context),\n );\n }\n\n if (shouldRegisterPrompt(\"post_task\")) {\n server.prompt(\n \"post_task\",\n [\n \"⭐ Post-task reflection — run at the end of every session to capture what you learned:\",\n \"failed approaches (mem_tried), new conventions/decisions/gotchas (mem_save),\",\n \"code discoveries (mem_observe), and an end-of-session recap (mem_session_end).\",\n \"In autopilot mode a minimal recap saves automatically; calling this produces a richer one.\",\n ].join(\" \"),\n PostTaskArgsSchema,\n (args: PostTaskArgs) => postTaskPrompt(args, context),\n );\n }\n\n if (shouldRegisterPrompt(\"import_docs\")) {\n server.prompt(\n \"import_docs\",\n [\n \"Import knowledge from a document (README, ADR, wiki, API spec) as hAIve memories.\",\n \"Pass the full document content; the AI extracts up to 10 actionable memories\",\n \"(conventions, decisions, gotchas, architecture) and saves them via mem_save.\",\n \"Good candidates: ADRs, onboarding docs, runbooks, team wikis.\",\n ].join(\" \"),\n ImportDocsArgsSchema,\n (args: ImportDocsArgs) => importDocsPrompt(args, context),\n );\n }\n\n return { server, context, tracker };\n}\n\n// ── Stdio runtime (also invoked by `haive mcp --stdio` via bundled CLI) ─────\n\n/** Parse argv for the standalone haive-mcp binary / CLI subprocess parity. */\nexport function parseMcpCliArgs(argv: string[]): {\n root?: string;\n versionOnly: boolean;\n} {\n for (let i = 2; i < argv.length; i++) {\n const arg = argv[i];\n if (arg === \"--version\" || arg === \"-V\") {\n return { versionOnly: true };\n }\n }\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 { root: out.root, versionOnly: false };\n}\n\n/** Print MCP server version (same as haive CLI when bundled together). */\nexport function printHaiveMcpVersion(): void {\n console.log(SERVER_VERSION);\n}\n\n/**\n * Run the MCP server over stdio. Used by `haive-mcp` and by `haive mcp --stdio`\n * when the MCP implementation is bundled into the CLI.\n */\nexport async function runHaiveMcpStdio(options: { root?: string }): Promise<void> {\n const { server, context } = createHaiveServer({ root: options.root, env: process.env });\n console.error(\n `[haive-mcp] starting server v${SERVER_VERSION} (project root: ${context.paths.root})`,\n );\n await server.connect(new StdioServerTransport());\n}\n","import { findProjectRoot, resolveHaivePaths, type HaivePaths } from \"@hiveai/core\";\n\nexport interface HaiveContext {\n paths: HaivePaths;\n}\n\nexport interface CreateContextOptions {\n root?: string;\n env?: NodeJS.ProcessEnv;\n cwd?: string;\n}\n\nexport function createContext(options: CreateContextOptions = {}): HaiveContext {\n const env = options.env ?? process.env;\n const cwd = options.cwd ?? process.cwd();\n const root =\n options.root ??\n env.HAIVE_PROJECT_ROOT ??\n findProjectRoot(cwd);\n return { paths: resolveHaivePaths(root) };\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const BootstrapProjectSaveInputSchema = {\n content: z\n .string()\n .min(1)\n .describe(\"Full Markdown content for the project (or module) context file\"),\n module: z\n .string()\n .optional()\n .describe(\n \"If provided, save under .ai/modules/<module>/context.md instead of .ai/project-context.md\",\n ),\n overwrite: z\n .boolean()\n .default(false)\n .describe(\"Overwrite an existing file instead of failing\"),\n};\n\nexport type BootstrapProjectSaveInput = {\n [K in keyof typeof BootstrapProjectSaveInputSchema]: z.infer<\n (typeof BootstrapProjectSaveInputSchema)[K]\n >;\n};\n\nexport interface BootstrapProjectSaveOutput {\n file_path: string;\n action: \"created\" | \"overwritten\";\n}\n\nexport async function bootstrapProjectSave(\n input: BootstrapProjectSaveInput,\n ctx: HaiveContext,\n): Promise<BootstrapProjectSaveOutput> {\n const target = input.module\n ? path.join(ctx.paths.modulesContextDir, input.module, \"context.md\")\n : ctx.paths.projectContext;\n\n const exists = existsSync(target);\n if (exists && !input.overwrite) {\n throw new Error(\n `${target} already exists. Pass overwrite=true to replace it.`,\n );\n }\n\n await mkdir(path.dirname(target), { recursive: true });\n await writeFile(target, input.content, \"utf8\");\n\n return {\n file_path: target,\n action: exists ? \"overwritten\" : \"created\",\n };\n}\n","import { readFile, readdir } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const GetProjectContextInputSchema = {\n module: z\n .string()\n .optional()\n .describe(\"If provided, also include the matching module's context file\"),\n list_modules: z\n .boolean()\n .default(false)\n .describe(\"Return the list of available module context files\"),\n};\n\nexport type GetProjectContextInput = {\n [K in keyof typeof GetProjectContextInputSchema]: z.infer<\n (typeof GetProjectContextInputSchema)[K]\n >;\n};\n\nexport interface GetProjectContextOutput {\n root_context: string | null;\n module_context?: { name: string; content: string };\n available_modules?: string[];\n}\n\nexport async function getProjectContext(\n input: GetProjectContextInput,\n ctx: HaiveContext,\n): Promise<GetProjectContextOutput> {\n const out: GetProjectContextOutput = { root_context: null };\n\n if (existsSync(ctx.paths.projectContext)) {\n out.root_context = await readFile(ctx.paths.projectContext, \"utf8\");\n }\n\n if (input.module) {\n const modFile = path.join(ctx.paths.modulesContextDir, input.module, \"context.md\");\n if (existsSync(modFile)) {\n out.module_context = {\n name: input.module,\n content: await readFile(modFile, \"utf8\"),\n };\n }\n }\n\n if (input.list_modules) {\n out.available_modules = await listModules(ctx.paths.modulesContextDir);\n }\n\n return out;\n}\n\nasync function listModules(modulesDir: string): Promise<string[]> {\n if (!existsSync(modulesDir)) return [];\n const entries = await readdir(modulesDir, { withFileTypes: true });\n return entries.filter((e) => e.isDirectory()).map((e) => e.name).sort();\n}\n","import { existsSync } from \"node:fs\";\nimport { loadMemoriesFromDir } from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemListInputSchema = {\n scope: z.enum([\"personal\", \"team\", \"module\"]).optional(),\n type: z\n .enum([\"convention\", \"decision\", \"gotcha\", \"architecture\", \"glossary\"])\n .optional(),\n module: z.string().optional(),\n tag: z.string().optional(),\n status: z\n .enum([\"draft\", \"proposed\", \"validated\", \"deprecated\", \"stale\", \"rejected\"])\n .optional()\n .describe(\"Filter by a single status. Omit to return all statuses.\"),\n exclude_rejected: z\n .boolean()\n .default(false)\n .describe(\"When true, exclude memories with status=rejected from results.\"),\n include_body: z\n .boolean()\n .default(false)\n .describe(\"Include full body text. Default false to save tokens — use mem_get for a single memory's full content.\"),\n};\n\nexport type MemListInput = {\n [K in keyof typeof MemListInputSchema]: z.infer<(typeof MemListInputSchema)[K]>;\n};\n\nexport interface MemSummary {\n id: string;\n scope: string;\n type: string;\n module?: string;\n status: string;\n tags: string[];\n snippet: string;\n file_path: string;\n body?: string;\n}\n\nexport async function memList(\n input: MemListInput,\n ctx: HaiveContext,\n): Promise<{ memories: MemSummary[] }> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n return { memories: [] };\n }\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const filtered = all.filter(({ memory }) => {\n const fm = memory.frontmatter;\n if (input.scope && fm.scope !== input.scope) return false;\n if (input.type && fm.type !== input.type) return false;\n if (input.module && fm.module !== input.module) return false;\n if (input.tag && !fm.tags.includes(input.tag)) return false;\n if (input.status && fm.status !== input.status) return false;\n if (input.exclude_rejected && fm.status === \"rejected\") return false;\n return true;\n });\n const memories: MemSummary[] = filtered.map(({ memory, filePath }) => {\n const fm = memory.frontmatter;\n const snippet = memory.body.replace(/\\s+/g, \" \").trim().slice(0, 120);\n return {\n id: fm.id,\n scope: fm.scope,\n type: fm.type,\n ...(fm.module ? { module: fm.module } : {}),\n status: fm.status,\n tags: fm.tags,\n snippet,\n file_path: filePath,\n ...(input.include_body ? { body: memory.body } : {}),\n };\n });\n return { memories };\n}\n","import { createHash } from \"node:crypto\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport {\n buildFrontmatter,\n loadConfig,\n loadMemoriesFromDir,\n memoryFilePath,\n serializeMemory,\n suggestSensorFromMemory,\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\", \"skill\", \"attempt\", \"session_recap\"])\n .describe(\n \"Kind of memory being saved. \" +\n \"Use 'skill' for reusable procedures/playbooks agents should follow for recurring tasks (feedforward harness guide). \" +\n \"Use 'attempt' for failed approaches (auto-validated). \" +\n \"Use 'session_recap' via mem_session_end instead.\",\n ),\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 .optional()\n .describe(\n \"Visibility scope: personal | team | module. \" +\n \"When omitted, falls back to defaultScope in haive.config.json (default: personal).\",\n ),\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 topic: z\n .string()\n .optional()\n .describe(\n \"Stable key for this memory. If a memory with the same topic already exists in this scope, \" +\n \"it is updated in-place (revision_count++). Use for knowledge that evolves over time.\",\n ),\n activation: z\n .object({\n keywords: z.array(z.string()).default([]),\n globs: z.array(z.string()).default([]),\n always: z.boolean().default(false),\n })\n .optional()\n .describe(\n \"Only for type='skill'. Progressive-disclosure triggers: the skill is surfaced ONLY when \" +\n \"a keyword matches the task or a glob matches the edited files (or always=true). Omit to keep \" +\n \"the skill always-eligible.\",\n ),\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 action: \"created\" | \"updated\";\n revision_count?: number;\n warning?: string;\n similar_found?: string[];\n /** High textual overlap with existing memory (same scope+type); consider merging instead. */\n body_similar?: { id: string; score: number };\n invalid_paths?: string[];\n suggested_sensor?: boolean;\n}\n\nfunction bodyHash(body: string): string {\n return createHash(\"sha256\").update(body.trim()).digest(\"hex\").slice(0, 12);\n}\n\nconst WORD_RE = /\\b[a-z0-9]{3,}\\b/gi;\n\nfunction bodyTokenSet(body: string): Set<string> {\n const raw = body.toLowerCase().match(WORD_RE) ?? [];\n return new Set(raw);\n}\n\n/** Jaccard similarity on alphanumeric tokens — warns when corpus has near-duplicate wording. */\nfunction maxBodySimilarity(\n incomingTokens: Set<string>,\n memories: Array<{ memory: { body: string; frontmatter: { scope: string; type: string; id: string; status?: string } } }>,\n scope: string,\n type: string,\n excludeIds?: ReadonlySet<string>,\n): { score: number; id: string } | null {\n if (incomingTokens.size < 6) return null;\n let best: { score: number; id: string } | null = null;\n const skip = excludeIds ?? new Set<string>();\n for (const { memory } of memories) {\n const fm = memory.frontmatter;\n if (skip.has(fm.id)) continue;\n if (fm.scope !== scope || fm.type !== type) continue;\n if (fm.status === \"rejected\" || fm.status === \"deprecated\") continue;\n const other = bodyTokenSet(memory.body);\n if (other.size === 0) continue;\n let inter = 0;\n for (const t of incomingTokens) if (other.has(t)) inter++;\n const uni = incomingTokens.size + other.size - inter;\n const j = uni === 0 ? 0 : inter / uni;\n if (j >= 0.72 && (!best || j > best.score)) best = { score: j, id: fm.id };\n }\n return best;\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 existing = existsSync(ctx.paths.memoriesDir)\n ? await loadMemoriesFromDir(ctx.paths.memoriesDir)\n : [];\n\n // ── Resolve scope once: explicit input wins over config default ────────\n // Must be computed early so dedup and topic-upsert use the same scope\n // that the new memory will ultimately be saved under.\n const haiveConfig = await loadConfig(ctx.paths);\n const resolvedScope = (\n input.scope ?? haiveConfig.defaultScope ?? \"personal\"\n ) as \"personal\" | \"team\" | \"module\";\n\n // ── Anchor path validation ─────────────────────────────────────────────\n const invalidPaths = input.paths.filter(\n (p) => !existsSync(path.resolve(ctx.paths.root, p)),\n );\n\n // ── Dedup by content hash ──────────────────────────────────────────────\n const incomingHash = bodyHash(input.body);\n const hashDuplicate = existing.find(({ memory }) =>\n bodyHash(memory.body) === incomingHash &&\n memory.frontmatter.scope === resolvedScope,\n );\n if (hashDuplicate) {\n throw new Error(\n `Duplicate content detected — identical body already saved as \"${hashDuplicate.memory.frontmatter.id}\". ` +\n `Use mem_update to modify it, or change the body to add new information.`,\n );\n }\n\n const incomingTokens = bodyTokenSet(input.body);\n\n function bodySimilarWarnings(excludeIds?: ReadonlySet<string>): {\n similarityWarning?: string;\n body_similar?: MemSaveOutput[\"body_similar\"];\n } {\n const dup = maxBodySimilarity(incomingTokens, existing, resolvedScope, input.type, excludeIds);\n if (!dup?.id) return {};\n const body_similar: MemSaveOutput[\"body_similar\"] = {\n id: dup.id,\n score: Math.round(dup.score * 100) / 100,\n };\n return {\n similarityWarning: `Body is ~${Math.round(dup.score * 100)}% similar (token overlap) to existing \"${dup.id}\" — consolidate if redundant.`,\n body_similar,\n };\n }\n\n // ── Topic upsert ───────────────────────────────────────────────────────\n if (input.topic) {\n const topicMatch = existing.find(({ memory }) =>\n memory.frontmatter.topic === input.topic &&\n memory.frontmatter.scope === resolvedScope &&\n (!input.module || memory.frontmatter.module === input.module),\n );\n\n if (topicMatch) {\n const fm = topicMatch.memory.frontmatter;\n const { similarityWarning: simW, body_similar: bs } = bodySimilarWarnings(new Set([fm.id]));\n const newFrontmatter = {\n ...fm,\n tags: input.tags.length ? input.tags : fm.tags,\n revision_count: (fm.revision_count ?? 0) + 1,\n anchor: {\n commit: input.commit ?? fm.anchor.commit,\n paths: input.paths.length ? input.paths : fm.anchor.paths,\n symbols: input.symbols.length ? input.symbols : fm.anchor.symbols,\n },\n };\n const suggestedSensor = !newFrontmatter.sensor\n ? suggestSensorForSavedMemory(input.type, input.body, newFrontmatter.anchor.paths)\n : null;\n if (suggestedSensor) newFrontmatter.sensor = suggestedSensor;\n await writeFile(\n topicMatch.filePath,\n serializeMemory({ frontmatter: newFrontmatter, body: input.body }),\n \"utf8\",\n );\n const mergedTw = [\n invalidPaths.length > 0\n ? `Anchor path(s) not found in project: ${invalidPaths.join(\", \")}. They will be marked stale by haive sync.`\n : null,\n criticalAnchorWarning(input.type, fm.status, newFrontmatter.anchor.paths, newFrontmatter.anchor.symbols),\n simW ?? null,\n ]\n .filter(Boolean)\n .join(\" — \") || undefined;\n\n return {\n id: fm.id,\n scope: fm.scope,\n file_path: topicMatch.filePath,\n action: \"updated\",\n revision_count: newFrontmatter.revision_count,\n ...(mergedTw ? { warning: mergedTw } : {}),\n ...(bs ? { body_similar: bs } : {}),\n ...(invalidPaths.length > 0 ? { invalid_paths: invalidPaths } : {}),\n ...(suggestedSensor ? { suggested_sensor: true } : {}),\n };\n }\n }\n\n // ── Create new memory ──────────────────────────────────────────────────\n // resolvedScope and haiveConfig are already computed above.\n\n const frontmatter = buildFrontmatter({\n type: input.type,\n slug: input.slug,\n scope: resolvedScope,\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 topic: input.topic,\n status: haiveConfig.defaultStatus === \"validated\" ? \"validated\" : undefined,\n sensor: suggestSensorForSavedMemory(input.type, input.body, input.paths) ?? undefined,\n activation: input.type === \"skill\" ? input.activation : undefined,\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 // ── Similar slug detection (warn but don't block) ──────────────────────\n let warning: string | undefined;\n let similar_found: string[] | undefined;\n if (existing.length > 0) {\n const slugTokens = input.slug.toLowerCase().split(/[-_\\s]+/).filter(Boolean);\n const similar = existing.filter(({ memory }) => {\n const id = memory.frontmatter.id.toLowerCase();\n return (\n slugTokens.length >= 2 &&\n slugTokens.filter((t) => id.includes(t)).length >= Math.ceil(slugTokens.length * 0.6)\n );\n });\n if (similar.length > 0) {\n similar_found = similar.map((m) => m.memory.frontmatter.id);\n warning = `Possible duplicate: similar memories already exist (${similar_found.join(\", \")}). Consider updating one of these instead.`;\n }\n }\n\n await writeFile(file, serializeMemory({ frontmatter, body: input.body }), \"utf8\");\n\n const { similarityWarning: simWarnNew, body_similar: bsNew } = bodySimilarWarnings();\n\n // Merge warnings: invalid anchors + slug similarity + body similarity\n const finalWarning = [\n invalidPaths.length > 0\n ? `Anchor path(s) not found in project: ${invalidPaths.join(\", \")}. They will be marked stale by \\`haive sync\\`.`\n : null,\n criticalAnchorWarning(frontmatter.type, frontmatter.status, frontmatter.anchor.paths, frontmatter.anchor.symbols),\n warning ?? null,\n simWarnNew ?? null,\n ].filter(Boolean).join(\" — \") || undefined;\n\n return {\n id: frontmatter.id,\n scope: frontmatter.scope,\n file_path: file,\n action: \"created\",\n ...(finalWarning ? { warning: finalWarning } : {}),\n ...(similar_found ? { similar_found } : {}),\n ...(bsNew ? { body_similar: bsNew } : {}),\n ...(invalidPaths.length > 0 ? { invalid_paths: invalidPaths } : {}),\n ...(frontmatter.sensor?.autogen ? { suggested_sensor: true } : {}),\n };\n}\n\nfunction suggestSensorForSavedMemory(\n type: string,\n body: string,\n paths: string[],\n) {\n if (type !== \"gotcha\" && type !== \"attempt\") return null;\n return suggestSensorFromMemory(body, paths);\n}\n\nfunction criticalAnchorWarning(\n type: string,\n status: string,\n paths: string[],\n symbols: string[],\n): string | null {\n if (![\"decision\", \"gotcha\", \"architecture\"].includes(type)) return null;\n if (status !== \"validated\") return null;\n if (paths.length > 0 || symbols.length > 0) return null;\n return `${type} is validated without paths or symbols; add anchors so hAIve can detect drift.`;\n}\n","import { existsSync } from \"node:fs\";\nimport {\n deriveConfidence,\n extractSnippet,\n getUsage,\n literalMatchesAllTokens,\n literalMatchesAnyToken,\n loadMemoriesFromDir,\n loadUsageIndex,\n pickSnippetNeedle,\n rankMemoriesLexical,\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\", \"attempt\", \"session_recap\"])\n .optional()\n .describe(\"Restrict results to a memory type. session_recap is excluded by default — use type='session_recap' to include them.\"),\n include_session_recap: z\n .boolean()\n .default(false)\n .describe(\"Include session_recap memories in search results (excluded by default — they surface in get_briefing as last_session).\"),\n module: z.string().optional().describe(\"Restrict results to a module\"),\n status: z\n .enum([\"draft\", \"proposed\", \"validated\", \"deprecated\", \"stale\", \"rejected\"])\n .optional()\n .describe(\"Filter by a single status. Omit to return all statuses.\"),\n exclude_rejected: z\n .boolean()\n .default(false)\n .describe(\"When true, exclude memories with status=rejected from results.\"),\n limit: z.number().int().positive().max(100).default(20).describe(\"Max results\"),\n semantic: z\n .boolean()\n .default(false)\n .describe(\n \"Use semantic similarity from the embeddings index (requires `haive embeddings index`).\",\n ),\n lexical_rank: z\n .boolean()\n .default(false)\n .describe(\n \"When true (and semantic is false), rank the filtered corpus with Okapi-BM25-style lexical scoring instead of literal AND/OR. Helps phrase-like queries without embeddings.\",\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\n/** session_recap memories are surfaced separately via get_briefing.last_session — not in search results by default. */\nfunction isSessionRecap(fm: { type: string }): boolean {\n return fm.type === \"session_recap\";\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\" | \"lexical_ranked\";\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 if (input.lexical_rank && input.query.trim()) {\n const { ranked, scores } = rankMemoriesLexical(\n filtered,\n input.query,\n input.limit,\n );\n if (ranked.length > 0) {\n const snippetNeedle = pickSnippetNeedle(input.query);\n result = {\n matches: ranked.map((loaded, i) =>\n lexicalHit(loaded, snippetNeedle, usage, scores[i]!),\n ),\n total: ranked.length,\n mode: \"lexical_ranked\",\n };\n } else {\n result = {\n ...buildLiteralResult(input, filtered, usage),\n notice: \"Lexical ranking found no BM25-positive hits — showing literal matches instead.\",\n };\n }\n } else {\n result = buildLiteralResult(input, filtered, usage);\n }\n\n if (input.track && result.matches.length > 0) {\n await trackReads(\n ctx.paths,\n result.matches.map((m) => m.id),\n );\n }\n\n return result;\n}\n\nfunction passesFilters(\n fm: LoadedMemory[\"memory\"][\"frontmatter\"],\n input: MemSearchInput,\n): boolean {\n if (input.scope && fm.scope !== input.scope) return false;\n if (input.type && fm.type !== input.type) return false;\n if (input.module && fm.module !== input.module) return false;\n if (input.status && fm.status !== input.status) return false;\n if (input.exclude_rejected && fm.status === \"rejected\") return false;\n // session_recap memories surface via get_briefing.last_session — exclude unless explicitly requested\n if (!input.include_session_recap && isSessionRecap(fm)) 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\"; notice?: string } {\n const tokens = tokenizeQuery(input.query);\n const snippetNeedle = pickSnippetNeedle(input.query);\n\n let andMatched = filtered.filter(({ memory }) => literalMatchesAllTokens(memory, tokens));\n if (andMatched.length > 0) {\n const top = andMatched.slice(0, input.limit);\n return {\n matches: top.map((loaded) => toHit(loaded, snippetNeedle, usage)),\n total: andMatched.length,\n mode: \"literal\",\n };\n }\n\n // AND returned nothing — fall back to OR (any token)\n const orMatched = filtered.filter(({ memory }) => literalMatchesAnyToken(memory, tokens));\n const top = orMatched.slice(0, input.limit);\n return {\n matches: top.map((loaded) => toHit(loaded, snippetNeedle, usage)),\n total: orMatched.length,\n mode: \"literal\",\n notice: `No exact match for all tokens. Showing partial matches (OR fallback) — ${orMatched.length} result${orMatched.length === 1 ? \"\" : \"s\"}.`,\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\nfunction lexicalHit(\n loaded: LoadedMemory,\n needle: string,\n usage: UsageIndex,\n lexicalScore: number,\n): MemSearchHit {\n return { ...toHit(loaded, needle, usage), score: lexicalScore };\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 possible_renames?: string[];\n status_after: string;\n skipped?: boolean;\n}\n\nexport interface MemVerifyOutput {\n results: MemVerifyHit[];\n summary: {\n checked: number;\n fresh: number;\n stale: number;\n anchorless_skipped: number;\n updated: number;\n };\n}\n\nexport async function memVerify(\n input: MemVerifyInput,\n ctx: HaiveContext,\n): Promise<MemVerifyOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n return {\n results: [],\n summary: { checked: 0, fresh: 0, stale: 0, anchorless_skipped: 0, updated: 0 },\n };\n }\n\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const targets = input.id\n ? all.filter((m) => m.memory.frontmatter.id === input.id)\n : all;\n\n const results: MemVerifyHit[] = [];\n let fresh = 0;\n let stale = 0;\n let anchorless = 0;\n let updated = 0;\n\n for (const { memory, filePath } of targets) {\n // session_recap records historical context — anchor staleness does not apply\n if (memory.frontmatter.type === \"session_recap\") {\n anchorless++;\n results.push({\n id: memory.frontmatter.id,\n file_path: filePath,\n stale: false,\n reason: null,\n status_after: memory.frontmatter.status,\n skipped: true,\n });\n continue;\n }\n const isAnchored =\n memory.frontmatter.anchor.paths.length > 0 ||\n memory.frontmatter.anchor.symbols.length > 0;\n if (!isAnchored) {\n anchorless++;\n results.push({\n id: memory.frontmatter.id,\n file_path: filePath,\n stale: false,\n reason: null,\n status_after: memory.frontmatter.status,\n skipped: true,\n });\n continue;\n }\n const result = await verifyAnchor(memory, { projectRoot: ctx.paths.root });\n if (result.stale) stale++;\n else fresh++;\n\n let statusAfter = memory.frontmatter.status;\n if (input.update) {\n const next = applyVerification(memory, result);\n await writeFile(filePath, serializeMemory(next), \"utf8\");\n statusAfter = next.frontmatter.status;\n updated++;\n }\n\n results.push({\n id: memory.frontmatter.id,\n file_path: filePath,\n stale: result.stale,\n reason: result.reason,\n ...(result.possibleRenames.length > 0 ? { possible_renames: result.possibleRenames } : {}),\n status_after: statusAfter,\n });\n }\n\n return {\n results,\n summary: {\n checked: results.length + anchorless,\n fresh,\n stale,\n anchorless_skipped: anchorless,\n updated,\n },\n };\n}\n\nfunction applyVerification(\n mem: Memory,\n result: { stale: boolean; reason: string | null },\n): Memory {\n const verifiedAt = new Date().toISOString();\n if (result.stale) {\n return {\n frontmatter: {\n ...mem.frontmatter,\n status: \"stale\",\n verified_at: verifiedAt,\n stale_reason: result.reason,\n },\n body: mem.body,\n };\n }\n const nextStatus =\n mem.frontmatter.status === \"stale\" || mem.frontmatter.status === \"draft\"\n ? \"validated\"\n : mem.frontmatter.status;\n return {\n frontmatter: {\n ...mem.frontmatter,\n status: nextStatus,\n verified_at: verifiedAt,\n stale_reason: null,\n },\n body: mem.body,\n };\n}\n","import { writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport {\n loadMemoriesFromDir,\n loadUsageIndex,\n recordRejection,\n saveUsageIndex,\n serializeMemory,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemRejectInputSchema = {\n id: z.string().min(1).describe(\"Memory id being rejected\"),\n reason: z\n .string()\n .optional()\n .describe(\"Why this memory is being rejected (recorded for review)\"),\n};\n\nexport type MemRejectInput = {\n [K in keyof typeof MemRejectInputSchema]: z.infer<(typeof MemRejectInputSchema)[K]>;\n};\n\nexport interface MemRejectOutput {\n id: string;\n status: string;\n rejected_count: number;\n last_rejected_at: string | null;\n rejection_reason: string | null;\n}\n\nexport async function memReject(\n input: MemRejectInput,\n ctx: HaiveContext,\n): Promise<MemRejectOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n throw new Error(`No .ai/memories at ${ctx.paths.root}.`);\n }\n\n const memories = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const loaded = memories.find((m) => m.memory.frontmatter.id === input.id);\n if (!loaded) throw new Error(`No memory with id \"${input.id}\".`);\n\n // Write rejected status and reason to disk\n await writeFile(\n loaded.filePath,\n serializeMemory({\n frontmatter: {\n ...loaded.memory.frontmatter,\n status: \"rejected\",\n stale_reason: input.reason ?? loaded.memory.frontmatter.stale_reason ?? null,\n },\n body: loaded.memory.body,\n }),\n \"utf8\",\n );\n\n const idx = await loadUsageIndex(ctx.paths);\n recordRejection(idx, input.id, input.reason ?? null);\n await saveUsageIndex(ctx.paths, idx);\n const u = idx.by_id[input.id];\n return {\n id: input.id,\n status: \"rejected\",\n rejected_count: u?.rejected_count ?? 0,\n last_rejected_at: u?.last_rejected_at ?? null,\n rejection_reason: u?.rejection_reason ?? null,\n };\n}\n","import {\n applyFeedbackAdjustment,\n computeImpact,\n getUsage,\n loadMemoriesFromDir,\n loadUsageIndex,\n recordApplied,\n recordRejection,\n recommendFeedbackAdjustment,\n saveUsageIndex,\n serializeMemory,\n type ImpactTier,\n type FeedbackAdjustment,\n} from \"@hiveai/core\";\nimport { existsSync } from \"node:fs\";\nimport { writeFile } from \"node:fs/promises\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemFeedbackInputSchema = {\n id: z.string().min(1).describe(\"Full memory id the feedback is about\"),\n outcome: z\n .enum([\"applied\", \"rejected\"])\n .describe(\n \"'applied' = this memory changed what you did (strong positive utility signal); \" +\n \"'rejected' = it was wrong/outdated/unhelpful (negative signal, blocks auto-promotion).\",\n ),\n reason: z\n .string()\n .optional()\n .describe(\"Why it was rejected (stored on the memory's usage record). Only used for outcome='rejected'.\"),\n};\n\nexport type MemFeedbackInput = {\n [K in keyof typeof MemFeedbackInputSchema]: z.infer<(typeof MemFeedbackInputSchema)[K]>;\n};\n\nexport interface MemFeedbackOutput {\n ok: boolean;\n id: string;\n outcome?: \"applied\" | \"rejected\";\n error?: string;\n usage?: {\n read_count: number;\n applied_count: number;\n rejected_count: number;\n };\n impact?: {\n score: number;\n tier: ImpactTier;\n signals: string[];\n };\n feedback_adjustment?: FeedbackAdjustment;\n}\n\n/**\n * Record a closed-loop utility outcome for a memory. This is what turns hAIve's\n * memory store from a passive index into a learning system: agents report whether\n * a surfaced memory actually steered their work, and that feeds impact scoring\n * (`haive memory impact`) and future pruning/ranking.\n */\nexport async function memFeedback(\n input: MemFeedbackInput,\n ctx: HaiveContext,\n): Promise<MemFeedbackOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n return { ok: false, id: input.id, error: \"No .ai/memories — run `haive init` first.\" };\n }\n\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const target = all.find((m) => m.memory.frontmatter.id === input.id);\n if (!target) {\n return { ok: false, id: input.id, error: `No memory with id '${input.id}'.` };\n }\n\n const index = await loadUsageIndex(ctx.paths);\n if (input.outcome === \"applied\") {\n recordApplied(index, input.id);\n } else {\n recordRejection(index, input.id, input.reason ?? null);\n }\n await saveUsageIndex(ctx.paths, index);\n\n const usage = getUsage(index, input.id);\n const adjustment = input.outcome === \"rejected\"\n ? recommendFeedbackAdjustment(target.memory.frontmatter, usage)\n : { action: \"none\" as const, reason: \"No automatic adjustment needed.\" };\n const adjustedFrontmatter = applyFeedbackAdjustment(target.memory.frontmatter, adjustment);\n if (adjustedFrontmatter !== target.memory.frontmatter) {\n target.memory.frontmatter = adjustedFrontmatter;\n await writeFile(target.filePath, serializeMemory(target.memory), \"utf8\");\n }\n const impact = computeImpact(target.memory.frontmatter, usage);\n\n return {\n ok: true,\n id: input.id,\n outcome: input.outcome,\n usage: {\n read_count: usage.read_count,\n applied_count: usage.applied_count,\n rejected_count: usage.rejected_count,\n },\n impact: { score: impact.score, tier: impact.tier, signals: impact.signals },\n feedback_adjustment: adjustment,\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 /** Anchor paths recorded in the memory frontmatter — used by pre_commit_check to scope stale warnings. */\n anchor_paths: string[];\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 // session_recap surfaces in get_briefing.last_session — skip here\n if (loaded.memory.frontmatter.type === \"session_recap\") continue;\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 // Extract meaningful path segments from input files for tag matching\n const pathSegments = extractPathSegments(input.files);\n\n for (const loaded of all) {\n if (seen.has(loaded.memory.frontmatter.id)) continue;\n if (loaded.memory.frontmatter.type === \"session_recap\") 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 fm.tags.some((t) => {\n const tl = t.toLowerCase();\n return pathSegments.has(tl) || pathSegments.has(tl.replace(/[-_]/g, \"\"));\n });\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 if (loaded.memory.frontmatter.type === \"session_recap\") 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 anchor_paths: fm.anchor.paths,\n file_path: loaded.filePath,\n body: loaded.memory.body,\n };\n}\n\n/**\n * Extract lowercase path segments from file paths that are likely domain/module names.\n * Filters out generic segments like src, main, java, com, org, test, etc.\n */\nfunction extractPathSegments(files: string[]): Set<string> {\n const GENERIC = new Set([\n \"src\", \"main\", \"java\", \"kotlin\", \"python\", \"go\", \"lib\", \"libs\",\n \"com\", \"org\", \"net\", \"io\", \"app\", \"apps\", \"pkg\", \"internal\",\n \"test\", \"tests\", \"spec\", \"specs\", \"impl\", \"domain\", \"shared\",\n \"resources\", \"static\", \"assets\", \"config\", \"configs\",\n ]);\n const out = new Set<string>();\n for (const file of files) {\n const parts = file.replace(/\\\\/g, \"/\").split(\"/\");\n for (const part of parts) {\n const seg = part.toLowerCase().replace(/\\.[^.]+$/, \"\"); // strip extension\n if (seg.length >= 3 && !GENERIC.has(seg) && /^[a-z]/.test(seg)) {\n out.add(seg);\n // Also split camelCase / kebab-case segments: mobilepayment → mobile, payment\n for (const sub of seg.split(/[-_]/).filter((s) => s.length >= 3)) {\n out.add(sub);\n }\n }\n }\n }\n return out;\n}\n\nasync function loadModuleContexts(\n ctx: HaiveContext,\n modules: string[],\n enabled: boolean,\n): Promise<Array<{ name: string; content: string }>> {\n if (!enabled || modules.length === 0) return [];\n if (!existsSync(ctx.paths.modulesContextDir)) return [];\n const available = new Set(\n (await readdir(ctx.paths.modulesContextDir, { withFileTypes: true }))\n .filter((d) => d.isDirectory())\n .map((d) => d.name),\n );\n const out: Array<{ name: string; content: string }> = [];\n for (const m of modules) {\n if (!available.has(m)) continue;\n const file = path.join(ctx.paths.modulesContextDir, m, \"context.md\");\n if (existsSync(file)) {\n out.push({ name: m, content: await readFile(file, \"utf8\") });\n }\n }\n return out;\n}\n","import { existsSync } from \"node:fs\";\nimport {\n deriveConfidence,\n getUsage,\n loadMemoriesFromDir,\n loadUsageIndex,\n type ConfidenceLevel,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemGetInputSchema = {\n id: z.string().min(1).describe(\"Memory id to fetch\"),\n};\n\nexport type MemGetInput = {\n [K in keyof typeof MemGetInputSchema]: z.infer<(typeof MemGetInputSchema)[K]>;\n};\n\nexport interface MemGetOutput {\n id: string;\n scope: string;\n type: string;\n module?: string;\n tags: string[];\n status: string;\n confidence: ConfidenceLevel;\n read_count: number;\n rejected_count: number;\n created_at: string;\n verified_at: string | null;\n stale_reason: string | null;\n anchor: { commit?: string; paths: string[]; symbols: string[] };\n body: string;\n file_path: string;\n}\n\nexport async function memGet(input: MemGetInput, ctx: HaiveContext): Promise<MemGetOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n throw new Error(`No .ai/memories at ${ctx.paths.root}.`);\n }\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const found = all.find((m) => m.memory.frontmatter.id === input.id);\n if (!found) throw new Error(`No memory with id \"${input.id}\".`);\n const fm = found.memory.frontmatter;\n const u = getUsage(await loadUsageIndex(ctx.paths), fm.id);\n return {\n id: fm.id,\n scope: fm.scope,\n type: fm.type,\n ...(fm.module ? { module: fm.module } : {}),\n tags: fm.tags,\n status: fm.status,\n confidence: deriveConfidence(fm, u),\n read_count: u.read_count,\n rejected_count: u.rejected_count,\n created_at: fm.created_at,\n verified_at: fm.verified_at,\n stale_reason: fm.stale_reason,\n anchor: {\n ...(fm.anchor.commit ? { commit: fm.anchor.commit } : {}),\n paths: fm.anchor.paths,\n symbols: fm.anchor.symbols,\n },\n body: found.memory.body,\n file_path: found.filePath,\n };\n}\n","import { existsSync } from \"node:fs\";\nimport { unlink } from \"node:fs/promises\";\nimport {\n loadMemoriesFromDir,\n loadUsageIndex,\n saveUsageIndex,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemDeleteInputSchema = {\n id: z.string().min(1).describe(\"Memory id to delete\"),\n keep_usage: z\n .boolean()\n .default(false)\n .describe(\"Keep the usage.json entry instead of removing it alongside the file\"),\n};\n\nexport type MemDeleteInput = {\n [K in keyof typeof MemDeleteInputSchema]: z.infer<(typeof MemDeleteInputSchema)[K]>;\n};\n\nexport interface MemDeleteOutput {\n id: string;\n deleted_file: string;\n usage_removed: boolean;\n}\n\nexport async function memDelete(\n input: MemDeleteInput,\n ctx: HaiveContext,\n): Promise<MemDeleteOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n throw new Error(`No .ai/memories at ${ctx.paths.root}.`);\n }\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const found = all.find((m) => m.memory.frontmatter.id === input.id);\n if (!found) throw new Error(`No memory with id \"${input.id}\".`);\n\n await unlink(found.filePath);\n\n let usageRemoved = false;\n if (!input.keep_usage) {\n const idx = await loadUsageIndex(ctx.paths);\n if (idx.by_id[input.id]) {\n delete idx.by_id[input.id];\n await saveUsageIndex(ctx.paths, idx);\n usageRemoved = true;\n }\n }\n\n return { id: input.id, deleted_file: found.filePath, usage_removed: usageRemoved };\n}\n","import { writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { loadMemoriesFromDir, serializeMemory } from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemUpdateInputSchema = {\n id: z.string().min(1).describe(\"Id of the memory to update\"),\n body: z.string().optional().describe(\"New Markdown body — replaces the existing body\"),\n tags: z\n .array(z.string())\n .optional()\n .describe(\"New tags array — fully replaces existing tags\"),\n paths: z\n .array(z.string())\n .optional()\n .describe(\"New anchor paths — fully replaces existing anchor.paths\"),\n symbols: z\n .array(z.string())\n .optional()\n .describe(\"New anchor symbols — fully replaces existing anchor.symbols\"),\n commit: z.string().optional().describe(\"New anchor commit SHA\"),\n domain: z.string().optional().describe(\"New domain label\"),\n author: z.string().optional().describe(\"New author handle or email\"),\n};\n\nexport type MemUpdateInput = {\n [K in keyof typeof MemUpdateInputSchema]: z.infer<(typeof MemUpdateInputSchema)[K]>;\n};\n\nexport interface MemUpdateOutput {\n id: string;\n file_path: string;\n updated_fields: string[];\n}\n\nexport async function memUpdate(\n input: MemUpdateInput,\n ctx: HaiveContext,\n): Promise<MemUpdateOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n throw new Error(`No .ai/memories at ${ctx.paths.root}.`);\n }\n\n const memories = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const loaded = memories.find((m) => m.memory.frontmatter.id === input.id);\n if (!loaded) throw new Error(`No memory with id \"${input.id}\".`);\n\n const { frontmatter, body } = loaded.memory;\n const updated_fields: string[] = [];\n\n const newAnchor = { ...frontmatter.anchor };\n if (input.paths !== undefined) { newAnchor.paths = input.paths; updated_fields.push(\"anchor.paths\"); }\n if (input.symbols !== undefined) { newAnchor.symbols = input.symbols; updated_fields.push(\"anchor.symbols\"); }\n if (input.commit !== undefined) { newAnchor.commit = input.commit; updated_fields.push(\"anchor.commit\"); }\n\n const newFrontmatter = {\n ...frontmatter,\n anchor: newAnchor,\n ...(input.tags !== undefined ? { tags: input.tags } : {}),\n ...(input.domain !== undefined ? { domain: input.domain } : {}),\n ...(input.author !== undefined ? { author: input.author } : {}),\n };\n\n if (input.tags !== undefined) updated_fields.push(\"tags\");\n if (input.domain !== undefined) updated_fields.push(\"domain\");\n if (input.author !== undefined) updated_fields.push(\"author\");\n\n const newBody = input.body !== undefined ? input.body : body;\n if (input.body !== undefined) updated_fields.push(\"body\");\n\n if (updated_fields.length === 0) {\n throw new Error(\"No fields to update — provide at least one of: body, tags, paths, symbols, commit, domain, author.\");\n }\n\n await writeFile(\n loaded.filePath,\n serializeMemory({ frontmatter: newFrontmatter, body: newBody }),\n \"utf8\",\n );\n\n return { id: input.id, file_path: loaded.filePath, updated_fields };\n}\n","import { existsSync } from \"node:fs\";\nimport {\n getUsage,\n loadMemoriesFromDir,\n loadUsageIndex,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemPendingInputSchema = {\n scope: z.enum([\"personal\", \"team\", \"module\"]).optional(),\n};\n\nexport type MemPendingInput = {\n [K in keyof typeof MemPendingInputSchema]: z.infer<(typeof MemPendingInputSchema)[K]>;\n};\n\nexport interface MemPendingHit {\n id: string;\n scope: string;\n type: string;\n module?: string;\n tags: string[];\n age_days: number;\n read_count: number;\n rejected_count: number;\n file_path: string;\n}\n\nexport interface MemPendingOutput {\n pending: MemPendingHit[];\n}\n\nexport async function memPending(\n input: MemPendingInput,\n ctx: HaiveContext,\n): Promise<MemPendingOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) return { pending: [] };\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const usage = await loadUsageIndex(ctx.paths);\n const now = Date.now();\n const proposed = all.filter(({ memory }) => {\n if (memory.frontmatter.status !== \"proposed\") return false;\n if (input.scope && memory.frontmatter.scope !== input.scope) return false;\n return true;\n });\n\n proposed.sort(\n (a, b) =>\n getUsage(usage, b.memory.frontmatter.id).read_count -\n getUsage(usage, a.memory.frontmatter.id).read_count,\n );\n\n return {\n pending: proposed.map(({ memory, filePath }) => {\n const fm = memory.frontmatter;\n const u = getUsage(usage, fm.id);\n return {\n id: fm.id,\n scope: fm.scope,\n type: fm.type,\n ...(fm.module ? { module: fm.module } : {}),\n tags: fm.tags,\n age_days: Math.floor((now - new Date(fm.created_at).getTime()) / 86_400_000),\n read_count: u.read_count,\n rejected_count: u.rejected_count,\n file_path: filePath,\n };\n }),\n };\n}\n","import { writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport {\n loadMemoriesFromDir,\n serializeMemory,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemApproveInputSchema = {\n id: z.string().min(1).describe(\"Memory id to approve (sets status=validated immediately)\"),\n};\n\nexport type MemApproveInput = {\n [K in keyof typeof MemApproveInputSchema]: z.infer<(typeof MemApproveInputSchema)[K]>;\n};\n\nexport interface MemApproveOutput {\n id: string;\n previous_status: string;\n status: \"validated\";\n file_path: string;\n}\n\nexport async function memApprove(\n input: MemApproveInput,\n ctx: HaiveContext,\n): Promise<MemApproveOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n throw new Error(`No .ai/memories at ${ctx.paths.root}.`);\n }\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const found = all.find((m) => m.memory.frontmatter.id === input.id);\n if (!found) throw new Error(`No memory with id \"${input.id}\".`);\n\n const previous = found.memory.frontmatter.status;\n const next = {\n frontmatter: { ...found.memory.frontmatter, status: \"validated\" as const },\n body: found.memory.body,\n };\n await writeFile(found.filePath, serializeMemory(next), \"utf8\");\n return {\n id: input.id,\n previous_status: previous,\n status: \"validated\",\n file_path: found.filePath,\n };\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport {\n buildFrontmatter,\n memoryFilePath,\n serializeMemory,\n suggestSensorFromMemory,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemTriedInputSchema = {\n what: z.string().min(1).describe(\"Brief description of the approach that was tried\"),\n why_failed: z\n .string()\n .min(1)\n .describe(\"Why it failed or why it should NOT be used\"),\n instead: z\n .string()\n .optional()\n .describe(\"What to use or do instead (recommended alternative)\"),\n scope: z\n .enum([\"personal\", \"team\", \"module\"])\n .default(\"personal\")\n .describe(\"Visibility scope\"),\n module: z.string().optional().describe(\"Module name (required when scope=module)\"),\n tags: z.array(z.string()).default([]).describe(\"Tags for filtering\"),\n paths: z\n .array(z.string())\n .default([])\n .describe(\"Anchor file paths this applies to\"),\n author: z.string().optional().describe(\"Author handle or email\"),\n};\n\nexport type MemTriedInput = {\n [K in keyof typeof MemTriedInputSchema]: z.infer<(typeof MemTriedInputSchema)[K]>;\n};\n\nexport interface MemTriedOutput {\n id: string;\n scope: string;\n file_path: string;\n}\n\nexport async function memTried(\n input: MemTriedInput,\n ctx: HaiveContext,\n): Promise<MemTriedOutput> {\n if (!existsSync(ctx.paths.haiveDir)) {\n throw new Error(`No .ai/ directory at ${ctx.paths.root}. Run 'haive init' first.`);\n }\n\n const slug = input.what\n .toLowerCase()\n .replace(/[^a-z0-9\\s]/g, \"\")\n .trim()\n .split(/\\s+/)\n .slice(0, 5)\n .join(\"-\");\n\n const baseFm = buildFrontmatter({\n type: \"attempt\",\n slug,\n scope: input.scope,\n module: input.module,\n tags: input.tags,\n paths: input.paths,\n author: input.author,\n });\n // attempt memories are immediately validated — no review cycle needed\n const frontmatter = { ...baseFm, status: \"validated\" as const };\n\n const lines: string[] = [`# ${input.what}`, \"\"];\n lines.push(`**Why it failed / do NOT use:** ${input.why_failed}`);\n if (input.instead) {\n lines.push(\"\", `**Instead, use:** ${input.instead}`);\n }\n const body = lines.join(\"\\n\") + \"\\n\";\n const sensor = suggestSensorFromMemory(body, input.paths);\n if (sensor) {\n frontmatter.sensor = sensor;\n }\n\n const file = memoryFilePath(ctx.paths, frontmatter.scope, frontmatter.id, frontmatter.module);\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 }), \"utf8\");\n\n return { id: frontmatter.id, scope: frontmatter.scope, file_path: file };\n}\n","import { existsSync } from \"node:fs\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport {\n draftsFromFindings,\n filterNewDrafts,\n loadMemoriesFromDir,\n memoryFilePath,\n parseFindings,\n serializeMemory,\n type FindingSeverity,\n type MemoryDraft,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const IngestFindingsInputSchema = {\n format: z.enum([\"sarif\", \"sonar\"]).describe(\"Report format: 'sarif' (ESLint/Semgrep/CodeQL) or 'sonar' (SonarQube issues JSON)\"),\n report_path: z\n .string()\n .optional()\n .describe(\"Project-relative path to the findings JSON file. Provide this OR `report`.\"),\n report: z\n .string()\n .optional()\n .describe(\"Inline findings JSON content. Provide this OR `report_path`.\"),\n type: z\n .enum([\"gotcha\", \"convention\"])\n .default(\"gotcha\")\n .describe(\"Memory type for the created drafts\"),\n scope: z\n .enum([\"personal\", \"team\", \"module\"])\n .default(\"team\")\n .describe(\"Visibility scope for the created memories\"),\n module: z.string().optional().describe(\"Module name (required when scope=module)\"),\n min_severity: z\n .enum([\"info\", \"minor\", \"major\", \"critical\", \"blocker\"])\n .optional()\n .describe(\"Ignore findings below this severity\"),\n limit: z.number().int().positive().optional().describe(\"Cap the number of memories created\"),\n author: z.string().optional().describe(\"Author handle or email\"),\n dry_run: z\n .boolean()\n .default(false)\n .describe(\"When true, return the drafts that WOULD be created without writing them\"),\n};\n\nexport type IngestFindingsInput = {\n [K in keyof typeof IngestFindingsInputSchema]: z.infer<(typeof IngestFindingsInputSchema)[K]>;\n};\n\nexport interface IngestFindingsOutput {\n format: string;\n parsed: number;\n new: number;\n skipped_existing: number;\n dry_run: boolean;\n created: Array<{\n id: string;\n topic: string;\n path: string;\n rule: string;\n severity: FindingSeverity;\n has_sensor: boolean;\n file_path?: string;\n }>;\n notice: string;\n}\n\nexport async function ingestFindings(\n input: IngestFindingsInput,\n ctx: HaiveContext,\n): Promise<IngestFindingsOutput> {\n if (!existsSync(ctx.paths.haiveDir)) {\n throw new Error(`No .ai/ directory at ${ctx.paths.root}. Run 'haive init' first.`);\n }\n\n let raw: string;\n if (input.report && input.report.trim()) {\n raw = input.report;\n } else if (input.report_path) {\n const file = path.resolve(ctx.paths.root, input.report_path);\n if (!existsSync(file)) throw new Error(`Report file not found: ${file}`);\n raw = await readFile(file, \"utf8\");\n } else {\n throw new Error(\"Provide either `report_path` or `report`.\");\n }\n\n const findings = parseFindings(input.format, raw);\n const drafts = draftsFromFindings(findings, {\n type: input.type,\n scope: input.scope,\n module: input.module,\n author: input.author,\n ...(input.min_severity ? { minSeverity: input.min_severity } : {}),\n ...(input.limit ? { limit: input.limit } : {}),\n });\n\n const existing = existsSync(ctx.paths.memoriesDir)\n ? await loadMemoriesFromDir(ctx.paths.memoriesDir)\n : [];\n const existingTopics = new Set(\n existing.map(({ memory }) => memory.frontmatter.topic).filter((t): t is string => Boolean(t)),\n );\n const fresh = filterNewDrafts(drafts, existingTopics);\n const skipped = drafts.length - fresh.length;\n\n const created: IngestFindingsOutput[\"created\"] = [];\n for (const draft of fresh) {\n let filePath: string | undefined;\n if (!input.dry_run) filePath = await writeDraft(ctx, draft);\n created.push({\n id: draft.frontmatter.id,\n topic: draft.topic,\n path: draft.finding.path,\n rule: draft.finding.ruleId,\n severity: draft.finding.severity,\n has_sensor: draft.has_sensor,\n ...(filePath ? { file_path: filePath } : {}),\n });\n }\n\n const notice = input.dry_run\n ? `Dry run — ${fresh.length} memory(ies) would be created (status=proposed). Re-run with dry_run=false to write them.`\n : `Created ${fresh.length} proposed memory(ies). They are NOT validated and their sensors are warn-only — review with mem_pending and promote with 'haive sensors promote'.`;\n\n return {\n format: input.format,\n parsed: drafts.length,\n new: fresh.length,\n skipped_existing: skipped,\n dry_run: input.dry_run,\n created,\n notice,\n };\n}\n\nasync function writeDraft(ctx: HaiveContext, draft: MemoryDraft): Promise<string> {\n const file = memoryFilePath(\n ctx.paths,\n draft.frontmatter.scope,\n draft.frontmatter.id,\n draft.frontmatter.module,\n );\n await mkdir(path.dirname(file), { recursive: true });\n await writeFile(file, serializeMemory({ frontmatter: draft.frontmatter, body: draft.body }), \"utf8\");\n return file;\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport {\n buildFrontmatter,\n isLikelyGuessable,\n memoryFilePath,\n serializeMemory,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\n/**\n * mem_observe — capture a code-level discovery made during exploration.\n *\n * Unlike mem_tried (failed approaches) or mem_save (conventions/decisions),\n * mem_observe is for bugs, inconsistencies, and security gaps discovered by\n * reading existing code that were NOT in the briefing. Auto-validated (no review).\n */\nexport const MemObserveInputSchema = {\n what: z\n .string()\n .min(1)\n .describe(\"Short title: what did you observe? (e.g. 'MobilePaymentController has two @RequestBody on handleWebhook')\"),\n where: z\n .string()\n .min(1)\n .describe(\"File path(s) where the issue lives — be specific\"),\n impact: z\n .string()\n .min(1)\n .describe(\"What breaks or could break because of this (e.g. 'Spring MVC rejects the handler at startup')\"),\n fix: z\n .string()\n .optional()\n .describe(\"Suggested fix or workaround (optional — leave empty if unknown)\"),\n scope: z\n .enum([\"personal\", \"team\", \"module\"])\n .default(\"team\")\n .describe(\"Visibility scope — defaults to team since discoveries benefit everyone\"),\n module: z.string().optional().describe(\"Module name (required when scope=module)\"),\n tags: z.array(z.string()).default([]).describe(\"Tags for filtering\"),\n author: z.string().optional().describe(\"Author handle or email\"),\n force: z\n .boolean()\n .default(false)\n .describe(\n \"Save even if the observation looks like generic, guessable knowledge. By default, \" +\n \"low-specificity observations (things a capable model already knows) are SKIPPED to keep \" +\n \"the corpus high-signal — only unguessable, team-specific discoveries are worth storing.\",\n ),\n};\n\nexport type MemObserveInput = {\n [K in keyof typeof MemObserveInputSchema]: z.infer<(typeof MemObserveInputSchema)[K]>;\n};\n\nexport interface MemObserveOutput {\n id: string;\n scope: string;\n file_path: string;\n /** True when the observation was NOT saved because it looked generic/guessable. */\n skipped?: boolean;\n reason?: string;\n}\n\nexport async function memObserve(\n input: MemObserveInput,\n ctx: HaiveContext,\n): Promise<MemObserveOutput> {\n if (!existsSync(ctx.paths.haiveDir)) {\n throw new Error(`No .ai/ directory at ${ctx.paths.root}. Run 'haive init' first.`);\n }\n\n // Capture filter: hAIve only earns its keep on UNGUESSABLE, team-specific knowledge.\n // Skip generic observations a capable model already makes by default — they only add noise\n // and token cost to future briefings. The caller can override with force=true.\n const signalText = [input.what, input.impact, input.fix ?? \"\"].join(\" \");\n if (!input.force && isLikelyGuessable(signalText)) {\n return {\n id: \"\",\n scope: input.scope,\n file_path: \"\",\n skipped: true,\n reason:\n \"Observation looks like generic, guessable knowledge (low specificity) — not saved. \" +\n \"Capture only arbitrary, team-specific facts (exact names, values, formats). Pass force=true to override.\",\n };\n }\n\n const slug = input.what\n .toLowerCase()\n .replace(/[^a-z0-9\\s]/g, \"\")\n .trim()\n .split(/\\s+/)\n .slice(0, 6)\n .join(\"-\");\n\n // Parse where into anchor paths (comma-separated or single path)\n const anchorPaths = input.where\n .split(/[,\\n]/)\n .map((s) => s.trim())\n .filter(Boolean);\n\n const baseFm = buildFrontmatter({\n type: \"gotcha\",\n slug,\n scope: input.scope,\n module: input.module,\n tags: input.tags,\n paths: anchorPaths,\n author: input.author,\n });\n // Observations are immediately validated — no review cycle needed\n const frontmatter = { ...baseFm, status: \"validated\" as const };\n\n const lines: string[] = [`# ${input.what}`, \"\"];\n lines.push(`**Where:** \\`${input.where}\\``);\n lines.push(\"\", `**Impact:** ${input.impact}`);\n if (input.fix) {\n lines.push(\"\", `**Fix/workaround:** ${input.fix}`);\n }\n const body = lines.join(\"\\n\") + \"\\n\";\n\n const file = memoryFilePath(ctx.paths, frontmatter.scope, frontmatter.id, frontmatter.module);\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 }), \"utf8\");\n\n return { id: frontmatter.id, scope: frontmatter.scope, file_path: file };\n}\n","/**\n * mem_session_end — save a structured end-of-session recap.\n *\n * Engram-inspired: explicit session lifecycle lets the next session start with\n * rich context about what was just done, which files were touched, and what\n * remains. Uses topic-upsert so there is always exactly ONE \"current recap\"\n * per scope/module: revisions accumulate in-place rather than creating clutter.\n */\nimport { writeFile, mkdir } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport {\n buildFrontmatter,\n loadMemoriesFromDir,\n memoryFilePath,\n serializeMemory,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\nimport { clearPendingDistill } from \"../session-tracker.js\";\n\nexport const MemSessionEndInputSchema = {\n goal: z\n .string()\n .min(1)\n .describe(\"What you were trying to accomplish this session (1–2 sentences)\"),\n accomplished: z\n .string()\n .describe(\"What was actually done — bullet list recommended\"),\n discoveries: z\n .string()\n .default(\"\")\n .describe(\n \"Any bugs, inconsistencies, surprises, or missing knowledge found during this session. \" +\n \"Empty if nothing surprising was found.\",\n ),\n files_touched: z\n .array(z.string())\n .default([])\n .describe(\"Key files that were read or modified — used as anchor paths\"),\n next_steps: z\n .string()\n .default(\"\")\n .describe(\"What should happen next (for the next session or a teammate)\"),\n scope: z\n .enum([\"personal\", \"team\", \"module\"])\n .default(\"personal\")\n .describe(\"Visibility: personal = private to you, team = shared with the team\"),\n module: z\n .string()\n .optional()\n .describe(\"Module name (required when scope=module)\"),\n};\n\nexport type MemSessionEndInput = {\n [K in keyof typeof MemSessionEndInputSchema]: z.infer<(typeof MemSessionEndInputSchema)[K]>;\n};\n\nexport interface MemSessionEndOutput {\n id: string;\n scope: string;\n file_path: string;\n action: \"created\" | \"updated\";\n revision_count: number;\n}\n\n/** Stable topic key for upsert — one recap per scope/module. */\nfunction recapTopic(scope: string, module?: string): string {\n return module ? `session-recap-${scope}-${module}` : `session-recap-${scope}`;\n}\n\nfunction buildBody(input: MemSessionEndInput): string {\n const lines: string[] = [];\n\n lines.push(`## Goal\\n${input.goal}`);\n lines.push(`\\n## Accomplished\\n${input.accomplished}`);\n\n if (input.discoveries.trim()) {\n lines.push(`\\n## Discoveries & surprises\\n${input.discoveries}`);\n }\n\n if (input.files_touched.length > 0) {\n lines.push(`\\n## Files touched\\n${input.files_touched.map((f) => `- \\`${f}\\``).join(\"\\n\")}`);\n }\n\n if (input.next_steps.trim()) {\n lines.push(`\\n## Next steps\\n${input.next_steps}`);\n }\n\n return lines.join(\"\\n\");\n}\n\nexport async function memSessionEnd(\n input: MemSessionEndInput,\n ctx: HaiveContext,\n): Promise<MemSessionEndOutput> {\n if (!existsSync(ctx.paths.haiveDir)) {\n throw new Error(`No .ai/ directory at ${ctx.paths.root}. Run 'haive init' first.`);\n }\n\n const body = buildBody(input);\n const topic = recapTopic(input.scope, input.module);\n\n // Normalize to project-relative paths (guards against absolute paths from agents)\n const normalizedFiles = input.files_touched.map((p) => {\n if (!p || !path.isAbsolute(p)) return p;\n const rel = path.relative(ctx.paths.root, p);\n return rel.startsWith(\"..\") ? p : rel;\n });\n\n // Validate anchor paths exist before saving\n const invalidPaths = normalizedFiles.filter(\n (p) => !existsSync(path.resolve(ctx.paths.root, p)),\n );\n if (invalidPaths.length > 0) {\n // Non-blocking for session end — just log in the output\n console.warn(`[haive] session end: anchor path(s) not found: ${invalidPaths.join(\", \")}`);\n }\n\n const existing = existsSync(ctx.paths.memoriesDir)\n ? await loadMemoriesFromDir(ctx.paths.memoriesDir)\n : [];\n\n // ── Topic upsert: update existing recap in-place ───────────────────────\n const topicMatch = existing.find(({ memory }) =>\n memory.frontmatter.topic === topic &&\n memory.frontmatter.scope === input.scope &&\n (!input.module || memory.frontmatter.module === input.module),\n );\n\n if (topicMatch) {\n const fm = topicMatch.memory.frontmatter;\n const revisionCount = (fm.revision_count ?? 0) + 1;\n const newFrontmatter = {\n ...fm,\n verified_at: new Date().toISOString(),\n revision_count: revisionCount,\n anchor: {\n ...fm.anchor,\n paths: normalizedFiles.length ? normalizedFiles : fm.anchor.paths,\n },\n };\n await writeFile(\n topicMatch.filePath,\n serializeMemory({ frontmatter: newFrontmatter, body }),\n \"utf8\",\n );\n // Clear pending distill — a manual post_task flow completed successfully.\n await clearPendingDistill(ctx);\n return {\n id: fm.id,\n scope: fm.scope,\n file_path: topicMatch.filePath,\n action: \"updated\",\n revision_count: revisionCount,\n };\n }\n\n // ── Create new recap (first session) ──────────────────────────────────\n const frontmatter = buildFrontmatter({\n type: \"session_recap\",\n slug: \"recap\",\n scope: input.scope,\n module: input.module,\n tags: [\"session\", \"recap\"],\n paths: normalizedFiles,\n topic,\n status: \"validated\",\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 await writeFile(file, serializeMemory({ frontmatter, body }), \"utf8\");\n\n // A successful manual mem_session_end (post_task flow) means the distillation\n // has been done properly — clear the shallow auto-recap marker so the next\n // get_briefing doesn't ask again.\n await clearPendingDistill(ctx);\n\n return {\n id: frontmatter.id,\n scope: frontmatter.scope,\n file_path: file,\n action: \"created\",\n revision_count: 0,\n };\n}\n","/**\n * Auto-session tracker for autopilot mode.\n *\n * Tracks which MCP tools were called during a server session.\n * On SIGTERM/SIGINT (i.e. when the AI client closes), automatically:\n * 1. Saves a session recap via mem_session_end (always)\n * 2. Writes .ai/.cache/pending-distill.json so the next get_briefing\n * surfaces an action_required item prompting the agent to invoke\n * post_task for a richer LLM-driven distillation.\n */\nimport {\n appendUsageEvent,\n appendRuntimeJournalEntry,\n loadConfig,\n type HaiveConfig,\n} from \"@hiveai/core\";\nimport { mkdir, writeFile, rm } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { execSync } from \"node:child_process\";\nimport type { HaiveContext } from \"./context.js\";\nimport { memSessionEnd } from \"./tools/mem-session-end.js\";\n\nexport interface SessionEvent {\n tool: string;\n at: string; // ISO timestamp\n /** Partial input snapshot (non-sensitive fields only) */\n summary?: string;\n}\n\n/** Written to .ai/.cache/pending-distill.json at session end. */\nexport interface PendingDistill {\n session_start: string;\n session_end: string;\n total_tool_calls: number;\n /** Human-readable summary of which tools were called (\"get_briefing ×3, mem_save ×2\") */\n tool_summary: string;\n /** IDs of memories saved during this session */\n memories_saved: string[];\n /** True when git diff was captured and stored in git_diff field */\n git_diff_available: boolean;\n /** Snapshot of `git diff HEAD` at session close (truncated to 8 KB) */\n git_diff?: string;\n /** ID of the auto-generated session recap memory */\n recap_id?: string;\n}\n\n/** Path to the pending distill marker file. */\nexport function pendingDistillPath(ctx: HaiveContext): string {\n return path.join(ctx.paths.haiveDir, \".cache\", \"pending-distill.json\");\n}\n\nexport class SessionTracker {\n private events: SessionEvent[] = [];\n private startedAt: string = new Date().toISOString();\n private config: HaiveConfig | null = null;\n private ctx: HaiveContext;\n private shutdownRegistered = false;\n\n constructor(ctx: HaiveContext) {\n this.ctx = ctx;\n }\n\n async init(): Promise<void> {\n this.config = await loadConfig(this.ctx.paths);\n if (this.config.autoSessionEnd) {\n this.registerShutdownHandler();\n }\n }\n\n record(tool: string, summary?: string): void {\n const event: SessionEvent = { tool, at: new Date().toISOString(), summary };\n this.events.push(event);\n // Persist to .ai/.usage/tool-usage.jsonl for cross-session stats (haive stats).\n // Best-effort: never blocks the tool execution, never throws.\n void appendUsageEvent(this.ctx.paths, event);\n }\n\n private registerShutdownHandler(): void {\n if (this.shutdownRegistered) return;\n this.shutdownRegistered = true;\n\n const save = async (): Promise<void> => {\n const writingTools = this.events.filter((e) =>\n [\"mem_save\", \"mem_tried\", \"mem_observe\", \"mem_update\", \"bootstrap_project_save\"].includes(e.tool),\n );\n const totalCalls = this.events.length;\n\n if (totalCalls === 0) return;\n\n const toolSummary = summarizeTools(this.events);\n const filesSet = new Set<string>();\n for (const e of this.events) {\n if (e.summary) {\n const matches = e.summary.match(/[^\\s\"',]+\\.[a-zA-Z]{1,6}/g) ?? [];\n for (const m of matches) filesSet.add(m);\n }\n }\n\n // ── 1. Capture git diff (best-effort, 8 KB cap) ──────────────────────\n let gitDiff: string | undefined;\n try {\n const raw = execSync(\"git diff HEAD\", {\n cwd: this.ctx.paths.root,\n timeout: 5000,\n encoding: \"utf8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n });\n gitDiff = raw.slice(0, 8192) || undefined;\n } catch { /* not a git repo or no diff — ok */ }\n\n // ── 2. Save minimal session recap ────────────────────────────────────\n let recapId: string | undefined;\n try {\n const result = await memSessionEnd(\n {\n goal: `Auto-captured session (${totalCalls} tool call${totalCalls === 1 ? \"\" : \"s\"})`,\n accomplished: toolSummary,\n discoveries: writingTools.length > 0\n ? `${writingTools.length} memor${writingTools.length === 1 ? \"y\" : \"ies\"} saved during this session.`\n : \"No new memories saved this session.\",\n files_touched: [...filesSet].slice(0, 10),\n next_steps: \"\",\n scope: (this.config?.defaultScope as \"personal\" | \"team\") ?? \"personal\",\n module: undefined,\n },\n this.ctx,\n );\n recapId = result.id;\n } catch {\n // Non-fatal — never block process exit\n }\n\n void appendRuntimeJournalEntry(this.ctx.paths, {\n kind: \"session_end\",\n message: recapId\n ? `auto session close | ${toolSummary} | recap:${recapId}`\n : `auto session close | ${toolSummary}`,\n meta: {\n recap_id: recapId ?? null,\n total_tool_calls: totalCalls,\n },\n });\n\n // ── 3. Write pending-distill.json so next get_briefing can prompt ─────\n // Skip if the agent already ran post_task this session (no shallow recap).\n // Also skip trivial sessions (1-2 tool calls with no writes) — they don't\n // contain distillation candidates and the action_required would just be noise.\n const ranPostTask = this.events.some((e) =>\n e.tool === \"mem_session_end\" && !e.summary?.startsWith(\"Auto-captured\"),\n );\n const isSubstantialSession = totalCalls >= 3 || writingTools.length > 0;\n if (!ranPostTask && isSubstantialSession && existsSync(this.ctx.paths.haiveDir)) {\n try {\n const memoriesSaved = writingTools\n .map((e) => e.summary ?? \"\")\n .filter(Boolean)\n .slice(0, 20);\n\n const payload: PendingDistill = {\n session_start: this.startedAt,\n session_end: new Date().toISOString(),\n total_tool_calls: totalCalls,\n tool_summary: toolSummary,\n memories_saved: memoriesSaved,\n git_diff_available: !!gitDiff,\n ...(gitDiff ? { git_diff: gitDiff } : {}),\n ...(recapId ? { recap_id: recapId } : {}),\n };\n\n const cacheDir = path.join(this.ctx.paths.haiveDir, \".cache\");\n await mkdir(cacheDir, { recursive: true });\n await writeFile(\n pendingDistillPath(this.ctx),\n JSON.stringify(payload, null, 2) + \"\\n\",\n \"utf8\",\n );\n } catch { /* Non-fatal */ }\n }\n };\n\n process.once(\"SIGTERM\", () => { void save().finally(() => process.exit(0)); });\n process.once(\"SIGINT\", () => { void save().finally(() => process.exit(0)); });\n }\n}\n\n/** Delete the pending distill marker if it exists. Called by mem_session_end. */\nexport async function clearPendingDistill(ctx: HaiveContext): Promise<void> {\n const p = pendingDistillPath(ctx);\n if (existsSync(p)) {\n try { await rm(p); } catch { /* non-fatal */ }\n }\n}\n\nfunction summarizeTools(events: SessionEvent[]): string {\n const counts = new Map<string, number>();\n for (const e of events) {\n counts.set(e.tool, (counts.get(e.tool) ?? 0) + 1);\n }\n return [...counts.entries()]\n .sort((a, b) => b[1] - a[1])\n .map(([t, n]) => `${t} ×${n}`)\n .join(\", \");\n}\n","import { readFile, writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport {\n allocateBudget,\n briefingProofLine,\n computeImpact,\n DEFAULT_AUTO_PROMOTE_RULE,\n deriveConfidence,\n estimateTokens,\n evaluateSkillActivation,\n compactAutoRecapBody,\n extractActionsBriefBody,\n getUsage,\n inferModulesFromPaths,\n isAutoPromoteEligible,\n isDecaying,\n isRetiredMemory,\n literalMatchesAllTokens,\n literalMatchesAnyToken,\n loadCodeMap,\n loadConfig,\n hashProjectContext,\n loadMemoriesFromDir,\n loadPreventionEvents,\n loadUsageIndex,\n memoryMatchesAnchorPaths,\n projectContextRecentlyEmitted,\n rankMemoriesLexical,\n recordProjectContextEmission,\n queryCodeMap,\n resolveBriefingBudget,\n serializeMemory,\n specificityScore,\n GUESSABLE_THRESHOLD,\n tokenizeQuery,\n trackReads,\n truncateToTokens,\n writeBriefingMarker,\n type LoadedMemory,\n type UsageIndex,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\nimport { pendingDistillPath, type PendingDistill } from \"../session-tracker.js\";\nimport type {\n ActionRequiredItem,\n BriefingMemory,\n BriefingOutput,\n} from \"./briefing-types.js\";\nimport {\n classifyBriefingQuality,\n classifyMemoryPriority,\n compactSummary,\n explainWhySurfaced,\n loadModuleContexts,\n priorityRank,\n trySemanticHits,\n} from \"./briefing-helpers.js\";\n\n// Re-export types so existing importers (server.ts, mem-relevant-to.ts) don't need to change.\nexport type {\n ActionRequiredItem,\n BriefingMemory,\n BriefingMemoryPriority,\n BriefingOutput,\n BriefingQuality,\n CodeMapSymbolHit,\n} from \"./briefing-types.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 dedupe_project_context: z\n .boolean()\n .optional()\n .describe(\n \"Token saver (default ON): skip re-emitting the project-context body if an identical copy was \" +\n \"already sent within the last few minutes this session (the agent still has it). Set false to always include it.\",\n ),\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 include_stale: z\n .boolean()\n .default(false)\n .describe(\"Include stale memories (excluded by default — they may be outdated)\"),\n track: z.boolean().default(true).describe(\"Increment read_count on returned memories\"),\n format: z\n .enum([\"full\", \"compact\", \"actions\"])\n .default(\"full\")\n .describe(\n \"Output format: 'full' returns memory bodies (honors token budget via truncation); \" +\n \"'compact' returns a 1-line summary per memory (call mem_get for detail); \" +\n \"'actions' squeezes bodies to actionable bullet lines — fewer tokens vs full.\",\n ),\n symbols: z\n .array(z.string())\n .default([])\n .describe(\n \"Symbol names to look up in the code-map (e.g. ['PaymentService', 'TenantFilter']). \" +\n \"Returns the file(s) exporting each symbol so agents don't need to grep. \" +\n \"Requires `haive index code` to have been run.\",\n ),\n min_semantic_score: z\n .number()\n .min(0)\n .max(1)\n .default(0)\n .describe(\n \"Drop semantic-only memory hits whose cosine score is below this threshold. \" +\n \"Useful to avoid weakly-related noise when the task is short or the corpus is broad. \" +\n \"Has no effect on memories matched via anchor/module/literal — those are always kept. \" +\n \"Try 0.25–0.4 for stricter matching.\",\n ),\n budget_preset: z\n .enum([\"quick\", \"balanced\", \"deep\"])\n .optional()\n .describe(\n \"Shortcut token budget: 'quick' minimizes tokens/skip module CONTEXT slices; 'balanced' mirrors historical defaults; \" +\n \"'deep' uses a larger briefing. When set, overrides max_tokens, max_memories, and include_module_contexts.\",\n ),\n};\n\nexport const GetBriefingZod = z.object(GetBriefingInputSchema);\nexport type GetBriefingInput = z.infer<typeof GetBriefingZod>;\n\nexport async function getBriefing(\n input: GetBriefingInput,\n ctx: HaiveContext,\n): Promise<BriefingOutput> {\n const resolvedBudget = resolveBriefingBudget(input.budget_preset, {\n max_tokens: input.max_tokens,\n max_memories: input.max_memories,\n include_module_contexts: input.include_module_contexts,\n });\n const briefingMaxTokens = resolvedBudget.max_tokens;\n const briefingMaxMemories = resolvedBudget.max_memories;\n const briefingIncludeModules = resolvedBudget.include_module_contexts;\n\n const inferred = inferModulesFromPaths(input.files);\n const memories: BriefingMemory[] = [];\n let searchMode: BriefingOutput[\"search_mode\"] = \"literal\";\n let usage: UsageIndex = { version: 1, updated_at: \"\", by_id: {} };\n let byId = new Map<string, LoadedMemory>();\n\n // ── Session recap ──────────────────────────────────────────────────────\n let lastSession: BriefingOutput[\"last_session\"] | undefined;\n\n if (existsSync(ctx.paths.memoriesDir)) {\n const allLoaded = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n\n const recaps = allLoaded\n .filter(({ memory }) => memory.frontmatter.type === \"session_recap\")\n .sort((a, b) =>\n new Date(b.memory.frontmatter.created_at).getTime() -\n new Date(a.memory.frontmatter.created_at).getTime(),\n );\n if (recaps.length > 0) {\n const r = recaps[0]!;\n const fm = r.memory.frontmatter;\n lastSession = {\n id: fm.id,\n scope: fm.scope,\n revision_count: fm.revision_count ?? 0,\n // Auto-generated recaps are low-signal tool dumps — compact them so they inform without\n // dominating the briefing head. Human/post_task recaps pass through unchanged.\n body: compactAutoRecapBody(r.memory.body),\n };\n }\n\n const allMemories = allLoaded.filter(({ memory }) => {\n const s = memory.frontmatter.status;\n if (s === \"rejected\" || s === \"deprecated\") return false;\n if (!input.include_stale && s === \"stale\") return false;\n if (!input.include_stale && isRetiredMemory(memory.frontmatter, memory.body)) return false;\n if (memory.frontmatter.type === \"session_recap\") return false;\n return true;\n });\n usage = await loadUsageIndex(ctx.paths);\n\n // byId MUST be populated before the semanticHits loop that uses it.\n // (gotcha: 2026-05-02-gotcha-getbriefing-semantic-hits-silently-dropped-byid)\n byId = new Map(allMemories.map((m) => [m.memory.frontmatter.id, m]));\n\n const semanticHits = input.task && input.semantic\n ? await trySemanticHits(ctx, input.task, allMemories.length * 2)\n : null;\n\n if (input.task && input.semantic) {\n searchMode = semanticHits ? \"semantic\" : \"literal_fallback\";\n }\n\n const seen = new Map<string, BriefingMemory>();\n\n const addOrUpdate = (\n loaded: LoadedMemory,\n reason: BriefingMemory[\"reasons\"][number],\n score?: number,\n matchQuality?: BriefingMemory[\"match_quality\"],\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 if (matchQuality === \"exact\" && existing.match_quality !== \"exact\") {\n existing.match_quality = \"exact\";\n } else if (matchQuality === \"semantic\" && existing.match_quality === \"partial\") {\n existing.match_quality = \"semantic\";\n }\n return;\n }\n const u = getUsage(usage, fm.id);\n const imp = computeImpact(fm, u);\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 ...(fm.status === \"draft\" || fm.status === \"proposed\" ? { unverified: true as const } : {}),\n read_count: u.read_count,\n impact_score: imp.score,\n impact_tier: imp.tier,\n reasons: [reason],\n match_quality: matchQuality ?? \"partial\",\n ...(score !== undefined ? { semantic_score: score } : {}),\n priority: \"background\",\n body: loaded.memory.body,\n file_path: loaded.filePath,\n });\n };\n\n // ── Matching passes ────────────────────────────────────────────────────\n if (input.files.length > 0) {\n for (const loaded of allMemories) {\n if (memoryMatchesAnchorPaths(loaded.memory, input.files)) addOrUpdate(loaded, \"anchor\", undefined, \"exact\");\n }\n for (const loaded of allMemories) {\n const fm = loaded.memory.frontmatter;\n if (fm.module && inferred.includes(fm.module)) addOrUpdate(loaded, \"module\", undefined, \"partial\");\n if (fm.domain && inferred.includes(fm.domain)) addOrUpdate(loaded, \"domain\", undefined, \"partial\");\n if (fm.tags.some((t) => inferred.includes(t))) addOrUpdate(loaded, \"module\", undefined, \"partial\");\n }\n }\n\n if (input.symbols.length > 0) {\n const wanted = new Set(input.symbols.map((s) => s.toLowerCase()));\n for (const loaded of allMemories) {\n const symbols = loaded.memory.frontmatter.anchor.symbols.map((s) => s.toLowerCase());\n if (symbols.some((s) => wanted.has(s))) addOrUpdate(loaded, \"symbol\", undefined, \"exact\");\n }\n }\n\n if (input.task) {\n const tokens = tokenizeQuery(input.task);\n const andHits = allMemories.filter((m) => literalMatchesAllTokens(m.memory, tokens));\n for (const loaded of andHits) addOrUpdate(loaded, \"semantic\", undefined, \"exact\");\n if (andHits.length === 0 && tokens.length > 1) {\n for (const loaded of allMemories) {\n if (literalMatchesAnyToken(loaded.memory, tokens)) addOrUpdate(loaded, \"semantic\", undefined, \"partial\");\n }\n }\n if (semanticHits) {\n for (const hit of semanticHits) {\n if (hit.score < input.min_semantic_score && !seen.has(hit.id)) continue;\n const loaded = byId.get(hit.id);\n if (loaded) addOrUpdate(loaded, \"semantic\", hit.score, \"semantic\");\n }\n }\n }\n\n // ── Progressive disclosure for skills ────────────────────────────────────\n // A skill that declares `activation` triggers is disclosed only when the task or\n // edited files match; an activated skill earns a ranking boost (it's a playbook\n // to follow now). Skills without an activation block keep legacy behavior.\n const activatedSkills = new Set<string>();\n for (const [id, m] of seen) {\n if (m.type !== \"skill\") continue;\n const loaded = byId.get(id);\n if (!loaded) continue;\n const act = evaluateSkillActivation(loaded.memory.frontmatter, {\n task: input.task,\n files: input.files,\n });\n if (act.applicable && !act.activated) {\n seen.delete(id);\n continue;\n }\n if (act.applicable && act.activated) activatedSkills.add(id);\n }\n\n // ── Lexical relevance (BM25) ─────────────────────────────────────────────\n // Semantic cosine alone (0..1) is too weak to overcome the type/confidence/impact\n // bonuses, so popular high-read attempt memories dominated EVERY task — the actually\n // relevant memory got buried. A BM25 score over the candidate set rewards overlap on\n // the query's *distinctive* terms (high IDF), pulling the on-topic memory up. It does\n // not touch anchored ranking: anchor/symbol hits stay must_read (priority * 100).\n const lexNorm = new Map<string, number>();\n if (input.task) {\n const candidates = [...seen.keys()]\n .map((id) => byId.get(id))\n .filter((x): x is LoadedMemory => Boolean(x));\n const lex = rankMemoriesLexical(candidates, input.task, candidates.length);\n const maxScore = lex.scores.reduce((m, s) => (s > m ? s : m), 0);\n if (maxScore > 0) {\n lex.ranked.forEach((loaded, i) => {\n lexNorm.set(loaded.memory.frontmatter.id, (lex.scores[i] ?? 0) / maxScore);\n });\n }\n }\n\n // ── Ranking ────────────────────────────────────────────────────────────\n const ranked = [...seen.values()].sort((a, b) => {\n const reasonScore = (m: BriefingMemory): number =>\n (m.type === \"attempt\" ? 3 : 0) +\n (m.reasons.includes(\"anchor\") ? 4 : 0) +\n (m.reasons.includes(\"symbol\") ? 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 // Demonstrated-utility nudge (0..3): a memory that agents actually applied — or\n // whose sensor caught a regression — edges out an equally-relevant one that\n // never proved useful. Small on purpose: never overrides anchor/symbol relevance.\n const impactScore = (m: BriefingMemory): number => (m.impact_score ?? 0) * 3;\n // An explicitly-activated skill is an actionable playbook for this exact task — surface it high.\n const activationBoost = (m: BriefingMemory): number => (activatedSkills.has(m.id) ? 5 : 0);\n // Lexical relevance weight (0..12): strong enough to lift the on-topic memory above a\n // popular-but-unrelated attempt (whose type+confidence head start is ~7), yet far below\n // the priority tier (×100) so anchored/symbol matches are never displaced.\n const lexScore = (m: BriefingMemory): number => 12 * (lexNorm.get(m.id) ?? 0);\n const sa = priorityRank(classifyMemoryPriority(a, byId.get(a.id), input.files, input.symbols)) * 100\n + reasonScore(a) + confidenceScore(a) + impactScore(a) + activationBoost(a) + lexScore(a) + (a.semantic_score ?? 0);\n const sb = priorityRank(classifyMemoryPriority(b, byId.get(b.id), input.files, input.symbols)) * 100\n + reasonScore(b) + confidenceScore(b) + impactScore(b) + activationBoost(b) + lexScore(b) + (b.semantic_score ?? 0);\n return sb - sa;\n });\n\n // Expand related_ids from top results\n for (const mem of ranked.slice(0, briefingMaxMemories)) {\n if (seen.size >= briefingMaxMemories * 2) break;\n const loaded = byId.get(mem.id);\n if (!loaded) continue;\n for (const relId of loaded.memory.frontmatter.related_ids ?? []) {\n if (seen.has(relId)) continue;\n const related = byId.get(relId);\n if (related) addOrUpdate(related, \"anchor\", undefined, \"partial\");\n }\n }\n\n memories.push(...ranked.slice(0, briefingMaxMemories));\n\n // ── Track reads + inline auto-promote ─────────────────────────────────\n if (input.track && memories.length > 0) {\n await trackReads(ctx.paths, memories.map((m) => m.id));\n const freshUsage = await loadUsageIndex(ctx.paths);\n // Use configured autoPromoteMinReads — not the hardcoded default.\n // (gotcha: 2026-05-04-gotcha-auto-promote-ignores-config-minreads)\n const cfg = await loadConfig(ctx.paths);\n const rule = {\n minReads: cfg.autoPromoteMinReads ?? DEFAULT_AUTO_PROMOTE_RULE.minReads,\n maxRejections: DEFAULT_AUTO_PROMOTE_RULE.maxRejections,\n };\n for (const m of memories) {\n const loaded = byId.get(m.id);\n if (!loaded) continue;\n const u = getUsage(freshUsage, m.id);\n if (!isAutoPromoteEligible(loaded.memory.frontmatter, u, rule)) continue;\n const newFm = { ...loaded.memory.frontmatter, status: \"validated\" as const };\n try {\n await writeFile(loaded.filePath, serializeMemory({ frontmatter: newFm, body: loaded.memory.body }), \"utf8\");\n m.status = \"validated\";\n m.confidence = \"trusted\";\n } catch { /* non-fatal */ }\n }\n }\n }\n\n // ── Project context ────────────────────────────────────────────────────\n let projectContextRaw =\n input.include_project_context && existsSync(ctx.paths.projectContext)\n ? await readFile(ctx.paths.projectContext, \"utf8\")\n : \"\";\n // Token saver: within a session, don't re-emit an UNCHANGED project context — the agent already\n // has it from the earlier call. First emission records a marker; repeats within the window omit.\n let contextOmittedRecent = false;\n if (projectContextRaw && input.dedupe_project_context !== false) {\n const ctxHash = hashProjectContext(projectContextRaw);\n if (await projectContextRecentlyEmitted(ctx.paths, ctxHash)) {\n contextOmittedRecent = true;\n projectContextRaw = \"\";\n } else {\n await recordProjectContextEmission(ctx.paths, ctxHash);\n }\n }\n const isTemplateContext =\n projectContextRaw.includes(\"TODO — high-level overview\") ||\n projectContextRaw.includes(\"Generated by `haive init`\");\n\n const setupWarnings: string[] = [];\n let autoContextGenerated = false;\n let projectContext = isTemplateContext ? \"\" : projectContextRaw;\n\n if ((isTemplateContext || !existsSync(ctx.paths.projectContext)) && input.include_project_context) {\n const haiveConfig = await loadConfig(ctx.paths);\n if (haiveConfig.autoContext) {\n const codeMap = await loadCodeMap(ctx.paths);\n if (codeMap) {\n const totalFiles = Object.keys(codeMap.files).length;\n const extensions = new Map<string, number>();\n for (const filePath of Object.keys(codeMap.files)) {\n const ext = filePath.slice(filePath.lastIndexOf(\".\") + 1).toLowerCase();\n extensions.set(ext, (extensions.get(ext) ?? 0) + 1);\n }\n const topExts = [...extensions.entries()]\n .sort((a, b) => b[1] - a[1])\n .slice(0, 5)\n .map(([e, n]) => `${e} (${n})`)\n .join(\", \");\n const topSymbols = Object.entries(codeMap.files)\n .flatMap(([fp, entry]) =>\n entry.exports.slice(0, 3).map((e) => `${e.name} (${fp.split(\"/\").slice(-2).join(\"/\")})`),\n )\n .slice(0, 15)\n .join(\", \");\n\n projectContext =\n `# Project context (auto-generated by hAIve)\\n\\n` +\n `> ⚠ This is a minimal auto-generated context based on the code-map. ` +\n `Invoke the \\`bootstrap_project\\` MCP prompt to replace it with a full analysis.\\n\\n` +\n `## Codebase overview\\n` +\n `- **${totalFiles} files** indexed in code-map\\n` +\n `- **Main file types:** ${topExts}\\n` +\n `- **Generated at:** ${codeMap.generated_at}\\n\\n` +\n `## Key exports (sample)\\n` +\n topSymbols + \"\\n\";\n\n autoContextGenerated = true;\n setupWarnings.push(\n \"project-context.md is still the default template. \" +\n \"A minimal auto-generated context has been injected from the code-map. \" +\n \"Invoke bootstrap_project to replace it with a full AI-analyzed context.\",\n );\n } else {\n setupWarnings.push(\n \"project-context.md is still the default template and no code-map found. \" +\n \"Run `haive index code` then invoke bootstrap_project for a full context.\",\n );\n }\n } else {\n setupWarnings.push(\n isTemplateContext\n ? \"project-context.md still contains the default template. \" +\n \"Invoke the bootstrap_project MCP prompt to auto-fill it from your codebase. \" +\n \"Until then, get_briefing returns no project context.\"\n : \"No project-context.md found. Run `haive init` then invoke the bootstrap_project MCP prompt.\",\n );\n }\n }\n\n // ── Module contexts + budget allocation ───────────────────────────────\n const moduleContents = briefingIncludeModules\n ? await loadModuleContexts(ctx, inferred)\n : [];\n\n const memoriesText = memories\n .map((m) => {\n const unverified = m.status === \"proposed\" ? \" [UNVERIFIED — not yet validated]\" : \"\";\n return `### ${m.id} (${m.scope}/${m.type}, ${m.confidence})${unverified}\\n${m.body.trim()}`;\n })\n .join(\"\\n\\n---\\n\\n\");\n\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 briefingMaxTokens,\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 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 // Cascade budget: top-ranked memories get full budget first; lower-ranked are dropped.\n const trimmedMemories: BriefingMemory[] = [];\n if (!memoriesSlice.truncated) {\n trimmedMemories.push(...memories);\n } else {\n let remaining = memoriesSlice.allocatedTokens;\n for (const m of memories) {\n const bodyTokens = estimateTokens(m.body);\n if (remaining <= 0) break;\n if (bodyTokens <= remaining) {\n trimmedMemories.push(m);\n remaining -= bodyTokens;\n } else if (remaining > 80) {\n const t = truncateToTokens(m.body, { maxTokens: remaining, mode: \"head\" });\n trimmedMemories.push({ ...m, body: t.text });\n remaining = 0;\n }\n }\n }\n\n const totalTokens =\n projectSlice.estimatedTokens + modulesSlice.estimatedTokens + memoriesSlice.estimatedTokens;\n\n // ── Decay warnings ─────────────────────────────────────────────────────\n const decayWarnings: string[] = [];\n for (const m of trimmedMemories) {\n const u = getUsage(usage, m.id);\n const loaded = byId.get(m.id);\n const createdAt = loaded?.memory.frontmatter.created_at ?? new Date().toISOString();\n if (isDecaying(u, createdAt)) decayWarnings.push(m.id);\n }\n\n // ── Format + priority + why ────────────────────────────────────────────\n const formattedMemories =\n input.format === \"compact\"\n ? trimmedMemories.map((m) => ({ ...m, body: compactSummary(m.body) }))\n : input.format === \"actions\"\n ? trimmedMemories.map((m) => ({ ...m, body: extractActionsBriefBody(m.body) }))\n : trimmedMemories;\n\n const outputMemories = formattedMemories.map((m) => ({\n ...m,\n priority: classifyMemoryPriority(m, byId.get(m.id), input.files, input.symbols),\n why: explainWhySurfaced(m, byId.get(m.id), input.files, inferred),\n }));\n\n const briefingQuality = classifyBriefingQuality(outputMemories, {\n isTemplateContext,\n autoContextGenerated,\n hasLastSession: Boolean(lastSession),\n searchMode,\n });\n\n // ── Code-map symbol lookup ─────────────────────────────────────────────\n let symbolLocations: BriefingOutput[\"symbol_locations\"];\n const symbolsToLookup = new Set<string>(input.symbols);\n for (const m of outputMemories) {\n for (const sym of byId.get(m.id)?.memory.frontmatter.anchor.symbols ?? []) {\n symbolsToLookup.add(sym);\n }\n }\n if (symbolsToLookup.size > 0) {\n const codeMap = await loadCodeMap(ctx.paths);\n if (codeMap) {\n symbolLocations = [];\n for (const sym of symbolsToLookup) {\n const { files } = queryCodeMap(codeMap, { symbol: sym });\n if (files.length > 0) {\n symbolLocations.push({\n symbol: sym,\n locations: files.flatMap((f) =>\n f.entry.exports\n .filter((e) => e.name.toLowerCase().includes(sym.toLowerCase()))\n .map((e) => ({\n file: f.path,\n kind: e.kind,\n line: e.line,\n ...(e.description ? { description: e.description } : {}),\n })),\n ),\n });\n }\n }\n if (symbolLocations.length === 0) symbolLocations = undefined;\n }\n }\n\n // ── action_required ────────────────────────────────────────────────────\n const actionRequired: ActionRequiredItem[] = [];\n\n const extractActionItem = (id: string, body: string): ActionRequiredItem => {\n const bodyLines = body.split(\"\\n\");\n const quoteBlock = bodyLines\n .filter((l) => l.startsWith(\"> \"))\n .map((l) => l.slice(2))\n .join(\" \")\n .replace(/^\\*«\\s*/, \"\")\n .replace(/\\s*»\\*$/, \"\")\n .trim();\n const headingLine = bodyLines.find((l) => l.startsWith(\"## \"));\n const summary = headingLine?.replace(/^##\\s*/, \"\").trim() ?? id;\n return {\n id,\n summary,\n developer_message: quoteBlock ||\n `A potentially incompatible external change was detected (${id}). ` +\n `Do you want me to analyze the impact and propose updates?`,\n };\n };\n\n for (const m of outputMemories) {\n const loaded = byId.get(m.id);\n if (loaded?.memory.frontmatter.requires_human_approval) {\n actionRequired.push(extractActionItem(m.id, loaded.memory.body));\n }\n }\n if (existsSync(ctx.paths.memoriesDir)) {\n const allMems = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n for (const { memory } of allMems) {\n const fm = memory.frontmatter;\n if (!fm.requires_human_approval) continue;\n if (fm.status === \"rejected\" || fm.status === \"deprecated\") continue;\n if (actionRequired.some((a) => a.id === fm.id)) continue;\n actionRequired.push(extractActionItem(fm.id, memory.body));\n }\n }\n\n // ── Pending distill ────────────────────────────────────────────────────\n const pendingDistillFile = pendingDistillPath(ctx);\n if (existsSync(pendingDistillFile)) {\n try {\n const raw = await readFile(pendingDistillFile, \"utf8\");\n const pd = JSON.parse(raw) as PendingDistill;\n const ageMs = Date.now() - new Date(pd.session_end).getTime();\n const SEVEN_DAYS = 7 * 24 * 60 * 60 * 1000;\n if (ageMs < SEVEN_DAYS) {\n const savedNote = pd.memories_saved.length > 0\n ? ` ${pd.memories_saved.length} memor${pd.memories_saved.length === 1 ? \"y was\" : \"ies were\"} saved.`\n : \" No memories were saved.\";\n const diffNote = pd.git_diff_available\n ? \" A git diff snapshot is available in the pending-distill file for context.\"\n : \"\";\n actionRequired.push({\n id: \"__pending_distill__\",\n summary: \"Previous session has undistilled learnings — invoke post_task to capture them\",\n developer_message:\n `The previous session (${pd.total_tool_calls} tool calls, ${pd.tool_summary}) ` +\n `was closed by autopilot without a full post_task distillation.${savedNote}${diffNote}\\n\\n` +\n `**Before starting your task:** invoke the MCP prompt \\`post_task\\` to capture any ` +\n `decisions, gotchas, or conventions from that session. This takes ~30 seconds and ` +\n `prevents institutional knowledge from being lost.\\n\\n` +\n `When done, call \\`mem_session_end\\` to acknowledge — this clears the pending distill marker.`,\n });\n } else {\n try {\n const { rm } = await import(\"node:fs/promises\");\n await rm(pendingDistillFile);\n } catch { /* non-fatal */ }\n }\n } catch { /* malformed or deleted between check and read — skip */ }\n }\n\n // ── low_value + adaptive trim + hints ─────────────────────────────────\n const memoriesEmpty = outputMemories.length === 0;\n const hasMemoriesDir = existsSync(ctx.paths.memoriesDir);\n const isColdStart = isTemplateContext && memoriesEmpty && !lastSession && !autoContextGenerated;\n\n const hasUnguessableSignal = outputMemories.some(\n (m) =>\n (m.priority === \"must_read\" || m.priority === \"useful\") &&\n specificityScore(m.body) >= GUESSABLE_THRESHOLD,\n );\n const briefingValueLow = !hasUnguessableSignal;\n const adaptiveConfig = await loadConfig(ctx.paths);\n const bootstrapUnfilled =\n /Auto-generated by `haive init/i.test(projectContextRaw) &&\n (projectContextRaw.match(/TODO —/g)?.length ?? 0) >= 2;\n const contextIsInferable = isTemplateContext || autoContextGenerated || bootstrapUnfilled;\n const adaptiveTrim =\n adaptiveConfig.adaptiveBriefing !== false && briefingValueLow && contextIsInferable;\n\n const hints: string[] = [];\n if (isColdStart) {\n hints.push(\n \"haive is uninitialized for this project (project-context.md is template, \" +\n \"0 memories, no past session). Skip future get_briefing calls until memories exist — \" +\n \"use Read/Grep directly. Run `haive init` and the bootstrap_project prompt to fix.\",\n );\n } else {\n if (outputMemories.some((m) => m.type === \"attempt\")) {\n hints.push(\n \"⚠️ One or more 'attempt' memories matched — these document failed approaches. \" +\n \"Read them BEFORE writing code to avoid repeating the mistake.\",\n );\n }\n if (outputMemories.some((m) => m.type === \"gotcha\")) {\n hints.push(\n \"Gotcha memories matched — non-obvious traps. Verify the 'how to apply' line still holds \" +\n \"before assuming behavior.\",\n );\n }\n if (memoriesEmpty && hasMemoriesDir && input.task) {\n hints.push(\n \"No memories matched this task. Try mem_search with broader/different terms, \" +\n \"or call mem_for_files with the files you intend to edit.\",\n );\n }\n if (input.task && outputMemories.length > 0 && actionRequired.length === 0) {\n hints.push(\n \"After completing the task: capture new gotchas with mem_observe, \" +\n \"failed approaches with mem_tried, validated patterns with mem_save.\",\n );\n }\n if (\n outputMemories.length > 2 &&\n !input.budget_preset &&\n input.task &&\n !hints.some((h) => h.includes(\"budget_preset\"))\n ) {\n hints.push(\n \"For tighter token budgets on small tasks pass budget_preset:'quick'; \" +\n \"for refactor-sized work use budget_preset:'deep'.\",\n );\n }\n }\n if (adaptiveTrim) {\n hints.push(\n \"No team-specific policy matched these files/task — nothing here a capable model can't \" +\n \"infer. The auto-generated project context was trimmed to keep this briefing near-zero-cost; \" +\n \"proceed with normal Read/Grep.\",\n );\n }\n\n // ── Proof line (Lot B × Lot C coordination point) ─────────────────────\n // Surface the measured outcome — \"this harness prevented N repeated mistakes\" — directly in the\n // briefing so the moat is visible in-context, not only in `haive dashboard`. briefingProofLine()\n // returns null when there are no recent catches, so an empty/cold corpus never shows a hollow claim.\n if (outputMemories.length > 0 && existsSync(ctx.paths.haiveDir)) {\n const proof = briefingProofLine(await loadPreventionEvents(ctx.paths));\n if (proof) hints.push(proof);\n }\n\n // ── Briefing marker (satisfies enforcement gate for MCP-native agents) ─\n if (existsSync(ctx.paths.haiveDir)) {\n await writeBriefingMarker(ctx.paths, {\n sessionId: process.env.HAIVE_SESSION_ID,\n ...(input.task ? { task: input.task } : {}),\n source: \"mcp-get-briefing\",\n files: input.files,\n memoryIds: outputMemories.map((m) => m.id),\n }).catch(() => { /* marker is best-effort — never fail the briefing on it */ });\n }\n\n return {\n ...(input.task ? { task: input.task } : {}),\n search_mode: searchMode,\n inferred_modules: inferred,\n ...(lastSession ? { last_session: lastSession } : {}),\n project_context: contextOmittedRecent\n ? {\n content:\n \"(project context unchanged — omitted to save tokens; it was provided earlier this \" +\n \"session. Pass dedupe_project_context:false to force a full copy.)\",\n truncated: false,\n omitted_recent: true,\n }\n : adaptiveTrim\n ? {\n content:\n \"(adaptive briefing: auto-generated context omitted — no team-specific policy \" +\n \"matched, so a capable model needs nothing extra here)\",\n truncated: false,\n ...(isTemplateContext && !autoContextGenerated ? { is_template: true } : {}),\n ...(autoContextGenerated ? { auto_generated: true } : {}),\n }\n : (projectContextRaw || autoContextGenerated)\n ? {\n content: projectSlice.text,\n truncated: projectSlice.truncated,\n ...(isTemplateContext && !autoContextGenerated ? { is_template: true } : {}),\n ...(autoContextGenerated ? { auto_generated: true } : {}),\n }\n : null,\n module_contexts: trimmedModules,\n memories: outputMemories,\n briefing_quality: briefingQuality,\n ...(symbolLocations ? { symbol_locations: symbolLocations } : {}),\n action_required: actionRequired,\n decay_warnings: decayWarnings,\n setup_warnings: setupWarnings,\n ...(isColdStart ? { low_value: true as const } : {}),\n briefing_value: briefingValueLow ? \"low\" : \"high\",\n ...(hints.length > 0 ? { hints } : {}),\n estimated_tokens: totalTokens,\n budget: {\n max_tokens: briefingMaxTokens,\n ...(input.budget_preset ? { preset_applied: input.budget_preset } : {}),\n spent: {\n project: projectSlice.estimatedTokens,\n modules: modulesSlice.estimatedTokens,\n memories: memoriesSlice.estimatedTokens,\n },\n },\n };\n}\n","import { readdir, readFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport {\n classifyMemoryPriority as coreClassifyPriority,\n isGlobPath,\n pathsOverlap,\n priorityRank as corePriorityRank,\n} from \"@hiveai/core\";\nimport type { LoadedMemory } from \"@hiveai/core\";\nimport type { HaiveContext } from \"../context.js\";\nimport type {\n BriefingMemory,\n BriefingMemoryPriority,\n BriefingOutput,\n BriefingQuality,\n} from \"./briefing-types.js\";\n\nexport function compactSummary(body: string): string {\n for (const line of body.split(\"\\n\")) {\n const trimmed = line.replace(/^#+\\s*/, \"\").trim();\n if (trimmed.length > 0) return trimmed.slice(0, 120);\n }\n return body.slice(0, 120);\n}\n\n/**\n * Map the MCP briefing's evidence into the shared core classifier. Behavior is identical to the old\n * inline logic — the single source of truth now lives in `@hiveai/core` so the CLI cannot drift.\n */\nexport function classifyMemoryPriority(\n memory: BriefingMemory,\n loaded: LoadedMemory | undefined,\n inputFiles: string[],\n inputSymbols: string[],\n): BriefingMemoryPriority {\n const fm = loaded?.memory.frontmatter;\n const directAnchor = Boolean(\n fm && inputFiles.length > 0 &&\n fm.anchor.paths.some((p) => inputFiles.some((file) => pathsOverlap(p, file))),\n );\n const directSymbol = Boolean(\n fm && inputSymbols.length > 0 &&\n fm.anchor.symbols.some((sym) =>\n inputSymbols.some((wanted) => wanted.toLowerCase() === sym.toLowerCase()),\n ),\n );\n const semantic = memory.semantic_score ?? 0;\n\n return coreClassifyPriority({\n type: memory.type,\n tags: fm?.tags ?? memory.tags ?? [],\n requiresHumanApproval: Boolean(fm?.requires_human_approval),\n directAnchor,\n directSymbol,\n exactTaskMatch: memory.match_quality === \"exact\",\n strongSemantic: semantic >= 0.65,\n usefulSemantic: semantic >= 0.35,\n moduleOrDomainMatch: memory.reasons.includes(\"module\") || memory.reasons.includes(\"domain\"),\n tagTaskMatch: false, // MCP ranking doesn't use a separate tag-token signal\n });\n}\n\nexport function priorityRank(priority: BriefingMemoryPriority): number {\n return corePriorityRank(priority);\n}\n\nexport function classifyBriefingQuality(\n memories: BriefingMemory[],\n context: {\n isTemplateContext: boolean;\n autoContextGenerated: boolean;\n hasLastSession: boolean;\n searchMode: BriefingOutput[\"search_mode\"];\n },\n): BriefingQuality {\n const mustRead = memories.filter((m) => m.priority === \"must_read\").length;\n const useful = memories.filter((m) => m.priority === \"useful\").length;\n const background = memories.filter((m) => m.priority === \"background\").length;\n const weakSemantic = memories.filter((m) =>\n m.reasons.length === 1 &&\n m.reasons.includes(\"semantic\") &&\n (m.semantic_score ?? 0) > 0 &&\n (m.semantic_score ?? 0) < 0.35,\n ).length;\n const reasons: string[] = [];\n\n if (memories.length === 0) reasons.push(\"no memories matched the task or files\");\n if (context.isTemplateContext && !context.autoContextGenerated) reasons.push(\"project context is still a template\");\n if (!context.hasLastSession) reasons.push(\"no previous session recap\");\n if (mustRead > 0) reasons.push(`${mustRead} must_read memor${mustRead === 1 ? \"y\" : \"ies\"} matched directly`);\n if (useful > 0) reasons.push(`${useful} useful memor${useful === 1 ? \"y\" : \"ies\"} matched`);\n if (background > useful + mustRead && background > 2) reasons.push(`${background} background memories dominate the result`);\n if (weakSemantic > 0) reasons.push(`${weakSemantic} weak semantic-only match${weakSemantic === 1 ? \"\" : \"es\"}`);\n if (context.searchMode === \"literal_fallback\") reasons.push(\"semantic index unavailable or empty; literal fallback used\");\n\n if (memories.length === 0 || (mustRead === 0 && useful === 0)) {\n return { level: \"thin\", reasons };\n }\n if (background > useful + mustRead && background > 2) {\n return { level: \"noisy\", reasons };\n }\n return { level: \"strong\", reasons };\n}\n\nexport function explainWhySurfaced(\n memory: BriefingMemory,\n loaded: LoadedMemory | undefined,\n inputFiles: string[],\n inferredModules: string[],\n): string[] {\n const why: string[] = [];\n const fm = loaded?.memory.frontmatter;\n if (memory.reasons.includes(\"anchor\") && fm) {\n const matching = fm.anchor.paths.filter((p) =>\n inputFiles.length === 0 || inputFiles.some((file) => pathsOverlap(p, file)),\n );\n if (matching.length > 0) {\n const exact = matching.filter((p) =>\n !isGlobPath(p) && inputFiles.some((file) => p === file || pathsOverlap(p, file)),\n );\n const glob = matching.filter((p) => isGlobPath(p));\n if (exact.length > 0) {\n why.push(`Exact/file anchor match: ${exact.slice(0, 4).join(\", \")}`);\n }\n if (glob.length > 0) {\n why.push(`Glob anchor match: ${glob.slice(0, 4).join(\", \")}`);\n }\n if (exact.length === 0 && glob.length === 0) {\n why.push(`Anchored to touched path${matching.length === 1 ? \"\" : \"s\"}: ${matching.slice(0, 4).join(\", \")}`);\n }\n } else if (fm.anchor.paths.length > 0) {\n why.push(`Pulled by related anchor: ${fm.anchor.paths.slice(0, 4).join(\", \")}`);\n }\n if (fm.anchor.symbols.length > 0) {\n why.push(`Anchor symbol${fm.anchor.symbols.length === 1 ? \"\" : \"s\"}: ${fm.anchor.symbols.slice(0, 4).join(\", \")}`);\n }\n }\n if (memory.reasons.includes(\"symbol\") && fm) {\n why.push(`Explicit symbol match: ${fm.anchor.symbols.slice(0, 4).join(\", \")}`);\n }\n if (memory.reasons.includes(\"module\")) {\n const moduleHints = [\n ...(memory.module ? [memory.module] : []),\n ...memory.tags.filter((tag) => inferredModules.includes(tag)),\n ];\n const shown = moduleHints.length > 0 ? [...new Set(moduleHints)].join(\", \") : inferredModules.join(\", \");\n why.push(shown ? `Matched inferred module/tag: ${shown}` : \"Matched inferred module context.\");\n }\n if (memory.reasons.includes(\"domain\")) {\n why.push(\"Matched inferred domain from the target file paths.\");\n }\n if (memory.reasons.includes(\"semantic\")) {\n const score = memory.semantic_score !== undefined\n ? ` score=${Math.round(memory.semantic_score * 100) / 100}`\n : \"\";\n why.push(`${memory.match_quality === \"exact\" ? \"Literal task match\" : \"Semantic/task relevance\"}${score}.`);\n }\n why.push(`Confidence: ${memory.confidence}; read ${memory.read_count} time${memory.read_count === 1 ? \"\" : \"s\"}.`);\n if (memory.type === \"attempt\") why.push(\"Failed-approach record; read before repeating the same path.\");\n if (memory.type === \"skill\") why.push(\"Skill (reusable procedure/playbook) — follow the steps described when doing this type of task.\");\n if (memory.status === \"proposed\" || memory.status === \"draft\") {\n why.push(\"Unvalidated record; use cautiously or ask a human before treating it as policy.\");\n }\n return why;\n}\n\nexport async 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\nexport async 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","import { estimateTokens, 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 paths: z\n .array(z.string())\n .default([])\n .describe(\n \"Filter to files under any of these path prefixes (e.g. ['packages/mcp/src/tools/', 'src/auth/']). \" +\n \"OR-joined with `file` substring; useful to get a focused view of one module.\",\n ),\n max_files: z\n .number()\n .int()\n .positive()\n .default(40)\n .describe(\"Cap on returned files (hard limit, applied after token budget)\"),\n max_tokens: z\n .number()\n .int()\n .positive()\n .optional()\n .describe(\n \"Approximate token budget for the response. When the matching set exceeds it, \" +\n \"files are ranked by export density (exports per LOC) and the highest-signal ones are kept first. \" +\n \"Omit to disable budgeting (legacy behavior).\",\n ),\n};\n\nexport const CodeMapInputZod = z.object(CodeMapInputSchema);\nexport type CodeMapInput = z.infer<typeof CodeMapInputZod>;\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 /** Number of matched files dropped due to max_files / max_tokens. */\n truncated?: number;\n /** True when at least one file was dropped to fit the token budget. */\n budget_clipped?: true;\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: matched } = queryCodeMap(map, { file: input.file, symbol: input.symbol });\n\n // Apply `paths` prefix filter on top of the substring match (OR within paths, AND with file).\n const pathsFiltered = input.paths.length === 0\n ? matched\n : matched.filter((f) => input.paths.some((p) => f.path.startsWith(stripLeadingSlash(p))));\n\n // Default order: alphabetical by path (predictable for callers).\n const alphabetical = [...pathsFiltered].sort((a, b) => a.path.localeCompare(b.path));\n\n let kept = alphabetical;\n let budgetClipped = false;\n if (input.max_tokens !== undefined) {\n // Density-rank to PICK which files to KEEP under budget, then re-sort alphabetically for output.\n const byDensity = [...alphabetical].sort((a, b) => {\n const da = density(a.entry.exports.length, a.entry.loc);\n const db = density(b.entry.exports.length, b.entry.loc);\n if (da !== db) return db - da;\n return a.path.localeCompare(b.path);\n });\n const keepSet = new Set<string>();\n let spent = 0;\n for (const f of byDensity) {\n const cost = estimateFileEntryTokens(f);\n if (spent + cost > input.max_tokens && keepSet.size > 0) {\n budgetClipped = true;\n break;\n }\n keepSet.add(f.path);\n spent += cost;\n }\n if (budgetClipped) {\n kept = alphabetical.filter((f) => keepSet.has(f.path));\n }\n }\n\n const finalFiles = kept.slice(0, input.max_files);\n const totalDropped = pathsFiltered.length - finalFiles.length;\n\n return {\n available: true,\n generated_at: map.generated_at,\n total_files: Object.keys(map.files).length,\n files: finalFiles.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 ...(totalDropped > 0 ? { truncated: totalDropped } : {}),\n ...(budgetClipped ? { budget_clipped: true as const } : {}),\n };\n}\n\nfunction density(exports: number, loc: number): number {\n if (loc <= 0) return 0;\n return exports / Math.max(loc, 1);\n}\n\nfunction stripLeadingSlash(p: string): string {\n return p.startsWith(\"/\") ? p.slice(1) : p;\n}\n\nfunction estimateFileEntryTokens(f: { path: string; entry: { summary?: string; loc: number; exports: Array<{ name: string; kind: string; description?: string; line: number }> } }): number {\n // Rough payload size: path + summary + each export (~6 tokens for name+kind+line + description).\n const exportsCost = f.entry.exports.reduce(\n (acc, e) => acc + 6 + estimateTokens(e.description ?? \"\"),\n 0,\n );\n return estimateTokens(f.path) + estimateTokens(f.entry.summary ?? \"\") + exportsCost + 4;\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 MemDiffInputSchema = {\n id_a: z.string().min(1).describe(\"First memory id\"),\n id_b: z.string().min(1).describe(\"Second memory id\"),\n};\n\nexport type MemDiffInput = {\n [K in keyof typeof MemDiffInputSchema]: z.infer<(typeof MemDiffInputSchema)[K]>;\n};\n\nexport interface MemDiffOutput {\n id_a: string;\n id_b: string;\n frontmatter_diff: Record<string, { a: unknown; b: unknown }>;\n body_diff: {\n lines_only_in_a: string[];\n lines_only_in_b: string[];\n common_lines: number;\n };\n}\n\nexport async function memDiff(input: MemDiffInput, ctx: HaiveContext): Promise<MemDiffOutput> {\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 foundA = all.find((m) => m.memory.frontmatter.id === input.id_a);\n const foundB = all.find((m) => m.memory.frontmatter.id === input.id_b);\n if (!foundA) throw new Error(`No memory with id \"${input.id_a}\".`);\n if (!foundB) throw new Error(`No memory with id \"${input.id_b}\".`);\n\n const fmA = foundA.memory.frontmatter as Record<string, unknown>;\n const fmB = foundB.memory.frontmatter as Record<string, unknown>;\n\n const frontmatterDiff: Record<string, { a: unknown; b: unknown }> = {};\n const allKeys = new Set([...Object.keys(fmA), ...Object.keys(fmB)]);\n for (const key of allKeys) {\n const va = fmA[key];\n const vb = fmB[key];\n if (JSON.stringify(va) !== JSON.stringify(vb)) {\n frontmatterDiff[key] = { a: va, b: vb };\n }\n }\n\n const linesA = new Set(foundA.memory.body.split(\"\\n\").map((l) => l.trim()).filter(Boolean));\n const linesB = new Set(foundB.memory.body.split(\"\\n\").map((l) => l.trim()).filter(Boolean));\n\n const onlyA = [...linesA].filter((l) => !linesB.has(l));\n const onlyB = [...linesB].filter((l) => !linesA.has(l));\n const common = [...linesA].filter((l) => linesB.has(l)).length;\n\n return {\n id_a: input.id_a,\n id_b: input.id_b,\n frontmatter_diff: frontmatterDiff,\n body_diff: {\n lines_only_in_a: onlyA,\n lines_only_in_b: onlyB,\n common_lines: common,\n },\n };\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 GetRecapInputSchema = {\n scope: z\n .enum([\"personal\", \"team\", \"any\"])\n .default(\"any\")\n .describe(\n \"Limit to a specific scope's recap. Default 'any' returns the most recent recap \" +\n \"across both personal and team scopes.\",\n ),\n};\n\nexport type GetRecapInput = {\n [K in keyof typeof GetRecapInputSchema]: z.infer<(typeof GetRecapInputSchema)[K]>;\n};\n\nexport interface GetRecapOutput {\n recap: {\n id: string;\n scope: string;\n revision_count: number;\n created_at: string;\n body: string;\n } | null;\n notice?: string;\n}\n\n/**\n * Lightweight alternative to get_briefing when you ONLY need the previous\n * session recap (e.g. resuming a long task between sessions). Skips project\n * context, modules, and memory ranking — pays only the recap's token cost.\n */\nexport async function getRecap(\n input: GetRecapInput,\n ctx: HaiveContext,\n): Promise<GetRecapOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n return { recap: null, notice: \"No .ai/memories directory — haive not initialized here.\" };\n }\n\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const recaps = all\n .filter(({ memory }) => memory.frontmatter.type === \"session_recap\")\n .filter(({ memory }) => input.scope === \"any\" || memory.frontmatter.scope === input.scope)\n .sort(\n (a, b) =>\n new Date(b.memory.frontmatter.created_at).getTime() -\n new Date(a.memory.frontmatter.created_at).getTime(),\n );\n\n if (recaps.length === 0) {\n return {\n recap: null,\n notice:\n input.scope === \"any\"\n ? \"No session recap saved yet. Run mem_session_end (or post_task prompt) to capture one.\"\n : `No session recap found in scope '${input.scope}'.`,\n };\n }\n\n const r = recaps[0]!;\n const fm = r.memory.frontmatter;\n return {\n recap: {\n id: fm.id,\n scope: fm.scope,\n revision_count: fm.revision_count ?? 0,\n created_at: fm.created_at,\n body: r.memory.body,\n },\n };\n}\n","import { z } from \"zod\";\nimport {\n getBriefing,\n type BriefingMemory,\n type BriefingQuality,\n type GetBriefingInput,\n} from \"./get-briefing.js\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemRelevantToInputSchema = {\n task: z\n .string()\n .min(1)\n .describe(\"What you are about to do, in 1–2 sentences. Used to rank relevant memories.\"),\n files: z\n .array(z.string())\n .default([])\n .describe(\"Optional: files you are about to edit — surfaces anchored memories.\"),\n limit: z\n .number()\n .int()\n .positive()\n .max(30)\n .default(8)\n .describe(\"Cap on returned memories.\"),\n min_semantic_score: z\n .number()\n .min(0)\n .max(1)\n .default(0.25)\n .describe(\"Drop weakly-related semantic hits below this cosine threshold.\"),\n format: z\n .enum([\"full\", \"compact\", \"actions\"])\n .default(\"full\")\n .describe(\"'compact' = id + 1-line summary; 'full' = complete bodies; 'actions' = bullet-first excerpts.\"),\n};\n\nexport type MemRelevantToInput = {\n [K in keyof typeof MemRelevantToInputSchema]: z.infer<(typeof MemRelevantToInputSchema)[K]>;\n};\n\nexport interface MemRelevantToOutput {\n task: string;\n search_mode: \"semantic\" | \"literal_fallback\" | \"literal\";\n memories: BriefingMemory[];\n briefing_quality: BriefingQuality;\n hints?: string[];\n /**\n * True when the search returned zero memories — clients can skip surfacing\n * an empty payload to the model.\n */\n empty?: true;\n}\n\n/**\n * One-shot ranked memories for a task. Use instead of get_briefing when you\n * already have project context loaded and only want the relevant memory layer.\n *\n * Runs the same ranking (anchor / module / literal / semantic) as get_briefing\n * but skips project_context, module_contexts, action_required, etc. — paying\n * only the cost of the memory bodies you actually get back.\n */\nexport async function memRelevantTo(\n input: MemRelevantToInput,\n ctx: HaiveContext,\n): Promise<MemRelevantToOutput> {\n // Reuse the briefing pipeline but turn off the heavy bits.\n const briefingInput: GetBriefingInput = {\n task: input.task,\n files: input.files,\n max_tokens: 16000,\n max_memories: input.limit,\n include_project_context: false,\n include_module_contexts: false,\n semantic: true,\n include_stale: false,\n track: true,\n format: input.format,\n symbols: [],\n min_semantic_score: input.min_semantic_score,\n };\n\n const briefing = await getBriefing(briefingInput, ctx);\n\n const out: MemRelevantToOutput = {\n task: input.task,\n search_mode: briefing.search_mode,\n memories: briefing.memories,\n briefing_quality: briefing.briefing_quality,\n };\n if (briefing.hints && briefing.hints.length > 0) out.hints = briefing.hints;\n if (briefing.memories.length === 0) out.empty = true;\n return out;\n}\n","import { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const CodeSearchInputSchema = {\n query: z\n .string()\n .min(1)\n .describe(\n \"Natural-language description of what you are looking for in the codebase \" +\n \"(e.g. 'function that hashes passwords', 'JWT signing logic', 'route registration').\",\n ),\n k: z\n .number()\n .int()\n .positive()\n .max(50)\n .default(5)\n .describe(\"Number of top hits to return.\"),\n min_score: z\n .number()\n .min(0)\n .max(1)\n .default(0.2)\n .describe(\n \"Minimum cosine similarity. Hits below this threshold are dropped to avoid noise. \" +\n \"Try 0.3+ for stricter matching.\",\n ),\n};\n\nexport type CodeSearchInput = {\n [K in keyof typeof CodeSearchInputSchema]: z.infer<(typeof CodeSearchInputSchema)[K]>;\n};\n\nexport interface CodeSearchHit {\n file: string;\n name: string;\n kind: string;\n line: number;\n description?: string;\n score: number;\n}\n\nexport interface CodeSearchOutput {\n available: boolean;\n hits: CodeSearchHit[];\n notice?: string;\n}\n\nexport async function codeSearch(\n input: CodeSearchInput,\n ctx: HaiveContext,\n): Promise<CodeSearchOutput> {\n let mod: typeof import(\"@hiveai/embeddings\");\n try {\n mod = await import(\"@hiveai/embeddings\");\n } catch {\n return {\n available: false,\n hits: [],\n notice:\n \"@hiveai/embeddings is not installed. Install it (`pnpm add @hiveai/embeddings`) \" +\n \"and run `haive index code-search` to enable semantic code search.\",\n };\n }\n\n const result = await mod.codeSemanticSearch(ctx.paths, input.query, {\n limit: input.k,\n minScore: input.min_score,\n });\n\n if (!result) {\n return {\n available: false,\n hits: [],\n notice:\n \"Code semantic-search index not built. Run `haive index code-search` to generate it \" +\n \"(builds embeddings for every exported symbol in the code-map).\",\n };\n }\n\n return { available: true, hits: result.hits };\n}\n","import { existsSync } from \"node:fs\";\nimport { spawn } from \"node:child_process\";\nimport path from \"node:path\";\nimport {\n deriveConfidence,\n getUsage,\n loadCodeMap,\n loadMemoriesFromDir,\n loadUsageIndex,\n memoryMatchesAnchorPaths,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const WhyThisFileInputSchema = {\n path: z\n .string()\n .min(1)\n .describe(\n \"Project-relative path to the file you want context on (e.g. 'packages/mcp/src/tools/mem-save.ts').\",\n ),\n git_log_limit: z\n .number()\n .int()\n .positive()\n .max(20)\n .default(5)\n .describe(\"How many recent commits touching this file to include.\"),\n memory_limit: z\n .number()\n .int()\n .positive()\n .max(20)\n .default(5)\n .describe(\"Cap on memories anchored to this path.\"),\n};\n\nexport type WhyThisFileInput = {\n [K in keyof typeof WhyThisFileInputSchema]: z.infer<(typeof WhyThisFileInputSchema)[K]>;\n};\n\nexport interface WhyThisFileOutput {\n file: string;\n exists: boolean;\n recent_commits: Array<{ sha: string; author: string; relative_date: string; subject: string }>;\n memories: Array<{\n id: string;\n type: string;\n scope: string;\n confidence: string;\n body_preview: string;\n }>;\n code_map_entry: {\n summary?: string;\n loc: number;\n exports: Array<{ name: string; kind: string; line: number; description?: string }>;\n } | null;\n hints?: string[];\n}\n\n/**\n * One-shot file-context lookup: combines recent git history, memories anchored\n * to the path, and the code-map entry. Designed to answer \"why is this file\n * the way it is?\" in a single call instead of 3-4 manual ones.\n */\nexport async function whyThisFile(\n input: WhyThisFileInput,\n ctx: HaiveContext,\n): Promise<WhyThisFileOutput> {\n const fileExists = existsSync(path.join(ctx.paths.root, input.path));\n\n const [commits, memories, codeMap] = await Promise.all([\n runGitLog(ctx.paths.root, input.path, input.git_log_limit).catch(() => []),\n collectAnchoredMemories(ctx, input.path, input.memory_limit),\n loadCodeMap(ctx.paths),\n ]);\n\n const codeMapEntry = codeMap?.files[input.path];\n\n const hints: string[] = [];\n if (!fileExists) {\n hints.push(`File '${input.path}' does not exist on disk — path may be wrong or file removed.`);\n }\n if (commits.length === 0 && fileExists) {\n hints.push(\"No git history found — file may be untracked or git not initialized.\");\n }\n if (memories.length === 0 && fileExists) {\n hints.push(\n \"No memories anchored here. If you discover something non-obvious while editing, \" +\n \"use mem_observe (with where=\" + input.path + \") to capture it.\",\n );\n }\n if (memories.some((m) => m.type === \"attempt\" || m.type === \"gotcha\")) {\n hints.push(\"⚠️ attempt/gotcha memories anchored to this file — read them BEFORE editing.\");\n }\n\n return {\n file: input.path,\n exists: fileExists,\n recent_commits: commits,\n memories,\n code_map_entry: codeMapEntry\n ? {\n ...(codeMapEntry.summary ? { summary: codeMapEntry.summary } : {}),\n loc: codeMapEntry.loc,\n exports: codeMapEntry.exports.map((e) => ({\n name: e.name,\n kind: e.kind,\n line: e.line,\n ...(e.description ? { description: e.description } : {}),\n })),\n }\n : null,\n ...(hints.length > 0 ? { hints } : {}),\n };\n}\n\nasync function collectAnchoredMemories(\n ctx: HaiveContext,\n filePath: string,\n limit: number,\n): Promise<WhyThisFileOutput[\"memories\"]> {\n if (!existsSync(ctx.paths.memoriesDir)) return [];\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const usage = await loadUsageIndex(ctx.paths);\n const out: WhyThisFileOutput[\"memories\"] = [];\n for (const { memory } of all) {\n const fm = memory.frontmatter;\n if (fm.status === \"rejected\" || fm.status === \"deprecated\") continue;\n if (fm.type === \"session_recap\") continue;\n if (!memoryMatchesAnchorPaths(memory, [filePath])) continue;\n const u = getUsage(usage, fm.id);\n out.push({\n id: fm.id,\n type: fm.type,\n scope: fm.scope,\n confidence: deriveConfidence(fm, u),\n body_preview: memory.body.split(\"\\n\").slice(0, 6).join(\"\\n\"),\n });\n if (out.length >= limit) break;\n }\n return out;\n}\n\nasync function runGitLog(\n cwd: string,\n filePath: string,\n limit: number,\n): Promise<WhyThisFileOutput[\"recent_commits\"]> {\n const sep = \"<<HV>>\";\n const fmt = `%h${sep}%an${sep}%ar${sep}%s`;\n const output = await runCommand(\n \"git\",\n [\"log\", `-n`, String(limit), `--pretty=format:${fmt}`, \"--\", filePath],\n cwd,\n );\n if (!output.trim()) return [];\n return output\n .split(\"\\n\")\n .map((line) => {\n const [sha = \"\", author = \"\", relative_date = \"\", subject = \"\"] = line.split(sep);\n return { sha, author, relative_date, subject };\n })\n .filter((c) => c.sha);\n}\n\nfunction runCommand(cmd: string, args: string[], cwd: string): Promise<string> {\n return new Promise((resolve, reject) => {\n const proc = spawn(cmd, args, { cwd, stdio: [\"ignore\", \"pipe\", \"pipe\"] });\n let stdout = \"\";\n let stderr = \"\";\n proc.stdout.on(\"data\", (chunk) => {\n stdout += chunk.toString();\n });\n proc.stderr.on(\"data\", (chunk) => {\n stderr += chunk.toString();\n });\n proc.on(\"error\", reject);\n proc.on(\"close\", (code) => {\n if (code === 0) resolve(stdout);\n else reject(new Error(stderr || `${cmd} exited with code ${code}`));\n });\n });\n}\n","import { existsSync } from \"node:fs\";\nimport {\n addedLinesFromDiff,\n appendPreventionEvent,\n BRIDGE_TARGET_PATH,\n buildDocFrequency,\n CODE_STOPWORDS,\n deriveConfidence,\n diffHasDistinctiveOverlap,\n getUsage,\n isRetiredMemory,\n loadMemoriesFromDir,\n loadUsageIndex,\n literalMatchesAnyToken,\n memoryMatchesAnchorPaths,\n recordPrevention,\n runSensors,\n saveUsageIndex,\n sensorTargetsFromDiff,\n tokenizeQuery,\n type DocFrequency,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const AntiPatternsCheckInputSchema = {\n diff: z\n .string()\n .optional()\n .describe(\n \"Raw unified diff text (or any code/text snippet) to scan for previously documented anti-patterns. \" +\n \"Tokens from the diff are used to match memory bodies and the embeddings index.\",\n ),\n paths: z\n .array(z.string())\n .default([])\n .describe(\n \"File paths affected by the change. Memories anchored to any of these paths are surfaced regardless of the diff content.\",\n ),\n limit: z\n .number()\n .int()\n .positive()\n .max(20)\n .default(8)\n .describe(\"Cap on returned warnings.\"),\n semantic: z\n .boolean()\n .default(true)\n .describe(\n \"When true, also use semantic search (requires @hiveai/embeddings + memory index) to find related anti-patterns.\",\n ),\n min_semantic_score: z\n .number()\n .min(0)\n .max(1)\n .default(0.45)\n .describe(\n \"Minimum cosine score for semantic-only anti-pattern hits. Anchor/literal matches still surface. \" +\n \"Default 0.45 keeps broad, weakly-related memories out of review noise.\",\n ),\n};\n\nexport interface AntiPatternsCheckInput {\n diff?: string;\n paths: string[];\n limit: number;\n semantic: boolean;\n min_semantic_score?: number;\n}\n\nexport interface AntiPatternsWarning {\n id: string;\n type: \"attempt\" | \"gotcha\";\n scope: string;\n confidence: string;\n body_preview: string;\n reasons: Array<\"anchor\" | \"literal\" | \"semantic\" | \"sensor\">;\n /**\n * True when the LITERAL overlap includes a token that is *distinctive* to this memory\n * (rare across the gotcha corpus) — e.g. `BigInt`, `open-in-view`. Only a distinctive\n * literal overlap is precise enough to hard-block; a shared common word (\"memory\",\n * \"scope\", \"version\") sets only the `literal` reason for review. Powers the gate.\n */\n distinctive_literal?: boolean;\n semantic_score?: number;\n /** When a regex sensor fired: its self-correction message and severity. */\n sensor_message?: string;\n sensor_severity?: \"warn\" | \"block\";\n /** Memory tags — used downstream (e.g. pre_commit_check) to weight a warning by topic. */\n tags?: string[];\n /** Anchor paths of the memory — lets the gate tell what kind of file this warning is about. */\n anchor_paths?: string[];\n /**\n * True when the memory has an executable sensor defined.\n * Used by the pre-commit gate: if a sensor exists but did NOT fire (no \"sensor\" reason),\n * the sensor is the authoritative check and literal matching alone should not block.\n */\n has_sensor?: boolean;\n}\n\nexport interface AntiPatternsCheckOutput {\n /** Total number of attempt+gotcha memories that exist in this project. */\n scanned: number;\n warnings: AntiPatternsWarning[];\n notice?: string;\n}\n\n/**\n * Tokenize a diff for LITERAL anti-pattern matching.\n *\n * `tokenizeQuery` splits on whitespace only, so code without spaces around an identifier\n * (e.g. `Number(BigInt(a))`) collapses into one un-matchable blob and the \"literal\" signal\n * silently disappears — leaving the gate to lean on the (non-deterministic, warmup-sensitive)\n * semantic score. We additionally split on non-word boundaries and keep identifier-length\n * tokens (>= 4 chars, not a ubiquitous keyword) so `BigInt`, `lodash`, `openInView`, etc. are\n * matched reliably. The set is unioned with the whitespace tokens to preserve existing behavior.\n */\nfunction tokenizeDiffForLiteral(diff: string): string[] {\n // If this is a unified diff, only consider ADDED lines. The gate should fire on\n // \"you introduced the bad pattern\", not \"you touched a file that merely mentions it\"\n // (or \"you REMOVED it\"). This cuts false positives on refactors that edit anchored files.\n const lines = diff.split(\"\\n\");\n const looksLikeDiff = lines.some((l) => /^[+-]/.test(l));\n const addedOnly = looksLikeDiff\n ? lines.filter((l) => l.startsWith(\"+\") && !l.startsWith(\"+++\")).join(\"\\n\")\n : diff;\n const source = addedOnly.trim().length > 0 ? addedOnly : diff;\n\n const wsTokens = tokenizeQuery(source);\n const wordTokens = source\n .toLowerCase()\n .split(/[^a-z0-9]+/)\n .filter((t) => t.length >= 4 && !CODE_STOPWORDS.has(t));\n return [...new Set([...wsTokens, ...wordTokens])];\n}\n\n/**\n * Files hAIve generates/writes that are NOT application code: agent bridges (Lot A init + Lot C\n * bridges), the MCP client configs, and `.gitignore` (init appends a hAIve block). Scanning any of\n * these for anti-patterns self-matches the corpus they mirror (a bridge listing the seeded gotchas,\n * a `.gitignore` line that merely contains \"cache\", etc.).\n */\nconst HAIVE_GENERATED_FILES = new Set<string>([\n ...Object.values(BRIDGE_TARGET_PATH), // .clinerules, .windsurfrules, .continuerules, .rules, AGENTS.md, .github/copilot-instructions.md, .sourcegraph/cody-rules.md\n \"CLAUDE.md\",\n \".cursorrules\",\n \".gitignore\",\n \".mcp.json\",\n \".cursor/mcp.json\",\n \".vscode/mcp.json\",\n]);\n\n/**\n * True for files hAIve itself owns/generates: the `.ai/` knowledge base, plus the agent-bridge,\n * config, and workflow files it writes from that same corpus. Scanning these for anti-patterns\n * self-matches the memories they mirror and fabricates \"prevented mistake\" events on the very first\n * post-init commit (which stages the seeded corpus AND everything init generated, all at once).\n */\nexport function isHaiveOwnedPath(p: string): boolean {\n if (p.startsWith(\".ai/\")) return true;\n if (HAIVE_GENERATED_FILES.has(p)) return true;\n if (p.startsWith(\".cursor/rules/\")) return true; // haive-mcp-required.mdc and siblings\n if (/^\\.github\\/workflows\\/haive-.*\\.ya?ml$/.test(p)) return true;\n return false;\n}\n\n/**\n * Drop hunks for hAIve-owned files (see {@link isHaiveOwnedPath}) from a unified diff. Anti-patterns\n * are about CODE reintroducing a known mistake — editing hAIve's own knowledge base or the bridge\n * files it generates from that corpus must never corroborate a literal/semantic match. Without this,\n * re-tagging a memory, or simply committing a fresh `haive init` (which writes the seeded corpus AND\n * its bridges in one commit), self-matches and can hard-block or inflate prevention counts.\n * See gotcha 2026-06-03-gotcha-antipattern-self-match-on-memory-file-edit.\n */\nexport function stripAiDirHunks(diff: string): string {\n if (!diff.includes(\"diff --git\")) return diff; // no file headers to split on — leave as-is\n const out: string[] = [];\n let block: string[] = [];\n let keep = true;\n const flush = (): void => {\n if (keep) out.push(...block);\n block = [];\n keep = true;\n };\n for (const line of diff.split(\"\\n\")) {\n if (line.startsWith(\"diff --git \")) {\n flush();\n const target = line.match(/ b\\/(.+)$/)?.[1] ?? \"\";\n keep = !isHaiveOwnedPath(target);\n }\n block.push(line);\n }\n flush();\n return out.join(\"\\n\");\n}\n\n/**\n * Scan a diff (or set of paths) against documented attempt/gotcha memories.\n * Surfaces \"you are about to repeat a known mistake\" warnings BEFORE you commit.\n *\n * Matching strategy:\n * 1. Anchor — memories anchored to any of the changed paths\n * 2. Literal — tokens from the diff overlap with memory body\n * 3. Semantic — cosine similarity (when enabled and index available)\n */\nexport async function antiPatternsCheck(\n input: AntiPatternsCheckInput,\n ctx: HaiveContext,\n): Promise<AntiPatternsCheckOutput> {\n if (!input.diff && input.paths.length === 0) {\n return {\n scanned: 0,\n warnings: [],\n notice: \"Nothing to check — provide either `diff` text or `paths`.\",\n };\n }\n if (!existsSync(ctx.paths.memoriesDir)) {\n return { scanned: 0, warnings: [], notice: \"No .ai/memories directory — nothing to check against.\" };\n }\n\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const minSemanticScore = input.min_semantic_score ?? 0.45;\n const negative = all.filter(({ memory }) => {\n const t = memory.frontmatter.type;\n if (t !== \"attempt\" && t !== \"gotcha\") return false;\n const s = memory.frontmatter.status;\n return s !== \"rejected\" && s !== \"deprecated\" && s !== \"stale\" &&\n !isRetiredMemory(memory.frontmatter, memory.body);\n });\n\n if (negative.length === 0) {\n return { scanned: 0, warnings: [], notice: \"No attempt/gotcha memories found yet.\" };\n }\n\n const usage = await loadUsageIndex(ctx.paths);\n // Document frequency over the gotcha/attempt corpus — drives distinctive-token\n // corroboration so a shared *common* word never hard-blocks (false positives).\n const docFreq: DocFrequency = buildDocFrequency(negative.map(({ memory }) => memory.body));\n const seen = new Map<string, AntiPatternsWarning>();\n\n const upsert = (\n fm: { id: string; type: string; scope: string; tags?: string[]; anchor?: { paths?: string[] }; sensor?: unknown },\n body: string,\n reason: AntiPatternsWarning[\"reasons\"][number],\n score?: number,\n ): void => {\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 type: fm.type as \"attempt\" | \"gotcha\",\n scope: fm.scope,\n confidence: deriveConfidence(fm as Parameters<typeof deriveConfidence>[0], u),\n body_preview: body.split(\"\\n\").slice(0, 5).join(\"\\n\").slice(0, 400),\n reasons: [reason],\n tags: fm.tags ?? [],\n anchor_paths: fm.anchor?.paths ?? [],\n ...(fm.sensor != null ? { has_sensor: true } : {}),\n ...(score !== undefined ? { semantic_score: score } : {}),\n });\n };\n\n // 1. Anchor matches\n if (input.paths.length > 0) {\n for (const { memory } of negative) {\n if (memoryMatchesAnchorPaths(memory, input.paths)) {\n upsert(memory.frontmatter, memory.body, \"anchor\");\n }\n }\n }\n\n // Code-only view of the diff: `.ai/` knowledge-base edits never corroborate \"you reintroduced a\n // bad pattern in code\" (they'd self-match the very memory that documents it).\n const scanDiff = input.diff ? stripAiDirHunks(input.diff) : input.diff;\n\n // 2. Literal token overlap from diff\n if (scanDiff) {\n const tokens = tokenizeDiffForLiteral(scanDiff);\n const added = addedLinesFromDiff(scanDiff);\n const addedText = added.trim().length > 0 ? added : scanDiff;\n if (tokens.length > 0) {\n for (const { memory } of negative) {\n if (literalMatchesAnyToken(memory, tokens)) {\n upsert(memory.frontmatter, memory.body, \"literal\");\n // Distinguish a meaningful overlap (the diff contains a token rare to this\n // gotcha) from incidental shared domain words. Only the former can hard-block.\n if (diffHasDistinctiveOverlap(addedText, memory.body, docFreq)) {\n const w = seen.get(memory.frontmatter.id);\n if (w) w.distinctive_literal = true;\n }\n }\n }\n }\n }\n\n // 2b. Sensor matches — deterministic regex checks derived from memories.\n // A sensor fires on the ADDED lines of the diff (\"you introduced the bad pattern\").\n // This is the feedback *computational* signal: same result every time, no warmup.\n if (scanDiff) {\n const added = addedLinesFromDiff(scanDiff);\n const diffTargets = sensorTargetsFromDiff(scanDiff);\n const hasFileTargets = diffTargets.some((target) => target.path.length > 0);\n // Never run sensors against hAIve-owned files — a memory/bridge that documents a bad pattern\n // contains that pattern and would self-fire (see stripAiDirHunks / isHaiveOwnedPath).\n const codePaths = input.paths.filter((p) => !isHaiveOwnedPath(p));\n const fallbackContent = added.trim().length > 0 ? added : scanDiff;\n const targets = diffTargets.length > 0 && hasFileTargets\n ? diffTargets\n : codePaths.length > 0\n ? codePaths.map((p) => ({ path: p, content: fallbackContent }))\n : [{ path: \"\", content: fallbackContent }];\n const hits = runSensors(negative.map(({ memory }) => memory), targets);\n for (const hit of hits) {\n const found = negative.find(({ memory }) => memory.frontmatter.id === hit.memory_id);\n if (!found) continue;\n upsert(found.memory.frontmatter, found.memory.body, \"sensor\");\n const w = seen.get(found.memory.frontmatter.id);\n if (w) {\n w.sensor_message = hit.message;\n w.sensor_severity = hit.severity;\n }\n }\n }\n\n // 3. Semantic search\n if (input.semantic && scanDiff) {\n try {\n const mod = await import(\"@hiveai/embeddings\");\n const result = await mod.semanticSearch(ctx.paths, scanDiff, { limit: input.limit * 2 });\n if (result) {\n const negativeIds = new Set(negative.map(({ memory }) => memory.frontmatter.id));\n for (const hit of result.hits) {\n if (!negativeIds.has(hit.id)) continue;\n if (hit.score < minSemanticScore && !seen.has(hit.id)) continue;\n const found = negative.find(({ memory }) => memory.frontmatter.id === hit.id);\n if (found) upsert(found.memory.frontmatter, found.memory.body, \"semantic\", hit.score);\n }\n }\n } catch {\n // embeddings not installed — silently skip semantic\n }\n }\n\n // Rank: anchor > literal > semantic, then by confidence\n const warnings = [...seen.values()]\n .sort((a, b) => {\n const score = (w: AntiPatternsWarning): number => {\n const reasonW =\n (w.reasons.includes(\"sensor\") ? 8 : 0) +\n (w.reasons.includes(\"anchor\") ? 4 : 0) +\n (w.reasons.includes(\"literal\") ? 2 : 0) +\n (w.reasons.includes(\"semantic\") ? 1 : 0);\n const confW =\n w.confidence === \"authoritative\" ? 3 :\n w.confidence === \"trusted\" ? 2 :\n w.confidence === \"low\" ? 1 : 0;\n return reasonW + confW + (w.semantic_score ?? 0);\n };\n return score(b) - score(a);\n })\n .slice(0, input.limit);\n\n // OUTCOME measurement: record only HIGH-CONFIDENCE catches as prevention events. A prevention\n // event is a measured claim (\"a known mistake was intercepted before it landed\") and must not be\n // cheap to trigger, or the dashboard/gate-precision/proof-line inflate on noise. We require one of:\n // • a deterministic SENSOR fired (computational, same result every time), or\n // • the change is in a file the lesson is ANCHORED to AND shares its vocabulary (anchor + literal).\n // Deliberately excluded: semantic-only (advisory), and a bare distinctive-literal in an UNRELATED\n // file — on a small/cold corpus a single moderately-rare shared word (\"cache\", \"client\") otherwise\n // self-records a phantom catch. Such matches still SURFACE as review warnings; they just aren't\n // counted as outcomes. Debounced via recordPrevention so re-running on the same diff can't inflate.\n const strongCatches = warnings.filter(\n (w) =>\n w.reasons.includes(\"sensor\") ||\n (w.reasons.includes(\"anchor\") && w.reasons.includes(\"literal\")),\n );\n if (strongCatches.length > 0) {\n const recordedIds: string[] = [];\n for (const w of strongCatches) if (recordPrevention(usage, w.id)) recordedIds.push(w.id);\n if (recordedIds.length > 0) {\n await saveUsageIndex(ctx.paths, usage).catch(() => { /* best-effort telemetry */ });\n const at = new Date().toISOString();\n for (const id of recordedIds) {\n await appendPreventionEvent(ctx.paths, { at, id, source: \"anti-pattern\" }).catch(() => { /* best-effort */ });\n }\n }\n }\n\n return {\n scanned: negative.length,\n warnings,\n };\n}\n","import { existsSync } from \"node:fs\";\nimport {\n loadMemoriesFromDir,\n tokenizeQuery,\n type LoadedMemory,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemDistillInputSchema = {\n since_days: z\n .number()\n .int()\n .positive()\n .default(30)\n .describe(\"Only consider memories created in the last N days.\"),\n min_cluster: z\n .number()\n .int()\n .min(2)\n .default(3)\n .describe(\"Minimum cluster size to surface.\"),\n type_filter: z\n .enum([\"gotcha\", \"attempt\", \"all\"])\n .default(\"gotcha\")\n .describe(\n \"Memory type to scan. 'gotcha' targets observe-style discoveries that recur, \" +\n \"'attempt' surfaces failed approaches that repeat, 'all' considers both.\",\n ),\n scope: z\n .enum([\"personal\", \"team\", \"module\", \"any\"])\n .default(\"any\")\n .describe(\"Restrict to a specific scope.\"),\n};\n\nexport type MemDistillInput = {\n [K in keyof typeof MemDistillInputSchema]: z.infer<(typeof MemDistillInputSchema)[K]>;\n};\n\nexport interface DistillCluster {\n suggested_topic: string;\n suggested_type: \"convention\" | \"gotcha\";\n member_ids: string[];\n overlapping_paths: string[];\n common_keywords: string[];\n sample_titles: string[];\n /** ISO date of the latest member */\n latest_at: string;\n}\n\nexport interface MemDistillOutput {\n scanned: number;\n /** Memories that didn't fit any cluster (kept here so callers can inspect singletons). */\n singletons: number;\n clusters: DistillCluster[];\n notice?: string;\n}\n\nconst MS_PER_DAY = 24 * 60 * 60 * 1000;\n\nconst STOP_WORDS = new Set([\n \"the\",\"and\",\"for\",\"with\",\"that\",\"this\",\"from\",\"into\",\"when\",\"then\",\"also\",\"must\",\n \"have\",\"does\",\"not\",\"but\",\"you\",\"your\",\"its\",\"because\",\"why\",\"how\",\"what\",\n \"use\",\"using\",\"used\",\"add\",\"added\",\"make\",\"made\",\"fix\",\"fixed\",\"bug\",\"error\",\n]);\n\n/**\n * Cluster recurring observations / attempts so a human can collapse N similar\n * memories into one richer convention/gotcha. Uses cheap heuristics (anchor\n * path overlap + body keyword overlap) — no embeddings needed.\n *\n * Output is *advisory*: nothing is written to disk. The caller (CLI / human)\n * decides whether to mem_save the consolidated form.\n */\nexport async function memDistill(\n input: MemDistillInput,\n ctx: HaiveContext,\n): Promise<MemDistillOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n return { scanned: 0, singletons: 0, clusters: [], notice: \"No .ai/memories directory.\" };\n }\n\n const cutoff = Date.now() - input.since_days * MS_PER_DAY;\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const candidates = all.filter(({ memory }) => {\n const fm = memory.frontmatter;\n if (fm.status === \"rejected\" || fm.status === \"deprecated\" || fm.status === \"stale\") return false;\n if (input.scope !== \"any\" && fm.scope !== input.scope) return false;\n if (input.type_filter === \"gotcha\" && fm.type !== \"gotcha\") return false;\n if (input.type_filter === \"attempt\" && fm.type !== \"attempt\") return false;\n if (input.type_filter === \"all\" && fm.type !== \"gotcha\" && fm.type !== \"attempt\") return false;\n if (Date.parse(fm.created_at) < cutoff) return false;\n return true;\n });\n\n if (candidates.length < input.min_cluster) {\n return {\n scanned: candidates.length,\n singletons: candidates.length,\n clusters: [],\n notice: candidates.length === 0\n ? `No matching memories in the last ${input.since_days} days.`\n : `Only ${candidates.length} candidate${candidates.length === 1 ? \"\" : \"s\"} — below min_cluster=${input.min_cluster}.`,\n };\n }\n\n // Pre-compute features per memory: keyword set + path set\n const features = candidates.map((loaded) => ({\n loaded,\n keywords: keywordSet(loaded),\n paths: new Set<string>(loaded.memory.frontmatter.anchor.paths),\n }));\n\n // Single-linkage clustering: union-find by similarity threshold.\n const parent: number[] = features.map((_, i) => i);\n const find = (i: number): number => (parent[i] === i ? i : (parent[i] = find(parent[i] ?? 0)));\n const union = (a: number, b: number): void => {\n const ra = find(a), rb = find(b);\n if (ra !== rb) parent[ra] = rb;\n };\n\n for (let i = 0; i < features.length; i++) {\n for (let j = i + 1; j < features.length; j++) {\n const fi = features[i]!, fj = features[j]!;\n const pathSim = jaccard(fi.paths, fj.paths);\n const kwSim = jaccard(fi.keywords, fj.keywords);\n // Either strong path overlap OR strong keyword overlap qualifies.\n if (pathSim >= 0.5 || kwSim >= 0.4) union(i, j);\n }\n }\n\n // Group by root parent\n const groups = new Map<number, number[]>();\n for (let i = 0; i < features.length; i++) {\n const root = find(i);\n const arr = groups.get(root) ?? [];\n arr.push(i);\n groups.set(root, arr);\n }\n\n const clusters: DistillCluster[] = [];\n let singletons = 0;\n for (const indices of groups.values()) {\n if (indices.length < input.min_cluster) {\n singletons += indices.length;\n continue;\n }\n const members = indices.map((i) => features[i]!);\n const allPaths = new Set<string>();\n const allKeywords = new Map<string, number>();\n let latest = 0;\n for (const m of members) {\n for (const p of m.paths) allPaths.add(p);\n for (const k of m.keywords) allKeywords.set(k, (allKeywords.get(k) ?? 0) + 1);\n const t = Date.parse(m.loaded.memory.frontmatter.created_at);\n if (t > latest) latest = t;\n }\n const commonKeywords = [...allKeywords.entries()]\n .filter(([, n]) => n >= Math.max(2, Math.floor(members.length / 2)))\n .sort((a, b) => b[1] - a[1])\n .slice(0, 5)\n .map(([k]) => k);\n\n const titles = members\n .map((m) => firstHeading(m.loaded.memory.body) ?? m.loaded.memory.frontmatter.id)\n .slice(0, 5);\n\n const suggestedType: DistillCluster[\"suggested_type\"] =\n members.every((m) => m.loaded.memory.frontmatter.type === \"attempt\") ? \"gotcha\" : \"convention\";\n\n clusters.push({\n suggested_topic: commonKeywords.slice(0, 3).join(\"-\") || \"merged-observations\",\n suggested_type: suggestedType,\n member_ids: members.map((m) => m.loaded.memory.frontmatter.id),\n overlapping_paths: [...allPaths].slice(0, 10),\n common_keywords: commonKeywords,\n sample_titles: titles,\n latest_at: new Date(latest).toISOString(),\n });\n }\n\n // Sort clusters by size desc\n clusters.sort((a, b) => b.member_ids.length - a.member_ids.length);\n\n return {\n scanned: candidates.length,\n singletons,\n clusters,\n };\n}\n\nfunction keywordSet(loaded: LoadedMemory): Set<string> {\n const text = (loaded.memory.body + \" \" + loaded.memory.frontmatter.tags.join(\" \")).slice(0, 800);\n const tokens = tokenizeQuery(text)\n .filter((t) => t.length >= 4 && !STOP_WORDS.has(t));\n return new Set(tokens);\n}\n\nfunction jaccard<T>(a: Set<T>, b: Set<T>): number {\n if (a.size === 0 && b.size === 0) return 0;\n let intersect = 0;\n for (const x of a) if (b.has(x)) intersect++;\n const union = a.size + b.size - intersect;\n return union === 0 ? 0 : intersect / union;\n}\n\nfunction firstHeading(body: string): string | undefined {\n for (const line of body.split(\"\\n\")) {\n const t = line.trim();\n if (t.startsWith(\"#\")) return t.replace(/^#+\\s*/, \"\").slice(0, 80);\n if (t.length > 0) return t.slice(0, 80);\n }\n return undefined;\n}\n","import { existsSync } from \"node:fs\";\nimport { spawn } from \"node:child_process\";\nimport {\n deriveConfidence,\n getUsage,\n loadMemoriesFromDir,\n loadUsageIndex,\n pathsOverlap as singlePathsOverlap,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const WhyThisDecisionInputSchema = {\n id: z\n .string()\n .min(1)\n .describe(\"Memory id to inspect (e.g. '2026-04-25-decision-esm-only').\"),\n git_log_limit: z\n .number()\n .int()\n .positive()\n .max(20)\n .default(5)\n .describe(\"How many recent commits per anchor path to surface.\"),\n};\n\nexport type WhyThisDecisionInput = {\n [K in keyof typeof WhyThisDecisionInputSchema]: z.infer<(typeof WhyThisDecisionInputSchema)[K]>;\n};\n\nexport interface WhyThisDecisionOutput {\n found: boolean;\n decision?: {\n id: string;\n type: string;\n scope: string;\n status: string;\n confidence: string;\n body: string;\n created_at: string;\n };\n /** Memories explicitly linked via related_ids on the decision (or vice versa). */\n related: Array<{\n id: string;\n type: string;\n scope: string;\n confidence: string;\n body_preview: string;\n relation: \"explicit\" | \"back-link\";\n }>;\n /** Other memories anchored to overlapping paths — implicit context. */\n path_neighbors: Array<{\n id: string;\n type: string;\n scope: string;\n confidence: string;\n overlap: string[];\n body_preview: string;\n }>;\n /** Recent git commits touching any of the decision's anchored paths. */\n recent_commits: Array<{\n path: string;\n sha: string;\n author: string;\n relative_date: string;\n subject: string;\n }>;\n hints?: string[];\n notice?: string;\n}\n\n/**\n * Trace the genealogy of a `decision` memory: the decision itself + memories\n * explicitly linked to it + memories anchored to overlapping paths + recent\n * commits touching those paths. One call instead of 4-5 manual lookups.\n *\n * Works on any memory type, but is optimized for `decision` and `architecture`.\n */\nexport async function whyThisDecision(\n input: WhyThisDecisionInput,\n ctx: HaiveContext,\n): Promise<WhyThisDecisionOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n return {\n found: false,\n related: [],\n path_neighbors: [],\n recent_commits: [],\n notice: \"No .ai/memories directory.\",\n };\n }\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const usage = await loadUsageIndex(ctx.paths);\n const target = all.find(({ memory }) => memory.frontmatter.id === input.id);\n if (!target) {\n return {\n found: false,\n related: [],\n path_neighbors: [],\n recent_commits: [],\n notice: `Memory '${input.id}' not found.`,\n };\n }\n\n const fm = target.memory.frontmatter;\n const targetUsage = getUsage(usage, fm.id);\n const decision = {\n id: fm.id,\n type: fm.type,\n scope: fm.scope,\n status: fm.status,\n confidence: deriveConfidence(fm, targetUsage),\n body: target.memory.body,\n created_at: fm.created_at,\n };\n\n // ── related: explicit related_ids + reverse links ──────────────────────\n const relatedSet = new Set(fm.related_ids ?? []);\n const related: WhyThisDecisionOutput[\"related\"] = [];\n for (const { memory } of all) {\n if (memory.frontmatter.id === fm.id) continue;\n const isExplicit = relatedSet.has(memory.frontmatter.id);\n const isBackLink = (memory.frontmatter.related_ids ?? []).includes(fm.id);\n if (!isExplicit && !isBackLink) continue;\n const u = getUsage(usage, memory.frontmatter.id);\n related.push({\n id: memory.frontmatter.id,\n type: memory.frontmatter.type,\n scope: memory.frontmatter.scope,\n confidence: deriveConfidence(memory.frontmatter, u),\n body_preview: memory.body.split(\"\\n\").slice(0, 4).join(\"\\n\").slice(0, 300),\n relation: isExplicit ? \"explicit\" : \"back-link\",\n });\n }\n\n // ── path_neighbors: memories anchored to overlapping paths ─────────────\n const targetPaths = fm.anchor.paths;\n const path_neighbors: WhyThisDecisionOutput[\"path_neighbors\"] = [];\n if (targetPaths.length > 0) {\n for (const { memory } of all) {\n if (memory.frontmatter.id === fm.id) continue;\n if (relatedSet.has(memory.frontmatter.id)) continue; // already in related\n const overlappingPaths = memory.frontmatter.anchor.paths.filter((p) =>\n targetPaths.some((tp) => singlePathsOverlap(p, tp)),\n );\n if (overlappingPaths.length === 0) continue;\n const u = getUsage(usage, memory.frontmatter.id);\n path_neighbors.push({\n id: memory.frontmatter.id,\n type: memory.frontmatter.type,\n scope: memory.frontmatter.scope,\n confidence: deriveConfidence(memory.frontmatter, u),\n overlap: overlappingPaths,\n body_preview: memory.body.split(\"\\n\").slice(0, 3).join(\"\\n\").slice(0, 200),\n });\n if (path_neighbors.length >= 10) break;\n }\n }\n\n // ── recent_commits: git log on each anchored path ──────────────────────\n const recent_commits: WhyThisDecisionOutput[\"recent_commits\"] = [];\n for (const p of targetPaths.slice(0, 5)) {\n try {\n const commits = await runGitLog(ctx.paths.root, p, input.git_log_limit);\n for (const c of commits) recent_commits.push({ path: p, ...c });\n } catch {\n /* git not available or path untracked — silent */\n }\n }\n\n const hints: string[] = [];\n if (decision.confidence === \"low\" || decision.confidence === \"stale\") {\n hints.push(`⚠️ Confidence is ${decision.confidence}. Verify this decision still applies before quoting it.`);\n }\n if (related.length === 0 && path_neighbors.length === 0 && targetPaths.length === 0) {\n hints.push(\"No related memories and no anchored paths — this decision is isolated; consider adding related_ids or paths.\");\n }\n if (fm.type !== \"decision\" && fm.type !== \"architecture\") {\n hints.push(`Memory type is '${fm.type}', not 'decision'/'architecture' — output may be less informative.`);\n }\n\n return {\n found: true,\n decision,\n related,\n path_neighbors,\n recent_commits,\n ...(hints.length > 0 ? { hints } : {}),\n };\n}\n\nasync function runGitLog(\n cwd: string,\n filePath: string,\n limit: number,\n): Promise<Array<{ sha: string; author: string; relative_date: string; subject: string }>> {\n const sep = \"<<HV>>\";\n const fmt = `%h${sep}%an${sep}%ar${sep}%s`;\n const output = await runCommand(\n \"git\",\n [\"log\", \"-n\", String(limit), `--pretty=format:${fmt}`, \"--\", filePath],\n cwd,\n );\n if (!output.trim()) return [];\n return output\n .split(\"\\n\")\n .map((line) => {\n const [sha = \"\", author = \"\", relative_date = \"\", subject = \"\"] = line.split(sep);\n return { sha, author, relative_date, subject };\n })\n .filter((c) => c.sha);\n}\n\nfunction runCommand(cmd: string, args: string[], cwd: string): Promise<string> {\n return new Promise((resolve, reject) => {\n const proc = spawn(cmd, args, { cwd, stdio: [\"ignore\", \"pipe\", \"pipe\"] });\n let stdout = \"\";\n let stderr = \"\";\n proc.stdout.on(\"data\", (chunk) => { stdout += chunk.toString(); });\n proc.stderr.on(\"data\", (chunk) => { stderr += chunk.toString(); });\n proc.on(\"error\", reject);\n proc.on(\"close\", (code) => {\n if (code === 0) resolve(stdout);\n else reject(new Error(stderr || `${cmd} exited with code ${code}`));\n });\n });\n}\n","import { existsSync } from \"node:fs\";\nimport {\n deriveConfidence,\n getUsage,\n loadMemoriesFromDir,\n loadUsageIndex,\n pathsOverlap,\n tokenizeQuery,\n type LoadedMemory,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemConflictsInputSchema = {\n id: z\n .string()\n .min(1)\n .describe(\"Memory id to check for conflicts.\"),\n min_score: z\n .number()\n .min(0)\n .max(1)\n .default(0.5)\n .describe(\"Minimum cosine similarity to consider a memory as a potential conflict (semantic mode).\"),\n semantic: z\n .boolean()\n .default(true)\n .describe(\"Use embeddings for similarity. Falls back to keyword overlap when embeddings are not installed.\"),\n};\n\nexport type MemConflictsInput = {\n [K in keyof typeof MemConflictsInputSchema]: z.infer<(typeof MemConflictsInputSchema)[K]>;\n};\n\nexport type ConflictReason =\n | \"opposite-status\"\n | \"attempt-vs-convention-same-paths\"\n | \"polarity-keywords\"\n | \"explicit-contradiction-tag\";\n\nexport interface ConflictHit {\n id: string;\n type: string;\n scope: string;\n status: string;\n confidence: string;\n body_preview: string;\n similarity: number | null;\n reasons: ConflictReason[];\n shared_paths: string[];\n}\n\nexport interface MemConflictsOutput {\n found: boolean;\n target?: { id: string; type: string; status: string };\n scanned: number;\n conflicts: ConflictHit[];\n notice?: string;\n}\n\nconst POSITIVE_PATTERNS = /\\b(use|prefer|always|should use|do this|recommended|ok to)\\b/i;\nconst NEGATIVE_PATTERNS = /\\b(do not use|don'?t use|never|avoid|forbidden|deprecated|stop using|do NOT|❌)\\b/i;\n\n/**\n * Find memories that potentially CONTRADICT the given memory. Useful before\n * relying on a memory's advice — surfaces \"another memory says the opposite\".\n *\n * Detection layers (any of these triggers a hit):\n * - Opposite status: target is validated, neighbor is rejected — for the same topic\n * - Type mismatch on overlapping paths: an `attempt` (don't do X) coexists with\n * a `convention` (do X) anchored to overlapping paths\n * - Polarity keywords: target says \"use X\" while a semantic neighbor says \"don't use X\"\n * - Explicit contradiction tag (#contradicts:<id>) in either body\n */\nexport async function memConflicts(\n input: MemConflictsInput,\n ctx: HaiveContext,\n): Promise<MemConflictsOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n return { found: false, scanned: 0, conflicts: [], notice: \"No .ai/memories directory.\" };\n }\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const target = all.find(({ memory }) => memory.frontmatter.id === input.id);\n if (!target) {\n return { found: false, scanned: 0, conflicts: [], notice: `Memory '${input.id}' not found.` };\n }\n\n const usage = await loadUsageIndex(ctx.paths);\n const others = all.filter(({ memory }) =>\n memory.frontmatter.id !== input.id &&\n memory.frontmatter.type !== \"session_recap\"\n );\n\n // Optional: get semantic similarity scores via embeddings\n const simScores = input.semantic ? await trySemanticSimilarities(ctx, target, others) : null;\n\n const targetText = (target.memory.body + \" \" + target.memory.frontmatter.tags.join(\" \"))\n .toLowerCase();\n const targetTokens = new Set(tokenizeQuery(targetText));\n const targetPolarity = polarity(targetText);\n const targetPaths = target.memory.frontmatter.anchor.paths;\n const explicitContradicts = extractContradictsTags(target.memory.body);\n\n const conflicts: ConflictHit[] = [];\n\n for (const other of others) {\n const fm = other.memory.frontmatter;\n const otherText = (other.memory.body + \" \" + fm.tags.join(\" \")).toLowerCase();\n const reasons: ConflictReason[] = [];\n\n const sim = simScores?.get(fm.id) ?? null;\n\n // Pre-filter: at least some keyword or path overlap or semantic hit.\n const hasPathOverlap = fm.anchor.paths.some((p) => targetPaths.some((tp) => pathsOverlap(p, tp)));\n const otherTokens = new Set(tokenizeQuery(otherText));\n const tokenOverlap = countIntersection(targetTokens, otherTokens);\n const isSemanticNeighbor = sim !== null && sim >= input.min_score;\n if (!hasPathOverlap && tokenOverlap < 4 && !isSemanticNeighbor) continue;\n\n // 1. Explicit contradicts tag\n const otherContradicts = extractContradictsTags(other.memory.body);\n if (explicitContradicts.has(fm.id) || otherContradicts.has(input.id)) {\n reasons.push(\"explicit-contradiction-tag\");\n }\n\n // 2. Opposite status (one validated, the other rejected on the same topic)\n if (\n target.memory.frontmatter.status === \"validated\" && fm.status === \"rejected\" ||\n target.memory.frontmatter.status === \"rejected\" && fm.status === \"validated\"\n ) {\n if (tokenOverlap >= 4 || isSemanticNeighbor) reasons.push(\"opposite-status\");\n }\n\n // 3. attempt vs convention/decision on overlapping paths\n if (hasPathOverlap) {\n const tType = target.memory.frontmatter.type;\n const oType = fm.type;\n const isAttemptVsRule = (tType === \"attempt\" && (oType === \"convention\" || oType === \"decision\")) ||\n (oType === \"attempt\" && (tType === \"convention\" || tType === \"decision\"));\n if (isAttemptVsRule) reasons.push(\"attempt-vs-convention-same-paths\");\n }\n\n // 4. Polarity inversion on shared keywords\n if (isSemanticNeighbor) {\n const otherPolarity = polarity(otherText);\n if (\n (targetPolarity === \"positive\" && otherPolarity === \"negative\") ||\n (targetPolarity === \"negative\" && otherPolarity === \"positive\")\n ) {\n reasons.push(\"polarity-keywords\");\n }\n }\n\n if (reasons.length === 0) continue;\n\n const u = getUsage(usage, fm.id);\n conflicts.push({\n id: fm.id,\n type: fm.type,\n scope: fm.scope,\n status: fm.status,\n confidence: deriveConfidence(fm, u),\n body_preview: other.memory.body.split(\"\\n\").slice(0, 4).join(\"\\n\").slice(0, 300),\n similarity: sim,\n reasons,\n shared_paths: fm.anchor.paths.filter((p) => targetPaths.some((tp) => pathsOverlap(p, tp))),\n });\n }\n\n // Rank: explicit > opposite-status > others; tiebreak by similarity desc\n conflicts.sort((a, b) => {\n const score = (c: ConflictHit): number =>\n (c.reasons.includes(\"explicit-contradiction-tag\") ? 100 : 0) +\n (c.reasons.includes(\"opposite-status\") ? 50 : 0) +\n (c.reasons.includes(\"attempt-vs-convention-same-paths\") ? 25 : 0) +\n (c.reasons.includes(\"polarity-keywords\") ? 10 : 0) +\n (c.similarity ?? 0) * 5;\n return score(b) - score(a);\n });\n\n return {\n found: true,\n target: {\n id: target.memory.frontmatter.id,\n type: target.memory.frontmatter.type,\n status: target.memory.frontmatter.status,\n },\n scanned: others.length,\n conflicts: conflicts.slice(0, 10),\n };\n}\n\nfunction polarity(text: string): \"positive\" | \"negative\" | \"neutral\" {\n const neg = NEGATIVE_PATTERNS.test(text);\n const pos = POSITIVE_PATTERNS.test(text);\n if (neg && !pos) return \"negative\";\n if (pos && !neg) return \"positive\";\n return \"neutral\";\n}\n\nfunction extractContradictsTags(body: string): Set<string> {\n const out = new Set<string>();\n for (const m of body.matchAll(/#contradicts:([\\w-]+)/g)) {\n if (m[1]) out.add(m[1]);\n }\n return out;\n}\n\nfunction countIntersection<T>(a: Set<T>, b: Set<T>): number {\n let n = 0;\n for (const x of a) if (b.has(x)) n++;\n return n;\n}\n\nasync function trySemanticSimilarities(\n ctx: HaiveContext,\n target: LoadedMemory,\n others: LoadedMemory[],\n): Promise<Map<string, 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(\n ctx.paths,\n target.memory.body,\n { limit: others.length },\n );\n if (!result) return null;\n const map = new Map<string, number>();\n for (const hit of result.hits) map.set(hit.id, hit.score);\n return map;\n}\n","import { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\nimport { antiPatternsCheck, type AntiPatternsWarning } from \"./anti-patterns-check.js\";\nimport { memForFiles } from \"./mem-for-files.js\";\nimport { memVerify } from \"./mem-verify.js\";\n\nexport const PreCommitCheckInputSchema = {\n diff: z\n .string()\n .optional()\n .describe(\n \"Raw unified diff text to scan. If omitted, only `paths` is used. \" +\n \"When called from a pre-commit hook, pipe the output of `git diff --cached`.\",\n ),\n paths: z\n .array(z.string())\n .default([])\n .describe(\"Project-relative paths affected by the change. At least one of `diff` or `paths` should be provided.\"),\n block_on: z\n .enum([\"any\", \"high-confidence\", \"never\"])\n .default(\"high-confidence\")\n .describe(\n \"When to set should_block=true: \" +\n \"'any' = any warning blocks; \" +\n \"'high-confidence' = only warnings from authoritative/trusted memories block; \" +\n \"'never' = report only, never block.\",\n ),\n semantic: z\n .boolean()\n .default(true)\n .describe(\"Enable semantic search in anti_patterns_check (requires embeddings index).\"),\n anchored_blocks: z\n .boolean()\n .default(false)\n .describe(\n \"When true, ALSO block a high-confidence anti-pattern (attempt/gotcha) that is anchored to a \" +\n \"touched file AND corroborated by the diff (literal token overlap, or semantic >= 0.45) — not just \" +\n \"very strong semantic matches. Powers the 'anchored' enforcement gate. Config/docs-only commits are \" +\n \"still downgraded. Default false preserves the soft, semantic-only blocking behavior.\",\n ),\n};\n\nexport type PreCommitCheckInput = {\n [K in keyof typeof PreCommitCheckInputSchema]: z.infer<(typeof PreCommitCheckInputSchema)[K]>;\n};\n\nexport interface PreCommitCheckOutput {\n /** True when at least one finding meets the configured block_on threshold. */\n should_block: boolean;\n /** Per-section summary; clients should surface the warnings + reasons to the user. */\n summary: {\n anti_patterns: number;\n blocking_warnings?: number;\n review_warnings?: number;\n info_warnings?: number;\n relevant_memories: number;\n stale_anchors: number;\n };\n warnings: ClassifiedAntiPatternsWarning[];\n /** Memories anchored to the touched files — convention reminders for the change author. */\n relevant_memories: Array<{\n id: string;\n type: string;\n confidence: string;\n body_preview: string;\n }>;\n /** Memories whose anchored paths overlap with the diff AND are now stale — likely outdated knowledge. */\n stale_anchors: Array<{\n id: string;\n paths: string[];\n body_preview: string;\n }>;\n notice?: string;\n}\n\nexport type AntiPatternLevel = \"blocking\" | \"review\" | \"info\";\n\nexport interface ClassifiedAntiPatternsWarning extends AntiPatternsWarning {\n /**\n * blocking = commit gate should fail for the configured threshold;\n * review = plausible but not strong enough to block;\n * info = weak signal, hidden by default in human CLI output.\n */\n level: AntiPatternLevel;\n rationale: string;\n affected_files: string[];\n repair_command: string;\n}\n\n/**\n * One-shot \"should I block this commit?\" check.\n *\n * Combines three signals into a single call agents and git hooks can consume:\n * 1. anti_patterns_check — known gotchas/attempts that match the diff\n * 2. mem_for_files — conventions/decisions anchored to touched files\n * 3. mem_verify — memories whose anchors are stale (knowledge may be wrong)\n *\n * Returns should_block per the configured threshold, plus the raw findings so\n * the caller can render them. CLI wrapper: `haive precommit`.\n */\nexport async function preCommitCheck(\n input: PreCommitCheckInput,\n ctx: HaiveContext,\n): Promise<PreCommitCheckOutput> {\n if (!input.diff && input.paths.length === 0) {\n return {\n should_block: false,\n summary: { anti_patterns: 0, relevant_memories: 0, stale_anchors: 0 },\n warnings: [],\n relevant_memories: [],\n stale_anchors: [],\n notice: \"Nothing to check — provide either `diff` or `paths`.\",\n };\n }\n\n // 1. Known anti-patterns\n const apResult = await antiPatternsCheck({\n diff: input.diff,\n paths: input.paths,\n limit: 20,\n semantic: input.semantic,\n }, ctx);\n\n // 2. Relevant conventions/decisions for the touched files\n const relevant = input.paths.length > 0\n ? await memForFiles({ files: input.paths, include_module_contexts: false, track: false }, ctx)\n : { by_anchor: [], by_module: [], by_domain: [], module_contexts: [], inferred_modules: [] };\n // Anchor matches are the most relevant for pre-commit; include module hits as a softer signal.\n const relevantMatches = [...relevant.by_anchor, ...relevant.by_module];\n\n // 3. Verify anchors — surface stale memories that touch these files\n const verifyResult = input.paths.length > 0\n ? await memVerify({ update: false, id: undefined }, ctx)\n : { results: [], summary: { checked: 0, fresh: 0, stale: 0, anchorless_skipped: 0, updated: 0 } };\n // We surface a stale memory when at least one of the verify hits says stale=true.\n // We don't have direct access to the memory's anchored paths from MemVerifyHit, so we rely on\n // mem_for_files to scope these to \"memories that touch our files\".\n const filesTouching = new Set(relevantMatches.map((m) => m.id));\n const staleHits = verifyResult.results.filter((r) => r.stale && filesTouching.has(r.id));\n\n // Determine should_block\n const blockOn = input.block_on;\n const classifiedWarnings = apResult.warnings.map((warning) => classifyWarning(warning, input.paths, input.anchored_blocks));\n const blockingWarnings = classifiedWarnings.filter((w) => w.level === \"blocking\");\n const reviewWarnings = classifiedWarnings.filter((w) => w.level === \"review\");\n const infoWarnings = classifiedWarnings.filter((w) => w.level === \"info\");\n let should_block = false;\n if (blockOn !== \"never\") {\n if (blockOn === \"any\" && (blockingWarnings.length > 0 || reviewWarnings.length > 0 || staleHits.length > 0)) should_block = true;\n if (blockOn === \"high-confidence\" && (blockingWarnings.length > 0 || staleHits.length > 0)) should_block = true;\n }\n\n // Map mem_for_files output to a simpler shape\n const relevant_memories = relevantMatches.slice(0, 8).map((m) => ({\n id: m.id,\n type: m.type,\n confidence: String(m.confidence),\n body_preview: (m.body ?? \"\").split(\"\\n\").slice(0, 4).join(\"\\n\").slice(0, 250),\n }));\n\n return {\n should_block,\n summary: {\n anti_patterns: apResult.warnings.length,\n blocking_warnings: blockingWarnings.length,\n review_warnings: reviewWarnings.length,\n info_warnings: infoWarnings.length,\n relevant_memories: relevant_memories.length,\n stale_anchors: staleHits.length,\n },\n warnings: classifiedWarnings,\n relevant_memories,\n stale_anchors: staleHits.map((r) => {\n const match = relevantMatches.find((m) => m.id === r.id);\n // Intersect the stale memory's anchor paths with the paths the caller provided\n // so the output lists only the touched files that are actually anchored to this memory.\n const overlapping = match\n ? input.paths.filter((p) =>\n match.anchor_paths.some((ap) => ap === p || p.startsWith(ap + \"/\") || ap.startsWith(p + \"/\")),\n )\n : [];\n return {\n id: r.id,\n paths: overlapping.length > 0 ? overlapping : (match ? input.paths : []),\n body_preview: r.reason ?? \"anchored code drifted; verify before relying on this memory\",\n };\n }),\n };\n}\n\nfunction classifyWarning(\n warning: AntiPatternsWarning,\n paths: string[],\n anchoredBlocks = false,\n): ClassifiedAntiPatternsWarning {\n const affectedFiles = paths.filter((p) =>\n !p.startsWith(\".ai/.usage/\") &&\n !p.startsWith(\".ai/.cache/\") &&\n !p.startsWith(\".ai/.runtime/\")\n );\n const repairCommand = repairCommandForWarning(warning, affectedFiles);\n const fileDowngrade = fileTypeDowngradeReason(warning, affectedFiles);\n\n if (fileDowngrade) {\n return {\n ...warning,\n level: \"info\",\n rationale: fileDowngrade,\n affected_files: affectedFiles,\n repair_command: repairCommand,\n };\n }\n\n if (warning.reasons.includes(\"sensor\")) {\n if (warning.sensor_severity === \"block\") {\n return {\n ...warning,\n level: \"blocking\",\n rationale: \"deterministic hAIve sensor with block severity matched the added diff\",\n affected_files: affectedFiles,\n repair_command: repairCommand,\n };\n }\n return {\n ...warning,\n level: \"review\",\n rationale: \"deterministic hAIve sensor with warn severity matched the added diff\",\n affected_files: affectedFiles,\n repair_command: repairCommand,\n };\n }\n\n if (isBlockingWarning(warning)) {\n if (warning.scope === \"personal\") {\n return {\n ...warning,\n level: \"review\",\n rationale:\n \"personal anti-pattern memories are review guidance unless a deterministic block-severity sensor fires\",\n affected_files: affectedFiles,\n repair_command: repairCommand,\n };\n }\n // Sensor veto applies here too: even a very strong semantic match should not\n // hard-block when the memory's authoritative sensor did not fire. The sensor\n // encodes the exact bad pattern; a non-firing sensor means the diff doesn't\n // contain it, so downgrade to review regardless of the semantic score.\n if (warning.has_sensor && !warning.reasons.includes(\"sensor\")) {\n return {\n ...warning,\n level: \"review\",\n rationale:\n \"memory has a sensor that did not fire — sensor is the authoritative check; strong semantic match alone is insufficient to block\",\n affected_files: affectedFiles,\n repair_command: repairCommand,\n };\n }\n return {\n ...warning,\n level: \"blocking\",\n rationale:\n \"authoritative/trusted memory plus very strong semantic match to the diff (score >= 0.75)\",\n affected_files: affectedFiles,\n repair_command: repairCommand,\n };\n }\n\n const hasSemantic = warning.reasons.includes(\"semantic\");\n const semanticScore = warning.semantic_score ?? 0;\n const highConfidence =\n warning.confidence === \"authoritative\" || warning.confidence === \"trusted\";\n\n // Anchored gate: when the caller opts in, a high-confidence anti-pattern that is anchored to a\n // touched file AND corroborated by the diff (literal token overlap, or a moderate semantic match)\n // is precise enough to block. This is what makes \"known bad approaches are blocked before commit\"\n // true for the case it matters most — you are editing the exact file a documented attempt/gotcha\n // warns about, and the diff contains the same idea. Config/docs-only commits already returned\n // above via fileTypeDowngradeReason, so this cannot re-introduce that false-positive class.\n if (\n anchoredBlocks &&\n highConfidence &&\n warning.scope !== \"personal\" &&\n warning.reasons.includes(\"anchor\") &&\n // A literal overlap only corroborates a BLOCK when it is on a token *distinctive*\n // to this gotcha (rare in the corpus). Sharing a common domain word (\"memory\",\n // \"scope\", \"version\") — or a version-bump diff — no longer hard-blocks; it falls\n // through to `review` below. This kills the incidental-token false positives that\n // made agents work for nothing. A moderate semantic match still corroborates.\n (warning.distinctive_literal === true || (hasSemantic && semanticScore >= 0.45))\n ) {\n // Sensor veto: if the memory has a sensor and it did NOT fire, the sensor is the\n // authoritative check for this memory. Broad literal token matching is too noisy\n // to block on its own — the sensor encodes the exact bad pattern. Downgrade to review\n // so the human sees the warning without being hard-blocked on a false positive.\n if (warning.has_sensor && !warning.reasons.includes(\"sensor\")) {\n return {\n ...warning,\n level: \"review\",\n rationale:\n \"memory has a sensor that did not fire — literal match alone is insufficient to block; sensor is the authoritative check\",\n affected_files: affectedFiles,\n repair_command: repairCommand,\n };\n }\n\n return {\n ...warning,\n level: \"blocking\",\n rationale:\n \"high-confidence anti-pattern anchored to a touched file and corroborated by the diff (anchored gate)\",\n affected_files: affectedFiles,\n repair_command: repairCommand,\n };\n }\n\n // Sensor veto for review: a memory that carries a deterministic sensor which did NOT fire, and is\n // not anchored to any touched file, is strong evidence the diff does not contain its pattern — the\n // sensor is the authoritative check. Surfacing it as \"review\" is pure noise (this was the bulk of\n // the 11 review hits on a 3-line `: any` diff). Demote to info (hidden in concise output).\n if (warning.has_sensor && !warning.reasons.includes(\"sensor\") && !warning.reasons.includes(\"anchor\")) {\n return {\n ...warning,\n level: \"info\",\n rationale:\n \"memory has a deterministic sensor that did not fire and is not anchored to a touched file — treated as non-violation noise\",\n affected_files: affectedFiles,\n repair_command: repairCommand,\n };\n }\n\n // A bare semantic match (not anchored to a touched file, no distinctive token) needs a stronger\n // score to be worth a human's attention. At 0.45–0.65 against generic text it is mostly noise — and\n // review noise trains agents to ignore the gate. Corroborated matches (anchored or distinctive\n // literal) keep the lower 0.45 bar; everything weaker falls through to \"info\" (hidden by default).\n const corroborated = warning.reasons.includes(\"anchor\") || warning.distinctive_literal === true;\n const semanticReviewFloor = corroborated ? 0.45 : 0.65;\n if (\n (hasSemantic && semanticScore >= semanticReviewFloor) ||\n (highConfidence && warning.reasons.includes(\"anchor\") && warning.reasons.includes(\"literal\"))\n ) {\n return {\n ...warning,\n level: \"review\",\n rationale:\n hasSemantic\n ? \"semantic match is plausible but below blocking threshold\"\n : \"anchored high-confidence memory also matched diff tokens, but no strong semantic proof\",\n affected_files: affectedFiles,\n repair_command: repairCommand,\n };\n }\n\n return {\n ...warning,\n level: \"info\",\n rationale:\n \"weak signal only (literal/anchor/low semantic evidence); surfaced for audit, hidden in concise CLI output\",\n affected_files: affectedFiles,\n repair_command: repairCommand,\n };\n}\n\nfunction isBlockingWarning(warning: AntiPatternsWarning): boolean {\n const highConfidence = warning.confidence === \"authoritative\" || warning.confidence === \"trusted\";\n if (!highConfidence) return false;\n\n // Anchors and lexical matches prove relevance, not violation. A broad diff\n // can touch package files or share common tokens with old gotchas. Require\n // a semantic corroboration strong enough to indicate the same mistake. Scores\n // in the 0.65-0.75 range are still useful review signals, but are too noisy\n // to block commits reliably even when the memory is anchored to a test file.\n if (!warning.reasons.includes(\"semantic\")) return false;\n return (warning.semantic_score ?? 0) >= 0.75;\n}\n\nexport function classifyAntiPatternWarningForTest(\n warning: AntiPatternsWarning,\n paths: string[],\n anchoredBlocks = false,\n): ClassifiedAntiPatternsWarning {\n return classifyWarning(warning, paths, anchoredBlocks);\n}\n\nfunction fileTypeDowngradeReason(\n warning: AntiPatternsWarning,\n paths: string[],\n): string | null {\n if (paths.length === 0) return null;\n if (paths.every((p) => p.startsWith(\".ai/.usage/\") || p === \".ai/.usage/tool-usage.jsonl\")) {\n return \".ai usage logs are local telemetry and never block commits.\";\n }\n\n const docsOnly = paths.every(isDocLikePath);\n if (docsOnly && !hasStrongSemantic(warning)) {\n return \"docs/changelog-only change; anti-pattern is downgraded unless semantic evidence is strong.\";\n }\n\n const configOnly = paths.every(isPackageOrConfigPath);\n // Any non-anchored, non-strongly-semantic warning is suppressed on config/workflow-only commits.\n // Gotchas that happen to share tokens with config file names (npm, install, package.json,\n // haive init, workspace:*) would otherwise fire on every dependency bump or workflow change.\n if (configOnly && !warning.reasons.includes(\"anchor\") && !hasStrongSemantic(warning)) {\n return \"package/config-only change; warning has no anchor on these files and no strong semantic match — downgraded to info.\";\n }\n\n // Inverse case: a package/build/tooling gotcha firing on a change that touches NO\n // package/build file. These match by shared tokens (\"install\", \"package\", \"build\")\n // and are almost always false positives on pure source edits.\n const touchesBuildFile = paths.some(isPackageOrConfigPath);\n if (!touchesBuildFile && isBuildScopedWarning(warning) && !warning.reasons.includes(\"anchor\") && !hasStrongSemantic(warning)) {\n return \"build/packaging gotcha, but no package/build file changed — downgraded to info.\";\n }\n\n return null;\n}\n\n/**\n * True when a warning is about build/packaging/tooling concerns — by its tags, or\n * because every path it is anchored to is itself a package/config file.\n */\nfunction isBuildScopedWarning(warning: AntiPatternsWarning): boolean {\n const tags = warning.tags ?? [];\n if (tags.some((t) => BUILD_SCOPED_TAGS.has(t.toLowerCase()))) return true;\n const anchors = warning.anchor_paths ?? [];\n return anchors.length > 0 && anchors.every(isPackageOrConfigPath);\n}\n\nconst BUILD_SCOPED_TAGS = new Set([\n \"npm\", \"pnpm\", \"yarn\", \"publish\", \"install\", \"packaging\", \"package\",\n \"build\", \"tsup\", \"bundler\", \"monorepo\", \"workspace\", \"versioning\", \"version\",\n \"dev-workflow\", \"hotswap\", \"ci\", \"workflow\", \"release\", \"changelog\",\n \"dependencies\", \"deps\", \"dependency\", \"tooling\", \"config\",\n]);\n\nfunction hasStrongSemantic(warning: AntiPatternsWarning): boolean {\n return warning.reasons.includes(\"semantic\") && (warning.semantic_score ?? 0) >= 0.65;\n}\n\nfunction isDocLikePath(file: string): boolean {\n const lower = file.toLowerCase();\n return lower.endsWith(\".md\") ||\n lower.includes(\"changelog\") ||\n lower.startsWith(\"docs/\") ||\n lower.startsWith(\".github/\") && lower.endsWith(\".md\");\n}\n\nfunction isPackageOrConfigPath(file: string): boolean {\n const lower = file.toLowerCase();\n const base = lower.split(\"/\").pop() ?? lower;\n return lower.endsWith(\"package.json\") ||\n lower.endsWith(\"package-lock.json\") ||\n lower.endsWith(\"pnpm-lock.yaml\") ||\n lower.endsWith(\"yarn.lock\") ||\n lower.endsWith(\"bun.lockb\") ||\n lower.endsWith(\".config.ts\") ||\n lower.endsWith(\".config.js\") ||\n isJsonConfigFile(base) ||\n lower.endsWith(\".yml\") ||\n lower.endsWith(\".yaml\") ||\n lower.endsWith(\".toml\") ||\n lower.startsWith(\".github/workflows/\") ||\n lower.startsWith(\".github/\") && lower.endsWith(\".yml\") ||\n // Dotfiles that are pure configuration/tooling — never trigger runtime gotchas\n base === \".gitignore\" ||\n base === \".gitattributes\" ||\n base === \".gitmodules\" ||\n base === \".editorconfig\" ||\n base === \".nvmrc\" ||\n base === \".node-version\" ||\n base === \".npmrc\" ||\n base === \".yarnrc\" ||\n base === \".yarnrc.yml\" ||\n base === \".dockerignore\" ||\n base === \"dockerfile\" ||\n base.startsWith(\"dockerfile.\") ||\n base === \".env.example\" ||\n base === \".env.template\" ||\n lower.endsWith(\".prettierrc\") ||\n lower.endsWith(\".eslintrc\") ||\n lower.endsWith(\".eslintignore\") ||\n lower.endsWith(\".prettierignore\") ||\n lower.endsWith(\".stylelintrc\") ||\n lower.endsWith(\".browserslistrc\");\n}\n\n/**\n * Returns true only for JSON files that are known build/tool configs.\n * Avoids treating application data files (fixtures, translations, schemas) as config.\n */\nfunction isJsonConfigFile(base: string): boolean {\n const knownConfigs = new Set([\n \"tsconfig.json\", \"jsconfig.json\",\n \"deno.json\", \"deno.jsonc\",\n \"nx.json\", \"turbo.json\", \"lerna.json\", \"rush.json\",\n \"jest.config.json\", \"vitest.config.json\", \"babel.config.json\",\n \".babelrc.json\", \".swcrc\", \".mocharc.json\",\n \"renovate.json\", \"dependabot.json\",\n \".prettierrc.json\", \".eslintrc.json\", \".stylelintrc.json\",\n ]);\n if (knownConfigs.has(base)) return true;\n // tsconfig.*.json (e.g. tsconfig.build.json, tsconfig.test.json)\n if (/^tsconfig\\..+\\.json$/.test(base)) return true;\n // .*rc.json (e.g. .eslintrc.json already covered, but be safe)\n if (/^\\.[a-z]+rc\\.json$/.test(base)) return true;\n return false;\n}\n\nfunction repairCommandForWarning(warning: AntiPatternsWarning, paths: string[]): string {\n const targetPath = repairTargetPathForWarning(warning, paths);\n return targetPath\n ? `haive briefing --files \"${targetPath}\" --task \"review ${warning.id}\"`\n : `haive memory show ${warning.id}`;\n}\n\nfunction repairTargetPathForWarning(warning: AntiPatternsWarning, paths: string[]): string | undefined {\n const usablePaths = paths.filter((p) =>\n !p.startsWith(\".ai/.usage/\") &&\n !p.startsWith(\".ai/.cache/\") &&\n !p.startsWith(\".ai/.runtime/\")\n );\n const anchors = warning.anchor_paths ?? [];\n for (const file of usablePaths) {\n if (anchors.some((anchor) => anchor === file || file.startsWith(`${anchor}/`) || anchor.startsWith(`${file}/`))) {\n return file;\n }\n }\n return usablePaths[0];\n}\n","/**\n * pattern_detect — heuristic memory detector that runs without an LLM.\n *\n * Three signals (no LLM required):\n * 1. CONFIG_CHANGE: git diff shows changes to config files\n * (tsconfig, eslint, prettier, vitest, .env.example, …)\n * → proposes a convention memory with the diff as body.\n *\n * 2. REPEATED_PATH: same file path appears in ≥ N consecutive mem_tried /\n * mem_observe events in the usage log\n * → proposes a gotcha memory anchored to that path.\n *\n * 3. HOT_FILE: a non-config source file appears in mem_save / mem_tried /\n * mem_observe summaries ≥ 3 times in the look-back window\n * → proposes a convention memory (frequent edits signal a pattern).\n *\n * Output is `status: proposed` — auto-promote (Phase 4) or the next\n * get_briefing post_task flow will validate/reject them.\n *\n * Runs entirely from the local filesystem: git, usage log, no network.\n */\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { execSync } from \"node:child_process\";\nimport {\n buildFrontmatter,\n memoryFilePath,\n readUsageEvents,\n serializeMemory,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\n// ── Constants ──────────────────────────────────────────────────────────────\n\n/** Glob patterns (lowercased) that identify config files. */\nconst CONFIG_PATTERNS = [\n \".eslintrc\", \"eslint.config\", \"prettier.config\", \".prettierrc\",\n \"tsconfig\", \"jsconfig\",\n \"vitest.config\", \"jest.config\",\n \".env.example\", \".env.defaults\",\n \"tailwind.config\", \"vite.config\", \"next.config\",\n \"babel.config\", \"postcss.config\",\n \"renovate.json\", \"dependabot.yml\",\n];\n\n/** Max length of a git diff included in a proposed memory body. */\nconst MAX_DIFF_BYTES = 4096;\n\n/** Threshold: path must appear this many times to trigger a HOT_FILE signal. */\nconst HOT_FILE_MIN = 3;\n\n// ── Input / Output ─────────────────────────────────────────────────────────\n\nexport const PatternDetectInputSchema = {\n since_days: z\n .number()\n .int()\n .min(1)\n .default(7)\n .describe(\"Look-back window in days for both git history and usage log.\"),\n dry_run: z\n .boolean()\n .default(false)\n .describe(\"When true, report matches without writing any memory files.\"),\n scope: z\n .enum([\"personal\", \"team\"])\n .default(\"team\")\n .describe(\"Scope for proposed memories.\"),\n};\n\nexport type PatternDetectInput = {\n [K in keyof typeof PatternDetectInputSchema]: z.infer<(typeof PatternDetectInputSchema)[K]>;\n};\n\nexport type PatternKind = \"config_change\" | \"repeated_path\" | \"hot_file\";\n\nexport interface PatternMatch {\n kind: PatternKind;\n signal: string;\n proposed_type: \"convention\" | \"gotcha\";\n proposed_slug: string;\n proposed_body: string;\n anchor_paths: string[];\n}\n\nexport interface PatternDetectOutput {\n scanned_events: number;\n matches: PatternMatch[];\n /** Number of proposed memories saved (0 if dry_run). */\n saved: number;\n /** IDs of saved memories. */\n saved_ids: string[];\n notice?: string;\n}\n\n// ── Implementation ─────────────────────────────────────────────────────────\n\nexport async function patternDetect(\n input: PatternDetectInput,\n ctx: HaiveContext,\n): Promise<PatternDetectOutput> {\n if (!existsSync(ctx.paths.haiveDir)) {\n return {\n scanned_events: 0, matches: [], saved: 0, saved_ids: [],\n notice: \"No .ai/ directory found. Run 'haive init' first.\",\n };\n }\n\n const matches: PatternMatch[] = [];\n\n // ── Signal 1: CONFIG_CHANGE ─────────────────────────────────────────────\n try {\n const changedFiles = gitChangedFiles(ctx.paths.root, input.since_days);\n const configFiles = changedFiles.filter((f) =>\n CONFIG_PATTERNS.some((p) => path.basename(f.toLowerCase()).includes(p)),\n );\n for (const file of configFiles.slice(0, 5)) {\n const diff = gitFileDiff(ctx.paths.root, file, input.since_days);\n if (!diff) continue;\n // Include the nearest parent dir so `cli/vitest.config.ts` and\n // `core/vitest.config.ts` produce distinct slugs instead of colliding.\n const parentDir = path.basename(path.dirname(file));\n const baseName = path.basename(file).replace(/\\.[^.]+$/, \"\");\n const slug = `${parentDir}-${baseName}`\n .replace(/[^a-z0-9]/gi, \"-\")\n .toLowerCase()\n .slice(0, 40);\n matches.push({\n kind: \"config_change\",\n signal: `Config file modified: ${file}`,\n proposed_type: \"convention\",\n proposed_slug: `config-change-${slug}`,\n proposed_body: [\n `# Config change: \\`${file}\\``,\n \"\",\n \"This configuration file was recently modified. The diff below captures the intent.\",\n \"Review and update this memory with the **reason** for the change if known.\",\n \"\",\n \"```diff\",\n diff.slice(0, MAX_DIFF_BYTES),\n \"```\",\n ].join(\"\\n\"),\n anchor_paths: [file],\n });\n }\n } catch { /* git not available or no history — skip */ }\n\n // ── Signals 2 & 3: usage log analysis ──────────────────────────────────\n const events = await readUsageEvents(ctx.paths);\n const cutoff = Date.now() - input.since_days * 24 * 60 * 60 * 1000;\n const recent = events.filter((e) => Date.parse(e.at) >= cutoff);\n\n // Build per-path occurrence counts from writing tools\n const pathCounts = new Map<string, { count: number; tools: Set<string> }>();\n for (const e of recent) {\n if (![\"mem_tried\", \"mem_observe\", \"mem_save\"].includes(e.tool)) continue;\n if (!e.summary) continue;\n // Extract file-like tokens from the summary\n const tokens = e.summary.match(/[^\\s\"'`,;()[\\]{}]+\\.[a-zA-Z]{1,6}/g) ?? [];\n for (const t of tokens) {\n const key = t.toLowerCase();\n const existing = pathCounts.get(key);\n if (existing) {\n existing.count++;\n existing.tools.add(e.tool);\n } else {\n pathCounts.set(key, { count: 1, tools: new Set([e.tool]) });\n }\n }\n }\n\n // Signal 2: REPEATED_PATH — path appears mostly in mem_tried / mem_observe\n for (const [p, { count, tools }] of pathCounts) {\n if (count < HOT_FILE_MIN) continue;\n const isGotchaSignal = tools.has(\"mem_tried\") || tools.has(\"mem_observe\");\n if (!isGotchaSignal) continue;\n const slug = p.replace(/[^a-z0-9]/g, \"-\").replace(/-+/g, \"-\").slice(0, 40);\n matches.push({\n kind: \"repeated_path\",\n signal: `Path '${p}' appears ${count}× in mem_tried/mem_observe events`,\n proposed_type: \"gotcha\",\n proposed_slug: `repeated-issue-${slug}`,\n proposed_body: [\n `# Recurring issue near \\`${p}\\``,\n \"\",\n `This file appeared ${count} times in failed-approach or observation events ` +\n `over the last ${input.since_days} days. ` +\n \"Review the related attempt/gotcha memories and consolidate them into a single authoritative gotcha.\",\n \"\",\n `**Source signals:** ${[...tools].join(\", \")} (${count} events)`,\n ].join(\"\\n\"),\n anchor_paths: [p],\n });\n }\n\n // Signal 3: HOT_FILE — any path appearing ≥ HOT_FILE_MIN times in any writing tool\n for (const [p, { count, tools }] of pathCounts) {\n if (count < HOT_FILE_MIN) continue;\n if (tools.has(\"mem_tried\") || tools.has(\"mem_observe\")) continue; // already covered by Signal 2\n // Only flag non-config source files\n if (CONFIG_PATTERNS.some((cp) => path.basename(p).includes(cp))) continue;\n const slug = p.replace(/[^a-z0-9]/g, \"-\").replace(/-+/g, \"-\").slice(0, 40);\n matches.push({\n kind: \"hot_file\",\n signal: `Path '${p}' referenced ${count}× across mem_save events`,\n proposed_type: \"convention\",\n proposed_slug: `hot-file-${slug}`,\n proposed_body: [\n `# Frequent edits to \\`${p}\\``,\n \"\",\n `This file was referenced ${count} times in memory-saving events over the last ` +\n `${input.since_days} days — a signal that a recurring pattern or convention applies here.`,\n \"\",\n \"**Suggested action:** review recent memories anchored to this path and extract the \" +\n \"common pattern as a named convention.\",\n ].join(\"\\n\"),\n anchor_paths: [p],\n });\n }\n\n if (matches.length === 0) {\n return {\n scanned_events: recent.length,\n matches: [],\n saved: 0,\n saved_ids: [],\n notice: `No patterns detected in the last ${input.since_days} days (${recent.length} events scanned).`,\n };\n }\n\n if (input.dry_run) {\n return { scanned_events: recent.length, matches, saved: 0, saved_ids: [] };\n }\n\n // ── Save proposed memories ──────────────────────────────────────────────\n const savedIds: string[] = [];\n for (const match of matches) {\n try {\n const fm = buildFrontmatter({\n type: match.proposed_type,\n slug: match.proposed_slug,\n scope: input.scope,\n tags: [\"pattern-detect\", match.kind],\n paths: match.anchor_paths,\n status: \"proposed\",\n });\n const file = memoryFilePath(\n ctx.paths,\n fm.scope === \"shared\" ? \"team\" : fm.scope,\n fm.id,\n undefined,\n );\n if (existsSync(file)) continue; // don't overwrite existing\n await mkdir(path.dirname(file), { recursive: true });\n await writeFile(\n file,\n serializeMemory({ frontmatter: fm, body: match.proposed_body }),\n \"utf8\",\n );\n savedIds.push(fm.id);\n } catch { /* skip failures — non-blocking */ }\n }\n\n return {\n scanned_events: recent.length,\n matches,\n saved: savedIds.length,\n saved_ids: savedIds,\n };\n}\n\n// ── Git helpers ────────────────────────────────────────────────────────────\n\nfunction gitChangedFiles(root: string, sinceDays: number): string[] {\n try {\n const out = execSync(\n `git log --name-only --pretty=\"\" --diff-filter=AM --since=\"${sinceDays} days ago\"`,\n { cwd: root, encoding: \"utf8\", timeout: 5000, stdio: [\"ignore\", \"pipe\", \"ignore\"] },\n );\n return [...new Set(out.split(\"\\n\").map((l) => l.trim()).filter(Boolean))];\n } catch {\n return [];\n }\n}\n\nfunction gitFileDiff(root: string, file: string, sinceDays: number): string | null {\n try {\n const out = execSync(\n `git log -p --follow --since=\"${sinceDays} days ago\" -- \"${file}\"`,\n { cwd: root, encoding: \"utf8\", timeout: 5000, stdio: [\"ignore\", \"pipe\", \"ignore\"] },\n );\n if (!out.trim()) return null;\n // Extract only the diff hunks (lines starting with +/- or @@)\n const diffLines = out.split(\"\\n\").filter((l) =>\n l.startsWith(\"+\") || l.startsWith(\"-\") || l.startsWith(\"@@\") || l.startsWith(\"diff\"),\n );\n return diffLines.join(\"\\n\").slice(0, MAX_DIFF_BYTES) || null;\n } catch {\n return null;\n }\n}\n","import { existsSync } from \"node:fs\";\nimport {\n findLexicalConflictPairs,\n findTopicStatusConflictPairs,\n loadMemoriesFromDir,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemConflictCandidatesInputSchema = {\n since_days: z\n .number()\n .int()\n .positive()\n .max(3650)\n .default(365)\n .describe(\"Only memories created since N days ago\"),\n types: z\n .array(z.enum([\"decision\", \"architecture\", \"convention\", \"gotcha\"]))\n .default([\"decision\", \"architecture\"])\n .describe(\"Memory types scanned for pairwise lexical overlap\"),\n min_jaccard: z\n .number()\n .min(0)\n .max(1)\n .default(0.45)\n .describe(\"Minimum Jaccard token similarity to surface as a candidate pair\"),\n max_pairs: z\n .number()\n .int()\n .positive()\n .max(100)\n .default(20)\n .describe(\"Cap pairs returned\"),\n max_scan: z\n .number()\n .int()\n .positive()\n .max(2000)\n .default(500)\n .describe(\"Maximum memories sampled for O(n²) scan — excess dropped after chronological sort.\"),\n max_topic_pairs: z\n .number()\n .int()\n .positive()\n .max(100)\n .default(20)\n .describe(\n \"Cap for extra signal: memories sharing the same topic with validated vs rejected status.\",\n ),\n};\n\nexport type MemConflictCandidatesInput = {\n [K in keyof typeof MemConflictCandidatesInputSchema]: z.infer<\n (typeof MemConflictCandidatesInputSchema)[K]\n >;\n};\n\nexport async function memConflictCandidates(\n input: MemConflictCandidatesInput,\n ctx: HaiveContext,\n) {\n if (!existsSync(ctx.paths.memoriesDir)) {\n return {\n pairs: [],\n topic_status_pairs: [],\n scanned: 0,\n truncated: false,\n notice: \"No .ai/memories directory.\",\n };\n }\n\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const { pairs, scanned, truncated } = findLexicalConflictPairs(all, {\n sinceDays: input.since_days,\n types: input.types,\n minJaccard: input.min_jaccard,\n maxPairs: input.max_pairs,\n maxScan: input.max_scan,\n });\n const topicStatusPairs = findTopicStatusConflictPairs(all, input.max_topic_pairs);\n\n const notice =\n pairs.length === 0 && topicStatusPairs.length === 0\n ? \"No lexical or topic-status candidates — widen since_days/types or lower min_jaccard.\"\n : undefined;\n\n return { pairs, topic_status_pairs: topicStatusPairs, scanned, truncated, notice };\n}\n","import { resolveProjectInfo } from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\n/** Input is intentionally minimal — callers may pass cwd for multi-root clients. */\nexport const MemResolveProjectInputSchema = {\n cwd: z\n .string()\n .optional()\n .describe(\"Directory used for root discovery when HAIVE_PROJECT_ROOT is unset.\"),\n};\n\nexport type MemResolveProjectInput = {\n [K in keyof typeof MemResolveProjectInputSchema]: z.infer<(typeof MemResolveProjectInputSchema)[K]>;\n};\n\nexport async function memResolveProject(\n input: MemResolveProjectInput,\n _ctx: HaiveContext,\n): Promise<{ info: ReturnType<typeof resolveProjectInfo>; ok: true }> {\n void _ctx;\n return {\n ok: true,\n info: resolveProjectInfo({\n cwd: input.cwd,\n }),\n };\n}\n","import { MemoryTypeSchema, suggestTopicKey } from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemSuggestTopicInputSchema = {\n type: MemoryTypeSchema.describe(\"Memory kind — drives the suggested topic family.\"),\n title: z\n .string()\n .min(1)\n .describe(\"Short title or phrase (headers, headings) — turned into slug\"),\n};\n\nexport type MemSuggestTopicInput = {\n [K in keyof typeof MemSuggestTopicInputSchema]: z.infer<(typeof MemSuggestTopicInputSchema)[K]>;\n};\n\nexport async function memSuggestTopic(\n input: MemSuggestTopicInput,\n _ctx: HaiveContext,\n): Promise<{ topic_key: string; family: string; type: string }> {\n void _ctx;\n const suggestion = suggestTopicKey(input.type, input.title);\n return { topic_key: suggestion.topic_key, family: suggestion.family, type: input.type };\n}\n","import { existsSync } from \"node:fs\";\nimport { collectTimelineEntries, loadMemoriesFromDir } from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemTimelineInputSchema = {\n memory_id: z.string().optional().describe(\"Seed id — expands via related_ids, topic, anchors\"),\n topic: z\n .string()\n .optional()\n .describe(\"Frontmatter.topic value — chronological list when memory_id omitted\"),\n limit: z\n .number()\n .int()\n .positive()\n .max(100)\n .default(30)\n .describe(\"Max timeline entries returned\"),\n};\n\nexport type MemTimelineInput = {\n [K in keyof typeof MemTimelineInputSchema]: z.infer<(typeof MemTimelineInputSchema)[K]>;\n};\n\nexport async function memTimeline(input: MemTimelineInput, ctx: HaiveContext) {\n if (!existsSync(ctx.paths.memoriesDir)) {\n return { entries: [], total: 0, notice: \"No .ai/memories directory.\" };\n }\n\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const { entries, notice } = collectTimelineEntries(all, {\n memoryId: input.memory_id,\n topic: input.topic,\n limit: input.limit,\n });\n return { entries, total: entries.length, notice };\n}\n","import { appendRuntimeJournalEntry } from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const RuntimeJournalAppendInputSchema = {\n message: z.string().min(1).describe(\"Short line to append to the runtime session journal\"),\n kind: z.enum([\"note\", \"session_end\", \"mcp\"]).default(\"note\"),\n tool: z.string().optional().describe(\"When kind=mcp, which tool name (optional)\"),\n};\n\nexport type RuntimeJournalAppendInput = {\n [K in keyof typeof RuntimeJournalAppendInputSchema]: z.infer<\n (typeof RuntimeJournalAppendInputSchema)[K]\n >;\n};\n\nexport async function runtimeJournalAppend(\n input: RuntimeJournalAppendInput,\n ctx: HaiveContext,\n): Promise<{ ok: true; path_hint: string }> {\n await appendRuntimeJournalEntry(ctx.paths, {\n kind: input.kind,\n message: input.message,\n ...(input.tool ? { tool: input.tool } : {}),\n });\n return {\n ok: true,\n path_hint: `${ctx.paths.runtimeDir}/session-journal.ndjson`,\n };\n}\n","import { readRuntimeJournalTail } from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const RuntimeJournalTailInputSchema = {\n limit: z\n .number()\n .int()\n .positive()\n .max(500)\n .default(30)\n .describe(\"Last N journal entries to return\"),\n};\n\nexport type RuntimeJournalTailInput = {\n [K in keyof typeof RuntimeJournalTailInputSchema]: z.infer<\n (typeof RuntimeJournalTailInputSchema)[K]\n >;\n};\n\nexport async function runtimeJournalTail(\n input: RuntimeJournalTailInput,\n ctx: HaiveContext,\n): Promise<{ entries: Awaited<ReturnType<typeof readRuntimeJournalTail>>; empty?: boolean }> {\n const entries = await readRuntimeJournalTail(ctx.paths, input.limit);\n if (entries.length === 0) {\n return { entries: [], empty: true };\n }\n return { entries };\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","import { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const PostTaskArgsSchema = {\n task_summary: z\n .string()\n .optional()\n .describe(\"One sentence describing what you just did\"),\n files_touched: z\n .array(z.string())\n .optional()\n .describe(\"Files you created or modified during the task\"),\n};\n\nexport type PostTaskArgs = {\n [K in keyof typeof PostTaskArgsSchema]: z.infer<(typeof PostTaskArgsSchema)[K]>;\n};\n\nexport function postTaskPrompt(\n args: PostTaskArgs,\n ctx: HaiveContext,\n): { description: string; messages: Array<{ role: \"user\"; content: { type: \"text\"; text: string } }> } {\n const taskLine = args.task_summary ? `\\nTask just completed: **${args.task_summary}**` : \"\";\n const filesLine =\n args.files_touched && args.files_touched.length > 0\n ? `\\nFiles touched: ${args.files_touched.map((f) => `\\`${f}\\``).join(\", \")}`\n : \"\";\n\n const text = `You have just finished a task. Before closing this session, take 60 seconds to capture what you learned.\n${taskLine}${filesLine}\n\nProject root: \\`${ctx.paths.root}\\`\n\n## Checklist — answer each question honestly\n\nGo through each item. If the answer is yes, call the corresponding tool immediately.\n\n### 0. Did you read existing code and discover bugs, inconsistencies, or security gaps that weren't in the briefing?\nThis is the most important question. Deep code reading surfaces issues that no memory captures yet.\nExamples of things to look for:\n- A method with an invalid signature (e.g. two \\`@RequestBody\\` on the same handler)\n- A configuration that looks wrong or missing (e.g. webhook path not whitelisted in SecurityConfig)\n- A component scan / DI issue (e.g. a Spring bean not picked up because the package isn't scanned)\n- A DB constraint that will break when you add a new enum value\n- A hardcoded value that should be dynamic (e.g. hardcoded tenant id \"default-tenant\")\n- Anything that will silently break in production\n\n→ If yes, call **\\`mem_save\\`** with \\`type=\"gotcha\"\\`, \\`scope=\"team\"\\`, and **anchor it to the file** with \\`paths\\`.\n This transforms your discovery into institutional knowledge that protects every future agent.\n\n### 1. Did you try an approach that failed?\n→ If yes, call **\\`mem_tried\\`** with:\n - \\`what\\`: the approach you tried (e.g. \"importing gray-matter with ESM dynamic import\")\n - \\`why_failed\\`: why it didn't work\n - \\`instead\\`: what worked instead\n - \\`scope\\`: \"team\" if others will hit the same issue, \"personal\" if specific to your setup\n - \\`paths\\`: the files where the issue manifested\n\n### 2. Did you discover a convention that isn't documented?\n→ If yes, call **\\`mem_save\\`** with \\`type=\"convention\"\\` and \\`scope=\"team\"\\`\n\n### 3. Did you make an architectural decision?\n→ If yes, call **\\`mem_save\\`** with \\`type=\"decision\"\\` and document the WHY (constraints, tradeoffs), not just the what\n\n### 4. Did you hit a non-obvious bug or surprising behavior in a library or framework?\n→ If yes, call **\\`mem_save\\`** with \\`type=\"gotcha\"\\` and anchor it to the relevant file paths\n\n### 5. Did you find that an existing memory is outdated or wrong?\n→ If yes, call **\\`mem_update\\`** with the correct information, or **\\`mem_reject\\`** if it's completely wrong\n\n## Rules\n\n- One memory per insight. Don't cram multiple lessons into one body.\n- Anchor memories to file paths when possible (the \\`paths\\` field) — this enables staleness detection.\n- Prefer \\`scope=\"team\"\\` for anything a teammate or future agent would benefit from.\n- Skip sections where you genuinely have nothing to add. Don't fabricate memories.\n- **Question 0 is not optional** — always scan your exploration history for code-level discoveries.\n\n### 6. Close the session — always\nCall **\\`mem_session_end\\`** with:\n- \\`goal\\`: what you set out to do\n- \\`accomplished\\`: what was actually done (bullet list)\n- \\`discoveries\\`: anything surprising or broken found during this session (leave empty if none)\n- \\`files_touched\\`: the key files you read or modified\n- \\`next_steps\\`: what remains for the next session or a teammate\n- \\`scope\\`: \"team\" if this task affects the whole team, \"personal\" otherwise\n\nThis creates/updates a single rolling recap that **get_briefing automatically surfaces** at the start of every subsequent session — no token waste re-explaining what happened.\n\nCalling \\`mem_session_end\\` also **clears the pending-distill marker** (if any), confirming that this session's learnings have been properly captured rather than left as an auto-recap skeleton.\n\n### 7. Verify the git/release/pipeline exit protocol — always\nRun **\\`haive enforce finish\\`** before your final response.\n\nThis executable gate checks the multi-agent git-sync decision:\n- no completed work is left as an uncommitted local diff\n- shippable package changes have a lockstep version bump\n- the release tag \\`vX.Y.Z\\` exists when a version was bumped\n- commits and tags have been pushed\n- the pushed HEAD's GitHub Actions workflow runs have completed successfully when the repo has a GitHub remote\n- agents never run \\`npm publish\\` (publication remains human-owned)\n\nIf it blocks, fix the reported Git/version/tag/push/pipeline issue before telling the developer the task is done.\n\nWhen done, respond with a brief summary: \"Saved N memories: [list of IDs]. Session recap saved. hAIve finish gate passed; GitHub Actions passed when applicable.\"\n`;\n\n\n return {\n description: \"Post-task reflection: capture what you learned before closing the session\",\n messages: [\n {\n role: \"user\",\n content: { type: \"text\", text },\n },\n ],\n };\n}\n","import { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const ImportDocsArgsSchema = {\n content: z\n .string()\n .describe(\"The documentation content to analyze and import as memories (Markdown, README, ADR, etc.)\"),\n source: z\n .string()\n .optional()\n .describe(\"Origin of the content (file path, URL, or document title) — used to anchor memories\"),\n scope: z\n .enum([\"personal\", \"team\"])\n .default(\"team\")\n .describe(\"Scope to assign to created memories\"),\n dry_run: z\n .boolean()\n .default(false)\n .describe(\"If true, describe what would be saved without actually calling mem_save\"),\n};\n\nexport type ImportDocsArgs = {\n [K in keyof typeof ImportDocsArgsSchema]: z.infer<(typeof ImportDocsArgsSchema)[K]>;\n};\n\nexport function importDocsPrompt(\n args: ImportDocsArgs,\n ctx: HaiveContext,\n): { description: string; messages: Array<{ role: \"user\"; content: { type: \"text\"; text: string } }> } {\n const sourceLine = args.source ? `\\nSource: **${args.source}**` : \"\";\n const dryRunNote = args.dry_run\n ? \"\\n> **DRY RUN** — describe what you would save but do not call any tools.\"\n : \"\";\n\n const text = `You are given documentation to analyze and import into the hAIve memory system.\n${sourceLine}\nScope: **${args.scope}**\nProject root: \\`${ctx.paths.root}\\`\n${dryRunNote}\n\n## Your task\n\nRead the documentation below and extract actionable memories. For each distinct piece of knowledge:\n\n1. **Identify the memory type** — which category fits best?\n - \\`convention\\` — how things are done here (naming, patterns, workflow)\n - \\`decision\\` — a choice that was made and why (tradeoffs, constraints)\n - \\`gotcha\\` — non-obvious behavior, traps, things that surprise newcomers\n - \\`architecture\\` — structural overview of a system or module\n - \\`glossary\\` — domain terms and their meaning in this project\n\n2. **Determine the anchor** — which files or symbols does this knowledge apply to? List them in \\`paths\\`.\n\n3. **Write a focused body** — one memory = one insight. Do not combine multiple unrelated facts.\n - Start with the key fact or rule\n - Add context: why it matters, when it applies\n - Add examples if helpful\n\n4. **Call \\`mem_save\\`** for each memory (unless dry_run).\n - Set \\`scope=\"${args.scope}\"\\`\n - Set \\`slug\\` to a short kebab-case identifier\n - Set \\`paths\\` to the relevant file paths (extracted from the doc if present)\n\n## Rules\n\n- Skip generic documentation that applies to any project (e.g., \"install with npm install\").\n- Prioritize gotchas, non-obvious decisions, and domain-specific conventions.\n- If the same knowledge is repeated in different sections, save it once.\n- Maximum 10 memories per import — select the most actionable ones.\n\n## Documentation to import\n\n---\n\n${args.content}\n\n---\n\nWhen done, respond with: \"Imported N memories: [list of IDs]\" or \"Nothing actionable found.\"\n`;\n\n return {\n description: \"Import documentation as hAIve memories\",\n messages: [\n {\n role: \"user\",\n content: { type: \"text\", text },\n },\n ],\n };\n}\n","import {\n parseMcpCliArgs,\n printHaiveMcpVersion,\n runHaiveMcpStdio,\n} from \"./server.js\";\n\nconst parsed = parseMcpCliArgs(process.argv);\nif (parsed.versionOnly) {\n printHaiveMcpVersion();\n process.exit(0);\n}\n\nrunHaiveMcpStdio({ root: parsed.root }).catch((err: unknown) => {\n console.error(\"[haive-mcp] fatal:\", err instanceof Error ? err.message : err);\n process.exit(1);\n});\n"],"mappings":"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","names":["existsSync","path","z","existsSync","z","mkdir","writeFile","existsSync","path","loadMemoriesFromDir","z","existsSync","loadMemoriesFromDir","z","top","writeFile","existsSync","loadMemoriesFromDir","serializeMemory","z","writeFile","existsSync","loadMemoriesFromDir","loadUsageIndex","serializeMemory","z","getUsage","loadMemoriesFromDir","loadUsageIndex","recordRejection","saveUsageIndex","serializeMemory","existsSync","writeFile","z","readFile","readdir","existsSync","path","deriveConfidence","getUsage","loadMemoriesFromDir","loadUsageIndex","trackReads","z","existsSync","deriveConfidence","getUsage","loadMemoriesFromDir","loadUsageIndex","z","existsSync","loadMemoriesFromDir","loadUsageIndex","saveUsageIndex","z","writeFile","existsSync","loadMemoriesFromDir","serializeMemory","z","existsSync","getUsage","loadMemoriesFromDir","loadUsageIndex","z","writeFile","existsSync","loadMemoriesFromDir","serializeMemory","z","mkdir","writeFile","existsSync","path","buildFrontmatter","memoryFilePath","serializeMemory","suggestSensorFromMemory","z","existsSync","mkdir","readFile","writeFile","path","loadMemoriesFromDir","memoryFilePath","serializeMemory","z","mkdir","writeFile","existsSync","path","buildFrontmatter","memoryFilePath","serializeMemory","z","writeFile","mkdir","existsSync","path","buildFrontmatter","loadMemoriesFromDir","memoryFilePath","serializeMemory","z","loadConfig","mkdir","writeFile","existsSync","path","path","loadConfig","existsSync","mkdir","writeFile","z","existsSync","path","loadMemoriesFromDir","writeFile","serializeMemory","buildFrontmatter","memoryFilePath","mkdir","readFile","writeFile","existsSync","computeImpact","deriveConfidence","getUsage","inferModulesFromPaths","literalMatchesAllTokens","literalMatchesAnyToken","loadConfig","loadMemoriesFromDir","loadUsageIndex","memoryMatchesAnchorPaths","rankMemoriesLexical","serializeMemory","tokenizeQuery","trackReads","z","readdir","readFile","existsSync","path","loadModuleContexts","z","inferModulesFromPaths","existsSync","loadMemoriesFromDir","loadUsageIndex","getUsage","computeImpact","deriveConfidence","memoryMatchesAnchorPaths","tokenizeQuery","literalMatchesAllTokens","literalMatchesAnyToken","rankMemoriesLexical","trackReads","loadConfig","writeFile","serializeMemory","readFile","loadModuleContexts","rm","estimateTokens","loadCodeMap","queryCodeMap","z","existsSync","loadMemoriesFromDir","z","existsSync","loadMemoriesFromDir","z","z","z","z","existsSync","path","deriveConfidence","getUsage","loadCodeMap","loadMemoriesFromDir","loadUsageIndex","memoryMatchesAnchorPaths","z","existsSync","deriveConfidence","getUsage","isRetiredMemory","loadMemoriesFromDir","loadUsageIndex","literalMatchesAnyToken","memoryMatchesAnchorPaths","saveUsageIndex","tokenizeQuery","z","existsSync","loadMemoriesFromDir","tokenizeQuery","z","existsSync","spawn","deriveConfidence","getUsage","loadMemoriesFromDir","loadUsageIndex","z","runGitLog","runCommand","existsSync","deriveConfidence","getUsage","loadMemoriesFromDir","loadUsageIndex","pathsOverlap","tokenizeQuery","z","z","z","mkdir","writeFile","existsSync","path","execSync","buildFrontmatter","memoryFilePath","serializeMemory","z","existsSync","loadMemoriesFromDir","z","z","z","existsSync","loadMemoriesFromDir","z","appendRuntimeJournalEntry","z","z","z","z","z"]}
1
+ {"version":3,"sources":["../src/server.ts","../src/context.ts","../src/tools/bootstrap-project-save.ts","../src/tools/get-project-context.ts","../src/tools/mem-list.ts","../src/tools/mem-save.ts","../src/tools/mem-search.ts","../src/tools/mem-verify.ts","../src/tools/mem-reject.ts","../src/tools/mem-feedback.ts","../src/tools/mem-for-files.ts","../src/tools/mem-get.ts","../src/tools/mem-delete.ts","../src/tools/mem-update.ts","../src/tools/mem-pending.ts","../src/tools/mem-approve.ts","../src/tools/mem-tried.ts","../src/tools/ingest-findings.ts","../src/tools/mem-observe.ts","../src/tools/mem-session-end.ts","../src/session-tracker.ts","../src/tools/get-briefing.ts","../src/tools/briefing-helpers.ts","../src/tools/code-map.ts","../src/tools/mem-diff.ts","../src/tools/get-recap.ts","../src/tools/mem-relevant-to.ts","../src/tools/code-search.ts","../src/tools/why-this-file.ts","../src/tools/anti-patterns-check.ts","../src/tools/mem-distill.ts","../src/tools/why-this-decision.ts","../src/tools/mem-conflicts.ts","../src/tools/precommit-check.ts","../src/tools/pattern-detect.ts","../src/tools/mem-conflict-candidates.ts","../src/tools/mem-resolve-project.ts","../src/tools/mem-suggest-topic.ts","../src/tools/mem-timeline.ts","../src/tools/runtime-journal-append.ts","../src/tools/runtime-journal-tail.ts","../src/prompts/bootstrap-project.ts","../src/prompts/post-task.ts","../src/prompts/import-docs.ts","../src/index.ts"],"sourcesContent":["import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.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 MemFeedbackInputSchema,\n memFeedback,\n type MemFeedbackInput,\n} from \"./tools/mem-feedback.js\";\nimport {\n MemForFilesInputSchema,\n memForFiles,\n type MemForFilesInput,\n} from \"./tools/mem-for-files.js\";\nimport { MemGetInputSchema, memGet, type MemGetInput } from \"./tools/mem-get.js\";\nimport {\n MemDeleteInputSchema,\n memDelete,\n type MemDeleteInput,\n} from \"./tools/mem-delete.js\";\nimport {\n MemUpdateInputSchema,\n memUpdate,\n type MemUpdateInput,\n} from \"./tools/mem-update.js\";\nimport {\n MemPendingInputSchema,\n memPending,\n type MemPendingInput,\n} from \"./tools/mem-pending.js\";\nimport {\n MemApproveInputSchema,\n memApprove,\n type MemApproveInput,\n} from \"./tools/mem-approve.js\";\nimport {\n MemTriedInputSchema,\n memTried,\n type MemTriedInput,\n} from \"./tools/mem-tried.js\";\nimport {\n IngestFindingsInputSchema,\n ingestFindings,\n type IngestFindingsInput,\n} from \"./tools/ingest-findings.js\";\nimport {\n MemObserveInputSchema,\n memObserve,\n type MemObserveInput,\n} from \"./tools/mem-observe.js\";\nimport {\n MemSessionEndInputSchema,\n memSessionEnd,\n type MemSessionEndInput,\n} from \"./tools/mem-session-end.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 MemDiffInputSchema,\n memDiff,\n type MemDiffInput,\n} from \"./tools/mem-diff.js\";\nimport {\n GetRecapInputSchema,\n getRecap,\n type GetRecapInput,\n} from \"./tools/get-recap.js\";\nimport {\n MemRelevantToInputSchema,\n memRelevantTo,\n type MemRelevantToInput,\n} from \"./tools/mem-relevant-to.js\";\nimport {\n CodeSearchInputSchema,\n codeSearch,\n type CodeSearchInput,\n} from \"./tools/code-search.js\";\nimport {\n WhyThisFileInputSchema,\n whyThisFile,\n type WhyThisFileInput,\n} from \"./tools/why-this-file.js\";\nimport {\n AntiPatternsCheckInputSchema,\n antiPatternsCheck,\n type AntiPatternsCheckInput,\n} from \"./tools/anti-patterns-check.js\";\nimport {\n MemDistillInputSchema,\n memDistill,\n type MemDistillInput,\n} from \"./tools/mem-distill.js\";\nimport {\n WhyThisDecisionInputSchema,\n whyThisDecision,\n type WhyThisDecisionInput,\n} from \"./tools/why-this-decision.js\";\nimport {\n MemConflictsInputSchema,\n memConflicts,\n type MemConflictsInput,\n} from \"./tools/mem-conflicts.js\";\nimport {\n PreCommitCheckInputSchema,\n preCommitCheck,\n type PreCommitCheckInput,\n} from \"./tools/precommit-check.js\";\nimport {\n PatternDetectInputSchema,\n patternDetect,\n type PatternDetectInput,\n} from \"./tools/pattern-detect.js\";\nimport {\n MemConflictCandidatesInputSchema,\n memConflictCandidates,\n type MemConflictCandidatesInput,\n} from \"./tools/mem-conflict-candidates.js\";\nimport {\n MemResolveProjectInputSchema,\n memResolveProject,\n type MemResolveProjectInput,\n} from \"./tools/mem-resolve-project.js\";\nimport {\n MemSuggestTopicInputSchema,\n memSuggestTopic,\n type MemSuggestTopicInput,\n} from \"./tools/mem-suggest-topic.js\";\nimport {\n MemTimelineInputSchema,\n memTimeline,\n type MemTimelineInput,\n} from \"./tools/mem-timeline.js\";\nimport {\n RuntimeJournalAppendInputSchema,\n runtimeJournalAppend,\n type RuntimeJournalAppendInput,\n} from \"./tools/runtime-journal-append.js\";\nimport {\n RuntimeJournalTailInputSchema,\n runtimeJournalTail,\n type RuntimeJournalTailInput,\n} from \"./tools/runtime-journal-tail.js\";\nimport {\n BootstrapProjectArgsSchema,\n bootstrapProjectPrompt,\n type BootstrapProjectArgs,\n} from \"./prompts/bootstrap-project.js\";\nimport {\n PostTaskArgsSchema,\n postTaskPrompt,\n type PostTaskArgs,\n} from \"./prompts/post-task.js\";\nimport {\n ImportDocsArgsSchema,\n importDocsPrompt,\n type ImportDocsArgs,\n} from \"./prompts/import-docs.js\";\nimport { SessionTracker } from \"./session-tracker.js\";\nimport { hasRecentBriefingMarker, loadConfigSync } from \"@hiveai/core\";\n\n// Re-export tool implementations so `@hiveai/cli` (and integrators) can call\n// them programmatically without going through the MCP stdio transport.\n// These are the same handlers the MCP server registers below.\nexport {\n getBriefing,\n type GetBriefingInput,\n type BriefingOutput,\n} from \"./tools/get-briefing.js\";\nexport {\n codeMapTool,\n type CodeMapInput,\n type CodeMapToolOutput,\n} from \"./tools/code-map.js\";\nexport {\n getRecap,\n type GetRecapInput,\n type GetRecapOutput,\n} from \"./tools/get-recap.js\";\nexport {\n memRelevantTo,\n type MemRelevantToInput,\n type MemRelevantToOutput,\n} from \"./tools/mem-relevant-to.js\";\nexport {\n codeSearch,\n type CodeSearchInput,\n type CodeSearchOutput,\n} from \"./tools/code-search.js\";\nexport {\n whyThisFile,\n type WhyThisFileInput,\n type WhyThisFileOutput,\n} from \"./tools/why-this-file.js\";\nexport {\n antiPatternsCheck,\n type AntiPatternsCheckInput,\n type AntiPatternsCheckOutput,\n} from \"./tools/anti-patterns-check.js\";\nexport {\n memDistill,\n type MemDistillInput,\n type MemDistillOutput,\n} from \"./tools/mem-distill.js\";\nexport {\n whyThisDecision,\n type WhyThisDecisionInput,\n type WhyThisDecisionOutput,\n} from \"./tools/why-this-decision.js\";\nexport {\n memConflicts,\n type MemConflictsInput,\n type MemConflictsOutput,\n} from \"./tools/mem-conflicts.js\";\nexport {\n preCommitCheck,\n type PreCommitCheckInput,\n type PreCommitCheckOutput,\n} from \"./tools/precommit-check.js\";\nexport {\n patternDetect,\n type PatternDetectInput,\n type PatternDetectOutput,\n} from \"./tools/pattern-detect.js\";\nexport {\n memResolveProject,\n type MemResolveProjectInput,\n} from \"./tools/mem-resolve-project.js\";\nexport {\n memSuggestTopic,\n type MemSuggestTopicInput,\n} from \"./tools/mem-suggest-topic.js\";\nexport {\n memTimeline,\n type MemTimelineInput,\n} from \"./tools/mem-timeline.js\";\nexport {\n memConflictCandidates,\n type MemConflictCandidatesInput,\n} from \"./tools/mem-conflict-candidates.js\";\nexport {\n runtimeJournalAppend,\n type RuntimeJournalAppendInput,\n} from \"./tools/runtime-journal-append.js\";\nexport {\n runtimeJournalTail,\n type RuntimeJournalTailInput,\n} from \"./tools/runtime-journal-tail.js\";\n\ndeclare const __HAIVE_VERSION__: string;\n\nexport const SERVER_NAME = \"haive\";\nexport const SERVER_VERSION = __HAIVE_VERSION__;\nexport type ToolProfile = \"enforcement\" | \"maintenance\" | \"experimental\" | \"full\";\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 const ENFORCEMENT_PROFILE_TOOLS = [\n \"get_briefing\",\n \"mem_save\",\n \"mem_tried\",\n \"mem_search\",\n \"mem_get\",\n \"mem_verify\",\n \"mem_relevant_to\",\n \"code_map\",\n \"code_search\",\n \"pre_commit_check\",\n \"mem_session_end\",\n] as const;\n\nexport const MAINTENANCE_PROFILE_TOOLS = [\n ...ENFORCEMENT_PROFILE_TOOLS,\n \"mem_suggest_topic\",\n \"mem_for_files\",\n \"mem_list\",\n \"get_project_context\",\n \"bootstrap_project_save\",\n \"mem_resolve_project\",\n \"mem_update\",\n \"mem_approve\",\n \"mem_reject\",\n \"mem_pending\",\n \"mem_delete\",\n \"mem_diff\",\n \"get_recap\",\n \"anti_patterns_check\",\n \"mem_distill\",\n \"mem_timeline\",\n \"mem_conflict_candidates\",\n \"mem_feedback\",\n \"ingest_findings\",\n] as const;\n\nexport const EXPERIMENTAL_PROFILE_TOOLS = [\n ...MAINTENANCE_PROFILE_TOOLS,\n \"mem_observe\",\n \"why_this_file\",\n \"why_this_decision\",\n \"mem_conflicts_with\",\n \"pattern_detect\",\n \"runtime_journal_append\",\n \"runtime_journal_tail\",\n] as const;\n\nexport const TOOL_PROFILES: Record<Exclude<ToolProfile, \"full\">, ReadonlySet<string>> = {\n enforcement: new Set(ENFORCEMENT_PROFILE_TOOLS),\n maintenance: new Set(MAINTENANCE_PROFILE_TOOLS),\n experimental: new Set(EXPERIMENTAL_PROFILE_TOOLS),\n};\n\nexport function getAllowedToolsForProfile(profile: ToolProfile): ReadonlySet<string> {\n if (profile === \"full\") return TOOL_PROFILES.experimental;\n return TOOL_PROFILES[profile] ?? TOOL_PROFILES.enforcement;\n}\n\nconst BRIEFING_TOOLS = new Set([\"get_briefing\", \"mem_relevant_to\"]);\n\nconst MUTATING_TOOLS = new Set([\n \"mem_save\",\n \"mem_tried\",\n \"mem_observe\",\n \"mem_session_end\",\n \"bootstrap_project_save\",\n \"mem_update\",\n \"mem_approve\",\n \"mem_reject\",\n \"mem_delete\",\n \"mem_feedback\",\n \"runtime_journal_append\",\n \"pattern_detect\",\n \"ingest_findings\",\n]);\n\nexport function createHaiveServer(\n options: CreateContextOptions = {},\n): { server: McpServer; context: HaiveContext; tracker: SessionTracker } {\n const context = createContext(options);\n const config = loadConfigSync(context.paths);\n const toolProfile =\n (options.env?.HAIVE_TOOL_PROFILE as ToolProfile | undefined) ??\n config.enforcement?.toolProfile ??\n \"enforcement\";\n const requireBriefingFirst =\n options.env?.HAIVE_REQUIRE_BRIEFING_FIRST === \"0\"\n ? false\n : config.enforcement?.requireBriefingFirst ?? true;\n let briefingLoaded = false;\n const tracker = new SessionTracker(context);\n // Init is async — fire-and-forget at startup (registers shutdown handler if autopilot)\n void tracker.init();\n\n const server = new McpServer(\n { name: SERVER_NAME, version: SERVER_VERSION },\n { capabilities: { tools: {}, prompts: {} } },\n );\n\n const allowedTools = getAllowedToolsForProfile(toolProfile);\n\n const shouldRegisterTool = (name: string): boolean => allowedTools.has(name);\n\n const registerTool = <TInput>(\n name: string,\n description: string,\n schema: Record<string, unknown>,\n handler: (input: TInput) => Promise<unknown> | unknown,\n ): void => {\n if (!shouldRegisterTool(name)) return;\n const tool = server.tool.bind(server) as (\n toolName: string,\n toolDescription: string,\n toolSchema: Record<string, unknown>,\n toolHandler: (input: unknown) => Promise<unknown> | unknown,\n ) => unknown;\n tool(\n name,\n description,\n schema,\n async (input: unknown) => {\n if (BRIEFING_TOOLS.has(name)) {\n briefingLoaded = true;\n return await handler(input as TInput);\n }\n if (requireBriefingFirst && MUTATING_TOOLS.has(name) && !briefingLoaded) {\n // Fall back to the disk-persisted marker before blocking — covers client\n // reconnections where the server process is fresh but a recent briefing ran.\n const hasDiskMarker = await hasRecentBriefingMarker(context.paths).catch(() => false);\n if (hasDiskMarker) {\n briefingLoaded = true;\n } else {\n return jsonResult({\n error: \"haive_briefing_required\",\n message:\n \"This hAIve project requires get_briefing or mem_relevant_to before state-changing hAIve tools. Call get_briefing({ task: '...' }) first.\",\n tool: name,\n });\n }\n }\n return await handler(input as TInput);\n },\n );\n };\n\n const shouldRegisterPrompt = (name: string): boolean => {\n if (name === \"bootstrap_project\" || name === \"post_task\") return true;\n if (name === \"import_docs\") return toolProfile !== \"enforcement\";\n return toolProfile === \"experimental\" || toolProfile === \"full\";\n };\n\n // ── Memory creation ────────────────────────────────────────────────────\n\n registerTool(\n \"mem_save\",\n [\n \"Save a piece of knowledge as a persistent memory that survives across AI sessions.\",\n \"\",\n \"USE THIS WHEN you discover something worth remembering for future sessions:\",\n \" - A project convention (how things are done here)\",\n \" - An architectural decision and its rationale\",\n \" - A gotcha or non-obvious behavior that surprised you\",\n \" - A domain term and what it means in this codebase\",\n \"\",\n \"DO NOT USE for failed approaches → use mem_tried instead (better structure).\",\n \"DO NOT USE for code discoveries during exploration → use mem_observe instead.\",\n \"\",\n \"PARAMETERS:\",\n \" type — convention | decision | gotcha | architecture | glossary | attempt\",\n \" slug — short kebab-case id (e.g. 'flyway-no-modify-existing')\",\n \" body — Markdown content with the full knowledge\",\n \" scope — team (shared with all devs) | personal (private) | module (component-scoped)\",\n \" paths — anchor to source files for staleness detection (STRONGLY recommended)\",\n \" topic — stable key for upsert: if a memory with same topic+scope exists, update it in-place\",\n \"\",\n \"RETURNS: { id, scope, file_path, action: 'created'|'updated', warning?, invalid_paths? }\",\n \"WARNING: if paths point to non-existent files, they will be immediately stale after haive sync.\",\n \"DEDUP: identical body content within the same scope is rejected — use mem_update to modify.\",\n ].join(\"\\n\"),\n MemSaveInputSchema,\n async (input: MemSaveInput) => {\n tracker.record(\"mem_save\", input.slug);\n return jsonResult(await memSave(input, context));\n },\n );\n\n registerTool(\n \"mem_suggest_topic\",\n [\n \"Propose a stable `topic` key (topic-upsert) from type + short title.\",\n \"\",\n \"USE BEFORE mem_save when you want deterministic updates to the same memory over time;\",\n \"families mimic Engram-style grouping (architecture/*, bug/*, decision/*, …).\",\n \"\",\n \"PARAMETERS:\",\n \" type — convention | decision | gotcha | architecture | glossary | attempt | session_recap\",\n \" title — phrase to slugify under the suggested family prefix\",\n \"\",\n \"RETURNS: { topic_key, family, type }\",\n ].join(\"\\n\"),\n MemSuggestTopicInputSchema,\n async (input: MemSuggestTopicInput) =>\n jsonResult(await memSuggestTopic(input, context)),\n );\n\n registerTool(\n \"mem_tried\",\n [\n \"Record a FAILED approach so future agents don't repeat the same mistake.\",\n \"\",\n \"USE THIS IMMEDIATELY when you try something and it doesn't work. This is the\",\n \"most valuable type of negative knowledge — it saves hours of debugging for\",\n \"future agents working on the same codebase.\",\n \"\",\n \"Auto-validated (no approval cycle). Surfaced FIRST in future get_briefing calls\",\n \"so it's impossible to miss.\",\n \"\",\n \"PARAMETERS:\",\n \" what — short title of what you tried (e.g. 'importing X with ESM dynamic import')\",\n \" why_failed — the exact error or reason it failed\",\n \" instead — what to do instead (the correct approach)\",\n \" scope — team (default) | personal\",\n \" paths — source files where the issue lives\",\n \"\",\n \"RETURNS: { id, file_path, action: 'created' }\",\n ].join(\"\\n\"),\n MemTriedInputSchema,\n async (input: MemTriedInput) => {\n tracker.record(\"mem_tried\", input.what.slice(0, 80));\n return jsonResult(await memTried(input, context));\n },\n );\n\n registerTool(\n \"ingest_findings\",\n [\n \"Turn scanner findings (SonarQube / SARIF) into proposed, anchored memories with sensors.\",\n \"\",\n \"USE THIS to seed hAIve from your existing quality tooling: each real defect a scanner\",\n \"found becomes a `gotcha`/`convention` memory anchored to the file, pre-filled with a\",\n \"conservative `warn` sensor — so the next agent is steered away from it before re-writing it.\",\n \"This closes the review↔memory loop and kills the cold-start problem.\",\n \"\",\n \"SAFETY: drafts are status=proposed and sensors are warn-only + autogen. This tool NEVER\",\n \"auto-validates and NEVER auto-blocks. A human reviews (mem_pending) and promotes the sensor.\",\n \"\",\n \"PARAMETERS:\",\n \" format — 'sarif' (ESLint/Semgrep/CodeQL) | 'sonar' (SonarQube issues JSON)\",\n \" report_path — project-relative path to the report file (OR pass `report` inline)\",\n \" report — inline JSON content (OR pass `report_path`)\",\n \" type — gotcha (default) | convention\",\n \" scope — team (default) | personal | module\",\n \" min_severity — drop findings below this severity\",\n \" dry_run — preview what would be created without writing\",\n \"\",\n \"RETURNS: { format, parsed, new, skipped_existing, created[], notice }\",\n ].join(\"\\n\"),\n IngestFindingsInputSchema,\n async (input: IngestFindingsInput) => {\n tracker.record(\"ingest_findings\", `${input.format}:${input.report_path ?? \"inline\"}`);\n return jsonResult(await ingestFindings(input, context));\n },\n );\n\n registerTool(\n \"mem_observe\",\n [\n \"Capture a code-level discovery made WHILE READING existing code.\",\n \"\",\n \"USE THIS when you read a file and spot something the team may not know about:\",\n \" - A bug or race condition hiding in the code\",\n \" - A security gap or missing validation\",\n \" - An inconsistency between two files\",\n \" - A missing configuration or environment variable\",\n \" - Anything that could silently break in production\",\n \"\",\n \"DIFFERENCE from mem_save: mem_observe is for REACTIVE discoveries during code\",\n \"reading. mem_save is for deliberate knowledge capture (conventions, decisions).\",\n \"\",\n \"Auto-validated, anchored to file paths for staleness detection.\",\n \"\",\n \"PARAMETERS:\",\n \" what — one-line title (e.g. 'MobilePaymentController: duplicate @RequestBody')\",\n \" where — file path(s) where the issue lives\",\n \" impact — what breaks or could break because of this\",\n \" fix — suggested fix (optional)\",\n \" scope — team (default, since discoveries benefit everyone)\",\n \"\",\n \"RETURNS: { id, file_path }\",\n ].join(\"\\n\"),\n MemObserveInputSchema,\n async (input: MemObserveInput) => {\n tracker.record(\"mem_observe\", input.where);\n return jsonResult(await memObserve(input, context));\n },\n );\n\n registerTool(\n \"mem_session_end\",\n [\n \"Save an end-of-session recap so the NEXT session starts with fresh context.\",\n \"\",\n \"CALL THIS before closing any significant working session. In autopilot mode,\",\n \"the MCP server saves a minimal recap automatically on exit — but calling this\",\n \"manually produces a richer, more useful recap.\",\n \"\",\n \"HOW IT WORKS: uses topic-upsert — one recap per scope is kept and updated\",\n \"in-place (revision_count increments). get_briefing surfaces the latest recap\",\n \"at the very top of the next session's briefing, before project context.\",\n \"\",\n \"PARAMETERS:\",\n \" goal — what you were trying to accomplish (1–2 sentences)\",\n \" accomplished — what was actually done (bullet list recommended)\",\n \" discoveries — bugs, surprises, missing knowledge found during this session\",\n \" files_touched — key files read or modified (used as anchor for staleness)\",\n \" next_steps — what should happen in the next session or for a teammate\",\n \" scope — personal (default) | team\",\n \"\",\n \"RETURNS: { id, scope, action: 'created'|'updated', revision_count }\",\n ].join(\"\\n\"),\n MemSessionEndInputSchema,\n async (input: MemSessionEndInput) => {\n tracker.record(\"mem_session_end\", input.goal.slice(0, 80));\n return jsonResult(await memSessionEnd(input, context));\n },\n );\n\n // ── Memory retrieval ───────────────────────────────────────────────────\n\n registerTool(\n \"get_briefing\",\n [\n \"⭐ DEFAULT-FIRST for coding agents on any repo where `haive init` ran: call this BEFORE\",\n \"changing source or project config for the current goal (unless the developer explicitly opts out).\",\n \"One-shot onboarding: everything relevant in a single call under a token budget.\",\n \"\",\n \"PROGRESSIVE DISCLOSURE — after this, drill down only if needed:\",\n \" mem_relevant_to / mem_search (compact lists) → mem_get (full body + anchors).\",\n \"\",\n \"RETURNS (in order of priority):\",\n \" 0. action_required — ⚠️ HANDLE THIS FIRST if non-empty (see protocol below)\",\n \" 1. last_session — recap of the previous session (goal, what was done, next steps)\",\n \" 2. project_context — .ai/project-context.md (auto-generated from code-map if template)\",\n \" 3. module_contexts — relevant .ai/modules/<name>/context.md based on files being edited\",\n \" 4. memories — ranked team memories relevant to your task\",\n \" 5. symbol_locations — file:line:kind for any requested symbols (no grep needed)\",\n \" 6. setup_warnings — actionable warnings if setup is incomplete\",\n \" 7. decay_warnings — memories not read in >90 days (consider reviewing)\",\n \"\",\n \"⚠️ ACTION_REQUIRED PROTOCOL — MANDATORY:\",\n \" If action_required[] is non-empty, STOP and for each item:\",\n \" 1. Show the developer the exact developer_message field verbatim\",\n \" 2. Wait for explicit human confirmation ('yes', 'go ahead', 'oui', etc.)\",\n \" 3. Only then proceed with any code changes\",\n \" NEVER act autonomously on cross-repo breaking changes, dep bumps, or contract diffs.\",\n \"\",\n \"KEY PARAMETERS:\",\n \" task — what you are about to do (1–2 sentences) — ALWAYS provide this\",\n \" files — files you are about to edit — surfaces anchored memories\",\n \" symbols — symbol names to look up in the code-map (e.g. ['PaymentService'])\",\n \" format — 'full' (default) | 'compact' (1-line) | 'actions' (bullet-first excerpts)\",\n \" budget_preset — 'quick' | 'balanced' | 'deep' — scales max_tokens/memories/module contexts\",\n \"\",\n \"EXAMPLE USAGE:\",\n \" get_briefing({ task: 'add a Stripe payment integration', files: ['src/payments/'], symbols: ['PaymentService'] })\",\n \"\",\n \"CONFIDENCE LEVELS in memories:\",\n \" authoritative — validated + read 10+ times (highest trust)\",\n \" trusted — validated or proposed + read 3+ times\",\n \" low — proposed, few reads (take with caution)\",\n \" unverified — draft (unverified: true flag set)\",\n \"\",\n \"Replaces 4–5 separate tool calls. Prefer this first; use mem_search / mem_get only for follow-up.\",\n ].join(\"\\n\"),\n GetBriefingInputSchema,\n async (input: GetBriefingInput) => {\n tracker.record(\"get_briefing\", input.task ?? \"\");\n return jsonResult(await getBriefing(input, context));\n },\n );\n\n registerTool(\n \"mem_search\",\n [\n \"Search memories by keyword or semantic similarity.\",\n \"\",\n \"USE WHEN you need to find a specific memory and don't know its id.\",\n \"For session onboarding, use get_briefing instead (richer, ranked, budgeted).\",\n \"\",\n \"SEARCH MODES:\",\n \" Literal (default): AND search across id, tags, and body — all tokens must match.\",\n \" Falls back to OR automatically if no AND results (partial match).\",\n \" Lexical rank (lexical_rank: true, semantic: false): Okapi-BM25-style scoring on the\",\n \" filtered corpus — good for phrase-like queries without embeddings.\",\n \" Semantic (semantic: true): embedding-based similarity — finds related memories\",\n \" even with different wording. Requires haive embeddings index to be built.\",\n \"\",\n \"PARAMETERS:\",\n \" query — search terms or natural language question\",\n \" scope — filter by personal | team | module\",\n \" type — filter by convention | decision | gotcha | architecture | glossary\",\n \" semantic — true for embedding-based search (requires @hiveai/embeddings)\",\n \" lexical_rank — BM25-style ranking (ignored when semantic is true)\",\n \" limit — max results (default 10)\",\n \"\",\n \"RETURNS: array of { id, type, scope, status, confidence, body, match_quality }\",\n ].join(\"\\n\"),\n MemSearchInputSchema,\n async (input: MemSearchInput) => {\n tracker.record(\"mem_search\", input.query.slice(0, 80));\n return jsonResult(await memSearch(input, context));\n },\n );\n\n registerTool(\n \"mem_timeline\",\n [\n \"Chronological view of related memories: by shared frontmatter.topic OR expanded from a seed id\",\n \"(related_ids, same topic, overlapping anchor paths — one extra hop on related_ids).\",\n \"\",\n \"PARAMETERS:\",\n \" memory_id — optional seed memory id\",\n \" topic — optional topic key (required if memory_id omitted)\",\n \" limit — max entries (default 30)\",\n \"\",\n \"RETURNS: { entries: [{ id, type, scope, created_at, one_line, topic? }], total, notice? }\",\n ].join(\"\\n\"),\n MemTimelineInputSchema,\n async (input: MemTimelineInput) => jsonResult(await memTimeline(input, context)),\n );\n\n registerTool(\n \"mem_for_files\",\n [\n \"Surface memories relevant to the files you are currently editing.\",\n \"\",\n \"USE WHEN starting work on specific files and you want to know:\",\n \" - What conventions apply to these files\",\n \" - What gotchas are anchored to these paths\",\n \" - What decisions were made about this module\",\n \"\",\n \"Matching strategy (in priority order):\",\n \" 1. Anchor overlap — memories whose paths overlap with your files\",\n \" 2. Module context — .ai/modules/<name>/context.md if module is inferred\",\n \" 3. Domain/tag match — memories whose tags include path segments\",\n \"\",\n \"PARAMETERS:\",\n \" files — list of project-relative file paths you are editing\",\n \" scope — filter by scope (default: all)\",\n \"\",\n \"RETURNS: { memories: [...], module_contexts: [...] }\",\n ].join(\"\\n\"),\n MemForFilesInputSchema,\n async (input: MemForFilesInput) => jsonResult(await memForFiles(input, context)),\n );\n\n registerTool(\n \"mem_get\",\n [\n \"Fetch a single memory by its full id with all details.\",\n \"\",\n \"USE WHEN get_briefing / mem_relevant_to / mem_search returned a compact hit and you need\",\n \"the full body, or when you know the exact id of a memory.\",\n \"\",\n \"PARAMETERS:\",\n \" id — full memory id (e.g. '2026-04-28-gotcha-flyway-strict-no-ddl')\",\n \"\",\n \"RETURNS: { id, type, scope, status, confidence, body, anchor, tags, usage }\",\n ].join(\"\\n\"),\n MemGetInputSchema,\n async (input: MemGetInput) => jsonResult(await memGet(input, context)),\n );\n\n registerTool(\n \"mem_list\",\n [\n \"List memories with optional filters. Use for browsing, not for task onboarding.\",\n \"\",\n \"For task onboarding use get_briefing (ranked + budgeted).\",\n \"For keyword search use mem_search.\",\n \"\",\n \"PARAMETERS:\",\n \" scope — personal | team | module\",\n \" type — convention | decision | gotcha | architecture | glossary\",\n \" status — draft | proposed | validated | stale | rejected\",\n \" tags — filter by tags (AND match)\",\n \" module — filter by module name\",\n \"\",\n \"RETURNS: array of { id, type, scope, status, confidence, tags, created_at }\",\n ].join(\"\\n\"),\n MemListInputSchema,\n async (input: MemListInput) => jsonResult(await memList(input, context)),\n );\n\n // ── Project context ────────────────────────────────────────────────────\n\n registerTool(\n \"get_project_context\",\n [\n \"Read .ai/project-context.md (and optionally a module context) directly.\",\n \"\",\n \"USE WHEN you need the full project context without the memory ranking and\",\n \"token budgeting of get_briefing — e.g. for a reference architecture review.\",\n \"\",\n \"For normal task onboarding, use get_briefing instead (more efficient).\",\n \"\",\n \"PARAMETERS:\",\n \" module — also load .ai/modules/<module>/context.md if provided\",\n \"\",\n \"RETURNS: { content: string, module_context?: string }\",\n ].join(\"\\n\"),\n GetProjectContextInputSchema,\n async (input: GetProjectContextInput) =>\n jsonResult(await getProjectContext(input, context)),\n );\n\n registerTool(\n \"bootstrap_project_save\",\n [\n \"Persist the project context document (.ai/project-context.md) or a module\",\n \"context (.ai/modules/<name>/context.md) analyzed by the AI.\",\n \"\",\n \"USE AFTER the bootstrap_project MCP prompt: the prompt tells you how to\",\n \"analyze the codebase; this tool saves the result.\",\n \"\",\n \"PARAMETERS:\",\n \" content — full Markdown content of the context document\",\n \" module — if provided, saves as a module context (not root project context)\",\n \"\",\n \"RETURNS: { file_path, module? }\",\n ].join(\"\\n\"),\n BootstrapProjectSaveInputSchema,\n async (input: BootstrapProjectSaveInput) =>\n jsonResult(await bootstrapProjectSave(input, context)),\n );\n\n registerTool(\n \"code_map\",\n [\n \"Look up where symbols (classes, functions, interfaces) are defined in the codebase.\",\n \"\",\n \"USE INSTEAD OF grepping when you need to find where something lives.\",\n \"Requires haive index code to have been run (done automatically in autopilot mode).\",\n \"\",\n \"TIP: include symbols in get_briefing directly for auto-lookup at session start.\",\n \"\",\n \"PARAMETERS:\",\n \" symbol — name or partial name to search (e.g. 'PaymentService')\",\n \" file — filter by file path substring\",\n \" max_files — cap on results (default 40)\",\n \"\",\n \"RETURNS: { available: bool, files: [{ path, exports: [{ name, kind, line, description }] }] }\",\n \"If available: false → run haive index code first.\",\n ].join(\"\\n\"),\n CodeMapInputSchema,\n async (input: CodeMapInput) => jsonResult(await codeMapTool(input, context)),\n );\n\n registerTool(\n \"mem_resolve_project\",\n [\n \"Diagnostics: resolve which project root hAIve is using (never throws).\",\n \"\",\n \"USE IN multi-root workspaces or when the agent CWD may not be the repo root —\",\n \"mirrors HAIVE_PROJECT_ROOT, findProjectRoot markers, and presence of .ai/memories.\",\n \"\",\n \"PARAMETERS:\",\n \" cwd — optional directory used for discovery when HAIVE_PROJECT_ROOT is unset\",\n \"\",\n \"RETURNS: { ok: true, info: { cwd, resolved_root, haive_project_root_env, … } }\",\n ].join(\"\\n\"),\n MemResolveProjectInputSchema,\n async (input: MemResolveProjectInput) =>\n jsonResult(await memResolveProject(input, context)),\n );\n\n // ── Memory lifecycle ───────────────────────────────────────────────────\n\n registerTool(\n \"mem_update\",\n [\n \"Update the body, tags, or anchor of an existing memory in-place.\",\n \"\",\n \"USE WHEN a memory exists but its content has become outdated or incomplete.\",\n \"This preserves the memory's id, usage history, and read_count.\",\n \"\",\n \"For evolving memories that you will update repeatedly, use mem_save with a\",\n \"topic key instead (topic-upsert pattern).\",\n \"\",\n \"PARAMETERS:\",\n \" id — full memory id to update\",\n \" body — new Markdown content (replaces existing body)\",\n \" tags — new tag list (replaces existing tags)\",\n \" paths — new anchor paths (replaces existing paths)\",\n \" symbols — new anchor symbols (replaces existing symbols)\",\n \"\",\n \"RETURNS: { id, file_path, updated_fields: string[] }\",\n ].join(\"\\n\"),\n MemUpdateInputSchema,\n async (input: MemUpdateInput) => jsonResult(await memUpdate(input, context)),\n );\n\n registerTool(\n \"mem_verify\",\n [\n \"Check whether memory anchor paths and symbols still exist in the current code.\",\n \"\",\n \"USE WHEN you want to know if a specific memory is still valid after a refactor,\",\n \"or to check all memories for staleness (haive sync does this automatically).\",\n \"\",\n \"PARAMETERS:\",\n \" id — check a single memory (omit to check all)\",\n \" update — write 'stale' or 'validated' status back to disk\",\n \"\",\n \"RETURNS: { results: [{ id, status: 'fresh'|'stale'|'anchorless', reason? }] }\",\n \"Stale means the anchored file/symbol no longer exists at that path.\",\n \"Anchorless means the memory has no paths/symbols — staleness is undetectable.\",\n ].join(\"\\n\"),\n MemVerifyInputSchema,\n async (input: MemVerifyInput) => jsonResult(await memVerify(input, context)),\n );\n\n registerTool(\n \"mem_approve\",\n [\n \"Mark a memory as validated (trusted, approved by a human or the team).\",\n \"\",\n \"In autopilot mode, memories are validated automatically — you rarely need this.\",\n \"In manual mode, call this after reviewing a proposed memory to activate it.\",\n \"\",\n \"PARAMETERS:\",\n \" id — full memory id to approve\",\n \"\",\n \"RETURNS: { id, previous_status, new_status: 'validated' }\",\n ].join(\"\\n\"),\n MemApproveInputSchema,\n async (input: MemApproveInput) => jsonResult(await memApprove(input, context)),\n );\n\n registerTool(\n \"mem_reject\",\n [\n \"Mark a memory as rejected and record a reason.\",\n \"\",\n \"USE WHEN a memory is factually wrong, outdated, or not useful.\",\n \"Rejection blocks auto-promotion and lowers the memory's trust signal.\",\n \"Rejected memories are excluded from get_briefing by default.\",\n \"\",\n \"PARAMETERS:\",\n \" id — full memory id to reject\",\n \" reason — why this memory is being rejected (stored in frontmatter)\",\n \"\",\n \"RETURNS: { id, previous_status, new_status: 'rejected' }\",\n ].join(\"\\n\"),\n MemRejectInputSchema,\n async (input: MemRejectInput) => jsonResult(await memReject(input, context)),\n );\n\n registerTool(\n \"mem_feedback\",\n [\n \"Record whether a memory actually HELPED — the closed-loop utility signal.\",\n \"\",\n \"USE right after a memory changed (or failed to change) what you did:\",\n \" - outcome='applied' → the memory steered your work (strong positive signal)\",\n \" - outcome='rejected' → it was wrong/outdated/unhelpful (negative signal)\",\n \"\",\n \"A read only means a memory was surfaced; 'applied' means it demonstrably helped.\",\n \"This powers `haive memory impact` (impact tiers + prune candidates) and future ranking.\",\n \"\",\n \"PARAMETERS:\",\n \" id — full memory id the feedback is about\",\n \" outcome — 'applied' | 'rejected'\",\n \" reason — why it was rejected (optional, stored on the usage record)\",\n \"\",\n \"RETURNS: { ok, id, outcome, usage:{read_count,applied_count,rejected_count}, impact:{score,tier,signals} }\",\n ].join(\"\\n\"),\n MemFeedbackInputSchema,\n async (input: MemFeedbackInput) => jsonResult(await memFeedback(input, context)),\n );\n\n registerTool(\n \"mem_pending\",\n [\n \"List memories in 'proposed' status awaiting review, sorted by read count.\",\n \"\",\n \"USE IN MANUAL MODE to see what memories are waiting for human review.\",\n \"In autopilot mode, proposed memories auto-approve after 72h.\",\n \"\",\n \"High read_count on a proposed memory = many agents found it useful without\",\n \"rejecting it = strong signal to approve.\",\n \"\",\n \"RETURNS: array of { id, type, scope, read_count, created_at, body_preview }\",\n ].join(\"\\n\"),\n MemPendingInputSchema,\n async (input: MemPendingInput) => jsonResult(await memPending(input, context)),\n );\n\n registerTool(\n \"mem_delete\",\n [\n \"Permanently delete a memory by id.\",\n \"\",\n \"USE WITH CAUTION — prefer mem_reject for outdated memories (preserves history).\",\n \"Use delete only for accidentally created memories or duplicates.\",\n \"\",\n \"PARAMETERS:\",\n \" id — full memory id to delete\",\n \" delete_usage — also delete usage stats (default: true)\",\n \"\",\n \"RETURNS: { deleted: true, id }\",\n ].join(\"\\n\"),\n MemDeleteInputSchema,\n async (input: MemDeleteInput) => jsonResult(await memDelete(input, context)),\n );\n\n // ── v0.5.0: granular alternatives to get_briefing ─────────────────────\n // Use these when you don't need the full one-shot briefing payload.\n\n registerTool(\n \"get_recap\",\n [\n \"Return ONLY the most recent session_recap. Cheaper than get_briefing when\",\n \"you just want to know 'what was I doing last time?' and don't need project\",\n \"context, modules, or memory ranking.\",\n \"\",\n \"PARAMETERS:\",\n \" scope — 'personal' | 'team' | 'any' (default 'any', returns the most recent across both)\",\n \"\",\n \"RETURNS: { recap: { id, scope, revision_count, created_at, body } | null, notice? }\",\n ].join(\"\\n\"),\n GetRecapInputSchema,\n async (input: GetRecapInput) => {\n tracker.record(\"get_recap\", input.scope);\n return jsonResult(await getRecap(input, context));\n },\n );\n\n registerTool(\n \"mem_relevant_to\",\n [\n \"One-shot ranked memories for a task — use instead of get_briefing when\",\n \"project context is already loaded and you only want the relevant memory layer.\",\n \"\",\n \"Second step in progressive disclosure (after get_briefing): narrow here, then mem_get for full text.\",\n \"\",\n \"Reuses the same ranking pipeline (anchor / module / literal / semantic) but\",\n \"skips project_context, modules, action_required, etc.\",\n \"\",\n \"PARAMETERS:\",\n \" task — 1–2 sentences describing what you are about to do (required)\",\n \" files — files you'll edit (surfaces anchored memories)\",\n \" limit — cap on returned memories (default 8)\",\n \" min_semantic_score — drop weak semantic hits below this cosine (default 0.25)\",\n \" format — 'full' | 'compact' | 'actions' (inherits get_briefing memory framing)\",\n \"\",\n \"RETURNS: { task, search_mode, memories: [...], hints?: [...], empty?: true }\",\n ].join(\"\\n\"),\n MemRelevantToInputSchema,\n async (input: MemRelevantToInput) => {\n tracker.record(\"mem_relevant_to\", input.task.slice(0, 80));\n return jsonResult(await memRelevantTo(input, context));\n },\n );\n\n // ── v0.5.0: code semantic search ──────────────────────────────────────\n\n registerTool(\n \"code_search\",\n [\n \"Semantic search over the codebase — finds exported symbols (functions, classes,\",\n \"interfaces) related to a natural-language query. Replaces blind grep when you\",\n \"don't know the exact symbol name.\",\n \"\",\n \"Requires `haive index code-search` to have been run (builds embeddings for every\",\n \"exported symbol from the code-map). Falls back to a notice when index is missing.\",\n \"\",\n \"PARAMETERS:\",\n \" query — natural language (e.g. 'function that hashes passwords', 'JWT signing')\",\n \" k — number of top hits (default 5)\",\n \" min_score — minimum cosine similarity (default 0.2; try 0.3+ for stricter)\",\n \"\",\n \"RETURNS: { available: bool, hits: [{ file, name, kind, line, description?, score }] }\",\n ].join(\"\\n\"),\n CodeSearchInputSchema,\n async (input: CodeSearchInput) => {\n tracker.record(\"code_search\", input.query.slice(0, 80));\n return jsonResult(await codeSearch(input, context));\n },\n );\n\n // ── v0.5.0: file-context lookup ───────────────────────────────────────\n\n registerTool(\n \"why_this_file\",\n [\n \"One-shot file-context lookup: combines recent git history, memories anchored\",\n \"to the path, and the code-map entry. Answers 'why is this file the way it is?'\",\n \"in a single call instead of 3-4 manual ones.\",\n \"\",\n \"PARAMETERS:\",\n \" path — project-relative path (required)\",\n \" git_log_limit — recent commits to include (default 5)\",\n \" memory_limit — anchored memories cap (default 5)\",\n \"\",\n \"RETURNS: { file, exists, recent_commits: [...], memories: [...], code_map_entry, hints? }\",\n ].join(\"\\n\"),\n WhyThisFileInputSchema,\n async (input: WhyThisFileInput) => {\n tracker.record(\"why_this_file\", input.path);\n return jsonResult(await whyThisFile(input, context));\n },\n );\n\n // ── v0.5.0: anti-patterns check ───────────────────────────────────────\n\n registerTool(\n \"anti_patterns_check\",\n [\n \"Scan a diff (or set of paths) against documented attempt/gotcha memories.\",\n \"[Diff-scan layer: the MEMORY-MATCH component. `pre_commit_check` combines this with sensors + stale checks; `haive enforce check` is the gate.]\",\n \"Surfaces 'you are about to repeat a known mistake' warnings BEFORE you commit.\",\n \"\",\n \"USE BEFORE finalizing a non-trivial change. Cheap and high-signal: the only\",\n \"memories scanned are 'attempt' and 'gotcha' types.\",\n \"\",\n \"PARAMETERS:\",\n \" diff — raw unified diff text (or any code snippet) — optional if `paths` provided\",\n \" paths — affected file paths (optional if `diff` provided)\",\n \" limit — cap on returned warnings (default 8)\",\n \" semantic — also use semantic search (default true; requires embeddings index)\",\n \"\",\n \"RETURNS: { scanned, warnings: [{ id, type, scope, confidence, body_preview, reasons, semantic_score? }] }\",\n ].join(\"\\n\"),\n AntiPatternsCheckInputSchema,\n async (input: AntiPatternsCheckInput) => {\n tracker.record(\"anti_patterns_check\", input.paths.join(\",\").slice(0, 80));\n return jsonResult(await antiPatternsCheck(input, context));\n },\n );\n\n // ── v0.6.0 additions ───────────────────────────────────────────────────\n\n registerTool(\n \"mem_distill\",\n [\n \"Cluster recurring observations / failed attempts so a human can collapse\",\n \"N similar memories into one richer convention/gotcha. Cheap heuristic\",\n \"(anchor path overlap + body keyword overlap) — no embeddings required.\",\n \"\",\n \"USE periodically (e.g. monthly) to prevent memory pollution from agents\",\n \"saving the same observation many times.\",\n \"\",\n \"PARAMETERS:\",\n \" since_days — only consider memories from the last N days (default 30)\",\n \" min_cluster — minimum cluster size to surface (default 3)\",\n \" type_filter — 'gotcha' | 'attempt' | 'all' (default 'gotcha')\",\n \" scope — 'personal' | 'team' | 'module' | 'any' (default 'any')\",\n \"\",\n \"RETURNS: { scanned, singletons, clusters: [{ suggested_topic, member_ids, ... }] }\",\n \"Output is advisory — nothing is written to disk.\",\n ].join(\"\\n\"),\n MemDistillInputSchema,\n async (input: MemDistillInput) => {\n tracker.record(\"mem_distill\", `${input.type_filter}/since=${input.since_days}d`);\n return jsonResult(await memDistill(input, context));\n },\n );\n\n registerTool(\n \"why_this_decision\",\n [\n \"Trace the genealogy of a memory (especially decision/architecture):\",\n \"the memory itself + memories explicitly linked via related_ids + memories\",\n \"anchored to overlapping paths + recent commits touching those paths.\",\n \"\",\n \"USE WHEN you find a memory and need to understand WHY it was made and\",\n \"what surrounds it. One call instead of 4-5 manual lookups.\",\n \"\",\n \"PARAMETERS:\",\n \" id — memory id (required)\",\n \" git_log_limit — how many recent commits per anchor path (default 5)\",\n \"\",\n \"RETURNS: { decision, related: [...], path_neighbors: [...], recent_commits: [...] }\",\n ].join(\"\\n\"),\n WhyThisDecisionInputSchema,\n async (input: WhyThisDecisionInput) => {\n tracker.record(\"why_this_decision\", input.id);\n return jsonResult(await whyThisDecision(input, context));\n },\n );\n\n registerTool(\n \"mem_conflicts_with\",\n [\n \"Detect memories that potentially CONTRADICT a given memory.\",\n \"\",\n \"USE BEFORE relying on a memory's advice — surfaces 'another memory says\",\n \"the opposite'. Detection uses several heuristics layered together:\",\n \"\",\n \" 1. Opposite status — validated vs rejected on overlapping topic\",\n \" 2. attempt-vs-convention on overlapping anchor paths\",\n \" 3. Polarity keywords — 'use X' vs 'do not use X' among semantic neighbors\",\n \" 4. Explicit #contradicts:<id> tags in either body\",\n \"\",\n \"PARAMETERS:\",\n \" id — memory id to check (required)\",\n \" min_score — minimum cosine similarity for semantic neighbors (default 0.5)\",\n \" semantic — use embeddings (default true)\",\n \"\",\n \"RETURNS: { found, target, scanned, conflicts: [{ id, reasons, similarity, ... }] }\",\n ].join(\"\\n\"),\n MemConflictsInputSchema,\n async (input: MemConflictsInput) => {\n tracker.record(\"mem_conflicts_with\", input.id);\n return jsonResult(await memConflicts(input, context));\n },\n );\n\n registerTool(\n \"mem_conflict_candidates\",\n [\n \"Bulk scan for conflict CANDIDATES (not proof):\",\n \"\",\n \" 1. Lexical similarity (Jaccard) on decision/architecture-like pairs\",\n \" 2. Same frontmatter.topic with validated vs rejected — quick human-review signal\",\n \"\",\n \"Advisory only — follow with mem_conflicts_with on specific ids.\",\n \"\",\n \"PARAMETERS:\",\n \" since_days, types, min_jaccard, max_pairs, max_scan, max_topic_pairs\",\n \"\",\n \"RETURNS: { pairs, topic_status_pairs, scanned, truncated, notice? }\",\n ].join(\"\\n\"),\n MemConflictCandidatesInputSchema,\n async (input: MemConflictCandidatesInput) => {\n tracker.record(\"mem_conflict_candidates\", `${input.since_days}d`);\n return jsonResult(await memConflictCandidates(input, context));\n },\n );\n\n registerTool(\n \"runtime_journal_append\",\n [\n \"Append one line to `.ai/.runtime/session-journal.ndjson` — machine-local session continuity.\",\n \"\",\n \"Does NOT replace team memories; complements mem_session_end recaps for local traces.\",\n \"\",\n \"PARAMETERS: message, kind (note|session_end|mcp), optional tool\",\n \"\",\n \"RETURNS: { ok, path_hint }\",\n ].join(\"\\n\"),\n RuntimeJournalAppendInputSchema,\n async (input: RuntimeJournalAppendInput) =>\n jsonResult(await runtimeJournalAppend(input, context)),\n );\n\n registerTool(\n \"runtime_journal_tail\",\n [\n \"Read the last N entries from the runtime session journal (parsed JSON lines).\",\n \"\",\n \"PARAMETERS: limit (default 30, max 500)\",\n \"\",\n \"RETURNS: { entries: [...], empty?: true }\",\n ].join(\"\\n\"),\n RuntimeJournalTailInputSchema,\n async (input: RuntimeJournalTailInput) =>\n jsonResult(await runtimeJournalTail(input, context)),\n );\n\n registerTool(\n \"pre_commit_check\",\n [\n \"One-shot 'should I block this commit?' check. Combines three signals:\",\n \"[Diff-scan layer: the COMBINED check (sensors + anti-patterns + stale). `haive enforce check` is the gate that runs this at commit time.]\",\n \"\",\n \" 1. anti_patterns_check — known gotchas/attempts that match the diff\",\n \" 2. mem_for_files — conventions/decisions anchored to touched files\",\n \" 3. mem_verify — memories whose anchors are stale (knowledge may be wrong)\",\n \"\",\n \"USE FROM A GIT HOOK or before finalizing a non-trivial change.\",\n \"\",\n \"PARAMETERS:\",\n \" diff — raw unified diff text (e.g. `git diff --cached`)\",\n \" paths — affected file paths (project-relative)\",\n \" block_on — 'any' | 'high-confidence' (default) | 'never'\",\n \" semantic — use embeddings in anti_patterns_check (default true)\",\n \"\",\n \"RETURNS: { should_block, summary, warnings, relevant_memories, stale_anchors }\",\n ].join(\"\\n\"),\n PreCommitCheckInputSchema,\n async (input: PreCommitCheckInput) => {\n tracker.record(\"pre_commit_check\", `${input.paths.length}p`);\n return jsonResult(await preCommitCheck(input, context));\n },\n );\n\n registerTool(\n \"pattern_detect\",\n [\n \"Heuristic memory detector — finds knowledge worth saving WITHOUT calling an LLM.\",\n \"\",\n \"Runs three signals over local git history and the tool-usage log:\",\n \" 1. CONFIG_CHANGE — config files modified recently (tsconfig, eslint, prettier, …)\",\n \" → proposes a convention memory with the git diff as body.\",\n \" 2. REPEATED_PATH — same file appears ≥3× in mem_tried/mem_observe events\",\n \" → proposes a gotcha memory anchored to that path.\",\n \" 3. HOT_FILE — source file referenced ≥3× in writing-tool events\",\n \" → proposes a convention memory (frequent edits = pattern emerging).\",\n \"\",\n \"Saves memories with status='proposed'. They feed into auto-promote (Phase 4)\",\n \"or are surfaced in the next post_task distillation for LLM review.\",\n \"\",\n \"USE periodically (e.g. end of sprint) or trigger from post-commit hook.\",\n \"\",\n \"PARAMETERS:\",\n \" since_days — look-back window in days (default 7)\",\n \" dry_run — report matches without saving (default false)\",\n \" scope — 'team' (default) | 'personal'\",\n \"\",\n \"RETURNS: { scanned_events, matches: [{kind, signal, proposed_type, …}], saved, saved_ids }\",\n ].join(\"\\n\"),\n PatternDetectInputSchema,\n async (input: PatternDetectInput) => {\n tracker.record(\"pattern_detect\", `since=${input.since_days}d/dry_run=${input.dry_run}`);\n return jsonResult(await patternDetect(input, context));\n },\n );\n\n registerTool(\n \"mem_diff\",\n [\n \"Compare two memories side-by-side to decide if they should be merged.\",\n \"\",\n \"USE BEFORE merging or deduplicating similar memories.\",\n \"Shows: frontmatter fields that differ + lines unique to each body.\",\n \"\",\n \"PARAMETERS:\",\n \" id_a — first memory id\",\n \" id_b — second memory id\",\n \"\",\n \"RETURNS: { frontmatter_diff: {...}, body_only_in_a: [...], body_only_in_b: [...] }\",\n ].join(\"\\n\"),\n MemDiffInputSchema,\n async (input: MemDiffInput) => jsonResult(await memDiff(input, context)),\n );\n\n if (shouldRegisterPrompt(\"bootstrap_project\")) {\n server.prompt(\n \"bootstrap_project\",\n [\n \"Analyze the project codebase and write .ai/project-context.md — run once after haive init.\",\n \"The AI explores the directory structure, reads key files (package.json, README, config),\",\n \"identifies the tech stack, architectural patterns, key modules, and conventions,\",\n \"then persists everything via bootstrap_project_save.\",\n \"For multi-component projects, run with module param to create .ai/modules/<name>/context.md.\",\n ].join(\" \"),\n BootstrapProjectArgsSchema,\n (args: BootstrapProjectArgs) => bootstrapProjectPrompt(args, context),\n );\n }\n\n if (shouldRegisterPrompt(\"post_task\")) {\n server.prompt(\n \"post_task\",\n [\n \"⭐ Post-task reflection — run at the end of every session to capture what you learned:\",\n \"failed approaches (mem_tried), new conventions/decisions/gotchas (mem_save),\",\n \"code discoveries (mem_observe), and an end-of-session recap (mem_session_end).\",\n \"In autopilot mode a minimal recap saves automatically; calling this produces a richer one.\",\n ].join(\" \"),\n PostTaskArgsSchema,\n (args: PostTaskArgs) => postTaskPrompt(args, context),\n );\n }\n\n if (shouldRegisterPrompt(\"import_docs\")) {\n server.prompt(\n \"import_docs\",\n [\n \"Import knowledge from a document (README, ADR, wiki, API spec) as hAIve memories.\",\n \"Pass the full document content; the AI extracts up to 10 actionable memories\",\n \"(conventions, decisions, gotchas, architecture) and saves them via mem_save.\",\n \"Good candidates: ADRs, onboarding docs, runbooks, team wikis.\",\n ].join(\" \"),\n ImportDocsArgsSchema,\n (args: ImportDocsArgs) => importDocsPrompt(args, context),\n );\n }\n\n return { server, context, tracker };\n}\n\n// ── Stdio runtime (also invoked by `haive mcp --stdio` via bundled CLI) ─────\n\n/** Parse argv for the standalone haive-mcp binary / CLI subprocess parity. */\nexport function parseMcpCliArgs(argv: string[]): {\n root?: string;\n versionOnly: boolean;\n} {\n for (let i = 2; i < argv.length; i++) {\n const arg = argv[i];\n if (arg === \"--version\" || arg === \"-V\") {\n return { versionOnly: true };\n }\n }\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 { root: out.root, versionOnly: false };\n}\n\n/** Print MCP server version (same as haive CLI when bundled together). */\nexport function printHaiveMcpVersion(): void {\n console.log(SERVER_VERSION);\n}\n\n/**\n * Run the MCP server over stdio. Used by `haive-mcp` and by `haive mcp --stdio`\n * when the MCP implementation is bundled into the CLI.\n */\nexport async function runHaiveMcpStdio(options: { root?: string }): Promise<void> {\n const { server, context } = createHaiveServer({ root: options.root, env: process.env });\n console.error(\n `[haive-mcp] starting server v${SERVER_VERSION} (project root: ${context.paths.root})`,\n );\n await server.connect(new StdioServerTransport());\n}\n","import { findProjectRoot, resolveHaivePaths, type HaivePaths } from \"@hiveai/core\";\n\nexport interface HaiveContext {\n paths: HaivePaths;\n}\n\nexport interface CreateContextOptions {\n root?: string;\n env?: NodeJS.ProcessEnv;\n cwd?: string;\n}\n\nexport function createContext(options: CreateContextOptions = {}): HaiveContext {\n const env = options.env ?? process.env;\n const cwd = options.cwd ?? process.cwd();\n const root =\n options.root ??\n env.HAIVE_PROJECT_ROOT ??\n findProjectRoot(cwd);\n return { paths: resolveHaivePaths(root) };\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const BootstrapProjectSaveInputSchema = {\n content: z\n .string()\n .min(1)\n .describe(\"Full Markdown content for the project (or module) context file\"),\n module: z\n .string()\n .optional()\n .describe(\n \"If provided, save under .ai/modules/<module>/context.md instead of .ai/project-context.md\",\n ),\n overwrite: z\n .boolean()\n .default(false)\n .describe(\"Overwrite an existing file instead of failing\"),\n};\n\nexport type BootstrapProjectSaveInput = {\n [K in keyof typeof BootstrapProjectSaveInputSchema]: z.infer<\n (typeof BootstrapProjectSaveInputSchema)[K]\n >;\n};\n\nexport interface BootstrapProjectSaveOutput {\n file_path: string;\n action: \"created\" | \"overwritten\";\n}\n\nexport async function bootstrapProjectSave(\n input: BootstrapProjectSaveInput,\n ctx: HaiveContext,\n): Promise<BootstrapProjectSaveOutput> {\n const target = input.module\n ? path.join(ctx.paths.modulesContextDir, input.module, \"context.md\")\n : ctx.paths.projectContext;\n\n const exists = existsSync(target);\n if (exists && !input.overwrite) {\n throw new Error(\n `${target} already exists. Pass overwrite=true to replace it.`,\n );\n }\n\n await mkdir(path.dirname(target), { recursive: true });\n await writeFile(target, input.content, \"utf8\");\n\n return {\n file_path: target,\n action: exists ? \"overwritten\" : \"created\",\n };\n}\n","import { readFile, readdir } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const GetProjectContextInputSchema = {\n module: z\n .string()\n .optional()\n .describe(\"If provided, also include the matching module's context file\"),\n list_modules: z\n .boolean()\n .default(false)\n .describe(\"Return the list of available module context files\"),\n};\n\nexport type GetProjectContextInput = {\n [K in keyof typeof GetProjectContextInputSchema]: z.infer<\n (typeof GetProjectContextInputSchema)[K]\n >;\n};\n\nexport interface GetProjectContextOutput {\n root_context: string | null;\n module_context?: { name: string; content: string };\n available_modules?: string[];\n}\n\nexport async function getProjectContext(\n input: GetProjectContextInput,\n ctx: HaiveContext,\n): Promise<GetProjectContextOutput> {\n const out: GetProjectContextOutput = { root_context: null };\n\n if (existsSync(ctx.paths.projectContext)) {\n out.root_context = await readFile(ctx.paths.projectContext, \"utf8\");\n }\n\n if (input.module) {\n const modFile = path.join(ctx.paths.modulesContextDir, input.module, \"context.md\");\n if (existsSync(modFile)) {\n out.module_context = {\n name: input.module,\n content: await readFile(modFile, \"utf8\"),\n };\n }\n }\n\n if (input.list_modules) {\n out.available_modules = await listModules(ctx.paths.modulesContextDir);\n }\n\n return out;\n}\n\nasync function listModules(modulesDir: string): Promise<string[]> {\n if (!existsSync(modulesDir)) return [];\n const entries = await readdir(modulesDir, { withFileTypes: true });\n return entries.filter((e) => e.isDirectory()).map((e) => e.name).sort();\n}\n","import { existsSync } from \"node:fs\";\nimport { loadMemoriesFromDir } from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemListInputSchema = {\n scope: z.enum([\"personal\", \"team\", \"module\"]).optional(),\n type: z\n .enum([\"convention\", \"decision\", \"gotcha\", \"architecture\", \"glossary\"])\n .optional(),\n module: z.string().optional(),\n tag: z.string().optional(),\n status: z\n .enum([\"draft\", \"proposed\", \"validated\", \"deprecated\", \"stale\", \"rejected\"])\n .optional()\n .describe(\"Filter by a single status. Omit to return all statuses.\"),\n exclude_rejected: z\n .boolean()\n .default(false)\n .describe(\"When true, exclude memories with status=rejected from results.\"),\n include_body: z\n .boolean()\n .default(false)\n .describe(\"Include full body text. Default false to save tokens — use mem_get for a single memory's full content.\"),\n};\n\nexport type MemListInput = {\n [K in keyof typeof MemListInputSchema]: z.infer<(typeof MemListInputSchema)[K]>;\n};\n\nexport interface MemSummary {\n id: string;\n scope: string;\n type: string;\n module?: string;\n status: string;\n tags: string[];\n snippet: string;\n file_path: string;\n body?: string;\n}\n\nexport async function memList(\n input: MemListInput,\n ctx: HaiveContext,\n): Promise<{ memories: MemSummary[] }> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n return { memories: [] };\n }\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const filtered = all.filter(({ memory }) => {\n const fm = memory.frontmatter;\n if (input.scope && fm.scope !== input.scope) return false;\n if (input.type && fm.type !== input.type) return false;\n if (input.module && fm.module !== input.module) return false;\n if (input.tag && !fm.tags.includes(input.tag)) return false;\n if (input.status && fm.status !== input.status) return false;\n if (input.exclude_rejected && fm.status === \"rejected\") return false;\n return true;\n });\n const memories: MemSummary[] = filtered.map(({ memory, filePath }) => {\n const fm = memory.frontmatter;\n const snippet = memory.body.replace(/\\s+/g, \" \").trim().slice(0, 120);\n return {\n id: fm.id,\n scope: fm.scope,\n type: fm.type,\n ...(fm.module ? { module: fm.module } : {}),\n status: fm.status,\n tags: fm.tags,\n snippet,\n file_path: filePath,\n ...(input.include_body ? { body: memory.body } : {}),\n };\n });\n return { memories };\n}\n","import { createHash } from \"node:crypto\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport {\n buildFrontmatter,\n loadConfig,\n loadMemoriesFromDir,\n memoryFilePath,\n serializeMemory,\n suggestSensorFromMemory,\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\", \"skill\", \"attempt\", \"session_recap\"])\n .describe(\n \"Kind of memory being saved. \" +\n \"Use 'skill' for reusable procedures/playbooks agents should follow for recurring tasks (feedforward harness guide). \" +\n \"Use 'attempt' for failed approaches (auto-validated). \" +\n \"Use 'session_recap' via mem_session_end instead.\",\n ),\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 .optional()\n .describe(\n \"Visibility scope: personal | team | module. \" +\n \"When omitted, falls back to defaultScope in haive.config.json (default: personal).\",\n ),\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 topic: z\n .string()\n .optional()\n .describe(\n \"Stable key for this memory. If a memory with the same topic already exists in this scope, \" +\n \"it is updated in-place (revision_count++). Use for knowledge that evolves over time.\",\n ),\n activation: z\n .object({\n keywords: z.array(z.string()).default([]),\n globs: z.array(z.string()).default([]),\n always: z.boolean().default(false),\n })\n .optional()\n .describe(\n \"Only for type='skill'. Progressive-disclosure triggers: the skill is surfaced ONLY when \" +\n \"a keyword matches the task or a glob matches the edited files (or always=true). Omit to keep \" +\n \"the skill always-eligible.\",\n ),\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 action: \"created\" | \"updated\";\n revision_count?: number;\n warning?: string;\n similar_found?: string[];\n /** High textual overlap with existing memory (same scope+type); consider merging instead. */\n body_similar?: { id: string; score: number };\n invalid_paths?: string[];\n suggested_sensor?: boolean;\n}\n\nfunction bodyHash(body: string): string {\n return createHash(\"sha256\").update(body.trim()).digest(\"hex\").slice(0, 12);\n}\n\nconst WORD_RE = /\\b[a-z0-9]{3,}\\b/gi;\n\nfunction bodyTokenSet(body: string): Set<string> {\n const raw = body.toLowerCase().match(WORD_RE) ?? [];\n return new Set(raw);\n}\n\n/** Jaccard similarity on alphanumeric tokens — warns when corpus has near-duplicate wording. */\nfunction maxBodySimilarity(\n incomingTokens: Set<string>,\n memories: Array<{ memory: { body: string; frontmatter: { scope: string; type: string; id: string; status?: string } } }>,\n scope: string,\n type: string,\n excludeIds?: ReadonlySet<string>,\n): { score: number; id: string } | null {\n if (incomingTokens.size < 6) return null;\n let best: { score: number; id: string } | null = null;\n const skip = excludeIds ?? new Set<string>();\n for (const { memory } of memories) {\n const fm = memory.frontmatter;\n if (skip.has(fm.id)) continue;\n if (fm.scope !== scope || fm.type !== type) continue;\n if (fm.status === \"rejected\" || fm.status === \"deprecated\") continue;\n const other = bodyTokenSet(memory.body);\n if (other.size === 0) continue;\n let inter = 0;\n for (const t of incomingTokens) if (other.has(t)) inter++;\n const uni = incomingTokens.size + other.size - inter;\n const j = uni === 0 ? 0 : inter / uni;\n if (j >= 0.72 && (!best || j > best.score)) best = { score: j, id: fm.id };\n }\n return best;\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 existing = existsSync(ctx.paths.memoriesDir)\n ? await loadMemoriesFromDir(ctx.paths.memoriesDir)\n : [];\n\n // ── Resolve scope once: explicit input wins over config default ────────\n // Must be computed early so dedup and topic-upsert use the same scope\n // that the new memory will ultimately be saved under.\n const haiveConfig = await loadConfig(ctx.paths);\n const resolvedScope = (\n input.scope ?? haiveConfig.defaultScope ?? \"personal\"\n ) as \"personal\" | \"team\" | \"module\";\n\n // ── Anchor path validation ─────────────────────────────────────────────\n const invalidPaths = input.paths.filter(\n (p) => !existsSync(path.resolve(ctx.paths.root, p)),\n );\n\n // ── Dedup by content hash ──────────────────────────────────────────────\n const incomingHash = bodyHash(input.body);\n const hashDuplicate = existing.find(({ memory }) =>\n bodyHash(memory.body) === incomingHash &&\n memory.frontmatter.scope === resolvedScope,\n );\n if (hashDuplicate) {\n throw new Error(\n `Duplicate content detected — identical body already saved as \"${hashDuplicate.memory.frontmatter.id}\". ` +\n `Use mem_update to modify it, or change the body to add new information.`,\n );\n }\n\n const incomingTokens = bodyTokenSet(input.body);\n\n function bodySimilarWarnings(excludeIds?: ReadonlySet<string>): {\n similarityWarning?: string;\n body_similar?: MemSaveOutput[\"body_similar\"];\n } {\n const dup = maxBodySimilarity(incomingTokens, existing, resolvedScope, input.type, excludeIds);\n if (!dup?.id) return {};\n const body_similar: MemSaveOutput[\"body_similar\"] = {\n id: dup.id,\n score: Math.round(dup.score * 100) / 100,\n };\n return {\n similarityWarning: `Body is ~${Math.round(dup.score * 100)}% similar (token overlap) to existing \"${dup.id}\" — consolidate if redundant.`,\n body_similar,\n };\n }\n\n // ── Topic upsert ───────────────────────────────────────────────────────\n if (input.topic) {\n const topicMatch = existing.find(({ memory }) =>\n memory.frontmatter.topic === input.topic &&\n memory.frontmatter.scope === resolvedScope &&\n (!input.module || memory.frontmatter.module === input.module),\n );\n\n if (topicMatch) {\n const fm = topicMatch.memory.frontmatter;\n const { similarityWarning: simW, body_similar: bs } = bodySimilarWarnings(new Set([fm.id]));\n const newFrontmatter = {\n ...fm,\n tags: input.tags.length ? input.tags : fm.tags,\n revision_count: (fm.revision_count ?? 0) + 1,\n anchor: {\n commit: input.commit ?? fm.anchor.commit,\n paths: input.paths.length ? input.paths : fm.anchor.paths,\n symbols: input.symbols.length ? input.symbols : fm.anchor.symbols,\n },\n };\n const suggestedSensor = !newFrontmatter.sensor\n ? suggestSensorForSavedMemory(input.type, input.body, newFrontmatter.anchor.paths)\n : null;\n if (suggestedSensor) newFrontmatter.sensor = suggestedSensor;\n await writeFile(\n topicMatch.filePath,\n serializeMemory({ frontmatter: newFrontmatter, body: input.body }),\n \"utf8\",\n );\n const mergedTw = [\n invalidPaths.length > 0\n ? `Anchor path(s) not found in project: ${invalidPaths.join(\", \")}. They will be marked stale by haive sync.`\n : null,\n criticalAnchorWarning(input.type, fm.status, newFrontmatter.anchor.paths, newFrontmatter.anchor.symbols),\n simW ?? null,\n ]\n .filter(Boolean)\n .join(\" — \") || undefined;\n\n return {\n id: fm.id,\n scope: fm.scope,\n file_path: topicMatch.filePath,\n action: \"updated\",\n revision_count: newFrontmatter.revision_count,\n ...(mergedTw ? { warning: mergedTw } : {}),\n ...(bs ? { body_similar: bs } : {}),\n ...(invalidPaths.length > 0 ? { invalid_paths: invalidPaths } : {}),\n ...(suggestedSensor ? { suggested_sensor: true } : {}),\n };\n }\n }\n\n // ── Create new memory ──────────────────────────────────────────────────\n // resolvedScope and haiveConfig are already computed above.\n\n const frontmatter = buildFrontmatter({\n type: input.type,\n slug: input.slug,\n scope: resolvedScope,\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 topic: input.topic,\n status: haiveConfig.defaultStatus === \"validated\" ? \"validated\" : undefined,\n sensor: suggestSensorForSavedMemory(input.type, input.body, input.paths) ?? undefined,\n activation: input.type === \"skill\" ? input.activation : undefined,\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 // ── Similar slug detection (warn but don't block) ──────────────────────\n let warning: string | undefined;\n let similar_found: string[] | undefined;\n if (existing.length > 0) {\n const slugTokens = input.slug.toLowerCase().split(/[-_\\s]+/).filter(Boolean);\n const similar = existing.filter(({ memory }) => {\n const id = memory.frontmatter.id.toLowerCase();\n return (\n slugTokens.length >= 2 &&\n slugTokens.filter((t) => id.includes(t)).length >= Math.ceil(slugTokens.length * 0.6)\n );\n });\n if (similar.length > 0) {\n similar_found = similar.map((m) => m.memory.frontmatter.id);\n warning = `Possible duplicate: similar memories already exist (${similar_found.join(\", \")}). Consider updating one of these instead.`;\n }\n }\n\n await writeFile(file, serializeMemory({ frontmatter, body: input.body }), \"utf8\");\n\n const { similarityWarning: simWarnNew, body_similar: bsNew } = bodySimilarWarnings();\n\n // Merge warnings: invalid anchors + slug similarity + body similarity\n const finalWarning = [\n invalidPaths.length > 0\n ? `Anchor path(s) not found in project: ${invalidPaths.join(\", \")}. They will be marked stale by \\`haive sync\\`.`\n : null,\n criticalAnchorWarning(frontmatter.type, frontmatter.status, frontmatter.anchor.paths, frontmatter.anchor.symbols),\n warning ?? null,\n simWarnNew ?? null,\n ].filter(Boolean).join(\" — \") || undefined;\n\n return {\n id: frontmatter.id,\n scope: frontmatter.scope,\n file_path: file,\n action: \"created\",\n ...(finalWarning ? { warning: finalWarning } : {}),\n ...(similar_found ? { similar_found } : {}),\n ...(bsNew ? { body_similar: bsNew } : {}),\n ...(invalidPaths.length > 0 ? { invalid_paths: invalidPaths } : {}),\n ...(frontmatter.sensor?.autogen ? { suggested_sensor: true } : {}),\n };\n}\n\nfunction suggestSensorForSavedMemory(\n type: string,\n body: string,\n paths: string[],\n) {\n if (type !== \"gotcha\" && type !== \"attempt\") return null;\n return suggestSensorFromMemory(body, paths);\n}\n\nfunction criticalAnchorWarning(\n type: string,\n status: string,\n paths: string[],\n symbols: string[],\n): string | null {\n if (![\"decision\", \"gotcha\", \"architecture\"].includes(type)) return null;\n if (status !== \"validated\") return null;\n if (paths.length > 0 || symbols.length > 0) return null;\n return `${type} is validated without paths or symbols; add anchors so hAIve can detect drift.`;\n}\n","import { existsSync } from \"node:fs\";\nimport {\n deriveConfidence,\n extractSnippet,\n getUsage,\n literalMatchesAllTokens,\n literalMatchesAnyToken,\n loadMemoriesFromDir,\n loadUsageIndex,\n pickSnippetNeedle,\n rankMemoriesLexical,\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\", \"attempt\", \"session_recap\"])\n .optional()\n .describe(\"Restrict results to a memory type. session_recap is excluded by default — use type='session_recap' to include them.\"),\n include_session_recap: z\n .boolean()\n .default(false)\n .describe(\"Include session_recap memories in search results (excluded by default — they surface in get_briefing as last_session).\"),\n module: z.string().optional().describe(\"Restrict results to a module\"),\n status: z\n .enum([\"draft\", \"proposed\", \"validated\", \"deprecated\", \"stale\", \"rejected\"])\n .optional()\n .describe(\"Filter by a single status. Omit to return all statuses.\"),\n exclude_rejected: z\n .boolean()\n .default(false)\n .describe(\"When true, exclude memories with status=rejected from results.\"),\n limit: z.number().int().positive().max(100).default(20).describe(\"Max results\"),\n semantic: z\n .boolean()\n .default(false)\n .describe(\n \"Use semantic similarity from the embeddings index (requires `haive embeddings index`).\",\n ),\n lexical_rank: z\n .boolean()\n .default(false)\n .describe(\n \"When true (and semantic is false), rank the filtered corpus with Okapi-BM25-style lexical scoring instead of literal AND/OR. Helps phrase-like queries without embeddings.\",\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\n/** session_recap memories are surfaced separately via get_briefing.last_session — not in search results by default. */\nfunction isSessionRecap(fm: { type: string }): boolean {\n return fm.type === \"session_recap\";\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\" | \"lexical_ranked\";\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 if (input.lexical_rank && input.query.trim()) {\n const { ranked, scores } = rankMemoriesLexical(\n filtered,\n input.query,\n input.limit,\n );\n if (ranked.length > 0) {\n const snippetNeedle = pickSnippetNeedle(input.query);\n result = {\n matches: ranked.map((loaded, i) =>\n lexicalHit(loaded, snippetNeedle, usage, scores[i]!),\n ),\n total: ranked.length,\n mode: \"lexical_ranked\",\n };\n } else {\n result = {\n ...buildLiteralResult(input, filtered, usage),\n notice: \"Lexical ranking found no BM25-positive hits — showing literal matches instead.\",\n };\n }\n } else {\n result = buildLiteralResult(input, filtered, usage);\n }\n\n if (input.track && result.matches.length > 0) {\n await trackReads(\n ctx.paths,\n result.matches.map((m) => m.id),\n );\n }\n\n return result;\n}\n\nfunction passesFilters(\n fm: LoadedMemory[\"memory\"][\"frontmatter\"],\n input: MemSearchInput,\n): boolean {\n if (input.scope && fm.scope !== input.scope) return false;\n if (input.type && fm.type !== input.type) return false;\n if (input.module && fm.module !== input.module) return false;\n if (input.status && fm.status !== input.status) return false;\n if (input.exclude_rejected && fm.status === \"rejected\") return false;\n // session_recap memories surface via get_briefing.last_session — exclude unless explicitly requested\n if (!input.include_session_recap && isSessionRecap(fm)) 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\"; notice?: string } {\n const tokens = tokenizeQuery(input.query);\n const snippetNeedle = pickSnippetNeedle(input.query);\n\n let andMatched = filtered.filter(({ memory }) => literalMatchesAllTokens(memory, tokens));\n if (andMatched.length > 0) {\n const top = andMatched.slice(0, input.limit);\n return {\n matches: top.map((loaded) => toHit(loaded, snippetNeedle, usage)),\n total: andMatched.length,\n mode: \"literal\",\n };\n }\n\n // AND returned nothing — fall back to OR (any token)\n const orMatched = filtered.filter(({ memory }) => literalMatchesAnyToken(memory, tokens));\n const top = orMatched.slice(0, input.limit);\n return {\n matches: top.map((loaded) => toHit(loaded, snippetNeedle, usage)),\n total: orMatched.length,\n mode: \"literal\",\n notice: `No exact match for all tokens. Showing partial matches (OR fallback) — ${orMatched.length} result${orMatched.length === 1 ? \"\" : \"s\"}.`,\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\nfunction lexicalHit(\n loaded: LoadedMemory,\n needle: string,\n usage: UsageIndex,\n lexicalScore: number,\n): MemSearchHit {\n return { ...toHit(loaded, needle, usage), score: lexicalScore };\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 possible_renames?: string[];\n status_after: string;\n skipped?: boolean;\n}\n\nexport interface MemVerifyOutput {\n results: MemVerifyHit[];\n summary: {\n checked: number;\n fresh: number;\n stale: number;\n anchorless_skipped: number;\n updated: number;\n };\n}\n\nexport async function memVerify(\n input: MemVerifyInput,\n ctx: HaiveContext,\n): Promise<MemVerifyOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n return {\n results: [],\n summary: { checked: 0, fresh: 0, stale: 0, anchorless_skipped: 0, updated: 0 },\n };\n }\n\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const targets = input.id\n ? all.filter((m) => m.memory.frontmatter.id === input.id)\n : all;\n\n const results: MemVerifyHit[] = [];\n let fresh = 0;\n let stale = 0;\n let anchorless = 0;\n let updated = 0;\n\n for (const { memory, filePath } of targets) {\n // session_recap records historical context — anchor staleness does not apply\n if (memory.frontmatter.type === \"session_recap\") {\n anchorless++;\n results.push({\n id: memory.frontmatter.id,\n file_path: filePath,\n stale: false,\n reason: null,\n status_after: memory.frontmatter.status,\n skipped: true,\n });\n continue;\n }\n const isAnchored =\n memory.frontmatter.anchor.paths.length > 0 ||\n memory.frontmatter.anchor.symbols.length > 0;\n if (!isAnchored) {\n anchorless++;\n results.push({\n id: memory.frontmatter.id,\n file_path: filePath,\n stale: false,\n reason: null,\n status_after: memory.frontmatter.status,\n skipped: true,\n });\n continue;\n }\n const result = await verifyAnchor(memory, { projectRoot: ctx.paths.root });\n if (result.stale) stale++;\n else fresh++;\n\n let statusAfter = memory.frontmatter.status;\n if (input.update) {\n const next = applyVerification(memory, result);\n await writeFile(filePath, serializeMemory(next), \"utf8\");\n statusAfter = next.frontmatter.status;\n updated++;\n }\n\n results.push({\n id: memory.frontmatter.id,\n file_path: filePath,\n stale: result.stale,\n reason: result.reason,\n ...(result.possibleRenames.length > 0 ? { possible_renames: result.possibleRenames } : {}),\n status_after: statusAfter,\n });\n }\n\n return {\n results,\n summary: {\n checked: results.length + anchorless,\n fresh,\n stale,\n anchorless_skipped: anchorless,\n updated,\n },\n };\n}\n\nfunction applyVerification(\n mem: Memory,\n result: { stale: boolean; reason: string | null },\n): Memory {\n const verifiedAt = new Date().toISOString();\n if (result.stale) {\n return {\n frontmatter: {\n ...mem.frontmatter,\n status: \"stale\",\n verified_at: verifiedAt,\n stale_reason: result.reason,\n },\n body: mem.body,\n };\n }\n const nextStatus =\n mem.frontmatter.status === \"stale\" || mem.frontmatter.status === \"draft\"\n ? \"validated\"\n : mem.frontmatter.status;\n return {\n frontmatter: {\n ...mem.frontmatter,\n status: nextStatus,\n verified_at: verifiedAt,\n stale_reason: null,\n },\n body: mem.body,\n };\n}\n","import { writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport {\n loadMemoriesFromDir,\n loadUsageIndex,\n recordRejection,\n saveUsageIndex,\n serializeMemory,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemRejectInputSchema = {\n id: z.string().min(1).describe(\"Memory id being rejected\"),\n reason: z\n .string()\n .optional()\n .describe(\"Why this memory is being rejected (recorded for review)\"),\n};\n\nexport type MemRejectInput = {\n [K in keyof typeof MemRejectInputSchema]: z.infer<(typeof MemRejectInputSchema)[K]>;\n};\n\nexport interface MemRejectOutput {\n id: string;\n status: string;\n rejected_count: number;\n last_rejected_at: string | null;\n rejection_reason: string | null;\n}\n\nexport async function memReject(\n input: MemRejectInput,\n ctx: HaiveContext,\n): Promise<MemRejectOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n throw new Error(`No .ai/memories at ${ctx.paths.root}.`);\n }\n\n const memories = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const loaded = memories.find((m) => m.memory.frontmatter.id === input.id);\n if (!loaded) throw new Error(`No memory with id \"${input.id}\".`);\n\n // Write rejected status and reason to disk\n await writeFile(\n loaded.filePath,\n serializeMemory({\n frontmatter: {\n ...loaded.memory.frontmatter,\n status: \"rejected\",\n stale_reason: input.reason ?? loaded.memory.frontmatter.stale_reason ?? null,\n },\n body: loaded.memory.body,\n }),\n \"utf8\",\n );\n\n const idx = await loadUsageIndex(ctx.paths);\n recordRejection(idx, input.id, input.reason ?? null);\n await saveUsageIndex(ctx.paths, idx);\n const u = idx.by_id[input.id];\n return {\n id: input.id,\n status: \"rejected\",\n rejected_count: u?.rejected_count ?? 0,\n last_rejected_at: u?.last_rejected_at ?? null,\n rejection_reason: u?.rejection_reason ?? null,\n };\n}\n","import {\n applyFeedbackAdjustment,\n computeImpact,\n getUsage,\n loadMemoriesFromDir,\n loadUsageIndex,\n recordApplied,\n recordRejection,\n recommendFeedbackAdjustment,\n saveUsageIndex,\n serializeMemory,\n type ImpactTier,\n type FeedbackAdjustment,\n} from \"@hiveai/core\";\nimport { existsSync } from \"node:fs\";\nimport { writeFile } from \"node:fs/promises\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemFeedbackInputSchema = {\n id: z.string().min(1).describe(\"Full memory id the feedback is about\"),\n outcome: z\n .enum([\"applied\", \"rejected\"])\n .describe(\n \"'applied' = this memory changed what you did (strong positive utility signal); \" +\n \"'rejected' = it was wrong/outdated/unhelpful (negative signal, blocks auto-promotion).\",\n ),\n reason: z\n .string()\n .optional()\n .describe(\"Why it was rejected (stored on the memory's usage record). Only used for outcome='rejected'.\"),\n};\n\nexport type MemFeedbackInput = {\n [K in keyof typeof MemFeedbackInputSchema]: z.infer<(typeof MemFeedbackInputSchema)[K]>;\n};\n\nexport interface MemFeedbackOutput {\n ok: boolean;\n id: string;\n outcome?: \"applied\" | \"rejected\";\n error?: string;\n usage?: {\n read_count: number;\n applied_count: number;\n rejected_count: number;\n };\n impact?: {\n score: number;\n tier: ImpactTier;\n signals: string[];\n };\n feedback_adjustment?: FeedbackAdjustment;\n}\n\n/**\n * Record a closed-loop utility outcome for a memory. This is what turns hAIve's\n * memory store from a passive index into a learning system: agents report whether\n * a surfaced memory actually steered their work, and that feeds impact scoring\n * (`haive memory impact`) and future pruning/ranking.\n */\nexport async function memFeedback(\n input: MemFeedbackInput,\n ctx: HaiveContext,\n): Promise<MemFeedbackOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n return { ok: false, id: input.id, error: \"No .ai/memories — run `haive init` first.\" };\n }\n\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const target = all.find((m) => m.memory.frontmatter.id === input.id);\n if (!target) {\n return { ok: false, id: input.id, error: `No memory with id '${input.id}'.` };\n }\n\n const index = await loadUsageIndex(ctx.paths);\n if (input.outcome === \"applied\") {\n recordApplied(index, input.id);\n } else {\n recordRejection(index, input.id, input.reason ?? null);\n }\n await saveUsageIndex(ctx.paths, index);\n\n const usage = getUsage(index, input.id);\n const adjustment = input.outcome === \"rejected\"\n ? recommendFeedbackAdjustment(target.memory.frontmatter, usage)\n : { action: \"none\" as const, reason: \"No automatic adjustment needed.\" };\n const adjustedFrontmatter = applyFeedbackAdjustment(target.memory.frontmatter, adjustment);\n if (adjustedFrontmatter !== target.memory.frontmatter) {\n target.memory.frontmatter = adjustedFrontmatter;\n await writeFile(target.filePath, serializeMemory(target.memory), \"utf8\");\n }\n const impact = computeImpact(target.memory.frontmatter, usage);\n\n return {\n ok: true,\n id: input.id,\n outcome: input.outcome,\n usage: {\n read_count: usage.read_count,\n applied_count: usage.applied_count,\n rejected_count: usage.rejected_count,\n },\n impact: { score: impact.score, tier: impact.tier, signals: impact.signals },\n feedback_adjustment: adjustment,\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 /** Anchor paths recorded in the memory frontmatter — used by pre_commit_check to scope stale warnings. */\n anchor_paths: string[];\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 // session_recap surfaces in get_briefing.last_session — skip here\n if (loaded.memory.frontmatter.type === \"session_recap\") continue;\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 // Extract meaningful path segments from input files for tag matching\n const pathSegments = extractPathSegments(input.files);\n\n for (const loaded of all) {\n if (seen.has(loaded.memory.frontmatter.id)) continue;\n if (loaded.memory.frontmatter.type === \"session_recap\") 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 fm.tags.some((t) => {\n const tl = t.toLowerCase();\n return pathSegments.has(tl) || pathSegments.has(tl.replace(/[-_]/g, \"\"));\n });\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 if (loaded.memory.frontmatter.type === \"session_recap\") 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 anchor_paths: fm.anchor.paths,\n file_path: loaded.filePath,\n body: loaded.memory.body,\n };\n}\n\n/**\n * Extract lowercase path segments from file paths that are likely domain/module names.\n * Filters out generic segments like src, main, java, com, org, test, etc.\n */\nfunction extractPathSegments(files: string[]): Set<string> {\n const GENERIC = new Set([\n \"src\", \"main\", \"java\", \"kotlin\", \"python\", \"go\", \"lib\", \"libs\",\n \"com\", \"org\", \"net\", \"io\", \"app\", \"apps\", \"pkg\", \"internal\",\n \"test\", \"tests\", \"spec\", \"specs\", \"impl\", \"domain\", \"shared\",\n \"resources\", \"static\", \"assets\", \"config\", \"configs\",\n ]);\n const out = new Set<string>();\n for (const file of files) {\n const parts = file.replace(/\\\\/g, \"/\").split(\"/\");\n for (const part of parts) {\n const seg = part.toLowerCase().replace(/\\.[^.]+$/, \"\"); // strip extension\n if (seg.length >= 3 && !GENERIC.has(seg) && /^[a-z]/.test(seg)) {\n out.add(seg);\n // Also split camelCase / kebab-case segments: mobilepayment → mobile, payment\n for (const sub of seg.split(/[-_]/).filter((s) => s.length >= 3)) {\n out.add(sub);\n }\n }\n }\n }\n return out;\n}\n\nasync function loadModuleContexts(\n ctx: HaiveContext,\n modules: string[],\n enabled: boolean,\n): Promise<Array<{ name: string; content: string }>> {\n if (!enabled || modules.length === 0) return [];\n if (!existsSync(ctx.paths.modulesContextDir)) return [];\n const available = new Set(\n (await readdir(ctx.paths.modulesContextDir, { withFileTypes: true }))\n .filter((d) => d.isDirectory())\n .map((d) => d.name),\n );\n const out: Array<{ name: string; content: string }> = [];\n for (const m of modules) {\n if (!available.has(m)) continue;\n const file = path.join(ctx.paths.modulesContextDir, m, \"context.md\");\n if (existsSync(file)) {\n out.push({ name: m, content: await readFile(file, \"utf8\") });\n }\n }\n return out;\n}\n","import { existsSync } from \"node:fs\";\nimport {\n deriveConfidence,\n getUsage,\n loadMemoriesFromDir,\n loadUsageIndex,\n type ConfidenceLevel,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemGetInputSchema = {\n id: z.string().min(1).describe(\"Memory id to fetch\"),\n};\n\nexport type MemGetInput = {\n [K in keyof typeof MemGetInputSchema]: z.infer<(typeof MemGetInputSchema)[K]>;\n};\n\nexport interface MemGetOutput {\n id: string;\n scope: string;\n type: string;\n module?: string;\n tags: string[];\n status: string;\n confidence: ConfidenceLevel;\n read_count: number;\n rejected_count: number;\n created_at: string;\n verified_at: string | null;\n stale_reason: string | null;\n anchor: { commit?: string; paths: string[]; symbols: string[] };\n body: string;\n file_path: string;\n}\n\nexport async function memGet(input: MemGetInput, ctx: HaiveContext): Promise<MemGetOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n throw new Error(`No .ai/memories at ${ctx.paths.root}.`);\n }\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const found = all.find((m) => m.memory.frontmatter.id === input.id);\n if (!found) throw new Error(`No memory with id \"${input.id}\".`);\n const fm = found.memory.frontmatter;\n const u = getUsage(await loadUsageIndex(ctx.paths), fm.id);\n return {\n id: fm.id,\n scope: fm.scope,\n type: fm.type,\n ...(fm.module ? { module: fm.module } : {}),\n tags: fm.tags,\n status: fm.status,\n confidence: deriveConfidence(fm, u),\n read_count: u.read_count,\n rejected_count: u.rejected_count,\n created_at: fm.created_at,\n verified_at: fm.verified_at,\n stale_reason: fm.stale_reason,\n anchor: {\n ...(fm.anchor.commit ? { commit: fm.anchor.commit } : {}),\n paths: fm.anchor.paths,\n symbols: fm.anchor.symbols,\n },\n body: found.memory.body,\n file_path: found.filePath,\n };\n}\n","import { existsSync } from \"node:fs\";\nimport { unlink } from \"node:fs/promises\";\nimport {\n loadMemoriesFromDir,\n loadUsageIndex,\n saveUsageIndex,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemDeleteInputSchema = {\n id: z.string().min(1).describe(\"Memory id to delete\"),\n keep_usage: z\n .boolean()\n .default(false)\n .describe(\"Keep the usage.json entry instead of removing it alongside the file\"),\n};\n\nexport type MemDeleteInput = {\n [K in keyof typeof MemDeleteInputSchema]: z.infer<(typeof MemDeleteInputSchema)[K]>;\n};\n\nexport interface MemDeleteOutput {\n id: string;\n deleted_file: string;\n usage_removed: boolean;\n}\n\nexport async function memDelete(\n input: MemDeleteInput,\n ctx: HaiveContext,\n): Promise<MemDeleteOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n throw new Error(`No .ai/memories at ${ctx.paths.root}.`);\n }\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const found = all.find((m) => m.memory.frontmatter.id === input.id);\n if (!found) throw new Error(`No memory with id \"${input.id}\".`);\n\n await unlink(found.filePath);\n\n let usageRemoved = false;\n if (!input.keep_usage) {\n const idx = await loadUsageIndex(ctx.paths);\n if (idx.by_id[input.id]) {\n delete idx.by_id[input.id];\n await saveUsageIndex(ctx.paths, idx);\n usageRemoved = true;\n }\n }\n\n return { id: input.id, deleted_file: found.filePath, usage_removed: usageRemoved };\n}\n","import { writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { loadMemoriesFromDir, serializeMemory } from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemUpdateInputSchema = {\n id: z.string().min(1).describe(\"Id of the memory to update\"),\n body: z.string().optional().describe(\"New Markdown body — replaces the existing body\"),\n tags: z\n .array(z.string())\n .optional()\n .describe(\"New tags array — fully replaces existing tags\"),\n paths: z\n .array(z.string())\n .optional()\n .describe(\"New anchor paths — fully replaces existing anchor.paths\"),\n symbols: z\n .array(z.string())\n .optional()\n .describe(\"New anchor symbols — fully replaces existing anchor.symbols\"),\n commit: z.string().optional().describe(\"New anchor commit SHA\"),\n domain: z.string().optional().describe(\"New domain label\"),\n author: z.string().optional().describe(\"New author handle or email\"),\n};\n\nexport type MemUpdateInput = {\n [K in keyof typeof MemUpdateInputSchema]: z.infer<(typeof MemUpdateInputSchema)[K]>;\n};\n\nexport interface MemUpdateOutput {\n id: string;\n file_path: string;\n updated_fields: string[];\n}\n\nexport async function memUpdate(\n input: MemUpdateInput,\n ctx: HaiveContext,\n): Promise<MemUpdateOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n throw new Error(`No .ai/memories at ${ctx.paths.root}.`);\n }\n\n const memories = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const loaded = memories.find((m) => m.memory.frontmatter.id === input.id);\n if (!loaded) throw new Error(`No memory with id \"${input.id}\".`);\n\n const { frontmatter, body } = loaded.memory;\n const updated_fields: string[] = [];\n\n const newAnchor = { ...frontmatter.anchor };\n if (input.paths !== undefined) { newAnchor.paths = input.paths; updated_fields.push(\"anchor.paths\"); }\n if (input.symbols !== undefined) { newAnchor.symbols = input.symbols; updated_fields.push(\"anchor.symbols\"); }\n if (input.commit !== undefined) { newAnchor.commit = input.commit; updated_fields.push(\"anchor.commit\"); }\n\n const newFrontmatter = {\n ...frontmatter,\n anchor: newAnchor,\n ...(input.tags !== undefined ? { tags: input.tags } : {}),\n ...(input.domain !== undefined ? { domain: input.domain } : {}),\n ...(input.author !== undefined ? { author: input.author } : {}),\n };\n\n if (input.tags !== undefined) updated_fields.push(\"tags\");\n if (input.domain !== undefined) updated_fields.push(\"domain\");\n if (input.author !== undefined) updated_fields.push(\"author\");\n\n const newBody = input.body !== undefined ? input.body : body;\n if (input.body !== undefined) updated_fields.push(\"body\");\n\n if (updated_fields.length === 0) {\n throw new Error(\"No fields to update — provide at least one of: body, tags, paths, symbols, commit, domain, author.\");\n }\n\n await writeFile(\n loaded.filePath,\n serializeMemory({ frontmatter: newFrontmatter, body: newBody }),\n \"utf8\",\n );\n\n return { id: input.id, file_path: loaded.filePath, updated_fields };\n}\n","import { existsSync } from \"node:fs\";\nimport {\n getUsage,\n loadMemoriesFromDir,\n loadUsageIndex,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemPendingInputSchema = {\n scope: z.enum([\"personal\", \"team\", \"module\"]).optional(),\n};\n\nexport type MemPendingInput = {\n [K in keyof typeof MemPendingInputSchema]: z.infer<(typeof MemPendingInputSchema)[K]>;\n};\n\nexport interface MemPendingHit {\n id: string;\n scope: string;\n type: string;\n module?: string;\n tags: string[];\n age_days: number;\n read_count: number;\n rejected_count: number;\n file_path: string;\n}\n\nexport interface MemPendingOutput {\n pending: MemPendingHit[];\n}\n\nexport async function memPending(\n input: MemPendingInput,\n ctx: HaiveContext,\n): Promise<MemPendingOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) return { pending: [] };\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const usage = await loadUsageIndex(ctx.paths);\n const now = Date.now();\n const proposed = all.filter(({ memory }) => {\n if (memory.frontmatter.status !== \"proposed\") return false;\n if (input.scope && memory.frontmatter.scope !== input.scope) return false;\n return true;\n });\n\n proposed.sort(\n (a, b) =>\n getUsage(usage, b.memory.frontmatter.id).read_count -\n getUsage(usage, a.memory.frontmatter.id).read_count,\n );\n\n return {\n pending: proposed.map(({ memory, filePath }) => {\n const fm = memory.frontmatter;\n const u = getUsage(usage, fm.id);\n return {\n id: fm.id,\n scope: fm.scope,\n type: fm.type,\n ...(fm.module ? { module: fm.module } : {}),\n tags: fm.tags,\n age_days: Math.floor((now - new Date(fm.created_at).getTime()) / 86_400_000),\n read_count: u.read_count,\n rejected_count: u.rejected_count,\n file_path: filePath,\n };\n }),\n };\n}\n","import { writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport {\n loadMemoriesFromDir,\n serializeMemory,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemApproveInputSchema = {\n id: z.string().min(1).describe(\"Memory id to approve (sets status=validated immediately)\"),\n};\n\nexport type MemApproveInput = {\n [K in keyof typeof MemApproveInputSchema]: z.infer<(typeof MemApproveInputSchema)[K]>;\n};\n\nexport interface MemApproveOutput {\n id: string;\n previous_status: string;\n status: \"validated\";\n file_path: string;\n}\n\nexport async function memApprove(\n input: MemApproveInput,\n ctx: HaiveContext,\n): Promise<MemApproveOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n throw new Error(`No .ai/memories at ${ctx.paths.root}.`);\n }\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const found = all.find((m) => m.memory.frontmatter.id === input.id);\n if (!found) throw new Error(`No memory with id \"${input.id}\".`);\n\n const previous = found.memory.frontmatter.status;\n const next = {\n frontmatter: { ...found.memory.frontmatter, status: \"validated\" as const },\n body: found.memory.body,\n };\n await writeFile(found.filePath, serializeMemory(next), \"utf8\");\n return {\n id: input.id,\n previous_status: previous,\n status: \"validated\",\n file_path: found.filePath,\n };\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport {\n buildFrontmatter,\n memoryFilePath,\n serializeMemory,\n suggestSensorFromMemory,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemTriedInputSchema = {\n what: z.string().min(1).describe(\"Brief description of the approach that was tried\"),\n why_failed: z\n .string()\n .min(1)\n .describe(\"Why it failed or why it should NOT be used\"),\n instead: z\n .string()\n .optional()\n .describe(\"What to use or do instead (recommended alternative)\"),\n scope: z\n .enum([\"personal\", \"team\", \"module\"])\n .default(\"personal\")\n .describe(\"Visibility scope\"),\n module: z.string().optional().describe(\"Module name (required when scope=module)\"),\n tags: z.array(z.string()).default([]).describe(\"Tags for filtering\"),\n paths: z\n .array(z.string())\n .default([])\n .describe(\"Anchor file paths this applies to\"),\n author: z.string().optional().describe(\"Author handle or email\"),\n};\n\nexport type MemTriedInput = {\n [K in keyof typeof MemTriedInputSchema]: z.infer<(typeof MemTriedInputSchema)[K]>;\n};\n\nexport interface MemTriedOutput {\n id: string;\n scope: string;\n file_path: string;\n /** True when a regex sensor was auto-generated → the loop can close (gate will block the repeat). */\n sensor_generated: boolean;\n /** Present only when no sensor was generated: tells the agent the loop stays OPEN and how to close it. */\n hint?: string;\n}\n\nexport async function memTried(\n input: MemTriedInput,\n ctx: HaiveContext,\n): Promise<MemTriedOutput> {\n if (!existsSync(ctx.paths.haiveDir)) {\n throw new Error(`No .ai/ directory at ${ctx.paths.root}. Run 'haive init' first.`);\n }\n\n const slug = input.what\n .toLowerCase()\n .replace(/[^a-z0-9\\s]/g, \"\")\n .trim()\n .split(/\\s+/)\n .slice(0, 5)\n .join(\"-\");\n\n const baseFm = buildFrontmatter({\n type: \"attempt\",\n slug,\n scope: input.scope,\n module: input.module,\n tags: input.tags,\n paths: input.paths,\n author: input.author,\n });\n // attempt memories are immediately validated — no review cycle needed\n const frontmatter = { ...baseFm, status: \"validated\" as const };\n\n const lines: string[] = [`# ${input.what}`, \"\"];\n lines.push(`**Why it failed / do NOT use:** ${input.why_failed}`);\n if (input.instead) {\n lines.push(\"\", `**Instead, use:** ${input.instead}`);\n }\n const body = lines.join(\"\\n\") + \"\\n\";\n const sensor = suggestSensorFromMemory(body, input.paths);\n if (sensor) {\n frontmatter.sensor = sensor;\n }\n\n const file = memoryFilePath(ctx.paths, frontmatter.scope, frontmatter.id, frontmatter.module);\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 }), \"utf8\");\n\n // Ratchet visibility: a captured lesson only CLOSES the loop (gate blocks the repeat) if it carries\n // a sensor. suggestSensorFromMemory returns null when no anchor `paths` were given, or no distinctive\n // token was found. Surface that explicitly so the agent knows the lesson is advisory-only, not enforced.\n const sensorGenerated = Boolean(sensor);\n const hint = sensorGenerated\n ? undefined\n : input.paths.length === 0\n ? \"No sensor was generated (no `paths` given), so this lesson is feedforward-only — it will be briefed but the gate cannot block the repeat. Re-run with `paths` set to the file(s) where the mistake lives to close the loop.\"\n : \"No sensor could be derived from the wording (no distinctive code token). The lesson is briefed but not enforced; add a concrete forbidden token/value, or attach a sensor manually, to make the gate block the repeat.\";\n\n return {\n id: frontmatter.id,\n scope: frontmatter.scope,\n file_path: file,\n sensor_generated: sensorGenerated,\n ...(hint ? { hint } : {}),\n };\n}\n","import { existsSync } from \"node:fs\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport {\n draftsFromFindings,\n filterNewDrafts,\n loadMemoriesFromDir,\n memoryFilePath,\n parseFindings,\n serializeMemory,\n type FindingSeverity,\n type MemoryDraft,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const IngestFindingsInputSchema = {\n format: z.enum([\"sarif\", \"sonar\"]).describe(\"Report format: 'sarif' (ESLint/Semgrep/CodeQL) or 'sonar' (SonarQube issues JSON)\"),\n report_path: z\n .string()\n .optional()\n .describe(\"Project-relative path to the findings JSON file. Provide this OR `report`.\"),\n report: z\n .string()\n .optional()\n .describe(\"Inline findings JSON content. Provide this OR `report_path`.\"),\n type: z\n .enum([\"gotcha\", \"convention\"])\n .default(\"gotcha\")\n .describe(\"Memory type for the created drafts\"),\n scope: z\n .enum([\"personal\", \"team\", \"module\"])\n .default(\"team\")\n .describe(\"Visibility scope for the created memories\"),\n module: z.string().optional().describe(\"Module name (required when scope=module)\"),\n min_severity: z\n .enum([\"info\", \"minor\", \"major\", \"critical\", \"blocker\"])\n .optional()\n .describe(\"Ignore findings below this severity\"),\n limit: z.number().int().positive().optional().describe(\"Cap the number of memories created\"),\n author: z.string().optional().describe(\"Author handle or email\"),\n dry_run: z\n .boolean()\n .default(false)\n .describe(\"When true, return the drafts that WOULD be created without writing them\"),\n};\n\nexport type IngestFindingsInput = {\n [K in keyof typeof IngestFindingsInputSchema]: z.infer<(typeof IngestFindingsInputSchema)[K]>;\n};\n\nexport interface IngestFindingsOutput {\n format: string;\n parsed: number;\n new: number;\n skipped_existing: number;\n dry_run: boolean;\n created: Array<{\n id: string;\n topic: string;\n path: string;\n rule: string;\n severity: FindingSeverity;\n has_sensor: boolean;\n file_path?: string;\n }>;\n notice: string;\n}\n\nexport async function ingestFindings(\n input: IngestFindingsInput,\n ctx: HaiveContext,\n): Promise<IngestFindingsOutput> {\n if (!existsSync(ctx.paths.haiveDir)) {\n throw new Error(`No .ai/ directory at ${ctx.paths.root}. Run 'haive init' first.`);\n }\n\n let raw: string;\n if (input.report && input.report.trim()) {\n raw = input.report;\n } else if (input.report_path) {\n const file = path.resolve(ctx.paths.root, input.report_path);\n if (!existsSync(file)) throw new Error(`Report file not found: ${file}`);\n raw = await readFile(file, \"utf8\");\n } else {\n throw new Error(\"Provide either `report_path` or `report`.\");\n }\n\n const findings = parseFindings(input.format, raw);\n const drafts = draftsFromFindings(findings, {\n type: input.type,\n scope: input.scope,\n module: input.module,\n author: input.author,\n ...(input.min_severity ? { minSeverity: input.min_severity } : {}),\n ...(input.limit ? { limit: input.limit } : {}),\n });\n\n const existing = existsSync(ctx.paths.memoriesDir)\n ? await loadMemoriesFromDir(ctx.paths.memoriesDir)\n : [];\n const existingTopics = new Set(\n existing.map(({ memory }) => memory.frontmatter.topic).filter((t): t is string => Boolean(t)),\n );\n const fresh = filterNewDrafts(drafts, existingTopics);\n const skipped = drafts.length - fresh.length;\n\n const created: IngestFindingsOutput[\"created\"] = [];\n for (const draft of fresh) {\n let filePath: string | undefined;\n if (!input.dry_run) filePath = await writeDraft(ctx, draft);\n created.push({\n id: draft.frontmatter.id,\n topic: draft.topic,\n path: draft.finding.path,\n rule: draft.finding.ruleId,\n severity: draft.finding.severity,\n has_sensor: draft.has_sensor,\n ...(filePath ? { file_path: filePath } : {}),\n });\n }\n\n const notice = input.dry_run\n ? `Dry run — ${fresh.length} memory(ies) would be created (status=proposed). Re-run with dry_run=false to write them.`\n : `Created ${fresh.length} proposed memory(ies). They are NOT validated and their sensors are warn-only — review with mem_pending and promote with 'haive sensors promote'.`;\n\n return {\n format: input.format,\n parsed: drafts.length,\n new: fresh.length,\n skipped_existing: skipped,\n dry_run: input.dry_run,\n created,\n notice,\n };\n}\n\nasync function writeDraft(ctx: HaiveContext, draft: MemoryDraft): Promise<string> {\n const file = memoryFilePath(\n ctx.paths,\n draft.frontmatter.scope,\n draft.frontmatter.id,\n draft.frontmatter.module,\n );\n await mkdir(path.dirname(file), { recursive: true });\n await writeFile(file, serializeMemory({ frontmatter: draft.frontmatter, body: draft.body }), \"utf8\");\n return file;\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport {\n buildFrontmatter,\n isLikelyGuessable,\n memoryFilePath,\n serializeMemory,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\n/**\n * mem_observe — capture a code-level discovery made during exploration.\n *\n * Unlike mem_tried (failed approaches) or mem_save (conventions/decisions),\n * mem_observe is for bugs, inconsistencies, and security gaps discovered by\n * reading existing code that were NOT in the briefing. Auto-validated (no review).\n */\nexport const MemObserveInputSchema = {\n what: z\n .string()\n .min(1)\n .describe(\"Short title: what did you observe? (e.g. 'MobilePaymentController has two @RequestBody on handleWebhook')\"),\n where: z\n .string()\n .min(1)\n .describe(\"File path(s) where the issue lives — be specific\"),\n impact: z\n .string()\n .min(1)\n .describe(\"What breaks or could break because of this (e.g. 'Spring MVC rejects the handler at startup')\"),\n fix: z\n .string()\n .optional()\n .describe(\"Suggested fix or workaround (optional — leave empty if unknown)\"),\n scope: z\n .enum([\"personal\", \"team\", \"module\"])\n .default(\"team\")\n .describe(\"Visibility scope — defaults to team since discoveries benefit everyone\"),\n module: z.string().optional().describe(\"Module name (required when scope=module)\"),\n tags: z.array(z.string()).default([]).describe(\"Tags for filtering\"),\n author: z.string().optional().describe(\"Author handle or email\"),\n force: z\n .boolean()\n .default(false)\n .describe(\n \"Save even if the observation looks like generic, guessable knowledge. By default, \" +\n \"low-specificity observations (things a capable model already knows) are SKIPPED to keep \" +\n \"the corpus high-signal — only unguessable, team-specific discoveries are worth storing.\",\n ),\n};\n\nexport type MemObserveInput = {\n [K in keyof typeof MemObserveInputSchema]: z.infer<(typeof MemObserveInputSchema)[K]>;\n};\n\nexport interface MemObserveOutput {\n id: string;\n scope: string;\n file_path: string;\n /** True when the observation was NOT saved because it looked generic/guessable. */\n skipped?: boolean;\n reason?: string;\n}\n\nexport async function memObserve(\n input: MemObserveInput,\n ctx: HaiveContext,\n): Promise<MemObserveOutput> {\n if (!existsSync(ctx.paths.haiveDir)) {\n throw new Error(`No .ai/ directory at ${ctx.paths.root}. Run 'haive init' first.`);\n }\n\n // Capture filter: hAIve only earns its keep on UNGUESSABLE, team-specific knowledge.\n // Skip generic observations a capable model already makes by default — they only add noise\n // and token cost to future briefings. The caller can override with force=true.\n const signalText = [input.what, input.impact, input.fix ?? \"\"].join(\" \");\n if (!input.force && isLikelyGuessable(signalText)) {\n return {\n id: \"\",\n scope: input.scope,\n file_path: \"\",\n skipped: true,\n reason:\n \"Observation looks like generic, guessable knowledge (low specificity) — not saved. \" +\n \"Capture only arbitrary, team-specific facts (exact names, values, formats). Pass force=true to override.\",\n };\n }\n\n const slug = input.what\n .toLowerCase()\n .replace(/[^a-z0-9\\s]/g, \"\")\n .trim()\n .split(/\\s+/)\n .slice(0, 6)\n .join(\"-\");\n\n // Parse where into anchor paths (comma-separated or single path)\n const anchorPaths = input.where\n .split(/[,\\n]/)\n .map((s) => s.trim())\n .filter(Boolean);\n\n const baseFm = buildFrontmatter({\n type: \"gotcha\",\n slug,\n scope: input.scope,\n module: input.module,\n tags: input.tags,\n paths: anchorPaths,\n author: input.author,\n });\n // Observations are immediately validated — no review cycle needed\n const frontmatter = { ...baseFm, status: \"validated\" as const };\n\n const lines: string[] = [`# ${input.what}`, \"\"];\n lines.push(`**Where:** \\`${input.where}\\``);\n lines.push(\"\", `**Impact:** ${input.impact}`);\n if (input.fix) {\n lines.push(\"\", `**Fix/workaround:** ${input.fix}`);\n }\n const body = lines.join(\"\\n\") + \"\\n\";\n\n const file = memoryFilePath(ctx.paths, frontmatter.scope, frontmatter.id, frontmatter.module);\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 }), \"utf8\");\n\n return { id: frontmatter.id, scope: frontmatter.scope, file_path: file };\n}\n","/**\n * mem_session_end — save a structured end-of-session recap.\n *\n * Engram-inspired: explicit session lifecycle lets the next session start with\n * rich context about what was just done, which files were touched, and what\n * remains. Uses topic-upsert so there is always exactly ONE \"current recap\"\n * per scope/module: revisions accumulate in-place rather than creating clutter.\n */\nimport { writeFile, mkdir } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport {\n buildFrontmatter,\n loadMemoriesFromDir,\n memoryFilePath,\n serializeMemory,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\nimport { clearPendingDistill } from \"../session-tracker.js\";\n\nexport const MemSessionEndInputSchema = {\n goal: z\n .string()\n .min(1)\n .describe(\"What you were trying to accomplish this session (1–2 sentences)\"),\n accomplished: z\n .string()\n .describe(\"What was actually done — bullet list recommended\"),\n discoveries: z\n .string()\n .default(\"\")\n .describe(\n \"Any bugs, inconsistencies, surprises, or missing knowledge found during this session. \" +\n \"Empty if nothing surprising was found.\",\n ),\n files_touched: z\n .array(z.string())\n .default([])\n .describe(\"Key files that were read or modified — used as anchor paths\"),\n next_steps: z\n .string()\n .default(\"\")\n .describe(\"What should happen next (for the next session or a teammate)\"),\n scope: z\n .enum([\"personal\", \"team\", \"module\"])\n .default(\"personal\")\n .describe(\"Visibility: personal = private to you, team = shared with the team\"),\n module: z\n .string()\n .optional()\n .describe(\"Module name (required when scope=module)\"),\n};\n\nexport type MemSessionEndInput = {\n [K in keyof typeof MemSessionEndInputSchema]: z.infer<(typeof MemSessionEndInputSchema)[K]>;\n};\n\nexport interface MemSessionEndOutput {\n id: string;\n scope: string;\n file_path: string;\n action: \"created\" | \"updated\";\n revision_count: number;\n}\n\n/** Stable topic key for upsert — one recap per scope/module. */\nfunction recapTopic(scope: string, module?: string): string {\n return module ? `session-recap-${scope}-${module}` : `session-recap-${scope}`;\n}\n\nfunction buildBody(input: MemSessionEndInput): string {\n const lines: string[] = [];\n\n lines.push(`## Goal\\n${input.goal}`);\n lines.push(`\\n## Accomplished\\n${input.accomplished}`);\n\n if (input.discoveries.trim()) {\n lines.push(`\\n## Discoveries & surprises\\n${input.discoveries}`);\n }\n\n if (input.files_touched.length > 0) {\n lines.push(`\\n## Files touched\\n${input.files_touched.map((f) => `- \\`${f}\\``).join(\"\\n\")}`);\n }\n\n if (input.next_steps.trim()) {\n lines.push(`\\n## Next steps\\n${input.next_steps}`);\n }\n\n return lines.join(\"\\n\");\n}\n\nexport async function memSessionEnd(\n input: MemSessionEndInput,\n ctx: HaiveContext,\n): Promise<MemSessionEndOutput> {\n if (!existsSync(ctx.paths.haiveDir)) {\n throw new Error(`No .ai/ directory at ${ctx.paths.root}. Run 'haive init' first.`);\n }\n\n const body = buildBody(input);\n const topic = recapTopic(input.scope, input.module);\n\n // Normalize to project-relative paths (guards against absolute paths from agents)\n const normalizedFiles = input.files_touched.map((p) => {\n if (!p || !path.isAbsolute(p)) return p;\n const rel = path.relative(ctx.paths.root, p);\n return rel.startsWith(\"..\") ? p : rel;\n });\n\n // Validate anchor paths exist before saving\n const invalidPaths = normalizedFiles.filter(\n (p) => !existsSync(path.resolve(ctx.paths.root, p)),\n );\n if (invalidPaths.length > 0) {\n // Non-blocking for session end — just log in the output\n console.warn(`[haive] session end: anchor path(s) not found: ${invalidPaths.join(\", \")}`);\n }\n\n const existing = existsSync(ctx.paths.memoriesDir)\n ? await loadMemoriesFromDir(ctx.paths.memoriesDir)\n : [];\n\n // ── Topic upsert: update existing recap in-place ───────────────────────\n const topicMatch = existing.find(({ memory }) =>\n memory.frontmatter.topic === topic &&\n memory.frontmatter.scope === input.scope &&\n (!input.module || memory.frontmatter.module === input.module),\n );\n\n if (topicMatch) {\n const fm = topicMatch.memory.frontmatter;\n const revisionCount = (fm.revision_count ?? 0) + 1;\n const newFrontmatter = {\n ...fm,\n verified_at: new Date().toISOString(),\n revision_count: revisionCount,\n anchor: {\n ...fm.anchor,\n paths: normalizedFiles.length ? normalizedFiles : fm.anchor.paths,\n },\n };\n await writeFile(\n topicMatch.filePath,\n serializeMemory({ frontmatter: newFrontmatter, body }),\n \"utf8\",\n );\n // Clear pending distill — a manual post_task flow completed successfully.\n await clearPendingDistill(ctx);\n return {\n id: fm.id,\n scope: fm.scope,\n file_path: topicMatch.filePath,\n action: \"updated\",\n revision_count: revisionCount,\n };\n }\n\n // ── Create new recap (first session) ──────────────────────────────────\n const frontmatter = buildFrontmatter({\n type: \"session_recap\",\n slug: \"recap\",\n scope: input.scope,\n module: input.module,\n tags: [\"session\", \"recap\"],\n paths: normalizedFiles,\n topic,\n status: \"validated\",\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 await writeFile(file, serializeMemory({ frontmatter, body }), \"utf8\");\n\n // A successful manual mem_session_end (post_task flow) means the distillation\n // has been done properly — clear the shallow auto-recap marker so the next\n // get_briefing doesn't ask again.\n await clearPendingDistill(ctx);\n\n return {\n id: frontmatter.id,\n scope: frontmatter.scope,\n file_path: file,\n action: \"created\",\n revision_count: 0,\n };\n}\n","/**\n * Auto-session tracker for autopilot mode.\n *\n * Tracks which MCP tools were called during a server session.\n * On SIGTERM/SIGINT (i.e. when the AI client closes), automatically:\n * 1. Saves a session recap via mem_session_end (always)\n * 2. Writes .ai/.cache/pending-distill.json so the next get_briefing\n * surfaces an action_required item prompting the agent to invoke\n * post_task for a richer LLM-driven distillation.\n */\nimport {\n appendUsageEvent,\n appendRuntimeJournalEntry,\n loadConfig,\n type HaiveConfig,\n} from \"@hiveai/core\";\nimport { mkdir, writeFile, rm } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { execSync } from \"node:child_process\";\nimport type { HaiveContext } from \"./context.js\";\nimport { memSessionEnd } from \"./tools/mem-session-end.js\";\n\nexport interface SessionEvent {\n tool: string;\n at: string; // ISO timestamp\n /** Partial input snapshot (non-sensitive fields only) */\n summary?: string;\n}\n\n/** Written to .ai/.cache/pending-distill.json at session end. */\nexport interface PendingDistill {\n session_start: string;\n session_end: string;\n total_tool_calls: number;\n /** Human-readable summary of which tools were called (\"get_briefing ×3, mem_save ×2\") */\n tool_summary: string;\n /** IDs of memories saved during this session */\n memories_saved: string[];\n /** True when git diff was captured and stored in git_diff field */\n git_diff_available: boolean;\n /** Snapshot of `git diff HEAD` at session close (truncated to 8 KB) */\n git_diff?: string;\n /** ID of the auto-generated session recap memory */\n recap_id?: string;\n}\n\n/** Path to the pending distill marker file. */\nexport function pendingDistillPath(ctx: HaiveContext): string {\n return path.join(ctx.paths.haiveDir, \".cache\", \"pending-distill.json\");\n}\n\nexport class SessionTracker {\n private events: SessionEvent[] = [];\n private startedAt: string = new Date().toISOString();\n private config: HaiveConfig | null = null;\n private ctx: HaiveContext;\n private shutdownRegistered = false;\n\n constructor(ctx: HaiveContext) {\n this.ctx = ctx;\n }\n\n async init(): Promise<void> {\n this.config = await loadConfig(this.ctx.paths);\n if (this.config.autoSessionEnd) {\n this.registerShutdownHandler();\n }\n }\n\n record(tool: string, summary?: string): void {\n const event: SessionEvent = { tool, at: new Date().toISOString(), summary };\n this.events.push(event);\n // Persist to .ai/.usage/tool-usage.jsonl for cross-session stats (haive stats).\n // Best-effort: never blocks the tool execution, never throws.\n void appendUsageEvent(this.ctx.paths, event);\n }\n\n private registerShutdownHandler(): void {\n if (this.shutdownRegistered) return;\n this.shutdownRegistered = true;\n\n const save = async (): Promise<void> => {\n const writingTools = this.events.filter((e) =>\n [\"mem_save\", \"mem_tried\", \"mem_observe\", \"mem_update\", \"bootstrap_project_save\"].includes(e.tool),\n );\n const totalCalls = this.events.length;\n\n if (totalCalls === 0) return;\n\n const toolSummary = summarizeTools(this.events);\n const filesSet = new Set<string>();\n for (const e of this.events) {\n if (e.summary) {\n const matches = e.summary.match(/[^\\s\"',]+\\.[a-zA-Z]{1,6}/g) ?? [];\n for (const m of matches) filesSet.add(m);\n }\n }\n\n // ── 1. Capture git diff (best-effort, 8 KB cap) ──────────────────────\n let gitDiff: string | undefined;\n try {\n const raw = execSync(\"git diff HEAD\", {\n cwd: this.ctx.paths.root,\n timeout: 5000,\n encoding: \"utf8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n });\n gitDiff = raw.slice(0, 8192) || undefined;\n } catch { /* not a git repo or no diff — ok */ }\n\n // ── 2. Save minimal session recap ────────────────────────────────────\n let recapId: string | undefined;\n try {\n const result = await memSessionEnd(\n {\n goal: `Auto-captured session (${totalCalls} tool call${totalCalls === 1 ? \"\" : \"s\"})`,\n accomplished: toolSummary,\n discoveries: writingTools.length > 0\n ? `${writingTools.length} memor${writingTools.length === 1 ? \"y\" : \"ies\"} saved during this session.`\n : \"No new memories saved this session.\",\n files_touched: [...filesSet].slice(0, 10),\n next_steps: \"\",\n scope: (this.config?.defaultScope as \"personal\" | \"team\") ?? \"personal\",\n module: undefined,\n },\n this.ctx,\n );\n recapId = result.id;\n } catch {\n // Non-fatal — never block process exit\n }\n\n void appendRuntimeJournalEntry(this.ctx.paths, {\n kind: \"session_end\",\n message: recapId\n ? `auto session close | ${toolSummary} | recap:${recapId}`\n : `auto session close | ${toolSummary}`,\n meta: {\n recap_id: recapId ?? null,\n total_tool_calls: totalCalls,\n },\n });\n\n // ── 3. Write pending-distill.json so next get_briefing can prompt ─────\n // Skip if the agent already ran post_task this session (no shallow recap).\n // Also skip trivial sessions (1-2 tool calls with no writes) — they don't\n // contain distillation candidates and the action_required would just be noise.\n const ranPostTask = this.events.some((e) =>\n e.tool === \"mem_session_end\" && !e.summary?.startsWith(\"Auto-captured\"),\n );\n const isSubstantialSession = totalCalls >= 3 || writingTools.length > 0;\n if (!ranPostTask && isSubstantialSession && existsSync(this.ctx.paths.haiveDir)) {\n try {\n const memoriesSaved = writingTools\n .map((e) => e.summary ?? \"\")\n .filter(Boolean)\n .slice(0, 20);\n\n const payload: PendingDistill = {\n session_start: this.startedAt,\n session_end: new Date().toISOString(),\n total_tool_calls: totalCalls,\n tool_summary: toolSummary,\n memories_saved: memoriesSaved,\n git_diff_available: !!gitDiff,\n ...(gitDiff ? { git_diff: gitDiff } : {}),\n ...(recapId ? { recap_id: recapId } : {}),\n };\n\n const cacheDir = path.join(this.ctx.paths.haiveDir, \".cache\");\n await mkdir(cacheDir, { recursive: true });\n await writeFile(\n pendingDistillPath(this.ctx),\n JSON.stringify(payload, null, 2) + \"\\n\",\n \"utf8\",\n );\n } catch { /* Non-fatal */ }\n }\n };\n\n process.once(\"SIGTERM\", () => { void save().finally(() => process.exit(0)); });\n process.once(\"SIGINT\", () => { void save().finally(() => process.exit(0)); });\n }\n}\n\n/** Delete the pending distill marker if it exists. Called by mem_session_end. */\nexport async function clearPendingDistill(ctx: HaiveContext): Promise<void> {\n const p = pendingDistillPath(ctx);\n if (existsSync(p)) {\n try { await rm(p); } catch { /* non-fatal */ }\n }\n}\n\nfunction summarizeTools(events: SessionEvent[]): string {\n const counts = new Map<string, number>();\n for (const e of events) {\n counts.set(e.tool, (counts.get(e.tool) ?? 0) + 1);\n }\n return [...counts.entries()]\n .sort((a, b) => b[1] - a[1])\n .map(([t, n]) => `${t} ×${n}`)\n .join(\", \");\n}\n","import { readFile, writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport {\n allocateBudget,\n briefingProofLine,\n computeImpact,\n DEFAULT_AUTO_PROMOTE_RULE,\n deriveConfidence,\n estimateTokens,\n evaluateSkillActivation,\n compactAutoRecapBody,\n extractActionsBriefBody,\n getUsage,\n inferModulesFromPaths,\n isAutoPromoteEligible,\n isDecaying,\n isRetiredMemory,\n literalMatchesAllTokens,\n literalMatchesAnyToken,\n loadCodeMap,\n loadConfig,\n hashProjectContext,\n loadMemoriesFromDir,\n loadPreventionEvents,\n loadUsageIndex,\n memoryMatchesAnchorPaths,\n projectContextRecentlyEmitted,\n rankMemoriesLexical,\n recordProjectContextEmission,\n queryCodeMap,\n resolveBriefingBudget,\n serializeMemory,\n specificityScore,\n GUESSABLE_THRESHOLD,\n tokenizeQuery,\n trackReads,\n truncateToTokens,\n writeBriefingMarker,\n type LoadedMemory,\n type UsageIndex,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\nimport { pendingDistillPath, type PendingDistill } from \"../session-tracker.js\";\nimport type {\n ActionRequiredItem,\n BriefingMemory,\n BriefingOutput,\n} from \"./briefing-types.js\";\nimport {\n classifyBriefingQuality,\n classifyMemoryPriority,\n compactSummary,\n explainWhySurfaced,\n loadModuleContexts,\n priorityRank,\n trySemanticHits,\n} from \"./briefing-helpers.js\";\n\n// Re-export types so existing importers (server.ts, mem-relevant-to.ts) don't need to change.\nexport type {\n ActionRequiredItem,\n BriefingMemory,\n BriefingMemoryPriority,\n BriefingOutput,\n BriefingQuality,\n CodeMapSymbolHit,\n} from \"./briefing-types.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 dedupe_project_context: z\n .boolean()\n .optional()\n .describe(\n \"Token saver (default ON): skip re-emitting the project-context body if an identical copy was \" +\n \"already sent within the last few minutes this session (the agent still has it). Set false to always include it.\",\n ),\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 include_stale: z\n .boolean()\n .default(false)\n .describe(\"Include stale memories (excluded by default — they may be outdated)\"),\n track: z.boolean().default(true).describe(\"Increment read_count on returned memories\"),\n format: z\n .enum([\"full\", \"compact\", \"actions\"])\n .default(\"full\")\n .describe(\n \"Output format: 'full' returns memory bodies (honors token budget via truncation); \" +\n \"'compact' returns a 1-line summary per memory (call mem_get for detail); \" +\n \"'actions' squeezes bodies to actionable bullet lines — fewer tokens vs full.\",\n ),\n symbols: z\n .array(z.string())\n .default([])\n .describe(\n \"Symbol names to look up in the code-map (e.g. ['PaymentService', 'TenantFilter']). \" +\n \"Returns the file(s) exporting each symbol so agents don't need to grep. \" +\n \"Requires `haive index code` to have been run.\",\n ),\n min_semantic_score: z\n .number()\n .min(0)\n .max(1)\n .default(0)\n .describe(\n \"Drop semantic-only memory hits whose cosine score is below this threshold. \" +\n \"Useful to avoid weakly-related noise when the task is short or the corpus is broad. \" +\n \"Has no effect on memories matched via anchor/module/literal — those are always kept. \" +\n \"Try 0.25–0.4 for stricter matching.\",\n ),\n budget_preset: z\n .enum([\"quick\", \"balanced\", \"deep\"])\n .optional()\n .describe(\n \"Shortcut token budget: 'quick' minimizes tokens/skip module CONTEXT slices; 'balanced' mirrors historical defaults; \" +\n \"'deep' uses a larger briefing. When set, overrides max_tokens, max_memories, and include_module_contexts.\",\n ),\n};\n\nexport const GetBriefingZod = z.object(GetBriefingInputSchema);\nexport type GetBriefingInput = z.infer<typeof GetBriefingZod>;\n\nexport async function getBriefing(\n input: GetBriefingInput,\n ctx: HaiveContext,\n): Promise<BriefingOutput> {\n const resolvedBudget = resolveBriefingBudget(input.budget_preset, {\n max_tokens: input.max_tokens,\n max_memories: input.max_memories,\n include_module_contexts: input.include_module_contexts,\n });\n const briefingMaxTokens = resolvedBudget.max_tokens;\n const briefingMaxMemories = resolvedBudget.max_memories;\n const briefingIncludeModules = resolvedBudget.include_module_contexts;\n\n const inferred = inferModulesFromPaths(input.files);\n const memories: BriefingMemory[] = [];\n let searchMode: BriefingOutput[\"search_mode\"] = \"literal\";\n let usage: UsageIndex = { version: 1, updated_at: \"\", by_id: {} };\n let byId = new Map<string, LoadedMemory>();\n\n // ── Session recap ──────────────────────────────────────────────────────\n let lastSession: BriefingOutput[\"last_session\"] | undefined;\n\n if (existsSync(ctx.paths.memoriesDir)) {\n const allLoaded = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n\n const recaps = allLoaded\n .filter(({ memory }) => memory.frontmatter.type === \"session_recap\")\n .sort((a, b) =>\n new Date(b.memory.frontmatter.created_at).getTime() -\n new Date(a.memory.frontmatter.created_at).getTime(),\n );\n if (recaps.length > 0) {\n const r = recaps[0]!;\n const fm = r.memory.frontmatter;\n lastSession = {\n id: fm.id,\n scope: fm.scope,\n revision_count: fm.revision_count ?? 0,\n // Auto-generated recaps are low-signal tool dumps — compact them so they inform without\n // dominating the briefing head. Human/post_task recaps pass through unchanged.\n body: compactAutoRecapBody(r.memory.body),\n };\n }\n\n const allMemories = allLoaded.filter(({ memory }) => {\n const s = memory.frontmatter.status;\n if (s === \"rejected\" || s === \"deprecated\") return false;\n if (!input.include_stale && s === \"stale\") return false;\n if (!input.include_stale && isRetiredMemory(memory.frontmatter, memory.body)) return false;\n if (memory.frontmatter.type === \"session_recap\") return false;\n return true;\n });\n usage = await loadUsageIndex(ctx.paths);\n\n // byId MUST be populated before the semanticHits loop that uses it.\n // (gotcha: 2026-05-02-gotcha-getbriefing-semantic-hits-silently-dropped-byid)\n byId = new Map(allMemories.map((m) => [m.memory.frontmatter.id, m]));\n\n const semanticHits = input.task && input.semantic\n ? await trySemanticHits(ctx, input.task, allMemories.length * 2)\n : null;\n\n if (input.task && input.semantic) {\n searchMode = semanticHits ? \"semantic\" : \"literal_fallback\";\n }\n\n const seen = new Map<string, BriefingMemory>();\n\n const addOrUpdate = (\n loaded: LoadedMemory,\n reason: BriefingMemory[\"reasons\"][number],\n score?: number,\n matchQuality?: BriefingMemory[\"match_quality\"],\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 if (matchQuality === \"exact\" && existing.match_quality !== \"exact\") {\n existing.match_quality = \"exact\";\n } else if (matchQuality === \"semantic\" && existing.match_quality === \"partial\") {\n existing.match_quality = \"semantic\";\n }\n return;\n }\n const u = getUsage(usage, fm.id);\n const imp = computeImpact(fm, u);\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 ...(fm.status === \"draft\" || fm.status === \"proposed\" ? { unverified: true as const } : {}),\n read_count: u.read_count,\n impact_score: imp.score,\n impact_tier: imp.tier,\n reasons: [reason],\n match_quality: matchQuality ?? \"partial\",\n ...(score !== undefined ? { semantic_score: score } : {}),\n priority: \"background\",\n body: loaded.memory.body,\n file_path: loaded.filePath,\n });\n };\n\n // ── Matching passes ────────────────────────────────────────────────────\n if (input.files.length > 0) {\n for (const loaded of allMemories) {\n if (memoryMatchesAnchorPaths(loaded.memory, input.files)) addOrUpdate(loaded, \"anchor\", undefined, \"exact\");\n }\n for (const loaded of allMemories) {\n const fm = loaded.memory.frontmatter;\n if (fm.module && inferred.includes(fm.module)) addOrUpdate(loaded, \"module\", undefined, \"partial\");\n if (fm.domain && inferred.includes(fm.domain)) addOrUpdate(loaded, \"domain\", undefined, \"partial\");\n if (fm.tags.some((t) => inferred.includes(t))) addOrUpdate(loaded, \"module\", undefined, \"partial\");\n }\n }\n\n if (input.symbols.length > 0) {\n const wanted = new Set(input.symbols.map((s) => s.toLowerCase()));\n for (const loaded of allMemories) {\n const symbols = loaded.memory.frontmatter.anchor.symbols.map((s) => s.toLowerCase());\n if (symbols.some((s) => wanted.has(s))) addOrUpdate(loaded, \"symbol\", undefined, \"exact\");\n }\n }\n\n if (input.task) {\n const tokens = tokenizeQuery(input.task);\n const andHits = allMemories.filter((m) => literalMatchesAllTokens(m.memory, tokens));\n for (const loaded of andHits) addOrUpdate(loaded, \"semantic\", undefined, \"exact\");\n if (andHits.length === 0 && tokens.length > 1) {\n for (const loaded of allMemories) {\n if (literalMatchesAnyToken(loaded.memory, tokens)) addOrUpdate(loaded, \"semantic\", undefined, \"partial\");\n }\n }\n if (semanticHits) {\n for (const hit of semanticHits) {\n if (hit.score < input.min_semantic_score && !seen.has(hit.id)) continue;\n const loaded = byId.get(hit.id);\n if (loaded) addOrUpdate(loaded, \"semantic\", hit.score, \"semantic\");\n }\n }\n }\n\n // ── Progressive disclosure for skills ────────────────────────────────────\n // A skill that declares `activation` triggers is disclosed only when the task or\n // edited files match; an activated skill earns a ranking boost (it's a playbook\n // to follow now). Skills without an activation block keep legacy behavior.\n const activatedSkills = new Set<string>();\n for (const [id, m] of seen) {\n if (m.type !== \"skill\") continue;\n const loaded = byId.get(id);\n if (!loaded) continue;\n const act = evaluateSkillActivation(loaded.memory.frontmatter, {\n task: input.task,\n files: input.files,\n });\n if (act.applicable && !act.activated) {\n seen.delete(id);\n continue;\n }\n if (act.applicable && act.activated) activatedSkills.add(id);\n }\n\n // ── Lexical relevance (BM25) ─────────────────────────────────────────────\n // Semantic cosine alone (0..1) is too weak to overcome the type/confidence/impact\n // bonuses, so popular high-read attempt memories dominated EVERY task — the actually\n // relevant memory got buried. A BM25 score over the candidate set rewards overlap on\n // the query's *distinctive* terms (high IDF), pulling the on-topic memory up. It does\n // not touch anchored ranking: anchor/symbol hits stay must_read (priority * 100).\n const lexNorm = new Map<string, number>();\n if (input.task) {\n const candidates = [...seen.keys()]\n .map((id) => byId.get(id))\n .filter((x): x is LoadedMemory => Boolean(x));\n const lex = rankMemoriesLexical(candidates, input.task, candidates.length);\n const maxScore = lex.scores.reduce((m, s) => (s > m ? s : m), 0);\n if (maxScore > 0) {\n lex.ranked.forEach((loaded, i) => {\n lexNorm.set(loaded.memory.frontmatter.id, (lex.scores[i] ?? 0) / maxScore);\n });\n }\n }\n\n // ── Ranking ────────────────────────────────────────────────────────────\n const ranked = [...seen.values()].sort((a, b) => {\n const reasonScore = (m: BriefingMemory): number =>\n (m.type === \"attempt\" ? 3 : 0) +\n (m.reasons.includes(\"anchor\") ? 4 : 0) +\n (m.reasons.includes(\"symbol\") ? 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 // Demonstrated-utility nudge (0..3): a memory that agents actually applied — or\n // whose sensor caught a regression — edges out an equally-relevant one that\n // never proved useful. Small on purpose: never overrides anchor/symbol relevance.\n const impactScore = (m: BriefingMemory): number => (m.impact_score ?? 0) * 3;\n // An explicitly-activated skill is an actionable playbook for this exact task — surface it high.\n const activationBoost = (m: BriefingMemory): number => (activatedSkills.has(m.id) ? 5 : 0);\n // Lexical relevance weight (0..12): strong enough to lift the on-topic memory above a\n // popular-but-unrelated attempt (whose type+confidence head start is ~7), yet far below\n // the priority tier (×100) so anchored/symbol matches are never displaced.\n const lexScore = (m: BriefingMemory): number => 12 * (lexNorm.get(m.id) ?? 0);\n const sa = priorityRank(classifyMemoryPriority(a, byId.get(a.id), input.files, input.symbols)) * 100\n + reasonScore(a) + confidenceScore(a) + impactScore(a) + activationBoost(a) + lexScore(a) + (a.semantic_score ?? 0);\n const sb = priorityRank(classifyMemoryPriority(b, byId.get(b.id), input.files, input.symbols)) * 100\n + reasonScore(b) + confidenceScore(b) + impactScore(b) + activationBoost(b) + lexScore(b) + (b.semantic_score ?? 0);\n return sb - sa;\n });\n\n // Expand related_ids from top results\n for (const mem of ranked.slice(0, briefingMaxMemories)) {\n if (seen.size >= briefingMaxMemories * 2) break;\n const loaded = byId.get(mem.id);\n if (!loaded) continue;\n for (const relId of loaded.memory.frontmatter.related_ids ?? []) {\n if (seen.has(relId)) continue;\n const related = byId.get(relId);\n if (related) addOrUpdate(related, \"anchor\", undefined, \"partial\");\n }\n }\n\n memories.push(...ranked.slice(0, briefingMaxMemories));\n\n // ── Track reads + inline auto-promote ─────────────────────────────────\n if (input.track && memories.length > 0) {\n await trackReads(ctx.paths, memories.map((m) => m.id));\n const freshUsage = await loadUsageIndex(ctx.paths);\n // Use configured autoPromoteMinReads — not the hardcoded default.\n // (gotcha: 2026-05-04-gotcha-auto-promote-ignores-config-minreads)\n const cfg = await loadConfig(ctx.paths);\n const rule = {\n minReads: cfg.autoPromoteMinReads ?? DEFAULT_AUTO_PROMOTE_RULE.minReads,\n maxRejections: DEFAULT_AUTO_PROMOTE_RULE.maxRejections,\n };\n for (const m of memories) {\n const loaded = byId.get(m.id);\n if (!loaded) continue;\n const u = getUsage(freshUsage, m.id);\n if (!isAutoPromoteEligible(loaded.memory.frontmatter, u, rule)) continue;\n const newFm = { ...loaded.memory.frontmatter, status: \"validated\" as const };\n try {\n await writeFile(loaded.filePath, serializeMemory({ frontmatter: newFm, body: loaded.memory.body }), \"utf8\");\n m.status = \"validated\";\n m.confidence = \"trusted\";\n } catch { /* non-fatal */ }\n }\n }\n }\n\n // ── Project context ────────────────────────────────────────────────────\n let projectContextRaw =\n input.include_project_context && existsSync(ctx.paths.projectContext)\n ? await readFile(ctx.paths.projectContext, \"utf8\")\n : \"\";\n // Token saver: within a session, don't re-emit an UNCHANGED project context — the agent already\n // has it from the earlier call. First emission records a marker; repeats within the window omit.\n let contextOmittedRecent = false;\n if (projectContextRaw && input.dedupe_project_context !== false) {\n const ctxHash = hashProjectContext(projectContextRaw);\n if (await projectContextRecentlyEmitted(ctx.paths, ctxHash)) {\n contextOmittedRecent = true;\n projectContextRaw = \"\";\n } else {\n await recordProjectContextEmission(ctx.paths, ctxHash);\n }\n }\n const isTemplateContext =\n projectContextRaw.includes(\"TODO — high-level overview\") ||\n projectContextRaw.includes(\"Generated by `haive init`\");\n\n const setupWarnings: string[] = [];\n let autoContextGenerated = false;\n let projectContext = isTemplateContext ? \"\" : projectContextRaw;\n\n if ((isTemplateContext || !existsSync(ctx.paths.projectContext)) && input.include_project_context) {\n const haiveConfig = await loadConfig(ctx.paths);\n if (haiveConfig.autoContext) {\n const codeMap = await loadCodeMap(ctx.paths);\n if (codeMap) {\n const totalFiles = Object.keys(codeMap.files).length;\n const extensions = new Map<string, number>();\n for (const filePath of Object.keys(codeMap.files)) {\n const ext = filePath.slice(filePath.lastIndexOf(\".\") + 1).toLowerCase();\n extensions.set(ext, (extensions.get(ext) ?? 0) + 1);\n }\n const topExts = [...extensions.entries()]\n .sort((a, b) => b[1] - a[1])\n .slice(0, 5)\n .map(([e, n]) => `${e} (${n})`)\n .join(\", \");\n const topSymbols = Object.entries(codeMap.files)\n .flatMap(([fp, entry]) =>\n entry.exports.slice(0, 3).map((e) => `${e.name} (${fp.split(\"/\").slice(-2).join(\"/\")})`),\n )\n .slice(0, 15)\n .join(\", \");\n\n // \"How do I run tests/build here?\" is the #1 non-guessable cold-start fact — surface the\n // detected package.json scripts so a session-1 agent doesn't have to hunt for them.\n const commands = await detectRunCommands(ctx.paths.root);\n\n projectContext =\n `# Project context (auto-generated by hAIve)\\n\\n` +\n `> ⚠ This is a minimal auto-generated context based on the code-map. ` +\n `Invoke the \\`bootstrap_project\\` MCP prompt to replace it with a full analysis.\\n\\n` +\n `## Codebase overview\\n` +\n `- **${totalFiles} files** indexed in code-map\\n` +\n `- **Main file types:** ${topExts}\\n` +\n `- **Generated at:** ${codeMap.generated_at}\\n\\n` +\n (commands ? `## Commands\\n${commands}\\n\\n` : \"\") +\n `## Key exports (sample)\\n` +\n topSymbols + \"\\n\";\n\n autoContextGenerated = true;\n setupWarnings.push(\n \"project-context.md is still the default template. \" +\n \"A minimal auto-generated context has been injected from the code-map. \" +\n \"Invoke bootstrap_project to replace it with a full AI-analyzed context.\",\n );\n } else {\n setupWarnings.push(\n \"project-context.md is still the default template and no code-map found. \" +\n \"Run `haive index code` then invoke bootstrap_project for a full context.\",\n );\n }\n } else {\n setupWarnings.push(\n isTemplateContext\n ? \"project-context.md still contains the default template. \" +\n \"Invoke the bootstrap_project MCP prompt to auto-fill it from your codebase. \" +\n \"Until then, get_briefing returns no project context.\"\n : \"No project-context.md found. Run `haive init` then invoke the bootstrap_project MCP prompt.\",\n );\n }\n }\n\n // ── Module contexts + budget allocation ───────────────────────────────\n const moduleContents = briefingIncludeModules\n ? await loadModuleContexts(ctx, inferred)\n : [];\n\n const memoriesText = memories\n .map((m) => {\n const unverified = m.status === \"proposed\" ? \" [UNVERIFIED — not yet validated]\" : \"\";\n return `### ${m.id} (${m.scope}/${m.type}, ${m.confidence})${unverified}\\n${m.body.trim()}`;\n })\n .join(\"\\n\\n---\\n\\n\");\n\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 briefingMaxTokens,\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 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 // Cascade budget: top-ranked memories get full budget first; lower-ranked are dropped.\n const trimmedMemories: BriefingMemory[] = [];\n if (!memoriesSlice.truncated) {\n trimmedMemories.push(...memories);\n } else {\n let remaining = memoriesSlice.allocatedTokens;\n for (const m of memories) {\n const bodyTokens = estimateTokens(m.body);\n if (remaining <= 0) break;\n if (bodyTokens <= remaining) {\n trimmedMemories.push(m);\n remaining -= bodyTokens;\n } else if (remaining > 80) {\n const t = truncateToTokens(m.body, { maxTokens: remaining, mode: \"head\" });\n trimmedMemories.push({ ...m, body: t.text });\n remaining = 0;\n }\n }\n }\n\n const totalTokens =\n projectSlice.estimatedTokens + modulesSlice.estimatedTokens + memoriesSlice.estimatedTokens;\n\n // ── Decay warnings ─────────────────────────────────────────────────────\n const decayWarnings: string[] = [];\n for (const m of trimmedMemories) {\n const u = getUsage(usage, m.id);\n const loaded = byId.get(m.id);\n const createdAt = loaded?.memory.frontmatter.created_at ?? new Date().toISOString();\n if (isDecaying(u, createdAt)) decayWarnings.push(m.id);\n }\n\n // ── Format + priority + why ────────────────────────────────────────────\n const formattedMemories =\n input.format === \"compact\"\n ? trimmedMemories.map((m) => ({ ...m, body: compactSummary(m.body) }))\n : input.format === \"actions\"\n ? trimmedMemories.map((m) => ({ ...m, body: extractActionsBriefBody(m.body) }))\n : trimmedMemories;\n\n const outputMemories = formattedMemories.map((m) => ({\n ...m,\n priority: classifyMemoryPriority(m, byId.get(m.id), input.files, input.symbols),\n why: explainWhySurfaced(m, byId.get(m.id), input.files, inferred),\n }));\n\n const briefingQuality = classifyBriefingQuality(outputMemories, {\n isTemplateContext,\n autoContextGenerated,\n hasLastSession: Boolean(lastSession),\n searchMode,\n });\n\n // ── Code-map symbol lookup ─────────────────────────────────────────────\n let symbolLocations: BriefingOutput[\"symbol_locations\"];\n const symbolsToLookup = new Set<string>(input.symbols);\n for (const m of outputMemories) {\n for (const sym of byId.get(m.id)?.memory.frontmatter.anchor.symbols ?? []) {\n symbolsToLookup.add(sym);\n }\n }\n if (symbolsToLookup.size > 0) {\n const codeMap = await loadCodeMap(ctx.paths);\n if (codeMap) {\n symbolLocations = [];\n for (const sym of symbolsToLookup) {\n const { files } = queryCodeMap(codeMap, { symbol: sym });\n if (files.length > 0) {\n symbolLocations.push({\n symbol: sym,\n locations: files.flatMap((f) =>\n f.entry.exports\n .filter((e) => e.name.toLowerCase().includes(sym.toLowerCase()))\n .map((e) => ({\n file: f.path,\n kind: e.kind,\n line: e.line,\n ...(e.description ? { description: e.description } : {}),\n })),\n ),\n });\n }\n }\n if (symbolLocations.length === 0) symbolLocations = undefined;\n }\n }\n\n // ── action_required ────────────────────────────────────────────────────\n const actionRequired: ActionRequiredItem[] = [];\n\n const extractActionItem = (id: string, body: string): ActionRequiredItem => {\n const bodyLines = body.split(\"\\n\");\n const quoteBlock = bodyLines\n .filter((l) => l.startsWith(\"> \"))\n .map((l) => l.slice(2))\n .join(\" \")\n .replace(/^\\*«\\s*/, \"\")\n .replace(/\\s*»\\*$/, \"\")\n .trim();\n const headingLine = bodyLines.find((l) => l.startsWith(\"## \"));\n const summary = headingLine?.replace(/^##\\s*/, \"\").trim() ?? id;\n return {\n id,\n summary,\n developer_message: quoteBlock ||\n `A potentially incompatible external change was detected (${id}). ` +\n `Do you want me to analyze the impact and propose updates?`,\n };\n };\n\n for (const m of outputMemories) {\n const loaded = byId.get(m.id);\n if (loaded?.memory.frontmatter.requires_human_approval) {\n actionRequired.push(extractActionItem(m.id, loaded.memory.body));\n }\n }\n if (existsSync(ctx.paths.memoriesDir)) {\n const allMems = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n for (const { memory } of allMems) {\n const fm = memory.frontmatter;\n if (!fm.requires_human_approval) continue;\n if (fm.status === \"rejected\" || fm.status === \"deprecated\") continue;\n if (actionRequired.some((a) => a.id === fm.id)) continue;\n actionRequired.push(extractActionItem(fm.id, memory.body));\n }\n }\n\n // ── Pending distill ────────────────────────────────────────────────────\n const pendingDistillFile = pendingDistillPath(ctx);\n if (existsSync(pendingDistillFile)) {\n try {\n const raw = await readFile(pendingDistillFile, \"utf8\");\n const pd = JSON.parse(raw) as PendingDistill;\n const ageMs = Date.now() - new Date(pd.session_end).getTime();\n const SEVEN_DAYS = 7 * 24 * 60 * 60 * 1000;\n if (ageMs < SEVEN_DAYS) {\n const savedNote = pd.memories_saved.length > 0\n ? ` ${pd.memories_saved.length} memor${pd.memories_saved.length === 1 ? \"y was\" : \"ies were\"} saved.`\n : \" No memories were saved.\";\n const diffNote = pd.git_diff_available\n ? \" A git diff snapshot is available in the pending-distill file for context.\"\n : \"\";\n actionRequired.push({\n id: \"__pending_distill__\",\n summary: \"Previous session has undistilled learnings — invoke post_task to capture them\",\n developer_message:\n `The previous session (${pd.total_tool_calls} tool calls, ${pd.tool_summary}) ` +\n `was closed by autopilot without a full post_task distillation.${savedNote}${diffNote}\\n\\n` +\n `**Before starting your task:** invoke the MCP prompt \\`post_task\\` to capture any ` +\n `decisions, gotchas, or conventions from that session. This takes ~30 seconds and ` +\n `prevents institutional knowledge from being lost.\\n\\n` +\n `When done, call \\`mem_session_end\\` to acknowledge — this clears the pending distill marker.`,\n });\n } else {\n try {\n const { rm } = await import(\"node:fs/promises\");\n await rm(pendingDistillFile);\n } catch { /* non-fatal */ }\n }\n } catch { /* malformed or deleted between check and read — skip */ }\n }\n\n // ── low_value + adaptive trim + hints ─────────────────────────────────\n const memoriesEmpty = outputMemories.length === 0;\n const hasMemoriesDir = existsSync(ctx.paths.memoriesDir);\n const isColdStart = isTemplateContext && memoriesEmpty && !lastSession && !autoContextGenerated;\n\n const hasUnguessableSignal = outputMemories.some(\n (m) =>\n (m.priority === \"must_read\" || m.priority === \"useful\") &&\n specificityScore(m.body) >= GUESSABLE_THRESHOLD,\n );\n const briefingValueLow = !hasUnguessableSignal;\n const adaptiveConfig = await loadConfig(ctx.paths);\n const bootstrapUnfilled =\n /Auto-generated by `haive init/i.test(projectContextRaw) &&\n (projectContextRaw.match(/TODO —/g)?.length ?? 0) >= 2;\n const contextIsInferable = isTemplateContext || autoContextGenerated || bootstrapUnfilled;\n const adaptiveTrim =\n adaptiveConfig.adaptiveBriefing !== false && briefingValueLow && contextIsInferable;\n\n const hints: string[] = [];\n if (isColdStart) {\n hints.push(\n \"haive is uninitialized for this project (project-context.md is template, \" +\n \"0 memories, no past session). Skip future get_briefing calls until memories exist — \" +\n \"use Read/Grep directly. Run `haive init` and the bootstrap_project prompt to fix.\",\n );\n } else {\n if (outputMemories.some((m) => m.type === \"attempt\")) {\n hints.push(\n \"⚠️ One or more 'attempt' memories matched — these document failed approaches. \" +\n \"Read them BEFORE writing code to avoid repeating the mistake.\",\n );\n }\n if (outputMemories.some((m) => m.type === \"gotcha\")) {\n hints.push(\n \"Gotcha memories matched — non-obvious traps. Verify the 'how to apply' line still holds \" +\n \"before assuming behavior.\",\n );\n }\n if (memoriesEmpty && hasMemoriesDir && input.task) {\n hints.push(\n \"No memories matched this task. Try mem_search with broader/different terms, \" +\n \"or call mem_for_files with the files you intend to edit.\",\n );\n }\n if (input.task && outputMemories.length > 0 && actionRequired.length === 0) {\n hints.push(\n \"After completing the task: capture new gotchas with mem_observe, \" +\n \"failed approaches with mem_tried, validated patterns with mem_save.\",\n );\n }\n if (\n outputMemories.length > 2 &&\n !input.budget_preset &&\n input.task &&\n !hints.some((h) => h.includes(\"budget_preset\"))\n ) {\n hints.push(\n \"For tighter token budgets on small tasks pass budget_preset:'quick'; \" +\n \"for refactor-sized work use budget_preset:'deep'.\",\n );\n }\n }\n if (adaptiveTrim) {\n hints.push(\n \"No team-specific policy matched these files/task — nothing here a capable model can't \" +\n \"infer. The auto-generated project context was trimmed to keep this briefing near-zero-cost; \" +\n \"proceed with normal Read/Grep.\",\n );\n }\n\n // ── Proof line (Lot B × Lot C coordination point) ─────────────────────\n // Surface the measured outcome — \"this harness prevented N repeated mistakes\" — directly in the\n // briefing so the moat is visible in-context, not only in `haive dashboard`. briefingProofLine()\n // returns null when there are no recent catches, so an empty/cold corpus never shows a hollow claim.\n if (outputMemories.length > 0 && existsSync(ctx.paths.haiveDir)) {\n const proof = briefingProofLine(await loadPreventionEvents(ctx.paths));\n if (proof) hints.push(proof);\n }\n\n // ── Briefing marker (satisfies enforcement gate for MCP-native agents) ─\n if (existsSync(ctx.paths.haiveDir)) {\n await writeBriefingMarker(ctx.paths, {\n sessionId: process.env.HAIVE_SESSION_ID,\n ...(input.task ? { task: input.task } : {}),\n source: \"mcp-get-briefing\",\n files: input.files,\n memoryIds: outputMemories.map((m) => m.id),\n }).catch(() => { /* marker is best-effort — never fail the briefing on it */ });\n }\n\n return {\n ...(input.task ? { task: input.task } : {}),\n search_mode: searchMode,\n inferred_modules: inferred,\n ...(lastSession ? { last_session: lastSession } : {}),\n project_context: contextOmittedRecent\n ? {\n content:\n \"(project context unchanged — omitted to save tokens; it was provided earlier this \" +\n \"session. Pass dedupe_project_context:false to force a full copy.)\",\n truncated: false,\n omitted_recent: true,\n }\n : adaptiveTrim\n ? {\n content:\n \"(adaptive briefing: auto-generated context omitted — no team-specific policy \" +\n \"matched, so a capable model needs nothing extra here)\",\n truncated: false,\n ...(isTemplateContext && !autoContextGenerated ? { is_template: true } : {}),\n ...(autoContextGenerated ? { auto_generated: true } : {}),\n }\n : (projectContextRaw || autoContextGenerated)\n ? {\n content: projectSlice.text,\n truncated: projectSlice.truncated,\n ...(isTemplateContext && !autoContextGenerated ? { is_template: true } : {}),\n ...(autoContextGenerated ? { auto_generated: true } : {}),\n }\n : null,\n module_contexts: trimmedModules,\n memories: outputMemories,\n briefing_quality: briefingQuality,\n ...(symbolLocations ? { symbol_locations: symbolLocations } : {}),\n action_required: actionRequired,\n decay_warnings: decayWarnings,\n setup_warnings: setupWarnings,\n ...(isColdStart ? { low_value: true as const } : {}),\n briefing_value: briefingValueLow ? \"low\" : \"high\",\n ...(hints.length > 0 ? { hints } : {}),\n estimated_tokens: totalTokens,\n budget: {\n max_tokens: briefingMaxTokens,\n ...(input.budget_preset ? { preset_applied: input.budget_preset } : {}),\n spent: {\n project: projectSlice.estimatedTokens,\n modules: modulesSlice.estimatedTokens,\n memories: memoriesSlice.estimatedTokens,\n },\n },\n };\n}\n\n/**\n * Read the project's package.json and surface the run commands an agent needs on session 1\n * (test/build/lint/typecheck/dev/start). Returns a markdown bullet list, or null when there is no\n * package.json or no relevant scripts. Best-effort: a malformed manifest yields null, never throws.\n */\nasync function detectRunCommands(root: string): Promise<string | null> {\n const pkgPath = path.join(root, \"package.json\");\n if (!existsSync(pkgPath)) return null;\n try {\n const pkg = JSON.parse(await readFile(pkgPath, \"utf8\")) as { scripts?: Record<string, string> };\n const scripts = pkg.scripts ?? {};\n const order = [\"test\", \"build\", \"lint\", \"typecheck\", \"type-check\", \"dev\", \"start\"];\n const lines = order\n .filter((name) => typeof scripts[name] === \"string\" && scripts[name]!.trim() !== \"\")\n .map((name) => `- \\`${name}\\`: \\`${scripts[name]}\\``);\n return lines.length > 0 ? lines.join(\"\\n\") : null;\n } catch {\n return null;\n }\n}\n","import { readdir, readFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport {\n classifyMemoryPriority as coreClassifyPriority,\n isGlobPath,\n pathsOverlap,\n priorityRank as corePriorityRank,\n} from \"@hiveai/core\";\nimport type { LoadedMemory } from \"@hiveai/core\";\nimport type { HaiveContext } from \"../context.js\";\nimport type {\n BriefingMemory,\n BriefingMemoryPriority,\n BriefingOutput,\n BriefingQuality,\n} from \"./briefing-types.js\";\n\nexport function compactSummary(body: string): string {\n for (const line of body.split(\"\\n\")) {\n const trimmed = line.replace(/^#+\\s*/, \"\").trim();\n if (trimmed.length > 0) return trimmed.slice(0, 120);\n }\n return body.slice(0, 120);\n}\n\n/**\n * Map the MCP briefing's evidence into the shared core classifier. Behavior is identical to the old\n * inline logic — the single source of truth now lives in `@hiveai/core` so the CLI cannot drift.\n */\nexport function classifyMemoryPriority(\n memory: BriefingMemory,\n loaded: LoadedMemory | undefined,\n inputFiles: string[],\n inputSymbols: string[],\n): BriefingMemoryPriority {\n const fm = loaded?.memory.frontmatter;\n const directAnchor = Boolean(\n fm && inputFiles.length > 0 &&\n fm.anchor.paths.some((p) => inputFiles.some((file) => pathsOverlap(p, file))),\n );\n const directSymbol = Boolean(\n fm && inputSymbols.length > 0 &&\n fm.anchor.symbols.some((sym) =>\n inputSymbols.some((wanted) => wanted.toLowerCase() === sym.toLowerCase()),\n ),\n );\n const semantic = memory.semantic_score ?? 0;\n\n return coreClassifyPriority({\n type: memory.type,\n tags: fm?.tags ?? memory.tags ?? [],\n requiresHumanApproval: Boolean(fm?.requires_human_approval),\n directAnchor,\n directSymbol,\n exactTaskMatch: memory.match_quality === \"exact\",\n strongSemantic: semantic >= 0.65,\n usefulSemantic: semantic >= 0.35,\n moduleOrDomainMatch: memory.reasons.includes(\"module\") || memory.reasons.includes(\"domain\"),\n tagTaskMatch: false, // MCP ranking doesn't use a separate tag-token signal\n });\n}\n\nexport function priorityRank(priority: BriefingMemoryPriority): number {\n return corePriorityRank(priority);\n}\n\nexport function classifyBriefingQuality(\n memories: BriefingMemory[],\n context: {\n isTemplateContext: boolean;\n autoContextGenerated: boolean;\n hasLastSession: boolean;\n searchMode: BriefingOutput[\"search_mode\"];\n },\n): BriefingQuality {\n const mustRead = memories.filter((m) => m.priority === \"must_read\").length;\n const useful = memories.filter((m) => m.priority === \"useful\").length;\n const background = memories.filter((m) => m.priority === \"background\").length;\n const weakSemantic = memories.filter((m) =>\n m.reasons.length === 1 &&\n m.reasons.includes(\"semantic\") &&\n (m.semantic_score ?? 0) > 0 &&\n (m.semantic_score ?? 0) < 0.35,\n ).length;\n const reasons: string[] = [];\n\n if (memories.length === 0) reasons.push(\"no memories matched the task or files\");\n if (context.isTemplateContext && !context.autoContextGenerated) reasons.push(\"project context is still a template\");\n if (!context.hasLastSession) reasons.push(\"no previous session recap\");\n if (mustRead > 0) reasons.push(`${mustRead} must_read memor${mustRead === 1 ? \"y\" : \"ies\"} matched directly`);\n if (useful > 0) reasons.push(`${useful} useful memor${useful === 1 ? \"y\" : \"ies\"} matched`);\n if (background > useful + mustRead && background > 2) reasons.push(`${background} background memories dominate the result`);\n if (weakSemantic > 0) reasons.push(`${weakSemantic} weak semantic-only match${weakSemantic === 1 ? \"\" : \"es\"}`);\n if (context.searchMode === \"literal_fallback\") reasons.push(\"semantic index unavailable or empty; literal fallback used\");\n\n if (memories.length === 0 || (mustRead === 0 && useful === 0)) {\n return { level: \"thin\", reasons };\n }\n if (background > useful + mustRead && background > 2) {\n return { level: \"noisy\", reasons };\n }\n return { level: \"strong\", reasons };\n}\n\nexport function explainWhySurfaced(\n memory: BriefingMemory,\n loaded: LoadedMemory | undefined,\n inputFiles: string[],\n inferredModules: string[],\n): string[] {\n const why: string[] = [];\n const fm = loaded?.memory.frontmatter;\n if (memory.reasons.includes(\"anchor\") && fm) {\n const matching = fm.anchor.paths.filter((p) =>\n inputFiles.length === 0 || inputFiles.some((file) => pathsOverlap(p, file)),\n );\n if (matching.length > 0) {\n const exact = matching.filter((p) =>\n !isGlobPath(p) && inputFiles.some((file) => p === file || pathsOverlap(p, file)),\n );\n const glob = matching.filter((p) => isGlobPath(p));\n if (exact.length > 0) {\n why.push(`Exact/file anchor match: ${exact.slice(0, 4).join(\", \")}`);\n }\n if (glob.length > 0) {\n why.push(`Glob anchor match: ${glob.slice(0, 4).join(\", \")}`);\n }\n if (exact.length === 0 && glob.length === 0) {\n why.push(`Anchored to touched path${matching.length === 1 ? \"\" : \"s\"}: ${matching.slice(0, 4).join(\", \")}`);\n }\n } else if (fm.anchor.paths.length > 0) {\n why.push(`Pulled by related anchor: ${fm.anchor.paths.slice(0, 4).join(\", \")}`);\n }\n if (fm.anchor.symbols.length > 0) {\n why.push(`Anchor symbol${fm.anchor.symbols.length === 1 ? \"\" : \"s\"}: ${fm.anchor.symbols.slice(0, 4).join(\", \")}`);\n }\n }\n if (memory.reasons.includes(\"symbol\") && fm) {\n why.push(`Explicit symbol match: ${fm.anchor.symbols.slice(0, 4).join(\", \")}`);\n }\n if (memory.reasons.includes(\"module\")) {\n const moduleHints = [\n ...(memory.module ? [memory.module] : []),\n ...memory.tags.filter((tag) => inferredModules.includes(tag)),\n ];\n const shown = moduleHints.length > 0 ? [...new Set(moduleHints)].join(\", \") : inferredModules.join(\", \");\n why.push(shown ? `Matched inferred module/tag: ${shown}` : \"Matched inferred module context.\");\n }\n if (memory.reasons.includes(\"domain\")) {\n why.push(\"Matched inferred domain from the target file paths.\");\n }\n if (memory.reasons.includes(\"semantic\")) {\n const score = memory.semantic_score !== undefined\n ? ` score=${Math.round(memory.semantic_score * 100) / 100}`\n : \"\";\n why.push(`${memory.match_quality === \"exact\" ? \"Literal task match\" : \"Semantic/task relevance\"}${score}.`);\n }\n why.push(`Confidence: ${memory.confidence}; read ${memory.read_count} time${memory.read_count === 1 ? \"\" : \"s\"}.`);\n if (memory.type === \"attempt\") why.push(\"Failed-approach record; read before repeating the same path.\");\n if (memory.type === \"skill\") why.push(\"Skill (reusable procedure/playbook) — follow the steps described when doing this type of task.\");\n if (memory.status === \"proposed\" || memory.status === \"draft\") {\n why.push(\"Unvalidated record; use cautiously or ask a human before treating it as policy.\");\n }\n return why;\n}\n\nexport async 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\nexport async 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","import { estimateTokens, 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 paths: z\n .array(z.string())\n .default([])\n .describe(\n \"Filter to files under any of these path prefixes (e.g. ['packages/mcp/src/tools/', 'src/auth/']). \" +\n \"OR-joined with `file` substring; useful to get a focused view of one module.\",\n ),\n max_files: z\n .number()\n .int()\n .positive()\n .default(40)\n .describe(\"Cap on returned files (hard limit, applied after token budget)\"),\n max_tokens: z\n .number()\n .int()\n .positive()\n .optional()\n .describe(\n \"Approximate token budget for the response. When the matching set exceeds it, \" +\n \"files are ranked by export density (exports per LOC) and the highest-signal ones are kept first. \" +\n \"Omit to disable budgeting (legacy behavior).\",\n ),\n};\n\nexport const CodeMapInputZod = z.object(CodeMapInputSchema);\nexport type CodeMapInput = z.infer<typeof CodeMapInputZod>;\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 /** Number of matched files dropped due to max_files / max_tokens. */\n truncated?: number;\n /** True when at least one file was dropped to fit the token budget. */\n budget_clipped?: true;\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: matched } = queryCodeMap(map, { file: input.file, symbol: input.symbol });\n\n // Apply `paths` prefix filter on top of the substring match (OR within paths, AND with file).\n const pathsFiltered = input.paths.length === 0\n ? matched\n : matched.filter((f) => input.paths.some((p) => f.path.startsWith(stripLeadingSlash(p))));\n\n // Default order: alphabetical by path (predictable for callers).\n const alphabetical = [...pathsFiltered].sort((a, b) => a.path.localeCompare(b.path));\n\n let kept = alphabetical;\n let budgetClipped = false;\n if (input.max_tokens !== undefined) {\n // Density-rank to PICK which files to KEEP under budget, then re-sort alphabetically for output.\n const byDensity = [...alphabetical].sort((a, b) => {\n const da = density(a.entry.exports.length, a.entry.loc);\n const db = density(b.entry.exports.length, b.entry.loc);\n if (da !== db) return db - da;\n return a.path.localeCompare(b.path);\n });\n const keepSet = new Set<string>();\n let spent = 0;\n for (const f of byDensity) {\n const cost = estimateFileEntryTokens(f);\n if (spent + cost > input.max_tokens && keepSet.size > 0) {\n budgetClipped = true;\n break;\n }\n keepSet.add(f.path);\n spent += cost;\n }\n if (budgetClipped) {\n kept = alphabetical.filter((f) => keepSet.has(f.path));\n }\n }\n\n const finalFiles = kept.slice(0, input.max_files);\n const totalDropped = pathsFiltered.length - finalFiles.length;\n\n return {\n available: true,\n generated_at: map.generated_at,\n total_files: Object.keys(map.files).length,\n files: finalFiles.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 ...(totalDropped > 0 ? { truncated: totalDropped } : {}),\n ...(budgetClipped ? { budget_clipped: true as const } : {}),\n };\n}\n\nfunction density(exports: number, loc: number): number {\n if (loc <= 0) return 0;\n return exports / Math.max(loc, 1);\n}\n\nfunction stripLeadingSlash(p: string): string {\n return p.startsWith(\"/\") ? p.slice(1) : p;\n}\n\nfunction estimateFileEntryTokens(f: { path: string; entry: { summary?: string; loc: number; exports: Array<{ name: string; kind: string; description?: string; line: number }> } }): number {\n // Rough payload size: path + summary + each export (~6 tokens for name+kind+line + description).\n const exportsCost = f.entry.exports.reduce(\n (acc, e) => acc + 6 + estimateTokens(e.description ?? \"\"),\n 0,\n );\n return estimateTokens(f.path) + estimateTokens(f.entry.summary ?? \"\") + exportsCost + 4;\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 MemDiffInputSchema = {\n id_a: z.string().min(1).describe(\"First memory id\"),\n id_b: z.string().min(1).describe(\"Second memory id\"),\n};\n\nexport type MemDiffInput = {\n [K in keyof typeof MemDiffInputSchema]: z.infer<(typeof MemDiffInputSchema)[K]>;\n};\n\nexport interface MemDiffOutput {\n id_a: string;\n id_b: string;\n frontmatter_diff: Record<string, { a: unknown; b: unknown }>;\n body_diff: {\n lines_only_in_a: string[];\n lines_only_in_b: string[];\n common_lines: number;\n };\n}\n\nexport async function memDiff(input: MemDiffInput, ctx: HaiveContext): Promise<MemDiffOutput> {\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 foundA = all.find((m) => m.memory.frontmatter.id === input.id_a);\n const foundB = all.find((m) => m.memory.frontmatter.id === input.id_b);\n if (!foundA) throw new Error(`No memory with id \"${input.id_a}\".`);\n if (!foundB) throw new Error(`No memory with id \"${input.id_b}\".`);\n\n const fmA = foundA.memory.frontmatter as Record<string, unknown>;\n const fmB = foundB.memory.frontmatter as Record<string, unknown>;\n\n const frontmatterDiff: Record<string, { a: unknown; b: unknown }> = {};\n const allKeys = new Set([...Object.keys(fmA), ...Object.keys(fmB)]);\n for (const key of allKeys) {\n const va = fmA[key];\n const vb = fmB[key];\n if (JSON.stringify(va) !== JSON.stringify(vb)) {\n frontmatterDiff[key] = { a: va, b: vb };\n }\n }\n\n const linesA = new Set(foundA.memory.body.split(\"\\n\").map((l) => l.trim()).filter(Boolean));\n const linesB = new Set(foundB.memory.body.split(\"\\n\").map((l) => l.trim()).filter(Boolean));\n\n const onlyA = [...linesA].filter((l) => !linesB.has(l));\n const onlyB = [...linesB].filter((l) => !linesA.has(l));\n const common = [...linesA].filter((l) => linesB.has(l)).length;\n\n return {\n id_a: input.id_a,\n id_b: input.id_b,\n frontmatter_diff: frontmatterDiff,\n body_diff: {\n lines_only_in_a: onlyA,\n lines_only_in_b: onlyB,\n common_lines: common,\n },\n };\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 GetRecapInputSchema = {\n scope: z\n .enum([\"personal\", \"team\", \"any\"])\n .default(\"any\")\n .describe(\n \"Limit to a specific scope's recap. Default 'any' returns the most recent recap \" +\n \"across both personal and team scopes.\",\n ),\n};\n\nexport type GetRecapInput = {\n [K in keyof typeof GetRecapInputSchema]: z.infer<(typeof GetRecapInputSchema)[K]>;\n};\n\nexport interface GetRecapOutput {\n recap: {\n id: string;\n scope: string;\n revision_count: number;\n created_at: string;\n body: string;\n } | null;\n notice?: string;\n}\n\n/**\n * Lightweight alternative to get_briefing when you ONLY need the previous\n * session recap (e.g. resuming a long task between sessions). Skips project\n * context, modules, and memory ranking — pays only the recap's token cost.\n */\nexport async function getRecap(\n input: GetRecapInput,\n ctx: HaiveContext,\n): Promise<GetRecapOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n return { recap: null, notice: \"No .ai/memories directory — haive not initialized here.\" };\n }\n\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const recaps = all\n .filter(({ memory }) => memory.frontmatter.type === \"session_recap\")\n .filter(({ memory }) => input.scope === \"any\" || memory.frontmatter.scope === input.scope)\n .sort(\n (a, b) =>\n new Date(b.memory.frontmatter.created_at).getTime() -\n new Date(a.memory.frontmatter.created_at).getTime(),\n );\n\n if (recaps.length === 0) {\n return {\n recap: null,\n notice:\n input.scope === \"any\"\n ? \"No session recap saved yet. Run mem_session_end (or post_task prompt) to capture one.\"\n : `No session recap found in scope '${input.scope}'.`,\n };\n }\n\n const r = recaps[0]!;\n const fm = r.memory.frontmatter;\n return {\n recap: {\n id: fm.id,\n scope: fm.scope,\n revision_count: fm.revision_count ?? 0,\n created_at: fm.created_at,\n body: r.memory.body,\n },\n };\n}\n","import { z } from \"zod\";\nimport {\n getBriefing,\n type BriefingMemory,\n type BriefingQuality,\n type GetBriefingInput,\n} from \"./get-briefing.js\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemRelevantToInputSchema = {\n task: z\n .string()\n .min(1)\n .describe(\"What you are about to do, in 1–2 sentences. Used to rank relevant memories.\"),\n files: z\n .array(z.string())\n .default([])\n .describe(\"Optional: files you are about to edit — surfaces anchored memories.\"),\n limit: z\n .number()\n .int()\n .positive()\n .max(30)\n .default(8)\n .describe(\"Cap on returned memories.\"),\n min_semantic_score: z\n .number()\n .min(0)\n .max(1)\n .default(0.25)\n .describe(\"Drop weakly-related semantic hits below this cosine threshold.\"),\n format: z\n .enum([\"full\", \"compact\", \"actions\"])\n .default(\"full\")\n .describe(\"'compact' = id + 1-line summary; 'full' = complete bodies; 'actions' = bullet-first excerpts.\"),\n};\n\nexport type MemRelevantToInput = {\n [K in keyof typeof MemRelevantToInputSchema]: z.infer<(typeof MemRelevantToInputSchema)[K]>;\n};\n\nexport interface MemRelevantToOutput {\n task: string;\n search_mode: \"semantic\" | \"literal_fallback\" | \"literal\";\n memories: BriefingMemory[];\n briefing_quality: BriefingQuality;\n hints?: string[];\n /**\n * True when the search returned zero memories — clients can skip surfacing\n * an empty payload to the model.\n */\n empty?: true;\n}\n\n/**\n * One-shot ranked memories for a task. Use instead of get_briefing when you\n * already have project context loaded and only want the relevant memory layer.\n *\n * Runs the same ranking (anchor / module / literal / semantic) as get_briefing\n * but skips project_context, module_contexts, action_required, etc. — paying\n * only the cost of the memory bodies you actually get back.\n */\nexport async function memRelevantTo(\n input: MemRelevantToInput,\n ctx: HaiveContext,\n): Promise<MemRelevantToOutput> {\n // Reuse the briefing pipeline but turn off the heavy bits.\n const briefingInput: GetBriefingInput = {\n task: input.task,\n files: input.files,\n max_tokens: 16000,\n max_memories: input.limit,\n include_project_context: false,\n include_module_contexts: false,\n semantic: true,\n include_stale: false,\n track: true,\n format: input.format,\n symbols: [],\n min_semantic_score: input.min_semantic_score,\n };\n\n const briefing = await getBriefing(briefingInput, ctx);\n\n const out: MemRelevantToOutput = {\n task: input.task,\n search_mode: briefing.search_mode,\n memories: briefing.memories,\n briefing_quality: briefing.briefing_quality,\n };\n if (briefing.hints && briefing.hints.length > 0) out.hints = briefing.hints;\n if (briefing.memories.length === 0) out.empty = true;\n return out;\n}\n","import { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const CodeSearchInputSchema = {\n query: z\n .string()\n .min(1)\n .describe(\n \"Natural-language description of what you are looking for in the codebase \" +\n \"(e.g. 'function that hashes passwords', 'JWT signing logic', 'route registration').\",\n ),\n k: z\n .number()\n .int()\n .positive()\n .max(50)\n .default(5)\n .describe(\"Number of top hits to return.\"),\n min_score: z\n .number()\n .min(0)\n .max(1)\n .default(0.2)\n .describe(\n \"Minimum cosine similarity. Hits below this threshold are dropped to avoid noise. \" +\n \"Try 0.3+ for stricter matching.\",\n ),\n};\n\nexport type CodeSearchInput = {\n [K in keyof typeof CodeSearchInputSchema]: z.infer<(typeof CodeSearchInputSchema)[K]>;\n};\n\nexport interface CodeSearchHit {\n file: string;\n name: string;\n kind: string;\n line: number;\n description?: string;\n score: number;\n}\n\nexport interface CodeSearchOutput {\n available: boolean;\n hits: CodeSearchHit[];\n notice?: string;\n}\n\nexport async function codeSearch(\n input: CodeSearchInput,\n ctx: HaiveContext,\n): Promise<CodeSearchOutput> {\n let mod: typeof import(\"@hiveai/embeddings\");\n try {\n mod = await import(\"@hiveai/embeddings\");\n } catch {\n return {\n available: false,\n hits: [],\n notice:\n \"@hiveai/embeddings is not installed. Install it (`pnpm add @hiveai/embeddings`) \" +\n \"and run `haive index code-search` to enable semantic code search.\",\n };\n }\n\n const result = await mod.codeSemanticSearch(ctx.paths, input.query, {\n limit: input.k,\n minScore: input.min_score,\n });\n\n if (!result) {\n return {\n available: false,\n hits: [],\n notice:\n \"Code semantic-search index not built. Run `haive index code-search` to generate it \" +\n \"(builds embeddings for every exported symbol in the code-map).\",\n };\n }\n\n return { available: true, hits: result.hits };\n}\n","import { existsSync } from \"node:fs\";\nimport { spawn } from \"node:child_process\";\nimport path from \"node:path\";\nimport {\n deriveConfidence,\n getUsage,\n loadCodeMap,\n loadMemoriesFromDir,\n loadUsageIndex,\n memoryMatchesAnchorPaths,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const WhyThisFileInputSchema = {\n path: z\n .string()\n .min(1)\n .describe(\n \"Project-relative path to the file you want context on (e.g. 'packages/mcp/src/tools/mem-save.ts').\",\n ),\n git_log_limit: z\n .number()\n .int()\n .positive()\n .max(20)\n .default(5)\n .describe(\"How many recent commits touching this file to include.\"),\n memory_limit: z\n .number()\n .int()\n .positive()\n .max(20)\n .default(5)\n .describe(\"Cap on memories anchored to this path.\"),\n};\n\nexport type WhyThisFileInput = {\n [K in keyof typeof WhyThisFileInputSchema]: z.infer<(typeof WhyThisFileInputSchema)[K]>;\n};\n\nexport interface WhyThisFileOutput {\n file: string;\n exists: boolean;\n recent_commits: Array<{ sha: string; author: string; relative_date: string; subject: string }>;\n memories: Array<{\n id: string;\n type: string;\n scope: string;\n confidence: string;\n body_preview: string;\n }>;\n code_map_entry: {\n summary?: string;\n loc: number;\n exports: Array<{ name: string; kind: string; line: number; description?: string }>;\n } | null;\n hints?: string[];\n}\n\n/**\n * One-shot file-context lookup: combines recent git history, memories anchored\n * to the path, and the code-map entry. Designed to answer \"why is this file\n * the way it is?\" in a single call instead of 3-4 manual ones.\n */\nexport async function whyThisFile(\n input: WhyThisFileInput,\n ctx: HaiveContext,\n): Promise<WhyThisFileOutput> {\n const fileExists = existsSync(path.join(ctx.paths.root, input.path));\n\n const [commits, memories, codeMap] = await Promise.all([\n runGitLog(ctx.paths.root, input.path, input.git_log_limit).catch(() => []),\n collectAnchoredMemories(ctx, input.path, input.memory_limit),\n loadCodeMap(ctx.paths),\n ]);\n\n const codeMapEntry = codeMap?.files[input.path];\n\n const hints: string[] = [];\n if (!fileExists) {\n hints.push(`File '${input.path}' does not exist on disk — path may be wrong or file removed.`);\n }\n if (commits.length === 0 && fileExists) {\n hints.push(\"No git history found — file may be untracked or git not initialized.\");\n }\n if (memories.length === 0 && fileExists) {\n hints.push(\n \"No memories anchored here. If you discover something non-obvious while editing, \" +\n \"use mem_observe (with where=\" + input.path + \") to capture it.\",\n );\n }\n if (memories.some((m) => m.type === \"attempt\" || m.type === \"gotcha\")) {\n hints.push(\"⚠️ attempt/gotcha memories anchored to this file — read them BEFORE editing.\");\n }\n\n return {\n file: input.path,\n exists: fileExists,\n recent_commits: commits,\n memories,\n code_map_entry: codeMapEntry\n ? {\n ...(codeMapEntry.summary ? { summary: codeMapEntry.summary } : {}),\n loc: codeMapEntry.loc,\n exports: codeMapEntry.exports.map((e) => ({\n name: e.name,\n kind: e.kind,\n line: e.line,\n ...(e.description ? { description: e.description } : {}),\n })),\n }\n : null,\n ...(hints.length > 0 ? { hints } : {}),\n };\n}\n\nasync function collectAnchoredMemories(\n ctx: HaiveContext,\n filePath: string,\n limit: number,\n): Promise<WhyThisFileOutput[\"memories\"]> {\n if (!existsSync(ctx.paths.memoriesDir)) return [];\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const usage = await loadUsageIndex(ctx.paths);\n const out: WhyThisFileOutput[\"memories\"] = [];\n for (const { memory } of all) {\n const fm = memory.frontmatter;\n if (fm.status === \"rejected\" || fm.status === \"deprecated\") continue;\n if (fm.type === \"session_recap\") continue;\n if (!memoryMatchesAnchorPaths(memory, [filePath])) continue;\n const u = getUsage(usage, fm.id);\n out.push({\n id: fm.id,\n type: fm.type,\n scope: fm.scope,\n confidence: deriveConfidence(fm, u),\n body_preview: memory.body.split(\"\\n\").slice(0, 6).join(\"\\n\"),\n });\n if (out.length >= limit) break;\n }\n return out;\n}\n\nasync function runGitLog(\n cwd: string,\n filePath: string,\n limit: number,\n): Promise<WhyThisFileOutput[\"recent_commits\"]> {\n const sep = \"<<HV>>\";\n const fmt = `%h${sep}%an${sep}%ar${sep}%s`;\n const output = await runCommand(\n \"git\",\n [\"log\", `-n`, String(limit), `--pretty=format:${fmt}`, \"--\", filePath],\n cwd,\n );\n if (!output.trim()) return [];\n return output\n .split(\"\\n\")\n .map((line) => {\n const [sha = \"\", author = \"\", relative_date = \"\", subject = \"\"] = line.split(sep);\n return { sha, author, relative_date, subject };\n })\n .filter((c) => c.sha);\n}\n\nfunction runCommand(cmd: string, args: string[], cwd: string): Promise<string> {\n return new Promise((resolve, reject) => {\n const proc = spawn(cmd, args, { cwd, stdio: [\"ignore\", \"pipe\", \"pipe\"] });\n let stdout = \"\";\n let stderr = \"\";\n proc.stdout.on(\"data\", (chunk) => {\n stdout += chunk.toString();\n });\n proc.stderr.on(\"data\", (chunk) => {\n stderr += chunk.toString();\n });\n proc.on(\"error\", reject);\n proc.on(\"close\", (code) => {\n if (code === 0) resolve(stdout);\n else reject(new Error(stderr || `${cmd} exited with code ${code}`));\n });\n });\n}\n","import { existsSync } from \"node:fs\";\nimport {\n addedLinesFromDiff,\n BRIDGE_TARGET_PATH,\n buildDocFrequency,\n CODE_STOPWORDS,\n deriveConfidence,\n diffHasDistinctiveOverlap,\n getUsage,\n isRetiredMemory,\n loadMemoriesFromDir,\n loadUsageIndex,\n literalMatchesAnyToken,\n memoryMatchesAnchorPaths,\n recordPreventionHits,\n runSensors,\n sensorTargetsFromDiff,\n tokenizeQuery,\n type DocFrequency,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const AntiPatternsCheckInputSchema = {\n diff: z\n .string()\n .optional()\n .describe(\n \"Raw unified diff text (or any code/text snippet) to scan for previously documented anti-patterns. \" +\n \"Tokens from the diff are used to match memory bodies and the embeddings index.\",\n ),\n paths: z\n .array(z.string())\n .default([])\n .describe(\n \"File paths affected by the change. Memories anchored to any of these paths are surfaced regardless of the diff content.\",\n ),\n limit: z\n .number()\n .int()\n .positive()\n .max(20)\n .default(8)\n .describe(\"Cap on returned warnings.\"),\n semantic: z\n .boolean()\n .default(true)\n .describe(\n \"When true, also use semantic search (requires @hiveai/embeddings + memory index) to find related anti-patterns.\",\n ),\n min_semantic_score: z\n .number()\n .min(0)\n .max(1)\n .default(0.45)\n .describe(\n \"Minimum cosine score for semantic-only anti-pattern hits. Anchor/literal matches still surface. \" +\n \"Default 0.45 keeps broad, weakly-related memories out of review noise.\",\n ),\n};\n\nexport interface AntiPatternsCheckInput {\n diff?: string;\n paths: string[];\n limit: number;\n semantic: boolean;\n min_semantic_score?: number;\n}\n\nexport interface AntiPatternsWarning {\n id: string;\n type: \"attempt\" | \"gotcha\";\n scope: string;\n confidence: string;\n body_preview: string;\n reasons: Array<\"anchor\" | \"literal\" | \"semantic\" | \"sensor\">;\n /**\n * True when the LITERAL overlap includes a token that is *distinctive* to this memory\n * (rare across the gotcha corpus) — e.g. `BigInt`, `open-in-view`. Only a distinctive\n * literal overlap is precise enough to hard-block; a shared common word (\"memory\",\n * \"scope\", \"version\") sets only the `literal` reason for review. Powers the gate.\n */\n distinctive_literal?: boolean;\n semantic_score?: number;\n /** When a regex sensor fired: its self-correction message and severity. */\n sensor_message?: string;\n sensor_severity?: \"warn\" | \"block\";\n /** Memory tags — used downstream (e.g. pre_commit_check) to weight a warning by topic. */\n tags?: string[];\n /** Anchor paths of the memory — lets the gate tell what kind of file this warning is about. */\n anchor_paths?: string[];\n /**\n * True when the memory has an executable sensor defined.\n * Used by the pre-commit gate: if a sensor exists but did NOT fire (no \"sensor\" reason),\n * the sensor is the authoritative check and literal matching alone should not block.\n */\n has_sensor?: boolean;\n}\n\nexport interface AntiPatternsCheckOutput {\n /** Total number of attempt+gotcha memories that exist in this project. */\n scanned: number;\n warnings: AntiPatternsWarning[];\n notice?: string;\n}\n\n/**\n * Tokenize a diff for LITERAL anti-pattern matching.\n *\n * `tokenizeQuery` splits on whitespace only, so code without spaces around an identifier\n * (e.g. `Number(BigInt(a))`) collapses into one un-matchable blob and the \"literal\" signal\n * silently disappears — leaving the gate to lean on the (non-deterministic, warmup-sensitive)\n * semantic score. We additionally split on non-word boundaries and keep identifier-length\n * tokens (>= 4 chars, not a ubiquitous keyword) so `BigInt`, `lodash`, `openInView`, etc. are\n * matched reliably. The set is unioned with the whitespace tokens to preserve existing behavior.\n */\nfunction tokenizeDiffForLiteral(diff: string): string[] {\n // If this is a unified diff, only consider ADDED lines. The gate should fire on\n // \"you introduced the bad pattern\", not \"you touched a file that merely mentions it\"\n // (or \"you REMOVED it\"). This cuts false positives on refactors that edit anchored files.\n const lines = diff.split(\"\\n\");\n const looksLikeDiff = lines.some((l) => /^[+-]/.test(l));\n const addedOnly = looksLikeDiff\n ? lines.filter((l) => l.startsWith(\"+\") && !l.startsWith(\"+++\")).join(\"\\n\")\n : diff;\n const source = addedOnly.trim().length > 0 ? addedOnly : diff;\n\n const wsTokens = tokenizeQuery(source);\n const wordTokens = source\n .toLowerCase()\n .split(/[^a-z0-9]+/)\n .filter((t) => t.length >= 4 && !CODE_STOPWORDS.has(t));\n return [...new Set([...wsTokens, ...wordTokens])];\n}\n\n/**\n * Files hAIve generates/writes that are NOT application code: agent bridges (Lot A init + Lot C\n * bridges), the MCP client configs, and `.gitignore` (init appends a hAIve block). Scanning any of\n * these for anti-patterns self-matches the corpus they mirror (a bridge listing the seeded gotchas,\n * a `.gitignore` line that merely contains \"cache\", etc.).\n */\nconst HAIVE_GENERATED_FILES = new Set<string>([\n ...Object.values(BRIDGE_TARGET_PATH), // .clinerules, .windsurfrules, .continuerules, .rules, AGENTS.md, .github/copilot-instructions.md, .sourcegraph/cody-rules.md\n \"CLAUDE.md\",\n \".cursorrules\",\n \".gitignore\",\n \".mcp.json\",\n \".cursor/mcp.json\",\n \".vscode/mcp.json\",\n]);\n\n/**\n * True for files hAIve itself owns/generates: the `.ai/` knowledge base, plus the agent-bridge,\n * config, and workflow files it writes from that same corpus. Scanning these for anti-patterns\n * self-matches the memories they mirror and fabricates \"prevented mistake\" events on the very first\n * post-init commit (which stages the seeded corpus AND everything init generated, all at once).\n */\nexport function isHaiveOwnedPath(p: string): boolean {\n if (p.startsWith(\".ai/\")) return true;\n if (HAIVE_GENERATED_FILES.has(p)) return true;\n if (p.startsWith(\".cursor/rules/\")) return true; // haive-mcp-required.mdc and siblings\n if (/^\\.github\\/workflows\\/haive-.*\\.ya?ml$/.test(p)) return true;\n return false;\n}\n\n/**\n * Drop hunks for hAIve-owned files (see {@link isHaiveOwnedPath}) from a unified diff. Anti-patterns\n * are about CODE reintroducing a known mistake — editing hAIve's own knowledge base or the bridge\n * files it generates from that corpus must never corroborate a literal/semantic match. Without this,\n * re-tagging a memory, or simply committing a fresh `haive init` (which writes the seeded corpus AND\n * its bridges in one commit), self-matches and can hard-block or inflate prevention counts.\n * See gotcha 2026-06-03-gotcha-antipattern-self-match-on-memory-file-edit.\n */\nexport function stripAiDirHunks(diff: string): string {\n if (!diff.includes(\"diff --git\")) return diff; // no file headers to split on — leave as-is\n const out: string[] = [];\n let block: string[] = [];\n let keep = true;\n const flush = (): void => {\n if (keep) out.push(...block);\n block = [];\n keep = true;\n };\n for (const line of diff.split(\"\\n\")) {\n if (line.startsWith(\"diff --git \")) {\n flush();\n const target = line.match(/ b\\/(.+)$/)?.[1] ?? \"\";\n keep = !isHaiveOwnedPath(target);\n }\n block.push(line);\n }\n flush();\n return out.join(\"\\n\");\n}\n\n/**\n * Scan a diff (or set of paths) against documented attempt/gotcha memories.\n * Surfaces \"you are about to repeat a known mistake\" warnings BEFORE you commit.\n *\n * Matching strategy:\n * 1. Anchor — memories anchored to any of the changed paths\n * 2. Literal — tokens from the diff overlap with memory body\n * 3. Semantic — cosine similarity (when enabled and index available)\n */\nexport async function antiPatternsCheck(\n input: AntiPatternsCheckInput,\n ctx: HaiveContext,\n): Promise<AntiPatternsCheckOutput> {\n if (!input.diff && input.paths.length === 0) {\n return {\n scanned: 0,\n warnings: [],\n notice: \"Nothing to check — provide either `diff` text or `paths`.\",\n };\n }\n if (!existsSync(ctx.paths.memoriesDir)) {\n return { scanned: 0, warnings: [], notice: \"No .ai/memories directory — nothing to check against.\" };\n }\n\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const minSemanticScore = input.min_semantic_score ?? 0.45;\n const negative = all.filter(({ memory }) => {\n const t = memory.frontmatter.type;\n if (t !== \"attempt\" && t !== \"gotcha\") return false;\n const s = memory.frontmatter.status;\n return s !== \"rejected\" && s !== \"deprecated\" && s !== \"stale\" &&\n !isRetiredMemory(memory.frontmatter, memory.body);\n });\n\n if (negative.length === 0) {\n return { scanned: 0, warnings: [], notice: \"No attempt/gotcha memories found yet.\" };\n }\n\n const usage = await loadUsageIndex(ctx.paths);\n // Document frequency over the gotcha/attempt corpus — drives distinctive-token\n // corroboration so a shared *common* word never hard-blocks (false positives).\n const docFreq: DocFrequency = buildDocFrequency(negative.map(({ memory }) => memory.body));\n const seen = new Map<string, AntiPatternsWarning>();\n\n const upsert = (\n fm: { id: string; type: string; scope: string; tags?: string[]; anchor?: { paths?: string[] }; sensor?: unknown },\n body: string,\n reason: AntiPatternsWarning[\"reasons\"][number],\n score?: number,\n ): void => {\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 type: fm.type as \"attempt\" | \"gotcha\",\n scope: fm.scope,\n confidence: deriveConfidence(fm as Parameters<typeof deriveConfidence>[0], u),\n body_preview: body.split(\"\\n\").slice(0, 5).join(\"\\n\").slice(0, 400),\n reasons: [reason],\n tags: fm.tags ?? [],\n anchor_paths: fm.anchor?.paths ?? [],\n ...(fm.sensor != null ? { has_sensor: true } : {}),\n ...(score !== undefined ? { semantic_score: score } : {}),\n });\n };\n\n // 1. Anchor matches\n if (input.paths.length > 0) {\n for (const { memory } of negative) {\n if (memoryMatchesAnchorPaths(memory, input.paths)) {\n upsert(memory.frontmatter, memory.body, \"anchor\");\n }\n }\n }\n\n // Code-only view of the diff: `.ai/` knowledge-base edits never corroborate \"you reintroduced a\n // bad pattern in code\" (they'd self-match the very memory that documents it).\n const scanDiff = input.diff ? stripAiDirHunks(input.diff) : input.diff;\n\n // 2. Literal token overlap from diff\n if (scanDiff) {\n const tokens = tokenizeDiffForLiteral(scanDiff);\n const added = addedLinesFromDiff(scanDiff);\n const addedText = added.trim().length > 0 ? added : scanDiff;\n if (tokens.length > 0) {\n for (const { memory } of negative) {\n if (literalMatchesAnyToken(memory, tokens)) {\n upsert(memory.frontmatter, memory.body, \"literal\");\n // Distinguish a meaningful overlap (the diff contains a token rare to this\n // gotcha) from incidental shared domain words. Only the former can hard-block.\n if (diffHasDistinctiveOverlap(addedText, memory.body, docFreq)) {\n const w = seen.get(memory.frontmatter.id);\n if (w) w.distinctive_literal = true;\n }\n }\n }\n }\n }\n\n // 2b. Sensor matches — deterministic regex checks derived from memories.\n // A sensor fires on the ADDED lines of the diff (\"you introduced the bad pattern\").\n // This is the feedback *computational* signal: same result every time, no warmup.\n if (scanDiff) {\n const added = addedLinesFromDiff(scanDiff);\n const diffTargets = sensorTargetsFromDiff(scanDiff);\n const hasFileTargets = diffTargets.some((target) => target.path.length > 0);\n // Never run sensors against hAIve-owned files — a memory/bridge that documents a bad pattern\n // contains that pattern and would self-fire (see stripAiDirHunks / isHaiveOwnedPath).\n const codePaths = input.paths.filter((p) => !isHaiveOwnedPath(p));\n const fallbackContent = added.trim().length > 0 ? added : scanDiff;\n const targets = diffTargets.length > 0 && hasFileTargets\n ? diffTargets\n : codePaths.length > 0\n ? codePaths.map((p) => ({ path: p, content: fallbackContent }))\n : [{ path: \"\", content: fallbackContent }];\n const hits = runSensors(negative.map(({ memory }) => memory), targets);\n for (const hit of hits) {\n const found = negative.find(({ memory }) => memory.frontmatter.id === hit.memory_id);\n if (!found) continue;\n upsert(found.memory.frontmatter, found.memory.body, \"sensor\");\n const w = seen.get(found.memory.frontmatter.id);\n if (w) {\n w.sensor_message = hit.message;\n w.sensor_severity = hit.severity;\n }\n }\n }\n\n // 3. Semantic search\n if (input.semantic && scanDiff) {\n try {\n const mod = await import(\"@hiveai/embeddings\");\n const result = await mod.semanticSearch(ctx.paths, scanDiff, { limit: input.limit * 2 });\n if (result) {\n const negativeIds = new Set(negative.map(({ memory }) => memory.frontmatter.id));\n for (const hit of result.hits) {\n if (!negativeIds.has(hit.id)) continue;\n if (hit.score < minSemanticScore && !seen.has(hit.id)) continue;\n const found = negative.find(({ memory }) => memory.frontmatter.id === hit.id);\n if (found) upsert(found.memory.frontmatter, found.memory.body, \"semantic\", hit.score);\n }\n }\n } catch {\n // embeddings not installed — silently skip semantic\n }\n }\n\n // Rank: anchor > literal > semantic, then by confidence\n const warnings = [...seen.values()]\n .sort((a, b) => {\n const score = (w: AntiPatternsWarning): number => {\n const reasonW =\n (w.reasons.includes(\"sensor\") ? 8 : 0) +\n (w.reasons.includes(\"anchor\") ? 4 : 0) +\n (w.reasons.includes(\"literal\") ? 2 : 0) +\n (w.reasons.includes(\"semantic\") ? 1 : 0);\n const confW =\n w.confidence === \"authoritative\" ? 3 :\n w.confidence === \"trusted\" ? 2 :\n w.confidence === \"low\" ? 1 : 0;\n return reasonW + confW + (w.semantic_score ?? 0);\n };\n return score(b) - score(a);\n })\n .slice(0, input.limit);\n\n // OUTCOME measurement: record only HIGH-CONFIDENCE catches as prevention events. A prevention\n // event is a measured claim (\"a known mistake was intercepted before it landed\") and must not be\n // cheap to trigger, or the dashboard/gate-precision/proof-line inflate on noise. We require one of:\n // • a deterministic SENSOR fired (computational, same result every time), or\n // • the change is in a file the lesson is ANCHORED to AND shares its vocabulary (anchor + literal).\n // Deliberately excluded: semantic-only (advisory), and a bare distinctive-literal in an UNRELATED\n // file — on a small/cold corpus a single moderately-rare shared word (\"cache\", \"client\") otherwise\n // self-records a phantom catch. Such matches still SURFACE as review warnings; they just aren't\n // counted as outcomes. Debounced via recordPrevention so re-running on the same diff can't inflate.\n const strongCatches = warnings.filter(\n (w) =>\n w.reasons.includes(\"sensor\") ||\n (w.reasons.includes(\"anchor\") && w.reasons.includes(\"literal\")),\n );\n // THE shared recorder — same path the git-hook gate and `haive sensors check` use (debounced).\n await recordPreventionHits(ctx.paths, strongCatches.map((w) => w.id), \"anti-pattern\");\n\n return {\n scanned: negative.length,\n warnings,\n };\n}\n","import { existsSync } from \"node:fs\";\nimport {\n loadMemoriesFromDir,\n tokenizeQuery,\n type LoadedMemory,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemDistillInputSchema = {\n since_days: z\n .number()\n .int()\n .positive()\n .default(30)\n .describe(\"Only consider memories created in the last N days.\"),\n min_cluster: z\n .number()\n .int()\n .min(2)\n .default(3)\n .describe(\"Minimum cluster size to surface.\"),\n type_filter: z\n .enum([\"gotcha\", \"attempt\", \"all\"])\n .default(\"gotcha\")\n .describe(\n \"Memory type to scan. 'gotcha' targets observe-style discoveries that recur, \" +\n \"'attempt' surfaces failed approaches that repeat, 'all' considers both.\",\n ),\n scope: z\n .enum([\"personal\", \"team\", \"module\", \"any\"])\n .default(\"any\")\n .describe(\"Restrict to a specific scope.\"),\n};\n\nexport type MemDistillInput = {\n [K in keyof typeof MemDistillInputSchema]: z.infer<(typeof MemDistillInputSchema)[K]>;\n};\n\nexport interface DistillCluster {\n suggested_topic: string;\n suggested_type: \"convention\" | \"gotcha\";\n member_ids: string[];\n overlapping_paths: string[];\n common_keywords: string[];\n sample_titles: string[];\n /** ISO date of the latest member */\n latest_at: string;\n}\n\nexport interface MemDistillOutput {\n scanned: number;\n /** Memories that didn't fit any cluster (kept here so callers can inspect singletons). */\n singletons: number;\n clusters: DistillCluster[];\n notice?: string;\n}\n\nconst MS_PER_DAY = 24 * 60 * 60 * 1000;\n\nconst STOP_WORDS = new Set([\n \"the\",\"and\",\"for\",\"with\",\"that\",\"this\",\"from\",\"into\",\"when\",\"then\",\"also\",\"must\",\n \"have\",\"does\",\"not\",\"but\",\"you\",\"your\",\"its\",\"because\",\"why\",\"how\",\"what\",\n \"use\",\"using\",\"used\",\"add\",\"added\",\"make\",\"made\",\"fix\",\"fixed\",\"bug\",\"error\",\n]);\n\n/**\n * Cluster recurring observations / attempts so a human can collapse N similar\n * memories into one richer convention/gotcha. Uses cheap heuristics (anchor\n * path overlap + body keyword overlap) — no embeddings needed.\n *\n * Output is *advisory*: nothing is written to disk. The caller (CLI / human)\n * decides whether to mem_save the consolidated form.\n */\nexport async function memDistill(\n input: MemDistillInput,\n ctx: HaiveContext,\n): Promise<MemDistillOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n return { scanned: 0, singletons: 0, clusters: [], notice: \"No .ai/memories directory.\" };\n }\n\n const cutoff = Date.now() - input.since_days * MS_PER_DAY;\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const candidates = all.filter(({ memory }) => {\n const fm = memory.frontmatter;\n if (fm.status === \"rejected\" || fm.status === \"deprecated\" || fm.status === \"stale\") return false;\n if (input.scope !== \"any\" && fm.scope !== input.scope) return false;\n if (input.type_filter === \"gotcha\" && fm.type !== \"gotcha\") return false;\n if (input.type_filter === \"attempt\" && fm.type !== \"attempt\") return false;\n if (input.type_filter === \"all\" && fm.type !== \"gotcha\" && fm.type !== \"attempt\") return false;\n if (Date.parse(fm.created_at) < cutoff) return false;\n return true;\n });\n\n if (candidates.length < input.min_cluster) {\n return {\n scanned: candidates.length,\n singletons: candidates.length,\n clusters: [],\n notice: candidates.length === 0\n ? `No matching memories in the last ${input.since_days} days.`\n : `Only ${candidates.length} candidate${candidates.length === 1 ? \"\" : \"s\"} — below min_cluster=${input.min_cluster}.`,\n };\n }\n\n // Pre-compute features per memory: keyword set + path set\n const features = candidates.map((loaded) => ({\n loaded,\n keywords: keywordSet(loaded),\n paths: new Set<string>(loaded.memory.frontmatter.anchor.paths),\n }));\n\n // Single-linkage clustering: union-find by similarity threshold.\n const parent: number[] = features.map((_, i) => i);\n const find = (i: number): number => (parent[i] === i ? i : (parent[i] = find(parent[i] ?? 0)));\n const union = (a: number, b: number): void => {\n const ra = find(a), rb = find(b);\n if (ra !== rb) parent[ra] = rb;\n };\n\n for (let i = 0; i < features.length; i++) {\n for (let j = i + 1; j < features.length; j++) {\n const fi = features[i]!, fj = features[j]!;\n const pathSim = jaccard(fi.paths, fj.paths);\n const kwSim = jaccard(fi.keywords, fj.keywords);\n // Either strong path overlap OR strong keyword overlap qualifies.\n if (pathSim >= 0.5 || kwSim >= 0.4) union(i, j);\n }\n }\n\n // Group by root parent\n const groups = new Map<number, number[]>();\n for (let i = 0; i < features.length; i++) {\n const root = find(i);\n const arr = groups.get(root) ?? [];\n arr.push(i);\n groups.set(root, arr);\n }\n\n const clusters: DistillCluster[] = [];\n let singletons = 0;\n for (const indices of groups.values()) {\n if (indices.length < input.min_cluster) {\n singletons += indices.length;\n continue;\n }\n const members = indices.map((i) => features[i]!);\n const allPaths = new Set<string>();\n const allKeywords = new Map<string, number>();\n let latest = 0;\n for (const m of members) {\n for (const p of m.paths) allPaths.add(p);\n for (const k of m.keywords) allKeywords.set(k, (allKeywords.get(k) ?? 0) + 1);\n const t = Date.parse(m.loaded.memory.frontmatter.created_at);\n if (t > latest) latest = t;\n }\n const commonKeywords = [...allKeywords.entries()]\n .filter(([, n]) => n >= Math.max(2, Math.floor(members.length / 2)))\n .sort((a, b) => b[1] - a[1])\n .slice(0, 5)\n .map(([k]) => k);\n\n const titles = members\n .map((m) => firstHeading(m.loaded.memory.body) ?? m.loaded.memory.frontmatter.id)\n .slice(0, 5);\n\n const suggestedType: DistillCluster[\"suggested_type\"] =\n members.every((m) => m.loaded.memory.frontmatter.type === \"attempt\") ? \"gotcha\" : \"convention\";\n\n clusters.push({\n suggested_topic: commonKeywords.slice(0, 3).join(\"-\") || \"merged-observations\",\n suggested_type: suggestedType,\n member_ids: members.map((m) => m.loaded.memory.frontmatter.id),\n overlapping_paths: [...allPaths].slice(0, 10),\n common_keywords: commonKeywords,\n sample_titles: titles,\n latest_at: new Date(latest).toISOString(),\n });\n }\n\n // Sort clusters by size desc\n clusters.sort((a, b) => b.member_ids.length - a.member_ids.length);\n\n return {\n scanned: candidates.length,\n singletons,\n clusters,\n };\n}\n\nfunction keywordSet(loaded: LoadedMemory): Set<string> {\n const text = (loaded.memory.body + \" \" + loaded.memory.frontmatter.tags.join(\" \")).slice(0, 800);\n const tokens = tokenizeQuery(text)\n .filter((t) => t.length >= 4 && !STOP_WORDS.has(t));\n return new Set(tokens);\n}\n\nfunction jaccard<T>(a: Set<T>, b: Set<T>): number {\n if (a.size === 0 && b.size === 0) return 0;\n let intersect = 0;\n for (const x of a) if (b.has(x)) intersect++;\n const union = a.size + b.size - intersect;\n return union === 0 ? 0 : intersect / union;\n}\n\nfunction firstHeading(body: string): string | undefined {\n for (const line of body.split(\"\\n\")) {\n const t = line.trim();\n if (t.startsWith(\"#\")) return t.replace(/^#+\\s*/, \"\").slice(0, 80);\n if (t.length > 0) return t.slice(0, 80);\n }\n return undefined;\n}\n","import { existsSync } from \"node:fs\";\nimport { spawn } from \"node:child_process\";\nimport {\n deriveConfidence,\n getUsage,\n loadMemoriesFromDir,\n loadUsageIndex,\n pathsOverlap as singlePathsOverlap,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const WhyThisDecisionInputSchema = {\n id: z\n .string()\n .min(1)\n .describe(\"Memory id to inspect (e.g. '2026-04-25-decision-esm-only').\"),\n git_log_limit: z\n .number()\n .int()\n .positive()\n .max(20)\n .default(5)\n .describe(\"How many recent commits per anchor path to surface.\"),\n};\n\nexport type WhyThisDecisionInput = {\n [K in keyof typeof WhyThisDecisionInputSchema]: z.infer<(typeof WhyThisDecisionInputSchema)[K]>;\n};\n\nexport interface WhyThisDecisionOutput {\n found: boolean;\n decision?: {\n id: string;\n type: string;\n scope: string;\n status: string;\n confidence: string;\n body: string;\n created_at: string;\n };\n /** Memories explicitly linked via related_ids on the decision (or vice versa). */\n related: Array<{\n id: string;\n type: string;\n scope: string;\n confidence: string;\n body_preview: string;\n relation: \"explicit\" | \"back-link\";\n }>;\n /** Other memories anchored to overlapping paths — implicit context. */\n path_neighbors: Array<{\n id: string;\n type: string;\n scope: string;\n confidence: string;\n overlap: string[];\n body_preview: string;\n }>;\n /** Recent git commits touching any of the decision's anchored paths. */\n recent_commits: Array<{\n path: string;\n sha: string;\n author: string;\n relative_date: string;\n subject: string;\n }>;\n hints?: string[];\n notice?: string;\n}\n\n/**\n * Trace the genealogy of a `decision` memory: the decision itself + memories\n * explicitly linked to it + memories anchored to overlapping paths + recent\n * commits touching those paths. One call instead of 4-5 manual lookups.\n *\n * Works on any memory type, but is optimized for `decision` and `architecture`.\n */\nexport async function whyThisDecision(\n input: WhyThisDecisionInput,\n ctx: HaiveContext,\n): Promise<WhyThisDecisionOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n return {\n found: false,\n related: [],\n path_neighbors: [],\n recent_commits: [],\n notice: \"No .ai/memories directory.\",\n };\n }\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const usage = await loadUsageIndex(ctx.paths);\n const target = all.find(({ memory }) => memory.frontmatter.id === input.id);\n if (!target) {\n return {\n found: false,\n related: [],\n path_neighbors: [],\n recent_commits: [],\n notice: `Memory '${input.id}' not found.`,\n };\n }\n\n const fm = target.memory.frontmatter;\n const targetUsage = getUsage(usage, fm.id);\n const decision = {\n id: fm.id,\n type: fm.type,\n scope: fm.scope,\n status: fm.status,\n confidence: deriveConfidence(fm, targetUsage),\n body: target.memory.body,\n created_at: fm.created_at,\n };\n\n // ── related: explicit related_ids + reverse links ──────────────────────\n const relatedSet = new Set(fm.related_ids ?? []);\n const related: WhyThisDecisionOutput[\"related\"] = [];\n for (const { memory } of all) {\n if (memory.frontmatter.id === fm.id) continue;\n const isExplicit = relatedSet.has(memory.frontmatter.id);\n const isBackLink = (memory.frontmatter.related_ids ?? []).includes(fm.id);\n if (!isExplicit && !isBackLink) continue;\n const u = getUsage(usage, memory.frontmatter.id);\n related.push({\n id: memory.frontmatter.id,\n type: memory.frontmatter.type,\n scope: memory.frontmatter.scope,\n confidence: deriveConfidence(memory.frontmatter, u),\n body_preview: memory.body.split(\"\\n\").slice(0, 4).join(\"\\n\").slice(0, 300),\n relation: isExplicit ? \"explicit\" : \"back-link\",\n });\n }\n\n // ── path_neighbors: memories anchored to overlapping paths ─────────────\n const targetPaths = fm.anchor.paths;\n const path_neighbors: WhyThisDecisionOutput[\"path_neighbors\"] = [];\n if (targetPaths.length > 0) {\n for (const { memory } of all) {\n if (memory.frontmatter.id === fm.id) continue;\n if (relatedSet.has(memory.frontmatter.id)) continue; // already in related\n const overlappingPaths = memory.frontmatter.anchor.paths.filter((p) =>\n targetPaths.some((tp) => singlePathsOverlap(p, tp)),\n );\n if (overlappingPaths.length === 0) continue;\n const u = getUsage(usage, memory.frontmatter.id);\n path_neighbors.push({\n id: memory.frontmatter.id,\n type: memory.frontmatter.type,\n scope: memory.frontmatter.scope,\n confidence: deriveConfidence(memory.frontmatter, u),\n overlap: overlappingPaths,\n body_preview: memory.body.split(\"\\n\").slice(0, 3).join(\"\\n\").slice(0, 200),\n });\n if (path_neighbors.length >= 10) break;\n }\n }\n\n // ── recent_commits: git log on each anchored path ──────────────────────\n const recent_commits: WhyThisDecisionOutput[\"recent_commits\"] = [];\n for (const p of targetPaths.slice(0, 5)) {\n try {\n const commits = await runGitLog(ctx.paths.root, p, input.git_log_limit);\n for (const c of commits) recent_commits.push({ path: p, ...c });\n } catch {\n /* git not available or path untracked — silent */\n }\n }\n\n const hints: string[] = [];\n if (decision.confidence === \"low\" || decision.confidence === \"stale\") {\n hints.push(`⚠️ Confidence is ${decision.confidence}. Verify this decision still applies before quoting it.`);\n }\n if (related.length === 0 && path_neighbors.length === 0 && targetPaths.length === 0) {\n hints.push(\"No related memories and no anchored paths — this decision is isolated; consider adding related_ids or paths.\");\n }\n if (fm.type !== \"decision\" && fm.type !== \"architecture\") {\n hints.push(`Memory type is '${fm.type}', not 'decision'/'architecture' — output may be less informative.`);\n }\n\n return {\n found: true,\n decision,\n related,\n path_neighbors,\n recent_commits,\n ...(hints.length > 0 ? { hints } : {}),\n };\n}\n\nasync function runGitLog(\n cwd: string,\n filePath: string,\n limit: number,\n): Promise<Array<{ sha: string; author: string; relative_date: string; subject: string }>> {\n const sep = \"<<HV>>\";\n const fmt = `%h${sep}%an${sep}%ar${sep}%s`;\n const output = await runCommand(\n \"git\",\n [\"log\", \"-n\", String(limit), `--pretty=format:${fmt}`, \"--\", filePath],\n cwd,\n );\n if (!output.trim()) return [];\n return output\n .split(\"\\n\")\n .map((line) => {\n const [sha = \"\", author = \"\", relative_date = \"\", subject = \"\"] = line.split(sep);\n return { sha, author, relative_date, subject };\n })\n .filter((c) => c.sha);\n}\n\nfunction runCommand(cmd: string, args: string[], cwd: string): Promise<string> {\n return new Promise((resolve, reject) => {\n const proc = spawn(cmd, args, { cwd, stdio: [\"ignore\", \"pipe\", \"pipe\"] });\n let stdout = \"\";\n let stderr = \"\";\n proc.stdout.on(\"data\", (chunk) => { stdout += chunk.toString(); });\n proc.stderr.on(\"data\", (chunk) => { stderr += chunk.toString(); });\n proc.on(\"error\", reject);\n proc.on(\"close\", (code) => {\n if (code === 0) resolve(stdout);\n else reject(new Error(stderr || `${cmd} exited with code ${code}`));\n });\n });\n}\n","import { existsSync } from \"node:fs\";\nimport {\n deriveConfidence,\n getUsage,\n loadMemoriesFromDir,\n loadUsageIndex,\n pathsOverlap,\n tokenizeQuery,\n type LoadedMemory,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemConflictsInputSchema = {\n id: z\n .string()\n .min(1)\n .describe(\"Memory id to check for conflicts.\"),\n min_score: z\n .number()\n .min(0)\n .max(1)\n .default(0.5)\n .describe(\"Minimum cosine similarity to consider a memory as a potential conflict (semantic mode).\"),\n semantic: z\n .boolean()\n .default(true)\n .describe(\"Use embeddings for similarity. Falls back to keyword overlap when embeddings are not installed.\"),\n};\n\nexport type MemConflictsInput = {\n [K in keyof typeof MemConflictsInputSchema]: z.infer<(typeof MemConflictsInputSchema)[K]>;\n};\n\nexport type ConflictReason =\n | \"opposite-status\"\n | \"attempt-vs-convention-same-paths\"\n | \"polarity-keywords\"\n | \"explicit-contradiction-tag\";\n\nexport interface ConflictHit {\n id: string;\n type: string;\n scope: string;\n status: string;\n confidence: string;\n body_preview: string;\n similarity: number | null;\n reasons: ConflictReason[];\n shared_paths: string[];\n}\n\nexport interface MemConflictsOutput {\n found: boolean;\n target?: { id: string; type: string; status: string };\n scanned: number;\n conflicts: ConflictHit[];\n notice?: string;\n}\n\nconst POSITIVE_PATTERNS = /\\b(use|prefer|always|should use|do this|recommended|ok to)\\b/i;\nconst NEGATIVE_PATTERNS = /\\b(do not use|don'?t use|never|avoid|forbidden|deprecated|stop using|do NOT|❌)\\b/i;\n\n/**\n * Find memories that potentially CONTRADICT the given memory. Useful before\n * relying on a memory's advice — surfaces \"another memory says the opposite\".\n *\n * Detection layers (any of these triggers a hit):\n * - Opposite status: target is validated, neighbor is rejected — for the same topic\n * - Type mismatch on overlapping paths: an `attempt` (don't do X) coexists with\n * a `convention` (do X) anchored to overlapping paths\n * - Polarity keywords: target says \"use X\" while a semantic neighbor says \"don't use X\"\n * - Explicit contradiction tag (#contradicts:<id>) in either body\n */\nexport async function memConflicts(\n input: MemConflictsInput,\n ctx: HaiveContext,\n): Promise<MemConflictsOutput> {\n if (!existsSync(ctx.paths.memoriesDir)) {\n return { found: false, scanned: 0, conflicts: [], notice: \"No .ai/memories directory.\" };\n }\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const target = all.find(({ memory }) => memory.frontmatter.id === input.id);\n if (!target) {\n return { found: false, scanned: 0, conflicts: [], notice: `Memory '${input.id}' not found.` };\n }\n\n const usage = await loadUsageIndex(ctx.paths);\n const others = all.filter(({ memory }) =>\n memory.frontmatter.id !== input.id &&\n memory.frontmatter.type !== \"session_recap\"\n );\n\n // Optional: get semantic similarity scores via embeddings\n const simScores = input.semantic ? await trySemanticSimilarities(ctx, target, others) : null;\n\n const targetText = (target.memory.body + \" \" + target.memory.frontmatter.tags.join(\" \"))\n .toLowerCase();\n const targetTokens = new Set(tokenizeQuery(targetText));\n const targetPolarity = polarity(targetText);\n const targetPaths = target.memory.frontmatter.anchor.paths;\n const explicitContradicts = extractContradictsTags(target.memory.body);\n\n const conflicts: ConflictHit[] = [];\n\n for (const other of others) {\n const fm = other.memory.frontmatter;\n const otherText = (other.memory.body + \" \" + fm.tags.join(\" \")).toLowerCase();\n const reasons: ConflictReason[] = [];\n\n const sim = simScores?.get(fm.id) ?? null;\n\n // Pre-filter: at least some keyword or path overlap or semantic hit.\n const hasPathOverlap = fm.anchor.paths.some((p) => targetPaths.some((tp) => pathsOverlap(p, tp)));\n const otherTokens = new Set(tokenizeQuery(otherText));\n const tokenOverlap = countIntersection(targetTokens, otherTokens);\n const isSemanticNeighbor = sim !== null && sim >= input.min_score;\n if (!hasPathOverlap && tokenOverlap < 4 && !isSemanticNeighbor) continue;\n\n // 1. Explicit contradicts tag\n const otherContradicts = extractContradictsTags(other.memory.body);\n if (explicitContradicts.has(fm.id) || otherContradicts.has(input.id)) {\n reasons.push(\"explicit-contradiction-tag\");\n }\n\n // 2. Opposite status (one validated, the other rejected on the same topic)\n if (\n target.memory.frontmatter.status === \"validated\" && fm.status === \"rejected\" ||\n target.memory.frontmatter.status === \"rejected\" && fm.status === \"validated\"\n ) {\n if (tokenOverlap >= 4 || isSemanticNeighbor) reasons.push(\"opposite-status\");\n }\n\n // 3. attempt vs convention/decision on overlapping paths\n if (hasPathOverlap) {\n const tType = target.memory.frontmatter.type;\n const oType = fm.type;\n const isAttemptVsRule = (tType === \"attempt\" && (oType === \"convention\" || oType === \"decision\")) ||\n (oType === \"attempt\" && (tType === \"convention\" || tType === \"decision\"));\n if (isAttemptVsRule) reasons.push(\"attempt-vs-convention-same-paths\");\n }\n\n // 4. Polarity inversion on shared keywords\n if (isSemanticNeighbor) {\n const otherPolarity = polarity(otherText);\n if (\n (targetPolarity === \"positive\" && otherPolarity === \"negative\") ||\n (targetPolarity === \"negative\" && otherPolarity === \"positive\")\n ) {\n reasons.push(\"polarity-keywords\");\n }\n }\n\n if (reasons.length === 0) continue;\n\n const u = getUsage(usage, fm.id);\n conflicts.push({\n id: fm.id,\n type: fm.type,\n scope: fm.scope,\n status: fm.status,\n confidence: deriveConfidence(fm, u),\n body_preview: other.memory.body.split(\"\\n\").slice(0, 4).join(\"\\n\").slice(0, 300),\n similarity: sim,\n reasons,\n shared_paths: fm.anchor.paths.filter((p) => targetPaths.some((tp) => pathsOverlap(p, tp))),\n });\n }\n\n // Rank: explicit > opposite-status > others; tiebreak by similarity desc\n conflicts.sort((a, b) => {\n const score = (c: ConflictHit): number =>\n (c.reasons.includes(\"explicit-contradiction-tag\") ? 100 : 0) +\n (c.reasons.includes(\"opposite-status\") ? 50 : 0) +\n (c.reasons.includes(\"attempt-vs-convention-same-paths\") ? 25 : 0) +\n (c.reasons.includes(\"polarity-keywords\") ? 10 : 0) +\n (c.similarity ?? 0) * 5;\n return score(b) - score(a);\n });\n\n return {\n found: true,\n target: {\n id: target.memory.frontmatter.id,\n type: target.memory.frontmatter.type,\n status: target.memory.frontmatter.status,\n },\n scanned: others.length,\n conflicts: conflicts.slice(0, 10),\n };\n}\n\nfunction polarity(text: string): \"positive\" | \"negative\" | \"neutral\" {\n const neg = NEGATIVE_PATTERNS.test(text);\n const pos = POSITIVE_PATTERNS.test(text);\n if (neg && !pos) return \"negative\";\n if (pos && !neg) return \"positive\";\n return \"neutral\";\n}\n\nfunction extractContradictsTags(body: string): Set<string> {\n const out = new Set<string>();\n for (const m of body.matchAll(/#contradicts:([\\w-]+)/g)) {\n if (m[1]) out.add(m[1]);\n }\n return out;\n}\n\nfunction countIntersection<T>(a: Set<T>, b: Set<T>): number {\n let n = 0;\n for (const x of a) if (b.has(x)) n++;\n return n;\n}\n\nasync function trySemanticSimilarities(\n ctx: HaiveContext,\n target: LoadedMemory,\n others: LoadedMemory[],\n): Promise<Map<string, 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(\n ctx.paths,\n target.memory.body,\n { limit: others.length },\n );\n if (!result) return null;\n const map = new Map<string, number>();\n for (const hit of result.hits) map.set(hit.id, hit.score);\n return map;\n}\n","import { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\nimport { antiPatternsCheck, type AntiPatternsWarning } from \"./anti-patterns-check.js\";\nimport { memForFiles } from \"./mem-for-files.js\";\nimport { memVerify } from \"./mem-verify.js\";\n\nexport const PreCommitCheckInputSchema = {\n diff: z\n .string()\n .optional()\n .describe(\n \"Raw unified diff text to scan. If omitted, only `paths` is used. \" +\n \"When called from a pre-commit hook, pipe the output of `git diff --cached`.\",\n ),\n paths: z\n .array(z.string())\n .default([])\n .describe(\"Project-relative paths affected by the change. At least one of `diff` or `paths` should be provided.\"),\n block_on: z\n .enum([\"any\", \"high-confidence\", \"never\"])\n .default(\"high-confidence\")\n .describe(\n \"When to set should_block=true: \" +\n \"'any' = any warning blocks; \" +\n \"'high-confidence' = only warnings from authoritative/trusted memories block; \" +\n \"'never' = report only, never block.\",\n ),\n semantic: z\n .boolean()\n .default(true)\n .describe(\"Enable semantic search in anti_patterns_check (requires embeddings index).\"),\n anchored_blocks: z\n .boolean()\n .default(false)\n .describe(\n \"When true, ALSO block a high-confidence anti-pattern (attempt/gotcha) that is anchored to a \" +\n \"touched file AND corroborated by the diff (literal token overlap, or semantic >= 0.45) — not just \" +\n \"very strong semantic matches. Powers the 'anchored' enforcement gate. Config/docs-only commits are \" +\n \"still downgraded. Default false preserves the soft, semantic-only blocking behavior.\",\n ),\n};\n\nexport type PreCommitCheckInput = {\n [K in keyof typeof PreCommitCheckInputSchema]: z.infer<(typeof PreCommitCheckInputSchema)[K]>;\n};\n\nexport interface PreCommitCheckOutput {\n /** True when at least one finding meets the configured block_on threshold. */\n should_block: boolean;\n /** Per-section summary; clients should surface the warnings + reasons to the user. */\n summary: {\n anti_patterns: number;\n blocking_warnings?: number;\n review_warnings?: number;\n info_warnings?: number;\n relevant_memories: number;\n stale_anchors: number;\n };\n warnings: ClassifiedAntiPatternsWarning[];\n /** Memories anchored to the touched files — convention reminders for the change author. */\n relevant_memories: Array<{\n id: string;\n type: string;\n confidence: string;\n body_preview: string;\n }>;\n /** Memories whose anchored paths overlap with the diff AND are now stale — likely outdated knowledge. */\n stale_anchors: Array<{\n id: string;\n paths: string[];\n body_preview: string;\n }>;\n notice?: string;\n}\n\nexport type AntiPatternLevel = \"blocking\" | \"review\" | \"info\";\n\nexport interface ClassifiedAntiPatternsWarning extends AntiPatternsWarning {\n /**\n * blocking = commit gate should fail for the configured threshold;\n * review = plausible but not strong enough to block;\n * info = weak signal, hidden by default in human CLI output.\n */\n level: AntiPatternLevel;\n rationale: string;\n affected_files: string[];\n repair_command: string;\n}\n\n/**\n * One-shot \"should I block this commit?\" check.\n *\n * Combines three signals into a single call agents and git hooks can consume:\n * 1. anti_patterns_check — known gotchas/attempts that match the diff\n * 2. mem_for_files — conventions/decisions anchored to touched files\n * 3. mem_verify — memories whose anchors are stale (knowledge may be wrong)\n *\n * Returns should_block per the configured threshold, plus the raw findings so\n * the caller can render them. CLI wrapper: `haive precommit`.\n */\nexport async function preCommitCheck(\n input: PreCommitCheckInput,\n ctx: HaiveContext,\n): Promise<PreCommitCheckOutput> {\n if (!input.diff && input.paths.length === 0) {\n return {\n should_block: false,\n summary: { anti_patterns: 0, relevant_memories: 0, stale_anchors: 0 },\n warnings: [],\n relevant_memories: [],\n stale_anchors: [],\n notice: \"Nothing to check — provide either `diff` or `paths`.\",\n };\n }\n\n // 1. Known anti-patterns\n const apResult = await antiPatternsCheck({\n diff: input.diff,\n paths: input.paths,\n limit: 20,\n semantic: input.semantic,\n }, ctx);\n\n // 2. Relevant conventions/decisions for the touched files\n const relevant = input.paths.length > 0\n ? await memForFiles({ files: input.paths, include_module_contexts: false, track: false }, ctx)\n : { by_anchor: [], by_module: [], by_domain: [], module_contexts: [], inferred_modules: [] };\n // Anchor matches are the most relevant for pre-commit; include module hits as a softer signal.\n const relevantMatches = [...relevant.by_anchor, ...relevant.by_module];\n\n // 3. Verify anchors — surface stale memories that touch these files\n const verifyResult = input.paths.length > 0\n ? await memVerify({ update: false, id: undefined }, ctx)\n : { results: [], summary: { checked: 0, fresh: 0, stale: 0, anchorless_skipped: 0, updated: 0 } };\n // We surface a stale memory when at least one of the verify hits says stale=true.\n // We don't have direct access to the memory's anchored paths from MemVerifyHit, so we rely on\n // mem_for_files to scope these to \"memories that touch our files\".\n const filesTouching = new Set(relevantMatches.map((m) => m.id));\n const staleHits = verifyResult.results.filter((r) => r.stale && filesTouching.has(r.id));\n\n // Determine should_block\n const blockOn = input.block_on;\n const classifiedWarnings = apResult.warnings.map((warning) => classifyWarning(warning, input.paths, input.anchored_blocks));\n const blockingWarnings = classifiedWarnings.filter((w) => w.level === \"blocking\");\n const reviewWarnings = classifiedWarnings.filter((w) => w.level === \"review\");\n const infoWarnings = classifiedWarnings.filter((w) => w.level === \"info\");\n let should_block = false;\n if (blockOn !== \"never\") {\n if (blockOn === \"any\" && (blockingWarnings.length > 0 || reviewWarnings.length > 0 || staleHits.length > 0)) should_block = true;\n if (blockOn === \"high-confidence\" && (blockingWarnings.length > 0 || staleHits.length > 0)) should_block = true;\n }\n\n // Map mem_for_files output to a simpler shape\n const relevant_memories = relevantMatches.slice(0, 8).map((m) => ({\n id: m.id,\n type: m.type,\n confidence: String(m.confidence),\n body_preview: (m.body ?? \"\").split(\"\\n\").slice(0, 4).join(\"\\n\").slice(0, 250),\n }));\n\n return {\n should_block,\n summary: {\n anti_patterns: apResult.warnings.length,\n blocking_warnings: blockingWarnings.length,\n review_warnings: reviewWarnings.length,\n info_warnings: infoWarnings.length,\n relevant_memories: relevant_memories.length,\n stale_anchors: staleHits.length,\n },\n warnings: classifiedWarnings,\n relevant_memories,\n stale_anchors: staleHits.map((r) => {\n const match = relevantMatches.find((m) => m.id === r.id);\n // Intersect the stale memory's anchor paths with the paths the caller provided\n // so the output lists only the touched files that are actually anchored to this memory.\n const overlapping = match\n ? input.paths.filter((p) =>\n match.anchor_paths.some((ap) => ap === p || p.startsWith(ap + \"/\") || ap.startsWith(p + \"/\")),\n )\n : [];\n return {\n id: r.id,\n paths: overlapping.length > 0 ? overlapping : (match ? input.paths : []),\n body_preview: r.reason ?? \"anchored code drifted; verify before relying on this memory\",\n };\n }),\n };\n}\n\nfunction classifyWarning(\n warning: AntiPatternsWarning,\n paths: string[],\n anchoredBlocks = false,\n): ClassifiedAntiPatternsWarning {\n const affectedFiles = paths.filter((p) =>\n !p.startsWith(\".ai/.usage/\") &&\n !p.startsWith(\".ai/.cache/\") &&\n !p.startsWith(\".ai/.runtime/\")\n );\n const repairCommand = repairCommandForWarning(warning, affectedFiles);\n const fileDowngrade = fileTypeDowngradeReason(warning, affectedFiles);\n\n if (fileDowngrade) {\n return {\n ...warning,\n level: \"info\",\n rationale: fileDowngrade,\n affected_files: affectedFiles,\n repair_command: repairCommand,\n };\n }\n\n if (warning.reasons.includes(\"sensor\")) {\n if (warning.sensor_severity === \"block\") {\n return {\n ...warning,\n level: \"blocking\",\n rationale: \"deterministic hAIve sensor with block severity matched the added diff\",\n affected_files: affectedFiles,\n repair_command: repairCommand,\n };\n }\n return {\n ...warning,\n level: \"review\",\n rationale: \"deterministic hAIve sensor with warn severity matched the added diff\",\n affected_files: affectedFiles,\n repair_command: repairCommand,\n };\n }\n\n if (isBlockingWarning(warning)) {\n if (warning.scope === \"personal\") {\n return {\n ...warning,\n level: \"review\",\n rationale:\n \"personal anti-pattern memories are review guidance unless a deterministic block-severity sensor fires\",\n affected_files: affectedFiles,\n repair_command: repairCommand,\n };\n }\n // Sensor veto applies here too: even a very strong semantic match should not\n // hard-block when the memory's authoritative sensor did not fire. The sensor\n // encodes the exact bad pattern; a non-firing sensor means the diff doesn't\n // contain it, so downgrade to review regardless of the semantic score.\n if (warning.has_sensor && !warning.reasons.includes(\"sensor\")) {\n return {\n ...warning,\n level: \"review\",\n rationale:\n \"memory has a sensor that did not fire — sensor is the authoritative check; strong semantic match alone is insufficient to block\",\n affected_files: affectedFiles,\n repair_command: repairCommand,\n };\n }\n return {\n ...warning,\n level: \"blocking\",\n rationale:\n \"authoritative/trusted memory plus very strong semantic match to the diff (score >= 0.75)\",\n affected_files: affectedFiles,\n repair_command: repairCommand,\n };\n }\n\n const hasSemantic = warning.reasons.includes(\"semantic\");\n const semanticScore = warning.semantic_score ?? 0;\n const highConfidence =\n warning.confidence === \"authoritative\" || warning.confidence === \"trusted\";\n\n // Anchored gate: when the caller opts in, a high-confidence anti-pattern that is anchored to a\n // touched file AND corroborated by the diff (literal token overlap, or a moderate semantic match)\n // is precise enough to block. This is what makes \"known bad approaches are blocked before commit\"\n // true for the case it matters most — you are editing the exact file a documented attempt/gotcha\n // warns about, and the diff contains the same idea. Config/docs-only commits already returned\n // above via fileTypeDowngradeReason, so this cannot re-introduce that false-positive class.\n if (\n anchoredBlocks &&\n highConfidence &&\n warning.scope !== \"personal\" &&\n warning.reasons.includes(\"anchor\") &&\n // A literal overlap only corroborates a BLOCK when it is on a token *distinctive*\n // to this gotcha (rare in the corpus). Sharing a common domain word (\"memory\",\n // \"scope\", \"version\") — or a version-bump diff — no longer hard-blocks; it falls\n // through to `review` below. This kills the incidental-token false positives that\n // made agents work for nothing. A moderate semantic match still corroborates.\n (warning.distinctive_literal === true || (hasSemantic && semanticScore >= 0.45))\n ) {\n // Sensor veto: if the memory has a sensor and it did NOT fire, the sensor is the\n // authoritative check for this memory. Broad literal token matching is too noisy\n // to block on its own — the sensor encodes the exact bad pattern. Downgrade to review\n // so the human sees the warning without being hard-blocked on a false positive.\n if (warning.has_sensor && !warning.reasons.includes(\"sensor\")) {\n return {\n ...warning,\n level: \"review\",\n rationale:\n \"memory has a sensor that did not fire — literal match alone is insufficient to block; sensor is the authoritative check\",\n affected_files: affectedFiles,\n repair_command: repairCommand,\n };\n }\n\n return {\n ...warning,\n level: \"blocking\",\n rationale:\n \"high-confidence anti-pattern anchored to a touched file and corroborated by the diff (anchored gate)\",\n affected_files: affectedFiles,\n repair_command: repairCommand,\n };\n }\n\n // Sensor veto for review: a memory that carries a deterministic sensor which did NOT fire, and is\n // not anchored to any touched file, is strong evidence the diff does not contain its pattern — the\n // sensor is the authoritative check. Surfacing it as \"review\" is pure noise (this was the bulk of\n // the 11 review hits on a 3-line `: any` diff). Demote to info (hidden in concise output).\n if (warning.has_sensor && !warning.reasons.includes(\"sensor\") && !warning.reasons.includes(\"anchor\")) {\n return {\n ...warning,\n level: \"info\",\n rationale:\n \"memory has a deterministic sensor that did not fire and is not anchored to a touched file — treated as non-violation noise\",\n affected_files: affectedFiles,\n repair_command: repairCommand,\n };\n }\n\n // A bare semantic match (not anchored to a touched file, no distinctive token) needs a stronger\n // score to be worth a human's attention. At 0.45–0.65 against generic text it is mostly noise — and\n // review noise trains agents to ignore the gate. Corroborated matches (anchored or distinctive\n // literal) keep the lower 0.45 bar; everything weaker falls through to \"info\" (hidden by default).\n const corroborated = warning.reasons.includes(\"anchor\") || warning.distinctive_literal === true;\n const semanticReviewFloor = corroborated ? 0.45 : 0.65;\n if (\n (hasSemantic && semanticScore >= semanticReviewFloor) ||\n (highConfidence && warning.reasons.includes(\"anchor\") && warning.reasons.includes(\"literal\"))\n ) {\n return {\n ...warning,\n level: \"review\",\n rationale:\n hasSemantic\n ? \"semantic match is plausible but below blocking threshold\"\n : \"anchored high-confidence memory also matched diff tokens, but no strong semantic proof\",\n affected_files: affectedFiles,\n repair_command: repairCommand,\n };\n }\n\n return {\n ...warning,\n level: \"info\",\n rationale:\n \"weak signal only (literal/anchor/low semantic evidence); surfaced for audit, hidden in concise CLI output\",\n affected_files: affectedFiles,\n repair_command: repairCommand,\n };\n}\n\nfunction isBlockingWarning(warning: AntiPatternsWarning): boolean {\n const highConfidence = warning.confidence === \"authoritative\" || warning.confidence === \"trusted\";\n if (!highConfidence) return false;\n\n // Anchors and lexical matches prove relevance, not violation. A broad diff\n // can touch package files or share common tokens with old gotchas. Require\n // a semantic corroboration strong enough to indicate the same mistake. Scores\n // in the 0.65-0.75 range are still useful review signals, but are too noisy\n // to block commits reliably even when the memory is anchored to a test file.\n if (!warning.reasons.includes(\"semantic\")) return false;\n return (warning.semantic_score ?? 0) >= 0.75;\n}\n\nexport function classifyAntiPatternWarningForTest(\n warning: AntiPatternsWarning,\n paths: string[],\n anchoredBlocks = false,\n): ClassifiedAntiPatternsWarning {\n return classifyWarning(warning, paths, anchoredBlocks);\n}\n\nfunction fileTypeDowngradeReason(\n warning: AntiPatternsWarning,\n paths: string[],\n): string | null {\n if (paths.length === 0) return null;\n if (paths.every((p) => p.startsWith(\".ai/.usage/\") || p === \".ai/.usage/tool-usage.jsonl\")) {\n return \".ai usage logs are local telemetry and never block commits.\";\n }\n\n const docsOnly = paths.every(isDocLikePath);\n if (docsOnly && !hasStrongSemantic(warning)) {\n return \"docs/changelog-only change; anti-pattern is downgraded unless semantic evidence is strong.\";\n }\n\n const configOnly = paths.every(isPackageOrConfigPath);\n // Any non-anchored, non-strongly-semantic warning is suppressed on config/workflow-only commits.\n // Gotchas that happen to share tokens with config file names (npm, install, package.json,\n // haive init, workspace:*) would otherwise fire on every dependency bump or workflow change.\n if (configOnly && !warning.reasons.includes(\"anchor\") && !hasStrongSemantic(warning)) {\n return \"package/config-only change; warning has no anchor on these files and no strong semantic match — downgraded to info.\";\n }\n\n // Inverse case: a package/build/tooling gotcha firing on a change that touches NO\n // package/build file. These match by shared tokens (\"install\", \"package\", \"build\")\n // and are almost always false positives on pure source edits.\n const touchesBuildFile = paths.some(isPackageOrConfigPath);\n if (!touchesBuildFile && isBuildScopedWarning(warning) && !warning.reasons.includes(\"anchor\") && !hasStrongSemantic(warning)) {\n return \"build/packaging gotcha, but no package/build file changed — downgraded to info.\";\n }\n\n return null;\n}\n\n/**\n * True when a warning is about build/packaging/tooling concerns — by its tags, or\n * because every path it is anchored to is itself a package/config file.\n */\nfunction isBuildScopedWarning(warning: AntiPatternsWarning): boolean {\n const tags = warning.tags ?? [];\n if (tags.some((t) => BUILD_SCOPED_TAGS.has(t.toLowerCase()))) return true;\n const anchors = warning.anchor_paths ?? [];\n return anchors.length > 0 && anchors.every(isPackageOrConfigPath);\n}\n\nconst BUILD_SCOPED_TAGS = new Set([\n \"npm\", \"pnpm\", \"yarn\", \"publish\", \"install\", \"packaging\", \"package\",\n \"build\", \"tsup\", \"bundler\", \"monorepo\", \"workspace\", \"versioning\", \"version\",\n \"dev-workflow\", \"hotswap\", \"ci\", \"workflow\", \"release\", \"changelog\",\n \"dependencies\", \"deps\", \"dependency\", \"tooling\", \"config\",\n]);\n\nfunction hasStrongSemantic(warning: AntiPatternsWarning): boolean {\n return warning.reasons.includes(\"semantic\") && (warning.semantic_score ?? 0) >= 0.65;\n}\n\nfunction isDocLikePath(file: string): boolean {\n const lower = file.toLowerCase();\n return lower.endsWith(\".md\") ||\n lower.includes(\"changelog\") ||\n lower.startsWith(\"docs/\") ||\n lower.startsWith(\".github/\") && lower.endsWith(\".md\");\n}\n\nfunction isPackageOrConfigPath(file: string): boolean {\n const lower = file.toLowerCase();\n const base = lower.split(\"/\").pop() ?? lower;\n return lower.endsWith(\"package.json\") ||\n lower.endsWith(\"package-lock.json\") ||\n lower.endsWith(\"pnpm-lock.yaml\") ||\n lower.endsWith(\"yarn.lock\") ||\n lower.endsWith(\"bun.lockb\") ||\n lower.endsWith(\".config.ts\") ||\n lower.endsWith(\".config.js\") ||\n isJsonConfigFile(base) ||\n lower.endsWith(\".yml\") ||\n lower.endsWith(\".yaml\") ||\n lower.endsWith(\".toml\") ||\n lower.startsWith(\".github/workflows/\") ||\n lower.startsWith(\".github/\") && lower.endsWith(\".yml\") ||\n // Dotfiles that are pure configuration/tooling — never trigger runtime gotchas\n base === \".gitignore\" ||\n base === \".gitattributes\" ||\n base === \".gitmodules\" ||\n base === \".editorconfig\" ||\n base === \".nvmrc\" ||\n base === \".node-version\" ||\n base === \".npmrc\" ||\n base === \".yarnrc\" ||\n base === \".yarnrc.yml\" ||\n base === \".dockerignore\" ||\n base === \"dockerfile\" ||\n base.startsWith(\"dockerfile.\") ||\n base === \".env.example\" ||\n base === \".env.template\" ||\n lower.endsWith(\".prettierrc\") ||\n lower.endsWith(\".eslintrc\") ||\n lower.endsWith(\".eslintignore\") ||\n lower.endsWith(\".prettierignore\") ||\n lower.endsWith(\".stylelintrc\") ||\n lower.endsWith(\".browserslistrc\");\n}\n\n/**\n * Returns true only for JSON files that are known build/tool configs.\n * Avoids treating application data files (fixtures, translations, schemas) as config.\n */\nfunction isJsonConfigFile(base: string): boolean {\n const knownConfigs = new Set([\n \"tsconfig.json\", \"jsconfig.json\",\n \"deno.json\", \"deno.jsonc\",\n \"nx.json\", \"turbo.json\", \"lerna.json\", \"rush.json\",\n \"jest.config.json\", \"vitest.config.json\", \"babel.config.json\",\n \".babelrc.json\", \".swcrc\", \".mocharc.json\",\n \"renovate.json\", \"dependabot.json\",\n \".prettierrc.json\", \".eslintrc.json\", \".stylelintrc.json\",\n ]);\n if (knownConfigs.has(base)) return true;\n // tsconfig.*.json (e.g. tsconfig.build.json, tsconfig.test.json)\n if (/^tsconfig\\..+\\.json$/.test(base)) return true;\n // .*rc.json (e.g. .eslintrc.json already covered, but be safe)\n if (/^\\.[a-z]+rc\\.json$/.test(base)) return true;\n return false;\n}\n\nfunction repairCommandForWarning(warning: AntiPatternsWarning, paths: string[]): string {\n const targetPath = repairTargetPathForWarning(warning, paths);\n return targetPath\n ? `haive briefing --files \"${targetPath}\" --task \"review ${warning.id}\"`\n : `haive memory show ${warning.id}`;\n}\n\nfunction repairTargetPathForWarning(warning: AntiPatternsWarning, paths: string[]): string | undefined {\n const usablePaths = paths.filter((p) =>\n !p.startsWith(\".ai/.usage/\") &&\n !p.startsWith(\".ai/.cache/\") &&\n !p.startsWith(\".ai/.runtime/\")\n );\n const anchors = warning.anchor_paths ?? [];\n for (const file of usablePaths) {\n if (anchors.some((anchor) => anchor === file || file.startsWith(`${anchor}/`) || anchor.startsWith(`${file}/`))) {\n return file;\n }\n }\n return usablePaths[0];\n}\n","/**\n * pattern_detect — heuristic memory detector that runs without an LLM.\n *\n * Three signals (no LLM required):\n * 1. CONFIG_CHANGE: git diff shows changes to config files\n * (tsconfig, eslint, prettier, vitest, .env.example, …)\n * → proposes a convention memory with the diff as body.\n *\n * 2. REPEATED_PATH: same file path appears in ≥ N consecutive mem_tried /\n * mem_observe events in the usage log\n * → proposes a gotcha memory anchored to that path.\n *\n * 3. HOT_FILE: a non-config source file appears in mem_save / mem_tried /\n * mem_observe summaries ≥ 3 times in the look-back window\n * → proposes a convention memory (frequent edits signal a pattern).\n *\n * Output is `status: proposed` — auto-promote (Phase 4) or the next\n * get_briefing post_task flow will validate/reject them.\n *\n * Runs entirely from the local filesystem: git, usage log, no network.\n */\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { execSync } from \"node:child_process\";\nimport {\n buildFrontmatter,\n memoryFilePath,\n readUsageEvents,\n serializeMemory,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\n// ── Constants ──────────────────────────────────────────────────────────────\n\n/** Glob patterns (lowercased) that identify config files. */\nconst CONFIG_PATTERNS = [\n \".eslintrc\", \"eslint.config\", \"prettier.config\", \".prettierrc\",\n \"tsconfig\", \"jsconfig\",\n \"vitest.config\", \"jest.config\",\n \".env.example\", \".env.defaults\",\n \"tailwind.config\", \"vite.config\", \"next.config\",\n \"babel.config\", \"postcss.config\",\n \"renovate.json\", \"dependabot.yml\",\n];\n\n/** Max length of a git diff included in a proposed memory body. */\nconst MAX_DIFF_BYTES = 4096;\n\n/** Threshold: path must appear this many times to trigger a HOT_FILE signal. */\nconst HOT_FILE_MIN = 3;\n\n// ── Input / Output ─────────────────────────────────────────────────────────\n\nexport const PatternDetectInputSchema = {\n since_days: z\n .number()\n .int()\n .min(1)\n .default(7)\n .describe(\"Look-back window in days for both git history and usage log.\"),\n dry_run: z\n .boolean()\n .default(false)\n .describe(\"When true, report matches without writing any memory files.\"),\n scope: z\n .enum([\"personal\", \"team\"])\n .default(\"team\")\n .describe(\"Scope for proposed memories.\"),\n};\n\nexport type PatternDetectInput = {\n [K in keyof typeof PatternDetectInputSchema]: z.infer<(typeof PatternDetectInputSchema)[K]>;\n};\n\nexport type PatternKind = \"config_change\" | \"repeated_path\" | \"hot_file\";\n\nexport interface PatternMatch {\n kind: PatternKind;\n signal: string;\n proposed_type: \"convention\" | \"gotcha\";\n proposed_slug: string;\n proposed_body: string;\n anchor_paths: string[];\n}\n\nexport interface PatternDetectOutput {\n scanned_events: number;\n matches: PatternMatch[];\n /** Number of proposed memories saved (0 if dry_run). */\n saved: number;\n /** IDs of saved memories. */\n saved_ids: string[];\n notice?: string;\n}\n\n// ── Implementation ─────────────────────────────────────────────────────────\n\nexport async function patternDetect(\n input: PatternDetectInput,\n ctx: HaiveContext,\n): Promise<PatternDetectOutput> {\n if (!existsSync(ctx.paths.haiveDir)) {\n return {\n scanned_events: 0, matches: [], saved: 0, saved_ids: [],\n notice: \"No .ai/ directory found. Run 'haive init' first.\",\n };\n }\n\n const matches: PatternMatch[] = [];\n\n // ── Signal 1: CONFIG_CHANGE ─────────────────────────────────────────────\n try {\n const changedFiles = gitChangedFiles(ctx.paths.root, input.since_days);\n const configFiles = changedFiles.filter((f) =>\n CONFIG_PATTERNS.some((p) => path.basename(f.toLowerCase()).includes(p)),\n );\n for (const file of configFiles.slice(0, 5)) {\n const diff = gitFileDiff(ctx.paths.root, file, input.since_days);\n if (!diff) continue;\n // Include the nearest parent dir so `cli/vitest.config.ts` and\n // `core/vitest.config.ts` produce distinct slugs instead of colliding.\n const parentDir = path.basename(path.dirname(file));\n const baseName = path.basename(file).replace(/\\.[^.]+$/, \"\");\n const slug = `${parentDir}-${baseName}`\n .replace(/[^a-z0-9]/gi, \"-\")\n .toLowerCase()\n .slice(0, 40);\n matches.push({\n kind: \"config_change\",\n signal: `Config file modified: ${file}`,\n proposed_type: \"convention\",\n proposed_slug: `config-change-${slug}`,\n proposed_body: [\n `# Config change: \\`${file}\\``,\n \"\",\n \"This configuration file was recently modified. The diff below captures the intent.\",\n \"Review and update this memory with the **reason** for the change if known.\",\n \"\",\n \"```diff\",\n diff.slice(0, MAX_DIFF_BYTES),\n \"```\",\n ].join(\"\\n\"),\n anchor_paths: [file],\n });\n }\n } catch { /* git not available or no history — skip */ }\n\n // ── Signals 2 & 3: usage log analysis ──────────────────────────────────\n const events = await readUsageEvents(ctx.paths);\n const cutoff = Date.now() - input.since_days * 24 * 60 * 60 * 1000;\n const recent = events.filter((e) => Date.parse(e.at) >= cutoff);\n\n // Build per-path occurrence counts from writing tools\n const pathCounts = new Map<string, { count: number; tools: Set<string> }>();\n for (const e of recent) {\n if (![\"mem_tried\", \"mem_observe\", \"mem_save\"].includes(e.tool)) continue;\n if (!e.summary) continue;\n // Extract file-like tokens from the summary\n const tokens = e.summary.match(/[^\\s\"'`,;()[\\]{}]+\\.[a-zA-Z]{1,6}/g) ?? [];\n for (const t of tokens) {\n const key = t.toLowerCase();\n const existing = pathCounts.get(key);\n if (existing) {\n existing.count++;\n existing.tools.add(e.tool);\n } else {\n pathCounts.set(key, { count: 1, tools: new Set([e.tool]) });\n }\n }\n }\n\n // Signal 2: REPEATED_PATH — path appears mostly in mem_tried / mem_observe\n for (const [p, { count, tools }] of pathCounts) {\n if (count < HOT_FILE_MIN) continue;\n const isGotchaSignal = tools.has(\"mem_tried\") || tools.has(\"mem_observe\");\n if (!isGotchaSignal) continue;\n const slug = p.replace(/[^a-z0-9]/g, \"-\").replace(/-+/g, \"-\").slice(0, 40);\n matches.push({\n kind: \"repeated_path\",\n signal: `Path '${p}' appears ${count}× in mem_tried/mem_observe events`,\n proposed_type: \"gotcha\",\n proposed_slug: `repeated-issue-${slug}`,\n proposed_body: [\n `# Recurring issue near \\`${p}\\``,\n \"\",\n `This file appeared ${count} times in failed-approach or observation events ` +\n `over the last ${input.since_days} days. ` +\n \"Review the related attempt/gotcha memories and consolidate them into a single authoritative gotcha.\",\n \"\",\n `**Source signals:** ${[...tools].join(\", \")} (${count} events)`,\n ].join(\"\\n\"),\n anchor_paths: [p],\n });\n }\n\n // Signal 3: HOT_FILE — any path appearing ≥ HOT_FILE_MIN times in any writing tool\n for (const [p, { count, tools }] of pathCounts) {\n if (count < HOT_FILE_MIN) continue;\n if (tools.has(\"mem_tried\") || tools.has(\"mem_observe\")) continue; // already covered by Signal 2\n // Only flag non-config source files\n if (CONFIG_PATTERNS.some((cp) => path.basename(p).includes(cp))) continue;\n const slug = p.replace(/[^a-z0-9]/g, \"-\").replace(/-+/g, \"-\").slice(0, 40);\n matches.push({\n kind: \"hot_file\",\n signal: `Path '${p}' referenced ${count}× across mem_save events`,\n proposed_type: \"convention\",\n proposed_slug: `hot-file-${slug}`,\n proposed_body: [\n `# Frequent edits to \\`${p}\\``,\n \"\",\n `This file was referenced ${count} times in memory-saving events over the last ` +\n `${input.since_days} days — a signal that a recurring pattern or convention applies here.`,\n \"\",\n \"**Suggested action:** review recent memories anchored to this path and extract the \" +\n \"common pattern as a named convention.\",\n ].join(\"\\n\"),\n anchor_paths: [p],\n });\n }\n\n if (matches.length === 0) {\n return {\n scanned_events: recent.length,\n matches: [],\n saved: 0,\n saved_ids: [],\n notice: `No patterns detected in the last ${input.since_days} days (${recent.length} events scanned).`,\n };\n }\n\n if (input.dry_run) {\n return { scanned_events: recent.length, matches, saved: 0, saved_ids: [] };\n }\n\n // ── Save proposed memories ──────────────────────────────────────────────\n const savedIds: string[] = [];\n for (const match of matches) {\n try {\n const fm = buildFrontmatter({\n type: match.proposed_type,\n slug: match.proposed_slug,\n scope: input.scope,\n tags: [\"pattern-detect\", match.kind],\n paths: match.anchor_paths,\n status: \"proposed\",\n });\n const file = memoryFilePath(\n ctx.paths,\n fm.scope === \"shared\" ? \"team\" : fm.scope,\n fm.id,\n undefined,\n );\n if (existsSync(file)) continue; // don't overwrite existing\n await mkdir(path.dirname(file), { recursive: true });\n await writeFile(\n file,\n serializeMemory({ frontmatter: fm, body: match.proposed_body }),\n \"utf8\",\n );\n savedIds.push(fm.id);\n } catch { /* skip failures — non-blocking */ }\n }\n\n return {\n scanned_events: recent.length,\n matches,\n saved: savedIds.length,\n saved_ids: savedIds,\n };\n}\n\n// ── Git helpers ────────────────────────────────────────────────────────────\n\nfunction gitChangedFiles(root: string, sinceDays: number): string[] {\n try {\n const out = execSync(\n `git log --name-only --pretty=\"\" --diff-filter=AM --since=\"${sinceDays} days ago\"`,\n { cwd: root, encoding: \"utf8\", timeout: 5000, stdio: [\"ignore\", \"pipe\", \"ignore\"] },\n );\n return [...new Set(out.split(\"\\n\").map((l) => l.trim()).filter(Boolean))];\n } catch {\n return [];\n }\n}\n\nfunction gitFileDiff(root: string, file: string, sinceDays: number): string | null {\n try {\n const out = execSync(\n `git log -p --follow --since=\"${sinceDays} days ago\" -- \"${file}\"`,\n { cwd: root, encoding: \"utf8\", timeout: 5000, stdio: [\"ignore\", \"pipe\", \"ignore\"] },\n );\n if (!out.trim()) return null;\n // Extract only the diff hunks (lines starting with +/- or @@)\n const diffLines = out.split(\"\\n\").filter((l) =>\n l.startsWith(\"+\") || l.startsWith(\"-\") || l.startsWith(\"@@\") || l.startsWith(\"diff\"),\n );\n return diffLines.join(\"\\n\").slice(0, MAX_DIFF_BYTES) || null;\n } catch {\n return null;\n }\n}\n","import { existsSync } from \"node:fs\";\nimport {\n findLexicalConflictPairs,\n findTopicStatusConflictPairs,\n loadMemoriesFromDir,\n planConflictResolution,\n type LoadedMemory,\n} from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\ninterface SuggestedResolution {\n keep_id: string;\n supersede_id: string;\n reason: string;\n /** Copy-paste command that APPLIES the guided supersede (promotes winner, deprecates loser). */\n command: string;\n}\n\n/**\n * Turn a detected pair into a guided action: which memory wins, which is superseded, and the exact\n * command to apply it. Detection without a recommended next step is just noise the team ignores.\n */\nfunction suggestResolution(\n byId: Map<string, LoadedMemory>,\n idA: string,\n idB: string,\n): SuggestedResolution | null {\n const a = byId.get(idA);\n const b = byId.get(idB);\n if (!a || !b) return null;\n const plan = planConflictResolution(a, b);\n return {\n keep_id: plan.keep_id,\n supersede_id: plan.supersede_id,\n reason: plan.reason,\n command: `haive memory resolve-conflict ${plan.keep_id} ${plan.supersede_id} --yes`,\n };\n}\n\nexport const MemConflictCandidatesInputSchema = {\n since_days: z\n .number()\n .int()\n .positive()\n .max(3650)\n .default(365)\n .describe(\"Only memories created since N days ago\"),\n types: z\n .array(z.enum([\"decision\", \"architecture\", \"convention\", \"gotcha\"]))\n .default([\"decision\", \"architecture\"])\n .describe(\"Memory types scanned for pairwise lexical overlap\"),\n min_jaccard: z\n .number()\n .min(0)\n .max(1)\n .default(0.45)\n .describe(\"Minimum Jaccard token similarity to surface as a candidate pair\"),\n max_pairs: z\n .number()\n .int()\n .positive()\n .max(100)\n .default(20)\n .describe(\"Cap pairs returned\"),\n max_scan: z\n .number()\n .int()\n .positive()\n .max(2000)\n .default(500)\n .describe(\"Maximum memories sampled for O(n²) scan — excess dropped after chronological sort.\"),\n max_topic_pairs: z\n .number()\n .int()\n .positive()\n .max(100)\n .default(20)\n .describe(\n \"Cap for extra signal: memories sharing the same topic with validated vs rejected status.\",\n ),\n};\n\nexport type MemConflictCandidatesInput = {\n [K in keyof typeof MemConflictCandidatesInputSchema]: z.infer<\n (typeof MemConflictCandidatesInputSchema)[K]\n >;\n};\n\nexport async function memConflictCandidates(\n input: MemConflictCandidatesInput,\n ctx: HaiveContext,\n) {\n if (!existsSync(ctx.paths.memoriesDir)) {\n return {\n pairs: [],\n topic_status_pairs: [],\n scanned: 0,\n truncated: false,\n notice: \"No .ai/memories directory.\",\n };\n }\n\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const byId = new Map<string, LoadedMemory>(all.map((m) => [m.memory.frontmatter.id, m]));\n const { pairs, scanned, truncated } = findLexicalConflictPairs(all, {\n sinceDays: input.since_days,\n types: input.types,\n minJaccard: input.min_jaccard,\n maxPairs: input.max_pairs,\n maxScan: input.max_scan,\n });\n const topicStatusPairs = findTopicStatusConflictPairs(all, input.max_topic_pairs);\n\n // Guided supersede: attach the deterministic winner/loser + apply command to every pair.\n const enrichedPairs = pairs.map((p) => ({\n ...p,\n suggested_resolution: suggestResolution(byId, p.id_a, p.id_b),\n }));\n const enrichedTopicStatusPairs = topicStatusPairs.map((p) => ({\n ...p,\n suggested_resolution: suggestResolution(byId, p.id_a, p.id_b),\n }));\n\n const notice =\n pairs.length === 0 && topicStatusPairs.length === 0\n ? \"No lexical or topic-status candidates — widen since_days/types or lower min_jaccard.\"\n : undefined;\n\n return {\n pairs: enrichedPairs,\n topic_status_pairs: enrichedTopicStatusPairs,\n scanned,\n truncated,\n notice,\n };\n}\n","import { resolveProjectInfo } from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\n/** Input is intentionally minimal — callers may pass cwd for multi-root clients. */\nexport const MemResolveProjectInputSchema = {\n cwd: z\n .string()\n .optional()\n .describe(\"Directory used for root discovery when HAIVE_PROJECT_ROOT is unset.\"),\n};\n\nexport type MemResolveProjectInput = {\n [K in keyof typeof MemResolveProjectInputSchema]: z.infer<(typeof MemResolveProjectInputSchema)[K]>;\n};\n\nexport async function memResolveProject(\n input: MemResolveProjectInput,\n _ctx: HaiveContext,\n): Promise<{ info: ReturnType<typeof resolveProjectInfo>; ok: true }> {\n void _ctx;\n return {\n ok: true,\n info: resolveProjectInfo({\n cwd: input.cwd,\n }),\n };\n}\n","import { MemoryTypeSchema, suggestTopicKey } from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemSuggestTopicInputSchema = {\n type: MemoryTypeSchema.describe(\"Memory kind — drives the suggested topic family.\"),\n title: z\n .string()\n .min(1)\n .describe(\"Short title or phrase (headers, headings) — turned into slug\"),\n};\n\nexport type MemSuggestTopicInput = {\n [K in keyof typeof MemSuggestTopicInputSchema]: z.infer<(typeof MemSuggestTopicInputSchema)[K]>;\n};\n\nexport async function memSuggestTopic(\n input: MemSuggestTopicInput,\n _ctx: HaiveContext,\n): Promise<{ topic_key: string; family: string; type: string }> {\n void _ctx;\n const suggestion = suggestTopicKey(input.type, input.title);\n return { topic_key: suggestion.topic_key, family: suggestion.family, type: input.type };\n}\n","import { existsSync } from \"node:fs\";\nimport { collectTimelineEntries, loadMemoriesFromDir } from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const MemTimelineInputSchema = {\n memory_id: z.string().optional().describe(\"Seed id — expands via related_ids, topic, anchors\"),\n topic: z\n .string()\n .optional()\n .describe(\"Frontmatter.topic value — chronological list when memory_id omitted\"),\n limit: z\n .number()\n .int()\n .positive()\n .max(100)\n .default(30)\n .describe(\"Max timeline entries returned\"),\n};\n\nexport type MemTimelineInput = {\n [K in keyof typeof MemTimelineInputSchema]: z.infer<(typeof MemTimelineInputSchema)[K]>;\n};\n\nexport async function memTimeline(input: MemTimelineInput, ctx: HaiveContext) {\n if (!existsSync(ctx.paths.memoriesDir)) {\n return { entries: [], total: 0, notice: \"No .ai/memories directory.\" };\n }\n\n const all = await loadMemoriesFromDir(ctx.paths.memoriesDir);\n const { entries, notice } = collectTimelineEntries(all, {\n memoryId: input.memory_id,\n topic: input.topic,\n limit: input.limit,\n });\n return { entries, total: entries.length, notice };\n}\n","import { appendRuntimeJournalEntry } from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const RuntimeJournalAppendInputSchema = {\n message: z.string().min(1).describe(\"Short line to append to the runtime session journal\"),\n kind: z.enum([\"note\", \"session_end\", \"mcp\"]).default(\"note\"),\n tool: z.string().optional().describe(\"When kind=mcp, which tool name (optional)\"),\n};\n\nexport type RuntimeJournalAppendInput = {\n [K in keyof typeof RuntimeJournalAppendInputSchema]: z.infer<\n (typeof RuntimeJournalAppendInputSchema)[K]\n >;\n};\n\nexport async function runtimeJournalAppend(\n input: RuntimeJournalAppendInput,\n ctx: HaiveContext,\n): Promise<{ ok: true; path_hint: string }> {\n await appendRuntimeJournalEntry(ctx.paths, {\n kind: input.kind,\n message: input.message,\n ...(input.tool ? { tool: input.tool } : {}),\n });\n return {\n ok: true,\n path_hint: `${ctx.paths.runtimeDir}/session-journal.ndjson`,\n };\n}\n","import { readRuntimeJournalTail } from \"@hiveai/core\";\nimport { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const RuntimeJournalTailInputSchema = {\n limit: z\n .number()\n .int()\n .positive()\n .max(500)\n .default(30)\n .describe(\"Last N journal entries to return\"),\n};\n\nexport type RuntimeJournalTailInput = {\n [K in keyof typeof RuntimeJournalTailInputSchema]: z.infer<\n (typeof RuntimeJournalTailInputSchema)[K]\n >;\n};\n\nexport async function runtimeJournalTail(\n input: RuntimeJournalTailInput,\n ctx: HaiveContext,\n): Promise<{ entries: Awaited<ReturnType<typeof readRuntimeJournalTail>>; empty?: boolean }> {\n const entries = await readRuntimeJournalTail(ctx.paths, input.limit);\n if (entries.length === 0) {\n return { entries: [], empty: true };\n }\n return { entries };\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","import { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const PostTaskArgsSchema = {\n task_summary: z\n .string()\n .optional()\n .describe(\"One sentence describing what you just did\"),\n files_touched: z\n .array(z.string())\n .optional()\n .describe(\"Files you created or modified during the task\"),\n};\n\nexport type PostTaskArgs = {\n [K in keyof typeof PostTaskArgsSchema]: z.infer<(typeof PostTaskArgsSchema)[K]>;\n};\n\nexport function postTaskPrompt(\n args: PostTaskArgs,\n ctx: HaiveContext,\n): { description: string; messages: Array<{ role: \"user\"; content: { type: \"text\"; text: string } }> } {\n const taskLine = args.task_summary ? `\\nTask just completed: **${args.task_summary}**` : \"\";\n const filesLine =\n args.files_touched && args.files_touched.length > 0\n ? `\\nFiles touched: ${args.files_touched.map((f) => `\\`${f}\\``).join(\", \")}`\n : \"\";\n\n const text = `You have just finished a task. Before closing this session, take 60 seconds to capture what you learned.\n${taskLine}${filesLine}\n\nProject root: \\`${ctx.paths.root}\\`\n\n## Checklist — answer each question honestly\n\nGo through each item. If the answer is yes, call the corresponding tool immediately.\n\n### 0. Did you read existing code and discover bugs, inconsistencies, or security gaps that weren't in the briefing?\nThis is the most important question. Deep code reading surfaces issues that no memory captures yet.\nExamples of things to look for:\n- A method with an invalid signature (e.g. two \\`@RequestBody\\` on the same handler)\n- A configuration that looks wrong or missing (e.g. webhook path not whitelisted in SecurityConfig)\n- A component scan / DI issue (e.g. a Spring bean not picked up because the package isn't scanned)\n- A DB constraint that will break when you add a new enum value\n- A hardcoded value that should be dynamic (e.g. hardcoded tenant id \"default-tenant\")\n- Anything that will silently break in production\n\n→ If yes, call **\\`mem_save\\`** with \\`type=\"gotcha\"\\`, \\`scope=\"team\"\\`, and **anchor it to the file** with \\`paths\\`.\n This transforms your discovery into institutional knowledge that protects every future agent.\n\n### 1. Did you try an approach that failed?\n→ If yes, call **\\`mem_tried\\`** with:\n - \\`what\\`: the approach you tried (e.g. \"importing gray-matter with ESM dynamic import\")\n - \\`why_failed\\`: why it didn't work\n - \\`instead\\`: what worked instead\n - \\`scope\\`: \"team\" if others will hit the same issue, \"personal\" if specific to your setup\n - \\`paths\\`: the files where the issue manifested\n\n### 2. Did you discover a convention that isn't documented?\n→ If yes, call **\\`mem_save\\`** with \\`type=\"convention\"\\` and \\`scope=\"team\"\\`\n\n### 3. Did you make an architectural decision?\n→ If yes, call **\\`mem_save\\`** with \\`type=\"decision\"\\` and document the WHY (constraints, tradeoffs), not just the what\n\n### 4. Did you hit a non-obvious bug or surprising behavior in a library or framework?\n→ If yes, call **\\`mem_save\\`** with \\`type=\"gotcha\"\\` and anchor it to the relevant file paths\n\n### 5. Did you find that an existing memory is outdated or wrong?\n→ If yes, call **\\`mem_update\\`** with the correct information, or **\\`mem_reject\\`** if it's completely wrong\n\n## Rules\n\n- One memory per insight. Don't cram multiple lessons into one body.\n- Anchor memories to file paths when possible (the \\`paths\\` field) — this enables staleness detection.\n- Prefer \\`scope=\"team\"\\` for anything a teammate or future agent would benefit from.\n- Skip sections where you genuinely have nothing to add. Don't fabricate memories.\n- **Question 0 is not optional** — always scan your exploration history for code-level discoveries.\n\n### 6. Close the session — always\nCall **\\`mem_session_end\\`** with:\n- \\`goal\\`: what you set out to do\n- \\`accomplished\\`: what was actually done (bullet list)\n- \\`discoveries\\`: anything surprising or broken found during this session (leave empty if none)\n- \\`files_touched\\`: the key files you read or modified\n- \\`next_steps\\`: what remains for the next session or a teammate\n- \\`scope\\`: \"team\" if this task affects the whole team, \"personal\" otherwise\n\nThis creates/updates a single rolling recap that **get_briefing automatically surfaces** at the start of every subsequent session — no token waste re-explaining what happened.\n\nCalling \\`mem_session_end\\` also **clears the pending-distill marker** (if any), confirming that this session's learnings have been properly captured rather than left as an auto-recap skeleton.\n\n### 7. Verify the git/release/pipeline exit protocol — always\nRun **\\`haive enforce finish\\`** before your final response.\n\nThis executable gate checks the multi-agent git-sync decision:\n- no completed work is left as an uncommitted local diff\n- shippable package changes have a lockstep version bump\n- the release tag \\`vX.Y.Z\\` exists when a version was bumped\n- commits and tags have been pushed\n- the pushed HEAD's GitHub Actions workflow runs have completed successfully when the repo has a GitHub remote\n- agents never run \\`npm publish\\` (publication remains human-owned)\n\nIf it blocks, fix the reported Git/version/tag/push/pipeline issue before telling the developer the task is done.\n\nWhen done, respond with a brief summary: \"Saved N memories: [list of IDs]. Session recap saved. hAIve finish gate passed; GitHub Actions passed when applicable.\"\n`;\n\n\n return {\n description: \"Post-task reflection: capture what you learned before closing the session\",\n messages: [\n {\n role: \"user\",\n content: { type: \"text\", text },\n },\n ],\n };\n}\n","import { z } from \"zod\";\nimport type { HaiveContext } from \"../context.js\";\n\nexport const ImportDocsArgsSchema = {\n content: z\n .string()\n .describe(\"The documentation content to analyze and import as memories (Markdown, README, ADR, etc.)\"),\n source: z\n .string()\n .optional()\n .describe(\"Origin of the content (file path, URL, or document title) — used to anchor memories\"),\n scope: z\n .enum([\"personal\", \"team\"])\n .default(\"team\")\n .describe(\"Scope to assign to created memories\"),\n dry_run: z\n .boolean()\n .default(false)\n .describe(\"If true, describe what would be saved without actually calling mem_save\"),\n};\n\nexport type ImportDocsArgs = {\n [K in keyof typeof ImportDocsArgsSchema]: z.infer<(typeof ImportDocsArgsSchema)[K]>;\n};\n\nexport function importDocsPrompt(\n args: ImportDocsArgs,\n ctx: HaiveContext,\n): { description: string; messages: Array<{ role: \"user\"; content: { type: \"text\"; text: string } }> } {\n const sourceLine = args.source ? `\\nSource: **${args.source}**` : \"\";\n const dryRunNote = args.dry_run\n ? \"\\n> **DRY RUN** — describe what you would save but do not call any tools.\"\n : \"\";\n\n const text = `You are given documentation to analyze and import into the hAIve memory system.\n${sourceLine}\nScope: **${args.scope}**\nProject root: \\`${ctx.paths.root}\\`\n${dryRunNote}\n\n## Your task\n\nRead the documentation below and extract actionable memories. For each distinct piece of knowledge:\n\n1. **Identify the memory type** — which category fits best?\n - \\`convention\\` — how things are done here (naming, patterns, workflow)\n - \\`decision\\` — a choice that was made and why (tradeoffs, constraints)\n - \\`gotcha\\` — non-obvious behavior, traps, things that surprise newcomers\n - \\`architecture\\` — structural overview of a system or module\n - \\`glossary\\` — domain terms and their meaning in this project\n\n2. **Determine the anchor** — which files or symbols does this knowledge apply to? List them in \\`paths\\`.\n\n3. **Write a focused body** — one memory = one insight. Do not combine multiple unrelated facts.\n - Start with the key fact or rule\n - Add context: why it matters, when it applies\n - Add examples if helpful\n\n4. **Call \\`mem_save\\`** for each memory (unless dry_run).\n - Set \\`scope=\"${args.scope}\"\\`\n - Set \\`slug\\` to a short kebab-case identifier\n - Set \\`paths\\` to the relevant file paths (extracted from the doc if present)\n\n## Rules\n\n- Skip generic documentation that applies to any project (e.g., \"install with npm install\").\n- Prioritize gotchas, non-obvious decisions, and domain-specific conventions.\n- If the same knowledge is repeated in different sections, save it once.\n- Maximum 10 memories per import — select the most actionable ones.\n\n## Documentation to import\n\n---\n\n${args.content}\n\n---\n\nWhen done, respond with: \"Imported N memories: [list of IDs]\" or \"Nothing actionable found.\"\n`;\n\n return {\n description: \"Import documentation as hAIve memories\",\n messages: [\n {\n role: \"user\",\n content: { type: \"text\", text },\n },\n ],\n };\n}\n","import {\n parseMcpCliArgs,\n printHaiveMcpVersion,\n runHaiveMcpStdio,\n} from \"./server.js\";\n\nconst parsed = parseMcpCliArgs(process.argv);\nif (parsed.versionOnly) {\n printHaiveMcpVersion();\n process.exit(0);\n}\n\nrunHaiveMcpStdio({ root: parsed.root }).catch((err: unknown) => {\n console.error(\"[haive-mcp] fatal:\", err instanceof Error ? err.message : err);\n process.exit(1);\n});\n"],"mappings":"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","names":["existsSync","path","z","existsSync","z","mkdir","writeFile","existsSync","path","loadMemoriesFromDir","z","existsSync","loadMemoriesFromDir","z","top","writeFile","existsSync","loadMemoriesFromDir","serializeMemory","z","writeFile","existsSync","loadMemoriesFromDir","loadUsageIndex","serializeMemory","z","getUsage","loadMemoriesFromDir","loadUsageIndex","recordRejection","saveUsageIndex","serializeMemory","existsSync","writeFile","z","readFile","readdir","existsSync","path","deriveConfidence","getUsage","loadMemoriesFromDir","loadUsageIndex","trackReads","z","existsSync","deriveConfidence","getUsage","loadMemoriesFromDir","loadUsageIndex","z","existsSync","loadMemoriesFromDir","loadUsageIndex","saveUsageIndex","z","writeFile","existsSync","loadMemoriesFromDir","serializeMemory","z","existsSync","getUsage","loadMemoriesFromDir","loadUsageIndex","z","writeFile","existsSync","loadMemoriesFromDir","serializeMemory","z","mkdir","writeFile","existsSync","path","buildFrontmatter","memoryFilePath","serializeMemory","suggestSensorFromMemory","z","existsSync","mkdir","readFile","writeFile","path","loadMemoriesFromDir","memoryFilePath","serializeMemory","z","mkdir","writeFile","existsSync","path","buildFrontmatter","memoryFilePath","serializeMemory","z","writeFile","mkdir","existsSync","path","buildFrontmatter","loadMemoriesFromDir","memoryFilePath","serializeMemory","z","loadConfig","mkdir","writeFile","existsSync","path","path","loadConfig","existsSync","mkdir","writeFile","z","existsSync","path","loadMemoriesFromDir","writeFile","serializeMemory","buildFrontmatter","memoryFilePath","mkdir","readFile","writeFile","existsSync","path","computeImpact","deriveConfidence","getUsage","inferModulesFromPaths","literalMatchesAllTokens","literalMatchesAnyToken","loadConfig","loadMemoriesFromDir","loadUsageIndex","memoryMatchesAnchorPaths","rankMemoriesLexical","serializeMemory","tokenizeQuery","trackReads","z","readdir","readFile","existsSync","path","loadModuleContexts","z","inferModulesFromPaths","existsSync","loadMemoriesFromDir","loadUsageIndex","getUsage","computeImpact","deriveConfidence","memoryMatchesAnchorPaths","tokenizeQuery","literalMatchesAllTokens","literalMatchesAnyToken","rankMemoriesLexical","trackReads","loadConfig","writeFile","serializeMemory","readFile","loadModuleContexts","rm","path","estimateTokens","loadCodeMap","queryCodeMap","z","existsSync","loadMemoriesFromDir","z","existsSync","loadMemoriesFromDir","z","z","z","z","existsSync","path","deriveConfidence","getUsage","loadCodeMap","loadMemoriesFromDir","loadUsageIndex","memoryMatchesAnchorPaths","z","existsSync","deriveConfidence","getUsage","isRetiredMemory","loadMemoriesFromDir","loadUsageIndex","literalMatchesAnyToken","memoryMatchesAnchorPaths","tokenizeQuery","z","existsSync","loadMemoriesFromDir","tokenizeQuery","z","existsSync","spawn","deriveConfidence","getUsage","loadMemoriesFromDir","loadUsageIndex","z","runGitLog","runCommand","existsSync","deriveConfidence","getUsage","loadMemoriesFromDir","loadUsageIndex","pathsOverlap","tokenizeQuery","z","z","z","mkdir","writeFile","existsSync","path","execSync","buildFrontmatter","memoryFilePath","serializeMemory","z","existsSync","loadMemoriesFromDir","z","z","z","existsSync","loadMemoriesFromDir","z","appendRuntimeJournalEntry","z","z","z","z","z"]}