cofactor-memory 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli.ts","../src/index.ts","../src/core/indexer.ts","../src/core/catalysts.ts","../src/core/entities.ts","../src/core/text.ts","../src/core/time.ts","../src/core/vector.ts","../src/core/discover.ts","../src/core/defaults.ts","../src/core/store.ts","../src/core/apply.ts","../src/core/agents.ts","../src/core/mcp.ts","../src/core/search.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Command } from \"commander\";\n\nimport { applyCorpus, indexVault, installAgentInstructions, loadIndex, runMcpServer } from \"./index.js\";\nimport type { AgentName } from \"./core/agents.js\";\nimport { formatPetri, formatSearchResults, petri, catalyze } from \"./core/search.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"cofactor\")\n .description(\"Local-first catalytic memory for Markdown corpora and AI agents.\")\n .version(\"0.1.0\");\n\nprogram\n .command(\"init\")\n .argument(\"[vault]\", \"Markdown corpus to index\", process.cwd())\n .option(\"--max-files <count>\", \"maximum files to index\", integerOption)\n .option(\"--json\", \"print machine-readable output\")\n .description(\"Scan a corpus and write .cofactor/index.json.\")\n .action(async (vault: string, options: { json?: boolean; maxFiles?: number }) => {\n const index = await indexVault(vault, {\n config: options.maxFiles ? { maxFiles: options.maxFiles } : undefined,\n });\n print(\n {\n generatedAt: index.generatedAt,\n path: index.vaultPath,\n stats: index.stats,\n },\n options.json,\n );\n });\n\nprogram\n .command(\"refresh\")\n .argument(\"[vault]\", \"Markdown corpus to refresh\", process.cwd())\n .option(\"--json\", \"print machine-readable output\")\n .description(\"Alias for init.\")\n .action(async (vault: string, options: { json?: boolean }) => {\n const index = await indexVault(vault);\n print(\n {\n generatedAt: index.generatedAt,\n path: index.vaultPath,\n stats: index.stats,\n },\n options.json,\n );\n });\n\nprogram\n .command(\"petri\")\n .argument(\"[vault]\", \"Indexed corpus\", process.cwd())\n .option(\"-q, --query <query>\", \"filter catalysts by query\")\n .option(\"--json\", \"print machine-readable output\")\n .description(\"Show the local entity/catalyst graph that agents should keep in working memory.\")\n .action(async (vault: string, options: { json?: boolean; query?: string }) => {\n const response = await petri(vault, options.query);\n if (options.json) {\n console.log(formatPetri(response));\n return;\n }\n\n printPetriSummary(response);\n });\n\nprogram\n .command(\"catalyze\")\n .argument(\"<query>\", \"search question\")\n .option(\"-v, --vault <vault>\", \"indexed corpus\", process.cwd())\n .option(\"-t, --target <target>\", \"applied target id, path, or basename\")\n .option(\"-l, --limit <count>\", \"number of results\", integerOption)\n .option(\"--json\", \"print machine-readable output\")\n .option(\"--register\", \"accepted for compatibility; results are always returned on stdout\")\n .description(\"Search through catalysts and return relevant local documents.\")\n .action(\n async (\n query: string,\n options: { json?: boolean; limit?: number; register?: boolean; target?: string; vault: string },\n ) => {\n const response = await catalyze(query, {\n limit: options.limit,\n target: options.target,\n vaultPath: options.vault,\n });\n if (options.json) {\n console.log(formatSearchResults(response));\n return;\n }\n\n printSearchSummary(response);\n },\n );\n\nprogram\n .command(\"apply\")\n .argument(\"<target>\", \"external corpus to search with this vault's catalysts\")\n .option(\"-v, --vault <vault>\", \"source indexed corpus\", process.cwd())\n .option(\"--json\", \"print machine-readable output\")\n .description(\"Project this vault's catalysts onto another local corpus.\")\n .action(async (target: string, options: { json?: boolean; vault: string }) => {\n const response = await applyCorpus(options.vault, target);\n print(\n {\n source: response.vaultIndex.vaultPath,\n target: response.target,\n targetStats: response.targetIndex.stats,\n },\n options.json,\n );\n });\n\nprogram\n .command(\"agents\")\n .argument(\"<agent>\", \"codex or claude\")\n .argument(\"[vault]\", \"repository/corpus root\", process.cwd())\n .option(\"--json\", \"print machine-readable output\")\n .description(\"Install agent instructions that teach tools to call cofactor.\")\n .action(async (agent: string, vault: string, options: { json?: boolean }) => {\n if (agent !== \"codex\" && agent !== \"claude\") {\n throw new Error(`Unsupported agent \"${agent}\". Expected \"codex\" or \"claude\".`);\n }\n\n const response = await installAgentInstructions(vault, agent as AgentName);\n print(response, options.json);\n });\n\nprogram\n .command(\"mcp\")\n .argument(\"[vault]\", \"default indexed corpus for MCP tools\", process.cwd())\n .description(\"Run an MCP stdio server exposing petri and catalyze tools.\")\n .action(async (vault: string) => {\n await runMcpServer(vault);\n });\n\nprogram\n .command(\"status\")\n .argument(\"[vault]\", \"indexed corpus\", process.cwd())\n .option(\"--json\", \"print machine-readable output\")\n .description(\"Report whether the corpus has a Cofactor index.\")\n .action(async (vault: string, options: { json?: boolean }) => {\n const index = await loadIndex(vault);\n print(\n {\n appliedTargets: index.appliedTargets,\n generatedAt: index.generatedAt,\n path: index.vaultPath,\n stats: index.stats,\n version: index.version,\n },\n options.json,\n );\n });\n\nprogram.parseAsync().catch((error: unknown) => {\n const message = error instanceof Error ? error.message : String(error);\n console.error(`cofactor: ${message}`);\n process.exitCode = 1;\n});\n\nfunction integerOption(value: string): number {\n const parsed = Number.parseInt(value, 10);\n if (!Number.isFinite(parsed) || parsed < 1) {\n throw new Error(`Expected a positive integer, received \"${value}\"`);\n }\n\n return parsed;\n}\n\nfunction print(value: unknown, json?: boolean): void {\n if (json) {\n console.log(JSON.stringify(value, null, 2));\n return;\n }\n\n console.log(JSON.stringify(value, null, 2));\n}\n\nfunction printPetriSummary(response: Awaited<ReturnType<typeof petri>>): void {\n console.log(`Vault: ${response.vaultPath}`);\n console.log(\n `Documents: ${response.stats.documentCount} Chunks: ${response.stats.chunkCount} Entities: ${response.stats.entityCount} Catalysts: ${response.stats.catalystCount}`,\n );\n if (response.appliedTargets.length > 0) {\n console.log(`Applied targets: ${response.appliedTargets.map((target) => target.path).join(\", \")}`);\n }\n console.log(\"\");\n console.log(\"Top entities:\");\n for (const entity of response.entities.slice(0, 12)) {\n console.log(\n `- ${entity.name} (${entity.type}, ${entity.activityTrend}, docs=${entity.documentCount})`,\n );\n }\n console.log(\"\");\n console.log(\"Catalysts:\");\n for (const catalyst of response.catalysts.slice(0, 10)) {\n console.log(`- [${catalyst.id}] ${catalyst.text}`);\n }\n}\n\nfunction printSearchSummary(response: Awaited<ReturnType<typeof catalyze>>): void {\n console.log(`Query: ${response.query}`);\n if (response.target) {\n console.log(`Target: ${response.target}`);\n }\n console.log(\"\");\n console.log(\"Catalysts:\");\n for (const match of response.catalysts) {\n console.log(`- ${match.catalyst.text} (${match.score.toFixed(3)})`);\n }\n console.log(\"\");\n console.log(\"Results:\");\n for (const [index, result] of response.results.entries()) {\n console.log(`${index + 1}. ${result.title} (${result.filePath}) score=${result.score}`);\n console.log(` ${result.content.slice(0, 220)}${result.content.length > 220 ? \"...\" : \"\"}`);\n }\n}\n","import path from \"node:path\";\n\nimport type { GardenIndex, IndexOptions } from \"./types.js\";\nimport { createIndex } from \"./core/indexer.js\";\nimport { readConfig, readIndex, writeConfig, writeIndex } from \"./core/store.js\";\n\nexport * from \"./types.js\";\nexport { applyCorpus } from \"./core/apply.js\";\nexport { installAgentInstructions } from \"./core/agents.js\";\nexport { createIndex } from \"./core/indexer.js\";\nexport { runMcpServer } from \"./core/mcp.js\";\nexport { catalyze, formatPetri, formatSearchResults, petri, searchIndex } from \"./core/search.js\";\nexport { readConfig, readIndex, readTargetIndex } from \"./core/store.js\";\n\nexport async function indexVault(\n vaultPathInput = process.cwd(),\n options: IndexOptions = {},\n): Promise<GardenIndex> {\n const vaultPath = path.resolve(vaultPathInput);\n const previousConfig = await readConfig(vaultPath);\n const config = options.config ? { ...previousConfig, ...options.config } : previousConfig;\n const index = await createIndex(vaultPath, { ...options, config });\n\n await writeConfig(vaultPath, config);\n await writeIndex(vaultPath, index);\n return index;\n}\n\nexport async function loadIndex(vaultPathInput = process.cwd()): Promise<GardenIndex> {\n return readIndex(path.resolve(vaultPathInput));\n}\n\nexport async function refreshVault(\n vaultPathInput = process.cwd(),\n options: IndexOptions = {},\n): Promise<GardenIndex> {\n return indexVault(vaultPathInput, options);\n}\n","import path from \"node:path\";\n\nimport type {\n EntitySummary,\n GardenChunk,\n GardenDocument,\n GardenIndex,\n IndexOptions,\n Vector,\n} from \"../types.js\";\nimport { buildCatalysts } from \"./catalysts.js\";\nimport { discoverDocuments } from \"./discover.js\";\nimport { INDEX_VERSION, mergeConfig } from \"./defaults.js\";\nimport { entityNameFromId, entityTypeFromId } from \"./entities.js\";\nimport { chunkByWords, tokenize, topTerms } from \"./text.js\";\nimport { frequencyInLastYear, inferTrend, maxIso, minIso, recencyScore } from \"./time.js\";\nimport { buildIdf, vectorizeTokens } from \"./vector.js\";\n\nexport async function createIndex(\n vaultPath: string,\n options: IndexOptions = {},\n kind: \"vault\" | \"target\" = \"vault\",\n sourceVaultPath?: string,\n): Promise<GardenIndex> {\n const config = mergeConfig(options.config);\n const root = path.resolve(vaultPath);\n const documents = await discoverDocuments(root, config);\n const chunkShells = documents.flatMap((document) => documentChunks(document, config));\n const tokenSets = chunkShells.map((chunk) => chunk.tokens);\n const idf = buildIdf(tokenSets);\n const chunks = chunkShells.map((chunk) => ({\n ...chunk,\n vector: vectorizeTokens(chunk.tokens, idf),\n }));\n const entities = selectEntities(documents, chunks, idf, config.selectedEntityLimit);\n const catalysts = buildCatalysts(entities, documents, chunks, idf);\n const entityCatalystIds = new Map<string, string[]>();\n for (const catalyst of catalysts) {\n const list = entityCatalystIds.get(catalyst.entityId) ?? [];\n list.push(catalyst.id);\n entityCatalystIds.set(catalyst.entityId, list);\n }\n\n return {\n appliedTargets: [],\n catalysts,\n chunks,\n config,\n documents,\n entities: entities.map((entity) => ({\n ...entity,\n catalystIds: entityCatalystIds.get(entity.id) ?? [],\n })),\n generatedAt: new Date().toISOString(),\n idf,\n kind,\n sourceVaultPath,\n stats: {\n catalystCount: catalysts.length,\n chunkCount: chunks.length,\n documentCount: documents.length,\n entityCount: entities.length,\n },\n targetPath: kind === \"target\" ? root : undefined,\n vaultPath: root,\n version: INDEX_VERSION,\n };\n}\n\nfunction documentChunks(\n document: GardenDocument,\n config: ReturnType<typeof mergeConfig>,\n): Array<Omit<GardenChunk, \"vector\">> {\n return chunkByWords(document.content, config.chunkSizeWords, config.chunkOverlapWords).map(\n (content, ordinal) => ({\n content,\n createdAt: document.createdAt,\n docId: document.id,\n entities: document.entities,\n filePath: document.path,\n id: `${document.id}:${ordinal}`,\n modifiedAt: document.modifiedAt,\n ordinal,\n relativePath: document.relativePath,\n title: document.title,\n tokens: tokenize(`${document.title} ${content}`),\n }),\n );\n}\n\nfunction selectEntities(\n documents: GardenDocument[],\n chunks: GardenChunk[],\n idf: Vector,\n limit: number,\n): EntitySummary[] {\n const docsByEntity = new Map<string, GardenDocument[]>();\n const chunksByEntity = new Map<string, GardenChunk[]>();\n for (const document of documents) {\n for (const entity of document.entities) {\n const list = docsByEntity.get(entity) ?? [];\n list.push(document);\n docsByEntity.set(entity, list);\n }\n }\n for (const chunk of chunks) {\n for (const entity of chunk.entities) {\n const list = chunksByEntity.get(entity) ?? [];\n list.push(chunk);\n chunksByEntity.set(entity, list);\n }\n }\n\n const candidates: EntitySummary[] = [];\n for (const [id, entityDocuments] of docsByEntity.entries()) {\n const entityChunks = chunksByEntity.get(id) ?? [];\n const dates = entityDocuments.map((document) => document.createdAt);\n const type = entityTypeFromId(id);\n const name = entityNameFromId(id);\n const entityText = entityChunks.map((chunk) => chunk.content).join(\"\\n\");\n const terms = weightedTerms(entityText, idf);\n const score =\n entityDocuments.length * 2 +\n entityChunks.length +\n frequencyInLastYear(dates) * 1.5 +\n recencyScore(maxIso(dates), 180) * 2;\n\n candidates.push({\n activityTrend: inferTrend(dates),\n catalystIds: [],\n chunkCount: entityChunks.length,\n documentCount: entityDocuments.length,\n firstSeen: minIso(dates),\n frequency12m: frequencyInLastYear(dates),\n id,\n lastSeen: maxIso(dates),\n name,\n score,\n topTerms: terms,\n type,\n });\n }\n\n return candidates.sort((left, right) => right.score - left.score).slice(0, limit);\n}\n\nfunction weightedTerms(text: string, idf: Vector): string[] {\n const tokens = tokenize(text);\n const counts = new Map<string, number>();\n for (const token of tokens) {\n counts.set(token, (counts.get(token) ?? 0) + 1);\n }\n\n const scored = [...counts.entries()]\n .map(([token, count]) => [token, count * (idf[token] ?? 1)] as const)\n .sort((left, right) => right[1] - left[1] || left[0].localeCompare(right[0]))\n .slice(0, 12)\n .map(([token]) => token);\n\n return scored.length ? scored : topTerms(tokens, 8);\n}\n","import crypto from \"node:crypto\";\n\nimport type {\n Catalyst,\n EntitySummary,\n EntityType,\n GardenChunk,\n GardenDocument,\n Vector,\n} from \"../types.js\";\nimport { entityDisplayName, entityNameFromId, entityTypeFromId } from \"./entities.js\";\nimport { phraseTerms, tokenize, topTerms } from \"./text.js\";\nimport { maxIso, minIso, quarterLabel } from \"./time.js\";\nimport { cosine, vectorizeText } from \"./vector.js\";\n\nexport function buildCatalysts(\n entities: EntitySummary[],\n documents: GardenDocument[],\n chunks: GardenChunk[],\n idf: Vector,\n): Catalyst[] {\n const documentById = new Map(documents.map((document) => [document.id, document]));\n const catalysts: Catalyst[] = [];\n\n for (const entity of entities) {\n const entityChunks = chunks.filter((chunk) => chunk.entities.includes(entity.id));\n if (entityChunks.length === 0) {\n continue;\n }\n\n const entityDocuments = [\n ...new Map(\n entityChunks\n .map((chunk) => documentById.get(chunk.docId))\n .filter((document): document is GardenDocument => Boolean(document))\n .map((document) => [document.id, document]),\n ).values(),\n ];\n const texts = entityChunks.map((chunk) => chunk.content).join(\"\\n\");\n const terms = pickTerms(texts, entity.topTerms);\n const timeline = entityDocuments.map((document) => document.createdAt).sort();\n const era = eraLabel(timeline);\n const displayName = entityDisplayName(entity.type, entity.name);\n const candidates = catalystTexts(displayName, entity.type, era, terms, entityChunks);\n\n for (const text of candidates) {\n const vector = vectorizeText(`${displayName} ${text} ${terms.join(\" \")}`, idf);\n const topChunks = entityChunks\n .map((chunk) => ({ chunkId: chunk.id, score: cosine(vector, chunk.vector) }))\n .filter((match) => match.score > 0)\n .sort((a, b) => b.score - a.score)\n .slice(0, 24);\n\n catalysts.push({\n context: terms.slice(0, 5).join(\" / \"),\n entityId: entity.id,\n entityName: entity.name,\n entityType: entity.type,\n era,\n id: catalystId(entity.id, text),\n terms,\n text,\n topChunks,\n vector,\n });\n }\n }\n\n return catalysts;\n}\n\nexport function refreshCatalystTopChunks(catalysts: Catalyst[], chunks: GardenChunk[]): Catalyst[] {\n return catalysts.map((catalyst) => ({\n ...catalyst,\n topChunks: chunks\n .map((chunk) => ({ chunkId: chunk.id, score: cosine(catalyst.vector, chunk.vector) }))\n .filter((match) => match.score > 0)\n .sort((a, b) => b.score - a.score)\n .slice(0, 32),\n }));\n}\n\nfunction pickTerms(text: string, seedTerms: string[]): string[] {\n const phrases = phraseTerms(text, 6).map((term) => term.replace(/\\s+/g, \"_\"));\n const words = topTerms(tokenize(text), 12);\n return [...new Set([...seedTerms, ...phrases, ...words])].slice(0, 10);\n}\n\nfunction catalystTexts(\n displayName: string,\n type: EntityType,\n era: string,\n terms: string[],\n chunks: GardenChunk[],\n): string[] {\n const [a = \"this thread\", b = \"nearby ideas\", c = \"older context\", d = \"new evidence\"] = terms;\n const scope = type === \"folder\" ? displayName : `the ${displayName} material`;\n const sorted = [...chunks].sort((left, right) => left.createdAt.localeCompare(right.createdAt));\n const earlyTerm = sorted.length > 1 ? topTerms(tokenize(sorted[0]!.content), 1)[0] ?? a : a;\n const recentTerm =\n sorted.length > 1 ? topTerms(tokenize(sorted[sorted.length - 1]!.content), 1)[0] ?? b : b;\n\n return [\n `What keeps connecting ${readable(a)} with ${readable(b)} across ${scope}?`,\n `Where does ${scope} show tension between ${readable(a)} and ${readable(c)}?`,\n `How did ${scope} shift from ${readable(earlyTerm)} toward ${readable(recentTerm)} during ${era}?`,\n `Which older notes about ${readable(c)} still matter when ${readable(d)} appears?`,\n ].filter((text, index, all) => all.indexOf(text) === index);\n}\n\nfunction eraLabel(dates: string[]): string {\n if (dates.length === 0) {\n return \"unknown\";\n }\n\n const first = quarterLabel(minIso(dates));\n const last = quarterLabel(maxIso(dates));\n return first === last ? first : `${first} to ${last}`;\n}\n\nfunction readable(term: string): string {\n return term.replace(/_/g, \" \");\n}\n\nfunction catalystId(entityId: string, text: string): string {\n const hash = crypto.createHash(\"sha1\").update(`${entityId}\\n${text}`).digest(\"hex\").slice(0, 12);\n return `cat_${hash}`;\n}\n\nexport function hydrateCatalystEntities(catalysts: Catalyst[]): Catalyst[] {\n return catalysts.map((catalyst) => ({\n ...catalyst,\n entityName: catalyst.entityName || entityNameFromId(catalyst.entityId),\n entityType: catalyst.entityType || entityTypeFromId(catalyst.entityId),\n }));\n}\n","import path from \"node:path\";\n\nimport type { EntityType } from \"../types.js\";\nimport { frontmatterList, normalizeTag } from \"./text.js\";\nimport type { Frontmatter } from \"../types.js\";\n\nexport function entityId(type: EntityType, name: string): string {\n return `${type}:${normalizeEntityName(type, name)}`;\n}\n\nexport function normalizeEntityName(type: EntityType, name: string): string {\n const clean = name.trim().replace(/\\s+/g, \" \");\n if (type === \"tag\") {\n return normalizeTag(clean);\n }\n if (type === \"folder\") {\n return clean.replace(/^\\/+|\\/+$/g, \"\");\n }\n\n return clean;\n}\n\nexport function entityDisplayName(type: EntityType, name: string): string {\n if (type === \"tag\") {\n return `#${name}`;\n }\n if (type === \"link\") {\n return `[[${name}]]`;\n }\n\n if (name === \".\") {\n return \"root folder\";\n }\n\n return name ? `folder:${name}` : \"folder:.\";\n}\n\nexport function entityTypeFromId(id: string): EntityType {\n const type = id.split(\":\", 1)[0];\n if (type === \"tag\" || type === \"link\" || type === \"folder\") {\n return type;\n }\n\n throw new Error(`Unknown entity type in id: ${id}`);\n}\n\nexport function entityNameFromId(id: string): string {\n const separator = id.indexOf(\":\");\n return separator === -1 ? id : id.slice(separator + 1);\n}\n\nexport function extractEntities(\n body: string,\n frontmatter: Frontmatter,\n relativePath: string,\n): {\n entityIds: string[];\n folders: string[];\n links: string[];\n tags: string[];\n} {\n const tags = new Set(frontmatterList(frontmatter, \"tags\"));\n const links = new Set<string>();\n const folders = new Set<string>([\".\"]);\n\n for (const match of body.matchAll(/(^|[\\s([{>])#([A-Za-z][A-Za-z0-9_/-]{1,64})\\b/g)) {\n const tag = normalizeTag(match[2] ?? \"\");\n if (tag) {\n tags.add(tag);\n }\n }\n\n for (const match of body.matchAll(/\\[\\[([^\\]|#]+)(?:#[^\\]|]+)?(?:\\|[^\\]]+)?]]/g)) {\n const link = normalizeEntityName(\"link\", match[1] ?? \"\");\n if (link) {\n links.add(link);\n }\n }\n\n const dirname = path.dirname(relativePath).replace(/\\\\/g, \"/\");\n if (dirname !== \".\") {\n const parts = dirname.split(\"/\").filter(Boolean);\n for (let index = 0; index < parts.length; index += 1) {\n folders.add(parts.slice(0, index + 1).join(\"/\"));\n }\n }\n\n const entityIds = [\n ...[...tags].map((name) => entityId(\"tag\", name)),\n ...[...links].map((name) => entityId(\"link\", name)),\n ...[...folders].map((name) => entityId(\"folder\", name)),\n ];\n\n return {\n entityIds: [...new Set(entityIds)].sort(),\n folders: [...folders].sort(),\n links: [...links].sort(),\n tags: [...tags].sort(),\n };\n}\n","import type { Frontmatter } from \"../types.js\";\n\nconst stopwords = new Set([\n \"a\",\n \"about\",\n \"above\",\n \"after\",\n \"again\",\n \"against\",\n \"all\",\n \"also\",\n \"am\",\n \"an\",\n \"and\",\n \"any\",\n \"are\",\n \"as\",\n \"at\",\n \"be\",\n \"because\",\n \"been\",\n \"before\",\n \"being\",\n \"below\",\n \"between\",\n \"both\",\n \"but\",\n \"by\",\n \"can\",\n \"did\",\n \"do\",\n \"does\",\n \"doing\",\n \"down\",\n \"during\",\n \"each\",\n \"few\",\n \"for\",\n \"from\",\n \"further\",\n \"had\",\n \"has\",\n \"have\",\n \"having\",\n \"he\",\n \"her\",\n \"here\",\n \"hers\",\n \"herself\",\n \"him\",\n \"himself\",\n \"his\",\n \"how\",\n \"i\",\n \"if\",\n \"in\",\n \"into\",\n \"is\",\n \"it\",\n \"its\",\n \"itself\",\n \"just\",\n \"me\",\n \"more\",\n \"most\",\n \"my\",\n \"myself\",\n \"no\",\n \"nor\",\n \"not\",\n \"now\",\n \"of\",\n \"off\",\n \"on\",\n \"once\",\n \"only\",\n \"or\",\n \"other\",\n \"our\",\n \"ours\",\n \"ourselves\",\n \"out\",\n \"over\",\n \"own\",\n \"same\",\n \"she\",\n \"should\",\n \"so\",\n \"some\",\n \"such\",\n \"than\",\n \"that\",\n \"the\",\n \"their\",\n \"theirs\",\n \"them\",\n \"themselves\",\n \"then\",\n \"there\",\n \"these\",\n \"they\",\n \"this\",\n \"those\",\n \"through\",\n \"to\",\n \"too\",\n \"under\",\n \"until\",\n \"up\",\n \"very\",\n \"was\",\n \"we\",\n \"were\",\n \"what\",\n \"when\",\n \"where\",\n \"which\",\n \"while\",\n \"who\",\n \"whom\",\n \"why\",\n \"will\",\n \"with\",\n \"you\",\n \"your\",\n \"yours\",\n \"yourself\",\n \"yourselves\",\n]);\n\nconst aliases: Record<string, string[]> = {\n auth: [\"authentication\", \"identity\", \"login\", \"session\"],\n authentication: [\"auth\", \"identity\", \"login\", \"session\"],\n build: [\"ship\", \"implement\", \"create\", \"make\"],\n changed: [\"shift\", \"pivot\", \"direction\", \"rewrite\"],\n change: [\"shift\", \"pivot\", \"direction\", \"rewrite\"],\n complexity: [\"risk\", \"friction\", \"maintenance\", \"tradeoff\"],\n cost: [\"budget\", \"price\", \"expense\", \"tradeoff\"],\n decision: [\"choice\", \"adr\", \"direction\", \"tradeoff\"],\n direction: [\"change\", \"shift\", \"strategy\", \"decision\"],\n memory: [\"recall\", \"context\", \"knowledge\", \"notes\"],\n notes: [\"memory\", \"knowledge\", \"writing\", \"docs\"],\n problem: [\"issue\", \"risk\", \"blocker\", \"challenge\"],\n search: [\"retrieval\", \"recall\", \"find\", \"lookup\"],\n session: [\"auth\", \"authentication\", \"identity\", \"login\"],\n tension: [\"tradeoff\", \"conflict\", \"risk\", \"constraint\"],\n user: [\"customer\", \"person\", \"people\", \"reader\"],\n};\n\nexport function extractFrontmatter(raw: string): { frontmatter: Frontmatter; body: string } {\n if (!raw.startsWith(\"---\\n\") && !raw.startsWith(\"---\\r\\n\")) {\n return { frontmatter: {}, body: raw };\n }\n\n const normalized = raw.replace(/\\r\\n/g, \"\\n\");\n const end = normalized.indexOf(\"\\n---\\n\", 4);\n if (end === -1) {\n return { frontmatter: {}, body: raw };\n }\n\n const block = normalized.slice(4, end);\n const body = normalized.slice(end + \"\\n---\\n\".length);\n return { frontmatter: parseSimpleYaml(block), body };\n}\n\nexport function parseSimpleYaml(block: string): Frontmatter {\n const data: Frontmatter = {};\n const lines = block.split(\"\\n\");\n let activeArrayKey: string | undefined;\n\n for (const rawLine of lines) {\n const line = rawLine.trimEnd();\n if (!line.trim() || line.trimStart().startsWith(\"#\")) {\n continue;\n }\n\n const itemMatch = line.match(/^\\s*-\\s+(.+)$/);\n if (itemMatch && activeArrayKey) {\n const current = data[activeArrayKey];\n const values = Array.isArray(current) ? current : [];\n values.push(cleanYamlValue(itemMatch[1] ?? \"\"));\n data[activeArrayKey] = values;\n continue;\n }\n\n activeArrayKey = undefined;\n const match = line.match(/^([A-Za-z0-9_-]+):\\s*(.*)$/);\n if (!match) {\n continue;\n }\n\n const key = match[1]!.toLowerCase();\n const value = match[2] ?? \"\";\n if (!value.trim()) {\n data[key] = [];\n activeArrayKey = key;\n continue;\n }\n\n const arrayMatch = value.trim().match(/^\\[(.*)]$/);\n if (arrayMatch) {\n data[key] = arrayMatch[1]!\n .split(\",\")\n .map(cleanYamlValue)\n .filter(Boolean);\n continue;\n }\n\n data[key] = cleanYamlValue(value);\n }\n\n return data;\n}\n\nexport function cleanYamlValue(value: string): string {\n return value.trim().replace(/^['\"]|['\"]$/g, \"\");\n}\n\nexport function frontmatterDate(frontmatter: Frontmatter, keys: string[]): string | undefined {\n for (const key of keys) {\n const value = frontmatter[key];\n if (typeof value === \"string\" && value.trim()) {\n const date = new Date(value);\n if (!Number.isNaN(date.getTime())) {\n return date.toISOString();\n }\n }\n }\n\n return undefined;\n}\n\nexport function frontmatterList(frontmatter: Frontmatter, key: string): string[] {\n const value = frontmatter[key];\n if (!value) {\n return [];\n }\n\n if (Array.isArray(value)) {\n return value.map(normalizeTag).filter(Boolean);\n }\n\n return value\n .split(\",\")\n .map(normalizeTag)\n .filter(Boolean);\n}\n\nexport function normalizeTag(tag: string): string {\n return tag.trim().replace(/^#/, \"\").toLowerCase();\n}\n\nexport function markdownTitle(body: string, fallback: string): string {\n const heading = body.match(/^#\\s+(.+)$/m);\n if (heading?.[1]) {\n return heading[1].trim();\n }\n\n return fallback.replace(/\\.[^.]+$/, \"\").replace(/[-_]+/g, \" \");\n}\n\nexport function stripMarkdown(raw: string): string {\n return raw\n .replace(/```[\\s\\S]*?```/g, \" \")\n .replace(/`([^`]+)`/g, \"$1\")\n .replace(/!\\[[^\\]]*]\\([^)]*\\)/g, \" \")\n .replace(/\\[([^\\]]+)]\\([^)]*\\)/g, \"$1\")\n .replace(/\\[\\[([^\\]|#]+)(?:#[^\\]|]+)?(?:\\|([^\\]]+))?]]/g, \"$2 $1\")\n .replace(/^#{1,6}\\s+/gm, \"\")\n .replace(/[*_~>|-]+/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim();\n}\n\nexport function tokenize(text: string, includeAliases = true): string[] {\n const normalized = stripMarkdown(text)\n .toLowerCase()\n .replace(/['’]/g, \"\")\n .replace(/[^a-z0-9]+/g, \" \");\n const base = normalized\n .split(/\\s+/)\n .map(stem)\n .filter((token) => token.length > 1 && !stopwords.has(token));\n\n if (!includeAliases) {\n return base;\n }\n\n const expanded: string[] = [];\n for (const token of base) {\n expanded.push(token);\n const synonymSet = aliases[token];\n if (synonymSet) {\n expanded.push(...synonymSet.map(stem));\n }\n }\n\n return expanded;\n}\n\nexport function topTerms(tokens: string[], limit = 8): string[] {\n const counts = new Map<string, number>();\n for (const token of tokens) {\n counts.set(token, (counts.get(token) ?? 0) + 1);\n }\n\n return [...counts.entries()]\n .sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))\n .slice(0, limit)\n .map(([term]) => term);\n}\n\nexport function phraseTerms(text: string, limit = 8): string[] {\n const tokens = tokenize(text, false);\n const counts = new Map<string, number>();\n for (let size = 2; size <= 3; size += 1) {\n for (let index = 0; index <= tokens.length - size; index += 1) {\n const phrase = tokens.slice(index, index + size).join(\" \");\n if (phrase.length > 4) {\n counts.set(phrase, (counts.get(phrase) ?? 0) + 1);\n }\n }\n }\n\n return [...counts.entries()]\n .sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))\n .slice(0, limit)\n .map(([term]) => term);\n}\n\nexport function splitWords(text: string): string[] {\n return stripMarkdown(text).split(/\\s+/).filter(Boolean);\n}\n\nexport function chunkByWords(text: string, chunkSize: number, overlap: number): string[] {\n const words = splitWords(text);\n if (words.length <= chunkSize) {\n return [words.join(\" \")];\n }\n\n const chunks: string[] = [];\n const step = Math.max(1, chunkSize - overlap);\n for (let start = 0; start < words.length; start += step) {\n const chunk = words.slice(start, start + chunkSize).join(\" \");\n if (chunk.trim()) {\n chunks.push(chunk);\n }\n if (start + chunkSize >= words.length) {\n break;\n }\n }\n\n return chunks;\n}\n\nexport function snippet(text: string, maxChars = 900): string {\n const clean = stripMarkdown(text);\n if (clean.length <= maxChars) {\n return clean;\n }\n\n return `${clean.slice(0, maxChars - 1).trim()}...`;\n}\n\nfunction stem(token: string): string {\n if (token.length > 5 && token.endsWith(\"ing\")) {\n return token.slice(0, -3);\n }\n if (token.length > 4 && token.endsWith(\"ied\")) {\n return `${token.slice(0, -3)}y`;\n }\n if (token.length > 4 && token.endsWith(\"ed\")) {\n return token.slice(0, -2);\n }\n if (token.length > 4 && token.endsWith(\"es\")) {\n return token.slice(0, -2);\n }\n if (token.length > 3 && token.endsWith(\"s\")) {\n return token.slice(0, -1);\n }\n\n return token;\n}\n","import type { ActivityTrend } from \"../types.js\";\n\nconst dayMs = 24 * 60 * 60 * 1000;\n\nexport function ageInDays(dateIso: string, now = new Date()): number {\n const date = new Date(dateIso);\n if (Number.isNaN(date.getTime())) {\n return 0;\n }\n\n return Math.max(0, (now.getTime() - date.getTime()) / dayMs);\n}\n\nexport function recencyScore(dateIso: string, halfLifeDays: number, now = new Date()): number {\n return Math.exp((-Math.log(2) * ageInDays(dateIso, now)) / Math.max(1, halfLifeDays));\n}\n\nexport function quarterLabel(dateIso: string): string {\n const date = new Date(dateIso);\n if (Number.isNaN(date.getTime())) {\n return \"unknown\";\n }\n\n return `${date.getUTCFullYear()} Q${Math.floor(date.getUTCMonth() / 3) + 1}`;\n}\n\nexport function inferTrend(dates: string[], now = new Date()): ActivityTrend {\n if (dates.length === 0) {\n return \"stable\";\n }\n\n const ages = dates.map((date) => ageInDays(date, now));\n const recent = ages.filter((age) => age <= 90).length;\n const previous = ages.filter((age) => age > 90 && age <= 365).length;\n const freshest = Math.min(...ages);\n\n if (recent >= Math.max(2, previous * 1.35)) {\n return \"rising\";\n }\n if (freshest <= 120) {\n return \"active\";\n }\n if (freshest > 365) {\n return \"dormant\";\n }\n\n return \"stable\";\n}\n\nexport function frequencyInLastYear(dates: string[], now = new Date()): number {\n return dates.filter((date) => ageInDays(date, now) <= 365).length;\n}\n\nexport function minIso(dates: string[]): string {\n return dates.reduce((min, value) => (value < min ? value : min), dates[0] ?? new Date(0).toISOString());\n}\n\nexport function maxIso(dates: string[]): string {\n return dates.reduce((max, value) => (value > max ? value : max), dates[0] ?? new Date(0).toISOString());\n}\n","import type { Vector } from \"../types.js\";\nimport { tokenize } from \"./text.js\";\n\nexport function buildIdf(tokenSets: string[][]): Vector {\n const docFrequency = new Map<string, number>();\n for (const tokens of tokenSets) {\n for (const token of new Set(tokens)) {\n docFrequency.set(token, (docFrequency.get(token) ?? 0) + 1);\n }\n }\n\n const count = Math.max(1, tokenSets.length);\n const idf: Vector = {};\n for (const [token, frequency] of docFrequency.entries()) {\n idf[token] = Math.log((count + 1) / (frequency + 1)) + 1;\n }\n\n return idf;\n}\n\nexport function vectorizeText(text: string, idf: Vector): Vector {\n return vectorizeTokens(tokenize(text), idf);\n}\n\nexport function vectorizeTokens(tokens: string[], idf: Vector): Vector {\n const counts = new Map<string, number>();\n for (const token of tokens) {\n counts.set(token, (counts.get(token) ?? 0) + 1);\n }\n\n const vector: Vector = {};\n const defaultIdf = Object.keys(idf).length > 0 ? Math.max(...Object.values(idf)) : 1;\n for (const [token, count] of counts.entries()) {\n vector[token] = (1 + Math.log(count)) * (idf[token] ?? defaultIdf);\n }\n\n return normalizeVector(vector);\n}\n\nexport function normalizeVector(vector: Vector): Vector {\n const norm = Math.sqrt(Object.values(vector).reduce((sum, value) => sum + value * value, 0));\n if (!norm) {\n return vector;\n }\n\n const normalized: Vector = {};\n for (const [term, value] of Object.entries(vector)) {\n normalized[term] = value / norm;\n }\n\n return normalized;\n}\n\nexport function cosine(a: Vector, b: Vector): number {\n let score = 0;\n const [small, large] = Object.keys(a).length < Object.keys(b).length ? [a, b] : [b, a];\n for (const [term, value] of Object.entries(small)) {\n score += value * (large[term] ?? 0);\n }\n\n return score;\n}\n\nexport function topVectorTerms(vector: Vector, limit = 8): string[] {\n return Object.entries(vector)\n .sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))\n .slice(0, limit)\n .map(([term]) => term);\n}\n","import { promises as fs } from \"node:fs\";\nimport path from \"node:path\";\n\nimport type { GardenDocument, IndexConfig } from \"../types.js\";\nimport { extractEntities } from \"./entities.js\";\nimport {\n extractFrontmatter,\n frontmatterDate,\n markdownTitle,\n splitWords,\n stripMarkdown,\n} from \"./text.js\";\n\nexport async function discoverDocuments(rootPath: string, config: IndexConfig): Promise<GardenDocument[]> {\n const root = path.resolve(rootPath);\n const files = await walk(root, config);\n const sortedFiles = files.sort((a, b) => a.localeCompare(b)).slice(0, config.maxFiles);\n const documents = await Promise.all(\n sortedFiles.map(async (filePath) => readDocument(root, filePath)),\n );\n\n return documents.filter((document) => document.wordCount > 0);\n}\n\nasync function readDocument(root: string, filePath: string): Promise<GardenDocument> {\n const content = await fs.readFile(filePath, \"utf8\");\n const stat = await fs.stat(filePath);\n const relativePath = path.relative(root, filePath).replace(/\\\\/g, \"/\");\n const { frontmatter, body } = extractFrontmatter(content);\n const cleanText = stripMarkdown(body);\n const fallbackCreated = stat.birthtimeMs > 0 ? stat.birthtime : stat.mtime;\n const createdAt =\n frontmatterDate(frontmatter, [\"created\", \"created_at\", \"date\"]) ?? fallbackCreated.toISOString();\n const modifiedAt =\n frontmatterDate(frontmatter, [\"modified\", \"updated\", \"updated_at\"]) ?? stat.mtime.toISOString();\n const extracted = extractEntities(body, frontmatter, relativePath);\n\n return {\n content: body,\n createdAt,\n entities: extracted.entityIds,\n folders: extracted.folders,\n frontmatter,\n id: stableFileId(relativePath),\n links: extracted.links,\n modifiedAt,\n path: filePath,\n relativePath,\n tags: extracted.tags,\n title: markdownTitle(body, path.basename(filePath)),\n wordCount: splitWords(cleanText).length,\n };\n}\n\nasync function walk(root: string, config: IndexConfig): Promise<string[]> {\n const files: string[] = [];\n const excluded = new Set(config.excludedDirs);\n const extensions = new Set(config.extensions.map((extension) => extension.toLowerCase()));\n\n async function visit(directory: string): Promise<void> {\n const entries = await fs.readdir(directory, { withFileTypes: true });\n for (const entry of entries) {\n const absolutePath = path.join(directory, entry.name);\n if (entry.isDirectory()) {\n if (!excluded.has(entry.name)) {\n await visit(absolutePath);\n }\n continue;\n }\n\n if (entry.isFile() && extensions.has(path.extname(entry.name).toLowerCase())) {\n files.push(absolutePath);\n }\n }\n }\n\n await visit(root);\n return files;\n}\n\nfunction stableFileId(relativePath: string): string {\n return Buffer.from(relativePath).toString(\"base64url\");\n}\n","import type { IndexConfig } from \"../types.js\";\n\nexport const INDEX_VERSION = \"0.1\";\n\nexport const STORE_DIR = \".cofactor\";\n\nexport const INDEX_FILE = \"index.json\";\n\nexport const CONFIG_FILE = \"config.json\";\n\nexport const TARGETS_DIR = \"targets\";\n\nexport const defaultConfig: IndexConfig = {\n chunkOverlapWords: 48,\n chunkSizeWords: 260,\n excludedDirs: [\n \".git\",\n \".hg\",\n \".svn\",\n \".cofactor\",\n \".obsidian\",\n \".trash\",\n \".venv\",\n \"coverage\",\n \"dist\",\n \"node_modules\",\n ],\n extensions: [\".md\", \".mdx\", \".txt\"],\n maxFiles: 1024,\n maxResults: 8,\n minEntityDocuments: 1,\n recencyHalfLifeDays: 180,\n selectedEntityLimit: 48,\n};\n\nexport function mergeConfig(overrides?: Partial<IndexConfig>): IndexConfig {\n if (!overrides) {\n return { ...defaultConfig, excludedDirs: [...defaultConfig.excludedDirs] };\n }\n\n return {\n ...defaultConfig,\n ...overrides,\n excludedDirs: overrides.excludedDirs ?? [...defaultConfig.excludedDirs],\n extensions: overrides.extensions ?? [...defaultConfig.extensions],\n };\n}\n","import { promises as fs } from \"node:fs\";\nimport path from \"node:path\";\n\nimport type { AppliedTarget, GardenIndex, IndexConfig } from \"../types.js\";\nimport { CONFIG_FILE, INDEX_FILE, STORE_DIR, TARGETS_DIR, mergeConfig } from \"./defaults.js\";\n\nexport function storePath(vaultPath: string): string {\n return path.join(path.resolve(vaultPath), STORE_DIR);\n}\n\nexport function indexPath(vaultPath: string): string {\n return path.join(storePath(vaultPath), INDEX_FILE);\n}\n\nexport function configPath(vaultPath: string): string {\n return path.join(storePath(vaultPath), CONFIG_FILE);\n}\n\nexport function targetsPath(vaultPath: string): string {\n return path.join(storePath(vaultPath), TARGETS_DIR);\n}\n\nexport function targetIndexPath(vaultPath: string, targetId: string): string {\n return path.join(targetsPath(vaultPath), `${targetId}.json`);\n}\n\nexport async function readConfig(vaultPath: string): Promise<IndexConfig> {\n try {\n const raw = await fs.readFile(configPath(vaultPath), \"utf8\");\n return mergeConfig(JSON.parse(raw) as Partial<IndexConfig>);\n } catch (error) {\n if (isNotFound(error)) {\n return mergeConfig();\n }\n throw error;\n }\n}\n\nexport async function writeConfig(vaultPath: string, config: IndexConfig): Promise<void> {\n await fs.mkdir(storePath(vaultPath), { recursive: true });\n await fs.writeFile(configPath(vaultPath), `${JSON.stringify(config, null, 2)}\\n`);\n}\n\nexport async function readIndex(vaultPath: string): Promise<GardenIndex> {\n const raw = await fs.readFile(indexPath(vaultPath), \"utf8\");\n return JSON.parse(raw) as GardenIndex;\n}\n\nexport async function writeIndex(vaultPath: string, index: GardenIndex): Promise<void> {\n await fs.mkdir(storePath(vaultPath), { recursive: true });\n await fs.writeFile(indexPath(vaultPath), `${JSON.stringify(index, null, 2)}\\n`);\n}\n\nexport async function readTargetIndex(vaultPath: string, target: string): Promise<GardenIndex> {\n const baseIndex = await readIndex(vaultPath);\n const appliedTarget = resolveAppliedTarget(baseIndex.appliedTargets, target);\n if (!appliedTarget) {\n throw new Error(`No applied target matches \"${target}\". Run cofactor apply ${target} first.`);\n }\n\n const raw = await fs.readFile(appliedTarget.indexPath, \"utf8\");\n return JSON.parse(raw) as GardenIndex;\n}\n\nexport async function writeTargetIndex(vaultPath: string, targetId: string, index: GardenIndex): Promise<string> {\n await fs.mkdir(targetsPath(vaultPath), { recursive: true });\n const filePath = targetIndexPath(vaultPath, targetId);\n await fs.writeFile(filePath, `${JSON.stringify(index, null, 2)}\\n`);\n return filePath;\n}\n\nexport function resolveAppliedTarget(\n targets: AppliedTarget[],\n requested: string,\n): AppliedTarget | undefined {\n const absolute = path.resolve(requested);\n return targets.find(\n (target) =>\n target.id === requested ||\n target.path === requested ||\n target.path === absolute ||\n path.basename(target.path) === requested,\n );\n}\n\nfunction isNotFound(error: unknown): boolean {\n return Boolean(error && typeof error === \"object\" && \"code\" in error && error.code === \"ENOENT\");\n}\n","import crypto from \"node:crypto\";\nimport path from \"node:path\";\n\nimport type { AppliedTarget, ApplyResponse, GardenIndex, IndexOptions } from \"../types.js\";\nimport { refreshCatalystTopChunks } from \"./catalysts.js\";\nimport { createIndex } from \"./indexer.js\";\nimport { readConfig, readIndex, writeIndex, writeTargetIndex } from \"./store.js\";\nimport { vectorizeTokens } from \"./vector.js\";\n\nexport async function applyCorpus(\n vaultPath: string,\n targetPathInput: string,\n options: IndexOptions = {},\n): Promise<ApplyResponse> {\n const targetPath = path.resolve(targetPathInput);\n const vaultIndex = await readIndex(vaultPath);\n const config = options.config ? { ...vaultIndex.config, ...options.config } : await readConfig(vaultPath);\n const targetIndex = await createIndex(targetPath, { config }, \"target\", path.resolve(vaultPath));\n targetIndex.idf = vaultIndex.idf;\n targetIndex.chunks = targetIndex.chunks.map((chunk) => ({\n ...chunk,\n vector: vectorizeTokens(chunk.tokens, vaultIndex.idf),\n }));\n targetIndex.catalysts = refreshCatalystTopChunks(vaultIndex.catalysts, targetIndex.chunks);\n targetIndex.entities = [];\n targetIndex.stats = {\n ...targetIndex.stats,\n catalystCount: targetIndex.catalysts.length,\n entityCount: 0,\n };\n\n const id = targetId(targetPath);\n const indexFilePath = await writeTargetIndex(vaultPath, id, targetIndex);\n const appliedTarget: AppliedTarget = {\n appliedAt: new Date().toISOString(),\n docCount: targetIndex.documents.length,\n id,\n indexPath: indexFilePath,\n path: targetPath,\n };\n const remainingTargets = vaultIndex.appliedTargets.filter((target) => target.id !== id);\n const nextVaultIndex: GardenIndex = {\n ...vaultIndex,\n appliedTargets: [...remainingTargets, appliedTarget].sort((a, b) => a.path.localeCompare(b.path)),\n };\n await writeIndex(vaultPath, nextVaultIndex);\n\n return {\n target: appliedTarget,\n targetIndex,\n vaultIndex: nextVaultIndex,\n };\n}\n\nfunction targetId(targetPath: string): string {\n return crypto.createHash(\"sha1\").update(path.resolve(targetPath)).digest(\"hex\").slice(0, 12);\n}\n","import { promises as fs } from \"node:fs\";\nimport path from \"node:path\";\n\nimport { STORE_DIR } from \"./defaults.js\";\n\nexport type AgentName = \"codex\" | \"claude\";\n\nconst startMarker = \"<!-- cofactor:start -->\";\nconst endMarker = \"<!-- cofactor:end -->\";\n\nexport async function installAgentInstructions(\n vaultPathInput: string,\n agent: AgentName,\n): Promise<{ files: string[] }> {\n const vaultPath = path.resolve(vaultPathInput);\n const files: string[] = [];\n\n if (agent === \"codex\") {\n const agentsFile = path.join(vaultPath, \"AGENTS.md\");\n await upsertBlock(agentsFile, codexBlock());\n files.push(agentsFile);\n\n const skillDir = path.join(vaultPath, \".agents\", \"skills\", \"cofactor\");\n await fs.mkdir(skillDir, { recursive: true });\n const skillFile = path.join(skillDir, \"SKILL.md\");\n await fs.writeFile(skillFile, codexSkill());\n files.push(skillFile);\n return { files };\n }\n\n const claudeFile = path.join(vaultPath, \"CLAUDE.md\");\n await upsertBlock(claudeFile, claudeBlock());\n files.push(claudeFile);\n return { files };\n}\n\nasync function upsertBlock(filePath: string, block: string): Promise<void> {\n let existing = \"\";\n try {\n existing = await fs.readFile(filePath, \"utf8\");\n } catch (error) {\n if (!isNotFound(error)) {\n throw error;\n }\n }\n\n const wrapped = `${startMarker}\\n${block.trim()}\\n${endMarker}`;\n const markerPattern = new RegExp(`${escapeRegex(startMarker)}[\\\\s\\\\S]*?${escapeRegex(endMarker)}`);\n const next = markerPattern.test(existing)\n ? existing.replace(markerPattern, wrapped)\n : `${existing.trimEnd()}${existing.trim() ? \"\\n\\n\" : \"\"}${wrapped}\\n`;\n await fs.writeFile(filePath, next);\n}\n\nfunction codexBlock(): string {\n return `\n## Cofactor Memory\n\nUse \\`cofactor petri --json\\` before broad research or implementation work in this repository to load the local knowledge graph. Use \\`cofactor catalyze \"<question>\" --json\\` when the current task needs relevant notes, decisions, or cross-corpus context. The same tools are exposed over stdio with \\`cofactor mcp\\`. The index lives in \\`${STORE_DIR}/\\`; refresh it with \\`cofactor init\\` after substantial note changes.\n`;\n}\n\nfunction claudeBlock(): string {\n return `\n## Cofactor Memory\n\nBefore broad reasoning tasks, run \\`cofactor petri --json\\` to inspect local entities and catalysts. For a specific question, run \\`cofactor catalyze \"<question>\" --json\\` and use the returned catalysts plus documents as working memory. Claude Desktop can also run \\`cofactor mcp\\` as a stdio MCP server. Refresh the index with \\`cofactor init\\` when notes change.\n`;\n}\n\nfunction codexSkill(): string {\n return `---\nname: cofactor\ndescription: Use local Cofactor memory before repository research, planning, or implementation tasks.\n---\n\nRun \\`cofactor petri --json\\` to inspect indexed entities and catalysts for the current repository. Run \\`cofactor catalyze \"<question>\" --json\\` to retrieve the most relevant indexed notes for a specific task. Use \\`cofactor mcp\\` when a client supports Model Context Protocol tools over stdio.\n`;\n}\n\nfunction escapeRegex(text: string): string {\n return text.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction isNotFound(error: unknown): boolean {\n return Boolean(error && typeof error === \"object\" && \"code\" in error && error.code === \"ENOENT\");\n}\n","import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { z } from \"zod\";\n\nimport { catalyze, petri } from \"./search.js\";\n\nexport async function runMcpServer(defaultVaultPath = process.cwd()): Promise<void> {\n const server = new McpServer({\n name: \"cofactor\",\n version: \"0.1.0\",\n });\n\n server.registerTool(\n \"petri\",\n {\n description:\n \"Inspect the local Cofactor entity/catalyst graph for working memory before broad reasoning tasks.\",\n inputSchema: {\n query: z.string().optional().describe(\"Optional query for narrowing entities and catalysts.\"),\n vaultPath: z.string().optional().describe(\"Path to the indexed vault. Defaults to the server cwd.\"),\n },\n },\n async ({ query, vaultPath }) => {\n const response = await petri(vaultPath ?? defaultVaultPath, query);\n return {\n content: [\n {\n text: JSON.stringify(response, null, 2),\n type: \"text\",\n },\n ],\n };\n },\n );\n\n server.registerTool(\n \"catalyze\",\n {\n description:\n \"Search an indexed local corpus through precomputed catalyst questions and return relevant documents.\",\n inputSchema: {\n limit: z.number().int().positive().optional().describe(\"Maximum number of results.\"),\n query: z.string().min(1).describe(\"Search question.\"),\n target: z.string().optional().describe(\"Optional applied target id, path, or basename.\"),\n vaultPath: z.string().optional().describe(\"Path to the indexed vault. Defaults to the server cwd.\"),\n },\n },\n async ({ limit, query, target, vaultPath }) => {\n const response = await catalyze(query, {\n limit,\n target,\n vaultPath: vaultPath ?? defaultVaultPath,\n });\n return {\n content: [\n {\n text: JSON.stringify(response, null, 2),\n type: \"text\",\n },\n ],\n };\n },\n );\n\n const transport = new StdioServerTransport();\n await server.connect(transport);\n}\n","import path from \"node:path\";\n\nimport type {\n Catalyst,\n CatalystMatch,\n GardenChunk,\n GardenIndex,\n PetriResponse,\n SearchOptions,\n SearchResponse,\n SearchResult,\n} from \"../types.js\";\nimport { snippet } from \"./text.js\";\nimport { recencyScore } from \"./time.js\";\nimport { readIndex, readTargetIndex } from \"./store.js\";\nimport { cosine, vectorizeText } from \"./vector.js\";\n\nexport async function catalyze(query: string, options: SearchOptions = {}): Promise<SearchResponse> {\n const vaultPath = path.resolve(options.vaultPath ?? process.cwd());\n const index = options.target ? await readTargetIndex(vaultPath, options.target) : await readIndex(vaultPath);\n return searchIndex(index, query, {\n limit: options.limit ?? index.config.maxResults,\n target: options.target,\n vaultPath,\n });\n}\n\nexport function searchIndex(\n index: GardenIndex,\n query: string,\n options: Required<Pick<SearchOptions, \"limit\">> & Pick<SearchOptions, \"target\" | \"vaultPath\">,\n): SearchResponse {\n const queryVector = vectorizeText(query, index.idf);\n const catalystMatches = rankCatalysts(index.catalysts, queryVector).slice(0, 10);\n const catalystChunkScores = new Map<string, Array<{ catalyst: Catalyst; score: number }>>();\n\n for (const match of catalystMatches) {\n for (const linkedChunk of match.catalyst.topChunks) {\n const weightedScore = linkedChunk.score * match.score;\n const list = catalystChunkScores.get(linkedChunk.chunkId) ?? [];\n list.push({ catalyst: match.catalyst, score: weightedScore });\n catalystChunkScores.set(linkedChunk.chunkId, list);\n }\n }\n\n const scored = index.chunks\n .map((chunk) => scoreChunk(chunk, queryVector, catalystChunkScores.get(chunk.id) ?? [], index))\n .filter((result) => result.score > 0)\n .sort((a, b) => b.score - a.score)\n .slice(0, options.limit);\n\n return {\n catalysts: catalystMatches.slice(0, 5),\n query,\n results: scored.map((result) => ({\n catalystIds: result.catalystIds,\n content: snippet(result.chunk.content),\n filePath: result.chunk.filePath,\n score: Number(result.score.toFixed(6)),\n title: result.chunk.title,\n })),\n target: options.target,\n vaultPath: options.vaultPath ?? index.vaultPath,\n };\n}\n\nexport async function petri(vaultPathInput = process.cwd(), query?: string): Promise<PetriResponse> {\n const vaultPath = path.resolve(vaultPathInput);\n const index = await readIndex(vaultPath);\n if (!query) {\n return {\n appliedTargets: index.appliedTargets,\n catalysts: index.catalysts.slice(0, 24),\n entities: index.entities,\n stats: index.stats,\n vaultPath,\n };\n }\n\n const queryVector = vectorizeText(query, index.idf);\n const catalystMatches = rankCatalysts(index.catalysts, queryVector).slice(0, 20);\n const catalystIds = new Set(catalystMatches.map((match) => match.catalyst.id));\n const entityIds = new Set(catalystMatches.map((match) => match.catalyst.entityId));\n\n return {\n appliedTargets: index.appliedTargets,\n catalysts: index.catalysts.filter((catalyst) => catalystIds.has(catalyst.id)).slice(0, 20),\n entities: index.entities.filter((entity) => entityIds.has(entity.id)).slice(0, 12),\n query,\n stats: index.stats,\n vaultPath,\n };\n}\n\nfunction rankCatalysts(catalysts: Catalyst[], queryVector: Record<string, number>): CatalystMatch[] {\n return catalysts\n .map((catalyst) => ({\n catalyst,\n score: cosine(queryVector, catalyst.vector),\n }))\n .filter((match) => match.score > 0)\n .sort((a, b) => b.score - a.score);\n}\n\nfunction scoreChunk(\n chunk: GardenChunk,\n queryVector: Record<string, number>,\n catalystMatches: Array<{ catalyst: Catalyst; score: number }>,\n index: GardenIndex,\n): { catalystIds: string[]; chunk: GardenChunk; score: number } {\n const directScore = cosine(queryVector, chunk.vector);\n const catalystScore = catalystMatches.reduce((max, match) => Math.max(max, match.score), 0);\n const recency = recencyScore(chunk.modifiedAt, index.config.recencyHalfLifeDays);\n const relevance = directScore + catalystScore;\n const score = relevance > 0 ? directScore * 0.58 + catalystScore * 0.92 + recency * 0.04 : 0;\n const catalystIds = [...new Set(catalystMatches.map((match) => match.catalyst.id))].slice(0, 5);\n\n return {\n catalystIds,\n chunk,\n score,\n };\n}\n\nexport function formatSearchResults(response: SearchResponse): string {\n const payload = {\n catalysts: response.catalysts.map((match) => ({\n entity: match.catalyst.entityName,\n id: match.catalyst.id,\n score: Number(match.score.toFixed(6)),\n text: match.catalyst.text,\n })),\n query: response.query,\n results: response.results,\n target: response.target,\n vaultPath: response.vaultPath,\n };\n\n return JSON.stringify(payload, null, 2);\n}\n\nexport function formatPetri(response: PetriResponse): string {\n return JSON.stringify(response, null, 2);\n}\n\nexport function summarizeResults(results: SearchResult[]): string {\n if (results.length === 0) {\n return \"No matching documents found.\";\n }\n\n return results\n .map((result, index) => {\n const relative = path.relative(process.cwd(), result.filePath);\n return `${index + 1}. ${result.title} (${relative}) score=${result.score}`;\n })\n .join(\"\\n\");\n}\n"],"mappings":"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","names":["path","path","entityId","path","path","path","fs","path","path","targetId","fs","crypto","path","path","crypto","fs","path","path","fs","isNotFound","path","path","path"]}
@@ -0,0 +1,171 @@
1
+ type EntityType = "tag" | "link" | "folder";
2
+ type ActivityTrend = "rising" | "active" | "stable" | "dormant";
3
+ type Vector = Record<string, number>;
4
+ interface IndexConfig {
5
+ chunkOverlapWords: number;
6
+ chunkSizeWords: number;
7
+ excludedDirs: string[];
8
+ extensions: string[];
9
+ maxFiles: number;
10
+ maxResults: number;
11
+ minEntityDocuments: number;
12
+ recencyHalfLifeDays: number;
13
+ selectedEntityLimit: number;
14
+ }
15
+ interface Frontmatter {
16
+ [key: string]: string | string[] | undefined;
17
+ }
18
+ interface GardenDocument {
19
+ content: string;
20
+ createdAt: string;
21
+ entities: string[];
22
+ folders: string[];
23
+ frontmatter: Frontmatter;
24
+ id: string;
25
+ links: string[];
26
+ modifiedAt: string;
27
+ path: string;
28
+ relativePath: string;
29
+ tags: string[];
30
+ title: string;
31
+ wordCount: number;
32
+ }
33
+ interface GardenChunk {
34
+ content: string;
35
+ createdAt: string;
36
+ docId: string;
37
+ entities: string[];
38
+ filePath: string;
39
+ id: string;
40
+ modifiedAt: string;
41
+ ordinal: number;
42
+ relativePath: string;
43
+ title: string;
44
+ tokens: string[];
45
+ vector: Vector;
46
+ }
47
+ interface EntitySummary {
48
+ activityTrend: ActivityTrend;
49
+ catalystIds: string[];
50
+ chunkCount: number;
51
+ documentCount: number;
52
+ firstSeen: string;
53
+ frequency12m: number;
54
+ id: string;
55
+ lastSeen: string;
56
+ name: string;
57
+ score: number;
58
+ topTerms: string[];
59
+ type: EntityType;
60
+ }
61
+ interface Catalyst {
62
+ context: string;
63
+ entityId: string;
64
+ entityName: string;
65
+ entityType: EntityType;
66
+ era: string;
67
+ id: string;
68
+ terms: string[];
69
+ text: string;
70
+ topChunks: Array<{
71
+ chunkId: string;
72
+ score: number;
73
+ }>;
74
+ vector: Vector;
75
+ }
76
+ interface AppliedTarget {
77
+ appliedAt: string;
78
+ docCount: number;
79
+ id: string;
80
+ indexPath: string;
81
+ path: string;
82
+ }
83
+ interface IndexStats {
84
+ catalystCount: number;
85
+ chunkCount: number;
86
+ documentCount: number;
87
+ entityCount: number;
88
+ }
89
+ interface GardenIndex {
90
+ appliedTargets: AppliedTarget[];
91
+ catalysts: Catalyst[];
92
+ chunks: GardenChunk[];
93
+ config: IndexConfig;
94
+ documents: GardenDocument[];
95
+ entities: EntitySummary[];
96
+ generatedAt: string;
97
+ idf: Vector;
98
+ kind: "vault" | "target";
99
+ sourceVaultPath?: string;
100
+ stats: IndexStats;
101
+ targetPath?: string;
102
+ vaultPath: string;
103
+ version: string;
104
+ }
105
+ interface IndexOptions {
106
+ config?: Partial<IndexConfig>;
107
+ quiet?: boolean;
108
+ }
109
+ interface SearchOptions {
110
+ limit?: number;
111
+ target?: string;
112
+ vaultPath?: string;
113
+ }
114
+ interface CatalystMatch {
115
+ catalyst: Catalyst;
116
+ score: number;
117
+ }
118
+ interface SearchResult {
119
+ catalystIds: string[];
120
+ content: string;
121
+ filePath: string;
122
+ score: number;
123
+ title: string;
124
+ }
125
+ interface SearchResponse {
126
+ catalysts: CatalystMatch[];
127
+ query: string;
128
+ results: SearchResult[];
129
+ target?: string;
130
+ vaultPath: string;
131
+ }
132
+ interface PetriResponse {
133
+ appliedTargets: AppliedTarget[];
134
+ catalysts: Catalyst[];
135
+ entities: EntitySummary[];
136
+ query?: string;
137
+ stats: IndexStats;
138
+ vaultPath: string;
139
+ }
140
+ interface ApplyResponse {
141
+ target: AppliedTarget;
142
+ targetIndex: GardenIndex;
143
+ vaultIndex: GardenIndex;
144
+ }
145
+
146
+ declare function applyCorpus(vaultPath: string, targetPathInput: string, options?: IndexOptions): Promise<ApplyResponse>;
147
+
148
+ type AgentName = "codex" | "claude";
149
+ declare function installAgentInstructions(vaultPathInput: string, agent: AgentName): Promise<{
150
+ files: string[];
151
+ }>;
152
+
153
+ declare function createIndex(vaultPath: string, options?: IndexOptions, kind?: "vault" | "target", sourceVaultPath?: string): Promise<GardenIndex>;
154
+
155
+ declare function runMcpServer(defaultVaultPath?: string): Promise<void>;
156
+
157
+ declare function catalyze(query: string, options?: SearchOptions): Promise<SearchResponse>;
158
+ declare function searchIndex(index: GardenIndex, query: string, options: Required<Pick<SearchOptions, "limit">> & Pick<SearchOptions, "target" | "vaultPath">): SearchResponse;
159
+ declare function petri(vaultPathInput?: string, query?: string): Promise<PetriResponse>;
160
+ declare function formatSearchResults(response: SearchResponse): string;
161
+ declare function formatPetri(response: PetriResponse): string;
162
+
163
+ declare function readConfig(vaultPath: string): Promise<IndexConfig>;
164
+ declare function readIndex(vaultPath: string): Promise<GardenIndex>;
165
+ declare function readTargetIndex(vaultPath: string, target: string): Promise<GardenIndex>;
166
+
167
+ declare function indexVault(vaultPathInput?: string, options?: IndexOptions): Promise<GardenIndex>;
168
+ declare function loadIndex(vaultPathInput?: string): Promise<GardenIndex>;
169
+ declare function refreshVault(vaultPathInput?: string, options?: IndexOptions): Promise<GardenIndex>;
170
+
171
+ export { type ActivityTrend, type AppliedTarget, type ApplyResponse, type Catalyst, type CatalystMatch, type EntitySummary, type EntityType, type Frontmatter, type GardenChunk, type GardenDocument, type GardenIndex, type IndexConfig, type IndexOptions, type IndexStats, type PetriResponse, type SearchOptions, type SearchResponse, type SearchResult, type Vector, applyCorpus, catalyze, createIndex, formatPetri, formatSearchResults, indexVault, installAgentInstructions, loadIndex, petri, readConfig, readIndex, readTargetIndex, refreshVault, runMcpServer, searchIndex };