hebbian 0.5.3 → 0.7.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/bin/hebbian.js +228 -41
- package/dist/bin/hebbian.js.map +1 -1
- package/dist/constants.d.ts +6 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/digest.d.ts +47 -0
- package/dist/digest.d.ts.map +1 -1
- package/dist/evolve.d.ts +2 -1
- package/dist/evolve.d.ts.map +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +177 -24
- package/dist/index.js.map +1 -1
- package/dist/init.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/bin/hebbian.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/constants.ts","../../src/init.ts","../../src/scanner.ts","../../src/subsumption.ts","../../src/emit.ts","../../src/update-check.ts","../../src/fire.ts","../../src/similarity.ts","../../src/grow.ts","../../src/rollback.ts","../../src/signal.ts","../../src/decay.ts","../../src/dedup.ts","../../src/snapshot.ts","../../src/watch.ts","../../src/candidates.ts","../../src/episode.ts","../../src/inbox.ts","../../src/api.ts","../../src/hooks.ts","../../src/digest.ts","../../src/outcome.ts","../../src/evolve.ts","../../src/doctor.ts","../../src/cli.ts"],"sourcesContent":["// hebbian — Constants & Configuration\n//\n// AXIOMS:\n// 1. Folder = Neuron (name is meaning, depth is specificity)\n// 2. File = Firing Trace (N.neuron = counter, dopamineN = reward, bomb = pain)\n// 3. Path = Sentence (brain/cortex/quality/no_hardcoded → \"cortex > quality > no_hardcoded\")\n// 4. Counter = Activation (higher = stronger/myelinated path)\n// 5. AI writes back (counter increment = experience growth)\n\nexport const REGIONS = [\n\t'brainstem',\n\t'limbic',\n\t'hippocampus',\n\t'sensors',\n\t'cortex',\n\t'ego',\n\t'prefrontal',\n] as const;\n\nexport type RegionName = (typeof REGIONS)[number];\n\nexport const REGION_PRIORITY: Record<RegionName, number> = {\n\tbrainstem: 0,\n\tlimbic: 1,\n\thippocampus: 2,\n\tsensors: 3,\n\tcortex: 4,\n\tego: 5,\n\tprefrontal: 6,\n};\n\nexport const REGION_ICONS: Record<RegionName, string> = {\n\tbrainstem: '🛡️',\n\tlimbic: '💓',\n\thippocampus: '📝',\n\tsensors: '👁️',\n\tcortex: '🧠',\n\tego: '🎭',\n\tprefrontal: '🎯',\n};\n\nexport const REGION_KO: Record<RegionName, string> = {\n\tbrainstem: '양심/본능',\n\tlimbic: '감정 필터',\n\thippocampus: '기록/기억',\n\tsensors: '환경 제약',\n\tcortex: '지식/기술',\n\tego: '성향/톤',\n\tprefrontal: '목표/계획',\n};\n\nexport const EMIT_THRESHOLD = 5;\nexport const SPOTLIGHT_DAYS = 7;\nexport const JACCARD_THRESHOLD = 0.6;\nexport const DECAY_DAYS = 30;\nexport const MAX_DEPTH = 6;\n\nexport const EMIT_TARGETS: Record<string, string> = {\n\tgemini: '.gemini/GEMINI.md',\n\tcursor: '.cursorrules',\n\tclaude: 'CLAUDE.md',\n\tcopilot: '.github/copilot-instructions.md',\n\tgeneric: '.neuronrc',\n};\n\nexport const SIGNAL_TYPES = ['dopamine', 'bomb', 'memory'] as const;\nexport type SignalType = (typeof SIGNAL_TYPES)[number];\n\nexport const MARKER_START = '<!-- HEBBIAN:START -->';\nexport const MARKER_END = '<!-- HEBBIAN:END -->';\n\n// Hook ownership marker — used to identify hebbian-managed hooks in settings.local.json\nexport const HOOK_MARKER = '[hebbian]';\n\n// Digest constants\nexport const MAX_CORRECTIONS_PER_SESSION = 10;\nexport const MIN_CORRECTION_LENGTH = 15;\nexport const DIGEST_LOG_DIR = 'hippocampus/digest_log';\n\n// Phase 5: Outcome tracking\nexport const OUTCOME_TYPES = ['revert', 'acceptance'] as const;\nexport type OutcomeType = (typeof OUTCOME_TYPES)[number];\nexport const SESSION_STATE_DIR = 'hippocampus/session_state';\nexport const PROTECTED_REGIONS_CONTRA = ['brainstem', 'limbic', 'sensors'];\n\nimport { resolve } from 'node:path';\nimport { existsSync } from 'node:fs';\n\n/** Resolve brain root path from flag, env var, or defaults */\nexport function resolveBrainRoot(brainFlag?: string): string {\n\tif (brainFlag) return resolve(brainFlag);\n\tif (process.env.HEBBIAN_BRAIN) return resolve(process.env.HEBBIAN_BRAIN);\n\tif (existsSync(resolve('./brain'))) return resolve('./brain');\n\treturn resolve(process.env.HOME || '~', 'hebbian', 'brain');\n}\n","// hebbian — Brain Initialization\n//\n// Creates a brain directory with 7 canonical regions and starter neurons.\n// Each region gets a _rules.md explaining its purpose.\n\nimport { mkdirSync, writeFileSync, existsSync, readdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { REGIONS, REGION_ICONS, REGION_KO } from './constants';\nimport type { RegionName } from './constants';\n\ninterface RegionTemplate {\n\tdescription: string;\n\tstarters: string[];\n}\n\nconst REGION_TEMPLATES: Record<RegionName, RegionTemplate> = {\n\tbrainstem: {\n\t\tdescription: 'Absolute principles. Immutable. Read-only conscience.\\nP0 — highest priority. bomb here halts EVERYTHING.',\n\t\tstarters: ['NO_fallback', 'DO_execute_not_debate'],\n\t},\n\tlimbic: {\n\t\tdescription: 'Emotional filters and somatic markers.\\nP1 — automatic, influences downstream regions.',\n\t\tstarters: [],\n\t},\n\thippocampus: {\n\t\tdescription: 'Memory and episode recording.\\nP2 — accumulated experience, session logs.',\n\t\tstarters: [],\n\t},\n\tsensors: {\n\t\tdescription: 'Environment constraints and input validation.\\nP3 — read-only, set by environment.',\n\t\tstarters: [],\n\t},\n\tcortex: {\n\t\tdescription: 'Knowledge and skills. The largest region.\\nP4 — learnable, grows with corrections.',\n\t\tstarters: [],\n\t},\n\tego: {\n\t\tdescription: 'Personality, tone, and communication style.\\nP5 — set by user preference.',\n\t\tstarters: [],\n\t},\n\tprefrontal: {\n\t\tdescription: 'Goals, projects, and planning.\\nP6 — lowest priority, longest time horizon.',\n\t\tstarters: [],\n\t},\n};\n\n/**\n * Initialize a new brain directory with 7 regions.\n */\nexport function initBrain(brainPath: string): void {\n\tif (existsSync(brainPath)) {\n\t\tconst entries = readdirSync(brainPath);\n\t\tif (entries.some((e) => (REGIONS as readonly string[]).includes(e))) {\n\t\t\tconsole.log(`\\u{26A0}\\uFE0F Brain already exists at ${brainPath}`);\n\t\t\treturn;\n\t\t}\n\t}\n\n\tmkdirSync(brainPath, { recursive: true });\n\n\tfor (const regionName of REGIONS) {\n\t\tconst regionDir = join(brainPath, regionName);\n\t\tmkdirSync(regionDir, { recursive: true });\n\n\t\tconst template = REGION_TEMPLATES[regionName];\n\t\tconst icon = REGION_ICONS[regionName];\n\t\tconst ko = REGION_KO[regionName];\n\n\t\t// Write _rules.md template\n\t\twriteFileSync(\n\t\t\tjoin(regionDir, '_rules.md'),\n\t\t\t`# ${icon} ${regionName} (${ko})\\n\\n${template.description}\\n`,\n\t\t\t'utf8',\n\t\t);\n\n\t\t// Create starter neurons\n\t\tfor (const starter of template.starters) {\n\t\t\tconst neuronDir = join(regionDir, starter);\n\t\t\tmkdirSync(neuronDir, { recursive: true });\n\t\t\twriteFileSync(join(neuronDir, '1.neuron'), '', 'utf8');\n\t\t}\n\t}\n\n\t// Create _agents inbox\n\tmkdirSync(join(brainPath, '_agents', 'global_inbox'), { recursive: true });\n\n\tconsole.log(`\\u{1F9E0} Brain initialized at ${brainPath}`);\n\tconsole.log(` 7 regions created: ${REGIONS.join(', ')}`);\n\tconsole.log('');\n\tconsole.log(' Next steps:');\n\tconsole.log(` hebbian grow brainstem/NO_your_rule --brain ${brainPath}`);\n\tconsole.log(` hebbian emit claude --brain ${brainPath}`);\n}\n","// hebbian — Brain Filesystem Scanner\n//\n// Walks the brain directory tree and builds a structured representation.\n// Folders = neurons. Files = firing traces. Paths = sentences.\n//\n// Scan order follows subsumption priority (P0 brainstem → P6 prefrontal).\n// Only recognizes the 7 canonical region names at the top level.\n\nimport { readdirSync, statSync, readFileSync, existsSync } from 'node:fs';\nimport { join, relative, sep } from 'node:path';\nimport { REGIONS, REGION_PRIORITY, MAX_DEPTH } from './constants';\nimport type { Neuron, Region, Brain } from './types';\n\n/**\n * Scan a brain directory and return all regions with their neurons.\n */\nexport function scanBrain(brainRoot: string): Brain {\n\tconst regions: Region[] = [];\n\n\tfor (const regionName of REGIONS) {\n\t\tconst regionPath = join(brainRoot, regionName);\n\t\tif (!existsSync(regionPath)) {\n\t\t\tregions.push({\n\t\t\t\tname: regionName,\n\t\t\t\tpriority: REGION_PRIORITY[regionName],\n\t\t\t\tpath: regionPath,\n\t\t\t\tneurons: [],\n\t\t\t\taxons: [],\n\t\t\t\thasBomb: false,\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst neurons = walkRegion(regionPath, regionPath, 0);\n\t\tconst axons = readAxons(regionPath);\n\t\tconst hasBomb = neurons.some((n) => n.hasBomb);\n\n\t\tregions.push({\n\t\t\tname: regionName,\n\t\t\tpriority: REGION_PRIORITY[regionName],\n\t\t\tpath: regionPath,\n\t\t\tneurons,\n\t\t\taxons,\n\t\t\thasBomb,\n\t\t});\n\t}\n\n\treturn { root: brainRoot, regions };\n}\n\n/**\n * Recursively walk a region directory and collect neurons.\n * A neuron is any directory that contains at least one trace file\n * (*.neuron, *.contra, *.dormant, bomb.neuron).\n */\nfunction walkRegion(dir: string, regionRoot: string, depth: number): Neuron[] {\n\tif (depth > MAX_DEPTH) return [];\n\n\tconst neurons: Neuron[] = [];\n\tlet entries;\n\n\ttry {\n\t\tentries = readdirSync(dir, { withFileTypes: true });\n\t} catch {\n\t\treturn [];\n\t}\n\n\t// Parse trace files in this directory\n\tlet counter = 0;\n\tlet contra = 0;\n\tlet dopamine = 0;\n\tlet hasBomb = false;\n\tlet hasMemory = false;\n\tlet isDormant = false;\n\tlet modTime = new Date(0);\n\tlet hasTraceFile = false;\n\n\tfor (const entry of entries) {\n\t\tif (entry.name.startsWith('_')) continue;\n\n\t\tif (entry.isFile()) {\n\t\t\tconst name = entry.name;\n\n\t\t\t// N.neuron — excitatory counter\n\t\t\tif (name.endsWith('.neuron') && !name.startsWith('dopamine') && !name.startsWith('memory') && name !== 'bomb.neuron') {\n\t\t\t\tconst n = parseInt(name, 10);\n\t\t\t\tif (!isNaN(n) && n > counter) {\n\t\t\t\t\tcounter = n;\n\t\t\t\t\thasTraceFile = true;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst st = statSync(join(dir, name));\n\t\t\t\t\t\tif (st.mtime > modTime) modTime = st.mtime;\n\t\t\t\t\t} catch {}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// N.contra — inhibitory counter\n\t\t\tif (name.endsWith('.contra')) {\n\t\t\t\tconst n = parseInt(name, 10);\n\t\t\t\tif (!isNaN(n) && n > contra) {\n\t\t\t\t\tcontra = n;\n\t\t\t\t\thasTraceFile = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// dopamineN.neuron — reward signal\n\t\t\tif (name.startsWith('dopamine') && name.endsWith('.neuron')) {\n\t\t\t\tconst n = parseInt(name.replace('dopamine', ''), 10);\n\t\t\t\tif (!isNaN(n) && n > dopamine) {\n\t\t\t\t\tdopamine = n;\n\t\t\t\t\thasTraceFile = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// bomb.neuron — circuit breaker\n\t\t\tif (name === 'bomb.neuron') {\n\t\t\t\thasBomb = true;\n\t\t\t\thasTraceFile = true;\n\t\t\t}\n\n\t\t\t// memoryN.neuron — memory signal\n\t\t\tif (name.startsWith('memory') && name.endsWith('.neuron')) {\n\t\t\t\thasMemory = true;\n\t\t\t\thasTraceFile = true;\n\t\t\t}\n\n\t\t\t// *.dormant — dormancy marker\n\t\t\tif (name.endsWith('.dormant')) {\n\t\t\t\tisDormant = true;\n\t\t\t\thasTraceFile = true;\n\t\t\t}\n\t\t}\n\t}\n\n\t// If this directory has trace files, it's a neuron\n\tif (hasTraceFile) {\n\t\tconst relPath = relative(regionRoot, dir) || '.';\n\t\tconst folderName = dir.split(sep).pop() || '';\n\t\tconst total = counter + contra + dopamine;\n\t\tconst intensity = counter - contra + dopamine;\n\t\tconst polarity = total > 0 ? intensity / total : 0;\n\n\t\tneurons.push({\n\t\t\tname: folderName,\n\t\t\tpath: relPath,\n\t\t\tfullPath: dir,\n\t\t\tcounter,\n\t\t\tcontra,\n\t\t\tdopamine,\n\t\t\tintensity,\n\t\t\tpolarity: Math.round(polarity * 100) / 100,\n\t\t\thasBomb,\n\t\t\thasMemory,\n\t\t\tisDormant,\n\t\t\tdepth,\n\t\t\tmodTime,\n\t\t});\n\t}\n\n\t// Recurse into subdirectories\n\tfor (const entry of entries) {\n\t\tif (entry.name.startsWith('_') || entry.name.startsWith('.')) continue;\n\t\tif (entry.isDirectory()) {\n\t\t\tconst subNeurons = walkRegion(join(dir, entry.name), regionRoot, depth + 1);\n\t\t\tneurons.push(...subNeurons);\n\t\t}\n\t}\n\n\treturn neurons;\n}\n\n/**\n * Read .axon file from a region directory.\n */\nfunction readAxons(regionPath: string): string[] {\n\tconst axonPath = join(regionPath, '.axon');\n\tif (!existsSync(axonPath)) return [];\n\ttry {\n\t\tconst content = readFileSync(axonPath, 'utf8').trim();\n\t\treturn content.split(/[\\n,]+/).map((s: string) => s.trim()).filter(Boolean);\n\t} catch {\n\t\treturn [];\n\t}\n}\n","// hebbian — Subsumption Cascade Engine\n//\n// Implements Brooks' subsumption architecture:\n// - Lower priority (P0) always suppresses higher priority (P6)\n// - bomb.neuron in any region halts all downstream regions\n// - Dormant neurons are excluded from activation counts\n//\n// Cascade flow:\n// P0 brainstem → P1 limbic → P2 hippocampus → P3 sensors → P4 cortex → P5 ego → P6 prefrontal\n// If bomb at P(n), all P(n+1)→P6 are BLOCKED.\n\nimport type { Brain, Region, SubsumptionResult } from './types';\n\n/**\n * Run the subsumption cascade on a scanned brain.\n */\nexport function runSubsumption(brain: Brain): SubsumptionResult {\n\tconst activeRegions: Region[] = [];\n\tconst blockedRegions: Region[] = [];\n\tlet bombSource = '';\n\tlet firedNeurons = 0;\n\tlet totalNeurons = 0;\n\tlet totalCounter = 0;\n\tlet blocked = false;\n\n\tfor (const region of brain.regions) {\n\t\ttotalNeurons += region.neurons.length;\n\n\t\tif (blocked) {\n\t\t\tblockedRegions.push(region);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (region.hasBomb) {\n\t\t\tbombSource = region.name;\n\t\t\tblockedRegions.push(region);\n\t\t\tblocked = true;\n\t\t\tcontinue;\n\t\t}\n\n\t\tactiveRegions.push(region);\n\n\t\tfor (const neuron of region.neurons) {\n\t\t\tif (!neuron.isDormant) {\n\t\t\t\tfiredNeurons++;\n\t\t\t\ttotalCounter += neuron.counter;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {\n\t\tactiveRegions,\n\t\tblockedRegions,\n\t\tbombSource,\n\t\tfiredNeurons,\n\t\ttotalNeurons,\n\t\ttotalCounter,\n\t};\n}\n","// hebbian — 3-Tier Emit System + Multi-Target Output\n//\n// Tier 1: Bootstrap (~500 tokens) — auto-loaded by AI (CLAUDE.md, .cursorrules, etc.)\n// Tier 2: _index.md — brain overview (AI reads at conversation start)\n// Tier 3: {region}/_rules.md — per-region detail (AI reads on demand)\n//\n// Multi-target: claude, cursor, gemini, copilot, generic, all\n\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { scanBrain } from './scanner';\nimport { runSubsumption } from './subsumption';\nimport {\n\tREGIONS, REGION_ICONS, REGION_KO, EMIT_TARGETS,\n\tEMIT_THRESHOLD, SPOTLIGHT_DAYS, MARKER_START, MARKER_END,\n} from './constants';\nimport type { RegionName } from './constants';\nimport type { Neuron, Region, Brain, SubsumptionResult } from './types';\n\n// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n// TIER 1: Bootstrap (~500 tokens)\n// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n/**\n * Generate Tier 1 bootstrap content.\n */\nexport function emitBootstrap(result: SubsumptionResult, brain: Brain): string {\n\tconst lines: string[] = [];\n\tconst now = new Date().toISOString().replace(/\\.\\d+Z$/, '');\n\n\tlines.push(MARKER_START);\n\tlines.push(`<!-- Generated: ${now} -->`);\n\tlines.push('<!-- Axiom: Folder=Neuron | File=Trace | Path=Sentence -->');\n\tlines.push(`<!-- Active: ${result.firedNeurons}/${result.totalNeurons} neurons | Total activation: ${result.totalCounter} -->`);\n\tlines.push('');\n\n\t// Circuit breaker\n\tif (result.bombSource) {\n\t\tlines.push(`## \\u{1F6A8} CIRCUIT BREAKER: ${result.bombSource}`);\n\t\tlines.push('**ALL OPERATIONS HALTED. REPAIR REQUIRED.**');\n\t\tlines.push('');\n\t\tlines.push(MARKER_END);\n\t\treturn lines.join('\\n');\n\t}\n\n\tlines.push('## hebbian Active Rules');\n\tlines.push('');\n\n\t// Persona (ego region)\n\tlines.push(`### ${REGION_ICONS.ego} Persona`);\n\tfor (const region of result.activeRegions) {\n\t\tif (region.name === 'ego') {\n\t\t\tconst top = sortedActive(region.neurons, 10);\n\t\t\tfor (const n of top) {\n\t\t\t\tlines.push(`- ${pathToSentence(n.path)}`);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t}\n\tlines.push('');\n\n\t// Subsumption cascade\n\tlines.push('### \\u{1F517} Subsumption Cascade');\n\tlines.push('```');\n\tlines.push('brainstem \\u2190\\u2192 limbic \\u2190\\u2192 hippocampus \\u2190\\u2192 sensors \\u2190\\u2192 cortex \\u2190\\u2192 ego \\u2190\\u2192 prefrontal');\n\tlines.push(' (P0) (P1) (P2) (P3) (P4) (P5) (P6)');\n\tlines.push('```');\n\tlines.push('Lower P always overrides higher P. bomb = full stop.');\n\tlines.push('');\n\n\t// TOP 5 brainstem rules\n\tlines.push(`### ${REGION_ICONS.brainstem} Core Directives TOP 5`);\n\tfor (const region of result.activeRegions) {\n\t\tif (region.name === 'brainstem') {\n\t\t\tconst top = sortedActive(region.neurons, 5);\n\t\t\ttop.forEach((n, i) => {\n\t\t\t\tlines.push(`${i + 1}. **${pathToSentence(n.path)}**`);\n\t\t\t});\n\t\t\tbreak;\n\t\t}\n\t}\n\tlines.push('');\n\n\t// Active regions summary\n\tlines.push('### Active Regions');\n\tlines.push('| Region | Neurons | Activation |');\n\tlines.push('|--------|---------|------------|');\n\tfor (const region of result.activeRegions) {\n\t\tconst active = region.neurons.filter((n) => !n.isDormant);\n\t\tconst activation = active.reduce((sum, n) => sum + n.intensity, 0);\n\t\tconst icon = REGION_ICONS[region.name as RegionName] || '';\n\t\tlines.push(`| ${icon} ${region.name} | ${active.length} | ${activation} |`);\n\t}\n\tlines.push('');\n\tlines.push(MARKER_END);\n\n\treturn lines.join('\\n');\n}\n\n// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n// TIER 2: Index (_index.md)\n// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n/**\n * Generate Tier 2 brain index content.\n */\nexport function emitIndex(result: SubsumptionResult, brain: Brain): string {\n\tconst lines: string[] = [];\n\tlines.push('# hebbian Brain Index');\n\tlines.push('');\n\tlines.push(`> ${result.firedNeurons} active / ${result.totalNeurons} total neurons | activation: ${result.totalCounter}`);\n\tlines.push('');\n\n\tif (result.bombSource) {\n\t\tlines.push(`## \\u{1F6A8} CIRCUIT BREAKER: ${result.bombSource}`);\n\t\tlines.push('');\n\t\treturn lines.join('\\n');\n\t}\n\n\t// Top 10 neurons by intensity (counter - contra + dopamine)\n\tconst allNeurons = result.activeRegions.flatMap((r) =>\n\t\tr.neurons.filter((n) => !n.isDormant && n.counter >= EMIT_THRESHOLD),\n\t);\n\tallNeurons.sort((a, b) => b.intensity - a.intensity);\n\n\tlines.push('## Top 10 Active Neurons');\n\tlines.push('| # | Path | Counter | Strength |');\n\tlines.push('|---|------|---------|----------|');\n\tfor (const n of allNeurons.slice(0, 10)) {\n\t\tconst strength = n.counter >= 10 ? '\\u{1F534}' : n.counter >= 5 ? '\\u{1F7E1}' : '\\u26AA';\n\t\tlines.push(`| ${allNeurons.indexOf(n) + 1} | ${n.path} | ${n.counter} | ${strength} |`);\n\t}\n\tlines.push('');\n\n\t// Spotlight: new neurons (< SPOTLIGHT_DAYS old, counter < EMIT_THRESHOLD)\n\tconst cutoff = new Date(Date.now() - SPOTLIGHT_DAYS * 24 * 60 * 60 * 1000);\n\tconst spotlightNeurons = result.activeRegions.flatMap((r) =>\n\t\tr.neurons.filter((n) => !n.isDormant && n.counter < EMIT_THRESHOLD && n.modTime > cutoff),\n\t);\n\tif (spotlightNeurons.length > 0) {\n\t\tlines.push('## Spotlight (Probation)');\n\t\tfor (const n of spotlightNeurons) {\n\t\t\tlines.push(`- ${n.path} (${n.counter}) — new`);\n\t\t}\n\t\tlines.push('');\n\t}\n\n\t// Per-region summary\n\tlines.push('## Regions');\n\tlines.push('| Region | Active | Dormant | Activation | Rules |');\n\tlines.push('|--------|--------|---------|------------|-------|');\n\tfor (const region of result.activeRegions) {\n\t\tconst active = region.neurons.filter((n) => !n.isDormant);\n\t\tconst dormant = region.neurons.filter((n) => n.isDormant);\n\t\tconst activation = active.reduce((sum, n) => sum + n.intensity, 0);\n\t\tconst icon = REGION_ICONS[region.name as RegionName] || '';\n\t\tlines.push(`| ${icon} ${region.name} | ${active.length} | ${dormant.length} | ${activation} | [_rules.md](${region.name}/_rules.md) |`);\n\t}\n\tlines.push('');\n\n\treturn lines.join('\\n');\n}\n\n// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n// TIER 3: Per-region rules ({region}/_rules.md)\n// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n/**\n * Generate Tier 3 per-region rules content.\n */\nexport function emitRegionRules(region: Region): string {\n\tconst icon = REGION_ICONS[region.name as RegionName] || '';\n\tconst ko = REGION_KO[region.name as RegionName] || '';\n\tconst active = region.neurons.filter((n) => !n.isDormant);\n\tconst dormant = region.neurons.filter((n) => n.isDormant);\n\tconst activation = active.reduce((sum, n) => sum + n.intensity, 0);\n\n\tconst lines: string[] = [];\n\tlines.push(`# ${icon} ${region.name} (${ko})`);\n\tlines.push(`> Active: ${active.length} | Dormant: ${dormant.length} | Activation: ${activation}`);\n\tlines.push('');\n\n\t// Axons\n\tif (region.axons.length > 0) {\n\t\tlines.push('## Connections');\n\t\tfor (const axon of region.axons) {\n\t\t\tlines.push(`- \\u2194 ${axon}`);\n\t\t}\n\t\tlines.push('');\n\t}\n\n\t// Neuron tree\n\tif (active.length > 0) {\n\t\tlines.push('## Rules');\n\t\tconst sorted = [...active].sort((a, b) => b.intensity - a.intensity);\n\t\tfor (const n of sorted) {\n\t\t\tconst indent = ' '.repeat(Math.min(n.depth, 4));\n\t\t\tconst prefix = strengthPrefix(n.counter);\n\t\t\tconst signals: string[] = [];\n\t\t\tif (n.dopamine > 0) signals.push(`\\u{1F7E2}+${n.dopamine}`);\n\t\t\tif (n.hasBomb) signals.push('\\u{1F4A3}');\n\t\t\tif (n.hasMemory) signals.push('\\u{1F4BE}');\n\t\t\tconst signalStr = signals.length > 0 ? ` ${signals.join(' ')}` : '';\n\t\t\tlines.push(`${indent}- ${prefix}${pathToSentence(n.path)} (${n.counter})${signalStr}`);\n\t\t}\n\t\tlines.push('');\n\t}\n\n\t// Dormant section\n\tif (dormant.length > 0) {\n\t\tlines.push('## Dormant');\n\t\tfor (const n of dormant) {\n\t\t\tlines.push(`- ~~${pathToSentence(n.path)} (${n.counter})~~`);\n\t\t}\n\t\tlines.push('');\n\t}\n\n\treturn lines.join('\\n');\n}\n\n// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n// MULTI-TARGET OUTPUT\n// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n/**\n * Emit rules to a specific target or all targets.\n */\nexport function emitToTarget(brainRoot: string, target: string): void {\n\tconst brain = scanBrain(brainRoot);\n\tconst result = runSubsumption(brain);\n\tconst content = emitBootstrap(result, brain);\n\n\tif (target === 'all') {\n\t\tfor (const [name, filePath] of Object.entries(EMIT_TARGETS)) {\n\t\t\twriteTarget(filePath, content);\n\t\t\tconsole.log(`\\u{1F4E4} emitted: ${name} → ${filePath}`);\n\t\t}\n\t} else if (EMIT_TARGETS[target]) {\n\t\twriteTarget(EMIT_TARGETS[target], content);\n\t\tconsole.log(`\\u{1F4E4} emitted: ${target} → ${EMIT_TARGETS[target]}`);\n\t} else {\n\t\tthrow new Error(`Unknown target: ${target}. Valid: ${Object.keys(EMIT_TARGETS).join(', ')}, all`);\n\t}\n\n\t// Always write tier 2 + tier 3 into the brain\n\twriteAllTiers(brainRoot, result, brain);\n}\n\n/**\n * Write all 3 tiers into the brain directory.\n */\nexport function writeAllTiers(brainRoot: string, result: SubsumptionResult, brain: Brain): void {\n\t// Tier 2: _index.md\n\tconst indexContent = emitIndex(result, brain);\n\twriteFileSync(join(brainRoot, '_index.md'), indexContent, 'utf8');\n\n\t// Tier 3: per-region _rules.md\n\tfor (const region of result.activeRegions) {\n\t\tif (existsSync(region.path)) {\n\t\t\tconst rulesContent = emitRegionRules(region);\n\t\t\twriteFileSync(join(region.path, '_rules.md'), rulesContent, 'utf8');\n\t\t}\n\t}\n}\n\n/**\n * Write content to a target file, using marker-based injection if file already exists.\n */\nfunction writeTarget(filePath: string, content: string): void {\n\tconst dir = dirname(filePath);\n\tif (dir !== '.' && !existsSync(dir)) {\n\t\tmkdirSync(dir, { recursive: true });\n\t}\n\n\tif (existsSync(filePath)) {\n\t\tconst existing = readFileSync(filePath, 'utf8');\n\t\tconst startIdx = existing.indexOf(MARKER_START);\n\t\tconst endIdx = existing.indexOf(MARKER_END);\n\n\t\tif (startIdx !== -1 && endIdx !== -1) {\n\t\t\t// Replace between markers, preserve surrounding content\n\t\t\tconst before = existing.slice(0, startIdx);\n\t\t\tconst after = existing.slice(endIdx + MARKER_END.length);\n\t\t\twriteFileSync(filePath, before + content + after, 'utf8');\n\t\t\treturn;\n\t\t}\n\n\t\t// No markers yet — prepend brain block, preserve existing content\n\t\twriteFileSync(filePath, content + '\\n\\n' + existing, 'utf8');\n\t\treturn;\n\t}\n\n\twriteFileSync(filePath, content, 'utf8');\n}\n\n// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n// DIAGNOSTICS (for CLI `hebbian diag` / `hebbian stats`)\n// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n/**\n * Print brain diagnostics to stdout.\n */\nexport function printDiag(brain: Brain, result: SubsumptionResult): void {\n\tconsole.log('');\n\tconsole.log(`\\u{1F9E0} hebbian Brain Diagnostics`);\n\tconsole.log(` Root: ${brain.root}`);\n\tconsole.log(` Neurons: ${result.firedNeurons} active / ${result.totalNeurons} total`);\n\tconsole.log(` Activation: ${result.totalCounter}`);\n\tif (result.bombSource) {\n\t\tconsole.log(` \\u{1F4A3} BOMB: ${result.bombSource} — cascade halted!`);\n\t}\n\tconsole.log('');\n\n\tfor (const region of brain.regions) {\n\t\tconst icon = REGION_ICONS[region.name as RegionName] || '';\n\t\tconst active = region.neurons.filter((n) => !n.isDormant);\n\t\tconst dormant = region.neurons.filter((n) => n.isDormant);\n\t\tconst activation = active.reduce((sum, n) => sum + n.intensity, 0);\n\t\tconst isBlocked = result.blockedRegions.some((r) => r.name === region.name);\n\t\tconst status = region.hasBomb ? '\\u{1F4A3} BOMB' : isBlocked ? '\\u{1F6AB} BLOCKED' : '\\u2705 ACTIVE';\n\n\t\tconsole.log(` ${icon} ${region.name} [${status}]`);\n\t\tconsole.log(` neurons: ${active.length} active, ${dormant.length} dormant | activation: ${activation}`);\n\n\t\tif (region.axons.length > 0) {\n\t\t\tconsole.log(` axons: ${region.axons.join(', ')}`);\n\t\t}\n\n\t\tconst top3 = sortedActive(region.neurons, 3);\n\t\tfor (const n of top3) {\n\t\t\tconst contraStr = n.contra > 0 ? ` contra:${n.contra}` : '';\n\t\t\tconsole.log(` \\u251C ${n.path} (counter:${n.counter}${contraStr} intensity:${n.intensity})`);\n\t\t}\n\t}\n\tconsole.log('');\n}\n\n// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n// HELPERS\n// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n/** Convert a neuron relative path to a human-readable sentence. */\nfunction pathToSentence(path: string): string {\n\treturn path.replace(/\\//g, ' > ').replace(/_/g, ' ');\n}\n\n/** Sort non-dormant neurons by intensity (descending), take first N. */\nfunction sortedActive(neurons: Neuron[], n: number): Neuron[] {\n\treturn [...neurons]\n\t\t.filter((neuron) => !neuron.isDormant)\n\t\t.sort((a, b) => b.intensity - a.intensity)\n\t\t.slice(0, n);\n}\n\n/** Strength prefix based on counter value. */\nfunction strengthPrefix(counter: number): string {\n\tif (counter >= 10) return '**[ABSOLUTE]** ';\n\tif (counter >= 5) return '**[MUST]** ';\n\treturn '';\n}\n","// hebbian — Update Check\n//\n// Checks npm registry for newer versions. Cache-first with TTL.\n// Designed for hook context: fast path (cache hit) is sync, slow path (fetch) is async.\n//\n// State files live in ~/.hebbian/:\n// last-update-check — cached result + TTL\n// update-snoozed — snooze state (version + level + epoch)\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync, statSync, unlinkSync } from 'node:fs';\nimport { join } from 'node:path';\n\nconst PACKAGE_NAME = 'hebbian';\nconst NPM_REGISTRY_URL = `https://registry.npmjs.org/${PACKAGE_NAME}/latest`;\nconst FETCH_TIMEOUT_MS = 5000;\n\n// Cache TTL in minutes\nconst TTL_UP_TO_DATE = 60; // check again in 1 hour\nconst TTL_UPGRADE_AVAILABLE = 720; // keep nagging for 12 hours\n\n// Snooze durations in seconds\nconst SNOOZE_DURATIONS: Record<number, number> = {\n\t1: 86400, // 24h\n\t2: 172800, // 48h\n\t3: 604800, // 7d (and beyond)\n};\n\nexport type UpdateStatus =\n\t| { type: 'upgrade_available'; current: string; latest: string }\n\t| { type: 'up_to_date' }\n\t| { type: 'skipped' };\n\n/** Get hebbian state directory */\nfunction getStateDir(): string {\n\treturn join(process.env.HOME || '~', '.hebbian');\n}\n\n/** Ensure state directory exists */\nfunction ensureStateDir(stateDir: string): void {\n\tif (!existsSync(stateDir)) {\n\t\tmkdirSync(stateDir, { recursive: true });\n\t}\n}\n\n/** Check if cache file is stale based on its type */\nfunction isCacheStale(cachePath: string, type: 'UP_TO_DATE' | 'UPGRADE_AVAILABLE'): boolean {\n\ttry {\n\t\tconst mtime = statSync(cachePath).mtimeMs;\n\t\tconst ageMinutes = (Date.now() - mtime) / 1000 / 60;\n\t\tconst ttl = type === 'UP_TO_DATE' ? TTL_UP_TO_DATE : TTL_UPGRADE_AVAILABLE;\n\t\treturn ageMinutes > ttl;\n\t} catch {\n\t\treturn true;\n\t}\n}\n\n/** Read cached update status (sync, fast) */\nfunction readCache(stateDir: string): { type: string; current?: string; latest?: string } | null {\n\tconst cachePath = join(stateDir, 'last-update-check');\n\tif (!existsSync(cachePath)) return null;\n\n\ttry {\n\t\tconst line = readFileSync(cachePath, 'utf8').trim();\n\n\t\tif (line.startsWith('UP_TO_DATE')) {\n\t\t\tif (isCacheStale(cachePath, 'UP_TO_DATE')) return null;\n\t\t\tconst ver = line.split(/\\s+/)[1];\n\t\t\treturn { type: 'UP_TO_DATE', current: ver };\n\t\t}\n\n\t\tif (line.startsWith('UPGRADE_AVAILABLE')) {\n\t\t\tif (isCacheStale(cachePath, 'UPGRADE_AVAILABLE')) return null;\n\t\t\tconst [, current, latest] = line.split(/\\s+/);\n\t\t\treturn { type: 'UPGRADE_AVAILABLE', current, latest };\n\t\t}\n\n\t\treturn null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/** Write cache file */\nfunction writeCache(stateDir: string, line: string): void {\n\tensureStateDir(stateDir);\n\twriteFileSync(join(stateDir, 'last-update-check'), line, 'utf8');\n}\n\n/** Check if upgrade is snoozed */\nfunction isSnoozed(stateDir: string, remoteVersion: string): boolean {\n\tconst snoozePath = join(stateDir, 'update-snoozed');\n\tif (!existsSync(snoozePath)) return false;\n\n\ttry {\n\t\tconst [ver, levelStr, epochStr] = readFileSync(snoozePath, 'utf8').trim().split(/\\s+/);\n\t\tif (ver !== remoteVersion) {\n\t\t\t// New version resets snooze\n\t\t\tunlinkSync(snoozePath);\n\t\t\treturn false;\n\t\t}\n\t\tconst level = parseInt(levelStr || '1', 10);\n\t\tconst epoch = parseInt(epochStr || '0', 10);\n\t\tconst now = Math.floor(Date.now() / 1000);\n\t\tconst duration = SNOOZE_DURATIONS[Math.min(level, 3)] ?? SNOOZE_DURATIONS[3]!;\n\t\treturn now < epoch + duration;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/** Fetch latest version from npm registry */\nasync function fetchLatestVersion(): Promise<string | null> {\n\ttry {\n\t\tconst controller = new AbortController();\n\t\tconst timeout = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);\n\n\t\tconst res = await fetch(NPM_REGISTRY_URL, {\n\t\t\tsignal: controller.signal,\n\t\t\theaders: { Accept: 'application/json' },\n\t\t});\n\t\tclearTimeout(timeout);\n\n\t\tif (!res.ok) return null;\n\t\tconst data = (await res.json()) as { version?: string };\n\t\tconst version = data.version;\n\t\tif (!version || !/^\\d+\\.\\d+[\\d.]*$/.test(version)) return null;\n\t\treturn version;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * Check for updates. Fast path uses cache (sync), slow path fetches npm registry.\n */\nexport async function checkForUpdates(currentVersion: string): Promise<UpdateStatus> {\n\t// Disabled via env\n\tif (process.env.HEBBIAN_UPDATE_CHECK === 'false') {\n\t\treturn { type: 'skipped' };\n\t}\n\n\tconst stateDir = getStateDir();\n\n\t// Fast path: cache hit\n\tconst cached = readCache(stateDir);\n\tif (cached) {\n\t\tif (cached.type === 'UP_TO_DATE') {\n\t\t\treturn { type: 'up_to_date' };\n\t\t}\n\t\tif (cached.type === 'UPGRADE_AVAILABLE' && cached.current && cached.latest) {\n\t\t\tif (cached.current === currentVersion && !isSnoozed(stateDir, cached.latest)) {\n\t\t\t\treturn { type: 'upgrade_available', current: currentVersion, latest: cached.latest };\n\t\t\t}\n\t\t}\n\t}\n\n\t// Slow path: fetch from npm\n\tconst latest = await fetchLatestVersion();\n\tif (!latest) {\n\t\t// Network failure — assume up to date, cache briefly\n\t\twriteCache(stateDir, `UP_TO_DATE ${currentVersion}`);\n\t\treturn { type: 'up_to_date' };\n\t}\n\n\tif (latest === currentVersion) {\n\t\twriteCache(stateDir, `UP_TO_DATE ${currentVersion}`);\n\t\treturn { type: 'up_to_date' };\n\t}\n\n\t// New version available\n\twriteCache(stateDir, `UPGRADE_AVAILABLE ${currentVersion} ${latest}`);\n\n\tif (isSnoozed(stateDir, latest)) {\n\t\treturn { type: 'up_to_date' };\n\t}\n\n\treturn { type: 'upgrade_available', current: currentVersion, latest };\n}\n\n/** Format update notification for terminal output */\nexport function formatUpdateBanner(status: UpdateStatus): string | null {\n\tif (status.type !== 'upgrade_available') return null;\n\treturn [\n\t\t``,\n\t\t` ⚡ hebbian v${status.latest} available (current: v${status.current})`,\n\t\t` npm i -g hebbian@latest`,\n\t\t``,\n\t].join('\\n');\n}\n","// hebbian — Fire Neuron (increment counter)\n//\n// Firing = reinforcing a synaptic pathway.\n// The counter file is renamed: N.neuron → (N+1).neuron\n\nimport { readdirSync, renameSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';\nimport { join } from 'node:path';\n\n/**\n * Increment a neuron's counter by 1.\n * If the neuron doesn't exist, auto-grows it with counter=1.\n */\nexport function fireNeuron(brainRoot: string, neuronPath: string): number {\n\tconst fullPath = join(brainRoot, neuronPath);\n\n\t// Auto-grow if neuron doesn't exist\n\tif (!existsSync(fullPath)) {\n\t\tmkdirSync(fullPath, { recursive: true });\n\t\twriteFileSync(join(fullPath, '1.neuron'), '', 'utf8');\n\t\tconsole.log(`\\u{1F331} grew + fired: ${neuronPath} (1)`);\n\t\treturn 1;\n\t}\n\n\t// Find current counter\n\tconst current = getCurrentCounter(fullPath);\n\tconst newCounter = current + 1;\n\n\t// Rename: N.neuron → (N+1).neuron\n\tif (current > 0) {\n\t\trenameSync(join(fullPath, `${current}.neuron`), join(fullPath, `${newCounter}.neuron`));\n\t} else {\n\t\twriteFileSync(join(fullPath, `${newCounter}.neuron`), '', 'utf8');\n\t}\n\n\tconsole.log(`\\u{1F525} fired: ${neuronPath} (${current} → ${newCounter})`);\n\treturn newCounter;\n}\n\n/**\n * Increment a neuron's contra (inhibitory) counter by 1.\n * Creates 1.contra if none exists, renames N.contra → (N+1).contra otherwise.\n * If the neuron directory doesn't exist, returns 0 (don't auto-create).\n */\nexport function contraNeuron(brainRoot: string, neuronPath: string): number {\n\tconst fullPath = join(brainRoot, neuronPath);\n\n\tif (!existsSync(fullPath)) {\n\t\treturn 0;\n\t}\n\n\tconst current = getCurrentContra(fullPath);\n\tconst newContra = current + 1;\n\n\tif (current > 0) {\n\t\trenameSync(join(fullPath, `${current}.contra`), join(fullPath, `${newContra}.contra`));\n\t} else {\n\t\twriteFileSync(join(fullPath, `${newContra}.contra`), '', 'utf8');\n\t}\n\n\treturn newContra;\n}\n\n/**\n * Get current contra value from the highest N.contra file.\n */\nexport function getCurrentContra(dir: string): number {\n\tlet max = 0;\n\ttry {\n\t\tfor (const entry of readdirSync(dir)) {\n\t\t\tif (entry.endsWith('.contra')) {\n\t\t\t\tconst n = parseInt(entry, 10);\n\t\t\t\tif (!isNaN(n) && n > max) max = n;\n\t\t\t}\n\t\t}\n\t} catch {}\n\treturn max;\n}\n\n/**\n * Get current counter value from the highest N.neuron file.\n */\nexport function getCurrentCounter(dir: string): number {\n\tlet max = 0;\n\ttry {\n\t\tfor (const entry of readdirSync(dir)) {\n\t\t\tif (entry.endsWith('.neuron') && !entry.startsWith('dopamine') && !entry.startsWith('memory') && entry !== 'bomb.neuron') {\n\t\t\t\tconst n = parseInt(entry, 10);\n\t\t\t\tif (!isNaN(n) && n > max) max = n;\n\t\t\t}\n\t\t}\n\t} catch {}\n\treturn max;\n}\n","// hebbian — Tokenizer, Stemmer, Jaccard Similarity\n//\n// Used by growNeuron() to detect similar existing neurons and merge\n// instead of duplicating. Implements synaptic consolidation.\n//\n// \"Neurons that fire together, wire together.\" — if two folder names\n// express the same concept, fire the existing one instead of creating a duplicate.\n\n/**\n * Tokenize a neuron name into stemmed words.\n * Splits on underscores, hyphens, spaces, and CamelCase boundaries.\n */\nexport function tokenize(name: string): string[] {\n\treturn name\n\t\t.replace(/([a-z])([A-Z])/g, '$1_$2') // camelCase → snake\n\t\t.replace(/[^a-zA-Z0-9\\u3000-\\u9FFF\\uAC00-\\uD7AF]+/g, ' ') // punctuation → space\n\t\t.toLowerCase()\n\t\t.split(' ')\n\t\t.map(stem)\n\t\t.filter((t) => t.length > 1); // drop single chars\n}\n\n/**\n * Simple suffix stemmer — removes common English suffixes.\n * Not a full Porter stemmer, but sufficient for Jaccard comparison.\n */\nexport function stem(word: string): string {\n\tconst suffixes = ['ing', 'tion', 'sion', 'ness', 'ment', 'able', 'ible', 'ful', 'less', 'ous', 'ive', 'ity', 'ies', 'ed', 'er', 'es', 'ly', 'al', 'en'];\n\tfor (const suffix of suffixes) {\n\t\tif (word.length > suffix.length + 2 && word.endsWith(suffix)) {\n\t\t\treturn word.slice(0, -suffix.length);\n\t\t}\n\t}\n\treturn word;\n}\n\n/**\n * Compute Jaccard similarity between two token sets.\n * |A ∩ B| / |A ∪ B|\n */\nexport function jaccardSimilarity(a: string[], b: string[]): number {\n\tif (a.length === 0 && b.length === 0) return 1.0;\n\tif (a.length === 0 || b.length === 0) return 0.0;\n\n\tconst setA = new Set(a);\n\tconst setB = new Set(b);\n\tlet intersection = 0;\n\n\tfor (const item of setA) {\n\t\tif (setB.has(item)) intersection++;\n\t}\n\n\tconst union = new Set([...setA, ...setB]).size;\n\treturn intersection / union;\n}\n","// hebbian — Grow Neuron (with synaptic consolidation)\n//\n// Creates a new neuron (folder + 1.neuron).\n// Before creating, checks for similar existing neurons via Jaccard similarity.\n// If a match is found (>= 0.6), fires the existing neuron instead.\n// This prevents duplication and strengthens existing pathways.\n//\n// \"Consolidation over duplication.\" — Hebb's principle.\n\nimport { mkdirSync, writeFileSync, existsSync, readdirSync } from 'node:fs';\nimport { join, relative } from 'node:path';\nimport { REGIONS, JACCARD_THRESHOLD } from './constants';\nimport { tokenize, jaccardSimilarity } from './similarity';\nimport { fireNeuron } from './fire';\n\nexport interface GrowResult {\n\taction: 'grew' | 'fired';\n\tpath: string;\n\tcounter: number;\n}\n\n/**\n * Grow a new neuron at the given path.\n * If a similar neuron already exists in the same region, fires it instead.\n */\nexport function growNeuron(brainRoot: string, neuronPath: string): GrowResult {\n\tconst fullPath = join(brainRoot, neuronPath);\n\n\t// If neuron already exists, just fire it\n\tif (existsSync(fullPath)) {\n\t\tconst counter = fireNeuron(brainRoot, neuronPath);\n\t\treturn { action: 'fired', path: neuronPath, counter };\n\t}\n\n\t// Extract region name and leaf name\n\tif (neuronPath.includes('..') || neuronPath.startsWith('/')) {\n\t\tthrow new Error(`Invalid neuron path: \"${neuronPath}\" (path traversal not allowed)`);\n\t}\n\tconst parts = neuronPath.split('/');\n\tconst regionName = parts[0]!;\n\tif (!(REGIONS as readonly string[]).includes(regionName)) {\n\t\tthrow new Error(`Invalid region: ${regionName}. Valid: ${REGIONS.join(', ')}`);\n\t}\n\n\tconst leafName = parts[parts.length - 1]!;\n\t// Strip correction prefix for Jaccard comparison so NO_console_log\n\t// consolidates with DO_console_log (unless prefix differs on short names)\n\tconst newPrefix = leafName.match(/^(NO|DO|MUST|WARN)_/)?.[1] || '';\n\tconst newStripped = leafName.replace(/^(NO|DO|MUST|WARN)_/, '');\n\tconst newTokens = tokenize(newStripped);\n\n\t// Search for similar neurons in the same region\n\tconst regionPath = join(brainRoot, regionName);\n\tif (existsSync(regionPath)) {\n\t\tconst match = findSimilar(regionPath, regionPath, newTokens, newPrefix);\n\t\tif (match) {\n\t\t\tconst matchRelPath = regionName + '/' + relative(regionPath, match);\n\t\t\tconsole.log(`\\u{1F504} consolidation: \"${neuronPath}\" ≈ \"${matchRelPath}\" (firing existing)`);\n\t\t\tconst counter = fireNeuron(brainRoot, matchRelPath);\n\t\t\treturn { action: 'fired', path: matchRelPath, counter };\n\t\t}\n\t}\n\n\t// No match — create new neuron\n\tmkdirSync(fullPath, { recursive: true });\n\twriteFileSync(join(fullPath, '1.neuron'), '', 'utf8');\n\tconsole.log(`\\u{1F331} grew: ${neuronPath} (1)`);\n\treturn { action: 'grew', path: neuronPath, counter: 1 };\n}\n\n/**\n * Walk a region and find a neuron whose name is similar to the given tokens.\n * Strips correction prefixes (NO_/DO_/MUST_/WARN_) before comparison.\n * Guard: if prefixes differ and tokens <= 2, skip (prevents NO_log merging with MUST_log).\n */\nfunction findSimilar(dir: string, regionRoot: string, targetTokens: string[], targetPrefix: string): string | null {\n\tlet entries;\n\ttry {\n\t\tentries = readdirSync(dir, { withFileTypes: true });\n\t} catch {\n\t\treturn null;\n\t}\n\n\t// Check if this directory has .neuron files (is a neuron)\n\tconst hasNeuron = entries.some((e) => e.isFile() && e.name.endsWith('.neuron'));\n\tif (hasNeuron) {\n\t\tconst folderName = dir.split('/').pop() || '';\n\t\tconst existingPrefix = folderName.match(/^(NO|DO|MUST|WARN)_/)?.[1] || '';\n\t\tconst existingStripped = folderName.replace(/^(NO|DO|MUST|WARN)_/, '');\n\t\tconst existingTokens = tokenize(existingStripped);\n\t\tconst similarity = jaccardSimilarity(targetTokens, existingTokens);\n\n\t\t// Guard: different prefixes with short names = semantically different rules\n\t\tif (targetPrefix !== existingPrefix && targetTokens.length <= 2) {\n\t\t\t// Skip: \"NO_log\" and \"MUST_log\" should NOT consolidate\n\t\t} else if (similarity >= JACCARD_THRESHOLD) {\n\t\t\treturn dir;\n\t\t}\n\t}\n\n\t// Recurse into subdirectories\n\tfor (const entry of entries) {\n\t\tif (entry.name.startsWith('_') || entry.name.startsWith('.')) continue;\n\t\tif (entry.isDirectory()) {\n\t\t\tconst match = findSimilar(join(dir, entry.name), regionRoot, targetTokens, targetPrefix);\n\t\t\tif (match) return match;\n\t\t}\n\t}\n\n\treturn null;\n}\n","// hebbian — Rollback Neuron (decrement counter)\n//\n// Undo a firing. Counter cannot go below 1 (minimum activation).\n\nimport { renameSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { getCurrentCounter } from './fire';\n\n/**\n * Decrement a neuron's counter by 1. Minimum counter is 1.\n */\nexport function rollbackNeuron(brainRoot: string, neuronPath: string): number {\n\tconst fullPath = join(brainRoot, neuronPath);\n\tconst current = getCurrentCounter(fullPath);\n\n\tif (current === 0) {\n\t\tthrow new Error(`Neuron not found: ${neuronPath}`);\n\t}\n\n\tif (current <= 1) {\n\t\tthrow new Error(`Counter already at minimum (1): ${neuronPath}`);\n\t}\n\n\tconst newCounter = current - 1;\n\trenameSync(join(fullPath, `${current}.neuron`), join(fullPath, `${newCounter}.neuron`));\n\n\tconsole.log(`\\u{23EA} rollback: ${neuronPath} (${current} → ${newCounter})`);\n\treturn newCounter;\n}\n","// hebbian — Signal Neuron (dopamine / bomb / memory)\n//\n// Signals are additional trace files placed in a neuron directory:\n// dopamineN.neuron — reward signal (positive reinforcement)\n// bomb.neuron — circuit breaker (halts downstream regions)\n// memoryN.neuron — memory marker (episodic recording)\n\nimport { writeFileSync, existsSync, readdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { SIGNAL_TYPES } from './constants';\nimport type { SignalType } from './constants';\n\n/**\n * Add a signal to a neuron.\n */\nexport function signalNeuron(brainRoot: string, neuronPath: string, signalType: SignalType): void {\n\tif (!SIGNAL_TYPES.includes(signalType)) {\n\t\tthrow new Error(`Invalid signal type: ${signalType}. Valid: ${SIGNAL_TYPES.join(', ')}`);\n\t}\n\n\tconst fullPath = join(brainRoot, neuronPath);\n\tif (!existsSync(fullPath)) {\n\t\tthrow new Error(`Neuron not found: ${neuronPath}`);\n\t}\n\n\tswitch (signalType) {\n\t\tcase 'bomb': {\n\t\t\twriteFileSync(join(fullPath, 'bomb.neuron'), '', 'utf8');\n\t\t\tconsole.log(`\\u{1F4A3} bomb planted: ${neuronPath}`);\n\t\t\tbreak;\n\t\t}\n\t\tcase 'dopamine': {\n\t\t\tconst level = getNextSignalLevel(fullPath, 'dopamine');\n\t\t\twriteFileSync(join(fullPath, `dopamine${level}.neuron`), '', 'utf8');\n\t\t\tconsole.log(`\\u{1F7E2} dopamine +${level}: ${neuronPath}`);\n\t\t\tbreak;\n\t\t}\n\t\tcase 'memory': {\n\t\t\tconst level = getNextSignalLevel(fullPath, 'memory');\n\t\t\twriteFileSync(join(fullPath, `memory${level}.neuron`), '', 'utf8');\n\t\t\tconsole.log(`\\u{1F4BE} memory +${level}: ${neuronPath}`);\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\n/**\n * Get the next signal level (current max + 1).\n */\nfunction getNextSignalLevel(dir: string, prefix: string): number {\n\tlet max = 0;\n\ttry {\n\t\tfor (const entry of readdirSync(dir)) {\n\t\t\tif (entry.startsWith(prefix) && entry.endsWith('.neuron')) {\n\t\t\t\tconst n = parseInt(entry.replace(prefix, ''), 10);\n\t\t\t\tif (!isNaN(n) && n > max) max = n;\n\t\t\t}\n\t\t}\n\t} catch {}\n\treturn max + 1;\n}\n","// hebbian — Decay (dormancy sweep)\n//\n// Neurons that haven't been touched in N days are marked dormant.\n// Dormancy = *.dormant file in the neuron directory.\n// Dormant neurons are excluded from emission and activation counts.\n//\n// \"Most neurons die. Only the repeatedly fired ones survive.\" — Natural selection on OS.\n\nimport { readdirSync, statSync, writeFileSync, existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { REGIONS, MAX_DEPTH } from './constants';\n\nexport interface DecayResult {\n\tscanned: number;\n\tdecayed: number;\n}\n\n/**\n * Sweep the brain and mark inactive neurons as dormant.\n */\nexport function runDecay(brainRoot: string, days: number): DecayResult {\n\tconst threshold = Date.now() - days * 24 * 60 * 60 * 1000;\n\tlet scanned = 0;\n\tlet decayed = 0;\n\n\tfor (const regionName of REGIONS) {\n\t\tconst regionPath = join(brainRoot, regionName);\n\t\tif (!existsSync(regionPath)) continue;\n\t\tconst result = decayWalk(regionPath, threshold, 0);\n\t\tscanned += result.scanned;\n\t\tdecayed += result.decayed;\n\t}\n\n\tconsole.log(`\\u{1F4A4} decay: scanned ${scanned} neurons, decayed ${decayed} (>${days} days inactive)`);\n\treturn { scanned, decayed };\n}\n\nfunction decayWalk(dir: string, threshold: number, depth: number): DecayResult {\n\tif (depth > MAX_DEPTH) return { scanned: 0, decayed: 0 };\n\n\tlet scanned = 0;\n\tlet decayed = 0;\n\tlet entries;\n\n\ttry {\n\t\tentries = readdirSync(dir, { withFileTypes: true });\n\t} catch {\n\t\treturn { scanned: 0, decayed: 0 };\n\t}\n\n\t// Check if this directory is a neuron (has .neuron files)\n\tlet hasNeuronFile = false;\n\tlet isDormant = false;\n\tlet latestMod = 0;\n\n\tfor (const entry of entries) {\n\t\tif (entry.isFile()) {\n\t\t\tif (entry.name.endsWith('.neuron')) {\n\t\t\t\thasNeuronFile = true;\n\t\t\t\ttry {\n\t\t\t\t\tconst st = statSync(join(dir, entry.name));\n\t\t\t\t\tif (st.mtimeMs > latestMod) latestMod = st.mtimeMs;\n\t\t\t\t} catch {}\n\t\t\t}\n\t\t\tif (entry.name.endsWith('.dormant')) {\n\t\t\t\tisDormant = true;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (hasNeuronFile) {\n\t\tscanned++;\n\t\tif (!isDormant && latestMod < threshold) {\n\t\t\tconst age = Math.floor((Date.now() - latestMod) / (24 * 60 * 60 * 1000));\n\t\t\twriteFileSync(\n\t\t\t\tjoin(dir, 'decay.dormant'),\n\t\t\t\t`Dormant since ${new Date().toISOString()} (${age} days inactive)`,\n\t\t\t\t'utf8',\n\t\t\t);\n\t\t\tdecayed++;\n\t\t}\n\t}\n\n\t// Recurse\n\tfor (const entry of entries) {\n\t\tif (entry.name.startsWith('_') || entry.name.startsWith('.')) continue;\n\t\tif (entry.isDirectory()) {\n\t\t\tconst sub = decayWalk(join(dir, entry.name), threshold, depth + 1);\n\t\t\tscanned += sub.scanned;\n\t\t\tdecayed += sub.decayed;\n\t\t}\n\t}\n\n\treturn { scanned, decayed };\n}\n","// hebbian — Batch Deduplication\n//\n// Scans all neurons in a region and merges duplicates via Jaccard similarity.\n// When a match is found (>= threshold), fires the higher-counter neuron\n// and marks the lower-counter one dormant.\n\nimport { writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { JACCARD_THRESHOLD } from './constants';\nimport { tokenize, jaccardSimilarity } from './similarity';\nimport { fireNeuron } from './fire';\nimport { scanBrain } from './scanner';\n\nexport interface DedupResult {\n\tscanned: number;\n\tmerged: number;\n}\n\n/**\n * Run batch deduplication across all regions.\n */\nexport function runDedup(brainRoot: string): DedupResult {\n\tconst brain = scanBrain(brainRoot);\n\tlet scanned = 0;\n\tlet merged = 0;\n\n\tfor (const region of brain.regions) {\n\t\tconst neurons = region.neurons.filter((n) => !n.isDormant);\n\t\tscanned += neurons.length;\n\n\t\t// O(n^2) pairwise comparison within each region\n\t\tconst consumed = new Set<number>();\n\t\tfor (let i = 0; i < neurons.length; i++) {\n\t\t\tif (consumed.has(i)) continue;\n\t\t\tconst ni = neurons[i]!;\n\t\t\tconst tokensI = tokenize(ni.name);\n\n\t\t\tfor (let j = i + 1; j < neurons.length; j++) {\n\t\t\t\tif (consumed.has(j)) continue;\n\t\t\t\tconst nj = neurons[j]!;\n\t\t\t\tconst tokensJ = tokenize(nj.name);\n\t\t\t\tconst sim = jaccardSimilarity(tokensI, tokensJ);\n\n\t\t\t\tif (sim >= JACCARD_THRESHOLD) {\n\t\t\t\t\t// Keep the one with higher counter, mark other dormant\n\t\t\t\t\tconst [keep, drop] = ni.counter >= nj.counter\n\t\t\t\t\t\t? [ni, nj] : [nj, ni];\n\n\t\t\t\t\t// Fire the keeper to absorb the dropped counter\n\t\t\t\t\tconst relKeep = `${region.name}/${keep.path}`;\n\t\t\t\t\tfireNeuron(brainRoot, relKeep);\n\n\t\t\t\t\t// Mark the dropped neuron dormant\n\t\t\t\t\twriteFileSync(\n\t\t\t\t\t\tjoin(drop.fullPath, 'dedup.dormant'),\n\t\t\t\t\t\t`Merged into ${keep.path} on ${new Date().toISOString()}`,\n\t\t\t\t\t\t'utf8',\n\t\t\t\t\t);\n\n\t\t\t\t\tconsumed.add(ni === drop ? i : j);\n\t\t\t\t\tmerged++;\n\t\t\t\t\tconsole.log(`\\u{1F500} merged: \"${drop.path}\" → \"${keep.path}\" (sim=${sim.toFixed(2)})`);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tconsole.log(`\\u{1F9F9} dedup: scanned ${scanned} neurons, merged ${merged}`);\n\treturn { scanned, merged };\n}\n","// hebbian — Git Snapshot\n//\n// Creates a git commit of the current brain state for audit trail.\n// Only commits if there are changes.\n\nimport { execSync } from 'node:child_process';\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\n\n/**\n * Create a git snapshot of the brain directory.\n */\nexport function gitSnapshot(brainRoot: string): boolean {\n\t// Check if brain is inside a git repo\n\tif (!existsSync(join(brainRoot, '.git'))) {\n\t\t// Try parent directories\n\t\ttry {\n\t\t\texecSync('git rev-parse --is-inside-work-tree', { cwd: brainRoot, stdio: 'pipe' });\n\t\t} catch {\n\t\t\tconsole.log('\\u{26A0}\\uFE0F Not a git repository. Run `git init` in the brain directory first.');\n\t\t\treturn false;\n\t\t}\n\t}\n\n\ttry {\n\t\t// Check for changes\n\t\tconst status = execSync('git status --porcelain .', { cwd: brainRoot, encoding: 'utf8' });\n\t\tif (!status.trim()) {\n\t\t\tconsole.log('\\u{2705} No changes to snapshot.');\n\t\t\treturn false;\n\t\t}\n\n\t\t// Stage and commit\n\t\texecSync('git add .', { cwd: brainRoot, stdio: 'pipe' });\n\t\tconst ts = new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19);\n\t\texecSync(`git commit -m \"hebbian snapshot ${ts}\"`, { cwd: brainRoot, stdio: 'pipe' });\n\n\t\tconsole.log(`\\u{1F4F8} snapshot: committed brain state at ${ts}`);\n\t\treturn true;\n\t} catch (err: unknown) {\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\tconsole.error(`\\u{274C} snapshot failed: ${message}`);\n\t\treturn false;\n\t}\n}\n","// hebbian — Watch Mode\n//\n// Watches the brain directory for filesystem changes and auto-recompiles\n// all tiers when changes are detected. Uses hash-based change detection\n// to avoid redundant writes.\n\nimport { watch } from 'node:fs';\nimport { scanBrain } from './scanner';\nimport { runSubsumption } from './subsumption';\nimport { writeAllTiers } from './emit';\nimport type { SubsumptionResult } from './types';\n\n/**\n * Start watching a brain directory for changes.\n * Auto-recompiles tiers when neurons are added/modified/removed.\n */\nexport async function startWatch(brainRoot: string): Promise<void> {\n\tlet lastHash = '';\n\tlet debounceTimer: ReturnType<typeof setTimeout> | null = null;\n\n\t/** Scan brain and recompile if state changed. */\n\tfunction recompile(): void {\n\t\tconst brain = scanBrain(brainRoot);\n\t\tconst result = runSubsumption(brain);\n\t\tconst hash = computeHash(result);\n\n\t\tif (hash === lastHash) return;\n\t\tlastHash = hash;\n\n\t\twriteAllTiers(brainRoot, result, brain);\n\t\tconst ts = new Date().toLocaleTimeString();\n\t\tconsole.log(`[${ts}] \\u{1F504} recompiled — ${result.firedNeurons} neurons, activation ${result.totalCounter}${result.bombSource ? ` \\u{1F4A3} BOMB: ${result.bombSource}` : ''}`);\n\t}\n\n\t// Initial compilation\n\trecompile();\n\tconsole.log(`\\u{1F440} watching: ${brainRoot}`);\n\tconsole.log(' Press Ctrl+C to stop.\\n');\n\n\t// Watch for filesystem changes\n\ttry {\n\t\tconst watcher = watch(brainRoot, { recursive: true }, (eventType, filename) => {\n\t\t\tif (!filename) return;\n\t\t\t// Ignore _index.md and _rules.md (our own output)\n\t\t\tif (filename.endsWith('_index.md') || filename.endsWith('_rules.md')) return;\n\t\t\t// Ignore hidden/internal\n\t\t\tif (filename.startsWith('.') || filename.includes('/_') || filename.includes('\\\\_')) return;\n\n\t\t\t// Debounce: wait 200ms after last change before recompiling\n\t\t\tif (debounceTimer) clearTimeout(debounceTimer);\n\t\t\tdebounceTimer = setTimeout(recompile, 200);\n\t\t});\n\n\t\t// Keep process alive\n\t\tawait new Promise<void>((resolve) => {\n\t\t\tprocess.on('SIGINT', () => {\n\t\t\t\twatcher.close();\n\t\t\t\tconsole.log('\\n\\u{1F44B} watch stopped.');\n\t\t\t\tresolve();\n\t\t\t});\n\t\t});\n\t} catch (err: unknown) {\n\t\tif (err && typeof err === 'object' && 'code' in err && err.code === 'ERR_FEATURE_UNAVAILABLE_ON_PLATFORM') {\n\t\t\tconsole.error('Recursive fs.watch not supported on this platform. Use Node.js >= 22.');\n\t\t} else {\n\t\t\tthrow err;\n\t\t}\n\t}\n}\n\n/**\n * Compute a simple hash from the subsumption result for change detection.\n */\nfunction computeHash(result: SubsumptionResult): string {\n\treturn `${result.firedNeurons}:${result.totalCounter}:${result.bombSource}:${result.activeRegions.length}`;\n}\n","// hebbian — Candidate Neuron Staging\n//\n// New neurons from evolve/inbox/digest land in {region}/_candidates/{name}/\n// instead of directly in the region. Candidates have a probation period:\n// - counter >= 3 → promote to parent region (graduate)\n// - not fired within 14 days → decay (remove)\n//\n// _candidates/ is already invisible to scan/emit/decay because the existing\n// _ prefix convention filters it in scanner.ts and decay.ts.\n//\n// Directory layout example:\n// brain/cortex/_candidates/NO_console_log/1.neuron ← counter=1\n// brain/cortex/NO_console_log/3.neuron ← promoted (counter=3)\n\nimport { existsSync, mkdirSync, readdirSync, renameSync, rmSync, statSync } from 'node:fs';\nimport { join, dirname, relative } from 'node:path';\nimport { REGIONS } from './constants';\nimport { growNeuron } from './grow';\nimport { fireNeuron } from './fire';\nimport type { GrowResult } from './grow';\n\nexport const CANDIDATE_THRESHOLD = 3;\nexport const CANDIDATE_DECAY_DAYS = 14;\nconst CANDIDATE_SEGMENT = '_candidates';\n\nexport interface CandidateInfo {\n\tcandidatePath: string; // e.g. \"cortex/_candidates/NO_console_log\"\n\ttargetPath: string; // e.g. \"cortex/NO_console_log\"\n\tcounter: number;\n\tdaysInactive: number;\n}\n\nexport interface PromoteResult {\n\tpromoted: string[];\n\tdecayed: string[];\n}\n\n// \"cortex/NO_console_log\" → \"cortex/_candidates/NO_console_log\"\nexport function toCandidatePath(neuronPath: string): string {\n\tconst slash = neuronPath.indexOf('/');\n\tif (slash === -1) throw new Error(`Invalid neuron path (missing region): ${neuronPath}`);\n\treturn `${neuronPath.slice(0, slash)}/${CANDIDATE_SEGMENT}/${neuronPath.slice(slash + 1)}`;\n}\n\n// \"cortex/_candidates/NO_console_log\" → \"cortex/NO_console_log\"\nexport function fromCandidatePath(candidatePath: string): string {\n\treturn candidatePath.replace(`/${CANDIDATE_SEGMENT}/`, '/');\n}\n\n/**\n * Grow a candidate neuron. If the counter reaches threshold, promote to region.\n * Use instead of growNeuron() for evolve/inbox/digest flows.\n */\nexport function growCandidate(brainRoot: string, neuronPath: string): GrowResult & { promoted: boolean } {\n\tconst candidatePath = toCandidatePath(neuronPath);\n\tconst result = growNeuron(brainRoot, candidatePath);\n\n\tif (result.counter >= CANDIDATE_THRESHOLD) {\n\t\tconst ok = moveCandidate(brainRoot, candidatePath, neuronPath);\n\t\treturn { ...result, path: ok ? neuronPath : result.path, promoted: ok };\n\t}\n\n\tconsole.log(` 🌱 candidate (${result.counter}/${CANDIDATE_THRESHOLD}): ${candidatePath}`);\n\treturn { ...result, promoted: false };\n}\n\n/**\n * Move a candidate to its permanent location.\n * If target already exists, fires it instead and removes the candidate.\n */\nfunction moveCandidate(brainRoot: string, candidatePath: string, targetPath: string): boolean {\n\tconst src = join(brainRoot, candidatePath);\n\tif (!existsSync(src)) return false;\n\n\tconst dst = join(brainRoot, targetPath);\n\tif (existsSync(dst)) {\n\t\t// Permanent neuron already exists — fire it, remove candidate\n\t\tfireNeuron(brainRoot, targetPath);\n\t\trmSync(src, { recursive: true, force: true });\n\t} else {\n\t\tmkdirSync(dirname(dst), { recursive: true });\n\t\trenameSync(src, dst);\n\t}\n\n\tconsole.log(`🎓 promoted: ${candidatePath} → ${targetPath}`);\n\treturn true;\n}\n\n/**\n * Scan all regions for candidates. Promote graduated ones, decay stale ones.\n * Call at start of `hebbian evolve` or via `hebbian candidates promote`.\n */\nexport function promoteCandidates(brainRoot: string): PromoteResult {\n\tconst promoted: string[] = [];\n\tconst decayed: string[] = [];\n\tconst decayMs = CANDIDATE_DECAY_DAYS * 24 * 60 * 60 * 1000;\n\tconst now = Date.now();\n\n\tfor (const region of REGIONS) {\n\t\tconst candidateRoot = join(brainRoot, region, CANDIDATE_SEGMENT);\n\t\twalkNeuronDirs(candidateRoot, (neuronDir) => {\n\t\t\tconst rel = relative(join(brainRoot, region), neuronDir);\n\t\t\tconst candidatePath = `${region}/${rel}`;\n\t\t\tconst targetPath = fromCandidatePath(candidatePath);\n\t\t\tconst counter = readCounter(neuronDir);\n\t\t\tconst mtime = statSync(neuronDir).mtimeMs;\n\n\t\t\tif (counter >= CANDIDATE_THRESHOLD) {\n\t\t\t\tmoveCandidate(brainRoot, candidatePath, targetPath);\n\t\t\t\tpromoted.push(targetPath);\n\t\t\t} else if (now - mtime > decayMs) {\n\t\t\t\trmSync(neuronDir, { recursive: true, force: true });\n\t\t\t\tdecayed.push(candidatePath);\n\t\t\t\tconsole.log(`💀 candidate decayed: ${candidatePath}`);\n\t\t\t}\n\t\t});\n\t}\n\n\treturn { promoted, decayed };\n}\n\n/**\n * List all pending candidates with their counters and inactivity.\n */\nexport function listCandidates(brainRoot: string): CandidateInfo[] {\n\tconst results: CandidateInfo[] = [];\n\tconst now = Date.now();\n\n\tfor (const region of REGIONS) {\n\t\tconst candidateRoot = join(brainRoot, region, CANDIDATE_SEGMENT);\n\t\twalkNeuronDirs(candidateRoot, (neuronDir) => {\n\t\t\tconst rel = relative(join(brainRoot, region), neuronDir);\n\t\t\tconst candidatePath = `${region}/${rel}`;\n\t\t\tconst targetPath = fromCandidatePath(candidatePath);\n\t\t\tconst counter = readCounter(neuronDir);\n\t\t\tconst mtime = statSync(neuronDir).mtimeMs;\n\t\t\tconst daysInactive = Math.floor((now - mtime) / (24 * 60 * 60 * 1000));\n\t\t\tresults.push({ candidatePath, targetPath, counter, daysInactive });\n\t\t});\n\t}\n\n\treturn results;\n}\n\n// Walk a directory tree, calling callback for directories that contain .neuron files.\nfunction walkNeuronDirs(dir: string, cb: (neuronDir: string) => void): void {\n\tif (!existsSync(dir)) return;\n\ttry {\n\t\tconst entries = readdirSync(dir, { withFileTypes: true });\n\t\tconst hasNeuron = entries.some((e) => e.isFile() && e.name.endsWith('.neuron'));\n\t\tif (hasNeuron) {\n\t\t\tcb(dir);\n\t\t\treturn; // neuron dirs don't contain sub-neurons\n\t\t}\n\t\tfor (const entry of entries) {\n\t\t\tif (entry.isDirectory() && !entry.name.startsWith('.')) {\n\t\t\t\twalkNeuronDirs(join(dir, entry.name), cb);\n\t\t\t}\n\t\t}\n\t} catch { /* skip unreadable dirs */ }\n}\n\n// Read the highest N from N.neuron files in a directory.\nfunction readCounter(dir: string): number {\n\ttry {\n\t\tconst files = readdirSync(dir).filter((f) => /^\\d+\\.neuron$/.test(f));\n\t\tif (files.length === 0) return 0;\n\t\treturn Math.max(...files.map((f) => parseInt(f, 10)));\n\t} catch {\n\t\treturn 0;\n\t}\n}\n","// hebbian — Episode Logging (Circular Buffer)\n//\n// Writes events to hippocampus/session_log/ as memoryN.neuron files.\n// Circular buffer: max 100 entries. When full, overwrites oldest.\n//\n// Port from: NeuronFS/runtime/main.go lines 1300-1342\n\nimport { readdirSync, readFileSync, writeFileSync, mkdirSync, existsSync } from 'node:fs';\nimport { join } from 'node:path';\n\nconst MAX_EPISODES = 100;\nconst SESSION_LOG_DIR = 'hippocampus/session_log';\n\nexport interface Episode {\n\tts: string;\n\ttype: string;\n\tpath: string;\n\tdetail: string;\n\toutcome?: 'revert' | 'acceptance';\n\tneurons?: string[];\n}\n\n/**\n * Log an episode to the hippocampus session log.\n * Circular buffer — writes to memoryN.neuron, wraps at MAX_EPISODES.\n */\nexport function logEpisode(\n\tbrainRoot: string,\n\ttype: string,\n\tpath: string,\n\tdetail: string,\n\textra?: { outcome?: Episode['outcome']; neurons?: string[] },\n): void {\n\tconst logDir = join(brainRoot, SESSION_LOG_DIR);\n\tif (!existsSync(logDir)) {\n\t\tmkdirSync(logDir, { recursive: true });\n\t}\n\n\tconst nextSlot = getNextSlot(logDir);\n\tconst episode: Episode = {\n\t\tts: new Date().toISOString(),\n\t\ttype,\n\t\tpath,\n\t\tdetail,\n\t\t...(extra?.outcome ? { outcome: extra.outcome } : {}),\n\t\t...(extra?.neurons ? { neurons: extra.neurons } : {}),\n\t};\n\n\twriteFileSync(\n\t\tjoin(logDir, `memory${nextSlot}.neuron`),\n\t\tJSON.stringify(episode),\n\t\t'utf8',\n\t);\n}\n\n/**\n * Read all episodes from the session log, sorted by timestamp.\n */\nexport function readEpisodes(brainRoot: string): Episode[] {\n\tconst logDir = join(brainRoot, SESSION_LOG_DIR);\n\tif (!existsSync(logDir)) return [];\n\n\tconst episodes: Episode[] = [];\n\tlet entries;\n\ttry {\n\t\tentries = readdirSync(logDir);\n\t} catch {\n\t\treturn [];\n\t}\n\n\tfor (const entry of entries) {\n\t\tif (!entry.startsWith('memory') || !entry.endsWith('.neuron')) continue;\n\t\ttry {\n\t\t\tconst content = readFileSync(join(logDir, entry), 'utf8');\n\t\t\tif (content.trim()) {\n\t\t\t\tepisodes.push(JSON.parse(content) as Episode);\n\t\t\t}\n\t\t} catch {\n\t\t\t// skip malformed entries\n\t\t}\n\t}\n\n\tepisodes.sort((a, b) => a.ts.localeCompare(b.ts));\n\treturn episodes;\n}\n\n/**\n * Find the next circular buffer slot (1-based, wraps at MAX_EPISODES).\n */\nfunction getNextSlot(logDir: string): number {\n\tlet maxSlot = 0;\n\ttry {\n\t\tfor (const entry of readdirSync(logDir)) {\n\t\t\tif (entry.startsWith('memory') && entry.endsWith('.neuron')) {\n\t\t\t\tconst n = parseInt(entry.replace('memory', '').replace('.neuron', ''), 10);\n\t\t\t\tif (!isNaN(n) && n > maxSlot) maxSlot = n;\n\t\t\t}\n\t\t}\n\t} catch {}\n\n\tconst next = maxSlot + 1;\n\t// Wrap around: if we exceed max, start overwriting from 1\n\treturn next > MAX_EPISODES ? ((maxSlot % MAX_EPISODES) + 1) : next;\n}\n","// hebbian — Inbox Processing\n//\n// Parses _inbox/corrections.jsonl and auto-creates/fires neurons from\n// AI corrections. Security checks prevent path traversal. Only PM/admin\n// roles can award dopamine (inflation filter).\n//\n// Port from: NeuronFS/runtime/main.go lines 1425-1544\n\nimport { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { REGIONS } from './constants';\nimport { growCandidate } from './candidates';\nimport { fireNeuron } from './fire';\nimport { signalNeuron } from './signal';\nimport { logEpisode } from './episode';\n\nconst INBOX_DIR = '_inbox';\nconst CORRECTIONS_FILE = 'corrections.jsonl';\nconst DOPAMINE_ALLOWED_ROLES = ['pm', 'admin', 'lead'];\n\nexport interface Correction {\n\tts: string;\n\ttype: 'correction';\n\ttext: string;\n\tpath: string;\n\tcounter_add: number;\n\tauthor: string;\n\tdopamine?: number;\n}\n\nexport interface InboxResult {\n\tprocessed: number;\n\tskipped: number;\n\terrors: string[];\n}\n\n/**\n * Process the inbox corrections file.\n * Each line is a JSON object describing a correction to apply.\n */\nexport function processInbox(brainRoot: string): InboxResult {\n\tconst inboxPath = join(brainRoot, INBOX_DIR, CORRECTIONS_FILE);\n\n\tif (!existsSync(inboxPath)) {\n\t\treturn { processed: 0, skipped: 0, errors: [] };\n\t}\n\n\tconst content = readFileSync(inboxPath, 'utf8').trim();\n\tif (!content) {\n\t\treturn { processed: 0, skipped: 0, errors: [] };\n\t}\n\n\tconst lines = content.split('\\n').filter(Boolean);\n\tlet processed = 0;\n\tlet skipped = 0;\n\tconst errors: string[] = [];\n\n\tfor (const line of lines) {\n\t\tlet correction: Correction;\n\t\ttry {\n\t\t\tcorrection = JSON.parse(line) as Correction;\n\t\t} catch {\n\t\t\terrors.push(`Malformed JSON: ${line.slice(0, 80)}`);\n\t\t\tskipped++;\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Validate required fields\n\t\tif (!correction.path || !correction.type) {\n\t\t\terrors.push(`Missing path or type: ${line.slice(0, 80)}`);\n\t\t\tskipped++;\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Security: path traversal check\n\t\tif (!isPathSafe(correction.path)) {\n\t\t\terrors.push(`Path traversal blocked: ${correction.path}`);\n\t\t\tskipped++;\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Security: validate region\n\t\tconst region = correction.path.split('/')[0];\n\t\tif (!region || !(REGIONS as readonly string[]).includes(region)) {\n\t\t\terrors.push(`Invalid region in path: ${correction.path}`);\n\t\t\tskipped++;\n\t\t\tcontinue;\n\t\t}\n\n\t\ttry {\n\t\t\tapplyCorrection(brainRoot, correction);\n\t\t\tprocessed++;\n\t\t} catch (err) {\n\t\t\terrors.push(`Failed to apply ${correction.path}: ${(err as Error).message}`);\n\t\t\tskipped++;\n\t\t}\n\t}\n\n\t// Clear the inbox file after processing\n\twriteFileSync(inboxPath, '', 'utf8');\n\n\tconsole.log(`📥 inbox: processed ${processed}, skipped ${skipped}`);\n\tif (errors.length > 0) {\n\t\tfor (const err of errors) {\n\t\t\tconsole.log(` ⚠️ ${err}`);\n\t\t}\n\t}\n\n\treturn { processed, skipped, errors };\n}\n\n/**\n * Apply a single correction entry.\n */\nfunction applyCorrection(brainRoot: string, correction: Correction): void {\n\tconst neuronPath = correction.path;\n\tconst fullPath = join(brainRoot, neuronPath);\n\tconst counterAdd = Math.max(1, correction.counter_add || 1);\n\n\tif (existsSync(fullPath)) {\n\t\t// Neuron exists — fire N times\n\t\tfor (let i = 0; i < counterAdd; i++) {\n\t\t\tfireNeuron(brainRoot, neuronPath);\n\t\t}\n\t} else {\n\t\t// Neuron doesn't exist — grow via candidate staging\n\t\tconst candResult = growCandidate(brainRoot, neuronPath);\n\t\t// Only fire additional times if already promoted to permanent\n\t\tif (candResult.promoted) {\n\t\t\tfor (let i = 1; i < counterAdd; i++) {\n\t\t\t\tfireNeuron(brainRoot, neuronPath);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Dopamine inflation filter: only allowed roles can award dopamine\n\tif (correction.dopamine && correction.dopamine > 0) {\n\t\tconst author = (correction.author || '').toLowerCase();\n\t\tif (DOPAMINE_ALLOWED_ROLES.includes(author)) {\n\t\t\tsignalNeuron(brainRoot, neuronPath, 'dopamine');\n\t\t}\n\t}\n\n\tlogEpisode(brainRoot, 'inbox', neuronPath, correction.text || '');\n}\n\n/**\n * Security: check path for traversal attacks.\n */\nfunction isPathSafe(path: string): boolean {\n\tif (path.includes('..')) return false;\n\tif (path.startsWith('/')) return false;\n\tif (path.includes('\\\\')) return false;\n\t// Block null bytes\n\tif (path.includes('\\0')) return false;\n\treturn true;\n}\n\n/**\n * Ensure the inbox directory and corrections file exist.\n */\nexport function ensureInbox(brainRoot: string): string {\n\tconst inboxDir = join(brainRoot, INBOX_DIR);\n\tif (!existsSync(inboxDir)) {\n\t\tmkdirSync(inboxDir, { recursive: true });\n\t}\n\tconst filePath = join(inboxDir, CORRECTIONS_FILE);\n\tif (!existsSync(filePath)) {\n\t\twriteFileSync(filePath, '', 'utf8');\n\t}\n\treturn filePath;\n}\n\n/**\n * Append a correction entry to the inbox.\n */\nexport function appendCorrection(brainRoot: string, correction: Correction): void {\n\tconst filePath = ensureInbox(brainRoot);\n\tconst line = JSON.stringify(correction) + '\\n';\n\tconst existing = readFileSync(filePath, 'utf8');\n\twriteFileSync(filePath, existing + line, 'utf8');\n}\n","// hebbian — REST API Server\n//\n// Programmatic brain manipulation via HTTP. Zero dependencies (node:http).\n// Enables external tools (n8n, webhooks, dashboards) to interact with hebbian.\n//\n// Port from: NeuronFS/runtime/main.go lines 2099-2434\n\nimport { createServer, type IncomingMessage, type ServerResponse } from 'node:http';\nimport { scanBrain } from './scanner';\nimport { runSubsumption } from './subsumption';\nimport { fireNeuron } from './fire';\nimport { rollbackNeuron } from './rollback';\nimport { growNeuron } from './grow';\nimport { signalNeuron } from './signal';\nimport { runDecay } from './decay';\nimport { runDedup } from './dedup';\nimport { writeAllTiers } from './emit';\nimport { processInbox } from './inbox';\nimport { REGIONS, REGION_ICONS, REGION_KO, type SignalType } from './constants';\nimport type { RegionName } from './constants';\n\nlet lastAPIActivity = Date.now();\n\nexport interface ReportEntry {\n\tts: string;\n\tmessage: string;\n\tpriority: 'low' | 'normal' | 'high' | 'critical';\n}\n\nconst pendingReports: ReportEntry[] = [];\n\n// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n// JSON Response Builders\n// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\nfunction buildHealthJSON(brainRoot: string) {\n\tconst brain = scanBrain(brainRoot);\n\tconst result = runSubsumption(brain);\n\treturn {\n\t\tstatus: 'ok',\n\t\tbrain: brainRoot,\n\t\tneurons: result.totalNeurons,\n\t\tactiveNeurons: result.firedNeurons,\n\t\ttotalActivation: result.totalCounter,\n\t\tbombSource: result.bombSource || null,\n\t\tlastActivity: new Date(lastAPIActivity).toISOString(),\n\t\tuptime: process.uptime(),\n\t};\n}\n\nfunction buildBrainJSON(brainRoot: string) {\n\tconst brain = scanBrain(brainRoot);\n\tconst result = runSubsumption(brain);\n\treturn {\n\t\troot: brain.root,\n\t\tregions: brain.regions.map((region) => ({\n\t\t\tname: region.name,\n\t\t\ticon: REGION_ICONS[region.name as RegionName] || '',\n\t\t\tko: REGION_KO[region.name as RegionName] || '',\n\t\t\tpriority: region.priority,\n\t\t\thasBomb: region.hasBomb,\n\t\t\tneurons: region.neurons.map((n) => ({\n\t\t\t\tname: n.name,\n\t\t\t\tpath: n.path,\n\t\t\t\tcounter: n.counter,\n\t\t\t\tcontra: n.contra,\n\t\t\t\tdopamine: n.dopamine,\n\t\t\t\thasBomb: n.hasBomb,\n\t\t\t\thasMemory: n.hasMemory,\n\t\t\t\tisDormant: n.isDormant,\n\t\t\t\tdepth: n.depth,\n\t\t\t\tmodTime: n.modTime.getTime(),\n\t\t\t})),\n\t\t\taxons: region.axons,\n\t\t})),\n\t\tbombSource: result.bombSource || null,\n\t\tfiredNeurons: result.firedNeurons,\n\t\ttotalNeurons: result.totalNeurons,\n\t\ttotalCounter: result.totalCounter,\n\t};\n}\n\n// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n// HTTP Helpers\n// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\nfunction json(res: ServerResponse, data: unknown, status = 200): void {\n\tconst body = JSON.stringify(data);\n\tres.writeHead(status, {\n\t\t'Content-Type': 'application/json',\n\t\t'Access-Control-Allow-Origin': '*',\n\t\t'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',\n\t\t'Access-Control-Allow-Headers': 'Content-Type',\n\t});\n\tres.end(body);\n}\n\nfunction error(res: ServerResponse, message: string, status = 400): void {\n\tjson(res, { error: message }, status);\n}\n\nconst MAX_BODY_BYTES = 1_048_576; // 1 MB\n\nasync function readBody(req: IncomingMessage): Promise<string> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst chunks: Buffer[] = [];\n\t\tlet total = 0;\n\t\treq.on('data', (chunk: Buffer) => {\n\t\t\ttotal += chunk.length;\n\t\t\tif (total > MAX_BODY_BYTES) {\n\t\t\t\treject(new Error('Request body too large'));\n\t\t\t\treq.destroy();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tchunks.push(chunk);\n\t\t});\n\t\treq.on('end', () => resolve(Buffer.concat(chunks).toString('utf8')));\n\t\treq.on('error', reject);\n\t});\n}\n\nasync function parseJSON(req: IncomingMessage): Promise<Record<string, unknown>> {\n\tconst body = await readBody(req);\n\tif (!body.trim()) return {};\n\treturn JSON.parse(body) as Record<string, unknown>;\n}\n\n// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n// Route Handlers\n// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\nasync function handleRequest(\n\treq: IncomingMessage,\n\tres: ServerResponse,\n\tbrainRoot: string,\n): Promise<void> {\n\tconst url = new URL(req.url || '/', `http://${req.headers.host || 'localhost'}`);\n\tconst path = url.pathname;\n\tconst method = req.method || 'GET';\n\n\t// CORS preflight\n\tif (method === 'OPTIONS') {\n\t\tjson(res, null, 204);\n\t\treturn;\n\t}\n\n\t// Track activity on mutations\n\tconst isMutation = method === 'POST';\n\tif (isMutation) lastAPIActivity = Date.now();\n\n\ttry {\n\t\t// GET endpoints\n\t\tif (method === 'GET') {\n\t\t\tswitch (path) {\n\t\t\t\tcase '/api/health':\n\t\t\t\t\tjson(res, buildHealthJSON(brainRoot));\n\t\t\t\t\treturn;\n\t\t\t\tcase '/api/brain':\n\t\t\t\t\tjson(res, buildBrainJSON(brainRoot));\n\t\t\t\t\treturn;\n\t\t\t\tcase '/api/read': {\n\t\t\t\t\tconst region = url.searchParams.get('region');\n\t\t\t\t\tif (!region || !(REGIONS as readonly string[]).includes(region)) {\n\t\t\t\t\t\terror(res, `Invalid region. Valid: ${REGIONS.join(', ')}`);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tconst brain = scanBrain(brainRoot);\n\t\t\t\t\tconst result = runSubsumption(brain);\n\t\t\t\t\tconst regionData = result.activeRegions.find((r) => r.name === region);\n\t\t\t\t\tif (!regionData) {\n\t\t\t\t\t\terror(res, `Region \"${region}\" is blocked or empty`);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\t// Auto-fire top 3 for RAG retrieval\n\t\t\t\t\tconst top3 = [...regionData.neurons]\n\t\t\t\t\t\t.filter((n) => !n.isDormant)\n\t\t\t\t\t\t.sort((a, b) => b.counter - a.counter)\n\t\t\t\t\t\t.slice(0, 3);\n\t\t\t\t\tfor (const n of top3) {\n\t\t\t\t\t\tfireNeuron(brainRoot, `${region}/${n.path}`);\n\t\t\t\t\t}\n\t\t\t\t\tjson(res, {\n\t\t\t\t\t\tregion: region,\n\t\t\t\t\t\tneurons: regionData.neurons,\n\t\t\t\t\t\tfired: top3.map((n) => n.path),\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcase '/api/reports':\n\t\t\t\t\tjson(res, { reports: pendingReports });\n\t\t\t\t\treturn;\n\t\t\t\tdefault:\n\t\t\t\t\terror(res, 'Not found', 404);\n\t\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// POST endpoints\n\t\tif (method === 'POST') {\n\t\t\tconst body = await parseJSON(req);\n\n\t\t\tswitch (path) {\n\t\t\t\tcase '/api/grow': {\n\t\t\t\t\tconst neuronPath = body.path as string;\n\t\t\t\t\tif (!neuronPath) { error(res, 'Missing \"path\"'); return; }\n\t\t\t\t\tconst result = growNeuron(brainRoot, neuronPath);\n\t\t\t\t\tjson(res, result);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcase '/api/fire': {\n\t\t\t\t\tconst neuronPath = body.path as string;\n\t\t\t\t\tif (!neuronPath) { error(res, 'Missing \"path\"'); return; }\n\t\t\t\t\tconst counter = fireNeuron(brainRoot, neuronPath);\n\t\t\t\t\tjson(res, { path: neuronPath, counter });\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcase '/api/signal': {\n\t\t\t\t\tconst neuronPath = body.path as string;\n\t\t\t\t\tconst signalType = body.type as string;\n\t\t\t\t\tif (!neuronPath || !signalType) { error(res, 'Missing \"path\" or \"type\"'); return; }\n\t\t\t\t\tsignalNeuron(brainRoot, neuronPath, signalType as SignalType);\n\t\t\t\t\tjson(res, { path: neuronPath, type: signalType });\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcase '/api/rollback': {\n\t\t\t\t\tconst neuronPath = body.path as string;\n\t\t\t\t\tif (!neuronPath) { error(res, 'Missing \"path\"'); return; }\n\t\t\t\t\tconst counter = rollbackNeuron(brainRoot, neuronPath);\n\t\t\t\t\tjson(res, { path: neuronPath, counter });\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcase '/api/decay': {\n\t\t\t\t\tconst days = typeof body.days === 'number' ? body.days : 30;\n\t\t\t\t\tconst result = runDecay(brainRoot, days);\n\t\t\t\t\tjson(res, result);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcase '/api/dedup': {\n\t\t\t\t\tconst result = runDedup(brainRoot);\n\t\t\t\t\tjson(res, result);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcase '/api/inject': {\n\t\t\t\t\tconst brain = scanBrain(brainRoot);\n\t\t\t\t\tconst result = runSubsumption(brain);\n\t\t\t\t\twriteAllTiers(brainRoot, result, brain);\n\t\t\t\t\tjson(res, { injected: true });\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcase '/api/inbox': {\n\t\t\t\t\tconst result = processInbox(brainRoot);\n\t\t\t\t\tjson(res, result);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcase '/api/report': {\n\t\t\t\t\tconst message = body.message as string;\n\t\t\t\t\tconst priority = (body.priority as string) || 'normal';\n\t\t\t\t\tif (!message) { error(res, 'Missing \"message\"'); return; }\n\t\t\t\t\tconst entry: ReportEntry = {\n\t\t\t\t\t\tts: new Date().toISOString(),\n\t\t\t\t\t\tmessage,\n\t\t\t\t\t\tpriority: priority as ReportEntry['priority'],\n\t\t\t\t\t};\n\t\t\t\t\tpendingReports.push(entry);\n\t\t\t\t\tjson(res, entry);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\terror(res, 'Not found', 404);\n\t\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\terror(res, 'Method not allowed', 405);\n\t} catch (err) {\n\t\terror(res, (err as Error).message, 500);\n\t}\n}\n\n// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n// Server\n// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n/**\n * Start the hebbian REST API server.\n */\nexport function startAPI(brainRoot: string, port = 9090): ReturnType<typeof createServer> {\n\tconst server = createServer((req, res) => {\n\t\thandleRequest(req, res, brainRoot).catch((err) => {\n\t\t\terror(res, (err as Error).message, 500);\n\t\t});\n\t});\n\n\tserver.listen(port, () => {\n\t\tconsole.log(`🧠 hebbian API listening on http://localhost:${port}`);\n\t\tconsole.log(` Brain: ${brainRoot}`);\n\t\tconsole.log('');\n\t\tconsole.log(' Endpoints:');\n\t\tconsole.log(' GET /api/health Process health + brain stats');\n\t\tconsole.log(' GET /api/brain Full brain state JSON');\n\t\tconsole.log(' GET /api/read?region=X Read region (auto-fires top 3)');\n\t\tconsole.log(' GET /api/reports List pending reports');\n\t\tconsole.log(' POST /api/grow {\"path\":\"cortex/...\"}');\n\t\tconsole.log(' POST /api/fire {\"path\":\"cortex/...\"}');\n\t\tconsole.log(' POST /api/signal {\"path\":\"...\",\"type\":\"dopamine\"}');\n\t\tconsole.log(' POST /api/rollback {\"path\":\"cortex/...\"}');\n\t\tconsole.log(' POST /api/decay {\"days\":30}');\n\t\tconsole.log(' POST /api/dedup Batch merge similar neurons');\n\t\tconsole.log(' POST /api/inject Force re-emit all tiers');\n\t\tconsole.log(' POST /api/inbox Process corrections inbox');\n\t\tconsole.log(' POST /api/report {\"message\":\"...\",\"priority\":\"normal\"}');\n\t});\n\n\treturn server;\n}\n\n/**\n * Get the last API activity timestamp.\n */\nexport function getLastActivity(): number {\n\treturn lastAPIActivity;\n}\n\n/**\n * Get pending reports (for external access).\n */\nexport function getPendingReports(): ReportEntry[] {\n\treturn pendingReports;\n}\n\n/**\n * Clear pending reports.\n */\nexport function clearReports(): void {\n\tpendingReports.length = 0;\n}\n","// hebbian — Claude Code Hooks Integration\n//\n// Manages Claude Code hooks in .claude/settings.local.json.\n// Uses [hebbian] statusMessage marker for ownership tracking.\n//\n// SessionStart hook: refreshes CLAUDE.md with latest brain state\n// Stop hook: digests conversation transcript for corrections\n\nimport { readFileSync, writeFileSync, existsSync, mkdirSync, readdirSync } from 'node:fs';\nimport { execSync } from 'node:child_process';\nimport { join, resolve } from 'node:path';\nimport { HOOK_MARKER, REGIONS } from './constants';\nimport { initBrain } from './init';\n\nconst SETTINGS_DIR = '.claude';\nconst SETTINGS_FILE = 'settings.local.json';\n\nexport interface HookStatus {\n\tinstalled: boolean;\n\tpath: string;\n\tevents: string[];\n}\n\ninterface HookEntry {\n\ttype: string;\n\tcommand: string;\n\ttimeout?: number;\n\tstatusMessage?: string;\n}\n\ninterface HookGroup {\n\tmatcher?: string;\n\thooks: HookEntry[];\n}\n\n/**\n * Install hebbian hooks into .claude/settings.local.json.\n * Deep-merges with existing settings. Uses statusMessage marker for ownership.\n */\nexport function installHooks(brainRoot: string, projectRoot?: string, global?: boolean): void {\n\tconst root = projectRoot || process.cwd();\n\tconst resolvedBrain = resolve(brainRoot);\n\n\t// Global install requires absolute brain path\n\tif (global) {\n\t\tconst home = process.env.HOME || '~';\n\t\tif (!brainRoot.startsWith('/') && !brainRoot.startsWith(home)) {\n\t\t\tconsole.error('❌ --global requires an absolute --brain path (e.g. --brain ~/brain)');\n\t\t\tprocess.exit(1);\n\t\t}\n\t}\n\n\t// Auto-init brain if it doesn't exist\n\tif (!existsSync(resolvedBrain) || !hasBrainRegions(resolvedBrain)) {\n\t\tinitBrain(resolvedBrain);\n\t}\n\n\t// Global: ~/.claude/settings.json, Local: .claude/settings.local.json\n\tconst settingsDir = global ? resolve(process.env.HOME || '~', SETTINGS_DIR) : join(root, SETTINGS_DIR);\n\tconst settingsFile = global ? 'settings.json' : SETTINGS_FILE;\n\tconst settingsPath = join(settingsDir, settingsFile);\n\n\t// Determine if we need --brain flag\n\tconst defaultBrain = resolve(root, 'brain');\n\tconst brainFlag = resolvedBrain === defaultBrain ? '' : ` --brain ${resolvedBrain}`;\n\n\t// Resolve stable npx path via `which` (returns symlink like /opt/homebrew/bin/npx,\n\t// not versioned Cellar path — survives node upgrades)\n\tlet npxBin = 'npx';\n\ttry {\n\t\tnpxBin = execSync('which npx', { encoding: 'utf8' }).trim();\n\t} catch {\n\t\t// Fall back to bare npx — will work if PATH is set\n\t}\n\n\t// Read existing settings or start fresh\n\tlet settings: Record<string, unknown> = {};\n\tif (existsSync(settingsPath)) {\n\t\ttry {\n\t\t\tsettings = JSON.parse(readFileSync(settingsPath, 'utf8'));\n\t\t} catch {\n\t\t\tconsole.log(`\\u26A0\\uFE0F settings.local.json was malformed, overwriting`);\n\t\t}\n\t}\n\n\t// Ensure hooks object exists\n\tif (!settings.hooks || typeof settings.hooks !== 'object') {\n\t\tsettings.hooks = {};\n\t}\n\tconst hooks = settings.hooks as Record<string, HookGroup[]>;\n\n\t// Define hebbian hooks (session start/end chained for outcome tracking)\n\tconst hebbianHooks: Array<{ event: string; matcher?: string; entry: HookEntry }> = [\n\t\t{\n\t\t\tevent: 'SessionStart',\n\t\t\tmatcher: 'startup|resume',\n\t\t\tentry: {\n\t\t\t\ttype: 'command',\n\t\t\t\tcommand: `${npxBin} hebbian emit claude${brainFlag} && ${npxBin} hebbian session start${brainFlag}`,\n\t\t\t\ttimeout: 15,\n\t\t\t\tstatusMessage: `${HOOK_MARKER} refreshing brain`,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tevent: 'Stop',\n\t\t\tentry: {\n\t\t\t\ttype: 'command',\n\t\t\t\tcommand: `${npxBin} hebbian digest${brainFlag}; ${npxBin} hebbian session end${brainFlag}`,\n\t\t\t\ttimeout: 30,\n\t\t\t\tstatusMessage: `${HOOK_MARKER} digesting session`,\n\t\t\t},\n\t\t},\n\t];\n\n\t// Install each hook\n\tfor (const { event, matcher, entry } of hebbianHooks) {\n\t\tif (!hooks[event]) {\n\t\t\thooks[event] = [];\n\t\t}\n\n\t\t// Find existing hebbian group for this event\n\t\tconst existingIdx = hooks[event]!.findIndex((group) =>\n\t\t\tgroup.hooks.some((h) => h.statusMessage?.startsWith(HOOK_MARKER)),\n\t\t);\n\n\t\tconst group: HookGroup = {\n\t\t\t...(matcher ? { matcher } : {}),\n\t\t\thooks: [entry],\n\t\t};\n\n\t\tif (existingIdx >= 0) {\n\t\t\t// Update existing entry\n\t\t\thooks[event]![existingIdx] = group;\n\t\t} else {\n\t\t\t// Append new entry\n\t\t\thooks[event]!.push(group);\n\t\t}\n\t}\n\n\t// Write back\n\tif (!existsSync(settingsDir)) {\n\t\tmkdirSync(settingsDir, { recursive: true });\n\t}\n\twriteFileSync(settingsPath, JSON.stringify(settings, null, 2) + '\\n', 'utf8');\n\n\tconsole.log(`\\u2705 hebbian hooks installed at ${settingsPath}`);\n\tconsole.log(` SessionStart \\u2192 ${npxBin} hebbian emit claude${brainFlag}`);\n\tconsole.log(` Stop \\u2192 ${npxBin} hebbian digest${brainFlag}`);\n}\n\n/**\n * Remove hebbian hooks from .claude/settings.local.json.\n * Preserves non-hebbian hooks and other settings.\n */\nexport function uninstallHooks(projectRoot?: string, global?: boolean): void {\n\tconst root = projectRoot || process.cwd();\n\tconst settingsDir = global ? resolve(process.env.HOME || '~', SETTINGS_DIR) : join(root, SETTINGS_DIR);\n\tconst settingsFile = global ? 'settings.json' : SETTINGS_FILE;\n\tconst settingsPath = join(settingsDir, settingsFile);\n\n\tif (!existsSync(settingsPath)) {\n\t\tconsole.log('No hooks installed (settings.local.json not found)');\n\t\treturn;\n\t}\n\n\tlet settings: Record<string, unknown>;\n\ttry {\n\t\tsettings = JSON.parse(readFileSync(settingsPath, 'utf8'));\n\t} catch {\n\t\tconsole.log('settings.local.json is malformed, nothing to uninstall');\n\t\treturn;\n\t}\n\n\tif (!settings.hooks || typeof settings.hooks !== 'object') {\n\t\tconsole.log('No hooks found in settings.local.json');\n\t\treturn;\n\t}\n\n\tconst hooks = settings.hooks as Record<string, HookGroup[]>;\n\tlet removed = 0;\n\n\tfor (const event of Object.keys(hooks)) {\n\t\tconst before = hooks[event]!.length;\n\t\thooks[event] = hooks[event]!.filter(\n\t\t\t(group) => !group.hooks.some((h) => h.statusMessage?.startsWith(HOOK_MARKER)),\n\t\t);\n\t\tremoved += before - hooks[event]!.length;\n\n\t\t// Clean up empty event arrays\n\t\tif (hooks[event]!.length === 0) {\n\t\t\tdelete hooks[event];\n\t\t}\n\t}\n\n\t// Clean up empty hooks object\n\tif (Object.keys(hooks).length === 0) {\n\t\tdelete settings.hooks;\n\t}\n\n\twriteFileSync(settingsPath, JSON.stringify(settings, null, 2) + '\\n', 'utf8');\n\tconsole.log(`\\u2705 removed ${removed} hebbian hook(s) from ${settingsPath}`);\n}\n\n/**\n * Check if hebbian hooks are installed.\n */\nexport function checkHooks(projectRoot?: string, global?: boolean): HookStatus {\n\tconst root = projectRoot || process.cwd();\n\tconst settingsDir = global ? resolve(process.env.HOME || '~', SETTINGS_DIR) : join(root, SETTINGS_DIR);\n\tconst settingsFile = global ? 'settings.json' : SETTINGS_FILE;\n\tconst settingsPath = join(settingsDir, settingsFile);\n\n\tconst status: HookStatus = {\n\t\tinstalled: false,\n\t\tpath: settingsPath,\n\t\tevents: [],\n\t};\n\n\tif (!existsSync(settingsPath)) {\n\t\tconsole.log(`\\u274C hebbian hooks not installed (${settingsPath} not found)`);\n\t\treturn status;\n\t}\n\n\tlet settings: Record<string, unknown>;\n\ttry {\n\t\tsettings = JSON.parse(readFileSync(settingsPath, 'utf8'));\n\t} catch {\n\t\tconsole.log(`\\u274C settings.local.json is malformed`);\n\t\treturn status;\n\t}\n\n\tif (!settings.hooks || typeof settings.hooks !== 'object') {\n\t\tconsole.log(`\\u274C no hooks in ${settingsPath}`);\n\t\treturn status;\n\t}\n\n\tconst hooks = settings.hooks as Record<string, HookGroup[]>;\n\n\tfor (const event of Object.keys(hooks)) {\n\t\tconst hasHebbian = hooks[event]!.some((group) =>\n\t\t\tgroup.hooks.some((h) => h.statusMessage?.startsWith(HOOK_MARKER)),\n\t\t);\n\t\tif (hasHebbian) {\n\t\t\tstatus.events.push(event);\n\t\t}\n\t}\n\n\tstatus.installed = status.events.length > 0;\n\n\tif (status.installed) {\n\t\tconsole.log(`\\u2705 hebbian hooks installed at ${settingsPath}`);\n\t\tfor (const event of status.events) {\n\t\t\tconsole.log(` ${event} \\u2714`);\n\t\t}\n\t} else {\n\t\tconsole.log(`\\u274C hebbian hooks not found in ${settingsPath}`);\n\t}\n\n\treturn status;\n}\n\n/**\n * Check if a directory contains brain regions.\n */\nfunction hasBrainRegions(dir: string): boolean {\n\tif (!existsSync(dir)) return false;\n\ttry {\n\t\tconst entries = readdirSync(dir);\n\t\treturn (REGIONS as readonly string[]).some((r) => entries.includes(r));\n\t} catch {\n\t\treturn false;\n\t}\n}\n","// hebbian — Conversation Digest (Correction Extraction)\n//\n// Parses Claude Code conversation transcripts (JSONL) and extracts\n// user corrections via pattern matching. Writes corrections to inbox,\n// auto-processes them, and logs an audit trail.\n//\n// Correction detection is deliberately heuristic — WS3 candidate staging\n// is the quality safety net for false positives.\n\nimport { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';\nimport { join, basename } from 'node:path';\nimport { MAX_CORRECTIONS_PER_SESSION, MIN_CORRECTION_LENGTH, DIGEST_LOG_DIR } from './constants';\nimport { growCandidate } from './candidates';\nimport { logEpisode } from './episode';\n// tokenize() not used here — digest uses its own unstemmed split for readable names.\n// tokenize() with stemming is for Jaccard similarity in grow.ts.\n\nexport interface DigestResult {\n\tcorrections: number;\n\tskipped: number;\n\ttranscriptPath: string;\n\tsessionId: string;\n}\n\nexport interface ExtractedCorrection {\n\ttext: string;\n\tpath: string;\n\tprefix: 'NO' | 'DO' | 'MUST' | 'WARN';\n\tkeywords: string[];\n}\n\ninterface TranscriptLine {\n\ttype?: string;\n\tmessage?: {\n\t\trole?: string;\n\t\tcontent?: string | Array<{ type: string; text?: string }>;\n\t};\n\tsessionId?: string;\n\tuuid?: string;\n}\n\n// Negation patterns — user is telling the AI NOT to do something\nconst NEGATION_PATTERNS = [\n\t/\\bdon[''\\u2019]?t\\b/i,\n\t/\\bdo not\\b/i,\n\t/\\bstop\\s+\\w+ing\\b/i,\n\t/\\bnever\\b/i,\n\t/\\binstead\\b/i,\n\t/^no[,.\\s!]/i,\n\t/\\bdon[''\\u2019]?t\\s+use\\b/i,\n\t/\\bavoid\\b/i,\n\t// Korean negation — specific verb forms only to avoid matching incidental 않/대신 in explanations\n\t/하지\\s*마/,\n\t/안\\s*돼/,\n\t/쓰지\\s*마/,\n\t/[가-힣]+지\\s*마/,\n\t/하지\\s*않/, // \"do not\" specifically\n\t/쓰지\\s*않/, // \"do not use\" specifically\n];\n\n// Affirmation patterns — user is telling the AI TO do something\nconst AFFIRMATION_PATTERNS = [\n\t/\\balways\\b/i,\n\t/\\bshould\\s+always\\b/i,\n\t/\\buse\\s+\\w+\\s+instead\\b/i,\n\t// Korean affirmation\n\t/항상/,\n];\n\n// Must patterns — strong imperative (\"you must X\", \"X is required\")\nconst MUST_PATTERNS = [\n\t/\\bmust\\b/i,\n\t/\\brequired\\b/i,\n\t// Korean\n\t/반드시/,\n];\n\n// Warn patterns — cautionary (\"be careful with X\", \"watch out for X\")\nconst WARN_PATTERNS = [\n\t/\\bcareful\\b/i,\n\t/\\bwatch\\s+out\\b/i,\n\t/\\bwarning\\b/i,\n\t// Korean\n\t/주의/,\n];\n\n/**\n * Parse hook input from stdin to extract transcript path and session ID.\n */\nexport function readHookInput(stdin: string): { transcriptPath: string; sessionId: string } | null {\n\tif (!stdin.trim()) return null;\n\ttry {\n\t\tconst input = JSON.parse(stdin);\n\t\tif (input.transcript_path) {\n\t\t\tconst sessionId = input.session_id || basename(input.transcript_path, '.jsonl');\n\t\t\treturn { transcriptPath: input.transcript_path, sessionId };\n\t\t}\n\t\treturn null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * Digest a conversation transcript and extract corrections.\n * Auto-processes inbox and writes audit log.\n */\nexport function digestTranscript(brainRoot: string, transcriptPath: string, sessionId?: string): DigestResult {\n\tif (!existsSync(transcriptPath)) {\n\t\tthrow new Error(`Transcript not found: ${transcriptPath}`);\n\t}\n\n\tconst resolvedSessionId = sessionId || basename(transcriptPath, '.jsonl');\n\n\t// Dedup check: skip if already digested\n\tconst logDir = join(brainRoot, DIGEST_LOG_DIR);\n\tconst logPath = join(logDir, `${resolvedSessionId}.jsonl`);\n\tif (existsSync(logPath)) {\n\t\tconsole.log(`\\u23ED already digested session ${resolvedSessionId}, skip`);\n\t\treturn { corrections: 0, skipped: 0, transcriptPath, sessionId: resolvedSessionId };\n\t}\n\n\t// Parse transcript\n\tconst messages = parseTranscript(transcriptPath);\n\n\t// Extract corrections\n\tconst corrections = extractCorrections(messages);\n\n\tif (corrections.length === 0) {\n\t\tconsole.log(`\\uD83D\\uDCDD digest: no corrections found in session ${resolvedSessionId}`);\n\t\t// Write empty audit log to mark as digested\n\t\twriteAuditLog(brainRoot, resolvedSessionId, []);\n\t\treturn { corrections: 0, skipped: messages.length, transcriptPath, sessionId: resolvedSessionId };\n\t}\n\n\t// Apply corrections via candidate staging — counter >= 3 auto-promotes\n\tlet applied = 0;\n\tconst auditEntries: Array<{ correction: ExtractedCorrection; applied: boolean }> = [];\n\n\tfor (const correction of corrections) {\n\t\ttry {\n\t\t\tgrowCandidate(brainRoot, correction.path);\n\t\t\tlogEpisode(brainRoot, 'digest', correction.path, correction.text);\n\t\t\tauditEntries.push({ correction, applied: true });\n\t\t\tapplied++;\n\t\t} catch (err) {\n\t\t\tconsole.log(` \\u26A0\\uFE0F failed to apply: ${correction.path} — ${(err as Error).message}`);\n\t\t\tauditEntries.push({ correction, applied: false });\n\t\t}\n\t}\n\n\t// Write audit log\n\twriteAuditLog(brainRoot, resolvedSessionId, auditEntries);\n\n\tconsole.log(`\\uD83D\\uDCDD digest: ${applied} correction(s) from session ${resolvedSessionId}`);\n\treturn {\n\t\tcorrections: applied,\n\t\tskipped: messages.length - corrections.length,\n\t\ttranscriptPath,\n\t\tsessionId: resolvedSessionId,\n\t};\n}\n\n/**\n * Parse a Claude Code conversation JSONL transcript.\n * Returns user message texts only.\n */\nfunction parseTranscript(transcriptPath: string): string[] {\n\tconst content = readFileSync(transcriptPath, 'utf8');\n\tconst lines = content.split('\\n').filter(Boolean);\n\tconst messages: string[] = [];\n\n\tfor (const line of lines) {\n\t\tlet entry: TranscriptLine;\n\t\ttry {\n\t\t\tentry = JSON.parse(line);\n\t\t} catch {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Only process user messages\n\t\tif (entry.type !== 'user') continue;\n\t\tif (!entry.message || entry.message.role !== 'user') continue;\n\n\t\tconst text = extractText(entry.message.content);\n\t\tif (text) messages.push(text);\n\t}\n\n\treturn messages;\n}\n\n/**\n * Extract text from message content (handles string or content block array).\n */\nfunction extractText(content: string | Array<{ type: string; text?: string }> | undefined): string | null {\n\tif (!content) return null;\n\tif (typeof content === 'string') return content;\n\tif (Array.isArray(content)) {\n\t\tconst texts = content\n\t\t\t.filter((block) => block.type === 'text' && block.text)\n\t\t\t.map((block) => block.text!);\n\t\treturn texts.length > 0 ? texts.join('\\n') : null;\n\t}\n\treturn null;\n}\n\n/**\n * Extract corrections from user messages using pattern matching.\n * Returns up to MAX_CORRECTIONS_PER_SESSION corrections.\n */\nexport function extractCorrections(messages: string[]): ExtractedCorrection[] {\n\tconst corrections: ExtractedCorrection[] = [];\n\n\tfor (const text of messages) {\n\t\tif (corrections.length >= MAX_CORRECTIONS_PER_SESSION) break;\n\n\t\t// Skip short messages\n\t\tif (text.length < MIN_CORRECTION_LENGTH) continue;\n\n\t\t// Skip commands (start with / or !)\n\t\tif (/^[\\/!]/.test(text.trim())) continue;\n\n\t\t// Skip questions (end with ?)\n\t\tif (text.trim().endsWith('?')) continue;\n\n\t\t// Skip system-injected XML tags (Claude Code injects these into user turns)\n\t\t// e.g. <local-command-caveat>, <command-message>, <task-notification>\n\t\tif (/^<[a-zA-Z]/.test(text.trim())) continue;\n\n\t\t// Skip skill base directory injections\n\t\tif (/^Base directory for this skill:/i.test(text.trim())) continue;\n\n\t\t// Skip bullet-list formatted text (likely assistant output injected into user turn)\n\t\tif (/^[•·▸▶\\-\\*]\\s/.test(text.trim())) continue;\n\n\t\t// Check for correction patterns\n\t\tconst correction = detectCorrection(text);\n\t\tif (correction) {\n\t\t\tcorrections.push(correction);\n\t\t}\n\t}\n\n\treturn corrections;\n}\n\n/**\n * Detect if a message is a correction and extract structured data.\n * Priority: NO > MUST > WARN > DO\n */\nfunction detectCorrection(text: string): ExtractedCorrection | null {\n\tconst isNegation = NEGATION_PATTERNS.some((p) => p.test(text));\n\tconst isMust = MUST_PATTERNS.some((p) => p.test(text));\n\tconst isWarn = WARN_PATTERNS.some((p) => p.test(text));\n\tconst isAffirmation = AFFIRMATION_PATTERNS.some((p) => p.test(text));\n\n\tif (!isNegation && !isMust && !isWarn && !isAffirmation) return null;\n\n\tlet prefix: 'NO' | 'MUST' | 'WARN' | 'DO';\n\tif (isNegation) prefix = 'NO';\n\telse if (isMust) prefix = 'MUST';\n\telse if (isWarn) prefix = 'WARN';\n\telse prefix = 'DO';\n\n\tconst keywords = extractKeywords(text);\n\n\tif (keywords.length === 0) return null;\n\n\t// Build neuron path: cortex/{PREFIX}_{keyword1}_{keyword2}_{keyword3}\n\tconst pathSegment = `${prefix}_${keywords.slice(0, 3).join('_')}`;\n\tconst path = `cortex/${pathSegment}`;\n\n\treturn { text, path, prefix, keywords };\n}\n\n/**\n * Extract meaningful keywords from correction text.\n * Uses its own tokenization WITHOUT stemming for readable neuron names.\n * (tokenize() in similarity.ts stems words, which is good for Jaccard\n * matching but produces ugly names like \"consol\" instead of \"console\".)\n */\nfunction extractKeywords(text: string): string[] {\n\tconst STOP_WORDS = new Set([\n\t\t// English stop words\n\t\t'the', 'a', 'an', 'is', 'are', 'was', 'were', 'be', 'been', 'being',\n\t\t'have', 'has', 'had', 'do', 'does', 'did', 'will', 'would', 'could',\n\t\t'should', 'may', 'might', 'shall', 'can', 'need', 'dare', 'ought',\n\t\t'to', 'of', 'in', 'for', 'on', 'with', 'at', 'by', 'from', 'as',\n\t\t'into', 'through', 'during', 'before', 'after', 'above', 'below',\n\t\t'and', 'but', 'or', 'nor', 'not', 'so', 'yet', 'both', 'either',\n\t\t'neither', 'each', 'every', 'all', 'any', 'few', 'more', 'most',\n\t\t'other', 'some', 'such', 'no', 'only', 'own', 'same', 'than',\n\t\t'too', 'very', 'just', 'because', 'until', 'while', 'that', 'this',\n\t\t'these', 'those', 'it', 'its', 'me', 'my', 'we', 'us', 'you',\n\t\t'your', 'he', 'she', 'they', 'them', 'what', 'which', 'who', 'whom',\n\t\t// Correction-specific stop words\n\t\t'don', 'dont', 'stop', 'never', 'always', 'instead', 'use', 'avoid',\n\t\t'please', 'must', 'should', 'like', 'want', 'think', 'way', 'make',\n\t\t'sure', 'keep', 'try', 'let', 'get', 'put', 'set', 'new', 'also',\n\t\t'using', 'used', 'when', 'where', 'how', 'why', 'here', 'there',\n\t\t'careful', 'warning', 'watch', 'out', 'required',\n\t]);\n\n\treturn text\n\t\t.replace(/([a-z])([A-Z])/g, '$1 $2') // camelCase → words\n\t\t.replace(/[^a-zA-Z0-9\\u3000-\\u9FFF\\uAC00-\\uD7AF]+/g, ' ') // punctuation → space\n\t\t.toLowerCase()\n\t\t.split(/\\s+/)\n\t\t.filter((t) => t.length > 2 && !STOP_WORDS.has(t));\n}\n\n/**\n * Write audit log for digest session.\n */\nfunction writeAuditLog(\n\tbrainRoot: string,\n\tsessionId: string,\n\tentries: Array<{ correction: ExtractedCorrection; applied: boolean }>,\n): void {\n\tconst logDir = join(brainRoot, DIGEST_LOG_DIR);\n\tif (!existsSync(logDir)) {\n\t\tmkdirSync(logDir, { recursive: true });\n\t}\n\n\tconst logPath = join(logDir, `${sessionId}.jsonl`);\n\tconst lines = entries.map((e) =>\n\t\tJSON.stringify({\n\t\t\tts: new Date().toISOString(),\n\t\t\tpath: e.correction.path,\n\t\t\ttext: e.correction.text,\n\t\t\tprefix: e.correction.prefix,\n\t\t\tkeywords: e.correction.keywords,\n\t\t\tapplied: e.applied,\n\t\t}),\n\t);\n\n\t// Even if no entries, write empty file as dedup marker\n\twriteFileSync(logPath, lines.join('\\n') + (lines.length > 0 ? '\\n' : ''), 'utf8');\n}\n","// hebbian — Outcome Tracking (Phase 5: Feedback Loop)\n//\n// Captures session state at start, detects outcomes at end,\n// and writes contra signals on revert. Git + working tree detection.\n//\n// Data flow:\n// SessionStart hook → captureSessionStart() → session_state_{uuid}.json\n// Stop hook → detectOutcome() → log episode + write contra on revert\n// Evolve → buildOutcomeSummary() → per-neuron outcome aggregation\n//\n// Session state is keyed by UUID to handle concurrent/resumed sessions.\n// Outcome detection compares both committed (HEAD) and uncommitted (working tree) changes.\n\nimport { execSync } from 'node:child_process';\nimport { existsSync, mkdirSync, writeFileSync, readFileSync, readdirSync, rmSync, statSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { randomUUID } from 'node:crypto';\nimport { SESSION_STATE_DIR, PROTECTED_REGIONS_CONTRA } from './constants';\nimport { scanBrain } from './scanner';\nimport { runSubsumption } from './subsumption';\nimport { contraNeuron } from './fire';\nimport { logEpisode, readEpisodes } from './episode';\nimport type { OutcomeType } from './constants';\n\n// --- Types ---\n\nexport interface SessionState {\n\tts: string;\n\tsha: string;\n\tstatus: string[];\n\tneurons: string[];\n\tuuid: string;\n}\n\nexport interface OutcomeResult {\n\toutcome: OutcomeType;\n\tneuronsAffected: number;\n\tprotectedSkipped: number;\n\tdetail: string;\n}\n\n// --- Session Start ---\n\n/**\n * Capture session state: git HEAD SHA, working tree status, active neurons.\n * Writes session_state_{uuid}.json to hippocampus/session_state/.\n * Returns null if not in a git repo.\n */\nexport function captureSessionStart(brainRoot: string): SessionState | null {\n\t// Get git HEAD SHA\n\tlet sha: string;\n\ttry {\n\t\tsha = execSync('git rev-parse HEAD', { encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();\n\t} catch {\n\t\tconsole.log('⏭️ session start: not a git repo, skipping');\n\t\treturn null;\n\t}\n\n\t// Capture working tree status\n\tlet status: string[];\n\ttry {\n\t\tconst raw = execSync('git status --porcelain', { encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();\n\t\tstatus = raw ? raw.split('\\n') : [];\n\t} catch {\n\t\tstatus = [];\n\t}\n\n\t// Get subsumption-filtered neurons (matches what emit selects)\n\tconst brain = scanBrain(brainRoot);\n\tconst result = runSubsumption(brain);\n\tconst neurons: string[] = [];\n\tfor (const region of result.activeRegions) {\n\t\tfor (const neuron of region.neurons) {\n\t\t\tif (!neuron.isDormant && neuron.counter > 0) {\n\t\t\t\tneurons.push(`${region.name}/${neuron.path}`);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Write session state with UUID key\n\tconst uuid = randomUUID();\n\tconst stateDir = join(brainRoot, SESSION_STATE_DIR);\n\tif (!existsSync(stateDir)) {\n\t\tmkdirSync(stateDir, { recursive: true });\n\t}\n\n\tconst state: SessionState = { ts: new Date().toISOString(), sha, status, neurons, uuid };\n\twriteFileSync(join(stateDir, `state_${uuid}.json`), JSON.stringify(state), 'utf8');\n\n\tconsole.log(`📸 session start: SHA ${sha.slice(0, 7)}, ${neurons.length} active neurons`);\n\treturn state;\n}\n\n// --- Session End / Outcome Detection ---\n\n/**\n * Detect session outcome by comparing git state at start vs end.\n * Writes contra on revert, logs outcome episode.\n * Returns null if no session state or no changes detected.\n */\nexport function detectOutcome(brainRoot: string): OutcomeResult | null {\n\t// Find most recent session state file\n\tconst state = readLatestSessionState(brainRoot);\n\tif (!state) {\n\t\tconsole.log('⏭️ session end: no session state found, skipping');\n\t\treturn null;\n\t}\n\n\t// Get current git state\n\tlet currentSha: string;\n\ttry {\n\t\tcurrentSha = execSync('git rev-parse HEAD', { encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();\n\t} catch {\n\t\tconsole.log('⏭️ session end: not a git repo, skipping');\n\t\tcleanupSessionState(brainRoot, state.uuid);\n\t\treturn null;\n\t}\n\n\tlet currentStatus: string[];\n\ttry {\n\t\tconst raw = execSync('git status --porcelain', { encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();\n\t\tcurrentStatus = raw ? filterHebbianPaths(raw.split('\\n')) : [];\n\t} catch {\n\t\tcurrentStatus = [];\n\t}\n\n\t// Also filter start status for consistent comparison\n\tconst filteredStartStatus = filterHebbianPaths(state.status);\n\n\t// Detect outcome using 5-case logic (filtered status excludes hebbian bookkeeping)\n\tconst outcome = classifyOutcome(\n\t\t{ ...state, status: filteredStartStatus },\n\t\tcurrentSha,\n\t\tcurrentStatus,\n\t);\n\n\tif (!outcome) {\n\t\tconsole.log('📊 session end: no changes detected (no-op)');\n\t\tcleanupSessionState(brainRoot, state.uuid);\n\t\treturn null;\n\t}\n\n\t// Log outcome episode\n\tconst neurons = state.neurons;\n\tlogEpisode(brainRoot, 'session-end', '', `outcome:${outcome}`, { outcome, neurons });\n\n\tlet result: OutcomeResult;\n\n\tif (outcome === 'revert') {\n\t\t// Write contra on active neurons (skip protected regions)\n\t\tconst { affected, skipped } = applyContra(brainRoot, neurons);\n\t\tresult = {\n\t\t\toutcome: 'revert',\n\t\t\tneuronsAffected: affected,\n\t\t\tprotectedSkipped: skipped,\n\t\t\tdetail: `${affected} neurons contra'd (${skipped} protected skipped)`,\n\t\t};\n\t\tconsole.log(`📊 session end: revert — ${result.detail}`);\n\t} else {\n\t\tresult = {\n\t\t\toutcome: 'acceptance',\n\t\t\tneuronsAffected: 0,\n\t\t\tprotectedSkipped: 0,\n\t\t\tdetail: 'changes accepted',\n\t\t};\n\t\tconsole.log('📊 session end: acceptance');\n\t}\n\n\tcleanupSessionState(brainRoot, state.uuid);\n\treturn result;\n}\n\n// --- Outcome Classification ---\n\n/**\n * Classify outcome based on git state comparison.\n *\n * Case 1: status unchanged + HEAD unchanged → no-op (null)\n * Case 2: new files/mods in status vs start → acceptance\n * Case 3: status items removed/restored vs start → possible revert\n * Case 4: HEAD moved, non-empty committed diff → acceptance\n * Case 5: HEAD moved, net-zero diff OR \"revert\" in git log → revert\n */\nexport function classifyOutcome(\n\tstate: SessionState,\n\tcurrentSha: string,\n\tcurrentStatus: string[],\n): OutcomeType | null {\n\tconst headMoved = state.sha !== currentSha;\n\tconst startStatusSet = new Set(state.status);\n\tconst endStatusSet = new Set(currentStatus);\n\n\t// Check for working tree changes\n\tconst newItems = currentStatus.filter((s) => !startStatusSet.has(s));\n\tconst removedItems = state.status.filter((s) => !endStatusSet.has(s));\n\n\tif (!headMoved) {\n\t\t// HEAD unchanged — check working tree only\n\t\tif (newItems.length === 0 && removedItems.length === 0) {\n\t\t\treturn null; // Case 1: no-op\n\t\t}\n\t\tif (newItems.length > 0) {\n\t\t\treturn 'acceptance'; // Case 2: new uncommitted work\n\t\t}\n\t\tif (removedItems.length > 0) {\n\t\t\treturn 'revert'; // Case 3: uncommitted work was undone\n\t\t}\n\t\treturn null;\n\t}\n\n\t// HEAD moved — check working tree first, then committed changes\n\t// If there are new uncommitted items alongside commits, that's still acceptance\n\tif (newItems.length > 0) {\n\t\treturn 'acceptance'; // Case 2b: commits + new uncommitted work\n\t}\n\n\ttry {\n\t\tconst diffStat = execSync(\n\t\t\t`git diff ${state.sha}..${currentSha} --stat`,\n\t\t\t{ encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe'] },\n\t\t).trim();\n\n\t\tconst logOutput = execSync(\n\t\t\t`git log --oneline ${state.sha}..${currentSha}`,\n\t\t\t{ encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe'] },\n\t\t).trim();\n\n\t\t// Case 5: \"revert\" in commit messages\n\t\tif (/\\brevert\\b/i.test(logOutput)) {\n\t\t\treturn 'revert';\n\t\t}\n\n\t\t// Case 5: net-zero diff (commits exist but cancel out)\n\t\tif (!diffStat) {\n\t\t\treturn 'revert';\n\t\t}\n\n\t\t// Case 4: non-empty diff\n\t\treturn 'acceptance';\n\t} catch {\n\t\t// git commands failed (SHA might not exist after force push)\n\t\treturn null;\n\t}\n}\n\n// --- Contra Application ---\n\nfunction applyContra(brainRoot: string, neurons: string[]): { affected: number; skipped: number } {\n\tlet affected = 0;\n\tlet skipped = 0;\n\n\tfor (const neuronPath of neurons) {\n\t\tconst region = neuronPath.split('/')[0] || '';\n\t\tif (PROTECTED_REGIONS_CONTRA.includes(region)) {\n\t\t\tskipped++;\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst result = contraNeuron(brainRoot, neuronPath);\n\t\tif (result > 0) {\n\t\t\taffected++;\n\t\t}\n\t}\n\n\treturn { affected, skipped };\n}\n\n// --- Outcome Summary for Evolve ---\n\n/**\n * Build per-neuron outcome summary from episode history.\n * Returns markdown section for the evolve prompt, or empty string if no data.\n */\nexport function buildOutcomeSummary(brainRoot: string): string {\n\tconst episodes = readEpisodes(brainRoot);\n\tconst outcomeEpisodes = episodes.filter((e) => e.outcome && e.neurons);\n\n\tif (outcomeEpisodes.length === 0) return '';\n\n\t// Aggregate per-neuron\n\tconst stats = new Map<string, { sessions: number; reverts: number; acceptances: number }>();\n\n\tfor (const ep of outcomeEpisodes) {\n\t\tfor (const neuron of ep.neurons!) {\n\t\t\tconst existing = stats.get(neuron) || { sessions: 0, reverts: 0, acceptances: 0 };\n\t\t\texisting.sessions++;\n\t\t\tif (ep.outcome === 'revert') existing.reverts++;\n\t\t\tif (ep.outcome === 'acceptance') existing.acceptances++;\n\t\t\tstats.set(neuron, existing);\n\t\t}\n\t}\n\n\t// Format\n\tconst lines: string[] = ['## Outcome Signals (from session history)\\n'];\n\tlines.push('Neurons with high contra_ratio (>0.5) are consistently present in reverted sessions. Consider pruning or modifying them.\\n');\n\n\tconst sorted = [...stats.entries()].sort((a, b) => {\n\t\tconst ratioA = a[1].sessions > 0 ? a[1].reverts / a[1].sessions : 0;\n\t\tconst ratioB = b[1].sessions > 0 ? b[1].reverts / b[1].sessions : 0;\n\t\treturn ratioB - ratioA;\n\t});\n\n\tfor (const [neuron, s] of sorted) {\n\t\tconst ratio = s.sessions > 0 ? (s.reverts / s.sessions).toFixed(2) : '0.00';\n\t\tconst trend = parseFloat(ratio) > 0.5 ? 'act on this' : parseFloat(ratio) > 0.3 ? 'watch' : '';\n\t\t// Sanitize neuron path: strip newlines to prevent prompt section injection\n\t\tconst safePath = neuron.replace(/[\\n\\r#]/g, ' ').trim();\n\t\tlines.push(`- ${safePath}: sessions=${s.sessions} reverts=${s.reverts} acceptances=${s.acceptances} contra_ratio=${ratio} ${trend}`);\n\t}\n\n\tlines.push('');\n\treturn lines.join('\\n');\n}\n\n// --- Session State Helpers ---\n\nfunction readLatestSessionState(brainRoot: string): SessionState | null {\n\tconst stateDir = join(brainRoot, SESSION_STATE_DIR);\n\tif (!existsSync(stateDir)) return null;\n\n\tlet latest: { path: string; mtime: number } | null = null;\n\ttry {\n\t\tfor (const entry of readdirSync(stateDir)) {\n\t\t\tif (!entry.startsWith('state_') || !entry.endsWith('.json')) continue;\n\t\t\tconst fullPath = join(stateDir, entry);\n\t\t\tconst mtime = statSync(fullPath).mtimeMs;\n\t\t\tif (!latest || mtime > latest.mtime) {\n\t\t\t\tlatest = { path: fullPath, mtime };\n\t\t\t}\n\t\t}\n\t} catch {\n\t\treturn null;\n\t}\n\n\tif (!latest) return null;\n\n\ttry {\n\t\treturn JSON.parse(readFileSync(latest.path, 'utf8')) as SessionState;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * Filter out hebbian's own bookkeeping paths from git status lines.\n * Prevents session state files, digest logs, and episode logs from\n * being counted as \"changes\" in outcome detection.\n */\nfunction filterHebbianPaths(statusLines: string[]): string[] {\n\tconst hebbianPatterns = ['hippocampus/session_state', 'hippocampus/session_log', 'hippocampus/digest_log', '_inbox/'];\n\treturn statusLines.filter((line) =>\n\t\t!hebbianPatterns.some((p) => line.includes(p)),\n\t);\n}\n\nfunction cleanupSessionState(brainRoot: string, uuid: string): void {\n\tconst stateDir = join(brainRoot, SESSION_STATE_DIR);\n\tconst filePath = join(stateDir, `state_${uuid}.json`);\n\ttry {\n\t\tif (existsSync(filePath)) rmSync(filePath);\n\t} catch { /* best effort */ }\n}\n","// hebbian — Evolve Engine (LLM-powered brain evolution)\n//\n// Reads recent episodes + current brain state, sends to an LLM,\n// and applies proposed mutations (grow, fire, signal, prune, decay).\n//\n// Data flow:\n// readEpisodes() → scanBrain() → buildPrompt() → callGemini()\n// → parseActions() → validateActions() → executeActions()\n//\n// Currently supports Gemini only. Other providers (Groq, OpenAI,\n// Anthropic, Ollama) planned for future expansion.\n\nimport { existsSync, readFileSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { readEpisodes, logEpisode } from './episode';\nimport type { Episode } from './episode';\nimport { scanBrain } from './scanner';\nimport type { Brain } from './types';\nimport { REGIONS, REGION_PRIORITY } from './constants';\nimport { fireNeuron } from './fire';\nimport { growCandidate } from './candidates';\nimport { signalNeuron } from './signal';\nimport { rollbackNeuron } from './rollback';\nimport { runDecay } from './decay';\nimport { buildOutcomeSummary } from './outcome';\nimport type { SignalType } from './constants';\n\n// --- Types ---\n\nexport interface EvolveAction {\n\ttype: 'grow' | 'fire' | 'signal' | 'prune' | 'decay';\n\tpath: string;\n\treason: string;\n\tsignal?: string;\n}\n\nexport interface EvolveResult {\n\tactions: EvolveAction[];\n\texecuted: number;\n\tskipped: number;\n\tdryRun: boolean;\n}\n\nconst MAX_ACTIONS = 10;\nconst PROTECTED_REGIONS = ['brainstem', 'limbic', 'sensors'];\nconst DEFAULT_MODEL = 'gemini-2.0-flash-lite';\nconst API_TIMEOUT = 30_000;\nconst RETRY_DELAY = 5_000;\nconst EVOLVE_COOLDOWN_FILE = 'hippocampus/evolve_last_run';\n\n// --- Main Entry ---\n\nexport async function runEvolve(brainRoot: string, dryRun: boolean): Promise<EvolveResult> {\n\tconst apiKey = process.env.GEMINI_API_KEY;\n\tif (!apiKey) {\n\t\tconsole.error('❌ GEMINI_API_KEY not set. Get one at https://aistudio.google.com/apikey');\n\t\treturn { actions: [], executed: 0, skipped: 0, dryRun };\n\t}\n\n\t// Cooldown check — prevents runaway API calls (default 60s, bypass with EVOLVE_NO_COOLDOWN=1)\n\tif (!dryRun && process.env.EVOLVE_NO_COOLDOWN !== '1') {\n\t\tconst cooldownMs = (parseInt(process.env.EVOLVE_COOLDOWN_SECONDS ?? '60', 10) || 60) * 1000;\n\t\tconst cooldownPath = join(brainRoot, EVOLVE_COOLDOWN_FILE);\n\t\tif (existsSync(cooldownPath)) {\n\t\t\tconst lastRun = parseInt(readFileSync(cooldownPath, 'utf8').trim(), 10);\n\t\t\tconst elapsed = Date.now() - lastRun;\n\t\t\tif (elapsed < cooldownMs) {\n\t\t\t\tconst remaining = Math.ceil((cooldownMs - elapsed) / 1000);\n\t\t\t\tconsole.log(`⏳ evolve cooldown: ${remaining}s remaining (use EVOLVE_NO_COOLDOWN=1 to bypass)`);\n\t\t\t\treturn { actions: [], executed: 0, skipped: 0, dryRun };\n\t\t\t}\n\t\t}\n\t}\n\n\t// 1. Gather context\n\tconst episodes = readEpisodes(brainRoot);\n\tconst brain = scanBrain(brainRoot);\n\tconst summary = buildBrainSummary(brain);\n\tconst outcomeSummary = buildOutcomeSummary(brainRoot);\n\tconst prompt = buildPrompt(summary, episodes, outcomeSummary);\n\n\t// 2. Call LLM\n\tlet rawActions: EvolveAction[];\n\ttry {\n\t\trawActions = await callGemini(prompt, apiKey);\n\t} catch (err) {\n\t\tconst msg = (err as Error).message;\n\t\tconsole.log(`⏭️ evolve skipped: ${msg}`);\n\t\tlogEpisode(brainRoot, 'evolve-error', '', msg);\n\t\treturn { actions: [], executed: 0, skipped: 0, dryRun };\n\t}\n\n\t// 3. Validate\n\tconst actions = validateActions(rawActions, brain);\n\tconst skipped = rawActions.length - actions.length;\n\n\tif (actions.length === 0) {\n\t\tconsole.log('🧠 evolve: no valid actions proposed');\n\t\treturn { actions: [], executed: 0, skipped, dryRun };\n\t}\n\n\t// 4. Execute (or dry-run)\n\tif (dryRun) {\n\t\tconsole.log(`🧠 evolve (dry-run): ${actions.length} action(s) proposed`);\n\t\tfor (const action of actions) {\n\t\t\tconsole.log(` ${actionIcon(action.type)} ${action.type} ${action.path} — ${action.reason}`);\n\t\t}\n\t\treturn { actions, executed: 0, skipped, dryRun: true };\n\t}\n\n\tconst executed = executeActions(brainRoot, actions);\n\tlogEpisode(brainRoot, 'evolve', '', `${executed} action(s) executed, ${skipped} skipped`);\n\tconsole.log(`🧠 evolve: ${executed} action(s) executed, ${skipped} skipped`);\n\n\t// Record timestamp for cooldown\n\twriteFileSync(join(brainRoot, EVOLVE_COOLDOWN_FILE), String(Date.now()), 'utf8');\n\n\treturn { actions, executed, skipped, dryRun: false };\n}\n\n// --- Brain Summary ---\n\nexport function buildBrainSummary(brain: Brain): string {\n\tconst lines: string[] = ['# Brain State\\n'];\n\n\tfor (const region of brain.regions) {\n\t\tconst neurons = region.neurons;\n\t\tif (neurons.length === 0 && !region.hasBomb) continue;\n\n\t\tlines.push(`## ${region.name} (P${REGION_PRIORITY[region.name as keyof typeof REGION_PRIORITY]})`);\n\t\tif (region.hasBomb) lines.push('⚠️ BOMB active — region blocked');\n\n\t\tfor (const neuron of neurons) {\n\t\t\tconst flags: string[] = [];\n\t\t\tif (neuron.isDormant) flags.push('dormant');\n\t\t\tif (neuron.hasBomb) flags.push('bomb');\n\t\t\tif (neuron.hasMemory) flags.push('memory');\n\t\t\tif (neuron.dopamine > 0) flags.push(`dopamine:${neuron.dopamine}`);\n\t\t\tconst flagStr = flags.length > 0 ? ` [${flags.join(', ')}]` : '';\n\t\t\tlines.push(`- ${neuron.path} (counter:${neuron.counter}, intensity:${neuron.intensity})${flagStr}`);\n\t\t}\n\t\tlines.push('');\n\t}\n\n\treturn lines.join('\\n');\n}\n\n// --- Prompt Sanitization ---\n\n/**\n * Strip content that could inject markdown sections or override LLM instructions.\n * Takes only the first line and removes leading header markers.\n */\nfunction sanitizeForPrompt(text: string): string {\n\tconst firstLine = (text.split('\\n')[0] ?? '').trim();\n\treturn firstLine.replace(/^#+\\s*/g, '').slice(0, 200);\n}\n\n// --- Prompt Construction ---\n\nexport function buildPrompt(summary: string, episodes: Episode[], outcomeSummary?: string): string {\n\tconst episodeLines = episodes.length > 0\n\t\t? episodes.map((e) => `- [${e.ts}] ${e.type}: ${e.path} — ${sanitizeForPrompt(e.detail)}`).join('\\n')\n\t\t: '(no recent episodes)';\n\n\tconst outcomeSection = outcomeSummary || '';\n\n\treturn `You are the evolve engine for a hebbian brain — a filesystem-based memory system for AI agents.\n\n## Axioms\n- Folder = Neuron, File = Firing Trace, Counter = Activation strength\n- 7 regions in subsumption cascade: brainstem(P0) > limbic(P1) > hippocampus(P2) > sensors(P3) > cortex(P4) > ego(P5) > prefrontal(P6)\n- Lower priority ALWAYS overrides higher priority\n- PROTECTED regions (brainstem, limbic, sensors): NEVER propose mutations for these\n\n## Current Brain\n${summary}\n\n${outcomeSection}\n## Recent Episodes (last ${episodes.length})\n${episodeLines}\n\n## Available Actions\n- grow: Create a new neuron at the given path (region/name). Use for recurring patterns that deserve permanent memory.\n- fire: Increment an existing neuron's counter. Use for strengthening well-confirmed rules.\n- signal: Add dopamine (reward), bomb (block), or memory signal. Use sparingly.\n- prune: Decrement a neuron's counter. Use for rules that aren't working or cause issues.\n- decay: Mark inactive neurons as dormant. Use for stale rules with no recent activity.\n\n## Constraints\n- Max ${MAX_ACTIONS} actions per cycle\n- PREFER fire over grow — strengthen existing neurons before creating new ones\n- NEVER target brainstem, limbic, or sensors regions\n- Each action needs a \"reason\" explaining why\n\n## Task\nAnalyze the brain state and recent episodes. Propose actions to improve the brain.\nFocus on: strengthening repeatedly-used rules, pruning ineffective ones, growing new neurons from repeated patterns.\n\nRespond with a JSON array of actions:\n[{\"type\":\"fire\",\"path\":\"cortex/NO_console_log\",\"reason\":\"fired 3 times in recent sessions\"}]`;\n}\n\n// --- Gemini API ---\n\nexport async function callGemini(prompt: string, apiKey: string): Promise<EvolveAction[]> {\n\tconst model = process.env.EVOLVE_MODEL || DEFAULT_MODEL;\n\tconst url = `https://generativelanguage.googleapis.com/v1beta/models/${model}:generateContent`;\n\n\tconst body = {\n\t\tcontents: [{ parts: [{ text: prompt }] }],\n\t\tgenerationConfig: {\n\t\t\tresponseMimeType: 'application/json',\n\t\t\ttemperature: 0.2,\n\t\t},\n\t};\n\n\tlet lastError: Error | null = null;\n\n\t// Retry once on failure\n\tfor (let attempt = 0; attempt < 2; attempt++) {\n\t\tif (attempt > 0) {\n\t\t\tawait new Promise((r) => setTimeout(r, RETRY_DELAY));\n\t\t}\n\n\t\ttry {\n\t\t\tconst res = await fetch(url, {\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: { 'Content-Type': 'application/json', 'x-goog-api-key': apiKey },\n\t\t\t\tbody: JSON.stringify(body),\n\t\t\t\tsignal: AbortSignal.timeout(API_TIMEOUT),\n\t\t\t});\n\n\t\t\tif (!res.ok) {\n\t\t\t\tlastError = new Error(`Gemini API ${res.status}: ${res.statusText}`);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst data = await res.json() as {\n\t\t\t\tcandidates?: Array<{ content?: { parts?: Array<{ text?: string }> } }>;\n\t\t\t\terror?: { message?: string };\n\t\t\t};\n\n\t\t\tif (data.error) {\n\t\t\t\tlastError = new Error(`Gemini error: ${data.error.message || 'unknown'}`);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst text = data.candidates?.[0]?.content?.parts?.[0]?.text;\n\t\t\tif (!text) {\n\t\t\t\tlastError = new Error('Gemini returned empty response');\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\treturn parseActions(text);\n\t\t} catch (err) {\n\t\t\tlastError = err as Error;\n\t\t\tcontinue;\n\t\t}\n\t}\n\n\tthrow lastError || new Error('Gemini call failed');\n}\n\n// --- Action Parsing ---\n\nexport function parseActions(text: string): EvolveAction[] {\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(text);\n\t} catch {\n\t\tthrow new Error(`Failed to parse LLM response as JSON: ${text.slice(0, 100)}`);\n\t}\n\n\tif (!Array.isArray(parsed)) {\n\t\tthrow new Error('LLM response is not an array');\n\t}\n\n\tconst validTypes = new Set(['grow', 'fire', 'signal', 'prune', 'decay']);\n\tconst actions: EvolveAction[] = [];\n\n\tfor (const item of parsed) {\n\t\tif (!item || typeof item !== 'object') continue;\n\t\tconst { type, path, reason, signal } = item as Record<string, unknown>;\n\t\tif (typeof type !== 'string' || !validTypes.has(type)) continue;\n\t\tif (typeof path !== 'string' || path.length === 0) continue;\n\t\tif (typeof reason !== 'string') continue;\n\n\t\tconst action: EvolveAction = { type: type as EvolveAction['type'], path, reason };\n\t\tif (type === 'signal' && typeof signal === 'string') {\n\t\t\taction.signal = signal;\n\t\t}\n\t\tactions.push(action);\n\t}\n\n\treturn actions;\n}\n\n// --- Action Validation ---\n\nexport function validateActions(actions: EvolveAction[], _brain: Brain): EvolveAction[] {\n\treturn actions\n\t\t.filter((action) => {\n\t\t\t// Block path traversal attempts\n\t\t\tif (action.path.includes('..') || action.path.startsWith('/')) {\n\t\t\t\tconsole.log(` ⚠️ blocked: ${action.type} ${action.path} (path traversal)`);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tconst region = action.path.split('/')[0];\n\t\t\tif (!region || PROTECTED_REGIONS.includes(region)) {\n\t\t\t\tconsole.log(` 🛡️ blocked: ${action.type} ${action.path} (protected region)`);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (!(REGIONS as readonly string[]).includes(region)) {\n\t\t\t\tconsole.log(` ⚠️ skipped: ${action.type} ${action.path} (invalid region)`);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (action.type === 'signal' && action.signal && !['dopamine', 'bomb', 'memory'].includes(action.signal)) {\n\t\t\t\tconsole.log(` ⚠️ skipped: signal ${action.path} (invalid signal type: ${action.signal})`);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn true;\n\t\t})\n\t\t.slice(0, MAX_ACTIONS);\n}\n\n// --- Action Execution ---\n\nexport function executeActions(brainRoot: string, actions: EvolveAction[]): number {\n\tlet executed = 0;\n\n\tfor (const action of actions) {\n\t\ttry {\n\t\t\tswitch (action.type) {\n\t\t\t\tcase 'fire':\n\t\t\t\t\tfireNeuron(brainRoot, action.path);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'grow':\n\t\t\t\t\tgrowCandidate(brainRoot, action.path);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'signal':\n\t\t\t\t\tsignalNeuron(brainRoot, action.path, (action.signal || 'dopamine') as SignalType);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'prune':\n\t\t\t\t\trollbackNeuron(brainRoot, action.path);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'decay':\n\t\t\t\t\trunDecay(brainRoot, 0); // immediate decay for specified path\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tconsole.log(` ${actionIcon(action.type)} ${action.type} ${action.path}`);\n\t\t\texecuted++;\n\t\t} catch (err) {\n\t\t\tconsole.log(` ⚠️ failed: ${action.type} ${action.path} — ${(err as Error).message}`);\n\t\t}\n\t}\n\n\treturn executed;\n}\n\nfunction actionIcon(type: string): string {\n\tswitch (type) {\n\t\tcase 'fire': return '🔥';\n\t\tcase 'grow': return '🌱';\n\t\tcase 'signal': return '⚡';\n\t\tcase 'prune': return '✂️';\n\t\tcase 'decay': return '💤';\n\t\tdefault: return '❓';\n\t}\n}\n","// hebbian — Self-Diagnostic Command\n//\n// \"Why isn't it working?\" — checks hooks, brain integrity, versions, npx path.\n// Each check emits a ✅/⚠️/❌ line with an actionable fix if broken.\n\nimport { existsSync, readFileSync, readdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { execSync } from 'node:child_process';\nimport { REGIONS } from './constants';\n\nexport interface DoctorResult {\n\tpassed: number;\n\twarnings: number;\n\tfailed: number;\n}\n\nexport async function runDoctor(brainRoot: string): Promise<DoctorResult> {\n\tlet passed = 0, warnings = 0, failed = 0;\n\n\tconst ok = (msg: string) => { console.log(` ✅ ${msg}`); passed++; };\n\tconst warn = (msg: string, fix?: string) => {\n\t\tconsole.log(` ⚠️ ${msg}`);\n\t\tif (fix) console.log(` → ${fix}`);\n\t\twarnings++;\n\t};\n\tconst fail = (msg: string, fix?: string) => {\n\t\tconsole.log(` ❌ ${msg}`);\n\t\tif (fix) console.log(` → ${fix}`);\n\t\tfailed++;\n\t};\n\n\tconsole.log('\\n🩺 hebbian doctor\\n');\n\n\t// ── Node.js version ──────────────────────────────────────────────\n\tconsole.log('Node.js');\n\tconst nodeVer = process.versions.node;\n\tconst [major] = nodeVer.split('.').map(Number);\n\tif ((major ?? 0) >= 22) {\n\t\tok(`Node.js ${nodeVer} (>= 22 required)`);\n\t} else {\n\t\tfail(`Node.js ${nodeVer} — need >= 22`, 'nvm install 22 && nvm use 22');\n\t}\n\n\t// ── npm / package version ──────────────────────────────────────────\n\tconsole.log('\\nnpm package');\n\ttry {\n\t\tconst pkgPath = new URL('../package.json', import.meta.url).pathname;\n\t\tconst pkg = JSON.parse(readFileSync(pkgPath, 'utf8')) as { version?: string };\n\t\tconst local = pkg.version || 'unknown';\n\n\t\tlet remote = '';\n\t\ttry {\n\t\t\tconst out = execSync('npm view hebbian version 2>/dev/null', { timeout: 5000 }).toString().trim();\n\t\t\tremote = out;\n\t\t} catch { /* network unavailable */ }\n\n\t\tif (remote && remote !== local) {\n\t\t\twarn(`hebbian ${local} installed, ${remote} available`, 'npm i -g hebbian@latest');\n\t\t} else {\n\t\t\tok(`hebbian ${local}${remote ? ' (up to date)' : ''}`);\n\t\t}\n\t} catch {\n\t\twarn('Could not read package.json');\n\t}\n\n\t// ── Brain structure ────────────────────────────────────────────────\n\tconsole.log('\\nbrain structure');\n\tif (!existsSync(brainRoot)) {\n\t\tfail(`Brain not found at ${brainRoot}`, 'hebbian init ./brain');\n\t} else {\n\t\tok(`Brain root: ${brainRoot}`);\n\t\tfor (const region of REGIONS) {\n\t\t\tconst regionDir = join(brainRoot, region);\n\t\t\tif (existsSync(regionDir)) {\n\t\t\t\tok(`Region: ${region}`);\n\t\t\t} else {\n\t\t\t\twarn(`Missing region: ${region}`, `mkdir -p ${regionDir}`);\n\t\t\t}\n\t\t}\n\t}\n\n\t// ── Claude Code hooks ──────────────────────────────────────────────\n\tconsole.log('\\nClaude Code hooks');\n\tconst settingsPath = join(process.cwd(), '.claude', 'settings.local.json');\n\tif (!existsSync(settingsPath)) {\n\t\twarn('No .claude/settings.local.json found', 'hebbian claude install');\n\t} else {\n\t\ttry {\n\t\t\tconst settings = JSON.parse(readFileSync(settingsPath, 'utf8')) as {\n\t\t\t\thooks?: Record<string, unknown[]>;\n\t\t\t};\n\t\t\tconst hooks = settings.hooks || {};\n\t\t\tconst hasStop = Object.entries(hooks).some(([event, entries]) =>\n\t\t\t\tevent === 'Stop' && Array.isArray(entries) && entries.some((e: unknown) =>\n\t\t\t\t\ttypeof e === 'object' && e !== null && 'command' in e &&\n\t\t\t\t\ttypeof (e as { command?: unknown }).command === 'string' &&\n\t\t\t\t\t(e as { command: string }).command.includes('hebbian digest'),\n\t\t\t\t),\n\t\t\t);\n\t\t\tconst hasStart = Object.entries(hooks).some(([event, entries]) =>\n\t\t\t\tevent === 'SessionStart' && Array.isArray(entries) && entries.some((e: unknown) =>\n\t\t\t\t\ttypeof e === 'object' && e !== null && 'command' in e &&\n\t\t\t\t\ttypeof (e as { command?: unknown }).command === 'string' &&\n\t\t\t\t\t(e as { command: string }).command.includes('hebbian emit'),\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tif (hasStop && hasStart) {\n\t\t\t\tok('SessionStart + Stop hooks installed');\n\t\t\t} else {\n\t\t\t\tif (!hasStart) warn('SessionStart hook missing', 'hebbian claude install');\n\t\t\t\tif (!hasStop) warn('Stop hook missing', 'hebbian claude install');\n\t\t\t}\n\t\t} catch {\n\t\t\tfail('Malformed .claude/settings.local.json', 'hebbian claude install');\n\t\t}\n\t}\n\n\t// ── npx path resolution ────────────────────────────────────────────\n\tconsole.log('\\nnpx resolution');\n\ttry {\n\t\tconst resolved = execSync('which npx', { timeout: 3000 }).toString().trim();\n\t\tok(`npx: ${resolved}`);\n\t} catch {\n\t\tfail('npx not found in PATH', 'Install Node.js from https://nodejs.org');\n\t}\n\n\t// ── Brain candidates ───────────────────────────────────────────────\n\tconsole.log('\\ncandidates');\n\ttry {\n\t\tlet total = 0;\n\t\tfor (const region of REGIONS) {\n\t\t\tconst candidateDir = join(brainRoot, region, '_candidates');\n\t\t\tif (existsSync(candidateDir)) {\n\t\t\t\tconst entries = readdirSync(candidateDir, { withFileTypes: true });\n\t\t\t\tconst count = entries.filter(e => e.isDirectory()).length;\n\t\t\t\ttotal += count;\n\t\t\t}\n\t\t}\n\t\tif (total === 0) {\n\t\t\tok('No pending candidates');\n\t\t} else {\n\t\t\twarn(`${total} candidate(s) pending`, 'hebbian candidates — to view');\n\t\t}\n\t} catch {\n\t\twarn('Could not scan candidates');\n\t}\n\n\t// ── Summary ────────────────────────────────────────────────────────\n\tconsole.log(`\\n${'─'.repeat(40)}`);\n\tconsole.log(` passed: ${passed} warnings: ${warnings} failed: ${failed}`);\n\tif (failed > 0) {\n\t\tconsole.log(' Fix the ❌ issues above, then re-run `hebbian doctor`');\n\t} else if (warnings > 0) {\n\t\tconsole.log(' Looking mostly good! Review ⚠️ warnings above.');\n\t} else {\n\t\tconsole.log(' All checks passed. 🎉');\n\t}\n\tconsole.log('');\n\n\treturn { passed, warnings, failed };\n}\n","// hebbian — Folder-as-Neuron Brain for Any AI Agent\n//\n// \"Neurons that fire together, wire together.\" — Donald Hebb (1949)\n//\n// USAGE:\n// hebbian init <path> Create brain with 7 regions\n// hebbian emit <target> [--brain <path>] Compile rules (claude/cursor/gemini/copilot/generic/all)\n// hebbian fire <neuron-path> Increment neuron counter\n// hebbian grow <neuron-path> Create neuron (with merge detection)\n// hebbian rollback <neuron-path> Decrement counter (min=1)\n// hebbian signal <type> <neuron-path> Add dopamine/bomb/memory signal\n// hebbian decay [--days N] Mark inactive neurons dormant (default 30 days)\n// hebbian watch [--brain <path>] Watch for changes + auto-recompile\n// hebbian claude install|uninstall|status Manage Claude Code hooks\n// hebbian digest [--transcript <path>] Extract corrections from conversation\n// hebbian diag Print brain diagnostics\n// hebbian stats Print brain statistics\n\nimport { parseArgs } from 'node:util';\nimport { resolve } from 'node:path';\nimport type { SignalType } from './constants';\nimport { resolveBrainRoot } from './constants';\n\nconst VERSION = '0.5.3';\n\nconst HELP = `\nhebbian v${VERSION} — Folder-as-neuron brain for any AI agent.\n\n \"Neurons that fire together, wire together.\" — Donald Hebb (1949)\n\nUSAGE:\n hebbian <command> [options]\n\nCOMMANDS:\n init <path> Create brain with 7 regions\n emit <target> [--brain <path>] Compile rules (claude/cursor/gemini/copilot/generic/all)\n fire <neuron-path> Increment neuron counter (+1)\n grow <neuron-path> Create neuron (with merge detection)\n rollback <neuron-path> Decrement neuron counter (min=1)\n signal <type> <neuron-path> Add signal (dopamine/bomb/memory)\n decay [--days N] Mark inactive neurons dormant (default 30)\n dedup Batch merge similar neurons (Jaccard >= 0.6)\n snapshot Git commit current brain state\n watch Watch for changes + auto-recompile\n api [--port N] Start REST API server (default 9090)\n inbox Process corrections inbox\n claude install|uninstall|status Manage Claude Code hooks\n digest [--transcript <path>] Extract corrections from conversation\n candidates [promote] List candidates or promote graduated ones\n evolve [--dry-run] LLM-powered brain evolution (Gemini)\n session start|end Capture/detect session outcomes\n sessions Show session outcome history\n doctor Self-diagnostic (hooks, brain, versions)\n diag Print brain diagnostics\n stats Print brain statistics\n\nOPTIONS:\n --brain <path> Brain directory (default: $HEBBIAN_BRAIN or ./brain)\n --help, -h Show this help\n --version, -v Show version\n\nEXAMPLES:\n hebbian init ./my-brain\n hebbian grow cortex/frontend/NO_console_log --brain ./my-brain\n hebbian fire cortex/frontend/NO_console_log --brain ./my-brain\n hebbian emit claude --brain ./my-brain\n hebbian emit all\n GEMINI_API_KEY=... hebbian evolve --dry-run\n`.trim();\n\n/** Read all data from stdin (non-blocking, returns empty string if no data). */\nfunction readStdin(): Promise<string> {\n\treturn new Promise((resolve) => {\n\t\tif (process.stdin.isTTY) {\n\t\t\tresolve('');\n\t\t\treturn;\n\t\t}\n\t\tconst chunks: Buffer[] = [];\n\t\tprocess.stdin.on('data', (chunk: Buffer) => chunks.push(chunk));\n\t\tprocess.stdin.on('end', () => resolve(Buffer.concat(chunks).toString('utf8')));\n\t\tprocess.stdin.on('error', () => resolve(''));\n\t\t// Timeout after 1s to avoid hanging\n\t\tsetTimeout(() => {\n\t\t\tprocess.stdin.destroy();\n\t\t\tresolve(Buffer.concat(chunks).toString('utf8'));\n\t\t}, 1000);\n\t});\n}\n\nasync function main(argv: string[]): Promise<void> {\n\tconst { values, positionals } = parseArgs({\n\t\targs: argv,\n\t\toptions: {\n\t\t\tbrain: { type: 'string', short: 'b' },\n\t\t\tdays: { type: 'string', short: 'd' },\n\t\t\tport: { type: 'string', short: 'p' },\n\t\t\ttranscript: { type: 'string', short: 't' },\n\t\t\t'dry-run': { type: 'boolean' },\n\t\t\tglobal: { type: 'boolean', short: 'g' },\n\t\t\thelp: { type: 'boolean', short: 'h' },\n\t\t\tversion: { type: 'boolean', short: 'v' },\n\t\t},\n\t\tallowPositionals: true,\n\t\tstrict: false,\n\t});\n\n\tif (values.version) {\n\t\tconsole.log(`hebbian v${VERSION}`);\n\t\treturn;\n\t}\n\n\tconst command = positionals[0];\n\n\tif (values.help || !command) {\n\t\tconsole.log(HELP);\n\t\treturn;\n\t}\n\n\tconst brainRoot = resolveBrainRoot(values.brain as string | undefined);\n\n\tswitch (command) {\n\t\tcase 'init': {\n\t\t\tconst target = positionals[1];\n\t\t\tif (!target) {\n\t\t\t\tconsole.error('Usage: hebbian init <path>');\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\tconst { initBrain } = await import('./init');\n\t\t\tawait initBrain(resolve(target));\n\t\t\tbreak;\n\t\t}\n\t\tcase 'emit': {\n\t\t\tconst target = positionals[1];\n\t\t\tif (!target) {\n\t\t\t\tconsole.error('Usage: hebbian emit <target> (claude/cursor/gemini/copilot/generic/all)');\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\tconst { emitToTarget } = await import('./emit');\n\t\t\tawait emitToTarget(brainRoot, target);\n\t\t\t// Non-blocking update check — show banner if upgrade available\n\t\t\tconst { checkForUpdates, formatUpdateBanner } = await import('./update-check');\n\t\t\tcheckForUpdates(VERSION).then((status) => {\n\t\t\t\tconst banner = formatUpdateBanner(status);\n\t\t\t\tif (banner) console.error(banner);\n\t\t\t}).catch(() => {});\n\t\t\tbreak;\n\t\t}\n\t\tcase 'fire': {\n\t\t\tconst neuronPath = positionals[1];\n\t\t\tif (!neuronPath) {\n\t\t\t\tconsole.error('Usage: hebbian fire <neuron-path>');\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\tconst { fireNeuron } = await import('./fire');\n\t\t\tawait fireNeuron(brainRoot, neuronPath);\n\t\t\tbreak;\n\t\t}\n\t\tcase 'grow': {\n\t\t\tconst neuronPath = positionals[1];\n\t\t\tif (!neuronPath) {\n\t\t\t\tconsole.error('Usage: hebbian grow <neuron-path>');\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\tconst { growNeuron } = await import('./grow');\n\t\t\tawait growNeuron(brainRoot, neuronPath);\n\t\t\tbreak;\n\t\t}\n\t\tcase 'rollback': {\n\t\t\tconst neuronPath = positionals[1];\n\t\t\tif (!neuronPath) {\n\t\t\t\tconsole.error('Usage: hebbian rollback <neuron-path>');\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\tconst { rollbackNeuron } = await import('./rollback');\n\t\t\tawait rollbackNeuron(brainRoot, neuronPath);\n\t\t\tbreak;\n\t\t}\n\t\tcase 'signal': {\n\t\t\tconst signalType = positionals[1];\n\t\t\tconst neuronPath = positionals[2];\n\t\t\tif (!signalType || !neuronPath) {\n\t\t\t\tconsole.error('Usage: hebbian signal <type> <neuron-path> (type: dopamine/bomb/memory)');\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\tconst { signalNeuron } = await import('./signal');\n\t\t\tawait signalNeuron(brainRoot, neuronPath, signalType as SignalType);\n\t\t\tbreak;\n\t\t}\n\t\tcase 'decay': {\n\t\t\tconst days = values.days ? parseInt(values.days as string, 10) : 30;\n\t\t\tconst { runDecay } = await import('./decay');\n\t\t\tawait runDecay(brainRoot, days);\n\t\t\tbreak;\n\t\t}\n\t\tcase 'dedup': {\n\t\t\tconst { runDedup } = await import('./dedup');\n\t\t\trunDedup(brainRoot);\n\t\t\tbreak;\n\t\t}\n\t\tcase 'snapshot': {\n\t\t\tconst { gitSnapshot } = await import('./snapshot');\n\t\t\tgitSnapshot(brainRoot);\n\t\t\tbreak;\n\t\t}\n\t\tcase 'watch': {\n\t\t\tconst { startWatch } = await import('./watch');\n\t\t\tawait startWatch(brainRoot);\n\t\t\tbreak;\n\t\t}\n\t\tcase 'api': {\n\t\t\tconst port = values.port ? parseInt(values.port as string, 10) : 9090;\n\t\t\tconst { startAPI } = await import('./api');\n\t\t\tstartAPI(brainRoot, port);\n\t\t\t// Keep process alive — server handles shutdown\n\t\t\tawait new Promise(() => {});\n\t\t\tbreak;\n\t\t}\n\t\tcase 'inbox': {\n\t\t\tconst { processInbox } = await import('./inbox');\n\t\t\tprocessInbox(brainRoot);\n\t\t\tbreak;\n\t\t}\n\t\tcase 'claude': {\n\t\t\tconst sub = positionals[1];\n\t\t\tconst isGlobal = values.global === true;\n\t\t\tconst { installHooks, uninstallHooks, checkHooks } = await import('./hooks');\n\t\t\tswitch (sub) {\n\t\t\t\tcase 'install': {\n\t\t\t\t\t// Global: require --brain flag or HEBBIAN_BRAIN env\n\t\t\t\t\t// Local: default to ./brain in project root\n\t\t\t\t\tconst installBrain = values.brain\n\t\t\t\t\t\t? resolve(values.brain as string)\n\t\t\t\t\t\t: isGlobal\n\t\t\t\t\t\t\t? (process.env.HEBBIAN_BRAIN ? resolve(process.env.HEBBIAN_BRAIN) : '')\n\t\t\t\t\t\t\t: resolve('./brain');\n\t\t\t\t\tif (isGlobal && !installBrain) {\n\t\t\t\t\t\tconsole.error('❌ --global requires --brain <path> or HEBBIAN_BRAIN env var');\n\t\t\t\t\t\tprocess.exit(1);\n\t\t\t\t\t}\n\t\t\t\t\tinstallHooks(installBrain, undefined, isGlobal);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'uninstall':\n\t\t\t\t\tuninstallHooks(undefined, isGlobal);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'status': {\n\t\t\t\t\tcheckHooks(undefined, isGlobal);\n\t\t\t\t\tconsole.log(` version: v${VERSION}`);\n\t\t\t\t\tconst { checkForUpdates: checkUpdates, formatUpdateBanner: formatBanner } = await import('./update-check');\n\t\t\t\t\tconst updateStatus = await checkUpdates(VERSION);\n\t\t\t\t\tconst updateBanner = formatBanner(updateStatus);\n\t\t\t\t\tif (updateBanner) console.error(updateBanner);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\tconsole.error('Usage: hebbian claude <install|uninstall|status> [--global]');\n\t\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 'digest': {\n\t\t\tconst transcriptFlag = values.transcript as string | undefined;\n\t\t\tconst { digestTranscript, readHookInput } = await import('./digest');\n\t\t\tif (transcriptFlag) {\n\t\t\t\tdigestTranscript(brainRoot, resolve(transcriptFlag));\n\t\t\t} else {\n\t\t\t\t// Read stdin for hook input\n\t\t\t\tconst stdin = await readStdin();\n\t\t\t\tconst hookInput = readHookInput(stdin);\n\t\t\t\tif (hookInput) {\n\t\t\t\t\tdigestTranscript(brainRoot, hookInput.transcriptPath, hookInput.sessionId);\n\t\t\t\t} else {\n\t\t\t\t\tconsole.error('Usage: hebbian digest --transcript <path>');\n\t\t\t\t\tconsole.error(' Or pipe hook input via stdin (Claude Code Stop hook)');\n\t\t\t\t\tprocess.exit(1);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 'candidates': {\n\t\t\tconst subCmd = positionals[1];\n\t\t\tconst { listCandidates, promoteCandidates } = await import('./candidates');\n\t\t\tif (subCmd === 'promote') {\n\t\t\t\tconst result = promoteCandidates(brainRoot);\n\t\t\t\tconsole.log(`🎓 promoted: ${result.promoted.length}, decayed: ${result.decayed.length}`);\n\t\t\t} else {\n\t\t\t\tconst candidates = listCandidates(brainRoot);\n\t\t\t\tif (candidates.length === 0) {\n\t\t\t\t\tconsole.log('No pending candidates');\n\t\t\t\t} else {\n\t\t\t\t\tconsole.log(`Candidates (promote at counter=${3}):`);\n\t\t\t\t\tfor (const c of candidates) {\n\t\t\t\t\t\tconst bar = '█'.repeat(c.counter) + '░'.repeat(Math.max(0, 3 - c.counter));\n\t\t\t\t\t\tconsole.log(` ${bar} ${c.counter}/3 ${c.targetPath} (${c.daysInactive}d idle)`);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 'evolve': {\n\t\t\tconst dryRun = values['dry-run'] === true;\n\t\t\tconst { runEvolve } = await import('./evolve');\n\t\t\tawait runEvolve(brainRoot, dryRun);\n\t\t\tbreak;\n\t\t}\n\t\tcase 'session': {\n\t\t\tconst sub = positionals[1];\n\t\t\tconst { captureSessionStart, detectOutcome } = await import('./outcome');\n\t\t\tswitch (sub) {\n\t\t\t\tcase 'start':\n\t\t\t\t\tcaptureSessionStart(brainRoot);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'end':\n\t\t\t\t\tdetectOutcome(brainRoot);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tconsole.error('Usage: hebbian session <start|end>');\n\t\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 'sessions': {\n\t\t\tconst { readEpisodes } = await import('./episode');\n\t\t\tconst episodes = readEpisodes(brainRoot).filter((e) => e.outcome);\n\t\t\tif (episodes.length === 0) {\n\t\t\t\tconsole.log('No session outcomes recorded yet');\n\t\t\t} else {\n\t\t\t\tconsole.log('Session Outcomes:');\n\t\t\t\tfor (const ep of episodes.reverse()) {\n\t\t\t\t\tconst icon = ep.outcome === 'revert' ? '🔄' : '✅';\n\t\t\t\t\tconst neurons = ep.neurons ? `${ep.neurons.length} neurons` : '';\n\t\t\t\t\tconsole.log(` ${icon} ${ep.ts.slice(0, 19)} ${ep.outcome} ${neurons}`);\n\t\t\t\t}\n\t\t\t\tconsole.log(`\\nTotal: ${episodes.length} sessions`);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 'doctor': {\n\t\t\tconst { runDoctor } = await import('./doctor');\n\t\t\tawait runDoctor(brainRoot);\n\t\t\tbreak;\n\t\t}\n\t\tcase 'diag':\n\t\tcase 'stats': {\n\t\t\tconst { scanBrain } = await import('./scanner');\n\t\t\tconst { runSubsumption } = await import('./subsumption');\n\t\t\tconst brain = scanBrain(brainRoot);\n\t\t\tconst result = runSubsumption(brain);\n\t\t\tconst { printDiag } = await import('./emit');\n\t\t\tprintDiag(brain, result);\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t\tconsole.error(`Unknown command: ${command}`);\n\t\t\tconsole.log(HELP);\n\t\t\tprocess.exit(1);\n\t}\n}\n\nmain(process.argv.slice(2)).catch((err: Error) => {\n\tconsole.error(err.message);\n\tprocess.exit(1);\n});\n"],"mappings":"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","names":["existsSync","readdirSync","existsSync","join","existsSync","readFileSync","writeFileSync","mkdirSync","join","existsSync","mkdirSync","readFileSync","writeFileSync","statSync","join","readdirSync","writeFileSync","existsSync","mkdirSync","join","mkdirSync","writeFileSync","existsSync","readdirSync","join","relative","renameSync","join","writeFileSync","existsSync","readdirSync","join","readdirSync","statSync","writeFileSync","existsSync","join","writeFileSync","join","existsSync","join","resolve","existsSync","mkdirSync","readdirSync","renameSync","statSync","join","dirname","relative","readdirSync","readFileSync","writeFileSync","mkdirSync","existsSync","join","readFileSync","writeFileSync","existsSync","mkdirSync","join","resolve","readFileSync","writeFileSync","existsSync","mkdirSync","readdirSync","execSync","join","resolve","group","readFileSync","writeFileSync","existsSync","mkdirSync","join","execSync","existsSync","mkdirSync","writeFileSync","readFileSync","readdirSync","rmSync","statSync","join","existsSync","readFileSync","writeFileSync","join","existsSync","readFileSync","readdirSync","join","execSync","resolve","initBrain","emitToTarget","checkForUpdates","formatUpdateBanner","fireNeuron","growNeuron","rollbackNeuron","signalNeuron","runDecay","runDedup","gitSnapshot","startWatch","startAPI","processInbox","installHooks","uninstallHooks","checkHooks","digestTranscript","readHookInput","listCandidates","promoteCandidates","runEvolve","captureSessionStart","detectOutcome","readEpisodes","runDoctor","scanBrain","runSubsumption","printDiag"]}
|
|
1
|
+
{"version":3,"sources":["../../src/constants.ts","../../src/init.ts","../../src/scanner.ts","../../src/subsumption.ts","../../src/emit.ts","../../src/update-check.ts","../../src/fire.ts","../../src/similarity.ts","../../src/grow.ts","../../src/rollback.ts","../../src/signal.ts","../../src/decay.ts","../../src/dedup.ts","../../src/snapshot.ts","../../src/watch.ts","../../src/candidates.ts","../../src/episode.ts","../../src/inbox.ts","../../src/api.ts","../../src/hooks.ts","../../src/digest.ts","../../src/outcome.ts","../../src/evolve.ts","../../src/doctor.ts","../../src/cli.ts"],"sourcesContent":["// hebbian — Constants & Configuration\n//\n// AXIOMS:\n// 1. Folder = Neuron (name is meaning, depth is specificity)\n// 2. File = Firing Trace (N.neuron = counter, dopamineN = reward, bomb = pain)\n// 3. Path = Sentence (brain/cortex/quality/no_hardcoded → \"cortex > quality > no_hardcoded\")\n// 4. Counter = Activation (higher = stronger/myelinated path)\n// 5. AI writes back (counter increment = experience growth)\n\nexport const REGIONS = [\n\t'brainstem',\n\t'limbic',\n\t'hippocampus',\n\t'sensors',\n\t'cortex',\n\t'ego',\n\t'prefrontal',\n] as const;\n\nexport type RegionName = (typeof REGIONS)[number];\n\nexport const REGION_PRIORITY: Record<RegionName, number> = {\n\tbrainstem: 0,\n\tlimbic: 1,\n\thippocampus: 2,\n\tsensors: 3,\n\tcortex: 4,\n\tego: 5,\n\tprefrontal: 6,\n};\n\nexport const REGION_ICONS: Record<RegionName, string> = {\n\tbrainstem: '🛡️',\n\tlimbic: '💓',\n\thippocampus: '📝',\n\tsensors: '👁️',\n\tcortex: '🧠',\n\tego: '🎭',\n\tprefrontal: '🎯',\n};\n\nexport const REGION_KO: Record<RegionName, string> = {\n\tbrainstem: '양심/본능',\n\tlimbic: '감정 필터',\n\thippocampus: '기록/기억',\n\tsensors: '환경 제약',\n\tcortex: '지식/기술',\n\tego: '성향/톤',\n\tprefrontal: '목표/계획',\n};\n\nexport const EMIT_THRESHOLD = 5;\nexport const SPOTLIGHT_DAYS = 7;\nexport const JACCARD_THRESHOLD = 0.6;\nexport const DECAY_DAYS = 30;\nexport const MAX_DEPTH = 6;\n\nexport const EMIT_TARGETS: Record<string, string> = {\n\tgemini: '.gemini/GEMINI.md',\n\tcursor: '.cursorrules',\n\tclaude: 'CLAUDE.md',\n\tcopilot: '.github/copilot-instructions.md',\n\tgeneric: '.neuronrc',\n};\n\nexport const SIGNAL_TYPES = ['dopamine', 'bomb', 'memory'] as const;\nexport type SignalType = (typeof SIGNAL_TYPES)[number];\n\nexport const MARKER_START = '<!-- HEBBIAN:START -->';\nexport const MARKER_END = '<!-- HEBBIAN:END -->';\n\n// Hook ownership marker — used to identify hebbian-managed hooks in settings.local.json\nexport const HOOK_MARKER = '[hebbian]';\n\n// Digest constants\nexport const MAX_CORRECTIONS_PER_SESSION = 10;\nexport const MIN_CORRECTION_LENGTH = 15;\nexport const DIGEST_LOG_DIR = 'hippocampus/digest_log';\n\n// Phase 5: Outcome tracking\nexport const OUTCOME_TYPES = ['revert', 'acceptance'] as const;\nexport type OutcomeType = (typeof OUTCOME_TYPES)[number];\nexport const SESSION_STATE_DIR = 'hippocampus/session_state';\nexport const PROTECTED_REGIONS_CONTRA = ['brainstem', 'limbic', 'sensors'];\n\nimport { resolve } from 'node:path';\nimport { existsSync } from 'node:fs';\n\n/** Resolve brain root path from flag, env var, or defaults */\nexport function resolveBrainRoot(brainFlag?: string): string {\n\tif (brainFlag) return resolve(brainFlag);\n\tif (process.env.HEBBIAN_BRAIN) return resolve(process.env.HEBBIAN_BRAIN);\n\tif (existsSync(resolve('./brain'))) return resolve('./brain');\n\treturn resolve(process.env.HOME || '~', 'hebbian', 'brain');\n}\n\n/** Resolve agent-specific brain path within a multi-brain setup */\nexport function resolveAgentBrain(brainRoot: string, agentName: string): string {\n\treturn resolve(brainRoot, 'agents', agentName);\n}\n\n/** Resolve shared brain path within a multi-brain setup */\nexport function resolveSharedBrain(brainRoot: string): string {\n\treturn resolve(brainRoot, 'shared');\n}\n\nexport const AGENTS_DIR = 'agents';\nexport const SHARED_DIR = 'shared';\n","// hebbian — Brain Initialization\n//\n// Creates a brain directory with 7 canonical regions and starter neurons.\n// Each region gets a _rules.md explaining its purpose.\n\nimport { mkdirSync, writeFileSync, readFileSync, existsSync, readdirSync, appendFileSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { REGIONS, REGION_ICONS, REGION_KO } from './constants';\nimport type { RegionName } from './constants';\n\ninterface RegionTemplate {\n\tdescription: string;\n\tstarters: string[];\n}\n\nconst REGION_TEMPLATES: Record<RegionName, RegionTemplate> = {\n\tbrainstem: {\n\t\tdescription: 'Absolute principles. Immutable. Read-only conscience.\\nP0 — highest priority. bomb here halts EVERYTHING.',\n\t\tstarters: ['NO_fallback', 'DO_execute_not_debate'],\n\t},\n\tlimbic: {\n\t\tdescription: 'Emotional filters and somatic markers.\\nP1 — automatic, influences downstream regions.',\n\t\tstarters: [],\n\t},\n\thippocampus: {\n\t\tdescription: 'Memory and episode recording.\\nP2 — accumulated experience, session logs.',\n\t\tstarters: [],\n\t},\n\tsensors: {\n\t\tdescription: 'Environment constraints and input validation.\\nP3 — read-only, set by environment.',\n\t\tstarters: [],\n\t},\n\tcortex: {\n\t\tdescription: 'Knowledge and skills. The largest region.\\nP4 — learnable, grows with corrections.',\n\t\tstarters: [],\n\t},\n\tego: {\n\t\tdescription: 'Personality, tone, and communication style.\\nP5 — set by user preference.',\n\t\tstarters: [],\n\t},\n\tprefrontal: {\n\t\tdescription: 'Goals, projects, and planning.\\nP6 — lowest priority, longest time horizon.',\n\t\tstarters: [],\n\t},\n};\n\n/**\n * Initialize a new brain directory with 7 regions.\n */\nexport function initBrain(brainPath: string): void {\n\tif (existsSync(brainPath)) {\n\t\tconst entries = readdirSync(brainPath);\n\t\tif (entries.some((e) => (REGIONS as readonly string[]).includes(e))) {\n\t\t\tconsole.log(`\\u{26A0}\\uFE0F Brain already exists at ${brainPath}`);\n\t\t\treturn;\n\t\t}\n\t}\n\n\tmkdirSync(brainPath, { recursive: true });\n\n\tfor (const regionName of REGIONS) {\n\t\tconst regionDir = join(brainPath, regionName);\n\t\tmkdirSync(regionDir, { recursive: true });\n\n\t\tconst template = REGION_TEMPLATES[regionName];\n\t\tconst icon = REGION_ICONS[regionName];\n\t\tconst ko = REGION_KO[regionName];\n\n\t\t// Write _rules.md template\n\t\twriteFileSync(\n\t\t\tjoin(regionDir, '_rules.md'),\n\t\t\t`# ${icon} ${regionName} (${ko})\\n\\n${template.description}\\n`,\n\t\t\t'utf8',\n\t\t);\n\n\t\t// Create starter neurons\n\t\tfor (const starter of template.starters) {\n\t\t\tconst neuronDir = join(regionDir, starter);\n\t\t\tmkdirSync(neuronDir, { recursive: true });\n\t\t\twriteFileSync(join(neuronDir, '1.neuron'), '', 'utf8');\n\t\t}\n\t}\n\n\t// Create _agents inbox\n\tmkdirSync(join(brainPath, '_agents', 'global_inbox'), { recursive: true });\n\n\t// Auto-add brain path to .gitignore if in a git repo\n\tautoGitignore(brainPath);\n\n\tconsole.log(`\\u{1F9E0} Brain initialized at ${brainPath}`);\n\tconsole.log(` 7 regions created: ${REGIONS.join(', ')}`);\n\tconsole.log('');\n\tconsole.log(' Next steps:');\n\tconsole.log(` hebbian grow brainstem/NO_your_rule --brain ${brainPath}`);\n\tconsole.log(` hebbian emit claude --brain ${brainPath}`);\n}\n\n/**\n * Auto-add brain directory to .gitignore if in a git repo.\n * Prevents personal learning data from leaking into shared repos.\n */\nfunction autoGitignore(brainPath: string): void {\n\t// Walk up from brainPath to find .git\n\tlet dir = dirname(brainPath);\n\tfor (let i = 0; i < 10; i++) {\n\t\tif (existsSync(join(dir, '.git'))) {\n\t\t\tconst gitignorePath = join(dir, '.gitignore');\n\t\t\tconst brainDirName = brainPath.replace(dir + '/', '') + '/';\n\n\t\t\tif (existsSync(gitignorePath)) {\n\t\t\t\tconst content = readFileSync(gitignorePath, 'utf8');\n\t\t\t\tif (content.includes(brainDirName) || content.includes(brainDirName.replace(/\\/$/, ''))) {\n\t\t\t\t\treturn; // already ignored\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tappendFileSync(gitignorePath, `\\n# hebbian brain (personal learning data)\\n${brainDirName}\\n`, 'utf8');\n\t\t\tconsole.log(` \\u{1F4DD} Added ${brainDirName} to .gitignore`);\n\t\t\treturn;\n\t\t}\n\t\tconst parent = dirname(dir);\n\t\tif (parent === dir) break;\n\t\tdir = parent;\n\t}\n}\n","// hebbian — Brain Filesystem Scanner\n//\n// Walks the brain directory tree and builds a structured representation.\n// Folders = neurons. Files = firing traces. Paths = sentences.\n//\n// Scan order follows subsumption priority (P0 brainstem → P6 prefrontal).\n// Only recognizes the 7 canonical region names at the top level.\n\nimport { readdirSync, statSync, readFileSync, existsSync } from 'node:fs';\nimport { join, relative, sep } from 'node:path';\nimport { REGIONS, REGION_PRIORITY, MAX_DEPTH } from './constants';\nimport type { Neuron, Region, Brain } from './types';\n\n/**\n * Scan a brain directory and return all regions with their neurons.\n */\nexport function scanBrain(brainRoot: string): Brain {\n\tconst regions: Region[] = [];\n\n\tfor (const regionName of REGIONS) {\n\t\tconst regionPath = join(brainRoot, regionName);\n\t\tif (!existsSync(regionPath)) {\n\t\t\tregions.push({\n\t\t\t\tname: regionName,\n\t\t\t\tpriority: REGION_PRIORITY[regionName],\n\t\t\t\tpath: regionPath,\n\t\t\t\tneurons: [],\n\t\t\t\taxons: [],\n\t\t\t\thasBomb: false,\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst neurons = walkRegion(regionPath, regionPath, 0);\n\t\tconst axons = readAxons(regionPath);\n\t\tconst hasBomb = neurons.some((n) => n.hasBomb);\n\n\t\tregions.push({\n\t\t\tname: regionName,\n\t\t\tpriority: REGION_PRIORITY[regionName],\n\t\t\tpath: regionPath,\n\t\t\tneurons,\n\t\t\taxons,\n\t\t\thasBomb,\n\t\t});\n\t}\n\n\treturn { root: brainRoot, regions };\n}\n\n/**\n * Recursively walk a region directory and collect neurons.\n * A neuron is any directory that contains at least one trace file\n * (*.neuron, *.contra, *.dormant, bomb.neuron).\n */\nfunction walkRegion(dir: string, regionRoot: string, depth: number): Neuron[] {\n\tif (depth > MAX_DEPTH) return [];\n\n\tconst neurons: Neuron[] = [];\n\tlet entries;\n\n\ttry {\n\t\tentries = readdirSync(dir, { withFileTypes: true });\n\t} catch {\n\t\treturn [];\n\t}\n\n\t// Parse trace files in this directory\n\tlet counter = 0;\n\tlet contra = 0;\n\tlet dopamine = 0;\n\tlet hasBomb = false;\n\tlet hasMemory = false;\n\tlet isDormant = false;\n\tlet modTime = new Date(0);\n\tlet hasTraceFile = false;\n\n\tfor (const entry of entries) {\n\t\tif (entry.name.startsWith('_')) continue;\n\n\t\tif (entry.isFile()) {\n\t\t\tconst name = entry.name;\n\n\t\t\t// N.neuron — excitatory counter\n\t\t\tif (name.endsWith('.neuron') && !name.startsWith('dopamine') && !name.startsWith('memory') && name !== 'bomb.neuron') {\n\t\t\t\tconst n = parseInt(name, 10);\n\t\t\t\tif (!isNaN(n) && n > counter) {\n\t\t\t\t\tcounter = n;\n\t\t\t\t\thasTraceFile = true;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst st = statSync(join(dir, name));\n\t\t\t\t\t\tif (st.mtime > modTime) modTime = st.mtime;\n\t\t\t\t\t} catch {}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// N.contra — inhibitory counter\n\t\t\tif (name.endsWith('.contra')) {\n\t\t\t\tconst n = parseInt(name, 10);\n\t\t\t\tif (!isNaN(n) && n > contra) {\n\t\t\t\t\tcontra = n;\n\t\t\t\t\thasTraceFile = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// dopamineN.neuron — reward signal\n\t\t\tif (name.startsWith('dopamine') && name.endsWith('.neuron')) {\n\t\t\t\tconst n = parseInt(name.replace('dopamine', ''), 10);\n\t\t\t\tif (!isNaN(n) && n > dopamine) {\n\t\t\t\t\tdopamine = n;\n\t\t\t\t\thasTraceFile = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// bomb.neuron — circuit breaker\n\t\t\tif (name === 'bomb.neuron') {\n\t\t\t\thasBomb = true;\n\t\t\t\thasTraceFile = true;\n\t\t\t}\n\n\t\t\t// memoryN.neuron — memory signal\n\t\t\tif (name.startsWith('memory') && name.endsWith('.neuron')) {\n\t\t\t\thasMemory = true;\n\t\t\t\thasTraceFile = true;\n\t\t\t}\n\n\t\t\t// *.dormant — dormancy marker\n\t\t\tif (name.endsWith('.dormant')) {\n\t\t\t\tisDormant = true;\n\t\t\t\thasTraceFile = true;\n\t\t\t}\n\t\t}\n\t}\n\n\t// If this directory has trace files, it's a neuron\n\tif (hasTraceFile) {\n\t\tconst relPath = relative(regionRoot, dir) || '.';\n\t\tconst folderName = dir.split(sep).pop() || '';\n\t\tconst total = counter + contra + dopamine;\n\t\tconst intensity = counter - contra + dopamine;\n\t\tconst polarity = total > 0 ? intensity / total : 0;\n\n\t\tneurons.push({\n\t\t\tname: folderName,\n\t\t\tpath: relPath,\n\t\t\tfullPath: dir,\n\t\t\tcounter,\n\t\t\tcontra,\n\t\t\tdopamine,\n\t\t\tintensity,\n\t\t\tpolarity: Math.round(polarity * 100) / 100,\n\t\t\thasBomb,\n\t\t\thasMemory,\n\t\t\tisDormant,\n\t\t\tdepth,\n\t\t\tmodTime,\n\t\t});\n\t}\n\n\t// Recurse into subdirectories\n\tfor (const entry of entries) {\n\t\tif (entry.name.startsWith('_') || entry.name.startsWith('.')) continue;\n\t\tif (entry.isDirectory()) {\n\t\t\tconst subNeurons = walkRegion(join(dir, entry.name), regionRoot, depth + 1);\n\t\t\tneurons.push(...subNeurons);\n\t\t}\n\t}\n\n\treturn neurons;\n}\n\n/**\n * Read .axon file from a region directory.\n */\nfunction readAxons(regionPath: string): string[] {\n\tconst axonPath = join(regionPath, '.axon');\n\tif (!existsSync(axonPath)) return [];\n\ttry {\n\t\tconst content = readFileSync(axonPath, 'utf8').trim();\n\t\treturn content.split(/[\\n,]+/).map((s: string) => s.trim()).filter(Boolean);\n\t} catch {\n\t\treturn [];\n\t}\n}\n","// hebbian — Subsumption Cascade Engine\n//\n// Implements Brooks' subsumption architecture:\n// - Lower priority (P0) always suppresses higher priority (P6)\n// - bomb.neuron in any region halts all downstream regions\n// - Dormant neurons are excluded from activation counts\n//\n// Cascade flow:\n// P0 brainstem → P1 limbic → P2 hippocampus → P3 sensors → P4 cortex → P5 ego → P6 prefrontal\n// If bomb at P(n), all P(n+1)→P6 are BLOCKED.\n\nimport type { Brain, Region, SubsumptionResult } from './types';\n\n/**\n * Run the subsumption cascade on a scanned brain.\n */\nexport function runSubsumption(brain: Brain): SubsumptionResult {\n\tconst activeRegions: Region[] = [];\n\tconst blockedRegions: Region[] = [];\n\tlet bombSource = '';\n\tlet firedNeurons = 0;\n\tlet totalNeurons = 0;\n\tlet totalCounter = 0;\n\tlet blocked = false;\n\n\tfor (const region of brain.regions) {\n\t\ttotalNeurons += region.neurons.length;\n\n\t\tif (blocked) {\n\t\t\tblockedRegions.push(region);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (region.hasBomb) {\n\t\t\tbombSource = region.name;\n\t\t\tblockedRegions.push(region);\n\t\t\tblocked = true;\n\t\t\tcontinue;\n\t\t}\n\n\t\tactiveRegions.push(region);\n\n\t\tfor (const neuron of region.neurons) {\n\t\t\tif (!neuron.isDormant) {\n\t\t\t\tfiredNeurons++;\n\t\t\t\ttotalCounter += neuron.counter;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {\n\t\tactiveRegions,\n\t\tblockedRegions,\n\t\tbombSource,\n\t\tfiredNeurons,\n\t\ttotalNeurons,\n\t\ttotalCounter,\n\t};\n}\n","// hebbian — 3-Tier Emit System + Multi-Target Output\n//\n// Tier 1: Bootstrap (~500 tokens) — auto-loaded by AI (CLAUDE.md, .cursorrules, etc.)\n// Tier 2: _index.md — brain overview (AI reads at conversation start)\n// Tier 3: {region}/_rules.md — per-region detail (AI reads on demand)\n//\n// Multi-target: claude, cursor, gemini, copilot, generic, all\n\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { scanBrain } from './scanner';\nimport { runSubsumption } from './subsumption';\nimport {\n\tREGIONS, REGION_ICONS, REGION_KO, EMIT_TARGETS,\n\tEMIT_THRESHOLD, SPOTLIGHT_DAYS, MARKER_START, MARKER_END,\n} from './constants';\nimport type { RegionName } from './constants';\nimport type { Neuron, Region, Brain, SubsumptionResult } from './types';\n\n// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n// TIER 1: Bootstrap (~500 tokens)\n// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n/**\n * Generate Tier 1 bootstrap content.\n */\nexport function emitBootstrap(result: SubsumptionResult, brain: Brain): string {\n\tconst lines: string[] = [];\n\tconst now = new Date().toISOString().replace(/\\.\\d+Z$/, '');\n\n\tlines.push(MARKER_START);\n\tlines.push(`<!-- Generated: ${now} -->`);\n\tlines.push('<!-- Axiom: Folder=Neuron | File=Trace | Path=Sentence -->');\n\tlines.push(`<!-- Active: ${result.firedNeurons}/${result.totalNeurons} neurons | Total activation: ${result.totalCounter} -->`);\n\tlines.push('');\n\n\t// Circuit breaker\n\tif (result.bombSource) {\n\t\tlines.push(`## \\u{1F6A8} CIRCUIT BREAKER: ${result.bombSource}`);\n\t\tlines.push('**ALL OPERATIONS HALTED. REPAIR REQUIRED.**');\n\t\tlines.push('');\n\t\tlines.push(MARKER_END);\n\t\treturn lines.join('\\n');\n\t}\n\n\tlines.push('## hebbian Active Rules');\n\tlines.push('');\n\n\t// Persona (ego region)\n\tlines.push(`### ${REGION_ICONS.ego} Persona`);\n\tfor (const region of result.activeRegions) {\n\t\tif (region.name === 'ego') {\n\t\t\tconst top = sortedActive(region.neurons, 10);\n\t\t\tfor (const n of top) {\n\t\t\t\tlines.push(`- ${pathToSentence(n.path)}`);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t}\n\tlines.push('');\n\n\t// Subsumption cascade\n\tlines.push('### \\u{1F517} Subsumption Cascade');\n\tlines.push('```');\n\tlines.push('brainstem \\u2190\\u2192 limbic \\u2190\\u2192 hippocampus \\u2190\\u2192 sensors \\u2190\\u2192 cortex \\u2190\\u2192 ego \\u2190\\u2192 prefrontal');\n\tlines.push(' (P0) (P1) (P2) (P3) (P4) (P5) (P6)');\n\tlines.push('```');\n\tlines.push('Lower P always overrides higher P. bomb = full stop.');\n\tlines.push('');\n\n\t// TOP 5 brainstem rules\n\tlines.push(`### ${REGION_ICONS.brainstem} Core Directives TOP 5`);\n\tfor (const region of result.activeRegions) {\n\t\tif (region.name === 'brainstem') {\n\t\t\tconst top = sortedActive(region.neurons, 5);\n\t\t\ttop.forEach((n, i) => {\n\t\t\t\tlines.push(`${i + 1}. **${pathToSentence(n.path)}**`);\n\t\t\t});\n\t\t\tbreak;\n\t\t}\n\t}\n\tlines.push('');\n\n\t// Active regions summary\n\tlines.push('### Active Regions');\n\tlines.push('| Region | Neurons | Activation |');\n\tlines.push('|--------|---------|------------|');\n\tfor (const region of result.activeRegions) {\n\t\tconst active = region.neurons.filter((n) => !n.isDormant);\n\t\tconst activation = active.reduce((sum, n) => sum + n.intensity, 0);\n\t\tconst icon = REGION_ICONS[region.name as RegionName] || '';\n\t\tlines.push(`| ${icon} ${region.name} | ${active.length} | ${activation} |`);\n\t}\n\tlines.push('');\n\tlines.push(MARKER_END);\n\n\treturn lines.join('\\n');\n}\n\n// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n// TIER 2: Index (_index.md)\n// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n/**\n * Generate Tier 2 brain index content.\n */\nexport function emitIndex(result: SubsumptionResult, brain: Brain): string {\n\tconst lines: string[] = [];\n\tlines.push('# hebbian Brain Index');\n\tlines.push('');\n\tlines.push(`> ${result.firedNeurons} active / ${result.totalNeurons} total neurons | activation: ${result.totalCounter}`);\n\tlines.push('');\n\n\tif (result.bombSource) {\n\t\tlines.push(`## \\u{1F6A8} CIRCUIT BREAKER: ${result.bombSource}`);\n\t\tlines.push('');\n\t\treturn lines.join('\\n');\n\t}\n\n\t// Top 10 neurons by intensity (counter - contra + dopamine)\n\tconst allNeurons = result.activeRegions.flatMap((r) =>\n\t\tr.neurons.filter((n) => !n.isDormant && n.counter >= EMIT_THRESHOLD),\n\t);\n\tallNeurons.sort((a, b) => b.intensity - a.intensity);\n\n\tlines.push('## Top 10 Active Neurons');\n\tlines.push('| # | Path | Counter | Strength |');\n\tlines.push('|---|------|---------|----------|');\n\tfor (const n of allNeurons.slice(0, 10)) {\n\t\tconst strength = n.counter >= 10 ? '\\u{1F534}' : n.counter >= 5 ? '\\u{1F7E1}' : '\\u26AA';\n\t\tlines.push(`| ${allNeurons.indexOf(n) + 1} | ${n.path} | ${n.counter} | ${strength} |`);\n\t}\n\tlines.push('');\n\n\t// Spotlight: new neurons (< SPOTLIGHT_DAYS old, counter < EMIT_THRESHOLD)\n\tconst cutoff = new Date(Date.now() - SPOTLIGHT_DAYS * 24 * 60 * 60 * 1000);\n\tconst spotlightNeurons = result.activeRegions.flatMap((r) =>\n\t\tr.neurons.filter((n) => !n.isDormant && n.counter < EMIT_THRESHOLD && n.modTime > cutoff),\n\t);\n\tif (spotlightNeurons.length > 0) {\n\t\tlines.push('## Spotlight (Probation)');\n\t\tfor (const n of spotlightNeurons) {\n\t\t\tlines.push(`- ${n.path} (${n.counter}) — new`);\n\t\t}\n\t\tlines.push('');\n\t}\n\n\t// Per-region summary\n\tlines.push('## Regions');\n\tlines.push('| Region | Active | Dormant | Activation | Rules |');\n\tlines.push('|--------|--------|---------|------------|-------|');\n\tfor (const region of result.activeRegions) {\n\t\tconst active = region.neurons.filter((n) => !n.isDormant);\n\t\tconst dormant = region.neurons.filter((n) => n.isDormant);\n\t\tconst activation = active.reduce((sum, n) => sum + n.intensity, 0);\n\t\tconst icon = REGION_ICONS[region.name as RegionName] || '';\n\t\tlines.push(`| ${icon} ${region.name} | ${active.length} | ${dormant.length} | ${activation} | [_rules.md](${region.name}/_rules.md) |`);\n\t}\n\tlines.push('');\n\n\treturn lines.join('\\n');\n}\n\n// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n// TIER 3: Per-region rules ({region}/_rules.md)\n// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n/**\n * Generate Tier 3 per-region rules content.\n */\nexport function emitRegionRules(region: Region): string {\n\tconst icon = REGION_ICONS[region.name as RegionName] || '';\n\tconst ko = REGION_KO[region.name as RegionName] || '';\n\tconst active = region.neurons.filter((n) => !n.isDormant);\n\tconst dormant = region.neurons.filter((n) => n.isDormant);\n\tconst activation = active.reduce((sum, n) => sum + n.intensity, 0);\n\n\tconst lines: string[] = [];\n\tlines.push(`# ${icon} ${region.name} (${ko})`);\n\tlines.push(`> Active: ${active.length} | Dormant: ${dormant.length} | Activation: ${activation}`);\n\tlines.push('');\n\n\t// Axons\n\tif (region.axons.length > 0) {\n\t\tlines.push('## Connections');\n\t\tfor (const axon of region.axons) {\n\t\t\tlines.push(`- \\u2194 ${axon}`);\n\t\t}\n\t\tlines.push('');\n\t}\n\n\t// Neuron tree\n\tif (active.length > 0) {\n\t\tlines.push('## Rules');\n\t\tconst sorted = [...active].sort((a, b) => b.intensity - a.intensity);\n\t\tfor (const n of sorted) {\n\t\t\tconst indent = ' '.repeat(Math.min(n.depth, 4));\n\t\t\tconst prefix = strengthPrefix(n.counter);\n\t\t\tconst signals: string[] = [];\n\t\t\tif (n.dopamine > 0) signals.push(`\\u{1F7E2}+${n.dopamine}`);\n\t\t\tif (n.hasBomb) signals.push('\\u{1F4A3}');\n\t\t\tif (n.hasMemory) signals.push('\\u{1F4BE}');\n\t\t\tconst signalStr = signals.length > 0 ? ` ${signals.join(' ')}` : '';\n\t\t\tlines.push(`${indent}- ${prefix}${pathToSentence(n.path)} (${n.counter})${signalStr}`);\n\t\t}\n\t\tlines.push('');\n\t}\n\n\t// Dormant section\n\tif (dormant.length > 0) {\n\t\tlines.push('## Dormant');\n\t\tfor (const n of dormant) {\n\t\t\tlines.push(`- ~~${pathToSentence(n.path)} (${n.counter})~~`);\n\t\t}\n\t\tlines.push('');\n\t}\n\n\treturn lines.join('\\n');\n}\n\n// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n// MULTI-TARGET OUTPUT\n// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n/**\n * Emit rules to a specific target or all targets.\n */\nexport function emitToTarget(brainRoot: string, target: string): void {\n\tconst brain = scanBrain(brainRoot);\n\tconst result = runSubsumption(brain);\n\tconst content = emitBootstrap(result, brain);\n\n\tif (target === 'all') {\n\t\tfor (const [name, filePath] of Object.entries(EMIT_TARGETS)) {\n\t\t\twriteTarget(filePath, content);\n\t\t\tconsole.log(`\\u{1F4E4} emitted: ${name} → ${filePath}`);\n\t\t}\n\t} else if (EMIT_TARGETS[target]) {\n\t\twriteTarget(EMIT_TARGETS[target], content);\n\t\tconsole.log(`\\u{1F4E4} emitted: ${target} → ${EMIT_TARGETS[target]}`);\n\t} else {\n\t\tthrow new Error(`Unknown target: ${target}. Valid: ${Object.keys(EMIT_TARGETS).join(', ')}, all`);\n\t}\n\n\t// Always write tier 2 + tier 3 into the brain\n\twriteAllTiers(brainRoot, result, brain);\n}\n\n/**\n * Write all 3 tiers into the brain directory.\n */\nexport function writeAllTiers(brainRoot: string, result: SubsumptionResult, brain: Brain): void {\n\t// Tier 2: _index.md\n\tconst indexContent = emitIndex(result, brain);\n\twriteFileSync(join(brainRoot, '_index.md'), indexContent, 'utf8');\n\n\t// Tier 3: per-region _rules.md\n\tfor (const region of result.activeRegions) {\n\t\tif (existsSync(region.path)) {\n\t\t\tconst rulesContent = emitRegionRules(region);\n\t\t\twriteFileSync(join(region.path, '_rules.md'), rulesContent, 'utf8');\n\t\t}\n\t}\n}\n\n/**\n * Write content to a target file, using marker-based injection if file already exists.\n */\nfunction writeTarget(filePath: string, content: string): void {\n\tconst dir = dirname(filePath);\n\tif (dir !== '.' && !existsSync(dir)) {\n\t\tmkdirSync(dir, { recursive: true });\n\t}\n\n\tif (existsSync(filePath)) {\n\t\tconst existing = readFileSync(filePath, 'utf8');\n\t\tconst startIdx = existing.indexOf(MARKER_START);\n\t\tconst endIdx = existing.indexOf(MARKER_END);\n\n\t\tif (startIdx !== -1 && endIdx !== -1) {\n\t\t\t// Replace between markers, preserve surrounding content\n\t\t\tconst before = existing.slice(0, startIdx);\n\t\t\tconst after = existing.slice(endIdx + MARKER_END.length);\n\t\t\twriteFileSync(filePath, before + content + after, 'utf8');\n\t\t\treturn;\n\t\t}\n\n\t\t// No markers yet — prepend brain block, preserve existing content\n\t\twriteFileSync(filePath, content + '\\n\\n' + existing, 'utf8');\n\t\treturn;\n\t}\n\n\twriteFileSync(filePath, content, 'utf8');\n}\n\n// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n// DIAGNOSTICS (for CLI `hebbian diag` / `hebbian stats`)\n// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n/**\n * Print brain diagnostics to stdout.\n */\nexport function printDiag(brain: Brain, result: SubsumptionResult): void {\n\tconsole.log('');\n\tconsole.log(`\\u{1F9E0} hebbian Brain Diagnostics`);\n\tconsole.log(` Root: ${brain.root}`);\n\tconsole.log(` Neurons: ${result.firedNeurons} active / ${result.totalNeurons} total`);\n\tconsole.log(` Activation: ${result.totalCounter}`);\n\tif (result.bombSource) {\n\t\tconsole.log(` \\u{1F4A3} BOMB: ${result.bombSource} — cascade halted!`);\n\t}\n\tconsole.log('');\n\n\tfor (const region of brain.regions) {\n\t\tconst icon = REGION_ICONS[region.name as RegionName] || '';\n\t\tconst active = region.neurons.filter((n) => !n.isDormant);\n\t\tconst dormant = region.neurons.filter((n) => n.isDormant);\n\t\tconst activation = active.reduce((sum, n) => sum + n.intensity, 0);\n\t\tconst isBlocked = result.blockedRegions.some((r) => r.name === region.name);\n\t\tconst status = region.hasBomb ? '\\u{1F4A3} BOMB' : isBlocked ? '\\u{1F6AB} BLOCKED' : '\\u2705 ACTIVE';\n\n\t\tconsole.log(` ${icon} ${region.name} [${status}]`);\n\t\tconsole.log(` neurons: ${active.length} active, ${dormant.length} dormant | activation: ${activation}`);\n\n\t\tif (region.axons.length > 0) {\n\t\t\tconsole.log(` axons: ${region.axons.join(', ')}`);\n\t\t}\n\n\t\tconst top3 = sortedActive(region.neurons, 3);\n\t\tfor (const n of top3) {\n\t\t\tconst contraStr = n.contra > 0 ? ` contra:${n.contra}` : '';\n\t\t\tconsole.log(` \\u251C ${n.path} (counter:${n.counter}${contraStr} intensity:${n.intensity})`);\n\t\t}\n\t}\n\tconsole.log('');\n}\n\n// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n// HELPERS\n// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n/** Convert a neuron relative path to a human-readable sentence. */\nfunction pathToSentence(path: string): string {\n\treturn path.replace(/\\//g, ' > ').replace(/_/g, ' ');\n}\n\n/** Sort non-dormant neurons by intensity (descending), take first N. */\nfunction sortedActive(neurons: Neuron[], n: number): Neuron[] {\n\treturn [...neurons]\n\t\t.filter((neuron) => !neuron.isDormant)\n\t\t.sort((a, b) => b.intensity - a.intensity)\n\t\t.slice(0, n);\n}\n\n/** Strength prefix based on counter value. */\nfunction strengthPrefix(counter: number): string {\n\tif (counter >= 10) return '**[ABSOLUTE]** ';\n\tif (counter >= 5) return '**[MUST]** ';\n\treturn '';\n}\n","// hebbian — Update Check\n//\n// Checks npm registry for newer versions. Cache-first with TTL.\n// Designed for hook context: fast path (cache hit) is sync, slow path (fetch) is async.\n//\n// State files live in ~/.hebbian/:\n// last-update-check — cached result + TTL\n// update-snoozed — snooze state (version + level + epoch)\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync, statSync, unlinkSync } from 'node:fs';\nimport { join } from 'node:path';\n\nconst PACKAGE_NAME = 'hebbian';\nconst NPM_REGISTRY_URL = `https://registry.npmjs.org/${PACKAGE_NAME}/latest`;\nconst FETCH_TIMEOUT_MS = 5000;\n\n// Cache TTL in minutes\nconst TTL_UP_TO_DATE = 60; // check again in 1 hour\nconst TTL_UPGRADE_AVAILABLE = 720; // keep nagging for 12 hours\n\n// Snooze durations in seconds\nconst SNOOZE_DURATIONS: Record<number, number> = {\n\t1: 86400, // 24h\n\t2: 172800, // 48h\n\t3: 604800, // 7d (and beyond)\n};\n\nexport type UpdateStatus =\n\t| { type: 'upgrade_available'; current: string; latest: string }\n\t| { type: 'up_to_date' }\n\t| { type: 'skipped' };\n\n/** Get hebbian state directory */\nfunction getStateDir(): string {\n\treturn join(process.env.HOME || '~', '.hebbian');\n}\n\n/** Ensure state directory exists */\nfunction ensureStateDir(stateDir: string): void {\n\tif (!existsSync(stateDir)) {\n\t\tmkdirSync(stateDir, { recursive: true });\n\t}\n}\n\n/** Check if cache file is stale based on its type */\nfunction isCacheStale(cachePath: string, type: 'UP_TO_DATE' | 'UPGRADE_AVAILABLE'): boolean {\n\ttry {\n\t\tconst mtime = statSync(cachePath).mtimeMs;\n\t\tconst ageMinutes = (Date.now() - mtime) / 1000 / 60;\n\t\tconst ttl = type === 'UP_TO_DATE' ? TTL_UP_TO_DATE : TTL_UPGRADE_AVAILABLE;\n\t\treturn ageMinutes > ttl;\n\t} catch {\n\t\treturn true;\n\t}\n}\n\n/** Read cached update status (sync, fast) */\nfunction readCache(stateDir: string): { type: string; current?: string; latest?: string } | null {\n\tconst cachePath = join(stateDir, 'last-update-check');\n\tif (!existsSync(cachePath)) return null;\n\n\ttry {\n\t\tconst line = readFileSync(cachePath, 'utf8').trim();\n\n\t\tif (line.startsWith('UP_TO_DATE')) {\n\t\t\tif (isCacheStale(cachePath, 'UP_TO_DATE')) return null;\n\t\t\tconst ver = line.split(/\\s+/)[1];\n\t\t\treturn { type: 'UP_TO_DATE', current: ver };\n\t\t}\n\n\t\tif (line.startsWith('UPGRADE_AVAILABLE')) {\n\t\t\tif (isCacheStale(cachePath, 'UPGRADE_AVAILABLE')) return null;\n\t\t\tconst [, current, latest] = line.split(/\\s+/);\n\t\t\treturn { type: 'UPGRADE_AVAILABLE', current, latest };\n\t\t}\n\n\t\treturn null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/** Write cache file */\nfunction writeCache(stateDir: string, line: string): void {\n\tensureStateDir(stateDir);\n\twriteFileSync(join(stateDir, 'last-update-check'), line, 'utf8');\n}\n\n/** Check if upgrade is snoozed */\nfunction isSnoozed(stateDir: string, remoteVersion: string): boolean {\n\tconst snoozePath = join(stateDir, 'update-snoozed');\n\tif (!existsSync(snoozePath)) return false;\n\n\ttry {\n\t\tconst [ver, levelStr, epochStr] = readFileSync(snoozePath, 'utf8').trim().split(/\\s+/);\n\t\tif (ver !== remoteVersion) {\n\t\t\t// New version resets snooze\n\t\t\tunlinkSync(snoozePath);\n\t\t\treturn false;\n\t\t}\n\t\tconst level = parseInt(levelStr || '1', 10);\n\t\tconst epoch = parseInt(epochStr || '0', 10);\n\t\tconst now = Math.floor(Date.now() / 1000);\n\t\tconst duration = SNOOZE_DURATIONS[Math.min(level, 3)] ?? SNOOZE_DURATIONS[3]!;\n\t\treturn now < epoch + duration;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/** Fetch latest version from npm registry */\nasync function fetchLatestVersion(): Promise<string | null> {\n\ttry {\n\t\tconst controller = new AbortController();\n\t\tconst timeout = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);\n\n\t\tconst res = await fetch(NPM_REGISTRY_URL, {\n\t\t\tsignal: controller.signal,\n\t\t\theaders: { Accept: 'application/json' },\n\t\t});\n\t\tclearTimeout(timeout);\n\n\t\tif (!res.ok) return null;\n\t\tconst data = (await res.json()) as { version?: string };\n\t\tconst version = data.version;\n\t\tif (!version || !/^\\d+\\.\\d+[\\d.]*$/.test(version)) return null;\n\t\treturn version;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * Check for updates. Fast path uses cache (sync), slow path fetches npm registry.\n */\nexport async function checkForUpdates(currentVersion: string): Promise<UpdateStatus> {\n\t// Disabled via env\n\tif (process.env.HEBBIAN_UPDATE_CHECK === 'false') {\n\t\treturn { type: 'skipped' };\n\t}\n\n\tconst stateDir = getStateDir();\n\n\t// Fast path: cache hit\n\tconst cached = readCache(stateDir);\n\tif (cached) {\n\t\tif (cached.type === 'UP_TO_DATE') {\n\t\t\treturn { type: 'up_to_date' };\n\t\t}\n\t\tif (cached.type === 'UPGRADE_AVAILABLE' && cached.current && cached.latest) {\n\t\t\tif (cached.current === currentVersion && !isSnoozed(stateDir, cached.latest)) {\n\t\t\t\treturn { type: 'upgrade_available', current: currentVersion, latest: cached.latest };\n\t\t\t}\n\t\t}\n\t}\n\n\t// Slow path: fetch from npm\n\tconst latest = await fetchLatestVersion();\n\tif (!latest) {\n\t\t// Network failure — assume up to date, cache briefly\n\t\twriteCache(stateDir, `UP_TO_DATE ${currentVersion}`);\n\t\treturn { type: 'up_to_date' };\n\t}\n\n\tif (latest === currentVersion) {\n\t\twriteCache(stateDir, `UP_TO_DATE ${currentVersion}`);\n\t\treturn { type: 'up_to_date' };\n\t}\n\n\t// New version available\n\twriteCache(stateDir, `UPGRADE_AVAILABLE ${currentVersion} ${latest}`);\n\n\tif (isSnoozed(stateDir, latest)) {\n\t\treturn { type: 'up_to_date' };\n\t}\n\n\treturn { type: 'upgrade_available', current: currentVersion, latest };\n}\n\n/** Format update notification for terminal output */\nexport function formatUpdateBanner(status: UpdateStatus): string | null {\n\tif (status.type !== 'upgrade_available') return null;\n\treturn [\n\t\t``,\n\t\t` ⚡ hebbian v${status.latest} available (current: v${status.current})`,\n\t\t` npm i -g hebbian@latest`,\n\t\t``,\n\t].join('\\n');\n}\n","// hebbian — Fire Neuron (increment counter)\n//\n// Firing = reinforcing a synaptic pathway.\n// The counter file is renamed: N.neuron → (N+1).neuron\n\nimport { readdirSync, renameSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';\nimport { join } from 'node:path';\n\n/**\n * Increment a neuron's counter by 1.\n * If the neuron doesn't exist, auto-grows it with counter=1.\n */\nexport function fireNeuron(brainRoot: string, neuronPath: string): number {\n\tconst fullPath = join(brainRoot, neuronPath);\n\n\t// Auto-grow if neuron doesn't exist\n\tif (!existsSync(fullPath)) {\n\t\tmkdirSync(fullPath, { recursive: true });\n\t\twriteFileSync(join(fullPath, '1.neuron'), '', 'utf8');\n\t\tconsole.log(`\\u{1F331} grew + fired: ${neuronPath} (1)`);\n\t\treturn 1;\n\t}\n\n\t// Find current counter\n\tconst current = getCurrentCounter(fullPath);\n\tconst newCounter = current + 1;\n\n\t// Rename: N.neuron → (N+1).neuron\n\tif (current > 0) {\n\t\trenameSync(join(fullPath, `${current}.neuron`), join(fullPath, `${newCounter}.neuron`));\n\t} else {\n\t\twriteFileSync(join(fullPath, `${newCounter}.neuron`), '', 'utf8');\n\t}\n\n\tconsole.log(`\\u{1F525} fired: ${neuronPath} (${current} → ${newCounter})`);\n\treturn newCounter;\n}\n\n/**\n * Increment a neuron's contra (inhibitory) counter by 1.\n * Creates 1.contra if none exists, renames N.contra → (N+1).contra otherwise.\n * If the neuron directory doesn't exist, returns 0 (don't auto-create).\n */\nexport function contraNeuron(brainRoot: string, neuronPath: string): number {\n\tconst fullPath = join(brainRoot, neuronPath);\n\n\tif (!existsSync(fullPath)) {\n\t\treturn 0;\n\t}\n\n\tconst current = getCurrentContra(fullPath);\n\tconst newContra = current + 1;\n\n\tif (current > 0) {\n\t\trenameSync(join(fullPath, `${current}.contra`), join(fullPath, `${newContra}.contra`));\n\t} else {\n\t\twriteFileSync(join(fullPath, `${newContra}.contra`), '', 'utf8');\n\t}\n\n\treturn newContra;\n}\n\n/**\n * Get current contra value from the highest N.contra file.\n */\nexport function getCurrentContra(dir: string): number {\n\tlet max = 0;\n\ttry {\n\t\tfor (const entry of readdirSync(dir)) {\n\t\t\tif (entry.endsWith('.contra')) {\n\t\t\t\tconst n = parseInt(entry, 10);\n\t\t\t\tif (!isNaN(n) && n > max) max = n;\n\t\t\t}\n\t\t}\n\t} catch {}\n\treturn max;\n}\n\n/**\n * Get current counter value from the highest N.neuron file.\n */\nexport function getCurrentCounter(dir: string): number {\n\tlet max = 0;\n\ttry {\n\t\tfor (const entry of readdirSync(dir)) {\n\t\t\tif (entry.endsWith('.neuron') && !entry.startsWith('dopamine') && !entry.startsWith('memory') && entry !== 'bomb.neuron') {\n\t\t\t\tconst n = parseInt(entry, 10);\n\t\t\t\tif (!isNaN(n) && n > max) max = n;\n\t\t\t}\n\t\t}\n\t} catch {}\n\treturn max;\n}\n","// hebbian — Tokenizer, Stemmer, Jaccard Similarity\n//\n// Used by growNeuron() to detect similar existing neurons and merge\n// instead of duplicating. Implements synaptic consolidation.\n//\n// \"Neurons that fire together, wire together.\" — if two folder names\n// express the same concept, fire the existing one instead of creating a duplicate.\n\n/**\n * Tokenize a neuron name into stemmed words.\n * Splits on underscores, hyphens, spaces, and CamelCase boundaries.\n */\nexport function tokenize(name: string): string[] {\n\treturn name\n\t\t.replace(/([a-z])([A-Z])/g, '$1_$2') // camelCase → snake\n\t\t.replace(/[^a-zA-Z0-9\\u3000-\\u9FFF\\uAC00-\\uD7AF]+/g, ' ') // punctuation → space\n\t\t.toLowerCase()\n\t\t.split(' ')\n\t\t.map(stem)\n\t\t.filter((t) => t.length > 1); // drop single chars\n}\n\n/**\n * Simple suffix stemmer — removes common English suffixes.\n * Not a full Porter stemmer, but sufficient for Jaccard comparison.\n */\nexport function stem(word: string): string {\n\tconst suffixes = ['ing', 'tion', 'sion', 'ness', 'ment', 'able', 'ible', 'ful', 'less', 'ous', 'ive', 'ity', 'ies', 'ed', 'er', 'es', 'ly', 'al', 'en'];\n\tfor (const suffix of suffixes) {\n\t\tif (word.length > suffix.length + 2 && word.endsWith(suffix)) {\n\t\t\treturn word.slice(0, -suffix.length);\n\t\t}\n\t}\n\treturn word;\n}\n\n/**\n * Compute Jaccard similarity between two token sets.\n * |A ∩ B| / |A ∪ B|\n */\nexport function jaccardSimilarity(a: string[], b: string[]): number {\n\tif (a.length === 0 && b.length === 0) return 1.0;\n\tif (a.length === 0 || b.length === 0) return 0.0;\n\n\tconst setA = new Set(a);\n\tconst setB = new Set(b);\n\tlet intersection = 0;\n\n\tfor (const item of setA) {\n\t\tif (setB.has(item)) intersection++;\n\t}\n\n\tconst union = new Set([...setA, ...setB]).size;\n\treturn intersection / union;\n}\n","// hebbian — Grow Neuron (with synaptic consolidation)\n//\n// Creates a new neuron (folder + 1.neuron).\n// Before creating, checks for similar existing neurons via Jaccard similarity.\n// If a match is found (>= 0.6), fires the existing neuron instead.\n// This prevents duplication and strengthens existing pathways.\n//\n// \"Consolidation over duplication.\" — Hebb's principle.\n\nimport { mkdirSync, writeFileSync, existsSync, readdirSync } from 'node:fs';\nimport { join, relative } from 'node:path';\nimport { REGIONS, JACCARD_THRESHOLD } from './constants';\nimport { tokenize, jaccardSimilarity } from './similarity';\nimport { fireNeuron } from './fire';\n\nexport interface GrowResult {\n\taction: 'grew' | 'fired';\n\tpath: string;\n\tcounter: number;\n}\n\n/**\n * Grow a new neuron at the given path.\n * If a similar neuron already exists in the same region, fires it instead.\n */\nexport function growNeuron(brainRoot: string, neuronPath: string): GrowResult {\n\tconst fullPath = join(brainRoot, neuronPath);\n\n\t// If neuron already exists, just fire it\n\tif (existsSync(fullPath)) {\n\t\tconst counter = fireNeuron(brainRoot, neuronPath);\n\t\treturn { action: 'fired', path: neuronPath, counter };\n\t}\n\n\t// Extract region name and leaf name\n\tif (neuronPath.includes('..') || neuronPath.startsWith('/')) {\n\t\tthrow new Error(`Invalid neuron path: \"${neuronPath}\" (path traversal not allowed)`);\n\t}\n\tconst parts = neuronPath.split('/');\n\tconst regionName = parts[0]!;\n\tif (!(REGIONS as readonly string[]).includes(regionName)) {\n\t\tthrow new Error(`Invalid region: ${regionName}. Valid: ${REGIONS.join(', ')}`);\n\t}\n\n\tconst leafName = parts[parts.length - 1]!;\n\t// Strip correction prefix for Jaccard comparison so NO_console_log\n\t// consolidates with DO_console_log (unless prefix differs on short names)\n\tconst newPrefix = leafName.match(/^(NO|DO|MUST|WARN)_/)?.[1] || '';\n\tconst newStripped = leafName.replace(/^(NO|DO|MUST|WARN)_/, '');\n\tconst newTokens = tokenize(newStripped);\n\n\t// Search for similar neurons in the same region\n\tconst regionPath = join(brainRoot, regionName);\n\tif (existsSync(regionPath)) {\n\t\tconst match = findSimilar(regionPath, regionPath, newTokens, newPrefix);\n\t\tif (match) {\n\t\t\tconst matchRelPath = regionName + '/' + relative(regionPath, match);\n\t\t\tconsole.log(`\\u{1F504} consolidation: \"${neuronPath}\" ≈ \"${matchRelPath}\" (firing existing)`);\n\t\t\tconst counter = fireNeuron(brainRoot, matchRelPath);\n\t\t\treturn { action: 'fired', path: matchRelPath, counter };\n\t\t}\n\t}\n\n\t// No match — create new neuron\n\tmkdirSync(fullPath, { recursive: true });\n\twriteFileSync(join(fullPath, '1.neuron'), '', 'utf8');\n\tconsole.log(`\\u{1F331} grew: ${neuronPath} (1)`);\n\treturn { action: 'grew', path: neuronPath, counter: 1 };\n}\n\n/**\n * Walk a region and find a neuron whose name is similar to the given tokens.\n * Strips correction prefixes (NO_/DO_/MUST_/WARN_) before comparison.\n * Guard: if prefixes differ and tokens <= 2, skip (prevents NO_log merging with MUST_log).\n */\nfunction findSimilar(dir: string, regionRoot: string, targetTokens: string[], targetPrefix: string): string | null {\n\tlet entries;\n\ttry {\n\t\tentries = readdirSync(dir, { withFileTypes: true });\n\t} catch {\n\t\treturn null;\n\t}\n\n\t// Check if this directory has .neuron files (is a neuron)\n\tconst hasNeuron = entries.some((e) => e.isFile() && e.name.endsWith('.neuron'));\n\tif (hasNeuron) {\n\t\tconst folderName = dir.split('/').pop() || '';\n\t\tconst existingPrefix = folderName.match(/^(NO|DO|MUST|WARN)_/)?.[1] || '';\n\t\tconst existingStripped = folderName.replace(/^(NO|DO|MUST|WARN)_/, '');\n\t\tconst existingTokens = tokenize(existingStripped);\n\t\tconst similarity = jaccardSimilarity(targetTokens, existingTokens);\n\n\t\t// Guard: different prefixes with short names = semantically different rules\n\t\tif (targetPrefix !== existingPrefix && targetTokens.length <= 2) {\n\t\t\t// Skip: \"NO_log\" and \"MUST_log\" should NOT consolidate\n\t\t} else if (similarity >= JACCARD_THRESHOLD) {\n\t\t\treturn dir;\n\t\t}\n\t}\n\n\t// Recurse into subdirectories\n\tfor (const entry of entries) {\n\t\tif (entry.name.startsWith('_') || entry.name.startsWith('.')) continue;\n\t\tif (entry.isDirectory()) {\n\t\t\tconst match = findSimilar(join(dir, entry.name), regionRoot, targetTokens, targetPrefix);\n\t\t\tif (match) return match;\n\t\t}\n\t}\n\n\treturn null;\n}\n","// hebbian — Rollback Neuron (decrement counter)\n//\n// Undo a firing. Counter cannot go below 1 (minimum activation).\n\nimport { renameSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { getCurrentCounter } from './fire';\n\n/**\n * Decrement a neuron's counter by 1. Minimum counter is 1.\n */\nexport function rollbackNeuron(brainRoot: string, neuronPath: string): number {\n\tconst fullPath = join(brainRoot, neuronPath);\n\tconst current = getCurrentCounter(fullPath);\n\n\tif (current === 0) {\n\t\tthrow new Error(`Neuron not found: ${neuronPath}`);\n\t}\n\n\tif (current <= 1) {\n\t\tthrow new Error(`Counter already at minimum (1): ${neuronPath}`);\n\t}\n\n\tconst newCounter = current - 1;\n\trenameSync(join(fullPath, `${current}.neuron`), join(fullPath, `${newCounter}.neuron`));\n\n\tconsole.log(`\\u{23EA} rollback: ${neuronPath} (${current} → ${newCounter})`);\n\treturn newCounter;\n}\n","// hebbian — Signal Neuron (dopamine / bomb / memory)\n//\n// Signals are additional trace files placed in a neuron directory:\n// dopamineN.neuron — reward signal (positive reinforcement)\n// bomb.neuron — circuit breaker (halts downstream regions)\n// memoryN.neuron — memory marker (episodic recording)\n\nimport { writeFileSync, existsSync, readdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { SIGNAL_TYPES } from './constants';\nimport type { SignalType } from './constants';\n\n/**\n * Add a signal to a neuron.\n */\nexport function signalNeuron(brainRoot: string, neuronPath: string, signalType: SignalType): void {\n\tif (!SIGNAL_TYPES.includes(signalType)) {\n\t\tthrow new Error(`Invalid signal type: ${signalType}. Valid: ${SIGNAL_TYPES.join(', ')}`);\n\t}\n\n\tconst fullPath = join(brainRoot, neuronPath);\n\tif (!existsSync(fullPath)) {\n\t\tthrow new Error(`Neuron not found: ${neuronPath}`);\n\t}\n\n\tswitch (signalType) {\n\t\tcase 'bomb': {\n\t\t\twriteFileSync(join(fullPath, 'bomb.neuron'), '', 'utf8');\n\t\t\tconsole.log(`\\u{1F4A3} bomb planted: ${neuronPath}`);\n\t\t\tbreak;\n\t\t}\n\t\tcase 'dopamine': {\n\t\t\tconst level = getNextSignalLevel(fullPath, 'dopamine');\n\t\t\twriteFileSync(join(fullPath, `dopamine${level}.neuron`), '', 'utf8');\n\t\t\tconsole.log(`\\u{1F7E2} dopamine +${level}: ${neuronPath}`);\n\t\t\tbreak;\n\t\t}\n\t\tcase 'memory': {\n\t\t\tconst level = getNextSignalLevel(fullPath, 'memory');\n\t\t\twriteFileSync(join(fullPath, `memory${level}.neuron`), '', 'utf8');\n\t\t\tconsole.log(`\\u{1F4BE} memory +${level}: ${neuronPath}`);\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\n/**\n * Get the next signal level (current max + 1).\n */\nfunction getNextSignalLevel(dir: string, prefix: string): number {\n\tlet max = 0;\n\ttry {\n\t\tfor (const entry of readdirSync(dir)) {\n\t\t\tif (entry.startsWith(prefix) && entry.endsWith('.neuron')) {\n\t\t\t\tconst n = parseInt(entry.replace(prefix, ''), 10);\n\t\t\t\tif (!isNaN(n) && n > max) max = n;\n\t\t\t}\n\t\t}\n\t} catch {}\n\treturn max + 1;\n}\n","// hebbian — Decay (dormancy sweep)\n//\n// Neurons that haven't been touched in N days are marked dormant.\n// Dormancy = *.dormant file in the neuron directory.\n// Dormant neurons are excluded from emission and activation counts.\n//\n// \"Most neurons die. Only the repeatedly fired ones survive.\" — Natural selection on OS.\n\nimport { readdirSync, statSync, writeFileSync, existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { REGIONS, MAX_DEPTH } from './constants';\n\nexport interface DecayResult {\n\tscanned: number;\n\tdecayed: number;\n}\n\n/**\n * Sweep the brain and mark inactive neurons as dormant.\n */\nexport function runDecay(brainRoot: string, days: number): DecayResult {\n\tconst threshold = Date.now() - days * 24 * 60 * 60 * 1000;\n\tlet scanned = 0;\n\tlet decayed = 0;\n\n\tfor (const regionName of REGIONS) {\n\t\tconst regionPath = join(brainRoot, regionName);\n\t\tif (!existsSync(regionPath)) continue;\n\t\tconst result = decayWalk(regionPath, threshold, 0);\n\t\tscanned += result.scanned;\n\t\tdecayed += result.decayed;\n\t}\n\n\tconsole.log(`\\u{1F4A4} decay: scanned ${scanned} neurons, decayed ${decayed} (>${days} days inactive)`);\n\treturn { scanned, decayed };\n}\n\nfunction decayWalk(dir: string, threshold: number, depth: number): DecayResult {\n\tif (depth > MAX_DEPTH) return { scanned: 0, decayed: 0 };\n\n\tlet scanned = 0;\n\tlet decayed = 0;\n\tlet entries;\n\n\ttry {\n\t\tentries = readdirSync(dir, { withFileTypes: true });\n\t} catch {\n\t\treturn { scanned: 0, decayed: 0 };\n\t}\n\n\t// Check if this directory is a neuron (has .neuron files)\n\tlet hasNeuronFile = false;\n\tlet isDormant = false;\n\tlet latestMod = 0;\n\n\tfor (const entry of entries) {\n\t\tif (entry.isFile()) {\n\t\t\tif (entry.name.endsWith('.neuron')) {\n\t\t\t\thasNeuronFile = true;\n\t\t\t\ttry {\n\t\t\t\t\tconst st = statSync(join(dir, entry.name));\n\t\t\t\t\tif (st.mtimeMs > latestMod) latestMod = st.mtimeMs;\n\t\t\t\t} catch {}\n\t\t\t}\n\t\t\tif (entry.name.endsWith('.dormant')) {\n\t\t\t\tisDormant = true;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (hasNeuronFile) {\n\t\tscanned++;\n\t\tif (!isDormant && latestMod < threshold) {\n\t\t\tconst age = Math.floor((Date.now() - latestMod) / (24 * 60 * 60 * 1000));\n\t\t\twriteFileSync(\n\t\t\t\tjoin(dir, 'decay.dormant'),\n\t\t\t\t`Dormant since ${new Date().toISOString()} (${age} days inactive)`,\n\t\t\t\t'utf8',\n\t\t\t);\n\t\t\tdecayed++;\n\t\t}\n\t}\n\n\t// Recurse\n\tfor (const entry of entries) {\n\t\tif (entry.name.startsWith('_') || entry.name.startsWith('.')) continue;\n\t\tif (entry.isDirectory()) {\n\t\t\tconst sub = decayWalk(join(dir, entry.name), threshold, depth + 1);\n\t\t\tscanned += sub.scanned;\n\t\t\tdecayed += sub.decayed;\n\t\t}\n\t}\n\n\treturn { scanned, decayed };\n}\n","// hebbian — Batch Deduplication\n//\n// Scans all neurons in a region and merges duplicates via Jaccard similarity.\n// When a match is found (>= threshold), fires the higher-counter neuron\n// and marks the lower-counter one dormant.\n\nimport { writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { JACCARD_THRESHOLD } from './constants';\nimport { tokenize, jaccardSimilarity } from './similarity';\nimport { fireNeuron } from './fire';\nimport { scanBrain } from './scanner';\n\nexport interface DedupResult {\n\tscanned: number;\n\tmerged: number;\n}\n\n/**\n * Run batch deduplication across all regions.\n */\nexport function runDedup(brainRoot: string): DedupResult {\n\tconst brain = scanBrain(brainRoot);\n\tlet scanned = 0;\n\tlet merged = 0;\n\n\tfor (const region of brain.regions) {\n\t\tconst neurons = region.neurons.filter((n) => !n.isDormant);\n\t\tscanned += neurons.length;\n\n\t\t// O(n^2) pairwise comparison within each region\n\t\tconst consumed = new Set<number>();\n\t\tfor (let i = 0; i < neurons.length; i++) {\n\t\t\tif (consumed.has(i)) continue;\n\t\t\tconst ni = neurons[i]!;\n\t\t\tconst tokensI = tokenize(ni.name);\n\n\t\t\tfor (let j = i + 1; j < neurons.length; j++) {\n\t\t\t\tif (consumed.has(j)) continue;\n\t\t\t\tconst nj = neurons[j]!;\n\t\t\t\tconst tokensJ = tokenize(nj.name);\n\t\t\t\tconst sim = jaccardSimilarity(tokensI, tokensJ);\n\n\t\t\t\tif (sim >= JACCARD_THRESHOLD) {\n\t\t\t\t\t// Keep the one with higher counter, mark other dormant\n\t\t\t\t\tconst [keep, drop] = ni.counter >= nj.counter\n\t\t\t\t\t\t? [ni, nj] : [nj, ni];\n\n\t\t\t\t\t// Fire the keeper to absorb the dropped counter\n\t\t\t\t\tconst relKeep = `${region.name}/${keep.path}`;\n\t\t\t\t\tfireNeuron(brainRoot, relKeep);\n\n\t\t\t\t\t// Mark the dropped neuron dormant\n\t\t\t\t\twriteFileSync(\n\t\t\t\t\t\tjoin(drop.fullPath, 'dedup.dormant'),\n\t\t\t\t\t\t`Merged into ${keep.path} on ${new Date().toISOString()}`,\n\t\t\t\t\t\t'utf8',\n\t\t\t\t\t);\n\n\t\t\t\t\tconsumed.add(ni === drop ? i : j);\n\t\t\t\t\tmerged++;\n\t\t\t\t\tconsole.log(`\\u{1F500} merged: \"${drop.path}\" → \"${keep.path}\" (sim=${sim.toFixed(2)})`);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tconsole.log(`\\u{1F9F9} dedup: scanned ${scanned} neurons, merged ${merged}`);\n\treturn { scanned, merged };\n}\n","// hebbian — Git Snapshot\n//\n// Creates a git commit of the current brain state for audit trail.\n// Only commits if there are changes.\n\nimport { execSync } from 'node:child_process';\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\n\n/**\n * Create a git snapshot of the brain directory.\n */\nexport function gitSnapshot(brainRoot: string): boolean {\n\t// Check if brain is inside a git repo\n\tif (!existsSync(join(brainRoot, '.git'))) {\n\t\t// Try parent directories\n\t\ttry {\n\t\t\texecSync('git rev-parse --is-inside-work-tree', { cwd: brainRoot, stdio: 'pipe' });\n\t\t} catch {\n\t\t\tconsole.log('\\u{26A0}\\uFE0F Not a git repository. Run `git init` in the brain directory first.');\n\t\t\treturn false;\n\t\t}\n\t}\n\n\ttry {\n\t\t// Check for changes\n\t\tconst status = execSync('git status --porcelain .', { cwd: brainRoot, encoding: 'utf8' });\n\t\tif (!status.trim()) {\n\t\t\tconsole.log('\\u{2705} No changes to snapshot.');\n\t\t\treturn false;\n\t\t}\n\n\t\t// Stage and commit\n\t\texecSync('git add .', { cwd: brainRoot, stdio: 'pipe' });\n\t\tconst ts = new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19);\n\t\texecSync(`git commit -m \"hebbian snapshot ${ts}\"`, { cwd: brainRoot, stdio: 'pipe' });\n\n\t\tconsole.log(`\\u{1F4F8} snapshot: committed brain state at ${ts}`);\n\t\treturn true;\n\t} catch (err: unknown) {\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\tconsole.error(`\\u{274C} snapshot failed: ${message}`);\n\t\treturn false;\n\t}\n}\n","// hebbian — Watch Mode\n//\n// Watches the brain directory for filesystem changes and auto-recompiles\n// all tiers when changes are detected. Uses hash-based change detection\n// to avoid redundant writes.\n\nimport { watch } from 'node:fs';\nimport { scanBrain } from './scanner';\nimport { runSubsumption } from './subsumption';\nimport { writeAllTiers } from './emit';\nimport type { SubsumptionResult } from './types';\n\n/**\n * Start watching a brain directory for changes.\n * Auto-recompiles tiers when neurons are added/modified/removed.\n */\nexport async function startWatch(brainRoot: string): Promise<void> {\n\tlet lastHash = '';\n\tlet debounceTimer: ReturnType<typeof setTimeout> | null = null;\n\n\t/** Scan brain and recompile if state changed. */\n\tfunction recompile(): void {\n\t\tconst brain = scanBrain(brainRoot);\n\t\tconst result = runSubsumption(brain);\n\t\tconst hash = computeHash(result);\n\n\t\tif (hash === lastHash) return;\n\t\tlastHash = hash;\n\n\t\twriteAllTiers(brainRoot, result, brain);\n\t\tconst ts = new Date().toLocaleTimeString();\n\t\tconsole.log(`[${ts}] \\u{1F504} recompiled — ${result.firedNeurons} neurons, activation ${result.totalCounter}${result.bombSource ? ` \\u{1F4A3} BOMB: ${result.bombSource}` : ''}`);\n\t}\n\n\t// Initial compilation\n\trecompile();\n\tconsole.log(`\\u{1F440} watching: ${brainRoot}`);\n\tconsole.log(' Press Ctrl+C to stop.\\n');\n\n\t// Watch for filesystem changes\n\ttry {\n\t\tconst watcher = watch(brainRoot, { recursive: true }, (eventType, filename) => {\n\t\t\tif (!filename) return;\n\t\t\t// Ignore _index.md and _rules.md (our own output)\n\t\t\tif (filename.endsWith('_index.md') || filename.endsWith('_rules.md')) return;\n\t\t\t// Ignore hidden/internal\n\t\t\tif (filename.startsWith('.') || filename.includes('/_') || filename.includes('\\\\_')) return;\n\n\t\t\t// Debounce: wait 200ms after last change before recompiling\n\t\t\tif (debounceTimer) clearTimeout(debounceTimer);\n\t\t\tdebounceTimer = setTimeout(recompile, 200);\n\t\t});\n\n\t\t// Keep process alive\n\t\tawait new Promise<void>((resolve) => {\n\t\t\tprocess.on('SIGINT', () => {\n\t\t\t\twatcher.close();\n\t\t\t\tconsole.log('\\n\\u{1F44B} watch stopped.');\n\t\t\t\tresolve();\n\t\t\t});\n\t\t});\n\t} catch (err: unknown) {\n\t\tif (err && typeof err === 'object' && 'code' in err && err.code === 'ERR_FEATURE_UNAVAILABLE_ON_PLATFORM') {\n\t\t\tconsole.error('Recursive fs.watch not supported on this platform. Use Node.js >= 22.');\n\t\t} else {\n\t\t\tthrow err;\n\t\t}\n\t}\n}\n\n/**\n * Compute a simple hash from the subsumption result for change detection.\n */\nfunction computeHash(result: SubsumptionResult): string {\n\treturn `${result.firedNeurons}:${result.totalCounter}:${result.bombSource}:${result.activeRegions.length}`;\n}\n","// hebbian — Candidate Neuron Staging\n//\n// New neurons from evolve/inbox/digest land in {region}/_candidates/{name}/\n// instead of directly in the region. Candidates have a probation period:\n// - counter >= 3 → promote to parent region (graduate)\n// - not fired within 14 days → decay (remove)\n//\n// _candidates/ is already invisible to scan/emit/decay because the existing\n// _ prefix convention filters it in scanner.ts and decay.ts.\n//\n// Directory layout example:\n// brain/cortex/_candidates/NO_console_log/1.neuron ← counter=1\n// brain/cortex/NO_console_log/3.neuron ← promoted (counter=3)\n\nimport { existsSync, mkdirSync, readdirSync, renameSync, rmSync, statSync } from 'node:fs';\nimport { join, dirname, relative } from 'node:path';\nimport { REGIONS } from './constants';\nimport { growNeuron } from './grow';\nimport { fireNeuron } from './fire';\nimport type { GrowResult } from './grow';\n\nexport const CANDIDATE_THRESHOLD = 3;\nexport const CANDIDATE_DECAY_DAYS = 14;\nconst CANDIDATE_SEGMENT = '_candidates';\n\nexport interface CandidateInfo {\n\tcandidatePath: string; // e.g. \"cortex/_candidates/NO_console_log\"\n\ttargetPath: string; // e.g. \"cortex/NO_console_log\"\n\tcounter: number;\n\tdaysInactive: number;\n}\n\nexport interface PromoteResult {\n\tpromoted: string[];\n\tdecayed: string[];\n}\n\n// \"cortex/NO_console_log\" → \"cortex/_candidates/NO_console_log\"\nexport function toCandidatePath(neuronPath: string): string {\n\tconst slash = neuronPath.indexOf('/');\n\tif (slash === -1) throw new Error(`Invalid neuron path (missing region): ${neuronPath}`);\n\treturn `${neuronPath.slice(0, slash)}/${CANDIDATE_SEGMENT}/${neuronPath.slice(slash + 1)}`;\n}\n\n// \"cortex/_candidates/NO_console_log\" → \"cortex/NO_console_log\"\nexport function fromCandidatePath(candidatePath: string): string {\n\treturn candidatePath.replace(`/${CANDIDATE_SEGMENT}/`, '/');\n}\n\n/**\n * Grow a candidate neuron. If the counter reaches threshold, promote to region.\n * Use instead of growNeuron() for evolve/inbox/digest flows.\n */\nexport function growCandidate(brainRoot: string, neuronPath: string): GrowResult & { promoted: boolean } {\n\tconst candidatePath = toCandidatePath(neuronPath);\n\tconst result = growNeuron(brainRoot, candidatePath);\n\n\tif (result.counter >= CANDIDATE_THRESHOLD) {\n\t\tconst ok = moveCandidate(brainRoot, candidatePath, neuronPath);\n\t\treturn { ...result, path: ok ? neuronPath : result.path, promoted: ok };\n\t}\n\n\tconsole.log(` 🌱 candidate (${result.counter}/${CANDIDATE_THRESHOLD}): ${candidatePath}`);\n\treturn { ...result, promoted: false };\n}\n\n/**\n * Move a candidate to its permanent location.\n * If target already exists, fires it instead and removes the candidate.\n */\nfunction moveCandidate(brainRoot: string, candidatePath: string, targetPath: string): boolean {\n\tconst src = join(brainRoot, candidatePath);\n\tif (!existsSync(src)) return false;\n\n\tconst dst = join(brainRoot, targetPath);\n\tif (existsSync(dst)) {\n\t\t// Permanent neuron already exists — fire it, remove candidate\n\t\tfireNeuron(brainRoot, targetPath);\n\t\trmSync(src, { recursive: true, force: true });\n\t} else {\n\t\tmkdirSync(dirname(dst), { recursive: true });\n\t\trenameSync(src, dst);\n\t}\n\n\tconsole.log(`🎓 promoted: ${candidatePath} → ${targetPath}`);\n\treturn true;\n}\n\n/**\n * Scan all regions for candidates. Promote graduated ones, decay stale ones.\n * Call at start of `hebbian evolve` or via `hebbian candidates promote`.\n */\nexport function promoteCandidates(brainRoot: string): PromoteResult {\n\tconst promoted: string[] = [];\n\tconst decayed: string[] = [];\n\tconst decayMs = CANDIDATE_DECAY_DAYS * 24 * 60 * 60 * 1000;\n\tconst now = Date.now();\n\n\tfor (const region of REGIONS) {\n\t\tconst candidateRoot = join(brainRoot, region, CANDIDATE_SEGMENT);\n\t\twalkNeuronDirs(candidateRoot, (neuronDir) => {\n\t\t\tconst rel = relative(join(brainRoot, region), neuronDir);\n\t\t\tconst candidatePath = `${region}/${rel}`;\n\t\t\tconst targetPath = fromCandidatePath(candidatePath);\n\t\t\tconst counter = readCounter(neuronDir);\n\t\t\tconst mtime = statSync(neuronDir).mtimeMs;\n\n\t\t\tif (counter >= CANDIDATE_THRESHOLD) {\n\t\t\t\tmoveCandidate(brainRoot, candidatePath, targetPath);\n\t\t\t\tpromoted.push(targetPath);\n\t\t\t} else if (now - mtime > decayMs) {\n\t\t\t\trmSync(neuronDir, { recursive: true, force: true });\n\t\t\t\tdecayed.push(candidatePath);\n\t\t\t\tconsole.log(`💀 candidate decayed: ${candidatePath}`);\n\t\t\t}\n\t\t});\n\t}\n\n\treturn { promoted, decayed };\n}\n\n/**\n * List all pending candidates with their counters and inactivity.\n */\nexport function listCandidates(brainRoot: string): CandidateInfo[] {\n\tconst results: CandidateInfo[] = [];\n\tconst now = Date.now();\n\n\tfor (const region of REGIONS) {\n\t\tconst candidateRoot = join(brainRoot, region, CANDIDATE_SEGMENT);\n\t\twalkNeuronDirs(candidateRoot, (neuronDir) => {\n\t\t\tconst rel = relative(join(brainRoot, region), neuronDir);\n\t\t\tconst candidatePath = `${region}/${rel}`;\n\t\t\tconst targetPath = fromCandidatePath(candidatePath);\n\t\t\tconst counter = readCounter(neuronDir);\n\t\t\tconst mtime = statSync(neuronDir).mtimeMs;\n\t\t\tconst daysInactive = Math.floor((now - mtime) / (24 * 60 * 60 * 1000));\n\t\t\tresults.push({ candidatePath, targetPath, counter, daysInactive });\n\t\t});\n\t}\n\n\treturn results;\n}\n\n// Walk a directory tree, calling callback for directories that contain .neuron files.\nfunction walkNeuronDirs(dir: string, cb: (neuronDir: string) => void): void {\n\tif (!existsSync(dir)) return;\n\ttry {\n\t\tconst entries = readdirSync(dir, { withFileTypes: true });\n\t\tconst hasNeuron = entries.some((e) => e.isFile() && e.name.endsWith('.neuron'));\n\t\tif (hasNeuron) {\n\t\t\tcb(dir);\n\t\t\treturn; // neuron dirs don't contain sub-neurons\n\t\t}\n\t\tfor (const entry of entries) {\n\t\t\tif (entry.isDirectory() && !entry.name.startsWith('.')) {\n\t\t\t\twalkNeuronDirs(join(dir, entry.name), cb);\n\t\t\t}\n\t\t}\n\t} catch { /* skip unreadable dirs */ }\n}\n\n// Read the highest N from N.neuron files in a directory.\nfunction readCounter(dir: string): number {\n\ttry {\n\t\tconst files = readdirSync(dir).filter((f) => /^\\d+\\.neuron$/.test(f));\n\t\tif (files.length === 0) return 0;\n\t\treturn Math.max(...files.map((f) => parseInt(f, 10)));\n\t} catch {\n\t\treturn 0;\n\t}\n}\n","// hebbian — Episode Logging (Circular Buffer)\n//\n// Writes events to hippocampus/session_log/ as memoryN.neuron files.\n// Circular buffer: max 100 entries. When full, overwrites oldest.\n//\n// Port from: NeuronFS/runtime/main.go lines 1300-1342\n\nimport { readdirSync, readFileSync, writeFileSync, mkdirSync, existsSync } from 'node:fs';\nimport { join } from 'node:path';\n\nconst MAX_EPISODES = 100;\nconst SESSION_LOG_DIR = 'hippocampus/session_log';\n\nexport interface Episode {\n\tts: string;\n\ttype: string;\n\tpath: string;\n\tdetail: string;\n\toutcome?: 'revert' | 'acceptance';\n\tneurons?: string[];\n}\n\n/**\n * Log an episode to the hippocampus session log.\n * Circular buffer — writes to memoryN.neuron, wraps at MAX_EPISODES.\n */\nexport function logEpisode(\n\tbrainRoot: string,\n\ttype: string,\n\tpath: string,\n\tdetail: string,\n\textra?: { outcome?: Episode['outcome']; neurons?: string[] },\n): void {\n\tconst logDir = join(brainRoot, SESSION_LOG_DIR);\n\tif (!existsSync(logDir)) {\n\t\tmkdirSync(logDir, { recursive: true });\n\t}\n\n\tconst nextSlot = getNextSlot(logDir);\n\tconst episode: Episode = {\n\t\tts: new Date().toISOString(),\n\t\ttype,\n\t\tpath,\n\t\tdetail,\n\t\t...(extra?.outcome ? { outcome: extra.outcome } : {}),\n\t\t...(extra?.neurons ? { neurons: extra.neurons } : {}),\n\t};\n\n\twriteFileSync(\n\t\tjoin(logDir, `memory${nextSlot}.neuron`),\n\t\tJSON.stringify(episode),\n\t\t'utf8',\n\t);\n}\n\n/**\n * Read all episodes from the session log, sorted by timestamp.\n */\nexport function readEpisodes(brainRoot: string): Episode[] {\n\tconst logDir = join(brainRoot, SESSION_LOG_DIR);\n\tif (!existsSync(logDir)) return [];\n\n\tconst episodes: Episode[] = [];\n\tlet entries;\n\ttry {\n\t\tentries = readdirSync(logDir);\n\t} catch {\n\t\treturn [];\n\t}\n\n\tfor (const entry of entries) {\n\t\tif (!entry.startsWith('memory') || !entry.endsWith('.neuron')) continue;\n\t\ttry {\n\t\t\tconst content = readFileSync(join(logDir, entry), 'utf8');\n\t\t\tif (content.trim()) {\n\t\t\t\tepisodes.push(JSON.parse(content) as Episode);\n\t\t\t}\n\t\t} catch {\n\t\t\t// skip malformed entries\n\t\t}\n\t}\n\n\tepisodes.sort((a, b) => a.ts.localeCompare(b.ts));\n\treturn episodes;\n}\n\n/**\n * Find the next circular buffer slot (1-based, wraps at MAX_EPISODES).\n */\nfunction getNextSlot(logDir: string): number {\n\tlet maxSlot = 0;\n\ttry {\n\t\tfor (const entry of readdirSync(logDir)) {\n\t\t\tif (entry.startsWith('memory') && entry.endsWith('.neuron')) {\n\t\t\t\tconst n = parseInt(entry.replace('memory', '').replace('.neuron', ''), 10);\n\t\t\t\tif (!isNaN(n) && n > maxSlot) maxSlot = n;\n\t\t\t}\n\t\t}\n\t} catch {}\n\n\tconst next = maxSlot + 1;\n\t// Wrap around: if we exceed max, start overwriting from 1\n\treturn next > MAX_EPISODES ? ((maxSlot % MAX_EPISODES) + 1) : next;\n}\n","// hebbian — Inbox Processing\n//\n// Parses _inbox/corrections.jsonl and auto-creates/fires neurons from\n// AI corrections. Security checks prevent path traversal. Only PM/admin\n// roles can award dopamine (inflation filter).\n//\n// Port from: NeuronFS/runtime/main.go lines 1425-1544\n\nimport { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { REGIONS } from './constants';\nimport { growCandidate } from './candidates';\nimport { fireNeuron } from './fire';\nimport { signalNeuron } from './signal';\nimport { logEpisode } from './episode';\n\nconst INBOX_DIR = '_inbox';\nconst CORRECTIONS_FILE = 'corrections.jsonl';\nconst DOPAMINE_ALLOWED_ROLES = ['pm', 'admin', 'lead'];\n\nexport interface Correction {\n\tts: string;\n\ttype: 'correction';\n\ttext: string;\n\tpath: string;\n\tcounter_add: number;\n\tauthor: string;\n\tdopamine?: number;\n}\n\nexport interface InboxResult {\n\tprocessed: number;\n\tskipped: number;\n\terrors: string[];\n}\n\n/**\n * Process the inbox corrections file.\n * Each line is a JSON object describing a correction to apply.\n */\nexport function processInbox(brainRoot: string): InboxResult {\n\tconst inboxPath = join(brainRoot, INBOX_DIR, CORRECTIONS_FILE);\n\n\tif (!existsSync(inboxPath)) {\n\t\treturn { processed: 0, skipped: 0, errors: [] };\n\t}\n\n\tconst content = readFileSync(inboxPath, 'utf8').trim();\n\tif (!content) {\n\t\treturn { processed: 0, skipped: 0, errors: [] };\n\t}\n\n\tconst lines = content.split('\\n').filter(Boolean);\n\tlet processed = 0;\n\tlet skipped = 0;\n\tconst errors: string[] = [];\n\n\tfor (const line of lines) {\n\t\tlet correction: Correction;\n\t\ttry {\n\t\t\tcorrection = JSON.parse(line) as Correction;\n\t\t} catch {\n\t\t\terrors.push(`Malformed JSON: ${line.slice(0, 80)}`);\n\t\t\tskipped++;\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Validate required fields\n\t\tif (!correction.path || !correction.type) {\n\t\t\terrors.push(`Missing path or type: ${line.slice(0, 80)}`);\n\t\t\tskipped++;\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Security: path traversal check\n\t\tif (!isPathSafe(correction.path)) {\n\t\t\terrors.push(`Path traversal blocked: ${correction.path}`);\n\t\t\tskipped++;\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Security: validate region\n\t\tconst region = correction.path.split('/')[0];\n\t\tif (!region || !(REGIONS as readonly string[]).includes(region)) {\n\t\t\terrors.push(`Invalid region in path: ${correction.path}`);\n\t\t\tskipped++;\n\t\t\tcontinue;\n\t\t}\n\n\t\ttry {\n\t\t\tapplyCorrection(brainRoot, correction);\n\t\t\tprocessed++;\n\t\t} catch (err) {\n\t\t\terrors.push(`Failed to apply ${correction.path}: ${(err as Error).message}`);\n\t\t\tskipped++;\n\t\t}\n\t}\n\n\t// Clear the inbox file after processing\n\twriteFileSync(inboxPath, '', 'utf8');\n\n\tconsole.log(`📥 inbox: processed ${processed}, skipped ${skipped}`);\n\tif (errors.length > 0) {\n\t\tfor (const err of errors) {\n\t\t\tconsole.log(` ⚠️ ${err}`);\n\t\t}\n\t}\n\n\treturn { processed, skipped, errors };\n}\n\n/**\n * Apply a single correction entry.\n */\nfunction applyCorrection(brainRoot: string, correction: Correction): void {\n\tconst neuronPath = correction.path;\n\tconst fullPath = join(brainRoot, neuronPath);\n\tconst counterAdd = Math.max(1, correction.counter_add || 1);\n\n\tif (existsSync(fullPath)) {\n\t\t// Neuron exists — fire N times\n\t\tfor (let i = 0; i < counterAdd; i++) {\n\t\t\tfireNeuron(brainRoot, neuronPath);\n\t\t}\n\t} else {\n\t\t// Neuron doesn't exist — grow via candidate staging\n\t\tconst candResult = growCandidate(brainRoot, neuronPath);\n\t\t// Only fire additional times if already promoted to permanent\n\t\tif (candResult.promoted) {\n\t\t\tfor (let i = 1; i < counterAdd; i++) {\n\t\t\t\tfireNeuron(brainRoot, neuronPath);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Dopamine inflation filter: only allowed roles can award dopamine\n\tif (correction.dopamine && correction.dopamine > 0) {\n\t\tconst author = (correction.author || '').toLowerCase();\n\t\tif (DOPAMINE_ALLOWED_ROLES.includes(author)) {\n\t\t\tsignalNeuron(brainRoot, neuronPath, 'dopamine');\n\t\t}\n\t}\n\n\tlogEpisode(brainRoot, 'inbox', neuronPath, correction.text || '');\n}\n\n/**\n * Security: check path for traversal attacks.\n */\nfunction isPathSafe(path: string): boolean {\n\tif (path.includes('..')) return false;\n\tif (path.startsWith('/')) return false;\n\tif (path.includes('\\\\')) return false;\n\t// Block null bytes\n\tif (path.includes('\\0')) return false;\n\treturn true;\n}\n\n/**\n * Ensure the inbox directory and corrections file exist.\n */\nexport function ensureInbox(brainRoot: string): string {\n\tconst inboxDir = join(brainRoot, INBOX_DIR);\n\tif (!existsSync(inboxDir)) {\n\t\tmkdirSync(inboxDir, { recursive: true });\n\t}\n\tconst filePath = join(inboxDir, CORRECTIONS_FILE);\n\tif (!existsSync(filePath)) {\n\t\twriteFileSync(filePath, '', 'utf8');\n\t}\n\treturn filePath;\n}\n\n/**\n * Append a correction entry to the inbox.\n */\nexport function appendCorrection(brainRoot: string, correction: Correction): void {\n\tconst filePath = ensureInbox(brainRoot);\n\tconst line = JSON.stringify(correction) + '\\n';\n\tconst existing = readFileSync(filePath, 'utf8');\n\twriteFileSync(filePath, existing + line, 'utf8');\n}\n","// hebbian — REST API Server\n//\n// Programmatic brain manipulation via HTTP. Zero dependencies (node:http).\n// Enables external tools (n8n, webhooks, dashboards) to interact with hebbian.\n//\n// Port from: NeuronFS/runtime/main.go lines 2099-2434\n\nimport { createServer, type IncomingMessage, type ServerResponse } from 'node:http';\nimport { scanBrain } from './scanner';\nimport { runSubsumption } from './subsumption';\nimport { fireNeuron } from './fire';\nimport { rollbackNeuron } from './rollback';\nimport { growNeuron } from './grow';\nimport { signalNeuron } from './signal';\nimport { runDecay } from './decay';\nimport { runDedup } from './dedup';\nimport { writeAllTiers } from './emit';\nimport { processInbox } from './inbox';\nimport { REGIONS, REGION_ICONS, REGION_KO, type SignalType } from './constants';\nimport type { RegionName } from './constants';\n\nlet lastAPIActivity = Date.now();\n\nexport interface ReportEntry {\n\tts: string;\n\tmessage: string;\n\tpriority: 'low' | 'normal' | 'high' | 'critical';\n}\n\nconst pendingReports: ReportEntry[] = [];\n\n// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n// JSON Response Builders\n// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\nfunction buildHealthJSON(brainRoot: string) {\n\tconst brain = scanBrain(brainRoot);\n\tconst result = runSubsumption(brain);\n\treturn {\n\t\tstatus: 'ok',\n\t\tbrain: brainRoot,\n\t\tneurons: result.totalNeurons,\n\t\tactiveNeurons: result.firedNeurons,\n\t\ttotalActivation: result.totalCounter,\n\t\tbombSource: result.bombSource || null,\n\t\tlastActivity: new Date(lastAPIActivity).toISOString(),\n\t\tuptime: process.uptime(),\n\t};\n}\n\nfunction buildBrainJSON(brainRoot: string) {\n\tconst brain = scanBrain(brainRoot);\n\tconst result = runSubsumption(brain);\n\treturn {\n\t\troot: brain.root,\n\t\tregions: brain.regions.map((region) => ({\n\t\t\tname: region.name,\n\t\t\ticon: REGION_ICONS[region.name as RegionName] || '',\n\t\t\tko: REGION_KO[region.name as RegionName] || '',\n\t\t\tpriority: region.priority,\n\t\t\thasBomb: region.hasBomb,\n\t\t\tneurons: region.neurons.map((n) => ({\n\t\t\t\tname: n.name,\n\t\t\t\tpath: n.path,\n\t\t\t\tcounter: n.counter,\n\t\t\t\tcontra: n.contra,\n\t\t\t\tdopamine: n.dopamine,\n\t\t\t\thasBomb: n.hasBomb,\n\t\t\t\thasMemory: n.hasMemory,\n\t\t\t\tisDormant: n.isDormant,\n\t\t\t\tdepth: n.depth,\n\t\t\t\tmodTime: n.modTime.getTime(),\n\t\t\t})),\n\t\t\taxons: region.axons,\n\t\t})),\n\t\tbombSource: result.bombSource || null,\n\t\tfiredNeurons: result.firedNeurons,\n\t\ttotalNeurons: result.totalNeurons,\n\t\ttotalCounter: result.totalCounter,\n\t};\n}\n\n// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n// HTTP Helpers\n// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\nfunction json(res: ServerResponse, data: unknown, status = 200): void {\n\tconst body = JSON.stringify(data);\n\tres.writeHead(status, {\n\t\t'Content-Type': 'application/json',\n\t\t'Access-Control-Allow-Origin': '*',\n\t\t'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',\n\t\t'Access-Control-Allow-Headers': 'Content-Type',\n\t});\n\tres.end(body);\n}\n\nfunction error(res: ServerResponse, message: string, status = 400): void {\n\tjson(res, { error: message }, status);\n}\n\nconst MAX_BODY_BYTES = 1_048_576; // 1 MB\n\nasync function readBody(req: IncomingMessage): Promise<string> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst chunks: Buffer[] = [];\n\t\tlet total = 0;\n\t\treq.on('data', (chunk: Buffer) => {\n\t\t\ttotal += chunk.length;\n\t\t\tif (total > MAX_BODY_BYTES) {\n\t\t\t\treject(new Error('Request body too large'));\n\t\t\t\treq.destroy();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tchunks.push(chunk);\n\t\t});\n\t\treq.on('end', () => resolve(Buffer.concat(chunks).toString('utf8')));\n\t\treq.on('error', reject);\n\t});\n}\n\nasync function parseJSON(req: IncomingMessage): Promise<Record<string, unknown>> {\n\tconst body = await readBody(req);\n\tif (!body.trim()) return {};\n\treturn JSON.parse(body) as Record<string, unknown>;\n}\n\n// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n// Route Handlers\n// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\nasync function handleRequest(\n\treq: IncomingMessage,\n\tres: ServerResponse,\n\tbrainRoot: string,\n): Promise<void> {\n\tconst url = new URL(req.url || '/', `http://${req.headers.host || 'localhost'}`);\n\tconst path = url.pathname;\n\tconst method = req.method || 'GET';\n\n\t// CORS preflight\n\tif (method === 'OPTIONS') {\n\t\tjson(res, null, 204);\n\t\treturn;\n\t}\n\n\t// Track activity on mutations\n\tconst isMutation = method === 'POST';\n\tif (isMutation) lastAPIActivity = Date.now();\n\n\ttry {\n\t\t// GET endpoints\n\t\tif (method === 'GET') {\n\t\t\tswitch (path) {\n\t\t\t\tcase '/api/health':\n\t\t\t\t\tjson(res, buildHealthJSON(brainRoot));\n\t\t\t\t\treturn;\n\t\t\t\tcase '/api/brain':\n\t\t\t\t\tjson(res, buildBrainJSON(brainRoot));\n\t\t\t\t\treturn;\n\t\t\t\tcase '/api/read': {\n\t\t\t\t\tconst region = url.searchParams.get('region');\n\t\t\t\t\tif (!region || !(REGIONS as readonly string[]).includes(region)) {\n\t\t\t\t\t\terror(res, `Invalid region. Valid: ${REGIONS.join(', ')}`);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tconst brain = scanBrain(brainRoot);\n\t\t\t\t\tconst result = runSubsumption(brain);\n\t\t\t\t\tconst regionData = result.activeRegions.find((r) => r.name === region);\n\t\t\t\t\tif (!regionData) {\n\t\t\t\t\t\terror(res, `Region \"${region}\" is blocked or empty`);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\t// Auto-fire top 3 for RAG retrieval\n\t\t\t\t\tconst top3 = [...regionData.neurons]\n\t\t\t\t\t\t.filter((n) => !n.isDormant)\n\t\t\t\t\t\t.sort((a, b) => b.counter - a.counter)\n\t\t\t\t\t\t.slice(0, 3);\n\t\t\t\t\tfor (const n of top3) {\n\t\t\t\t\t\tfireNeuron(brainRoot, `${region}/${n.path}`);\n\t\t\t\t\t}\n\t\t\t\t\tjson(res, {\n\t\t\t\t\t\tregion: region,\n\t\t\t\t\t\tneurons: regionData.neurons,\n\t\t\t\t\t\tfired: top3.map((n) => n.path),\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcase '/api/reports':\n\t\t\t\t\tjson(res, { reports: pendingReports });\n\t\t\t\t\treturn;\n\t\t\t\tdefault:\n\t\t\t\t\terror(res, 'Not found', 404);\n\t\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// POST endpoints\n\t\tif (method === 'POST') {\n\t\t\tconst body = await parseJSON(req);\n\n\t\t\tswitch (path) {\n\t\t\t\tcase '/api/grow': {\n\t\t\t\t\tconst neuronPath = body.path as string;\n\t\t\t\t\tif (!neuronPath) { error(res, 'Missing \"path\"'); return; }\n\t\t\t\t\tconst result = growNeuron(brainRoot, neuronPath);\n\t\t\t\t\tjson(res, result);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcase '/api/fire': {\n\t\t\t\t\tconst neuronPath = body.path as string;\n\t\t\t\t\tif (!neuronPath) { error(res, 'Missing \"path\"'); return; }\n\t\t\t\t\tconst counter = fireNeuron(brainRoot, neuronPath);\n\t\t\t\t\tjson(res, { path: neuronPath, counter });\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcase '/api/signal': {\n\t\t\t\t\tconst neuronPath = body.path as string;\n\t\t\t\t\tconst signalType = body.type as string;\n\t\t\t\t\tif (!neuronPath || !signalType) { error(res, 'Missing \"path\" or \"type\"'); return; }\n\t\t\t\t\tsignalNeuron(brainRoot, neuronPath, signalType as SignalType);\n\t\t\t\t\tjson(res, { path: neuronPath, type: signalType });\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcase '/api/rollback': {\n\t\t\t\t\tconst neuronPath = body.path as string;\n\t\t\t\t\tif (!neuronPath) { error(res, 'Missing \"path\"'); return; }\n\t\t\t\t\tconst counter = rollbackNeuron(brainRoot, neuronPath);\n\t\t\t\t\tjson(res, { path: neuronPath, counter });\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcase '/api/decay': {\n\t\t\t\t\tconst days = typeof body.days === 'number' ? body.days : 30;\n\t\t\t\t\tconst result = runDecay(brainRoot, days);\n\t\t\t\t\tjson(res, result);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcase '/api/dedup': {\n\t\t\t\t\tconst result = runDedup(brainRoot);\n\t\t\t\t\tjson(res, result);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcase '/api/inject': {\n\t\t\t\t\tconst brain = scanBrain(brainRoot);\n\t\t\t\t\tconst result = runSubsumption(brain);\n\t\t\t\t\twriteAllTiers(brainRoot, result, brain);\n\t\t\t\t\tjson(res, { injected: true });\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcase '/api/inbox': {\n\t\t\t\t\tconst result = processInbox(brainRoot);\n\t\t\t\t\tjson(res, result);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcase '/api/report': {\n\t\t\t\t\tconst message = body.message as string;\n\t\t\t\t\tconst priority = (body.priority as string) || 'normal';\n\t\t\t\t\tif (!message) { error(res, 'Missing \"message\"'); return; }\n\t\t\t\t\tconst entry: ReportEntry = {\n\t\t\t\t\t\tts: new Date().toISOString(),\n\t\t\t\t\t\tmessage,\n\t\t\t\t\t\tpriority: priority as ReportEntry['priority'],\n\t\t\t\t\t};\n\t\t\t\t\tpendingReports.push(entry);\n\t\t\t\t\tjson(res, entry);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\terror(res, 'Not found', 404);\n\t\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\terror(res, 'Method not allowed', 405);\n\t} catch (err) {\n\t\terror(res, (err as Error).message, 500);\n\t}\n}\n\n// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n// Server\n// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n/**\n * Start the hebbian REST API server.\n */\nexport function startAPI(brainRoot: string, port = 9090): ReturnType<typeof createServer> {\n\tconst server = createServer((req, res) => {\n\t\thandleRequest(req, res, brainRoot).catch((err) => {\n\t\t\terror(res, (err as Error).message, 500);\n\t\t});\n\t});\n\n\tserver.listen(port, () => {\n\t\tconsole.log(`🧠 hebbian API listening on http://localhost:${port}`);\n\t\tconsole.log(` Brain: ${brainRoot}`);\n\t\tconsole.log('');\n\t\tconsole.log(' Endpoints:');\n\t\tconsole.log(' GET /api/health Process health + brain stats');\n\t\tconsole.log(' GET /api/brain Full brain state JSON');\n\t\tconsole.log(' GET /api/read?region=X Read region (auto-fires top 3)');\n\t\tconsole.log(' GET /api/reports List pending reports');\n\t\tconsole.log(' POST /api/grow {\"path\":\"cortex/...\"}');\n\t\tconsole.log(' POST /api/fire {\"path\":\"cortex/...\"}');\n\t\tconsole.log(' POST /api/signal {\"path\":\"...\",\"type\":\"dopamine\"}');\n\t\tconsole.log(' POST /api/rollback {\"path\":\"cortex/...\"}');\n\t\tconsole.log(' POST /api/decay {\"days\":30}');\n\t\tconsole.log(' POST /api/dedup Batch merge similar neurons');\n\t\tconsole.log(' POST /api/inject Force re-emit all tiers');\n\t\tconsole.log(' POST /api/inbox Process corrections inbox');\n\t\tconsole.log(' POST /api/report {\"message\":\"...\",\"priority\":\"normal\"}');\n\t});\n\n\treturn server;\n}\n\n/**\n * Get the last API activity timestamp.\n */\nexport function getLastActivity(): number {\n\treturn lastAPIActivity;\n}\n\n/**\n * Get pending reports (for external access).\n */\nexport function getPendingReports(): ReportEntry[] {\n\treturn pendingReports;\n}\n\n/**\n * Clear pending reports.\n */\nexport function clearReports(): void {\n\tpendingReports.length = 0;\n}\n","// hebbian — Claude Code Hooks Integration\n//\n// Manages Claude Code hooks in .claude/settings.local.json.\n// Uses [hebbian] statusMessage marker for ownership tracking.\n//\n// SessionStart hook: refreshes CLAUDE.md with latest brain state\n// Stop hook: digests conversation transcript for corrections\n\nimport { readFileSync, writeFileSync, existsSync, mkdirSync, readdirSync } from 'node:fs';\nimport { execSync } from 'node:child_process';\nimport { join, resolve } from 'node:path';\nimport { HOOK_MARKER, REGIONS } from './constants';\nimport { initBrain } from './init';\n\nconst SETTINGS_DIR = '.claude';\nconst SETTINGS_FILE = 'settings.local.json';\n\nexport interface HookStatus {\n\tinstalled: boolean;\n\tpath: string;\n\tevents: string[];\n}\n\ninterface HookEntry {\n\ttype: string;\n\tcommand: string;\n\ttimeout?: number;\n\tstatusMessage?: string;\n}\n\ninterface HookGroup {\n\tmatcher?: string;\n\thooks: HookEntry[];\n}\n\n/**\n * Install hebbian hooks into .claude/settings.local.json.\n * Deep-merges with existing settings. Uses statusMessage marker for ownership.\n */\nexport function installHooks(brainRoot: string, projectRoot?: string, global?: boolean): void {\n\tconst root = projectRoot || process.cwd();\n\tconst resolvedBrain = resolve(brainRoot);\n\n\t// Global install requires absolute brain path\n\tif (global) {\n\t\tconst home = process.env.HOME || '~';\n\t\tif (!brainRoot.startsWith('/') && !brainRoot.startsWith(home)) {\n\t\t\tconsole.error('❌ --global requires an absolute --brain path (e.g. --brain ~/brain)');\n\t\t\tprocess.exit(1);\n\t\t}\n\t}\n\n\t// Auto-init brain if it doesn't exist\n\tif (!existsSync(resolvedBrain) || !hasBrainRegions(resolvedBrain)) {\n\t\tinitBrain(resolvedBrain);\n\t}\n\n\t// Global: ~/.claude/settings.json, Local: .claude/settings.local.json\n\tconst settingsDir = global ? resolve(process.env.HOME || '~', SETTINGS_DIR) : join(root, SETTINGS_DIR);\n\tconst settingsFile = global ? 'settings.json' : SETTINGS_FILE;\n\tconst settingsPath = join(settingsDir, settingsFile);\n\n\t// Determine if we need --brain flag\n\tconst defaultBrain = resolve(root, 'brain');\n\tconst brainFlag = resolvedBrain === defaultBrain ? '' : ` --brain ${resolvedBrain}`;\n\n\t// Resolve stable npx path via `which` (returns symlink like /opt/homebrew/bin/npx,\n\t// not versioned Cellar path — survives node upgrades)\n\tlet npxBin = 'npx';\n\ttry {\n\t\tnpxBin = execSync('which npx', { encoding: 'utf8' }).trim();\n\t} catch {\n\t\t// Fall back to bare npx — will work if PATH is set\n\t}\n\n\t// Read existing settings or start fresh\n\tlet settings: Record<string, unknown> = {};\n\tif (existsSync(settingsPath)) {\n\t\ttry {\n\t\t\tsettings = JSON.parse(readFileSync(settingsPath, 'utf8'));\n\t\t} catch {\n\t\t\tconsole.log(`\\u26A0\\uFE0F settings.local.json was malformed, overwriting`);\n\t\t}\n\t}\n\n\t// Ensure hooks object exists\n\tif (!settings.hooks || typeof settings.hooks !== 'object') {\n\t\tsettings.hooks = {};\n\t}\n\tconst hooks = settings.hooks as Record<string, HookGroup[]>;\n\n\t// Define hebbian hooks (session start/end chained for outcome tracking)\n\tconst hebbianHooks: Array<{ event: string; matcher?: string; entry: HookEntry }> = [\n\t\t{\n\t\t\tevent: 'SessionStart',\n\t\t\tmatcher: 'startup|resume',\n\t\t\tentry: {\n\t\t\t\ttype: 'command',\n\t\t\t\tcommand: `${npxBin} hebbian emit claude${brainFlag} && ${npxBin} hebbian session start${brainFlag}`,\n\t\t\t\ttimeout: 15,\n\t\t\t\tstatusMessage: `${HOOK_MARKER} refreshing brain`,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tevent: 'Stop',\n\t\t\tentry: {\n\t\t\t\ttype: 'command',\n\t\t\t\tcommand: `${npxBin} hebbian digest${brainFlag}; ${npxBin} hebbian session end${brainFlag}`,\n\t\t\t\ttimeout: 30,\n\t\t\t\tstatusMessage: `${HOOK_MARKER} digesting session`,\n\t\t\t},\n\t\t},\n\t];\n\n\t// Install each hook\n\tfor (const { event, matcher, entry } of hebbianHooks) {\n\t\tif (!hooks[event]) {\n\t\t\thooks[event] = [];\n\t\t}\n\n\t\t// Find existing hebbian group for this event\n\t\tconst existingIdx = hooks[event]!.findIndex((group) =>\n\t\t\tgroup.hooks.some((h) => h.statusMessage?.startsWith(HOOK_MARKER)),\n\t\t);\n\n\t\tconst group: HookGroup = {\n\t\t\t...(matcher ? { matcher } : {}),\n\t\t\thooks: [entry],\n\t\t};\n\n\t\tif (existingIdx >= 0) {\n\t\t\t// Update existing entry\n\t\t\thooks[event]![existingIdx] = group;\n\t\t} else {\n\t\t\t// Append new entry\n\t\t\thooks[event]!.push(group);\n\t\t}\n\t}\n\n\t// Write back\n\tif (!existsSync(settingsDir)) {\n\t\tmkdirSync(settingsDir, { recursive: true });\n\t}\n\twriteFileSync(settingsPath, JSON.stringify(settings, null, 2) + '\\n', 'utf8');\n\n\tconsole.log(`\\u2705 hebbian hooks installed at ${settingsPath}`);\n\tconsole.log(` SessionStart \\u2192 ${npxBin} hebbian emit claude${brainFlag}`);\n\tconsole.log(` Stop \\u2192 ${npxBin} hebbian digest${brainFlag}`);\n}\n\n/**\n * Remove hebbian hooks from .claude/settings.local.json.\n * Preserves non-hebbian hooks and other settings.\n */\nexport function uninstallHooks(projectRoot?: string, global?: boolean): void {\n\tconst root = projectRoot || process.cwd();\n\tconst settingsDir = global ? resolve(process.env.HOME || '~', SETTINGS_DIR) : join(root, SETTINGS_DIR);\n\tconst settingsFile = global ? 'settings.json' : SETTINGS_FILE;\n\tconst settingsPath = join(settingsDir, settingsFile);\n\n\tif (!existsSync(settingsPath)) {\n\t\tconsole.log('No hooks installed (settings.local.json not found)');\n\t\treturn;\n\t}\n\n\tlet settings: Record<string, unknown>;\n\ttry {\n\t\tsettings = JSON.parse(readFileSync(settingsPath, 'utf8'));\n\t} catch {\n\t\tconsole.log('settings.local.json is malformed, nothing to uninstall');\n\t\treturn;\n\t}\n\n\tif (!settings.hooks || typeof settings.hooks !== 'object') {\n\t\tconsole.log('No hooks found in settings.local.json');\n\t\treturn;\n\t}\n\n\tconst hooks = settings.hooks as Record<string, HookGroup[]>;\n\tlet removed = 0;\n\n\tfor (const event of Object.keys(hooks)) {\n\t\tconst before = hooks[event]!.length;\n\t\thooks[event] = hooks[event]!.filter(\n\t\t\t(group) => !group.hooks.some((h) => h.statusMessage?.startsWith(HOOK_MARKER)),\n\t\t);\n\t\tremoved += before - hooks[event]!.length;\n\n\t\t// Clean up empty event arrays\n\t\tif (hooks[event]!.length === 0) {\n\t\t\tdelete hooks[event];\n\t\t}\n\t}\n\n\t// Clean up empty hooks object\n\tif (Object.keys(hooks).length === 0) {\n\t\tdelete settings.hooks;\n\t}\n\n\twriteFileSync(settingsPath, JSON.stringify(settings, null, 2) + '\\n', 'utf8');\n\tconsole.log(`\\u2705 removed ${removed} hebbian hook(s) from ${settingsPath}`);\n}\n\n/**\n * Check if hebbian hooks are installed.\n */\nexport function checkHooks(projectRoot?: string, global?: boolean): HookStatus {\n\tconst root = projectRoot || process.cwd();\n\tconst settingsDir = global ? resolve(process.env.HOME || '~', SETTINGS_DIR) : join(root, SETTINGS_DIR);\n\tconst settingsFile = global ? 'settings.json' : SETTINGS_FILE;\n\tconst settingsPath = join(settingsDir, settingsFile);\n\n\tconst status: HookStatus = {\n\t\tinstalled: false,\n\t\tpath: settingsPath,\n\t\tevents: [],\n\t};\n\n\tif (!existsSync(settingsPath)) {\n\t\tconsole.log(`\\u274C hebbian hooks not installed (${settingsPath} not found)`);\n\t\treturn status;\n\t}\n\n\tlet settings: Record<string, unknown>;\n\ttry {\n\t\tsettings = JSON.parse(readFileSync(settingsPath, 'utf8'));\n\t} catch {\n\t\tconsole.log(`\\u274C settings.local.json is malformed`);\n\t\treturn status;\n\t}\n\n\tif (!settings.hooks || typeof settings.hooks !== 'object') {\n\t\tconsole.log(`\\u274C no hooks in ${settingsPath}`);\n\t\treturn status;\n\t}\n\n\tconst hooks = settings.hooks as Record<string, HookGroup[]>;\n\n\tfor (const event of Object.keys(hooks)) {\n\t\tconst hasHebbian = hooks[event]!.some((group) =>\n\t\t\tgroup.hooks.some((h) => h.statusMessage?.startsWith(HOOK_MARKER)),\n\t\t);\n\t\tif (hasHebbian) {\n\t\t\tstatus.events.push(event);\n\t\t}\n\t}\n\n\tstatus.installed = status.events.length > 0;\n\n\tif (status.installed) {\n\t\tconsole.log(`\\u2705 hebbian hooks installed at ${settingsPath}`);\n\t\tfor (const event of status.events) {\n\t\t\tconsole.log(` ${event} \\u2714`);\n\t\t}\n\t} else {\n\t\tconsole.log(`\\u274C hebbian hooks not found in ${settingsPath}`);\n\t}\n\n\treturn status;\n}\n\n/**\n * Check if a directory contains brain regions.\n */\nfunction hasBrainRegions(dir: string): boolean {\n\tif (!existsSync(dir)) return false;\n\ttry {\n\t\tconst entries = readdirSync(dir);\n\t\treturn (REGIONS as readonly string[]).some((r) => entries.includes(r));\n\t} catch {\n\t\treturn false;\n\t}\n}\n","// hebbian — Conversation Digest (Correction Extraction)\n//\n// Parses Claude Code conversation transcripts (JSONL) and extracts\n// user corrections via pattern matching. Writes corrections to inbox,\n// auto-processes them, and logs an audit trail.\n//\n// Correction detection is deliberately heuristic — WS3 candidate staging\n// is the quality safety net for false positives.\n\nimport { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';\nimport { join, basename } from 'node:path';\nimport { MAX_CORRECTIONS_PER_SESSION, MIN_CORRECTION_LENGTH, DIGEST_LOG_DIR } from './constants';\nimport { growCandidate } from './candidates';\nimport { logEpisode } from './episode';\n// tokenize() not used here — digest uses its own unstemmed split for readable names.\n// tokenize() with stemming is for Jaccard similarity in grow.ts.\n\nexport interface DigestResult {\n\tcorrections: number;\n\tskipped: number;\n\ttoolFailures: number;\n\ttranscriptPath: string;\n\tsessionId: string;\n}\n\nexport interface ExtractedCorrection {\n\ttext: string;\n\tpath: string;\n\tprefix: 'NO' | 'DO' | 'MUST' | 'WARN';\n\tkeywords: string[];\n}\n\ninterface TranscriptLine {\n\ttype?: string;\n\tmessage?: {\n\t\trole?: string;\n\t\tcontent?: string | Array<{ type: string; text?: string; tool_use_id?: string; is_error?: boolean }>;\n\t};\n\ttoolUseResult?: {\n\t\tstdout?: string;\n\t\tstderr?: string;\n\t\tstatus?: string;\n\t};\n\tsessionId?: string;\n\tuuid?: string;\n}\n\nexport interface ToolFailure {\n\ttoolName: string;\n\texitCode: number;\n\terrorText: string;\n}\n\n// Negation patterns — user is telling the AI NOT to do something\nconst NEGATION_PATTERNS = [\n\t/\\bdon[''\\u2019]?t\\b/i,\n\t/\\bdo not\\b/i,\n\t/\\bstop\\s+\\w+ing\\b/i,\n\t/\\bnever\\b/i,\n\t/\\binstead\\b/i,\n\t/^no[,.\\s!]/i,\n\t/\\bdon[''\\u2019]?t\\s+use\\b/i,\n\t/\\bavoid\\b/i,\n\t// Korean negation — specific verb forms only to avoid matching incidental 않/대신 in explanations\n\t/하지\\s*마/,\n\t/안\\s*돼/,\n\t/쓰지\\s*마/,\n\t/[가-힣]+지\\s*마/,\n\t/하지\\s*않/, // \"do not\" specifically\n\t/쓰지\\s*않/, // \"do not use\" specifically\n];\n\n// Affirmation patterns — user is telling the AI TO do something\nconst AFFIRMATION_PATTERNS = [\n\t/\\balways\\b/i,\n\t/\\bshould\\s+always\\b/i,\n\t/\\buse\\s+\\w+\\s+instead\\b/i,\n\t// Korean affirmation\n\t/항상/,\n];\n\n// Must patterns — strong imperative (\"you must X\", \"X is required\")\nconst MUST_PATTERNS = [\n\t/\\bmust\\b/i,\n\t/\\brequired\\b/i,\n\t// Korean\n\t/반드시/,\n];\n\n// Warn patterns — cautionary (\"be careful with X\", \"watch out for X\")\nconst WARN_PATTERNS = [\n\t/\\bcareful\\b/i,\n\t/\\bwatch\\s+out\\b/i,\n\t/\\bwarning\\b/i,\n\t// Korean\n\t/주의/,\n];\n\n/**\n * Parse hook input from stdin to extract transcript path and session ID.\n */\nexport function readHookInput(stdin: string): { transcriptPath: string; sessionId: string } | null {\n\tif (!stdin.trim()) return null;\n\ttry {\n\t\tconst input = JSON.parse(stdin);\n\t\tif (input.transcript_path) {\n\t\t\tconst sessionId = input.session_id || basename(input.transcript_path, '.jsonl');\n\t\t\treturn { transcriptPath: input.transcript_path, sessionId };\n\t\t}\n\t\treturn null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * Digest a conversation transcript and extract corrections.\n * Auto-processes inbox and writes audit log.\n */\nexport function digestTranscript(brainRoot: string, transcriptPath: string, sessionId?: string): DigestResult {\n\tif (!existsSync(transcriptPath)) {\n\t\tthrow new Error(`Transcript not found: ${transcriptPath}`);\n\t}\n\n\tconst resolvedSessionId = sessionId || basename(transcriptPath, '.jsonl');\n\n\t// Dedup check: skip if already digested\n\tconst logDir = join(brainRoot, DIGEST_LOG_DIR);\n\tconst logPath = join(logDir, `${resolvedSessionId}.jsonl`);\n\tif (existsSync(logPath)) {\n\t\tconsole.log(`\\u23ED already digested session ${resolvedSessionId}, skip`);\n\t\treturn { corrections: 0, skipped: 0, toolFailures: 0, transcriptPath, sessionId: resolvedSessionId };\n\t}\n\n\t// Parse transcript — user messages for corrections\n\tconst messages = parseTranscript(transcriptPath);\n\n\t// Parse tool results — detect failures (language-independent self-learning)\n\tconst toolFailures = parseToolResults(transcriptPath);\n\tfor (const failure of toolFailures) {\n\t\tlogEpisode(brainRoot, 'tool-failure', failure.toolName, failure.errorText);\n\t}\n\n\t// Detect retry patterns — same error 3+ times = persistent problem\n\tconst retries = detectRetryPatterns(toolFailures);\n\tfor (const retry of retries) {\n\t\tlogEpisode(brainRoot, 'retry-pattern', retry.toolName, retry.errorText);\n\t}\n\n\tconst totalSignals = toolFailures.length + retries.length;\n\tif (totalSignals > 0) {\n\t\tconsole.log(`🔧 digest: ${toolFailures.length} tool failure(s), ${retries.length} retry pattern(s) logged`);\n\t}\n\n\t// Extract corrections\n\tconst corrections = extractCorrections(messages);\n\n\tif (corrections.length === 0 && toolFailures.length === 0) {\n\t\tconsole.log(`\\uD83D\\uDCDD digest: no corrections found in session ${resolvedSessionId}`);\n\t\t// Write empty audit log to mark as digested\n\t\twriteAuditLog(brainRoot, resolvedSessionId, []);\n\t\treturn { corrections: 0, skipped: messages.length, toolFailures: toolFailures.length, transcriptPath, sessionId: resolvedSessionId };\n\t}\n\n\tif (corrections.length === 0) {\n\t\t// Tool failures logged but no user corrections — still mark as digested\n\t\twriteAuditLog(brainRoot, resolvedSessionId, []);\n\t\treturn { corrections: 0, skipped: messages.length, toolFailures: toolFailures.length, transcriptPath, sessionId: resolvedSessionId };\n\t}\n\n\t// Apply corrections via candidate staging — counter >= 3 auto-promotes\n\tlet applied = 0;\n\tconst auditEntries: Array<{ correction: ExtractedCorrection; applied: boolean }> = [];\n\n\tfor (const correction of corrections) {\n\t\ttry {\n\t\t\tgrowCandidate(brainRoot, correction.path);\n\t\t\tlogEpisode(brainRoot, 'digest', correction.path, correction.text);\n\t\t\tauditEntries.push({ correction, applied: true });\n\t\t\tapplied++;\n\t\t} catch (err) {\n\t\t\tconsole.log(` \\u26A0\\uFE0F failed to apply: ${correction.path} — ${(err as Error).message}`);\n\t\t\tauditEntries.push({ correction, applied: false });\n\t\t}\n\t}\n\n\t// Write audit log\n\twriteAuditLog(brainRoot, resolvedSessionId, auditEntries);\n\n\tconsole.log(`\\uD83D\\uDCDD digest: ${applied} correction(s) from session ${resolvedSessionId}`);\n\treturn {\n\t\tcorrections: applied,\n\t\tskipped: messages.length - corrections.length,\n\t\ttoolFailures: toolFailures.length,\n\t\ttranscriptPath,\n\t\tsessionId: resolvedSessionId,\n\t};\n}\n\n/**\n * Parse a Claude Code conversation JSONL transcript.\n * Returns user message texts only.\n */\nfunction parseTranscript(transcriptPath: string): string[] {\n\tconst content = readFileSync(transcriptPath, 'utf8');\n\tconst lines = content.split('\\n').filter(Boolean);\n\tconst messages: string[] = [];\n\n\tfor (const line of lines) {\n\t\tlet entry: TranscriptLine;\n\t\ttry {\n\t\t\tentry = JSON.parse(line);\n\t\t} catch {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Only process user messages\n\t\tif (entry.type !== 'user') continue;\n\t\tif (!entry.message || entry.message.role !== 'user') continue;\n\n\t\tconst text = extractText(entry.message.content);\n\t\tif (text) messages.push(text);\n\t}\n\n\treturn messages;\n}\n\n/**\n * Extract text from message content (handles string or content block array).\n */\nfunction extractText(content: string | Array<{ type: string; text?: string }> | undefined): string | null {\n\tif (!content) return null;\n\tif (typeof content === 'string') return content;\n\tif (Array.isArray(content)) {\n\t\tconst texts = content\n\t\t\t.filter((block) => block.type === 'text' && block.text)\n\t\t\t.map((block) => block.text!);\n\t\treturn texts.length > 0 ? texts.join('\\n') : null;\n\t}\n\treturn null;\n}\n\n// --- Tool Failure Detection (language-independent self-learning) ---\n\nconst MAX_FAILURES_PER_SESSION = 20;\n\n/**\n * Parse tool_result blocks from a Claude Code transcript.\n * Returns detected failures (exit code ≠ 0, is_error = true).\n */\nexport function parseToolResults(transcriptPath: string): ToolFailure[] {\n\tconst content = readFileSync(transcriptPath, 'utf8');\n\tconst lines = content.split('\\n').filter(Boolean);\n\tconst failures: ToolFailure[] = [];\n\n\tfor (const line of lines) {\n\t\tif (failures.length >= MAX_FAILURES_PER_SESSION) break;\n\n\t\tlet entry: TranscriptLine;\n\t\ttry {\n\t\t\tentry = JSON.parse(line);\n\t\t} catch {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (entry.type !== 'user') continue;\n\t\tif (!entry.message || !Array.isArray(entry.message.content)) continue;\n\n\t\tfor (const block of entry.message.content) {\n\t\t\tif (block.type !== 'tool_result') continue;\n\t\t\tif (!block.is_error) continue;\n\n\t\t\tconst failure = detectToolFailure(block, entry.toolUseResult);\n\t\t\tif (failure) failures.push(failure);\n\t\t}\n\t}\n\n\treturn failures;\n}\n\n/**\n * Detect retry patterns — same error appearing 3+ times in a session.\n * Returns deduplicated failures with retry count.\n */\nexport function detectRetryPatterns(failures: ToolFailure[]): ToolFailure[] {\n\tconst counts = new Map<string, { failure: ToolFailure; count: number }>();\n\n\tfor (const f of failures) {\n\t\t// Key by first meaningful line of error (strips \"Exit code N\")\n\t\tconst key = f.toolName.toLowerCase().trim();\n\t\tconst existing = counts.get(key);\n\t\tif (existing) {\n\t\t\texisting.count++;\n\t\t} else {\n\t\t\tcounts.set(key, { failure: f, count: 1 });\n\t\t}\n\t}\n\n\treturn [...counts.values()]\n\t\t.filter((entry) => entry.count >= 3)\n\t\t.map((entry) => ({\n\t\t\t...entry.failure,\n\t\t\ttoolName: `[retry x${entry.count}] ${entry.failure.toolName}`,\n\t\t}));\n}\n\n/**\n * Detect a tool failure from a tool_result block.\n * Returns failure info if exit code ≠ 0, null otherwise.\n */\nexport function detectToolFailure(\n\tblock: { content?: string | Array<{ type: string; text?: string }>; is_error?: boolean },\n\ttoolUseResult?: TranscriptLine['toolUseResult'],\n): ToolFailure | null {\n\tif (!block.is_error) return null;\n\n\t// Extract error text from block content\n\tlet errorText = '';\n\tif (typeof block.content === 'string') {\n\t\terrorText = block.content;\n\t} else if (Array.isArray(block.content)) {\n\t\terrorText = block.content\n\t\t\t.filter((b) => b.type === 'text' && b.text)\n\t\t\t.map((b) => b.text!)\n\t\t\t.join('\\n');\n\t}\n\n\t// Also check toolUseResult string format\n\tif (!errorText && typeof toolUseResult === 'string') {\n\t\terrorText = toolUseResult as string;\n\t}\n\n\tif (!errorText) return null;\n\n\t// Parse exit code from \"Exit code N\\n...\" format\n\tconst exitMatch = errorText.match(/^Exit code (\\d+)/);\n\tconst exitCode = exitMatch ? parseInt(exitMatch[1]!, 10) : 1;\n\n\t// Extract a short tool name from the error (first meaningful line)\n\tconst firstLine = errorText.split('\\n').find((l) => l.trim() && !l.startsWith('Exit code')) || 'unknown';\n\tconst toolName = firstLine.trim().slice(0, 80);\n\n\treturn { toolName, exitCode, errorText: errorText.slice(0, 500) };\n}\n\n/**\n * Extract corrections from user messages using pattern matching.\n * Returns up to MAX_CORRECTIONS_PER_SESSION corrections.\n */\nexport function extractCorrections(messages: string[]): ExtractedCorrection[] {\n\tconst corrections: ExtractedCorrection[] = [];\n\n\tfor (const text of messages) {\n\t\tif (corrections.length >= MAX_CORRECTIONS_PER_SESSION) break;\n\n\t\t// Skip short messages\n\t\tif (text.length < MIN_CORRECTION_LENGTH) continue;\n\n\t\t// Skip commands (start with / or !)\n\t\tif (/^[\\/!]/.test(text.trim())) continue;\n\n\t\t// Skip questions (end with ?)\n\t\tif (text.trim().endsWith('?')) continue;\n\n\t\t// Skip system-injected XML tags (Claude Code injects these into user turns)\n\t\t// e.g. <local-command-caveat>, <command-message>, <task-notification>\n\t\tif (/^<[a-zA-Z]/.test(text.trim())) continue;\n\n\t\t// Skip skill base directory injections\n\t\tif (/^Base directory for this skill:/i.test(text.trim())) continue;\n\n\t\t// Skip bullet-list formatted text (likely assistant output injected into user turn)\n\t\tif (/^[•·▸▶\\-\\*]\\s/.test(text.trim())) continue;\n\n\t\t// Check for correction patterns\n\t\tconst correction = detectCorrection(text);\n\t\tif (correction) {\n\t\t\tcorrections.push(correction);\n\t\t}\n\t}\n\n\treturn corrections;\n}\n\n/**\n * Detect if a message is a correction and extract structured data.\n * Priority: NO > MUST > WARN > DO\n */\nfunction detectCorrection(text: string): ExtractedCorrection | null {\n\tconst isNegation = NEGATION_PATTERNS.some((p) => p.test(text));\n\tconst isMust = MUST_PATTERNS.some((p) => p.test(text));\n\tconst isWarn = WARN_PATTERNS.some((p) => p.test(text));\n\tconst isAffirmation = AFFIRMATION_PATTERNS.some((p) => p.test(text));\n\n\tif (!isNegation && !isMust && !isWarn && !isAffirmation) return null;\n\n\tlet prefix: 'NO' | 'MUST' | 'WARN' | 'DO';\n\tif (isNegation) prefix = 'NO';\n\telse if (isMust) prefix = 'MUST';\n\telse if (isWarn) prefix = 'WARN';\n\telse prefix = 'DO';\n\n\tconst keywords = extractKeywords(text);\n\n\tif (keywords.length === 0) return null;\n\n\t// Build neuron path: cortex/{PREFIX}_{keyword1}_{keyword2}_{keyword3}\n\tconst pathSegment = `${prefix}_${keywords.slice(0, 3).join('_')}`;\n\tconst path = `cortex/${pathSegment}`;\n\n\treturn { text, path, prefix, keywords };\n}\n\n/**\n * Extract meaningful keywords from correction text.\n * Uses its own tokenization WITHOUT stemming for readable neuron names.\n * (tokenize() in similarity.ts stems words, which is good for Jaccard\n * matching but produces ugly names like \"consol\" instead of \"console\".)\n */\nfunction extractKeywords(text: string): string[] {\n\tconst STOP_WORDS = new Set([\n\t\t// English stop words\n\t\t'the', 'a', 'an', 'is', 'are', 'was', 'were', 'be', 'been', 'being',\n\t\t'have', 'has', 'had', 'do', 'does', 'did', 'will', 'would', 'could',\n\t\t'should', 'may', 'might', 'shall', 'can', 'need', 'dare', 'ought',\n\t\t'to', 'of', 'in', 'for', 'on', 'with', 'at', 'by', 'from', 'as',\n\t\t'into', 'through', 'during', 'before', 'after', 'above', 'below',\n\t\t'and', 'but', 'or', 'nor', 'not', 'so', 'yet', 'both', 'either',\n\t\t'neither', 'each', 'every', 'all', 'any', 'few', 'more', 'most',\n\t\t'other', 'some', 'such', 'no', 'only', 'own', 'same', 'than',\n\t\t'too', 'very', 'just', 'because', 'until', 'while', 'that', 'this',\n\t\t'these', 'those', 'it', 'its', 'me', 'my', 'we', 'us', 'you',\n\t\t'your', 'he', 'she', 'they', 'them', 'what', 'which', 'who', 'whom',\n\t\t// Correction-specific stop words\n\t\t'don', 'dont', 'stop', 'never', 'always', 'instead', 'use', 'avoid',\n\t\t'please', 'must', 'should', 'like', 'want', 'think', 'way', 'make',\n\t\t'sure', 'keep', 'try', 'let', 'get', 'put', 'set', 'new', 'also',\n\t\t'using', 'used', 'when', 'where', 'how', 'why', 'here', 'there',\n\t\t'careful', 'warning', 'watch', 'out', 'required',\n\t]);\n\n\treturn text\n\t\t.replace(/([a-z])([A-Z])/g, '$1 $2') // camelCase → words\n\t\t.replace(/[^a-zA-Z0-9\\u3000-\\u9FFF\\uAC00-\\uD7AF]+/g, ' ') // punctuation → space\n\t\t.toLowerCase()\n\t\t.split(/\\s+/)\n\t\t.filter((t) => t.length > 2 && !STOP_WORDS.has(t));\n}\n\n/**\n * Write audit log for digest session.\n */\nfunction writeAuditLog(\n\tbrainRoot: string,\n\tsessionId: string,\n\tentries: Array<{ correction: ExtractedCorrection; applied: boolean }>,\n): void {\n\tconst logDir = join(brainRoot, DIGEST_LOG_DIR);\n\tif (!existsSync(logDir)) {\n\t\tmkdirSync(logDir, { recursive: true });\n\t}\n\n\tconst logPath = join(logDir, `${sessionId}.jsonl`);\n\tconst lines = entries.map((e) =>\n\t\tJSON.stringify({\n\t\t\tts: new Date().toISOString(),\n\t\t\tpath: e.correction.path,\n\t\t\ttext: e.correction.text,\n\t\t\tprefix: e.correction.prefix,\n\t\t\tkeywords: e.correction.keywords,\n\t\t\tapplied: e.applied,\n\t\t}),\n\t);\n\n\t// Even if no entries, write empty file as dedup marker\n\twriteFileSync(logPath, lines.join('\\n') + (lines.length > 0 ? '\\n' : ''), 'utf8');\n}\n","// hebbian — Outcome Tracking (Phase 5: Feedback Loop)\n//\n// Captures session state at start, detects outcomes at end,\n// and writes contra signals on revert. Git + working tree detection.\n//\n// Data flow:\n// SessionStart hook → captureSessionStart() → session_state_{uuid}.json\n// Stop hook → detectOutcome() → log episode + write contra on revert\n// Evolve → buildOutcomeSummary() → per-neuron outcome aggregation\n//\n// Session state is keyed by UUID to handle concurrent/resumed sessions.\n// Outcome detection compares both committed (HEAD) and uncommitted (working tree) changes.\n\nimport { execSync } from 'node:child_process';\nimport { existsSync, mkdirSync, writeFileSync, readFileSync, readdirSync, rmSync, statSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { randomUUID } from 'node:crypto';\nimport { SESSION_STATE_DIR, PROTECTED_REGIONS_CONTRA } from './constants';\nimport { scanBrain } from './scanner';\nimport { runSubsumption } from './subsumption';\nimport { contraNeuron } from './fire';\nimport { logEpisode, readEpisodes } from './episode';\nimport type { OutcomeType } from './constants';\n\n// --- Types ---\n\nexport interface SessionState {\n\tts: string;\n\tsha: string;\n\tstatus: string[];\n\tneurons: string[];\n\tuuid: string;\n}\n\nexport interface OutcomeResult {\n\toutcome: OutcomeType;\n\tneuronsAffected: number;\n\tprotectedSkipped: number;\n\tdetail: string;\n}\n\n// --- Session Start ---\n\n/**\n * Capture session state: git HEAD SHA, working tree status, active neurons.\n * Writes session_state_{uuid}.json to hippocampus/session_state/.\n * Returns null if not in a git repo.\n */\nexport function captureSessionStart(brainRoot: string): SessionState | null {\n\t// Get git HEAD SHA\n\tlet sha: string;\n\ttry {\n\t\tsha = execSync('git rev-parse HEAD', { encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();\n\t} catch {\n\t\tconsole.log('⏭️ session start: not a git repo, skipping');\n\t\treturn null;\n\t}\n\n\t// Capture working tree status\n\tlet status: string[];\n\ttry {\n\t\tconst raw = execSync('git status --porcelain', { encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();\n\t\tstatus = raw ? raw.split('\\n') : [];\n\t} catch {\n\t\tstatus = [];\n\t}\n\n\t// Get subsumption-filtered neurons (matches what emit selects)\n\tconst brain = scanBrain(brainRoot);\n\tconst result = runSubsumption(brain);\n\tconst neurons: string[] = [];\n\tfor (const region of result.activeRegions) {\n\t\tfor (const neuron of region.neurons) {\n\t\t\tif (!neuron.isDormant && neuron.counter > 0) {\n\t\t\t\tneurons.push(`${region.name}/${neuron.path}`);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Write session state with UUID key\n\tconst uuid = randomUUID();\n\tconst stateDir = join(brainRoot, SESSION_STATE_DIR);\n\tif (!existsSync(stateDir)) {\n\t\tmkdirSync(stateDir, { recursive: true });\n\t}\n\n\tconst state: SessionState = { ts: new Date().toISOString(), sha, status, neurons, uuid };\n\twriteFileSync(join(stateDir, `state_${uuid}.json`), JSON.stringify(state), 'utf8');\n\n\tconsole.log(`📸 session start: SHA ${sha.slice(0, 7)}, ${neurons.length} active neurons`);\n\treturn state;\n}\n\n// --- Session End / Outcome Detection ---\n\n/**\n * Detect session outcome by comparing git state at start vs end.\n * Writes contra on revert, logs outcome episode.\n * Returns null if no session state or no changes detected.\n */\nexport function detectOutcome(brainRoot: string): OutcomeResult | null {\n\t// Find most recent session state file\n\tconst state = readLatestSessionState(brainRoot);\n\tif (!state) {\n\t\tconsole.log('⏭️ session end: no session state found, skipping');\n\t\treturn null;\n\t}\n\n\t// Get current git state\n\tlet currentSha: string;\n\ttry {\n\t\tcurrentSha = execSync('git rev-parse HEAD', { encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();\n\t} catch {\n\t\tconsole.log('⏭️ session end: not a git repo, skipping');\n\t\tcleanupSessionState(brainRoot, state.uuid);\n\t\treturn null;\n\t}\n\n\tlet currentStatus: string[];\n\ttry {\n\t\tconst raw = execSync('git status --porcelain', { encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();\n\t\tcurrentStatus = raw ? filterHebbianPaths(raw.split('\\n')) : [];\n\t} catch {\n\t\tcurrentStatus = [];\n\t}\n\n\t// Also filter start status for consistent comparison\n\tconst filteredStartStatus = filterHebbianPaths(state.status);\n\n\t// Detect outcome using 5-case logic (filtered status excludes hebbian bookkeeping)\n\tconst outcome = classifyOutcome(\n\t\t{ ...state, status: filteredStartStatus },\n\t\tcurrentSha,\n\t\tcurrentStatus,\n\t);\n\n\tif (!outcome) {\n\t\tconsole.log('📊 session end: no changes detected (no-op)');\n\t\tcleanupSessionState(brainRoot, state.uuid);\n\t\treturn null;\n\t}\n\n\t// Log outcome episode\n\tconst neurons = state.neurons;\n\tlogEpisode(brainRoot, 'session-end', '', `outcome:${outcome}`, { outcome, neurons });\n\n\tlet result: OutcomeResult;\n\n\tif (outcome === 'revert') {\n\t\t// Write contra on active neurons (skip protected regions)\n\t\tconst { affected, skipped } = applyContra(brainRoot, neurons);\n\t\tresult = {\n\t\t\toutcome: 'revert',\n\t\t\tneuronsAffected: affected,\n\t\t\tprotectedSkipped: skipped,\n\t\t\tdetail: `${affected} neurons contra'd (${skipped} protected skipped)`,\n\t\t};\n\t\tconsole.log(`📊 session end: revert — ${result.detail}`);\n\t} else {\n\t\tresult = {\n\t\t\toutcome: 'acceptance',\n\t\t\tneuronsAffected: 0,\n\t\t\tprotectedSkipped: 0,\n\t\t\tdetail: 'changes accepted',\n\t\t};\n\t\tconsole.log('📊 session end: acceptance');\n\t}\n\n\tcleanupSessionState(brainRoot, state.uuid);\n\treturn result;\n}\n\n// --- Outcome Classification ---\n\n/**\n * Classify outcome based on git state comparison.\n *\n * Case 1: status unchanged + HEAD unchanged → no-op (null)\n * Case 2: new files/mods in status vs start → acceptance\n * Case 3: status items removed/restored vs start → possible revert\n * Case 4: HEAD moved, non-empty committed diff → acceptance\n * Case 5: HEAD moved, net-zero diff OR \"revert\" in git log → revert\n */\nexport function classifyOutcome(\n\tstate: SessionState,\n\tcurrentSha: string,\n\tcurrentStatus: string[],\n): OutcomeType | null {\n\tconst headMoved = state.sha !== currentSha;\n\tconst startStatusSet = new Set(state.status);\n\tconst endStatusSet = new Set(currentStatus);\n\n\t// Check for working tree changes\n\tconst newItems = currentStatus.filter((s) => !startStatusSet.has(s));\n\tconst removedItems = state.status.filter((s) => !endStatusSet.has(s));\n\n\tif (!headMoved) {\n\t\t// HEAD unchanged — check working tree only\n\t\tif (newItems.length === 0 && removedItems.length === 0) {\n\t\t\treturn null; // Case 1: no-op\n\t\t}\n\t\tif (newItems.length > 0) {\n\t\t\treturn 'acceptance'; // Case 2: new uncommitted work\n\t\t}\n\t\tif (removedItems.length > 0) {\n\t\t\treturn 'revert'; // Case 3: uncommitted work was undone\n\t\t}\n\t\treturn null;\n\t}\n\n\t// HEAD moved — check working tree first, then committed changes\n\t// If there are new uncommitted items alongside commits, that's still acceptance\n\tif (newItems.length > 0) {\n\t\treturn 'acceptance'; // Case 2b: commits + new uncommitted work\n\t}\n\n\ttry {\n\t\tconst diffStat = execSync(\n\t\t\t`git diff ${state.sha}..${currentSha} --stat`,\n\t\t\t{ encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe'] },\n\t\t).trim();\n\n\t\tconst logOutput = execSync(\n\t\t\t`git log --oneline ${state.sha}..${currentSha}`,\n\t\t\t{ encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe'] },\n\t\t).trim();\n\n\t\t// Case 5: \"revert\" in commit messages\n\t\tif (/\\brevert\\b/i.test(logOutput)) {\n\t\t\treturn 'revert';\n\t\t}\n\n\t\t// Case 5: net-zero diff (commits exist but cancel out)\n\t\tif (!diffStat) {\n\t\t\treturn 'revert';\n\t\t}\n\n\t\t// Case 4: non-empty diff\n\t\treturn 'acceptance';\n\t} catch {\n\t\t// git commands failed (SHA might not exist after force push)\n\t\treturn null;\n\t}\n}\n\n// --- Contra Application ---\n\nfunction applyContra(brainRoot: string, neurons: string[]): { affected: number; skipped: number } {\n\tlet affected = 0;\n\tlet skipped = 0;\n\n\tfor (const neuronPath of neurons) {\n\t\tconst region = neuronPath.split('/')[0] || '';\n\t\tif (PROTECTED_REGIONS_CONTRA.includes(region)) {\n\t\t\tskipped++;\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst result = contraNeuron(brainRoot, neuronPath);\n\t\tif (result > 0) {\n\t\t\taffected++;\n\t\t}\n\t}\n\n\treturn { affected, skipped };\n}\n\n// --- Outcome Summary for Evolve ---\n\n/**\n * Build per-neuron outcome summary from episode history.\n * Returns markdown section for the evolve prompt, or empty string if no data.\n */\nexport function buildOutcomeSummary(brainRoot: string): string {\n\tconst episodes = readEpisodes(brainRoot);\n\tconst outcomeEpisodes = episodes.filter((e) => e.outcome && e.neurons);\n\n\tif (outcomeEpisodes.length === 0) return '';\n\n\t// Aggregate per-neuron\n\tconst stats = new Map<string, { sessions: number; reverts: number; acceptances: number }>();\n\n\tfor (const ep of outcomeEpisodes) {\n\t\tfor (const neuron of ep.neurons!) {\n\t\t\tconst existing = stats.get(neuron) || { sessions: 0, reverts: 0, acceptances: 0 };\n\t\t\texisting.sessions++;\n\t\t\tif (ep.outcome === 'revert') existing.reverts++;\n\t\t\tif (ep.outcome === 'acceptance') existing.acceptances++;\n\t\t\tstats.set(neuron, existing);\n\t\t}\n\t}\n\n\t// Format\n\tconst lines: string[] = ['## Outcome Signals (from session history)\\n'];\n\tlines.push('Neurons with high contra_ratio (>0.5) are consistently present in reverted sessions. Consider pruning or modifying them.\\n');\n\n\tconst sorted = [...stats.entries()].sort((a, b) => {\n\t\tconst ratioA = a[1].sessions > 0 ? a[1].reverts / a[1].sessions : 0;\n\t\tconst ratioB = b[1].sessions > 0 ? b[1].reverts / b[1].sessions : 0;\n\t\treturn ratioB - ratioA;\n\t});\n\n\tfor (const [neuron, s] of sorted) {\n\t\tconst ratio = s.sessions > 0 ? (s.reverts / s.sessions).toFixed(2) : '0.00';\n\t\tconst trend = parseFloat(ratio) > 0.5 ? 'act on this' : parseFloat(ratio) > 0.3 ? 'watch' : '';\n\t\t// Sanitize neuron path: strip newlines to prevent prompt section injection\n\t\tconst safePath = neuron.replace(/[\\n\\r#]/g, ' ').trim();\n\t\tlines.push(`- ${safePath}: sessions=${s.sessions} reverts=${s.reverts} acceptances=${s.acceptances} contra_ratio=${ratio} ${trend}`);\n\t}\n\n\tlines.push('');\n\treturn lines.join('\\n');\n}\n\n// --- Session State Helpers ---\n\nfunction readLatestSessionState(brainRoot: string): SessionState | null {\n\tconst stateDir = join(brainRoot, SESSION_STATE_DIR);\n\tif (!existsSync(stateDir)) return null;\n\n\tlet latest: { path: string; mtime: number } | null = null;\n\ttry {\n\t\tfor (const entry of readdirSync(stateDir)) {\n\t\t\tif (!entry.startsWith('state_') || !entry.endsWith('.json')) continue;\n\t\t\tconst fullPath = join(stateDir, entry);\n\t\t\tconst mtime = statSync(fullPath).mtimeMs;\n\t\t\tif (!latest || mtime > latest.mtime) {\n\t\t\t\tlatest = { path: fullPath, mtime };\n\t\t\t}\n\t\t}\n\t} catch {\n\t\treturn null;\n\t}\n\n\tif (!latest) return null;\n\n\ttry {\n\t\treturn JSON.parse(readFileSync(latest.path, 'utf8')) as SessionState;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * Filter out hebbian's own bookkeeping paths from git status lines.\n * Prevents session state files, digest logs, and episode logs from\n * being counted as \"changes\" in outcome detection.\n */\nfunction filterHebbianPaths(statusLines: string[]): string[] {\n\tconst hebbianPatterns = ['hippocampus/session_state', 'hippocampus/session_log', 'hippocampus/digest_log', '_inbox/'];\n\treturn statusLines.filter((line) =>\n\t\t!hebbianPatterns.some((p) => line.includes(p)),\n\t);\n}\n\nfunction cleanupSessionState(brainRoot: string, uuid: string): void {\n\tconst stateDir = join(brainRoot, SESSION_STATE_DIR);\n\tconst filePath = join(stateDir, `state_${uuid}.json`);\n\ttry {\n\t\tif (existsSync(filePath)) rmSync(filePath);\n\t} catch { /* best effort */ }\n}\n","// hebbian — Evolve Engine (LLM-powered brain evolution)\n//\n// Reads recent episodes + current brain state, sends to an LLM,\n// and applies proposed mutations (grow, fire, signal, prune, decay).\n//\n// Data flow:\n// readEpisodes() → scanBrain() → buildPrompt() → callGemini()\n// → parseActions() → validateActions() → executeActions()\n//\n// Currently supports Gemini only. Other providers (Groq, OpenAI,\n// Anthropic, Ollama) planned for future expansion.\n\nimport { existsSync, readFileSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { readEpisodes, logEpisode } from './episode';\nimport type { Episode } from './episode';\nimport { scanBrain } from './scanner';\nimport type { Brain } from './types';\nimport { REGIONS, REGION_PRIORITY } from './constants';\nimport { fireNeuron } from './fire';\nimport { growCandidate } from './candidates';\nimport { signalNeuron } from './signal';\nimport { rollbackNeuron } from './rollback';\nimport { runDecay } from './decay';\nimport { buildOutcomeSummary } from './outcome';\nimport type { SignalType } from './constants';\n\n// --- Types ---\n\nexport interface EvolveAction {\n\ttype: 'grow' | 'fire' | 'signal' | 'prune' | 'decay';\n\tpath: string;\n\treason: string;\n\tsignal?: string;\n}\n\nexport interface EvolveResult {\n\tactions: EvolveAction[];\n\texecuted: number;\n\tskipped: number;\n\tdryRun: boolean;\n}\n\nconst MAX_ACTIONS = 10;\nconst PROTECTED_REGIONS = ['brainstem', 'limbic', 'sensors'];\nconst DEFAULT_MODEL = 'gemini-2.0-flash-lite';\nconst API_TIMEOUT = 30_000;\nconst RETRY_DELAY = 5_000;\nconst EVOLVE_COOLDOWN_FILE = 'hippocampus/evolve_last_run';\n\n// --- Main Entry ---\n\nexport type EvolveMode = 'default' | 'prune';\n\nexport async function runEvolve(brainRoot: string, dryRun: boolean, mode: EvolveMode = 'default'): Promise<EvolveResult> {\n\tconst apiKey = process.env.GEMINI_API_KEY;\n\tif (!apiKey) {\n\t\tconsole.error('❌ GEMINI_API_KEY not set. Get one at https://aistudio.google.com/apikey');\n\t\treturn { actions: [], executed: 0, skipped: 0, dryRun };\n\t}\n\n\t// Cooldown check — prevents runaway API calls (default 60s, bypass with EVOLVE_NO_COOLDOWN=1)\n\tif (!dryRun && process.env.EVOLVE_NO_COOLDOWN !== '1') {\n\t\tconst cooldownMs = (parseInt(process.env.EVOLVE_COOLDOWN_SECONDS ?? '60', 10) || 60) * 1000;\n\t\tconst cooldownPath = join(brainRoot, EVOLVE_COOLDOWN_FILE);\n\t\tif (existsSync(cooldownPath)) {\n\t\t\tconst lastRun = parseInt(readFileSync(cooldownPath, 'utf8').trim(), 10);\n\t\t\tconst elapsed = Date.now() - lastRun;\n\t\t\tif (elapsed < cooldownMs) {\n\t\t\t\tconst remaining = Math.ceil((cooldownMs - elapsed) / 1000);\n\t\t\t\tconsole.log(`⏳ evolve cooldown: ${remaining}s remaining (use EVOLVE_NO_COOLDOWN=1 to bypass)`);\n\t\t\t\treturn { actions: [], executed: 0, skipped: 0, dryRun };\n\t\t\t}\n\t\t}\n\t}\n\n\t// 1. Gather context\n\tconst episodes = readEpisodes(brainRoot);\n\tconst brain = scanBrain(brainRoot);\n\tconst summary = buildBrainSummary(brain);\n\tconst outcomeSummary = buildOutcomeSummary(brainRoot);\n\tconst prompt = mode === 'prune'\n\t\t? buildPrunePrompt(summary, episodes)\n\t\t: buildPrompt(summary, episodes, outcomeSummary);\n\n\t// 2. Call LLM\n\tlet rawActions: EvolveAction[];\n\ttry {\n\t\trawActions = await callGemini(prompt, apiKey);\n\t} catch (err) {\n\t\tconst msg = (err as Error).message;\n\t\tconsole.log(`⏭️ evolve skipped: ${msg}`);\n\t\tlogEpisode(brainRoot, 'evolve-error', '', msg);\n\t\treturn { actions: [], executed: 0, skipped: 0, dryRun };\n\t}\n\n\t// 3. Validate\n\tconst actions = validateActions(rawActions, brain);\n\tconst skipped = rawActions.length - actions.length;\n\n\tif (actions.length === 0) {\n\t\tconsole.log('🧠 evolve: no valid actions proposed');\n\t\treturn { actions: [], executed: 0, skipped, dryRun };\n\t}\n\n\t// 4. Execute (or dry-run)\n\tif (dryRun) {\n\t\tconsole.log(`🧠 evolve (dry-run): ${actions.length} action(s) proposed`);\n\t\tfor (const action of actions) {\n\t\t\tconsole.log(` ${actionIcon(action.type)} ${action.type} ${action.path} — ${action.reason}`);\n\t\t}\n\t\treturn { actions, executed: 0, skipped, dryRun: true };\n\t}\n\n\tconst executed = executeActions(brainRoot, actions);\n\tlogEpisode(brainRoot, 'evolve', '', `${executed} action(s) executed, ${skipped} skipped`);\n\tconsole.log(`🧠 evolve: ${executed} action(s) executed, ${skipped} skipped`);\n\n\t// Record timestamp for cooldown\n\twriteFileSync(join(brainRoot, EVOLVE_COOLDOWN_FILE), String(Date.now()), 'utf8');\n\n\treturn { actions, executed, skipped, dryRun: false };\n}\n\n// --- Brain Summary ---\n\nexport function buildBrainSummary(brain: Brain): string {\n\tconst lines: string[] = ['# Brain State\\n'];\n\n\tfor (const region of brain.regions) {\n\t\tconst neurons = region.neurons;\n\t\tif (neurons.length === 0 && !region.hasBomb) continue;\n\n\t\tlines.push(`## ${region.name} (P${REGION_PRIORITY[region.name as keyof typeof REGION_PRIORITY]})`);\n\t\tif (region.hasBomb) lines.push('⚠️ BOMB active — region blocked');\n\n\t\tfor (const neuron of neurons) {\n\t\t\tconst flags: string[] = [];\n\t\t\tif (neuron.isDormant) flags.push('dormant');\n\t\t\tif (neuron.hasBomb) flags.push('bomb');\n\t\t\tif (neuron.hasMemory) flags.push('memory');\n\t\t\tif (neuron.dopamine > 0) flags.push(`dopamine:${neuron.dopamine}`);\n\t\t\tconst flagStr = flags.length > 0 ? ` [${flags.join(', ')}]` : '';\n\t\t\tlines.push(`- ${neuron.path} (counter:${neuron.counter}, intensity:${neuron.intensity})${flagStr}`);\n\t\t}\n\t\tlines.push('');\n\t}\n\n\treturn lines.join('\\n');\n}\n\n// --- Prompt Sanitization ---\n\n/**\n * Strip content that could inject markdown sections or override LLM instructions.\n * Takes only the first line and removes leading header markers.\n */\nfunction sanitizeForPrompt(text: string): string {\n\tconst firstLine = (text.split('\\n')[0] ?? '').trim();\n\treturn firstLine.replace(/^#+\\s*/g, '').slice(0, 200);\n}\n\n// --- Prompt Construction ---\n\nexport function buildPrompt(summary: string, episodes: Episode[], outcomeSummary?: string): string {\n\tconst episodeLines = episodes.length > 0\n\t\t? episodes.map((e) => `- [${e.ts}] ${e.type}: ${e.path} — ${sanitizeForPrompt(e.detail)}`).join('\\n')\n\t\t: '(no recent episodes)';\n\n\tconst outcomeSection = outcomeSummary || '';\n\n\treturn `You are the evolve engine for a hebbian brain — a filesystem-based memory system for AI agents.\n\n## Axioms\n- Folder = Neuron, File = Firing Trace, Counter = Activation strength\n- 7 regions in subsumption cascade: brainstem(P0) > limbic(P1) > hippocampus(P2) > sensors(P3) > cortex(P4) > ego(P5) > prefrontal(P6)\n- Lower priority ALWAYS overrides higher priority\n- PROTECTED regions (brainstem, limbic, sensors): NEVER propose mutations for these\n\n## Current Brain\n${summary}\n\n${outcomeSection}\n## Recent Episodes (last ${episodes.length})\n${episodeLines}\n\n## Available Actions\n- grow: Create a new neuron at the given path (region/name). Use for recurring patterns that deserve permanent memory.\n- fire: Increment an existing neuron's counter. Use for strengthening well-confirmed rules.\n- signal: Add dopamine (reward), bomb (block), or memory signal. Use sparingly.\n- prune: Decrement a neuron's counter. Use for rules that aren't working or cause issues.\n- decay: Mark inactive neurons as dormant. Use for stale rules with no recent activity.\n\n## Constraints\n- Max ${MAX_ACTIONS} actions per cycle\n- PREFER fire over grow — strengthen existing neurons before creating new ones\n- NEVER target brainstem, limbic, or sensors regions\n- Each action needs a \"reason\" explaining why\n\n## Task\nAnalyze the brain state and recent episodes. Propose actions to improve the brain.\nFocus on: strengthening repeatedly-used rules, pruning ineffective ones, growing new neurons from repeated patterns.\n\nRespond with a JSON array of actions:\n[{\"type\":\"fire\",\"path\":\"cortex/NO_console_log\",\"reason\":\"fired 3 times in recent sessions\"}]`;\n}\n\n// --- Pruning Prompt (청소부 mode) ---\n\nfunction buildPrunePrompt(summary: string, episodes: Episode[]): string {\n\tconst episodeLines = episodes.length > 0\n\t\t? episodes.map((e) => `- [${e.ts}] ${e.type}: ${sanitizeForPrompt(e.detail)}`).join('\\n')\n\t\t: '(no recent episodes)';\n\n\treturn `You are the PRUNING engine for a hebbian brain — a filesystem-based memory system for AI agents.\n\nYour job is CLEANUP. Remove what's stale, redundant, or harmful. Healthy forgetting.\n\n## Axioms\n- Folder = Neuron, File = Firing Trace, Counter = Activation strength\n- 7 regions: brainstem(P0) > limbic(P1) > hippocampus(P2) > sensors(P3) > cortex(P4) > ego(P5) > prefrontal(P6)\n- PROTECTED regions (brainstem, limbic, sensors): NEVER touch these\n\n## Current Brain\n${summary}\n\n## Recent Episodes (last ${episodes.length})\n${episodeLines}\n\n## Pruning Criteria\n1. **Stale neurons** — counter is low AND no recent episodes mention them. They occupy space but provide no value.\n2. **High contra ratio** — neurons present in many reverted sessions (contra_ratio > 0.7). They correlate with bad outcomes.\n3. **Redundant neurons** — two neurons in the same region with very similar names/meaning. Keep the stronger one, prune the weaker.\n4. **Contradicted neurons** — a newer neuron explicitly overrides an older one. Remove the older.\n\n## Available Actions (pruning-focused)\n- prune: Decrement a neuron's counter. Use for rules that aren't working.\n- decay: Mark inactive neurons as dormant. Use for stale rules with no recent activity.\n- signal: Add bomb signal to block a problematic neuron. Use for neurons that actively cause harm.\n\nDo NOT use grow or fire — this is a pruning pass, not a growth pass.\n\n## Constraints\n- Max ${MAX_ACTIONS} actions per cycle\n- NEVER target brainstem, limbic, or sensors regions\n- Be conservative — only prune what you're confident about\n\nRespond with a JSON array of actions:\n[{\"type\":\"prune\",\"path\":\"cortex/WARN_old_rule\",\"reason\":\"not fired in 30+ days, no recent episodes\"}]`;\n}\n\n// --- Gemini API ---\n\nexport async function callGemini(prompt: string, apiKey: string): Promise<EvolveAction[]> {\n\tconst model = process.env.EVOLVE_MODEL || DEFAULT_MODEL;\n\tconst url = `https://generativelanguage.googleapis.com/v1beta/models/${model}:generateContent`;\n\n\tconst body = {\n\t\tcontents: [{ parts: [{ text: prompt }] }],\n\t\tgenerationConfig: {\n\t\t\tresponseMimeType: 'application/json',\n\t\t\ttemperature: 0.2,\n\t\t},\n\t};\n\n\tlet lastError: Error | null = null;\n\n\t// Retry once on failure\n\tfor (let attempt = 0; attempt < 2; attempt++) {\n\t\tif (attempt > 0) {\n\t\t\tawait new Promise((r) => setTimeout(r, RETRY_DELAY));\n\t\t}\n\n\t\ttry {\n\t\t\tconst res = await fetch(url, {\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: { 'Content-Type': 'application/json', 'x-goog-api-key': apiKey },\n\t\t\t\tbody: JSON.stringify(body),\n\t\t\t\tsignal: AbortSignal.timeout(API_TIMEOUT),\n\t\t\t});\n\n\t\t\tif (!res.ok) {\n\t\t\t\tlastError = new Error(`Gemini API ${res.status}: ${res.statusText}`);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst data = await res.json() as {\n\t\t\t\tcandidates?: Array<{ content?: { parts?: Array<{ text?: string }> } }>;\n\t\t\t\terror?: { message?: string };\n\t\t\t};\n\n\t\t\tif (data.error) {\n\t\t\t\tlastError = new Error(`Gemini error: ${data.error.message || 'unknown'}`);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst text = data.candidates?.[0]?.content?.parts?.[0]?.text;\n\t\t\tif (!text) {\n\t\t\t\tlastError = new Error('Gemini returned empty response');\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\treturn parseActions(text);\n\t\t} catch (err) {\n\t\t\tlastError = err as Error;\n\t\t\tcontinue;\n\t\t}\n\t}\n\n\tthrow lastError || new Error('Gemini call failed');\n}\n\n// --- Action Parsing ---\n\nexport function parseActions(text: string): EvolveAction[] {\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(text);\n\t} catch {\n\t\tthrow new Error(`Failed to parse LLM response as JSON: ${text.slice(0, 100)}`);\n\t}\n\n\tif (!Array.isArray(parsed)) {\n\t\tthrow new Error('LLM response is not an array');\n\t}\n\n\tconst validTypes = new Set(['grow', 'fire', 'signal', 'prune', 'decay']);\n\tconst actions: EvolveAction[] = [];\n\n\tfor (const item of parsed) {\n\t\tif (!item || typeof item !== 'object') continue;\n\t\tconst { type, path, reason, signal } = item as Record<string, unknown>;\n\t\tif (typeof type !== 'string' || !validTypes.has(type)) continue;\n\t\tif (typeof path !== 'string' || path.length === 0) continue;\n\t\tif (typeof reason !== 'string') continue;\n\n\t\tconst action: EvolveAction = { type: type as EvolveAction['type'], path, reason };\n\t\tif (type === 'signal' && typeof signal === 'string') {\n\t\t\taction.signal = signal;\n\t\t}\n\t\tactions.push(action);\n\t}\n\n\treturn actions;\n}\n\n// --- Action Validation ---\n\nexport function validateActions(actions: EvolveAction[], _brain: Brain): EvolveAction[] {\n\treturn actions\n\t\t.filter((action) => {\n\t\t\t// Block path traversal attempts\n\t\t\tif (action.path.includes('..') || action.path.startsWith('/')) {\n\t\t\t\tconsole.log(` ⚠️ blocked: ${action.type} ${action.path} (path traversal)`);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tconst region = action.path.split('/')[0];\n\t\t\tif (!region || PROTECTED_REGIONS.includes(region)) {\n\t\t\t\tconsole.log(` 🛡️ blocked: ${action.type} ${action.path} (protected region)`);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (!(REGIONS as readonly string[]).includes(region)) {\n\t\t\t\tconsole.log(` ⚠️ skipped: ${action.type} ${action.path} (invalid region)`);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (action.type === 'signal' && action.signal && !['dopamine', 'bomb', 'memory'].includes(action.signal)) {\n\t\t\t\tconsole.log(` ⚠️ skipped: signal ${action.path} (invalid signal type: ${action.signal})`);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn true;\n\t\t})\n\t\t.slice(0, MAX_ACTIONS);\n}\n\n// --- Action Execution ---\n\nexport function executeActions(brainRoot: string, actions: EvolveAction[]): number {\n\tlet executed = 0;\n\n\tfor (const action of actions) {\n\t\ttry {\n\t\t\tswitch (action.type) {\n\t\t\t\tcase 'fire':\n\t\t\t\t\tfireNeuron(brainRoot, action.path);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'grow':\n\t\t\t\t\tgrowCandidate(brainRoot, action.path);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'signal':\n\t\t\t\t\tsignalNeuron(brainRoot, action.path, (action.signal || 'dopamine') as SignalType);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'prune':\n\t\t\t\t\trollbackNeuron(brainRoot, action.path);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'decay':\n\t\t\t\t\trunDecay(brainRoot, 0); // immediate decay for specified path\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tconsole.log(` ${actionIcon(action.type)} ${action.type} ${action.path}`);\n\t\t\texecuted++;\n\t\t} catch (err) {\n\t\t\tconsole.log(` ⚠️ failed: ${action.type} ${action.path} — ${(err as Error).message}`);\n\t\t}\n\t}\n\n\treturn executed;\n}\n\nfunction actionIcon(type: string): string {\n\tswitch (type) {\n\t\tcase 'fire': return '🔥';\n\t\tcase 'grow': return '🌱';\n\t\tcase 'signal': return '⚡';\n\t\tcase 'prune': return '✂️';\n\t\tcase 'decay': return '💤';\n\t\tdefault: return '❓';\n\t}\n}\n","// hebbian — Self-Diagnostic Command\n//\n// \"Why isn't it working?\" — checks hooks, brain integrity, versions, npx path.\n// Each check emits a ✅/⚠️/❌ line with an actionable fix if broken.\n\nimport { existsSync, readFileSync, readdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { execSync } from 'node:child_process';\nimport { REGIONS } from './constants';\n\nexport interface DoctorResult {\n\tpassed: number;\n\twarnings: number;\n\tfailed: number;\n}\n\nexport async function runDoctor(brainRoot: string): Promise<DoctorResult> {\n\tlet passed = 0, warnings = 0, failed = 0;\n\n\tconst ok = (msg: string) => { console.log(` ✅ ${msg}`); passed++; };\n\tconst warn = (msg: string, fix?: string) => {\n\t\tconsole.log(` ⚠️ ${msg}`);\n\t\tif (fix) console.log(` → ${fix}`);\n\t\twarnings++;\n\t};\n\tconst fail = (msg: string, fix?: string) => {\n\t\tconsole.log(` ❌ ${msg}`);\n\t\tif (fix) console.log(` → ${fix}`);\n\t\tfailed++;\n\t};\n\n\tconsole.log('\\n🩺 hebbian doctor\\n');\n\n\t// ── Node.js version ──────────────────────────────────────────────\n\tconsole.log('Node.js');\n\tconst nodeVer = process.versions.node;\n\tconst [major] = nodeVer.split('.').map(Number);\n\tif ((major ?? 0) >= 22) {\n\t\tok(`Node.js ${nodeVer} (>= 22 required)`);\n\t} else {\n\t\tfail(`Node.js ${nodeVer} — need >= 22`, 'nvm install 22 && nvm use 22');\n\t}\n\n\t// ── npm / package version ──────────────────────────────────────────\n\tconsole.log('\\nnpm package');\n\ttry {\n\t\tconst pkgPath = new URL('../package.json', import.meta.url).pathname;\n\t\tconst pkg = JSON.parse(readFileSync(pkgPath, 'utf8')) as { version?: string };\n\t\tconst local = pkg.version || 'unknown';\n\n\t\tlet remote = '';\n\t\ttry {\n\t\t\tconst out = execSync('npm view hebbian version 2>/dev/null', { timeout: 5000 }).toString().trim();\n\t\t\tremote = out;\n\t\t} catch { /* network unavailable */ }\n\n\t\tif (remote && remote !== local) {\n\t\t\twarn(`hebbian ${local} installed, ${remote} available`, 'npm i -g hebbian@latest');\n\t\t} else {\n\t\t\tok(`hebbian ${local}${remote ? ' (up to date)' : ''}`);\n\t\t}\n\t} catch {\n\t\twarn('Could not read package.json');\n\t}\n\n\t// ── Brain structure ────────────────────────────────────────────────\n\tconsole.log('\\nbrain structure');\n\tif (!existsSync(brainRoot)) {\n\t\tfail(`Brain not found at ${brainRoot}`, 'hebbian init ./brain');\n\t} else {\n\t\tok(`Brain root: ${brainRoot}`);\n\t\tfor (const region of REGIONS) {\n\t\t\tconst regionDir = join(brainRoot, region);\n\t\t\tif (existsSync(regionDir)) {\n\t\t\t\tok(`Region: ${region}`);\n\t\t\t} else {\n\t\t\t\twarn(`Missing region: ${region}`, `mkdir -p ${regionDir}`);\n\t\t\t}\n\t\t}\n\t}\n\n\t// ── Claude Code hooks ──────────────────────────────────────────────\n\tconsole.log('\\nClaude Code hooks');\n\tconst settingsPath = join(process.cwd(), '.claude', 'settings.local.json');\n\tif (!existsSync(settingsPath)) {\n\t\twarn('No .claude/settings.local.json found', 'hebbian claude install');\n\t} else {\n\t\ttry {\n\t\t\tconst settings = JSON.parse(readFileSync(settingsPath, 'utf8')) as {\n\t\t\t\thooks?: Record<string, unknown[]>;\n\t\t\t};\n\t\t\tconst hooks = settings.hooks || {};\n\t\t\tconst hasStop = Object.entries(hooks).some(([event, entries]) =>\n\t\t\t\tevent === 'Stop' && Array.isArray(entries) && entries.some((e: unknown) =>\n\t\t\t\t\ttypeof e === 'object' && e !== null && 'command' in e &&\n\t\t\t\t\ttypeof (e as { command?: unknown }).command === 'string' &&\n\t\t\t\t\t(e as { command: string }).command.includes('hebbian digest'),\n\t\t\t\t),\n\t\t\t);\n\t\t\tconst hasStart = Object.entries(hooks).some(([event, entries]) =>\n\t\t\t\tevent === 'SessionStart' && Array.isArray(entries) && entries.some((e: unknown) =>\n\t\t\t\t\ttypeof e === 'object' && e !== null && 'command' in e &&\n\t\t\t\t\ttypeof (e as { command?: unknown }).command === 'string' &&\n\t\t\t\t\t(e as { command: string }).command.includes('hebbian emit'),\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tif (hasStop && hasStart) {\n\t\t\t\tok('SessionStart + Stop hooks installed');\n\t\t\t} else {\n\t\t\t\tif (!hasStart) warn('SessionStart hook missing', 'hebbian claude install');\n\t\t\t\tif (!hasStop) warn('Stop hook missing', 'hebbian claude install');\n\t\t\t}\n\t\t} catch {\n\t\t\tfail('Malformed .claude/settings.local.json', 'hebbian claude install');\n\t\t}\n\t}\n\n\t// ── npx path resolution ────────────────────────────────────────────\n\tconsole.log('\\nnpx resolution');\n\ttry {\n\t\tconst resolved = execSync('which npx', { timeout: 3000 }).toString().trim();\n\t\tok(`npx: ${resolved}`);\n\t} catch {\n\t\tfail('npx not found in PATH', 'Install Node.js from https://nodejs.org');\n\t}\n\n\t// ── Brain candidates ───────────────────────────────────────────────\n\tconsole.log('\\ncandidates');\n\ttry {\n\t\tlet total = 0;\n\t\tfor (const region of REGIONS) {\n\t\t\tconst candidateDir = join(brainRoot, region, '_candidates');\n\t\t\tif (existsSync(candidateDir)) {\n\t\t\t\tconst entries = readdirSync(candidateDir, { withFileTypes: true });\n\t\t\t\tconst count = entries.filter(e => e.isDirectory()).length;\n\t\t\t\ttotal += count;\n\t\t\t}\n\t\t}\n\t\tif (total === 0) {\n\t\t\tok('No pending candidates');\n\t\t} else {\n\t\t\twarn(`${total} candidate(s) pending`, 'hebbian candidates — to view');\n\t\t}\n\t} catch {\n\t\twarn('Could not scan candidates');\n\t}\n\n\t// ── Summary ────────────────────────────────────────────────────────\n\tconsole.log(`\\n${'─'.repeat(40)}`);\n\tconsole.log(` passed: ${passed} warnings: ${warnings} failed: ${failed}`);\n\tif (failed > 0) {\n\t\tconsole.log(' Fix the ❌ issues above, then re-run `hebbian doctor`');\n\t} else if (warnings > 0) {\n\t\tconsole.log(' Looking mostly good! Review ⚠️ warnings above.');\n\t} else {\n\t\tconsole.log(' All checks passed. 🎉');\n\t}\n\tconsole.log('');\n\n\treturn { passed, warnings, failed };\n}\n","// hebbian — Folder-as-Neuron Brain for Any AI Agent\n//\n// \"Neurons that fire together, wire together.\" — Donald Hebb (1949)\n//\n// USAGE:\n// hebbian init <path> Create brain with 7 regions\n// hebbian emit <target> [--brain <path>] Compile rules (claude/cursor/gemini/copilot/generic/all)\n// hebbian fire <neuron-path> Increment neuron counter\n// hebbian grow <neuron-path> Create neuron (with merge detection)\n// hebbian rollback <neuron-path> Decrement counter (min=1)\n// hebbian signal <type> <neuron-path> Add dopamine/bomb/memory signal\n// hebbian decay [--days N] Mark inactive neurons dormant (default 30 days)\n// hebbian watch [--brain <path>] Watch for changes + auto-recompile\n// hebbian claude install|uninstall|status Manage Claude Code hooks\n// hebbian digest [--transcript <path>] Extract corrections from conversation\n// hebbian diag Print brain diagnostics\n// hebbian stats Print brain statistics\n\nimport { parseArgs } from 'node:util';\nimport { resolve } from 'node:path';\nimport type { SignalType } from './constants';\nimport { resolveBrainRoot } from './constants';\n\nconst VERSION = '0.7.0';\n\nconst HELP = `\nhebbian v${VERSION} — Folder-as-neuron brain for any AI agent.\n\n \"Neurons that fire together, wire together.\" — Donald Hebb (1949)\n\nUSAGE:\n hebbian <command> [options]\n\nCOMMANDS:\n init <path> Create brain with 7 regions\n emit <target> [--brain <path>] Compile rules (claude/cursor/gemini/copilot/generic/all)\n fire <neuron-path> Increment neuron counter (+1)\n grow <neuron-path> Create neuron (with merge detection)\n rollback <neuron-path> Decrement neuron counter (min=1)\n signal <type> <neuron-path> Add signal (dopamine/bomb/memory)\n decay [--days N] Mark inactive neurons dormant (default 30)\n dedup Batch merge similar neurons (Jaccard >= 0.6)\n snapshot Git commit current brain state\n watch Watch for changes + auto-recompile\n api [--port N] Start REST API server (default 9090)\n inbox Process corrections inbox\n claude install|uninstall|status Manage Claude Code hooks\n digest [--transcript <path>] Extract corrections from conversation\n candidates [promote] List candidates or promote graduated ones\n evolve [--dry-run] LLM-powered brain evolution (Gemini)\n evolve prune [--dry-run] Pruning mode — remove stale/redundant neurons\n session start|end Capture/detect session outcomes\n sessions Show session outcome history\n doctor Self-diagnostic (hooks, brain, versions)\n diag Print brain diagnostics\n stats Print brain statistics\n\nOPTIONS:\n --brain <path> Brain directory (default: $HEBBIAN_BRAIN or ./brain)\n --help, -h Show this help\n --version, -v Show version\n\nEXAMPLES:\n hebbian init ./my-brain\n hebbian grow cortex/frontend/NO_console_log --brain ./my-brain\n hebbian fire cortex/frontend/NO_console_log --brain ./my-brain\n hebbian emit claude --brain ./my-brain\n hebbian emit all\n GEMINI_API_KEY=... hebbian evolve --dry-run\n`.trim();\n\n/** Read all data from stdin (non-blocking, returns empty string if no data). */\nfunction readStdin(): Promise<string> {\n\treturn new Promise((resolve) => {\n\t\tif (process.stdin.isTTY) {\n\t\t\tresolve('');\n\t\t\treturn;\n\t\t}\n\t\tconst chunks: Buffer[] = [];\n\t\tprocess.stdin.on('data', (chunk: Buffer) => chunks.push(chunk));\n\t\tprocess.stdin.on('end', () => resolve(Buffer.concat(chunks).toString('utf8')));\n\t\tprocess.stdin.on('error', () => resolve(''));\n\t\t// Timeout after 1s to avoid hanging\n\t\tsetTimeout(() => {\n\t\t\tprocess.stdin.destroy();\n\t\t\tresolve(Buffer.concat(chunks).toString('utf8'));\n\t\t}, 1000);\n\t});\n}\n\nasync function main(argv: string[]): Promise<void> {\n\tconst { values, positionals } = parseArgs({\n\t\targs: argv,\n\t\toptions: {\n\t\t\tbrain: { type: 'string', short: 'b' },\n\t\t\tdays: { type: 'string', short: 'd' },\n\t\t\tport: { type: 'string', short: 'p' },\n\t\t\ttranscript: { type: 'string', short: 't' },\n\t\t\t'dry-run': { type: 'boolean' },\n\t\t\tglobal: { type: 'boolean', short: 'g' },\n\t\t\tagent: { type: 'string', short: 'a' },\n\t\t\thelp: { type: 'boolean', short: 'h' },\n\t\t\tversion: { type: 'boolean', short: 'v' },\n\t\t},\n\t\tallowPositionals: true,\n\t\tstrict: false,\n\t});\n\n\tif (values.version) {\n\t\tconsole.log(`hebbian v${VERSION}`);\n\t\treturn;\n\t}\n\n\tconst command = positionals[0];\n\n\tif (values.help || !command) {\n\t\tconsole.log(HELP);\n\t\treturn;\n\t}\n\n\tlet brainRoot = resolveBrainRoot(values.brain as string | undefined);\n\n\t// Multi-brain: --agent routes to brain/agents/{name}/\n\tconst agentName = values.agent as string | undefined;\n\tif (agentName) {\n\t\tconst { resolveAgentBrain } = await import('./constants');\n\t\tbrainRoot = resolveAgentBrain(brainRoot, agentName);\n\t}\n\n\tswitch (command) {\n\t\tcase 'init': {\n\t\t\tconst target = positionals[1];\n\t\t\tif (!target) {\n\t\t\t\tconsole.error('Usage: hebbian init <path>');\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\tconst { initBrain } = await import('./init');\n\t\t\tawait initBrain(resolve(target));\n\t\t\tbreak;\n\t\t}\n\t\tcase 'emit': {\n\t\t\tconst target = positionals[1];\n\t\t\tif (!target) {\n\t\t\t\tconsole.error('Usage: hebbian emit <target> (claude/cursor/gemini/copilot/generic/all)');\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\tconst { emitToTarget } = await import('./emit');\n\t\t\tawait emitToTarget(brainRoot, target);\n\t\t\t// Non-blocking update check — show banner if upgrade available\n\t\t\tconst { checkForUpdates, formatUpdateBanner } = await import('./update-check');\n\t\t\tcheckForUpdates(VERSION).then((status) => {\n\t\t\t\tconst banner = formatUpdateBanner(status);\n\t\t\t\tif (banner) console.error(banner);\n\t\t\t}).catch(() => {});\n\t\t\tbreak;\n\t\t}\n\t\tcase 'fire': {\n\t\t\tconst neuronPath = positionals[1];\n\t\t\tif (!neuronPath) {\n\t\t\t\tconsole.error('Usage: hebbian fire <neuron-path>');\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\tconst { fireNeuron } = await import('./fire');\n\t\t\tawait fireNeuron(brainRoot, neuronPath);\n\t\t\tbreak;\n\t\t}\n\t\tcase 'grow': {\n\t\t\tconst neuronPath = positionals[1];\n\t\t\tif (!neuronPath) {\n\t\t\t\tconsole.error('Usage: hebbian grow <neuron-path>');\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\tconst { growNeuron } = await import('./grow');\n\t\t\tawait growNeuron(brainRoot, neuronPath);\n\t\t\tbreak;\n\t\t}\n\t\tcase 'rollback': {\n\t\t\tconst neuronPath = positionals[1];\n\t\t\tif (!neuronPath) {\n\t\t\t\tconsole.error('Usage: hebbian rollback <neuron-path>');\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\tconst { rollbackNeuron } = await import('./rollback');\n\t\t\tawait rollbackNeuron(brainRoot, neuronPath);\n\t\t\tbreak;\n\t\t}\n\t\tcase 'signal': {\n\t\t\tconst signalType = positionals[1];\n\t\t\tconst neuronPath = positionals[2];\n\t\t\tif (!signalType || !neuronPath) {\n\t\t\t\tconsole.error('Usage: hebbian signal <type> <neuron-path> (type: dopamine/bomb/memory)');\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\tconst { signalNeuron } = await import('./signal');\n\t\t\tawait signalNeuron(brainRoot, neuronPath, signalType as SignalType);\n\t\t\tbreak;\n\t\t}\n\t\tcase 'decay': {\n\t\t\tconst days = values.days ? parseInt(values.days as string, 10) : 30;\n\t\t\tconst { runDecay } = await import('./decay');\n\t\t\tawait runDecay(brainRoot, days);\n\t\t\tbreak;\n\t\t}\n\t\tcase 'dedup': {\n\t\t\tconst { runDedup } = await import('./dedup');\n\t\t\trunDedup(brainRoot);\n\t\t\tbreak;\n\t\t}\n\t\tcase 'snapshot': {\n\t\t\tconst { gitSnapshot } = await import('./snapshot');\n\t\t\tgitSnapshot(brainRoot);\n\t\t\tbreak;\n\t\t}\n\t\tcase 'watch': {\n\t\t\tconst { startWatch } = await import('./watch');\n\t\t\tawait startWatch(brainRoot);\n\t\t\tbreak;\n\t\t}\n\t\tcase 'api': {\n\t\t\tconst port = values.port ? parseInt(values.port as string, 10) : 9090;\n\t\t\tconst { startAPI } = await import('./api');\n\t\t\tstartAPI(brainRoot, port);\n\t\t\t// Keep process alive — server handles shutdown\n\t\t\tawait new Promise(() => {});\n\t\t\tbreak;\n\t\t}\n\t\tcase 'inbox': {\n\t\t\tconst { processInbox } = await import('./inbox');\n\t\t\tprocessInbox(brainRoot);\n\t\t\tbreak;\n\t\t}\n\t\tcase 'claude': {\n\t\t\tconst sub = positionals[1];\n\t\t\tconst isGlobal = values.global === true;\n\t\t\tconst { installHooks, uninstallHooks, checkHooks } = await import('./hooks');\n\t\t\tswitch (sub) {\n\t\t\t\tcase 'install': {\n\t\t\t\t\t// Global: require --brain flag or HEBBIAN_BRAIN env\n\t\t\t\t\t// Local: default to ./brain in project root\n\t\t\t\t\tconst installBrain = values.brain\n\t\t\t\t\t\t? resolve(values.brain as string)\n\t\t\t\t\t\t: isGlobal\n\t\t\t\t\t\t\t? (process.env.HEBBIAN_BRAIN ? resolve(process.env.HEBBIAN_BRAIN) : '')\n\t\t\t\t\t\t\t: resolve('./brain');\n\t\t\t\t\tif (isGlobal && !installBrain) {\n\t\t\t\t\t\tconsole.error('❌ --global requires --brain <path> or HEBBIAN_BRAIN env var');\n\t\t\t\t\t\tprocess.exit(1);\n\t\t\t\t\t}\n\t\t\t\t\tinstallHooks(installBrain, undefined, isGlobal);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'uninstall':\n\t\t\t\t\tuninstallHooks(undefined, isGlobal);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'status': {\n\t\t\t\t\tcheckHooks(undefined, isGlobal);\n\t\t\t\t\tconsole.log(` version: v${VERSION}`);\n\t\t\t\t\tconst { checkForUpdates: checkUpdates, formatUpdateBanner: formatBanner } = await import('./update-check');\n\t\t\t\t\tconst updateStatus = await checkUpdates(VERSION);\n\t\t\t\t\tconst updateBanner = formatBanner(updateStatus);\n\t\t\t\t\tif (updateBanner) console.error(updateBanner);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\tconsole.error('Usage: hebbian claude <install|uninstall|status> [--global]');\n\t\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 'digest': {\n\t\t\tconst transcriptFlag = values.transcript as string | undefined;\n\t\t\tconst { digestTranscript, readHookInput } = await import('./digest');\n\t\t\tif (transcriptFlag) {\n\t\t\t\tdigestTranscript(brainRoot, resolve(transcriptFlag));\n\t\t\t} else {\n\t\t\t\t// Read stdin for hook input\n\t\t\t\tconst stdin = await readStdin();\n\t\t\t\tconst hookInput = readHookInput(stdin);\n\t\t\t\tif (hookInput) {\n\t\t\t\t\tdigestTranscript(brainRoot, hookInput.transcriptPath, hookInput.sessionId);\n\t\t\t\t} else {\n\t\t\t\t\tconsole.error('Usage: hebbian digest --transcript <path>');\n\t\t\t\t\tconsole.error(' Or pipe hook input via stdin (Claude Code Stop hook)');\n\t\t\t\t\tprocess.exit(1);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 'candidates': {\n\t\t\tconst subCmd = positionals[1];\n\t\t\tconst { listCandidates, promoteCandidates } = await import('./candidates');\n\t\t\tif (subCmd === 'promote') {\n\t\t\t\tconst result = promoteCandidates(brainRoot);\n\t\t\t\tconsole.log(`🎓 promoted: ${result.promoted.length}, decayed: ${result.decayed.length}`);\n\t\t\t} else {\n\t\t\t\tconst candidates = listCandidates(brainRoot);\n\t\t\t\tif (candidates.length === 0) {\n\t\t\t\t\tconsole.log('No pending candidates');\n\t\t\t\t} else {\n\t\t\t\t\tconsole.log(`Candidates (promote at counter=${3}):`);\n\t\t\t\t\tfor (const c of candidates) {\n\t\t\t\t\t\tconst bar = '█'.repeat(c.counter) + '░'.repeat(Math.max(0, 3 - c.counter));\n\t\t\t\t\t\tconsole.log(` ${bar} ${c.counter}/3 ${c.targetPath} (${c.daysInactive}d idle)`);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 'evolve': {\n\t\t\tconst dryRun = values['dry-run'] === true;\n\t\t\tconst modeArg = positionals[1] === 'prune' ? 'prune' as const : 'default' as const;\n\t\t\tconst { runEvolve } = await import('./evolve');\n\t\t\tawait runEvolve(brainRoot, dryRun, modeArg);\n\t\t\tbreak;\n\t\t}\n\t\tcase 'session': {\n\t\t\tconst sub = positionals[1];\n\t\t\tconst { captureSessionStart, detectOutcome } = await import('./outcome');\n\t\t\tswitch (sub) {\n\t\t\t\tcase 'start':\n\t\t\t\t\tcaptureSessionStart(brainRoot);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'end':\n\t\t\t\t\tdetectOutcome(brainRoot);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tconsole.error('Usage: hebbian session <start|end>');\n\t\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 'sessions': {\n\t\t\tconst { readEpisodes } = await import('./episode');\n\t\t\tconst episodes = readEpisodes(brainRoot).filter((e) => e.outcome);\n\t\t\tif (episodes.length === 0) {\n\t\t\t\tconsole.log('No session outcomes recorded yet');\n\t\t\t} else {\n\t\t\t\tconsole.log('Session Outcomes:');\n\t\t\t\tfor (const ep of episodes.reverse()) {\n\t\t\t\t\tconst icon = ep.outcome === 'revert' ? '🔄' : '✅';\n\t\t\t\t\tconst neurons = ep.neurons ? `${ep.neurons.length} neurons` : '';\n\t\t\t\t\tconsole.log(` ${icon} ${ep.ts.slice(0, 19)} ${ep.outcome} ${neurons}`);\n\t\t\t\t}\n\t\t\t\tconsole.log(`\\nTotal: ${episodes.length} sessions`);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 'doctor': {\n\t\t\tconst { runDoctor } = await import('./doctor');\n\t\t\tawait runDoctor(brainRoot);\n\t\t\tbreak;\n\t\t}\n\t\tcase 'diag':\n\t\tcase 'stats': {\n\t\t\tconst { scanBrain } = await import('./scanner');\n\t\t\tconst { runSubsumption } = await import('./subsumption');\n\t\t\tconst brain = scanBrain(brainRoot);\n\t\t\tconst result = runSubsumption(brain);\n\t\t\tconst { printDiag } = await import('./emit');\n\t\t\tprintDiag(brain, result);\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t\tconsole.error(`Unknown command: ${command}`);\n\t\t\tconsole.log(HELP);\n\t\t\tprocess.exit(1);\n\t}\n}\n\nmain(process.argv.slice(2)).catch((err: Error) => {\n\tconsole.error(err.message);\n\tprocess.exit(1);\n});\n"],"mappings":"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","names":["existsSync","readdirSync","readFileSync","existsSync","join","existsSync","readFileSync","writeFileSync","mkdirSync","join","dirname","existsSync","mkdirSync","readFileSync","writeFileSync","statSync","join","readdirSync","writeFileSync","existsSync","mkdirSync","join","mkdirSync","writeFileSync","existsSync","readdirSync","join","relative","renameSync","join","writeFileSync","existsSync","readdirSync","join","readdirSync","statSync","writeFileSync","existsSync","join","writeFileSync","join","existsSync","join","resolve","existsSync","mkdirSync","readdirSync","renameSync","statSync","join","dirname","relative","readdirSync","readFileSync","writeFileSync","mkdirSync","existsSync","join","readFileSync","writeFileSync","existsSync","mkdirSync","join","resolve","readFileSync","writeFileSync","existsSync","mkdirSync","readdirSync","execSync","join","resolve","group","readFileSync","writeFileSync","existsSync","mkdirSync","join","execSync","existsSync","mkdirSync","writeFileSync","readFileSync","readdirSync","rmSync","statSync","join","existsSync","readFileSync","writeFileSync","join","existsSync","readFileSync","readdirSync","join","execSync","resolve","resolveAgentBrain","initBrain","emitToTarget","checkForUpdates","formatUpdateBanner","fireNeuron","growNeuron","rollbackNeuron","signalNeuron","runDecay","runDedup","gitSnapshot","startWatch","startAPI","processInbox","installHooks","uninstallHooks","checkHooks","digestTranscript","readHookInput","listCandidates","promoteCandidates","runEvolve","captureSessionStart","detectOutcome","readEpisodes","runDoctor","scanBrain","runSubsumption","printDiag"]}
|