searchsocket 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli.ts","../package.json","../src/config/load.ts","../src/config/schema.ts","../src/config/defaults.ts","../src/errors/index.ts","../src/core/logger.ts","../src/core/scope.ts","../src/utils/text.ts","../src/core/state.ts","../src/embeddings/openai.ts","../src/embeddings/factory.ts","../src/indexing/pipeline.ts","../src/vector/factory.ts","../src/vector/turso.ts","../src/utils/hash.ts","../src/utils/path.ts","../src/indexing/chunker.ts","../src/indexing/extractor.ts","../src/indexing/mirror.ts","../src/indexing/route-mapper.ts","../src/indexing/sources/build/index.ts","../src/indexing/sources/build/manifest-parser.ts","../src/indexing/sources/build/preview-server.ts","../src/indexing/sources/content-files.ts","../src/indexing/sources/crawl.ts","../src/indexing/sources/static-output.ts","../src/utils/time.ts","../src/mcp/server.ts","../src/search/engine.ts","../src/rerank/jina.ts","../src/rerank/factory.ts","../src/search/ranking.ts"],"sourcesContent":["import fs from \"node:fs\";\nimport fsp from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { execSync } from \"node:child_process\";\nimport { config as dotenvConfig } from \"dotenv\";\nimport chokidar from \"chokidar\";\nimport { Command } from \"commander\";\nimport pkg from \"../package.json\";\nimport { writeMinimalConfig, loadConfig, mergeConfig } from \"./config/load\";\nimport { Logger } from \"./core/logger\";\nimport { resolveScope } from \"./core/scope\";\nimport { ensureStateDirs } from \"./core/state\";\nimport { createEmbeddingsProvider } from \"./embeddings\";\nimport { SearchSocketError } from \"./errors\";\nimport { IndexPipeline } from \"./indexing/pipeline\";\nimport { runMcpServer } from \"./mcp/server\";\nimport { SearchEngine } from \"./search/engine\";\nimport { createVectorStore } from \"./vector\";\nimport { sanitizeScopeName } from \"./utils/text\";\nimport type { IndexStats, ResolvedSearchSocketConfig, Scope, ScopeInfo, VectorStore } from \"./types\";\n\ninterface RootCommandOptions {\n cwd?: string;\n config?: string;\n}\n\nfunction parsePositiveInt(value: string, flag: string): number {\n const parsed = Number(value);\n if (!Number.isInteger(parsed) || parsed <= 0) {\n throw new SearchSocketError(\"INVALID_REQUEST\", `${flag} must be a positive integer`, 400);\n }\n return parsed;\n}\n\nfunction parseDurationMs(value: string): number {\n const match = value.trim().match(/^(\\d+)(ms|s|m|h|d)$/i);\n if (!match) {\n throw new SearchSocketError(\n \"INVALID_REQUEST\",\n \"Duration must look like 30d, 12h, 15m, 45s, or 500ms\",\n 400\n );\n }\n\n const amount = Number(match[1]);\n const unit = (match[2] ?? \"\").toLowerCase();\n\n switch (unit) {\n case \"ms\":\n return amount;\n case \"s\":\n return amount * 1000;\n case \"m\":\n return amount * 60_000;\n case \"h\":\n return amount * 3_600_000;\n case \"d\":\n return amount * 86_400_000;\n default:\n throw new SearchSocketError(\"INVALID_REQUEST\", `Unsupported duration unit: ${unit}`, 400);\n }\n}\n\nfunction formatUsd(value: number): string {\n return `$${value.toFixed(6)}`;\n}\n\nfunction printIndexSummary(stats: IndexStats): void {\n process.stdout.write(`pages processed: ${stats.pagesProcessed}\\n`);\n process.stdout.write(`chunks total: ${stats.chunksTotal}\\n`);\n process.stdout.write(`chunks changed: ${stats.chunksChanged}\\n`);\n process.stdout.write(`embeddings created: ${stats.newEmbeddings}\\n`);\n process.stdout.write(`deletes: ${stats.deletes}\\n`);\n process.stdout.write(`estimated tokens: ${stats.estimatedTokens}\\n`);\n process.stdout.write(`estimated cost (USD): ${formatUsd(stats.estimatedCostUSD)}\\n`);\n process.stdout.write(`route mapping: ${stats.routeExact} exact, ${stats.routeBestEffort} best-effort\\n`);\n process.stdout.write(\"stage timings (ms):\\n\");\n for (const [stage, ms] of Object.entries(stats.stageTimingsMs)) {\n process.stdout.write(` ${stage}: ${ms}\\n`);\n }\n}\n\nfunction collectWatchPaths(config: ResolvedSearchSocketConfig, cwd: string): string[] {\n const paths = [\"src/routes/**\"];\n\n if (config.source.mode === \"content-files\" && config.source.contentFiles) {\n for (const pattern of config.source.contentFiles.globs) {\n paths.push(path.join(config.source.contentFiles.baseDir, pattern));\n }\n }\n\n if (config.source.mode === \"static-output\") {\n paths.push(config.source.staticOutputDir);\n }\n\n if (config.source.mode === \"crawl\") {\n // crawl mode has no local source files; route files still trigger reindex\n paths.push(\"searchsocket.config.ts\");\n }\n\n if (config.source.mode === \"build\" && config.source.build) {\n paths.push(\"searchsocket.config.ts\");\n paths.push(config.source.build.outputDir);\n }\n\n return paths.map((value) => path.resolve(cwd, value));\n}\n\nfunction ensureStateDir(cwd: string): string {\n const target = path.join(cwd, \".searchsocket\");\n fs.mkdirSync(target, { recursive: true });\n return target;\n}\n\nfunction ensureGitignore(cwd: string): void {\n const gitignorePath = path.join(cwd, \".gitignore\");\n const entries = [\n \".searchsocket/vectors.db\",\n \".searchsocket/vectors.db-shm\",\n \".searchsocket/vectors.db-wal\",\n \".searchsocket/manifest.json\",\n \".searchsocket/registry.json\"\n ];\n\n let content = \"\";\n if (fs.existsSync(gitignorePath)) {\n content = fs.readFileSync(gitignorePath, \"utf8\");\n }\n\n const lines = content.split(\"\\n\");\n const missing = entries.filter((entry) => !lines.some((line) => line.trim() === entry));\n\n if (missing.length === 0) {\n return;\n }\n\n const block = `\\n# SearchSocket local state\\n${missing.join(\"\\n\")}\\n`;\n fs.writeFileSync(gitignorePath, content.trimEnd() + block, \"utf8\");\n}\n\nfunction readScopesFromFile(filePath: string): Set<string> {\n const raw = fs.readFileSync(filePath, \"utf8\");\n return new Set(\n raw\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean)\n );\n}\n\nfunction readRemoteGitBranches(cwd: string): Set<string> {\n try {\n const output = execSync(\"git branch -r --format='%(refname:short)'\", {\n cwd,\n encoding: \"utf8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"]\n });\n\n const scopes = output\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean)\n .map((line) => line.replace(/^origin\\//, \"\"));\n\n if (scopes.length <= 1) {\n process.stdout.write(\n \"warning: git branch -r returned 1 or fewer branches. \" +\n \"If running in CI, ensure the checkout step uses fetch-depth: 0 \" +\n \"to avoid accidentally pruning active branch scopes.\\n\"\n );\n }\n\n return new Set(scopes);\n } catch {\n return new Set();\n }\n}\n\nasync function loadResolvedConfigForDev(cwd: string, configPath?: string): Promise<ResolvedSearchSocketConfig> {\n const resolvedConfigPath = path.resolve(cwd, configPath ?? \"searchsocket.config.ts\");\n if (fs.existsSync(resolvedConfigPath)) {\n return loadConfig({ cwd, configPath });\n }\n\n return mergeConfig(cwd, {});\n}\n\nfunction getRootOptions(command: Command): RootCommandOptions {\n const maybeParent = command.parent as Command | undefined;\n const optsFn = maybeParent?.opts;\n if (typeof optsFn !== \"function\") {\n return {};\n }\n\n return optsFn.call(maybeParent) as RootCommandOptions;\n}\n\nasync function runIndexCommand(opts: {\n cwd: string;\n configPath?: string;\n scope?: string;\n changedOnly: boolean;\n force: boolean;\n dryRun: boolean;\n source?: \"static-output\" | \"crawl\" | \"content-files\" | \"build\";\n maxPages?: number;\n maxChunks?: number;\n verbose?: boolean;\n json?: boolean;\n}): Promise<void> {\n const logger = new Logger({\n verbose: opts.verbose,\n json: opts.json\n });\n\n const pipeline = await IndexPipeline.create({\n cwd: opts.cwd,\n configPath: opts.configPath,\n logger\n });\n\n const stats = await pipeline.run({\n scopeOverride: opts.scope,\n changedOnly: opts.changedOnly,\n force: opts.force,\n dryRun: opts.dryRun,\n sourceOverride: opts.source,\n maxPages: opts.maxPages,\n maxChunks: opts.maxChunks,\n verbose: opts.verbose\n });\n\n if (opts.json) {\n process.stdout.write(`${JSON.stringify(stats, null, 2)}\\n`);\n return;\n }\n\n printIndexSummary(stats);\n}\n\nconst program = new Command();\n\nprogram\n .name(\"searchsocket\")\n .description(\"Semantic site search and MCP retrieval for SvelteKit\")\n .version(pkg.version)\n .option(\"-C, --cwd <path>\", \"working directory\", process.cwd())\n .option(\"--config <path>\", \"config path (defaults to searchsocket.config.ts)\");\n\nprogram\n .command(\"init\")\n .description(\"Create searchsocket.config.ts and .searchsocket state directory\")\n .action(async (_opts, command) => {\n const root = getRootOptions(command).cwd ?? process.cwd();\n const cwd = path.resolve(root);\n\n const configPath = writeMinimalConfig(cwd);\n const stateDir = ensureStateDir(cwd);\n ensureGitignore(cwd);\n\n process.stdout.write(`created/verified config: ${configPath}\\n`);\n process.stdout.write(`created/verified state dir: ${stateDir}\\n\\n`);\n\n process.stdout.write(\"SvelteKit hook snippet:\\n\\n\");\n process.stdout.write('import { searchsocketHandle } from \"searchsocket/sveltekit\";\\n\\n');\n process.stdout.write(\"export const handle = searchsocketHandle();\\n\\n\");\n\n process.stdout.write(\"Optional build-triggered indexing plugin:\\n\\n\");\n process.stdout.write('import { searchsocketVitePlugin } from \"searchsocket/sveltekit\";\\n\\n');\n process.stdout.write(\"// svelte.config.js / vite plugins:\\n\");\n process.stdout.write(\"// searchsocketVitePlugin({ enabled: true, changedOnly: true })\\n\");\n process.stdout.write(\"// or env-driven: SEARCHSOCKET_AUTO_INDEX=1 pnpm build\\n\");\n });\n\nprogram\n .command(\"index\")\n .description(\"Index site content into markdown mirror + vector store\")\n .option(\"--scope <name>\", \"scope override\")\n .option(\"--changed-only\", \"only process changed chunks\", true)\n .option(\"--no-changed-only\", \"re-index regardless of previous manifest\")\n .option(\"--force\", \"force full mirror rebuild and re-upsert\", false)\n .option(\"--dry-run\", \"compute plan and cost, no API writes\", false)\n .option(\"--source <mode>\", \"source mode override: static-output|crawl|content-files|build\")\n .option(\"--max-pages <n>\", \"limit pages processed\")\n .option(\"--max-chunks <n>\", \"limit chunks processed\")\n .option(\"--verbose\", \"verbose output\", false)\n .option(\"--json\", \"emit JSON logs and summary\", false)\n .action(async (opts, command) => {\n const rootOpts = getRootOptions(command);\n const cwd = path.resolve(rootOpts?.cwd ?? process.cwd());\n\n await runIndexCommand({\n cwd,\n configPath: rootOpts?.config,\n scope: opts.scope,\n changedOnly: opts.changedOnly,\n force: opts.force,\n dryRun: opts.dryRun,\n source: opts.source,\n maxPages: opts.maxPages ? parsePositiveInt(opts.maxPages, \"--max-pages\") : undefined,\n maxChunks: opts.maxChunks ? parsePositiveInt(opts.maxChunks, \"--max-chunks\") : undefined,\n verbose: opts.verbose,\n json: opts.json\n });\n });\n\nprogram\n .command(\"status\")\n .description(\"Show scope, indexing state, backend health, and recent cost estimate\")\n .option(\"--scope <name>\", \"scope override\")\n .action(async (opts, command) => {\n const rootOpts = getRootOptions(command);\n const cwd = path.resolve(rootOpts?.cwd ?? process.cwd());\n\n const config = await loadConfig({ cwd, configPath: rootOpts?.config });\n const scope = resolveScope(config, opts.scope);\n\n let vectorStore: VectorStore;\n let health: { ok: boolean; details?: string } = { ok: false, details: \"not checked\" };\n try {\n vectorStore = await createVectorStore(config, cwd);\n health = await vectorStore.health();\n } catch (error) {\n health = {\n ok: false,\n details: error instanceof Error ? error.message : \"unknown error\"\n };\n process.stdout.write(`project: ${config.project.id}\\n`);\n process.stdout.write(`vector health: error (${health.details})\\n`);\n process.exitCode = 1;\n return;\n }\n\n let scopeRegistry: ScopeInfo[] = [];\n let scopeInfo: ScopeInfo | undefined;\n let hashes: Map<string, string> = new Map();\n\n try {\n scopeRegistry = await vectorStore.listScopes(config.project.id);\n scopeInfo = scopeRegistry.find((entry) => entry.scopeName === scope.scopeName);\n hashes = await vectorStore.getContentHashes(scope);\n } catch (error) {\n process.stdout.write(`project: ${config.project.id}\\n`);\n process.stdout.write(`resolved scope: ${scope.scopeName}\\n`);\n process.stdout.write(`vector health: error (${error instanceof Error ? error.message : \"unknown error\"})\\n`);\n process.exitCode = 1;\n return;\n }\n\n process.stdout.write(`project: ${config.project.id}\\n`);\n process.stdout.write(`resolved scope: ${scope.scopeName}\\n`);\n process.stdout.write(`embedding model: ${config.embeddings.model}\\n`);\n const tursoUrl = process.env[config.vector.turso.urlEnv];\n const vectorMode = tursoUrl ? `remote (${tursoUrl})` : `local (${config.vector.turso.localPath})`;\n process.stdout.write(`vector backend: turso/libsql (${vectorMode})\\n`);\n process.stdout.write(`vector health: ${health.ok ? \"ok\" : `error (${health.details ?? \"n/a\"})`}\\n`);\n\n if (scopeInfo) {\n process.stdout.write(`last indexed (${scope.scopeName}): ${scopeInfo.lastIndexedAt ?? \"never\"}\\n`);\n process.stdout.write(`tracked chunks: ${hashes.size}\\n`);\n if (scopeInfo.lastEstimateTokens != null) {\n process.stdout.write(`last estimated tokens: ${scopeInfo.lastEstimateTokens}\\n`);\n }\n if (scopeInfo.lastEstimateCostUSD != null) {\n process.stdout.write(`last estimated cost: ${formatUsd(scopeInfo.lastEstimateCostUSD)}\\n`);\n }\n } else {\n process.stdout.write(`last indexed (${scope.scopeName}): never\\n`);\n }\n\n if (scopeRegistry.length > 0) {\n process.stdout.write(\"\\nregistry scopes:\\n\");\n for (const item of scopeRegistry) {\n process.stdout.write(\n ` - ${item.scopeName} model=${item.modelId} lastIndexedAt=${item.lastIndexedAt} vectors=${item.vectorCount ?? \"unknown\"}\\n`\n );\n }\n }\n });\n\nprogram\n .command(\"dev\")\n .description(\"Watch content files/routes and incrementally reindex on changes\")\n .option(\"--scope <name>\", \"scope override\")\n .option(\"--mcp\", \"start MCP server (http transport) alongside watcher\", false)\n .option(\"--mcp-port <n>\", \"MCP HTTP port\", \"3338\")\n .option(\"--mcp-path <path>\", \"MCP HTTP path\", \"/mcp\")\n .option(\"--verbose\", \"verbose logs\", false)\n .action(async (opts, command) => {\n const rootOpts = getRootOptions(command);\n const cwd = path.resolve(rootOpts?.cwd ?? process.cwd());\n\n const config = await loadResolvedConfigForDev(cwd, rootOpts?.config);\n const watchPaths = collectWatchPaths(config, cwd);\n\n process.stdout.write(\"starting searchsocket dev watcher...\\n\");\n process.stdout.write(`watching:\\n${watchPaths.map((entry) => ` - ${entry}`).join(\"\\n\")}\\n`);\n\n let running = false;\n let pending = false;\n let timer: NodeJS.Timeout | null = null;\n\n const run = async (): Promise<void> => {\n if (running) {\n pending = true;\n return;\n }\n\n running = true;\n try {\n await runIndexCommand({\n cwd,\n configPath: rootOpts?.config,\n scope: opts.scope,\n changedOnly: true,\n force: false,\n dryRun: false,\n verbose: opts.verbose,\n json: false\n });\n } catch (error) {\n process.stderr.write(`index error: ${error instanceof Error ? error.message : String(error)}\\n`);\n } finally {\n running = false;\n if (pending) {\n pending = false;\n await run();\n }\n }\n };\n\n await run();\n\n const watcher = chokidar.watch(watchPaths, {\n ignoreInitial: true\n });\n\n watcher.on(\"all\", (event, changedPath) => {\n process.stdout.write(`detected ${event}: ${changedPath}\\n`);\n\n if (timer) {\n clearTimeout(timer);\n }\n\n timer = setTimeout(() => {\n void run();\n }, 350);\n });\n\n if (opts.mcp) {\n void runMcpServer({\n cwd,\n configPath: rootOpts?.config,\n transport: \"http\",\n httpPort: parsePositiveInt(opts.mcpPort, \"--mcp-port\"),\n httpPath: opts.mcpPath\n });\n }\n\n await new Promise<void>((resolve) => {\n process.on(\"SIGINT\", () => {\n void watcher.close().then(() => resolve());\n });\n });\n });\n\nprogram\n .command(\"clean\")\n .description(\"Delete local state and optionally delete remote vectors for a scope\")\n .option(\"--scope <name>\", \"scope override\")\n .option(\"--remote\", \"delete remote scope vectors\", false)\n .action(async (opts, command) => {\n const rootOpts = getRootOptions(command);\n const cwd = path.resolve(rootOpts?.cwd ?? process.cwd());\n\n const config = await loadConfig({ cwd, configPath: rootOpts?.config });\n const scope = resolveScope(config, opts.scope);\n\n const statePath = path.join(cwd, config.state.dir);\n await fsp.rm(statePath, { recursive: true, force: true });\n process.stdout.write(`deleted local state directory: ${statePath}\\n`);\n\n if (opts.remote) {\n const vectorStore = await createVectorStore(config, cwd);\n await vectorStore.deleteScope(scope);\n process.stdout.write(`deleted remote vectors for scope ${scope.scopeName}\\n`);\n }\n });\n\nprogram\n .command(\"prune\")\n .description(\"List/delete stale scopes (dry-run by default)\")\n .option(\"--apply\", \"apply deletions\", false)\n .option(\"--scopes-file <path>\", \"file containing active scopes\")\n .option(\"--older-than <duration>\", \"ttl cutoff like 30d\")\n .action(async (opts, command) => {\n const rootOpts = getRootOptions(command);\n const cwd = path.resolve(rootOpts?.cwd ?? process.cwd());\n\n const config = await loadConfig({ cwd, configPath: rootOpts?.config });\n const baseScope = resolveScope(config);\n\n let vectorStore: VectorStore;\n let scopes: ScopeInfo[];\n try {\n vectorStore = await createVectorStore(config, cwd);\n scopes = await vectorStore.listScopes(config.project.id);\n } catch (error) {\n process.stderr.write(\n `error: failed to access Turso vector store: ${error instanceof Error ? error.message : String(error)}\\n`\n );\n process.exitCode = 1;\n return;\n }\n\n process.stdout.write(`using remote registry\\n`);\n\n let keepScopes = new Set<string>();\n if (opts.scopesFile) {\n keepScopes = readScopesFromFile(path.resolve(cwd, opts.scopesFile));\n } else {\n keepScopes = readRemoteGitBranches(cwd);\n }\n\n if (config.scope.sanitize && keepScopes.size > 0) {\n keepScopes = new Set([...keepScopes].map(sanitizeScopeName));\n }\n\n const olderThanMs = opts.olderThan ? parseDurationMs(opts.olderThan) : undefined;\n const now = Date.now();\n\n const stale = scopes.filter((entry) => {\n if (entry.scopeName === \"main\") {\n return false;\n }\n\n let staleByList = false;\n if (keepScopes.size > 0) {\n staleByList = !keepScopes.has(entry.scopeName);\n }\n\n let staleByTtl = false;\n if (olderThanMs) {\n staleByTtl = now - Date.parse(entry.lastIndexedAt) > olderThanMs;\n }\n\n if (keepScopes.size > 0 && olderThanMs) {\n return staleByList || staleByTtl;\n }\n\n if (keepScopes.size > 0) {\n return staleByList;\n }\n\n if (olderThanMs) {\n return staleByTtl;\n }\n\n return false;\n });\n\n if (stale.length === 0) {\n process.stdout.write(\"no stale scopes found\\n\");\n return;\n }\n\n process.stdout.write(`stale scopes (${stale.length}):\\n`);\n for (const entry of stale) {\n process.stdout.write(` - ${entry.scopeName} lastIndexedAt=${entry.lastIndexedAt}\\n`);\n }\n\n if (!opts.apply) {\n process.stdout.write(\"dry-run only. pass --apply to delete these scopes.\\n\");\n return;\n }\n\n let deleted = 0;\n for (const entry of stale) {\n const scope: Scope = {\n projectId: config.project.id,\n scopeName: entry.scopeName,\n scopeId: `${config.project.id}:${entry.scopeName}`\n };\n\n try {\n await vectorStore.deleteScope(scope);\n deleted += 1;\n } catch (error) {\n process.stdout.write(\n `failed to delete scope ${entry.scopeName}: ${error instanceof Error ? error.message : String(error)}\\n`\n );\n }\n }\n\n process.stdout.write(`deleted scopes: ${deleted}\\n`);\n if (baseScope.scopeName === \"main\") {\n process.stdout.write(\"main scope retained\\n\");\n }\n });\n\nprogram\n .command(\"doctor\")\n .description(\"Validate config, env vars, provider connectivity, and local write access\")\n .action(async (_opts, command) => {\n const rootOpts = getRootOptions(command);\n const cwd = path.resolve(rootOpts?.cwd ?? process.cwd());\n\n const checks: Array<{ name: string; ok: boolean; details?: string }> = [];\n\n let config: ResolvedSearchSocketConfig | null = null;\n try {\n config = await loadConfig({ cwd, configPath: rootOpts?.config });\n checks.push({ name: \"config parse\", ok: true });\n } catch (error) {\n checks.push({\n name: \"config parse\",\n ok: false,\n details: error instanceof Error ? error.message : \"unknown error\"\n });\n }\n\n if (config) {\n const embKey = process.env[config.embeddings.apiKeyEnv];\n checks.push({\n name: `env ${config.embeddings.apiKeyEnv}`,\n ok: Boolean(embKey),\n details: embKey ? undefined : \"missing\"\n });\n\n {\n const tursoUrl = process.env[config.vector.turso.urlEnv];\n checks.push({\n name: \"turso/libsql\",\n ok: true,\n details: tursoUrl ? `remote: ${tursoUrl}` : `local file: ${config.vector.turso.localPath}`\n });\n }\n\n if (config.rerank.provider === \"jina\") {\n const jinaKey = process.env[config.rerank.jina.apiKeyEnv];\n checks.push({\n name: `env ${config.rerank.jina.apiKeyEnv}`,\n ok: Boolean(jinaKey),\n details: jinaKey ? undefined : \"missing\"\n });\n }\n\n // Validate source mode prerequisites\n if (config.source.mode === \"static-output\") {\n const outputDir = path.resolve(cwd, config.source.staticOutputDir);\n const exists = fs.existsSync(outputDir);\n checks.push({\n name: \"source: static output dir\",\n ok: exists,\n details: exists ? outputDir : `${outputDir} not found (run your build first)`\n });\n } else if (config.source.mode === \"build\") {\n const buildConfig = config.source.build;\n if (buildConfig) {\n const manifestPath = path.resolve(cwd, buildConfig.outputDir, \"server\", \"manifest-full.js\");\n const manifestExists = fs.existsSync(manifestPath);\n checks.push({\n name: \"source: build manifest\",\n ok: manifestExists,\n details: manifestExists\n ? manifestPath\n : `${manifestPath} not found (run \\`vite build\\` first)`\n });\n\n const viteBin = path.resolve(cwd, \"node_modules\", \".bin\", \"vite\");\n const viteExists = fs.existsSync(viteBin);\n checks.push({\n name: \"source: vite binary\",\n ok: viteExists,\n details: viteExists ? viteBin : `${viteBin} not found (install vite)`\n });\n } else {\n checks.push({\n name: \"source: build config\",\n ok: false,\n details: \"source.build config missing\"\n });\n }\n } else if (config.source.mode === \"content-files\") {\n const contentConfig = config.source.contentFiles;\n if (contentConfig) {\n const fg = await import(\"fast-glob\");\n const baseDir = path.resolve(cwd, contentConfig.baseDir);\n const files = await fg.default(contentConfig.globs, { cwd: baseDir, onlyFiles: true });\n checks.push({\n name: \"source: content files\",\n ok: files.length > 0,\n details: files.length > 0\n ? `${files.length} files matched`\n : `no files matched globs ${contentConfig.globs.join(\", \")} in ${baseDir}`\n });\n } else {\n checks.push({\n name: \"source: content files\",\n ok: false,\n details: \"source.contentFiles config missing\"\n });\n }\n }\n\n try {\n const provider = createEmbeddingsProvider(config);\n await provider.embedTexts([\"searchsocket doctor ping\"], config.embeddings.model);\n checks.push({ name: \"embedding provider connectivity\", ok: true });\n } catch (error) {\n checks.push({\n name: \"embedding provider connectivity\",\n ok: false,\n details: error instanceof Error ? error.message : \"unknown error\"\n });\n }\n\n let store: VectorStore | null = null;\n try {\n store = await createVectorStore(config, cwd);\n const health = await store.health();\n checks.push({\n name: \"vector backend connectivity\",\n ok: health.ok,\n details: health.details\n });\n } catch (error) {\n checks.push({\n name: \"vector backend connectivity\",\n ok: false,\n details: error instanceof Error ? error.message : \"unknown error\"\n });\n }\n\n if (store) {\n try {\n const testScope: Scope = {\n projectId: config.project.id,\n scopeName: \"_searchsocket_doctor_probe\",\n scopeId: `${config.project.id}:_searchsocket_doctor_probe`\n };\n await store.recordScope({\n projectId: testScope.projectId,\n scopeName: testScope.scopeName,\n modelId: config.embeddings.model,\n lastIndexedAt: new Date().toISOString(),\n vectorCount: 0\n });\n await store.deleteScope(testScope);\n checks.push({ name: \"vector backend write permission\", ok: true });\n } catch (error) {\n checks.push({\n name: \"vector backend write permission\",\n ok: false,\n details: error instanceof Error ? error.message : \"write test failed\"\n });\n }\n }\n\n try {\n const scope = resolveScope(config);\n const { statePath } = ensureStateDirs(cwd, config.state.dir, scope);\n const testPath = path.join(statePath, \".write-test\");\n await fsp.writeFile(testPath, \"ok\\n\", \"utf8\");\n await fsp.rm(testPath, { force: true });\n checks.push({ name: \"state directory writable\", ok: true });\n } catch (error) {\n checks.push({\n name: \"state directory writable\",\n ok: false,\n details: error instanceof Error ? error.message : \"unknown error\"\n });\n }\n }\n\n let hasFailure = false;\n for (const check of checks) {\n process.stdout.write(`${check.ok ? \"PASS\" : \"FAIL\"} ${check.name}`);\n if (check.details) {\n process.stdout.write(` (${check.details})`);\n }\n process.stdout.write(\"\\n\");\n\n if (!check.ok) {\n hasFailure = true;\n }\n }\n\n if (hasFailure) {\n process.exitCode = 1;\n }\n });\n\nprogram\n .command(\"mcp\")\n .description(\"Run SearchSocket MCP server\")\n .option(\"--transport <transport>\", \"stdio|http\", \"stdio\")\n .option(\"--port <n>\", \"HTTP port\", \"3338\")\n .option(\"--path <path>\", \"HTTP path\", \"/mcp\")\n .action(async (opts, command) => {\n const rootOpts = getRootOptions(command);\n const cwd = path.resolve(rootOpts?.cwd ?? process.cwd());\n\n await runMcpServer({\n cwd,\n configPath: rootOpts?.config,\n transport: opts.transport,\n httpPort: parsePositiveInt(opts.port, \"--port\"),\n httpPath: opts.path\n });\n });\n\nprogram\n .command(\"search\")\n .description(\"Quick local CLI search against indexed vectors\")\n .requiredOption(\"--q <query>\", \"search query\")\n .option(\"--scope <name>\", \"scope override\")\n .option(\"--top-k <n>\", \"top K results\", \"10\")\n .option(\"--path-prefix <prefix>\", \"path prefix filter\")\n .option(\"--rerank\", \"enable configured reranker\", false)\n .action(async (opts, command) => {\n const rootOpts = getRootOptions(command);\n const cwd = path.resolve(rootOpts?.cwd ?? process.cwd());\n\n const engine = await SearchEngine.create({\n cwd,\n configPath: rootOpts?.config\n });\n\n const result = await engine.search({\n q: opts.q,\n scope: opts.scope,\n topK: parsePositiveInt(opts.topK, \"--top-k\"),\n pathPrefix: opts.pathPrefix,\n rerank: opts.rerank\n });\n\n process.stdout.write(`${JSON.stringify(result, null, 2)}\\n`);\n });\n\nasync function main(): Promise<void> {\n // Load .env from working directory before any config/factory calls.\n // process.env values take precedence (dotenv's default).\n // Only runs in CLI — library imports (searchsocketHandle, etc.) are not affected.\n dotenvConfig({ path: path.resolve(process.cwd(), \".env\") });\n\n await program.parseAsync(process.argv);\n}\n\nmain().catch((error) => {\n const message = error instanceof Error ? error.message : String(error);\n process.stderr.write(`searchsocket error: ${message}\\n`);\n process.exit(1);\n});\n","{\n \"name\": \"searchsocket\",\n \"version\": \"0.2.0\",\n \"description\": \"Semantic site search and MCP retrieval for SvelteKit static sites\",\n \"license\": \"MIT\",\n \"author\": \"Greg Priday <greg@siteorigin.com>\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/gregpriday/searchsocket.git\"\n },\n \"homepage\": \"https://github.com/gregpriday/searchsocket\",\n \"bugs\": {\n \"url\": \"https://github.com/gregpriday/searchsocket/issues\"\n },\n \"keywords\": [\n \"search\",\n \"semantic-search\",\n \"sveltekit\",\n \"mcp\",\n \"embeddings\",\n \"vector-search\",\n \"site-search\",\n \"static-site\"\n ],\n \"type\": \"module\",\n \"files\": [\n \"dist\",\n \"README.md\"\n ],\n \"bin\": {\n \"searchsocket\": \"dist/cli.js\"\n },\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\",\n \"require\": \"./dist/index.cjs\"\n },\n \"./sveltekit\": {\n \"types\": \"./dist/sveltekit.d.ts\",\n \"import\": \"./dist/sveltekit.js\",\n \"require\": \"./dist/sveltekit.cjs\"\n },\n \"./client\": {\n \"types\": \"./dist/client.d.ts\",\n \"import\": \"./dist/client.js\",\n \"require\": \"./dist/client.cjs\"\n }\n },\n \"scripts\": {\n \"build\": \"tsup\",\n \"clean\": \"rm -rf dist\",\n \"typecheck\": \"tsc --noEmit\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest\"\n },\n \"engines\": {\n \"node\": \">=20\"\n },\n \"packageManager\": \"pnpm@10.29.2\",\n \"dependencies\": {\n \"@libsql/client\": \"^0.17.0\",\n \"@modelcontextprotocol/sdk\": \"^1.26.0\",\n \"cheerio\": \"^1.2.0\",\n \"chokidar\": \"^5.0.0\",\n \"commander\": \"^14.0.3\",\n \"dotenv\": \"^17.3.1\",\n \"express\": \"^5.2.1\",\n \"fast-glob\": \"^3.3.3\",\n \"gray-matter\": \"^4.0.3\",\n \"jiti\": \"^2.6.1\",\n \"openai\": \"^6.19.0\",\n \"p-limit\": \"^7.3.0\",\n \"turndown\": \"^7.2.2\",\n \"turndown-plugin-gfm\": \"^1.0.2\",\n \"zod\": \"^4.3.6\"\n },\n \"devDependencies\": {\n \"@types/express\": \"^5.0.6\",\n \"@types/node\": \"^25.2.2\",\n \"@types/turndown\": \"^5.0.6\",\n \"tsup\": \"^8.5.1\",\n \"typescript\": \"^5.9.3\",\n \"vitest\": \"^4.0.18\"\n }\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { createJiti } from \"jiti\";\nimport { searchSocketConfigSchema } from \"./schema\";\nimport { createDefaultConfig } from \"./defaults\";\nimport type { ParsedSearchSocketConfig } from \"./schema\";\nimport type { ResolvedSearchSocketConfig, SearchSocketConfig, SourceMode } from \"../types\";\nimport { SearchSocketError } from \"../errors\";\n\nexport interface LoadConfigOptions {\n cwd?: string;\n configPath?: string;\n allowMissing?: boolean;\n}\n\nfunction inferProjectId(cwd: string): string {\n const packageJsonPath = path.join(cwd, \"package.json\");\n if (!fs.existsSync(packageJsonPath)) {\n return path.basename(cwd);\n }\n\n const raw = JSON.parse(fs.readFileSync(packageJsonPath, \"utf8\")) as { name?: string };\n return (raw.name ?? path.basename(cwd)).replace(/[^a-zA-Z0-9._-]/g, \"-\");\n}\n\nfunction detectSourceMode(cwd: string, config: ResolvedSearchSocketConfig, parsedInput: ParsedSearchSocketConfig): SourceMode {\n if (parsedInput.source?.mode) {\n return parsedInput.source.mode;\n }\n\n if (parsedInput.source?.build) {\n return \"build\";\n }\n\n if (parsedInput.source?.crawl) {\n return \"crawl\";\n }\n\n if (parsedInput.source?.contentFiles) {\n return \"content-files\";\n }\n\n const staticOutputPath = path.resolve(cwd, config.source.staticOutputDir);\n if (fs.existsSync(staticOutputPath)) {\n return \"static-output\";\n }\n\n throw new SearchSocketError(\n \"CONFIG_MISSING\",\n `Unable to auto-detect source mode because ${staticOutputPath} does not exist. ` +\n \"Set `source.mode` explicitly (static-output, crawl, content-files, or build).\"\n );\n}\n\nexport function mergeConfig(cwd: string, rawConfig: SearchSocketConfig): ResolvedSearchSocketConfig {\n const projectId = rawConfig.project?.id ?? inferProjectId(cwd);\n const defaults = createDefaultConfig(projectId);\n\n const parseResult = searchSocketConfigSchema.safeParse(rawConfig);\n if (!parseResult.success) {\n const issues = parseResult.error.issues\n .map((issue) => ` ${issue.path.join(\".\")}: ${issue.message}`)\n .join(\"\\n\");\n throw new SearchSocketError(\n \"CONFIG_MISSING\",\n `Invalid searchsocket.config.ts:\\n${issues}`\n );\n }\n const parsed = parseResult.data;\n\n const merged: ResolvedSearchSocketConfig = {\n ...defaults,\n project: {\n ...defaults.project,\n ...parsed.project\n },\n scope: {\n ...defaults.scope,\n ...parsed.scope\n },\n source: {\n ...defaults.source,\n ...parsed.source,\n crawl: parsed.source?.crawl\n ? {\n ...defaults.source.crawl,\n ...parsed.source.crawl,\n routes: parsed.source.crawl.routes ?? []\n }\n : defaults.source.crawl,\n contentFiles: parsed.source?.contentFiles\n ? {\n ...defaults.source.contentFiles,\n ...parsed.source.contentFiles,\n baseDir: parsed.source.contentFiles.baseDir ?? defaults.source.contentFiles?.baseDir ?? cwd\n }\n : defaults.source.contentFiles,\n build: parsed.source?.build\n ? {\n outputDir: parsed.source.build.outputDir ?? \".svelte-kit/output\",\n paramValues: parsed.source.build.paramValues ?? {},\n exclude: parsed.source.build.exclude ?? [],\n previewTimeout: parsed.source.build.previewTimeout ?? 30_000\n }\n : undefined\n },\n extract: {\n ...defaults.extract,\n ...parsed.extract\n },\n transform: {\n ...defaults.transform,\n ...parsed.transform\n },\n chunking: {\n ...defaults.chunking,\n ...parsed.chunking\n },\n embeddings: {\n ...defaults.embeddings,\n ...parsed.embeddings\n },\n vector: {\n ...defaults.vector,\n ...parsed.vector,\n turso: {\n ...defaults.vector.turso,\n ...parsed.vector?.turso\n }\n },\n rerank: {\n ...defaults.rerank,\n ...parsed.rerank,\n jina: {\n ...defaults.rerank.jina,\n ...parsed.rerank?.jina\n }\n },\n ranking: {\n ...defaults.ranking,\n ...parsed.ranking,\n pageWeights: {\n ...defaults.ranking.pageWeights,\n ...parsed.ranking?.pageWeights\n },\n weights: {\n ...defaults.ranking.weights,\n ...parsed.ranking?.weights\n }\n },\n api: {\n ...defaults.api,\n ...parsed.api,\n cors: {\n ...defaults.api.cors,\n ...parsed.api?.cors,\n allowOrigins: parsed.api?.cors?.allowOrigins ?? defaults.api.cors.allowOrigins\n },\n rateLimit: parsed.api?.rateLimit\n ? {\n windowMs: parsed.api.rateLimit.windowMs ?? 60_000,\n max: parsed.api.rateLimit.max ?? 60\n }\n : defaults.api.rateLimit\n },\n mcp: {\n ...defaults.mcp,\n ...parsed.mcp,\n http: {\n ...defaults.mcp.http,\n ...parsed.mcp?.http\n }\n },\n state: {\n ...defaults.state,\n ...parsed.state\n }\n };\n\n merged.project.id = projectId;\n merged.source.mode = detectSourceMode(cwd, merged, parsed);\n\n if (merged.source.mode === \"build\" && !merged.source.build) {\n merged.source.build = {\n outputDir: \".svelte-kit/output\",\n paramValues: {},\n exclude: [],\n previewTimeout: 30_000\n };\n }\n\n if (merged.source.mode === \"crawl\" && !merged.source.crawl?.baseUrl) {\n throw new SearchSocketError(\"CONFIG_MISSING\", \"`source.crawl.baseUrl` is required when source.mode is crawl.\");\n }\n\n if (merged.source.mode === \"content-files\" && (!merged.source.contentFiles || merged.source.contentFiles.globs.length === 0)) {\n throw new SearchSocketError(\n \"CONFIG_MISSING\",\n \"`source.contentFiles.globs` is required when source.mode is content-files.\"\n );\n }\n\n return merged;\n}\n\nexport async function loadConfig(options: LoadConfigOptions = {}): Promise<ResolvedSearchSocketConfig> {\n const cwd = path.resolve(options.cwd ?? process.cwd());\n const configPath = path.resolve(cwd, options.configPath ?? \"searchsocket.config.ts\");\n\n if (!fs.existsSync(configPath)) {\n if (options.allowMissing) {\n return mergeConfig(cwd, {\n source: {\n mode: \"static-output\"\n }\n });\n }\n\n throw new SearchSocketError(\n \"CONFIG_MISSING\",\n `Configuration file not found at ${configPath}. Run \\`searchsocket init\\` first.`\n );\n }\n\n const jiti = createJiti(cwd, { interopDefault: true });\n const loaded = (await jiti.import(configPath)) as SearchSocketConfig;\n const raw = (loaded as { default?: SearchSocketConfig }).default ?? loaded;\n\n return mergeConfig(cwd, raw);\n}\n\nexport function writeMinimalConfig(cwd: string): string {\n const target = path.join(cwd, \"searchsocket.config.ts\");\n if (fs.existsSync(target)) {\n return target;\n }\n\n const content = `export default {\n embeddings: { apiKeyEnv: \"OPENAI_API_KEY\" }\n};\n`;\n\n fs.writeFileSync(target, content, \"utf8\");\n return target;\n}\n","import { z } from \"zod\";\n\nexport const searchSocketConfigSchema = z.object({\n project: z\n .object({\n id: z.string().min(1).optional(),\n baseUrl: z.string().url().optional()\n })\n .optional(),\n scope: z\n .object({\n mode: z.enum([\"fixed\", \"git\", \"env\"]).optional(),\n fixed: z.string().min(1).optional(),\n envVar: z.string().min(1).optional(),\n sanitize: z.boolean().optional()\n })\n .optional(),\n source: z\n .object({\n mode: z.enum([\"static-output\", \"crawl\", \"content-files\", \"build\"]).optional(),\n staticOutputDir: z.string().min(1).optional(),\n strictRouteMapping: z.boolean().optional(),\n crawl: z\n .object({\n baseUrl: z.string().url(),\n routes: z.array(z.string()).optional(),\n sitemapUrl: z.string().optional()\n })\n .optional(),\n contentFiles: z\n .object({\n globs: z.array(z.string()).min(1),\n baseDir: z.string().optional()\n })\n .optional(),\n build: z\n .object({\n outputDir: z.string().min(1).optional(),\n paramValues: z.record(z.string(), z.array(z.string())).optional(),\n exclude: z.array(z.string()).optional(),\n previewTimeout: z.number().int().positive().optional()\n })\n .optional()\n })\n .optional(),\n extract: z\n .object({\n mainSelector: z.string().optional(),\n dropTags: z.array(z.string()).optional(),\n dropSelectors: z.array(z.string()).optional(),\n ignoreAttr: z.string().optional(),\n noindexAttr: z.string().optional(),\n respectRobotsNoindex: z.boolean().optional()\n })\n .optional(),\n transform: z\n .object({\n output: z.literal(\"markdown\").optional(),\n preserveCodeBlocks: z.boolean().optional(),\n preserveTables: z.boolean().optional()\n })\n .optional(),\n chunking: z\n .object({\n strategy: z.literal(\"hybrid\").optional(),\n maxChars: z.number().int().positive().optional(),\n overlapChars: z.number().int().nonnegative().optional(),\n minChars: z.number().int().positive().optional(),\n headingPathDepth: z.number().int().positive().optional(),\n dontSplitInside: z.array(z.enum([\"code\", \"table\", \"blockquote\"])).optional(),\n prependTitle: z.boolean().optional(),\n pageSummaryChunk: z.boolean().optional()\n })\n .optional(),\n embeddings: z\n .object({\n provider: z.literal(\"openai\").optional(),\n model: z.string().min(1).optional(),\n apiKeyEnv: z.string().min(1).optional(),\n batchSize: z.number().int().positive().optional(),\n concurrency: z.number().int().positive().optional(),\n pricePer1kTokens: z.number().positive().optional()\n })\n .optional(),\n vector: z\n .object({\n dimension: z.number().int().positive().optional(),\n turso: z\n .object({\n urlEnv: z.string().optional(),\n authTokenEnv: z.string().optional(),\n localPath: z.string().optional()\n })\n .optional()\n })\n .optional(),\n rerank: z\n .object({\n provider: z.enum([\"none\", \"jina\"]).optional(),\n topN: z.number().int().positive().optional(),\n jina: z\n .object({\n apiKeyEnv: z.string().optional(),\n model: z.string().optional()\n })\n .optional()\n })\n .optional(),\n ranking: z\n .object({\n enableIncomingLinkBoost: z.boolean().optional(),\n enableDepthBoost: z.boolean().optional(),\n pageWeights: z.record(z.string(), z.number().positive()).optional(),\n aggregationCap: z.number().int().positive().optional(),\n aggregationDecay: z.number().min(0).max(1).optional(),\n minChunkScoreRatio: z.number().min(0).max(1).optional(),\n weights: z\n .object({\n incomingLinks: z.number().optional(),\n depth: z.number().optional(),\n rerank: z.number().optional(),\n aggregation: z.number().optional()\n })\n .optional()\n })\n .optional(),\n api: z\n .object({\n path: z.string().optional(),\n cors: z\n .object({\n allowOrigins: z.array(z.string()).optional()\n })\n .optional(),\n rateLimit: z\n .object({\n windowMs: z.number().int().positive().optional(),\n max: z.number().int().positive().optional()\n })\n .optional()\n })\n .optional(),\n mcp: z\n .object({\n enable: z.boolean().optional(),\n transport: z.enum([\"stdio\", \"http\"]).optional(),\n http: z\n .object({\n port: z.number().int().positive().optional(),\n path: z.string().optional()\n })\n .optional()\n })\n .optional(),\n state: z\n .object({\n dir: z.string().optional(),\n writeMirror: z.boolean().optional()\n })\n .optional()\n});\n\nexport type ParsedSearchSocketConfig = z.infer<typeof searchSocketConfigSchema>;\n","import type { ResolvedSearchSocketConfig } from \"../types\";\n\nexport const DEFAULT_DROP_SELECTORS = [\n \".sidebar\",\n \".toc\",\n \".table-of-contents\",\n \".breadcrumbs\",\n \".breadcrumb\",\n \"[role='navigation']\"\n];\n\nexport function createDefaultConfig(projectId: string): ResolvedSearchSocketConfig {\n return {\n project: {\n id: projectId\n },\n scope: {\n mode: \"fixed\",\n fixed: \"main\",\n envVar: \"SEARCHSOCKET_SCOPE\",\n sanitize: true\n },\n source: {\n mode: \"static-output\",\n staticOutputDir: \"build\",\n strictRouteMapping: false\n },\n extract: {\n mainSelector: \"main\",\n dropTags: [\"header\", \"nav\", \"footer\", \"aside\"],\n dropSelectors: DEFAULT_DROP_SELECTORS,\n ignoreAttr: \"data-search-ignore\",\n noindexAttr: \"data-search-noindex\",\n respectRobotsNoindex: true\n },\n transform: {\n output: \"markdown\",\n preserveCodeBlocks: true,\n preserveTables: true\n },\n chunking: {\n strategy: \"hybrid\",\n maxChars: 2200,\n overlapChars: 200,\n minChars: 250,\n headingPathDepth: 3,\n dontSplitInside: [\"code\", \"table\", \"blockquote\"],\n prependTitle: true,\n pageSummaryChunk: true\n },\n embeddings: {\n provider: \"openai\",\n model: \"text-embedding-3-small\",\n apiKeyEnv: \"OPENAI_API_KEY\",\n batchSize: 64,\n concurrency: 4\n },\n vector: {\n turso: {\n urlEnv: \"TURSO_DATABASE_URL\",\n authTokenEnv: \"TURSO_AUTH_TOKEN\",\n localPath: \".searchsocket/vectors.db\"\n }\n },\n rerank: {\n provider: \"none\",\n topN: 20,\n jina: {\n apiKeyEnv: \"JINA_API_KEY\",\n model: \"jina-reranker-v2-base-multilingual\"\n }\n },\n ranking: {\n enableIncomingLinkBoost: true,\n enableDepthBoost: true,\n pageWeights: {},\n aggregationCap: 5,\n aggregationDecay: 0.5,\n minChunkScoreRatio: 0.5,\n weights: {\n incomingLinks: 0.05,\n depth: 0.03,\n rerank: 1.0,\n aggregation: 0.1\n }\n },\n api: {\n path: \"/api/search\",\n cors: {\n allowOrigins: []\n }\n },\n mcp: {\n enable: process.env.NODE_ENV !== \"production\",\n transport: \"stdio\",\n http: {\n port: 3338,\n path: \"/mcp\"\n }\n },\n state: {\n dir: \".searchsocket\",\n writeMirror: false\n }\n };\n}\n","export type SearchSocketErrorCode =\n | \"CONFIG_MISSING\"\n | \"EMBEDDING_MODEL_MISMATCH\"\n | \"ROUTE_MAPPING_FAILED\"\n | \"VECTOR_BACKEND_UNAVAILABLE\"\n | \"RATE_LIMITED\"\n | \"INVALID_REQUEST\"\n | \"INTERNAL_ERROR\"\n | \"BUILD_MANIFEST_NOT_FOUND\"\n | \"BUILD_SERVER_FAILED\";\n\nexport class SearchSocketError extends Error {\n public readonly code: SearchSocketErrorCode;\n public readonly status: number;\n\n constructor(code: SearchSocketErrorCode, message: string, status = 500) {\n super(message);\n this.code = code;\n this.status = status;\n }\n}\n\nexport function toErrorPayload(error: unknown): {\n error: {\n code: SearchSocketErrorCode;\n message: string;\n };\n} {\n if (error instanceof SearchSocketError) {\n return {\n error: {\n code: error.code,\n message: error.message\n }\n };\n }\n\n return {\n error: {\n code: \"INTERNAL_ERROR\",\n message: error instanceof Error ? error.message : \"Unknown error\"\n }\n };\n}\n","import type { JsonLogEntry } from \"../types\";\n\nexport interface LoggerOptions {\n json?: boolean;\n verbose?: boolean;\n /** When true, all output (including info/event) is written to stderr instead of stdout. */\n stderrOnly?: boolean;\n}\n\nexport class Logger {\n private readonly json: boolean;\n private readonly verbose: boolean;\n private readonly stderrOnly: boolean;\n\n constructor(opts: LoggerOptions = {}) {\n this.json = opts.json ?? false;\n this.verbose = opts.verbose ?? false;\n this.stderrOnly = opts.stderrOnly ?? false;\n }\n\n info(message: string): void {\n if (this.json) {\n return;\n }\n\n this.writeOut(`${message}\\n`);\n }\n\n debug(message: string): void {\n if (!this.verbose) {\n return;\n }\n\n if (this.json) {\n this.logJson(\"debug\", { message });\n return;\n }\n\n this.writeOut(`${message}\\n`);\n }\n\n warn(message: string): void {\n if (this.json) {\n this.logJson(\"warn\", { message });\n return;\n }\n\n process.stderr.write(`WARN: ${message}\\n`);\n }\n\n error(message: string): void {\n if (this.json) {\n this.logJson(\"error\", { message });\n return;\n }\n\n process.stderr.write(`ERROR: ${message}\\n`);\n }\n\n event(event: string, data?: Record<string, unknown>): void {\n if (!this.json && !this.verbose) {\n return;\n }\n\n if (this.json) {\n this.logJson(event, data);\n return;\n }\n\n this.writeOut(`[${event}] ${data ? JSON.stringify(data) : \"\"}\\n`);\n }\n\n private writeOut(text: string): void {\n if (this.stderrOnly) {\n process.stderr.write(text);\n } else {\n process.stdout.write(text);\n }\n }\n\n private logJson(event: string, data?: Record<string, unknown>): void {\n const entry: JsonLogEntry = {\n event,\n ts: new Date().toISOString(),\n data\n };\n\n this.writeOut(`${JSON.stringify(entry)}\\n`);\n }\n}\n","import { execSync } from \"node:child_process\";\nimport type { ResolvedSearchSocketConfig, Scope } from \"../types\";\nimport { sanitizeScopeName } from \"../utils/text\";\n\nfunction resolveRawScopeName(config: ResolvedSearchSocketConfig): string {\n if (config.scope.mode === \"fixed\") {\n return config.scope.fixed;\n }\n\n if (config.scope.mode === \"env\") {\n const value = process.env[config.scope.envVar];\n if (!value) {\n throw new Error(`Scope mode is env but ${config.scope.envVar} is not set.`);\n }\n\n return value;\n }\n\n try {\n return execSync(\"git rev-parse --abbrev-ref HEAD\", {\n encoding: \"utf8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"]\n }).trim();\n } catch {\n return config.scope.fixed;\n }\n}\n\nexport function resolveScope(config: ResolvedSearchSocketConfig, override?: string): Scope {\n const rawName = override ?? resolveRawScopeName(config);\n const scopeName = config.scope.sanitize ? sanitizeScopeName(rawName) : rawName;\n\n return {\n projectId: config.project.id,\n scopeName,\n scopeId: `${config.project.id}:${scopeName}`\n };\n}\n","export function normalizeText(input: string): string {\n return input.replace(/\\r\\n/g, \"\\n\").replace(/\\s+/g, \" \").trim();\n}\n\nexport function normalizeMarkdown(input: string): string {\n return input.replace(/\\r\\n/g, \"\\n\").replace(/[ \\t]+$/gm, \"\").trim() + \"\\n\";\n}\n\nexport function sanitizeScopeName(scopeName: string): string {\n return scopeName\n .toLowerCase()\n .replace(/[^a-z0-9._-]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .slice(0, 80);\n}\n\nexport function toSnippet(markdown: string, maxLen = 220): string {\n const plain = markdown\n .replace(/```[\\s\\S]*?```/g, \" \")\n .replace(/`([^`]+)`/g, \"$1\")\n .replace(/[#>*_|\\-]/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim();\n\n if (plain.length <= maxLen) {\n return plain;\n }\n\n return `${plain.slice(0, Math.max(0, maxLen - 1)).trim()}…`;\n}\n\nexport function extractFirstParagraph(markdown: string): string {\n const lines = markdown.split(\"\\n\");\n let inFence = false;\n const collected: string[] = [];\n\n for (const line of lines) {\n const trimmed = line.trim();\n\n if (/^(```|~~~)/.test(trimmed)) {\n inFence = !inFence;\n if (collected.length > 0) break;\n continue;\n }\n\n if (inFence) continue;\n\n // Skip headings\n if (/^#{1,6}\\s/.test(trimmed)) {\n if (collected.length > 0) break;\n continue;\n }\n\n // Empty line ends a paragraph\n if (!trimmed) {\n if (collected.length > 0) break;\n continue;\n }\n\n collected.push(trimmed);\n }\n\n return collected.join(\" \");\n}\n\nexport function safeJsonParse<T>(value: string, fallback: T): T {\n try {\n return JSON.parse(value) as T;\n } catch {\n return fallback;\n }\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { Scope } from \"../types\";\n\nexport function ensureStateDirs(cwd: string, stateDir: string, scope: Scope): {\n statePath: string;\n pagesPath: string;\n} {\n const statePath = path.resolve(cwd, stateDir);\n const pagesPath = path.join(statePath, \"pages\", scope.scopeName);\n fs.mkdirSync(pagesPath, { recursive: true });\n return { statePath, pagesPath };\n}\n","import OpenAI from \"openai\";\nimport pLimit from \"p-limit\";\nimport type { EmbeddingsProvider } from \"../types\";\n\nexport interface OpenAIEmbeddingsProviderOptions {\n apiKey: string;\n batchSize: number;\n concurrency: number;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n\nexport class OpenAIEmbeddingsProvider implements EmbeddingsProvider {\n private readonly client: OpenAI;\n private readonly batchSize: number;\n private readonly concurrency: number;\n\n constructor(options: OpenAIEmbeddingsProviderOptions) {\n if (!Number.isInteger(options.batchSize) || options.batchSize <= 0) {\n throw new Error(`Invalid batchSize: ${options.batchSize}. batchSize must be a positive integer.`);\n }\n\n if (!Number.isInteger(options.concurrency) || options.concurrency <= 0) {\n throw new Error(`Invalid concurrency: ${options.concurrency}. concurrency must be a positive integer.`);\n }\n\n this.client = new OpenAI({\n apiKey: options.apiKey\n });\n this.batchSize = options.batchSize;\n this.concurrency = options.concurrency;\n }\n\n estimateTokens(text: string): number {\n const normalized = text.trim();\n if (!normalized) {\n return 0;\n }\n\n const wordCount = normalized.match(/[A-Za-z0-9_]+/g)?.length ?? 0;\n const punctuationCount = normalized.match(/[^\\s\\w]/g)?.length ?? 0;\n const cjkCount = normalized.match(/[\\u3400-\\u9fff]/g)?.length ?? 0;\n const charEstimate = Math.ceil(normalized.length / 4);\n const lexicalEstimate = Math.ceil(wordCount * 1.25 + punctuationCount * 0.45 + cjkCount * 1.6);\n\n // Conservative estimate to reduce under-reporting in cost previews.\n return Math.max(1, Math.max(charEstimate, lexicalEstimate));\n }\n\n async embedTexts(texts: string[], modelId: string): Promise<number[][]> {\n if (texts.length === 0) {\n return [];\n }\n\n const batches: Array<{ index: number; values: string[] }> = [];\n for (let i = 0; i < texts.length; i += this.batchSize) {\n batches.push({\n index: i,\n values: texts.slice(i, i + this.batchSize)\n });\n }\n\n const outputs = new Array<number[][]>(batches.length);\n const limit = pLimit(this.concurrency);\n\n await Promise.all(\n batches.map((batch, position) =>\n limit(async () => {\n outputs[position] = await this.embedWithRetry(batch.values, modelId);\n })\n )\n );\n\n return outputs.flat();\n }\n\n private async embedWithRetry(texts: string[], modelId: string): Promise<number[][]> {\n const maxAttempts = 5;\n let attempt = 0;\n\n while (attempt < maxAttempts) {\n attempt += 1;\n try {\n const response = await this.client.embeddings.create({\n model: modelId,\n input: texts,\n encoding_format: \"float\"\n });\n\n return response.data.map((entry) => entry.embedding);\n } catch (error) {\n const status = (error as { status?: number }).status;\n const retryable = status === 429 || (typeof status === \"number\" && status >= 500);\n\n if (!retryable || attempt >= maxAttempts) {\n throw error;\n }\n\n const delay = Math.min(2 ** attempt * 300, 5_000);\n await sleep(delay);\n }\n }\n\n throw new Error(\"Unreachable retry state\");\n }\n}\n","import type { EmbeddingsProvider, ResolvedSearchSocketConfig } from \"../types\";\nimport { SearchSocketError } from \"../errors\";\nimport { OpenAIEmbeddingsProvider } from \"./openai\";\n\nexport function createEmbeddingsProvider(config: ResolvedSearchSocketConfig): EmbeddingsProvider {\n if (config.embeddings.provider !== \"openai\") {\n throw new SearchSocketError(\n \"CONFIG_MISSING\",\n `Unsupported embeddings provider ${config.embeddings.provider}`\n );\n }\n\n const apiKey = process.env[config.embeddings.apiKeyEnv];\n if (!apiKey) {\n throw new SearchSocketError(\n \"CONFIG_MISSING\",\n `Missing embeddings API key env var: ${config.embeddings.apiKeyEnv}`\n );\n }\n\n return new OpenAIEmbeddingsProvider({\n apiKey,\n batchSize: config.embeddings.batchSize,\n concurrency: config.embeddings.concurrency\n });\n}\n","import path from \"node:path\";\nimport { loadConfig } from \"../config/load\";\nimport { resolveScope } from \"../core/scope\";\nimport { ensureStateDirs } from \"../core/state\";\nimport { createEmbeddingsProvider } from \"../embeddings\";\nimport { SearchSocketError } from \"../errors\";\nimport { createVectorStore } from \"../vector\";\nimport { buildEmbeddingText, chunkMirrorPage } from \"./chunker\";\nimport { extractFromHtml, extractFromMarkdown } from \"./extractor\";\nimport { cleanMirrorForScope, writeMirrorPage } from \"./mirror\";\nimport { buildRoutePatterns, mapUrlToRoute } from \"./route-mapper\";\nimport { loadBuildPages } from \"./sources/build\";\nimport { loadContentFilesPages } from \"./sources/content-files\";\nimport { loadCrawledPages } from \"./sources/crawl\";\nimport { loadStaticOutputPages } from \"./sources/static-output\";\nimport { hrTimeMs, nowIso } from \"../utils/time\";\nimport { getUrlDepth, normalizeUrlPath } from \"../utils/path\";\nimport { Logger } from \"../core/logger\";\nimport type {\n Chunk,\n EmbeddingsProvider,\n ExtractedPage,\n IndexOptions,\n IndexStats,\n MirrorPage,\n PageRecord,\n ResolvedSearchSocketConfig,\n RouteMatch,\n Scope,\n ScopeInfo,\n VectorRecord,\n VectorStore\n} from \"../types\";\n\nconst EMBEDDING_PRICE_PER_1K_TOKENS_USD: Record<string, number> = {\n \"text-embedding-3-small\": 0.00002,\n \"text-embedding-3-large\": 0.00013,\n \"text-embedding-ada-002\": 0.0001\n};\nconst DEFAULT_EMBEDDING_PRICE_PER_1K = 0.00002;\n\ninterface IndexPipelineOptions {\n cwd?: string;\n configPath?: string;\n config?: ResolvedSearchSocketConfig;\n embeddingsProvider?: EmbeddingsProvider;\n vectorStore?: VectorStore;\n logger?: Logger;\n}\n\nexport class IndexPipeline {\n private readonly cwd: string;\n private readonly config: ResolvedSearchSocketConfig;\n private readonly embeddings: EmbeddingsProvider;\n private readonly vectorStore: VectorStore;\n private readonly logger: Logger;\n\n private constructor(options: {\n cwd: string;\n config: ResolvedSearchSocketConfig;\n embeddings: EmbeddingsProvider;\n vectorStore: VectorStore;\n logger: Logger;\n }) {\n this.cwd = options.cwd;\n this.config = options.config;\n this.embeddings = options.embeddings;\n this.vectorStore = options.vectorStore;\n this.logger = options.logger;\n }\n\n static async create(options: IndexPipelineOptions = {}): Promise<IndexPipeline> {\n const cwd = path.resolve(options.cwd ?? process.cwd());\n const config = options.config ?? (await loadConfig({ cwd, configPath: options.configPath }));\n const embeddings = options.embeddingsProvider ?? createEmbeddingsProvider(config);\n const vectorStore = options.vectorStore ?? await createVectorStore(config, cwd);\n\n return new IndexPipeline({\n cwd,\n config,\n embeddings,\n vectorStore,\n logger: options.logger ?? new Logger()\n });\n }\n\n getConfig(): ResolvedSearchSocketConfig {\n return this.config;\n }\n\n async run(rawOptions: IndexOptions = {}): Promise<IndexStats> {\n const options: Required<Pick<IndexOptions, \"changedOnly\" | \"force\" | \"dryRun\">> & IndexOptions = {\n changedOnly: rawOptions.changedOnly ?? true,\n force: rawOptions.force ?? false,\n dryRun: rawOptions.dryRun ?? false,\n ...rawOptions\n };\n\n const stageTimingsMs: Record<string, number> = {};\n const stageStart = (): bigint => process.hrtime.bigint();\n const stageEnd = (name: string, start: bigint): void => {\n stageTimingsMs[name] = Math.round(hrTimeMs(start));\n };\n\n const scope = resolveScope(this.config, options.scopeOverride);\n const { statePath } = ensureStateDirs(this.cwd, this.config.state.dir, scope);\n\n if (options.force) {\n await cleanMirrorForScope(statePath, scope);\n }\n\n const manifestStart = stageStart();\n const existingHashes = await this.vectorStore.getContentHashes(scope);\n const existingModelId = await this.vectorStore.getScopeModelId(scope);\n\n if (\n existingModelId &&\n existingModelId !== this.config.embeddings.model &&\n !options.force\n ) {\n throw new SearchSocketError(\n \"EMBEDDING_MODEL_MISMATCH\",\n `Scope ${scope.scopeName} uses model ${existingModelId}. Re-run with --force to migrate.`\n );\n }\n\n stageEnd(\"manifest\", manifestStart);\n\n const sourceStart = stageStart();\n const sourceMode = options.sourceOverride ?? this.config.source.mode;\n let sourcePages;\n\n if (sourceMode === \"static-output\") {\n sourcePages = await loadStaticOutputPages(this.cwd, this.config, options.maxPages);\n } else if (sourceMode === \"crawl\") {\n sourcePages = await loadCrawledPages(this.config, options.maxPages);\n } else if (sourceMode === \"build\") {\n sourcePages = await loadBuildPages(this.cwd, this.config, options.maxPages);\n } else {\n sourcePages = await loadContentFilesPages(this.cwd, this.config, options.maxPages);\n }\n stageEnd(\"source\", sourceStart);\n\n const routeStart = stageStart();\n const routePatterns = await buildRoutePatterns(this.cwd);\n stageEnd(\"route_map\", routeStart);\n\n const extractStart = stageStart();\n const extractedPages: ExtractedPage[] = [];\n\n for (const sourcePage of sourcePages) {\n const extracted = sourcePage.html\n ? extractFromHtml(sourcePage.url, sourcePage.html, this.config)\n : extractFromMarkdown(sourcePage.url, sourcePage.markdown ?? \"\", sourcePage.title);\n\n if (!extracted) {\n this.logger.warn(\n `Page ${sourcePage.url} produced no extractable content and was skipped. ` +\n \"Check extract.mainSelector, extract.dropTags, and extract.dropSelectors settings.\"\n );\n continue;\n }\n\n extractedPages.push(extracted);\n this.logger.event(\"page_extracted\", {\n url: extracted.url\n });\n }\n\n extractedPages.sort((a, b) => a.url.localeCompare(b.url));\n const uniquePages: ExtractedPage[] = [];\n const seenUrls = new Set<string>();\n for (const page of extractedPages) {\n if (seenUrls.has(page.url)) {\n this.logger.warn(\n `Duplicate page source for ${page.url}; keeping first extracted page and skipping the duplicate.`\n );\n continue;\n }\n seenUrls.add(page.url);\n uniquePages.push(page);\n }\n stageEnd(\"extract\", extractStart);\n\n const linkStart = stageStart();\n const pageSet = new Set(uniquePages.map((page) => normalizeUrlPath(page.url)));\n const incomingLinkCount = new Map<string, number>();\n\n for (const page of uniquePages) {\n incomingLinkCount.set(page.url, incomingLinkCount.get(page.url) ?? 0);\n }\n\n for (const page of uniquePages) {\n for (const outgoing of page.outgoingLinks) {\n if (!pageSet.has(outgoing)) {\n continue;\n }\n\n incomingLinkCount.set(outgoing, (incomingLinkCount.get(outgoing) ?? 0) + 1);\n }\n }\n stageEnd(\"links\", linkStart);\n\n const mirrorStart = stageStart();\n const mirrorPages: MirrorPage[] = [];\n let routeExact = 0;\n let routeBestEffort = 0;\n\n const precomputedRoutes = new Map<string, RouteMatch>();\n for (const sp of sourcePages) {\n if (sp.routeFile) {\n precomputedRoutes.set(normalizeUrlPath(sp.url), {\n routeFile: sp.routeFile,\n routeResolution: sp.routeResolution ?? \"exact\"\n });\n }\n }\n\n for (const page of uniquePages) {\n const routeMatch = precomputedRoutes.get(normalizeUrlPath(page.url)) ?? mapUrlToRoute(page.url, routePatterns);\n\n if (routeMatch.routeResolution === \"best-effort\") {\n if (this.config.source.strictRouteMapping) {\n throw new SearchSocketError(\n \"ROUTE_MAPPING_FAILED\",\n `Strict route mapping enabled: no exact route match for ${page.url} (resolved to ${routeMatch.routeFile}). ` +\n \"Disable source.strictRouteMapping or add the missing route file.\",\n 400\n );\n }\n\n this.logger.warn(\n `No exact route match for ${page.url}, falling back to ${routeMatch.routeFile}.`\n );\n routeBestEffort += 1;\n } else {\n routeExact += 1;\n }\n\n const mirror: MirrorPage = {\n url: page.url,\n title: page.title,\n scope: scope.scopeName,\n routeFile: routeMatch.routeFile,\n routeResolution: routeMatch.routeResolution,\n generatedAt: nowIso(),\n incomingLinks: incomingLinkCount.get(page.url) ?? 0,\n outgoingLinks: page.outgoingLinks.length,\n depth: getUrlDepth(page.url),\n tags: page.tags,\n markdown: page.markdown,\n description: page.description,\n keywords: page.keywords\n };\n\n mirrorPages.push(mirror);\n if (this.config.state.writeMirror) {\n await writeMirrorPage(statePath, scope, mirror);\n }\n this.logger.event(\"markdown_written\", { url: page.url });\n }\n\n // Store pages in Turso (replace entire scope to remove stale pages)\n if (!options.dryRun) {\n const pageRecords: PageRecord[] = mirrorPages.map((mp) => ({\n url: mp.url,\n title: mp.title,\n markdown: mp.markdown,\n projectId: scope.projectId,\n scopeName: scope.scopeName,\n routeFile: mp.routeFile,\n routeResolution: mp.routeResolution,\n incomingLinks: mp.incomingLinks,\n outgoingLinks: mp.outgoingLinks,\n depth: mp.depth,\n tags: mp.tags,\n indexedAt: mp.generatedAt\n }));\n // Delete old pages first, then insert new ones to avoid stale data\n await this.vectorStore.deletePages(scope);\n await this.vectorStore.upsertPages(pageRecords, scope);\n }\n\n stageEnd(\"mirror\", mirrorStart);\n\n const chunkStart = stageStart();\n let chunks: Chunk[] = mirrorPages.flatMap((page) => chunkMirrorPage(page, this.config, scope));\n\n const maxChunks = typeof options.maxChunks === \"number\" ? Math.max(0, Math.floor(options.maxChunks)) : undefined;\n if (typeof maxChunks === \"number\") {\n chunks = chunks.slice(0, maxChunks);\n }\n\n for (const chunk of chunks) {\n this.logger.event(\"chunked\", {\n url: chunk.url,\n chunkKey: chunk.chunkKey\n });\n }\n\n stageEnd(\"chunk\", chunkStart);\n\n const currentChunkMap = new Map<string, Chunk>();\n for (const chunk of chunks) {\n currentChunkMap.set(chunk.chunkKey, chunk);\n }\n\n const changedChunks = chunks.filter((chunk) => {\n if (options.force) {\n return true;\n }\n\n const existingHash = existingHashes.get(chunk.chunkKey);\n if (!existingHash) {\n return true;\n }\n\n if (!options.changedOnly) {\n return true;\n }\n\n return existingHash !== chunk.contentHash;\n });\n\n const deletes = [...existingHashes.keys()].filter((chunkKey) => !currentChunkMap.has(chunkKey));\n\n const embedStart = stageStart();\n\n const chunkTokenEstimates = new Map<string, number>();\n for (const chunk of changedChunks) {\n chunkTokenEstimates.set(chunk.chunkKey, this.embeddings.estimateTokens(buildEmbeddingText(chunk, this.config.chunking.prependTitle)));\n }\n\n const estimatedTokens = changedChunks.reduce(\n (sum, chunk) => sum + (chunkTokenEstimates.get(chunk.chunkKey) ?? 0),\n 0\n );\n\n const pricePer1k = this.config.embeddings.pricePer1kTokens\n ?? EMBEDDING_PRICE_PER_1K_TOKENS_USD[this.config.embeddings.model]\n ?? DEFAULT_EMBEDDING_PRICE_PER_1K;\n\n const estimatedCostUSD = (estimatedTokens / 1000) * pricePer1k;\n\n let newEmbeddings = 0;\n const vectorsByChunk = new Map<string, number[]>();\n\n if (!options.dryRun && changedChunks.length > 0) {\n const embeddings = await this.embeddings.embedTexts(\n changedChunks.map((chunk) => buildEmbeddingText(chunk, this.config.chunking.prependTitle)),\n this.config.embeddings.model\n );\n\n if (embeddings.length !== changedChunks.length) {\n throw new SearchSocketError(\n \"VECTOR_BACKEND_UNAVAILABLE\",\n `Embedding provider returned ${embeddings.length} vectors for ${changedChunks.length} chunks.`\n );\n }\n\n for (let i = 0; i < changedChunks.length; i += 1) {\n const chunk = changedChunks[i];\n const embedding = embeddings[i];\n if (!chunk || !embedding || embedding.length === 0 || embedding.some((value) => !Number.isFinite(value))) {\n throw new SearchSocketError(\n \"VECTOR_BACKEND_UNAVAILABLE\",\n `Embedding provider returned an invalid vector for chunk index ${i}.`\n );\n }\n vectorsByChunk.set(chunk.chunkKey, embedding);\n newEmbeddings += 1;\n this.logger.event(\"embedded_new\", { chunkKey: chunk.chunkKey });\n }\n }\n\n stageEnd(\"embedding\", embedStart);\n\n const syncStart = stageStart();\n if (!options.dryRun) {\n const upserts: VectorRecord[] = [];\n for (const chunk of changedChunks) {\n const vector = vectorsByChunk.get(chunk.chunkKey);\n if (!vector) {\n continue;\n }\n\n upserts.push({\n id: chunk.chunkKey,\n vector,\n metadata: {\n projectId: scope.projectId,\n scopeName: scope.scopeName,\n url: chunk.url,\n path: chunk.path,\n title: chunk.title,\n sectionTitle: chunk.sectionTitle ?? \"\",\n headingPath: chunk.headingPath,\n snippet: chunk.snippet,\n contentHash: chunk.contentHash,\n modelId: this.config.embeddings.model,\n depth: chunk.depth,\n incomingLinks: chunk.incomingLinks,\n routeFile: chunk.routeFile,\n tags: chunk.tags\n }\n });\n }\n\n if (upserts.length > 0) {\n await this.vectorStore.upsert(upserts, scope);\n this.logger.event(\"upserted\", { count: upserts.length });\n }\n\n if (deletes.length > 0) {\n await this.vectorStore.deleteByIds(deletes, scope);\n this.logger.event(\"deleted\", { count: deletes.length });\n }\n }\n\n stageEnd(\"sync\", syncStart);\n\n const finalizeStart = stageStart();\n\n if (!options.dryRun) {\n const scopeInfo: ScopeInfo = {\n projectId: scope.projectId,\n scopeName: scope.scopeName,\n modelId: this.config.embeddings.model,\n lastIndexedAt: nowIso(),\n vectorCount: chunks.length,\n lastEstimateTokens: estimatedTokens,\n lastEstimateCostUSD: Number(estimatedCostUSD.toFixed(8)),\n lastEstimateChangedChunks: changedChunks.length\n };\n\n await this.vectorStore.recordScope(scopeInfo);\n this.logger.event(\"registry_updated\", {\n scope: scope.scopeName,\n vectorCount: chunks.length\n });\n }\n\n stageEnd(\"finalize\", finalizeStart);\n\n return {\n pagesProcessed: mirrorPages.length,\n chunksTotal: chunks.length,\n chunksChanged: changedChunks.length,\n newEmbeddings,\n deletes: deletes.length,\n estimatedTokens,\n estimatedCostUSD: Number(estimatedCostUSD.toFixed(8)),\n routeExact,\n routeBestEffort,\n stageTimingsMs\n };\n }\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { ResolvedSearchSocketConfig, VectorStore } from \"../types\";\nimport { TursoVectorStore } from \"./turso\";\n\nexport async function createVectorStore(config: ResolvedSearchSocketConfig, cwd: string): Promise<VectorStore> {\n const turso = config.vector.turso;\n const remoteUrl = process.env[turso.urlEnv];\n\n if (remoteUrl) {\n // Use HTTP-only client for remote URLs — avoids native libsql/node:sqlite dependency.\n // This makes SearchSocket work on serverless platforms (Vercel, Cloudflare, etc.)\n // regardless of Node version.\n const { createClient } = await import(\"@libsql/client/http\");\n const authToken = process.env[turso.authTokenEnv];\n const client = createClient({\n url: remoteUrl,\n authToken\n });\n return new TursoVectorStore({\n client,\n dimension: config.vector.dimension\n });\n }\n\n // Local file DB — uses native libsql addon (requires Node with native module support)\n const { createClient } = await import(\"@libsql/client\");\n const localPath = path.resolve(cwd, turso.localPath);\n fs.mkdirSync(path.dirname(localPath), { recursive: true });\n const client = createClient({\n url: `file:${localPath}`\n });\n return new TursoVectorStore({\n client,\n dimension: config.vector.dimension\n });\n}\n","import type { Client, InStatement } from \"@libsql/client\";\nimport type { PageRecord, QueryOpts, Scope, ScopeInfo, VectorHit, VectorRecord, VectorStore } from \"../types\";\n\nexport interface TursoVectorStoreOptions {\n client: Client;\n dimension?: number;\n}\n\nexport class TursoVectorStore implements VectorStore {\n private readonly client: Client;\n private readonly dimension: number | undefined;\n private chunksReady = false;\n private registryReady = false;\n private pagesReady = false;\n\n constructor(opts: TursoVectorStoreOptions) {\n this.client = opts.client;\n this.dimension = opts.dimension;\n }\n\n private async ensureRegistry(): Promise<void> {\n if (this.registryReady) return;\n await this.client.execute(`\n CREATE TABLE IF NOT EXISTS registry (\n scope_key TEXT PRIMARY KEY,\n project_id TEXT NOT NULL,\n scope_name TEXT NOT NULL,\n model_id TEXT NOT NULL,\n last_indexed_at TEXT NOT NULL,\n vector_count INTEGER,\n last_estimate_tokens INTEGER,\n last_estimate_cost_usd REAL,\n last_estimate_changed_chunks INTEGER\n )\n `);\n\n // Migrate existing tables: add estimate columns if missing\n const estimateCols = [\n { name: \"last_estimate_tokens\", def: \"INTEGER\" },\n { name: \"last_estimate_cost_usd\", def: \"REAL\" },\n { name: \"last_estimate_changed_chunks\", def: \"INTEGER\" }\n ];\n for (const col of estimateCols) {\n try {\n await this.client.execute(`ALTER TABLE registry ADD COLUMN ${col.name} ${col.def}`);\n } catch (error) {\n // Only ignore duplicate column errors, rethrow others\n if (error instanceof Error && !error.message.includes(\"duplicate column\")) {\n throw error;\n }\n }\n }\n\n this.registryReady = true;\n }\n\n private async ensureChunks(dim: number): Promise<void> {\n if (this.chunksReady) return;\n await this.client.batch([\n `CREATE TABLE IF NOT EXISTS chunks (\n id TEXT PRIMARY KEY,\n project_id TEXT NOT NULL,\n scope_name TEXT NOT NULL,\n url TEXT NOT NULL,\n path TEXT NOT NULL,\n title TEXT NOT NULL,\n section_title TEXT NOT NULL DEFAULT '',\n heading_path TEXT NOT NULL DEFAULT '[]',\n snippet TEXT NOT NULL DEFAULT '',\n content_hash TEXT NOT NULL DEFAULT '',\n model_id TEXT NOT NULL DEFAULT '',\n depth INTEGER NOT NULL DEFAULT 0,\n incoming_links INTEGER NOT NULL DEFAULT 0,\n route_file TEXT NOT NULL DEFAULT '',\n tags TEXT NOT NULL DEFAULT '[]',\n embedding F32_BLOB(${dim})\n )`,\n `CREATE INDEX IF NOT EXISTS idx ON chunks (libsql_vector_idx(embedding, 'metric=cosine'))`\n ]);\n this.chunksReady = true;\n }\n\n private async ensurePages(): Promise<void> {\n if (this.pagesReady) return;\n await this.client.execute(`\n CREATE TABLE IF NOT EXISTS pages (\n project_id TEXT NOT NULL,\n scope_name TEXT NOT NULL,\n url TEXT NOT NULL,\n title TEXT NOT NULL,\n markdown TEXT NOT NULL,\n route_file TEXT NOT NULL DEFAULT '',\n route_resolution TEXT NOT NULL DEFAULT 'exact',\n incoming_links INTEGER NOT NULL DEFAULT 0,\n outgoing_links INTEGER NOT NULL DEFAULT 0,\n depth INTEGER NOT NULL DEFAULT 0,\n tags TEXT NOT NULL DEFAULT '[]',\n indexed_at TEXT NOT NULL,\n PRIMARY KEY (project_id, scope_name, url)\n )\n `);\n this.pagesReady = true;\n }\n\n private async chunksTableExists(): Promise<boolean> {\n try {\n await this.client.execute(\"SELECT 1 FROM chunks LIMIT 0\");\n return true;\n } catch (error) {\n // Only return false for \"no such table\" errors, rethrow everything else\n if (error instanceof Error && error.message.includes(\"no such table\")) {\n return false;\n }\n throw error;\n }\n }\n\n async upsert(records: VectorRecord[], _scope: Scope): Promise<void> {\n if (records.length === 0) return;\n\n const dim = this.dimension ?? records[0]!.vector.length;\n await this.ensureChunks(dim);\n\n const BATCH_SIZE = 100;\n for (let i = 0; i < records.length; i += BATCH_SIZE) {\n const batch = records.slice(i, i + BATCH_SIZE);\n const stmts: InStatement[] = batch.map((r) => ({\n sql: `INSERT OR REPLACE INTO chunks\n (id, project_id, scope_name, url, path, title, section_title,\n heading_path, snippet, content_hash, model_id, depth,\n incoming_links, route_file, tags, embedding)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, vector(?))`,\n args: [\n r.id,\n r.metadata.projectId,\n r.metadata.scopeName,\n r.metadata.url,\n r.metadata.path,\n r.metadata.title,\n r.metadata.sectionTitle,\n JSON.stringify(r.metadata.headingPath),\n r.metadata.snippet,\n r.metadata.contentHash,\n r.metadata.modelId,\n r.metadata.depth,\n r.metadata.incomingLinks,\n r.metadata.routeFile,\n JSON.stringify(r.metadata.tags),\n JSON.stringify(r.vector)\n ]\n }));\n await this.client.batch(stmts);\n }\n }\n\n async query(queryVector: number[], opts: QueryOpts, scope: Scope): Promise<VectorHit[]> {\n const dim = this.dimension ?? queryVector.length;\n await this.ensureChunks(dim);\n\n const queryJson = JSON.stringify(queryVector);\n const rs = await this.client.execute({\n sql: `SELECT c.id, c.project_id, c.scope_name, c.url, c.path, c.title,\n c.section_title, c.heading_path, c.snippet, c.content_hash,\n c.model_id, c.depth, c.incoming_links, c.route_file, c.tags,\n vector_distance_cos(c.embedding, vector(?)) AS distance\n FROM vector_top_k('idx', vector(?), ?) AS v\n JOIN chunks AS c ON c.rowid = v.id`,\n args: [queryJson, queryJson, opts.topK]\n });\n\n let hits: VectorHit[] = [];\n\n for (const row of rs.rows) {\n const projectId = row.project_id as string;\n const scopeName = row.scope_name as string;\n\n if (projectId !== scope.projectId || scopeName !== scope.scopeName) {\n continue;\n }\n\n const rowPath = row.path as string;\n if (opts.pathPrefix) {\n const rawPrefix = opts.pathPrefix.startsWith(\"/\") ? opts.pathPrefix : `/${opts.pathPrefix}`;\n const prefix = rawPrefix.endsWith(\"/\") ? rawPrefix : `${rawPrefix}/`;\n const normalizedPath = rowPath.replace(/\\/$/, \"\");\n const normalizedPrefix = rawPrefix.replace(/\\/$/, \"\");\n if (normalizedPath !== normalizedPrefix && !rowPath.startsWith(prefix)) {\n continue;\n }\n }\n\n const tags: string[] = JSON.parse((row.tags as string) || \"[]\");\n if (opts.tags && opts.tags.length > 0) {\n if (!opts.tags.every((t) => tags.includes(t))) {\n continue;\n }\n }\n\n const distance = row.distance as number;\n const score = 1 - distance;\n\n hits.push({\n id: row.id as string,\n score,\n metadata: {\n projectId,\n scopeName,\n url: row.url as string,\n path: rowPath,\n title: row.title as string,\n sectionTitle: row.section_title as string,\n headingPath: JSON.parse((row.heading_path as string) || \"[]\"),\n snippet: row.snippet as string,\n contentHash: row.content_hash as string,\n modelId: row.model_id as string,\n depth: row.depth as number,\n incomingLinks: row.incoming_links as number,\n routeFile: row.route_file as string,\n tags\n }\n });\n }\n\n hits.sort((a, b) => b.score - a.score);\n return hits;\n }\n\n async deleteByIds(ids: string[], scope: Scope): Promise<void> {\n if (ids.length === 0) return;\n\n const BATCH_SIZE = 500;\n for (let i = 0; i < ids.length; i += BATCH_SIZE) {\n const batch = ids.slice(i, i + BATCH_SIZE);\n const placeholders = batch.map(() => \"?\").join(\", \");\n await this.client.execute({\n sql: `DELETE FROM chunks WHERE project_id = ? AND scope_name = ? AND id IN (${placeholders})`,\n args: [scope.projectId, scope.scopeName, ...batch]\n });\n }\n }\n\n async deleteScope(scope: Scope): Promise<void> {\n await this.ensureRegistry();\n\n // Delete chunks - table may not exist yet for a fresh DB\n try {\n await this.client.execute({\n sql: `DELETE FROM chunks WHERE project_id = ? AND scope_name = ?`,\n args: [scope.projectId, scope.scopeName]\n });\n } catch (error) {\n // Only ignore \"no such table\" errors\n if (error instanceof Error && !error.message.includes(\"no such table\")) {\n throw error;\n }\n }\n\n // Delete pages - table may not exist yet for a fresh DB\n try {\n await this.client.execute({\n sql: `DELETE FROM pages WHERE project_id = ? AND scope_name = ?`,\n args: [scope.projectId, scope.scopeName]\n });\n } catch (error) {\n // Only ignore \"no such table\" errors\n if (error instanceof Error && !error.message.includes(\"no such table\")) {\n throw error;\n }\n }\n\n await this.client.execute({\n sql: `DELETE FROM registry WHERE project_id = ? AND scope_name = ?`,\n args: [scope.projectId, scope.scopeName]\n });\n }\n\n async listScopes(scopeProjectId: string): Promise<ScopeInfo[]> {\n await this.ensureRegistry();\n const rs = await this.client.execute({\n sql: `SELECT project_id, scope_name, model_id, last_indexed_at, vector_count,\n last_estimate_tokens, last_estimate_cost_usd, last_estimate_changed_chunks\n FROM registry WHERE project_id = ?`,\n args: [scopeProjectId]\n });\n\n return rs.rows.map((row) => ({\n projectId: row.project_id as string,\n scopeName: row.scope_name as string,\n modelId: row.model_id as string,\n lastIndexedAt: row.last_indexed_at as string,\n vectorCount: row.vector_count as number | undefined,\n lastEstimateTokens: row.last_estimate_tokens as number | undefined,\n lastEstimateCostUSD: row.last_estimate_cost_usd as number | undefined,\n lastEstimateChangedChunks: row.last_estimate_changed_chunks as number | undefined\n }));\n }\n\n async recordScope(info: ScopeInfo): Promise<void> {\n await this.ensureRegistry();\n const key = `${info.projectId}:${info.scopeName}`;\n await this.client.execute({\n sql: `INSERT OR REPLACE INTO registry\n (scope_key, project_id, scope_name, model_id, last_indexed_at, vector_count,\n last_estimate_tokens, last_estimate_cost_usd, last_estimate_changed_chunks)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n args: [\n key, info.projectId, info.scopeName, info.modelId, info.lastIndexedAt,\n info.vectorCount ?? null,\n info.lastEstimateTokens ?? null,\n info.lastEstimateCostUSD ?? null,\n info.lastEstimateChangedChunks ?? null\n ]\n });\n }\n\n async getContentHashes(scope: Scope): Promise<Map<string, string>> {\n const exists = await this.chunksTableExists();\n if (!exists) return new Map();\n\n const rs = await this.client.execute({\n sql: `SELECT id, content_hash FROM chunks WHERE project_id = ? AND scope_name = ?`,\n args: [scope.projectId, scope.scopeName]\n });\n\n const map = new Map<string, string>();\n for (const row of rs.rows) {\n map.set(row.id as string, row.content_hash as string);\n }\n return map;\n }\n\n async upsertPages(pages: PageRecord[], scope: Scope): Promise<void> {\n if (pages.length === 0) return;\n await this.ensurePages();\n\n // Validate all pages match the provided scope\n for (const page of pages) {\n if (page.projectId !== scope.projectId || page.scopeName !== scope.scopeName) {\n throw new Error(\n `Page scope mismatch: page has ${page.projectId}:${page.scopeName} but scope is ${scope.projectId}:${scope.scopeName}`\n );\n }\n }\n\n const BATCH_SIZE = 100;\n for (let i = 0; i < pages.length; i += BATCH_SIZE) {\n const batch = pages.slice(i, i + BATCH_SIZE);\n const stmts: InStatement[] = batch.map((p) => ({\n sql: `INSERT OR REPLACE INTO pages\n (project_id, scope_name, url, title, markdown, route_file,\n route_resolution, incoming_links, outgoing_links, depth, tags, indexed_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n args: [\n p.projectId, p.scopeName, p.url, p.title, p.markdown, p.routeFile,\n p.routeResolution, p.incomingLinks, p.outgoingLinks, p.depth,\n JSON.stringify(p.tags), p.indexedAt\n ]\n }));\n await this.client.batch(stmts);\n }\n }\n\n async getPage(url: string, scope: Scope): Promise<PageRecord | null> {\n await this.ensurePages();\n const rs = await this.client.execute({\n sql: `SELECT * FROM pages WHERE project_id = ? AND scope_name = ? AND url = ?`,\n args: [scope.projectId, scope.scopeName, url]\n });\n\n if (rs.rows.length === 0) return null;\n\n const row = rs.rows[0]!;\n return {\n url: row.url as string,\n title: row.title as string,\n markdown: row.markdown as string,\n projectId: row.project_id as string,\n scopeName: row.scope_name as string,\n routeFile: row.route_file as string,\n routeResolution: row.route_resolution as \"exact\" | \"best-effort\",\n incomingLinks: row.incoming_links as number,\n outgoingLinks: row.outgoing_links as number,\n depth: row.depth as number,\n tags: JSON.parse((row.tags as string) || \"[]\"),\n indexedAt: row.indexed_at as string\n };\n }\n\n async deletePages(scope: Scope): Promise<void> {\n await this.ensurePages();\n await this.client.execute({\n sql: `DELETE FROM pages WHERE project_id = ? AND scope_name = ?`,\n args: [scope.projectId, scope.scopeName]\n });\n }\n\n async getScopeModelId(scope: Scope): Promise<string | null> {\n await this.ensureRegistry();\n const rs = await this.client.execute({\n sql: `SELECT model_id FROM registry WHERE project_id = ? AND scope_name = ?`,\n args: [scope.projectId, scope.scopeName]\n });\n\n if (rs.rows.length === 0) return null;\n return rs.rows[0]!.model_id as string;\n }\n\n async health(): Promise<{ ok: boolean; details?: string }> {\n try {\n await this.client.execute(\"SELECT 1\");\n return { ok: true };\n } catch (error) {\n return {\n ok: false,\n details: error instanceof Error ? error.message : \"unknown error\"\n };\n }\n }\n}\n","import { createHash } from \"node:crypto\";\n\nexport function sha1(input: string): string {\n return createHash(\"sha1\").update(input).digest(\"hex\");\n}\n\nexport function sha256(input: string): string {\n return createHash(\"sha256\").update(input).digest(\"hex\");\n}\n","import path from \"node:path\";\n\nexport function normalizeUrlPath(rawPath: string): string {\n let out = rawPath.trim();\n if (!out.startsWith(\"/\")) {\n out = `/${out}`;\n }\n\n out = out.replace(/\\/+/g, \"/\");\n\n if (out.length > 1 && out.endsWith(\"/\")) {\n out = out.slice(0, -1);\n }\n\n return out;\n}\n\nexport function urlPathToMirrorRelative(urlPath: string): string {\n const normalized = normalizeUrlPath(urlPath);\n\n if (normalized === \"/\") {\n return \"index.md\";\n }\n\n return `${normalized.slice(1)}.md`;\n}\n\nexport function staticHtmlFileToUrl(filePath: string, rootDir: string): string {\n const relative = path.relative(rootDir, filePath).replace(/\\\\/g, \"/\");\n\n if (relative === \"index.html\") {\n return \"/\";\n }\n\n if (relative.endsWith(\"/index.html\")) {\n return normalizeUrlPath(relative.slice(0, -\"/index.html\".length));\n }\n\n if (relative.endsWith(\".html\")) {\n return normalizeUrlPath(relative.slice(0, -\".html\".length));\n }\n\n return normalizeUrlPath(relative);\n}\n\nexport function getUrlDepth(urlPath: string): number {\n if (urlPath === \"/\") {\n return 0;\n }\n\n return normalizeUrlPath(urlPath)\n .split(\"/\")\n .filter(Boolean).length;\n}\n\nexport function humanizeUrlPath(urlPath: string): string {\n const normalized = normalizeUrlPath(urlPath);\n if (normalized === \"/\") return \"\";\n return normalized\n .slice(1)\n .split(\"/\")\n .map((segment) => segment.replace(/[-_]/g, \" \"))\n .join(\" / \");\n}\n\nexport function ensureLeadingSlash(value: string): string {\n return value.startsWith(\"/\") ? value : `/${value}`;\n}\n\nexport function joinUrl(baseUrl: string, route: string): string {\n const base = baseUrl.endsWith(\"/\") ? baseUrl.slice(0, -1) : baseUrl;\n const routePart = ensureLeadingSlash(route);\n return `${base}${routePart}`;\n}\n","import type { Chunk, MirrorPage, ResolvedSearchSocketConfig, Scope } from \"../types\";\nimport { sha1, sha256 } from \"../utils/hash\";\nimport { humanizeUrlPath } from \"../utils/path\";\nimport { extractFirstParagraph, normalizeText, toSnippet } from \"../utils/text\";\n\ninterface Section {\n sectionTitle?: string;\n headingPath: string[];\n text: string;\n}\n\nconst FENCE_LINE_RE = /^(```|~~~)/;\n\nfunction parseHeadingSections(markdown: string, headingPathDepth: number): Section[] {\n const lines = markdown.split(\"\\n\");\n const sections: Section[] = [];\n\n const headingStack: Array<string | undefined> = [];\n let inFence = false;\n\n let current: Section = {\n sectionTitle: undefined,\n headingPath: [],\n text: \"\"\n };\n\n const flush = (): void => {\n if (normalizeText(current.text)) {\n sections.push({\n sectionTitle: current.sectionTitle,\n headingPath: current.headingPath,\n text: current.text.trim()\n });\n }\n };\n\n for (const line of lines) {\n if (FENCE_LINE_RE.test(line.trim())) {\n inFence = !inFence;\n }\n\n const headingMatch = !inFence ? line.match(/^(#{1,6})\\s+(.+)$/) : null;\n if (headingMatch) {\n flush();\n\n const level = (headingMatch[1] ?? \"#\").length;\n const title = (headingMatch[2] ?? \"\").trim();\n headingStack[level - 1] = title;\n headingStack.length = level;\n\n current = {\n sectionTitle: title,\n headingPath: headingStack.filter((entry): entry is string => Boolean(entry)).slice(0, headingPathDepth),\n text: `${line}\\n`\n };\n continue;\n }\n\n current.text += `${line}\\n`;\n }\n\n flush();\n\n if (sections.length === 0 && normalizeText(markdown)) {\n sections.push({\n sectionTitle: undefined,\n headingPath: [],\n text: markdown.trim()\n });\n }\n\n return sections;\n}\n\nfunction blockify(text: string, config: ResolvedSearchSocketConfig[\"chunking\"]): string[] {\n const lines = text.split(\"\\n\");\n const blocks: string[] = [];\n\n let inFence = false;\n let current: string[] = [];\n\n const flush = (): void => {\n const value = current.join(\"\\n\").trim();\n if (value) {\n blocks.push(value);\n }\n current = [];\n };\n\n for (let i = 0; i < lines.length; i += 1) {\n const line = lines[i] ?? \"\";\n const trimmed = line.trim();\n\n if (FENCE_LINE_RE.test(trimmed)) {\n inFence = !inFence;\n current.push(line);\n continue;\n }\n\n if (inFence) {\n current.push(line);\n continue;\n }\n\n const isTableLine = /^\\|.*\\|$/.test(trimmed) || /^\\|?\\s*:?-+:?\\s*\\|/.test(trimmed);\n const isQuoteLine = /^>/.test(trimmed);\n\n if (isTableLine && config.dontSplitInside.includes(\"table\")) {\n current.push(line);\n while (i + 1 < lines.length) {\n const next = lines[i + 1];\n if (!next || !/^\\|/.test(next.trim())) {\n break;\n }\n i += 1;\n current.push(lines[i] ?? \"\");\n }\n continue;\n }\n\n if (isQuoteLine && config.dontSplitInside.includes(\"blockquote\")) {\n current.push(line);\n while (i + 1 < lines.length) {\n const next = lines[i + 1];\n if (!next || !/^>/.test(next.trim())) {\n break;\n }\n i += 1;\n current.push(lines[i] ?? \"\");\n }\n continue;\n }\n\n if (!trimmed) {\n flush();\n continue;\n }\n\n current.push(line);\n }\n\n flush();\n return blocks;\n}\n\nfunction isProtectedBlock(block: string, config: ResolvedSearchSocketConfig[\"chunking\"]): boolean {\n const lines = block.trim().split(\"\\n\");\n const first = (lines[0] ?? \"\").trim();\n const last = (lines[lines.length - 1] ?? \"\").trim();\n\n const isCodeBlock = FENCE_LINE_RE.test(first) && FENCE_LINE_RE.test(last);\n if (isCodeBlock && config.dontSplitInside.includes(\"code\")) {\n return true;\n }\n\n const isTableBlock = lines.every((line) => {\n const trimmed = line.trim();\n return trimmed.length === 0 || /^\\|.*\\|$/.test(trimmed) || /^\\|?\\s*:?-+:?\\s*\\|/.test(trimmed);\n });\n if (isTableBlock && config.dontSplitInside.includes(\"table\")) {\n return true;\n }\n\n const isQuoteBlock = lines.every((line) => {\n const trimmed = line.trim();\n return trimmed.length === 0 || trimmed.startsWith(\">\");\n });\n return isQuoteBlock && config.dontSplitInside.includes(\"blockquote\");\n}\n\nfunction splitOversizedBlock(block: string, config: ResolvedSearchSocketConfig[\"chunking\"]): string[] {\n const trimmed = block.trim();\n if (trimmed.length <= config.maxChars || isProtectedBlock(trimmed, config)) {\n return [trimmed];\n }\n\n const chunks: string[] = [];\n let start = 0;\n\n while (start < trimmed.length) {\n let end = Math.min(start + config.maxChars, trimmed.length);\n\n if (end < trimmed.length) {\n const boundary = trimmed.lastIndexOf(\" \", end);\n if (boundary > start + Math.floor(config.maxChars * 0.6)) {\n end = boundary;\n }\n }\n\n const chunk = trimmed.slice(start, end).trim();\n if (chunk) {\n chunks.push(chunk);\n }\n\n if (end >= trimmed.length) {\n break;\n }\n\n const nextStart = Math.max(0, end - config.overlapChars);\n start = nextStart > start ? nextStart : end;\n }\n\n return chunks.length > 0 ? chunks : [trimmed];\n}\n\nfunction splitSection(section: Section, config: ResolvedSearchSocketConfig[\"chunking\"]): Array<Pick<Chunk, \"sectionTitle\" | \"headingPath\" | \"chunkText\">> {\n const text = section.text.trim();\n if (!text) {\n return [];\n }\n\n if (text.length <= config.maxChars) {\n return [\n {\n sectionTitle: section.sectionTitle,\n headingPath: section.headingPath,\n chunkText: text\n }\n ];\n }\n\n const blocks = blockify(text, config);\n const chunks: string[] = [];\n let current = \"\";\n\n for (const block of blocks) {\n const pieces = splitOversizedBlock(block, config);\n\n for (const piece of pieces) {\n if (!current) {\n current = piece;\n continue;\n }\n\n const candidate = `${current}\\n\\n${piece}`;\n if (candidate.length <= config.maxChars) {\n current = candidate;\n continue;\n }\n\n chunks.push(current);\n\n const overlap = current.slice(Math.max(0, current.length - config.overlapChars)).trim();\n const withOverlap = overlap ? `${overlap}\\n\\n${piece}` : piece;\n current = withOverlap.length <= config.maxChars ? withOverlap : piece;\n }\n }\n\n if (current.trim()) {\n chunks.push(current.trim());\n }\n\n const merged: string[] = [];\n for (const chunk of chunks) {\n if (merged.length === 0) {\n merged.push(chunk);\n continue;\n }\n\n const canMerge =\n chunk.length < config.minChars &&\n merged[merged.length - 1] !== undefined &&\n (merged[merged.length - 1]?.length ?? 0) + 2 + chunk.length <= config.maxChars;\n\n if (canMerge) {\n merged[merged.length - 1] = `${merged[merged.length - 1]}\\n\\n${chunk}`;\n } else {\n merged.push(chunk);\n }\n }\n\n return merged.map((chunkText) => ({\n sectionTitle: section.sectionTitle,\n headingPath: section.headingPath,\n chunkText\n }));\n}\n\nexport function buildSummaryChunkText(page: MirrorPage): string {\n const parts: string[] = [page.title];\n\n const humanized = humanizeUrlPath(page.url);\n if (humanized) parts.push(humanized);\n\n const body = page.description ?? extractFirstParagraph(page.markdown);\n if (body) parts.push(body);\n\n if (page.keywords && page.keywords.length > 0) {\n parts.push(page.keywords.join(\", \"));\n }\n\n return parts.join(\"\\n\\n\");\n}\n\nexport function buildEmbeddingText(chunk: Chunk, prependTitle: boolean): string {\n if (!prependTitle) return chunk.chunkText;\n const prefix = chunk.sectionTitle\n ? `${chunk.title} — ${chunk.sectionTitle}`\n : chunk.title;\n return `${prefix}\\n\\n${chunk.chunkText}`;\n}\n\nexport function chunkMirrorPage(\n page: MirrorPage,\n config: ResolvedSearchSocketConfig,\n scope: Scope\n): Chunk[] {\n const sections = parseHeadingSections(page.markdown, config.chunking.headingPathDepth);\n const rawChunks = sections.flatMap((section) => splitSection(section, config.chunking));\n\n const chunks: Chunk[] = [];\n\n if (config.chunking.pageSummaryChunk) {\n const summaryText = buildSummaryChunkText(page);\n const summaryChunkKey = sha1(`${scope.scopeName}|${page.url}|__summary__`);\n\n const summaryChunk: Chunk = {\n chunkKey: summaryChunkKey,\n ordinal: 0,\n url: page.url,\n path: page.url,\n title: page.title,\n sectionTitle: undefined,\n headingPath: [],\n chunkText: summaryText,\n snippet: toSnippet(summaryText),\n depth: page.depth,\n incomingLinks: page.incomingLinks,\n routeFile: page.routeFile,\n tags: page.tags,\n contentHash: \"\"\n };\n\n const embeddingText = buildEmbeddingText(summaryChunk, config.chunking.prependTitle);\n summaryChunk.contentHash = sha256(normalizeText(embeddingText));\n chunks.push(summaryChunk);\n }\n\n const ordinalOffset = config.chunking.pageSummaryChunk ? 1 : 0;\n\n for (let index = 0; index < rawChunks.length; index++) {\n const entry = rawChunks[index]!;\n const sectionTitleNormalized = normalizeText(entry.sectionTitle ?? \"\").toLowerCase();\n const chunkKey = sha1(\n `${scope.scopeName}|${page.url}|${index}|${sectionTitleNormalized}`\n );\n\n const chunk: Chunk = {\n chunkKey,\n ordinal: index + ordinalOffset,\n url: page.url,\n path: page.url,\n title: page.title,\n sectionTitle: entry.sectionTitle,\n headingPath: entry.headingPath,\n chunkText: entry.chunkText,\n snippet: toSnippet(entry.chunkText),\n depth: page.depth,\n incomingLinks: page.incomingLinks,\n routeFile: page.routeFile,\n tags: page.tags,\n contentHash: \"\"\n };\n\n const embeddingText = buildEmbeddingText(chunk, config.chunking.prependTitle);\n chunk.contentHash = sha256(normalizeText(embeddingText));\n chunks.push(chunk);\n }\n\n return chunks;\n}\n","import { load } from \"cheerio\";\nimport matter from \"gray-matter\";\nimport TurndownService from \"turndown\";\nimport { gfm, highlightedCodeBlock, strikethrough, tables, taskListItems } from \"turndown-plugin-gfm\";\nimport type { ExtractedPage, ResolvedSearchSocketConfig } from \"../types\";\nimport { normalizeMarkdown, normalizeText } from \"../utils/text\";\nimport { normalizeUrlPath } from \"../utils/path\";\n\nfunction hasTopLevelNoindexComment(markdown: string): boolean {\n const lines = markdown.split(/\\r?\\n/);\n let inFence = false;\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (/^(```|~~~)/.test(trimmed)) {\n inFence = !inFence;\n continue;\n }\n\n if (!inFence && /<!--\\s*noindex\\s*-->/i.test(line)) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function extractFromHtml(\n url: string,\n html: string,\n config: ResolvedSearchSocketConfig\n): ExtractedPage | null {\n const $ = load(html);\n const normalizedUrl = normalizeUrlPath(url);\n const pageBaseUrl = new URL(`https://searchsocket.local${normalizedUrl}`);\n\n const title =\n normalizeText($(\"title\").first().text() || \"\") ||\n normalizeText($(`${config.extract.mainSelector} h1`).first().text() || \"\") ||\n normalizedUrl;\n\n if (config.extract.respectRobotsNoindex) {\n const robots = $(\"meta[name='robots']\").attr(\"content\") ?? \"\";\n if (/\\bnoindex\\b/i.test(robots)) {\n return null;\n }\n }\n\n if ($(`[${config.extract.noindexAttr}]`).length > 0) {\n return null;\n }\n\n const description =\n $(\"meta[name='description']\").attr(\"content\")?.trim() ||\n $(\"meta[property='og:description']\").attr(\"content\")?.trim() ||\n undefined;\n\n const keywordsRaw = $(\"meta[name='keywords']\").attr(\"content\")?.trim();\n const keywords = keywordsRaw\n ? keywordsRaw.split(\",\").map((k) => k.trim()).filter(Boolean)\n : undefined;\n\n const root = $(config.extract.mainSelector).first().length\n ? $(config.extract.mainSelector).first().clone()\n : $(\"body\").first().clone();\n\n for (const tagName of config.extract.dropTags) {\n root.find(tagName).remove();\n }\n\n for (const selector of config.extract.dropSelectors) {\n root.find(selector).remove();\n }\n\n root.find(`[${config.extract.ignoreAttr}]`).remove();\n\n const outgoingLinks: string[] = [];\n root.find(\"a[href]\").each((_index, node) => {\n const href = $(node).attr(\"href\");\n if (!href || href.startsWith(\"#\") || href.startsWith(\"mailto:\") || href.startsWith(\"tel:\")) {\n return;\n }\n\n try {\n const parsed = new URL(href, pageBaseUrl);\n if (![\"http:\", \"https:\"].includes(parsed.protocol)) {\n return;\n }\n\n outgoingLinks.push(normalizeUrlPath(parsed.pathname));\n } catch {\n // ignore malformed links\n }\n });\n\n const turndown = new TurndownService({\n headingStyle: \"atx\",\n codeBlockStyle: \"fenced\"\n });\n\n if (config.transform.preserveCodeBlocks && config.transform.preserveTables) {\n turndown.use(gfm);\n } else {\n // Always apply strikethrough and task list items\n turndown.use(strikethrough);\n turndown.use(taskListItems);\n\n if (config.transform.preserveTables) {\n turndown.use(tables);\n }\n if (config.transform.preserveCodeBlocks) {\n turndown.use(highlightedCodeBlock);\n }\n }\n\n const markdown = normalizeMarkdown(turndown.turndown(root.html() ?? \"\"));\n\n if (!normalizeText(markdown)) {\n return null;\n }\n\n const tags = normalizeUrlPath(url)\n .split(\"/\")\n .filter(Boolean)\n .slice(0, 1);\n\n return {\n url: normalizeUrlPath(url),\n title,\n markdown,\n outgoingLinks: [...new Set(outgoingLinks)],\n noindex: false,\n tags,\n description,\n keywords\n };\n}\n\nexport function extractFromMarkdown(url: string, markdown: string, title?: string): ExtractedPage | null {\n // Check for <!-- noindex --> comments outside fenced code blocks.\n if (hasTopLevelNoindexComment(markdown)) {\n return null;\n }\n\n // Parse frontmatter and check for noindex flag\n const parsed = matter(markdown);\n const frontmatter = parsed.data as Record<string, unknown>;\n\n const searchsocketMeta = frontmatter.searchsocket as Record<string, unknown> | undefined;\n if (frontmatter.noindex === true || searchsocketMeta?.noindex === true) {\n return null;\n }\n\n const content = parsed.content;\n const normalized = normalizeMarkdown(content);\n if (!normalizeText(normalized)) {\n return null;\n }\n\n const resolvedTitle = title ?? (typeof frontmatter.title === \"string\" ? frontmatter.title : undefined) ?? normalizeUrlPath(url);\n\n const fmDescription = typeof frontmatter.description === \"string\" ? frontmatter.description.trim() || undefined : undefined;\n let fmKeywords: string[] | undefined;\n if (Array.isArray(frontmatter.keywords)) {\n fmKeywords = frontmatter.keywords.filter((k): k is string => typeof k === \"string\" && k.trim().length > 0).map((k) => k.trim());\n } else if (typeof frontmatter.keywords === \"string\" && frontmatter.keywords.trim()) {\n fmKeywords = frontmatter.keywords.split(\",\").map((k) => k.trim()).filter(Boolean);\n }\n if (fmKeywords && fmKeywords.length === 0) fmKeywords = undefined;\n\n return {\n url: normalizeUrlPath(url),\n title: resolvedTitle,\n markdown: normalized,\n outgoingLinks: [],\n noindex: false,\n tags: normalizeUrlPath(url)\n .split(\"/\")\n .filter(Boolean)\n .slice(0, 1),\n description: fmDescription,\n keywords: fmKeywords\n };\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { MirrorPage, Scope } from \"../types\";\nimport { urlPathToMirrorRelative } from \"../utils/path\";\nimport { normalizeMarkdown } from \"../utils/text\";\n\nfunction yamlString(value: string): string {\n return JSON.stringify(value);\n}\n\nfunction yamlArray(values: string[]): string {\n return `[${values.map((v) => JSON.stringify(v)).join(\", \")}]`;\n}\n\nexport function buildMirrorMarkdown(page: MirrorPage): string {\n const frontmatterLines = [\n \"---\",\n `url: ${yamlString(page.url)}`,\n `title: ${yamlString(page.title)}`,\n `scope: ${yamlString(page.scope)}`,\n `routeFile: ${yamlString(page.routeFile)}`,\n `routeResolution: ${yamlString(page.routeResolution)}`,\n `generatedAt: ${yamlString(page.generatedAt)}`,\n `incomingLinks: ${page.incomingLinks}`,\n `outgoingLinks: ${page.outgoingLinks}`,\n `depth: ${page.depth}`,\n `tags: ${yamlArray(page.tags)}`,\n \"---\",\n \"\"\n ];\n\n return `${frontmatterLines.join(\"\\n\")}${normalizeMarkdown(page.markdown)}`;\n}\n\nfunction stripGeneratedAt(content: string): string {\n return content.replace(/^generatedAt: .*$/m, \"\");\n}\n\nexport async function writeMirrorPage(statePath: string, scope: Scope, page: MirrorPage): Promise<string> {\n const relative = urlPathToMirrorRelative(page.url);\n const outputPath = path.join(statePath, \"pages\", scope.scopeName, relative);\n await fs.mkdir(path.dirname(outputPath), { recursive: true });\n\n const newContent = buildMirrorMarkdown(page);\n\n try {\n const existing = await fs.readFile(outputPath, \"utf8\");\n if (stripGeneratedAt(existing) === stripGeneratedAt(newContent)) {\n return outputPath;\n }\n } catch {\n // File doesn't exist yet, write it\n }\n\n await fs.writeFile(outputPath, newContent, \"utf8\");\n return outputPath;\n}\n\nexport async function cleanMirrorForScope(statePath: string, scope: Scope): Promise<void> {\n const target = path.join(statePath, \"pages\", scope.scopeName);\n await fs.rm(target, { recursive: true, force: true });\n await fs.mkdir(target, { recursive: true });\n}\n","import path from \"node:path\";\nimport fg from \"fast-glob\";\nimport type { RouteMatch } from \"../types\";\nimport { normalizeUrlPath } from \"../utils/path\";\n\ninterface RoutePattern {\n routeFile: string;\n regex: RegExp;\n score: number;\n}\n\nfunction segmentToRegex(segment: string): { regex: string; score: number } {\n if (segment.startsWith(\"(\") && segment.endsWith(\")\")) {\n return { regex: \"\", score: 0 };\n }\n\n if (/^\\[\\[\\.\\.\\.[^\\]]+\\]\\]$/.test(segment)) {\n return { regex: \"(?:/.+)?\", score: -2 };\n }\n\n if (/^\\[\\.\\.\\.[^\\]]+\\]$/.test(segment)) {\n return { regex: \"/.+\", score: 0 };\n }\n\n if (/^\\[\\[[^\\]]+\\]\\]$/.test(segment)) {\n return { regex: \"(?:/[^/]+)?\", score: -1 };\n }\n\n if (/^\\[[^\\]]+\\]$/.test(segment)) {\n return { regex: \"/[^/]+\", score: 3 };\n }\n\n return { regex: `/${segment.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")}`, score: 10 };\n}\n\nfunction routeFileToPattern(routeFile: string, cwd: string): RoutePattern {\n const relative = path.relative(cwd, routeFile).replace(/\\\\/g, \"/\");\n const withoutPrefix = relative.replace(/^src\\/routes\\/?/, \"\");\n const withoutPage = withoutPrefix.replace(/\\/\\+page\\.[^/]+$/, \"\");\n const segments = withoutPage.split(\"/\").filter(Boolean);\n\n let regex = \"^\";\n let score = 0;\n\n if (segments.length === 0) {\n regex += \"/\";\n } else {\n for (const segment of segments) {\n const converted = segmentToRegex(segment);\n regex += converted.regex;\n score += converted.score;\n }\n }\n\n regex += \"/?$\";\n\n return {\n routeFile: relative,\n regex: new RegExp(regex),\n score\n };\n}\n\nexport async function buildRoutePatterns(cwd: string): Promise<RoutePattern[]> {\n const files = await fg(\"src/routes/**/+page.svelte\", {\n cwd,\n absolute: true\n });\n\n return files\n .map((file) => routeFileToPattern(file, cwd))\n .sort((a, b) => b.score - a.score || b.routeFile.length - a.routeFile.length);\n}\n\nexport function mapUrlToRoute(urlPath: string, patterns: RoutePattern[]): RouteMatch {\n const normalized = normalizeUrlPath(urlPath);\n\n for (const pattern of patterns) {\n if (pattern.regex.test(normalized)) {\n return {\n routeFile: pattern.routeFile,\n routeResolution: \"exact\"\n };\n }\n }\n\n const rootRoute = patterns.find((pattern) => pattern.routeFile === \"src/routes/+page.svelte\");\n if (rootRoute) {\n return {\n routeFile: rootRoute.routeFile,\n routeResolution: \"best-effort\"\n };\n }\n\n const fallback = patterns[0];\n return {\n routeFile: fallback?.routeFile ?? \"src/routes/+page.svelte\",\n routeResolution: \"best-effort\"\n };\n}\n","import pLimit from \"p-limit\";\nimport { Logger } from \"../../../core/logger\";\nimport { normalizeUrlPath, joinUrl } from \"../../../utils/path\";\nimport type { PageSourceRecord, ResolvedSearchSocketConfig } from \"../../../types\";\nimport { parseManifest, expandRoutes } from \"./manifest-parser\";\nimport { startPreviewServer } from \"./preview-server\";\n\nconst logger = new Logger();\n\nexport async function loadBuildPages(\n cwd: string,\n config: ResolvedSearchSocketConfig,\n maxPages?: number\n): Promise<PageSourceRecord[]> {\n const buildConfig = config.source.build;\n if (!buildConfig) {\n throw new Error(\"build source config is missing\");\n }\n\n const routes = await parseManifest(cwd, buildConfig.outputDir);\n const expanded = expandRoutes(routes, buildConfig.paramValues, buildConfig.exclude, logger);\n\n logger.event(\"build_routes_discovered\", {\n manifestRoutes: routes.length,\n expandedRoutes: expanded.length\n });\n\n const maxCount = typeof maxPages === \"number\" ? Math.max(0, Math.floor(maxPages)) : undefined;\n const selected = typeof maxCount === \"number\" ? expanded.slice(0, maxCount) : expanded;\n\n const server = await startPreviewServer(cwd, { previewTimeout: buildConfig.previewTimeout }, logger);\n\n try {\n const concurrencyLimit = pLimit(8);\n const results = await Promise.allSettled(\n selected.map((route) =>\n concurrencyLimit(async (): Promise<PageSourceRecord> => {\n const fetchUrl = joinUrl(server.baseUrl, route.url);\n const response = await fetch(fetchUrl);\n\n if (!response.ok) {\n throw new Error(`Failed to fetch ${route.url}: ${response.status} ${response.statusText}`);\n }\n\n return {\n url: normalizeUrlPath(route.url),\n html: await response.text(),\n sourcePath: route.routeFile,\n outgoingLinks: [],\n routeFile: route.routeFile,\n routeResolution: \"exact\"\n };\n })\n )\n );\n\n const pages: PageSourceRecord[] = [];\n for (let i = 0; i < results.length; i += 1) {\n const result = results[i];\n if (!result) continue;\n if (result.status === \"fulfilled\") {\n pages.push(result.value);\n } else {\n const route = selected[i]?.url ?? \"unknown\";\n logger.warn(\n `Skipping build route ${route}: ${result.reason instanceof Error ? result.reason.message : String(result.reason)}`\n );\n }\n }\n\n return pages;\n } finally {\n await server.shutdown();\n }\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { SearchSocketError } from \"../../../errors\";\nimport { Logger } from \"../../../core/logger\";\n\nexport interface ManifestRoute {\n id: string;\n isPage: boolean;\n isDynamic: boolean;\n routeFile: string;\n}\n\nexport interface ExpandedRoute {\n url: string;\n routeFile: string;\n}\n\nexport function routeIdToFile(routeId: string): string {\n if (routeId === \"/\") {\n return \"src/routes/+page.svelte\";\n }\n return `src/routes${routeId}/+page.svelte`;\n}\n\nexport function routeIdToUrl(routeId: string): string {\n if (routeId === \"/\") return \"/\";\n\n return routeId\n .split(\"/\")\n .filter((seg) => !(seg.startsWith(\"(\") && seg.endsWith(\")\")))\n .join(\"/\") || \"/\";\n}\n\nexport async function parseManifest(cwd: string, outputDir: string): Promise<ManifestRoute[]> {\n const manifestPath = path.resolve(cwd, outputDir, \"server\", \"manifest-full.js\");\n\n let content: string;\n try {\n content = await fs.readFile(manifestPath, \"utf8\");\n } catch {\n throw new SearchSocketError(\n \"BUILD_MANIFEST_NOT_FOUND\",\n `SvelteKit build manifest not found at ${manifestPath}. Run \\`vite build\\` first.`\n );\n }\n\n const routes: ManifestRoute[] = [];\n\n // Find all route ID positions, then extract context between them\n const idRegex = /id:\\s*\"([^\"]+)\"/g;\n const idMatches: Array<{ id: string; index: number }> = [];\n\n let idMatch: RegExpExecArray | null;\n while ((idMatch = idRegex.exec(content)) !== null) {\n idMatches.push({ id: idMatch[1]!, index: idMatch.index });\n }\n\n for (let i = 0; i < idMatches.length; i++) {\n const current = idMatches[i]!;\n const nextIndex = idMatches[i + 1]?.index ?? content.length;\n const block = content.slice(current.index, nextIndex);\n\n // A page route has `page: {` with a non-null value\n const isPage = /page:\\s*\\{/.test(block);\n if (!isPage) continue;\n\n const isDynamic = current.id.includes(\"[\");\n\n routes.push({\n id: current.id,\n isPage: true,\n isDynamic,\n routeFile: routeIdToFile(current.id)\n });\n }\n\n return routes;\n}\n\nexport function expandRoutes(\n routes: ManifestRoute[],\n paramValues: Record<string, string[]>,\n exclude: string[],\n logger: Logger\n): ExpandedRoute[] {\n const expanded: ExpandedRoute[] = [];\n\n for (const route of routes) {\n const url = routeIdToUrl(route.id);\n\n if (isExcluded(url, exclude)) continue;\n\n if (!route.isDynamic) {\n expanded.push({ url, routeFile: route.routeFile });\n continue;\n }\n\n // Look up param values by route ID first, then by URL (handles layout group mismatch)\n const values = paramValues[route.id] ?? paramValues[url];\n if (!values || values.length === 0) {\n logger.warn(\n `Skipping dynamic route ${route.id}: no paramValues provided. ` +\n `Add paramValues[\"${route.id}\"] or paramValues[\"${url}\"] to your build config.`\n );\n continue;\n }\n\n for (const value of values) {\n const expandedUrl = expandDynamicUrl(url, value);\n if (!isExcluded(expandedUrl, exclude)) {\n expanded.push({ url: expandedUrl, routeFile: route.routeFile });\n }\n }\n }\n\n return expanded;\n}\n\nfunction expandDynamicUrl(url: string, value: string): string {\n // Replace all [param], [...param], [[param]], [[...param]] segments with the value\n return url.replace(/\\[\\[?\\.\\.\\.[^\\]]+\\]?\\]|\\[\\[[^\\]]+\\]\\]|\\[[^\\]]+\\]/g, value);\n}\n\nfunction isExcluded(url: string, patterns: string[]): boolean {\n for (const pattern of patterns) {\n if (pattern.endsWith(\"/*\")) {\n const prefix = pattern.slice(0, -1);\n if (url.startsWith(prefix) || url === prefix.slice(0, -1)) return true;\n } else if (url === pattern) {\n return true;\n }\n }\n return false;\n}\n","import net from \"node:net\";\nimport path from \"node:path\";\nimport fs from \"node:fs\";\nimport { spawn, type ChildProcess } from \"node:child_process\";\nimport { SearchSocketError } from \"../../../errors\";\nimport { Logger } from \"../../../core/logger\";\n\nexport interface PreviewServer {\n baseUrl: string;\n port: number;\n shutdown(): Promise<void>;\n}\n\nfunction findFreePort(): Promise<number> {\n return new Promise((resolve, reject) => {\n const server = net.createServer();\n server.listen(0, \"127.0.0.1\", () => {\n const addr = server.address();\n if (!addr || typeof addr === \"string\") {\n server.close(() => reject(new Error(\"Failed to get port\")));\n return;\n }\n const port = addr.port;\n server.close(() => resolve(port));\n });\n server.on(\"error\", reject);\n });\n}\n\nasync function waitForReady(url: string, timeout: number, child: ChildProcess): Promise<void> {\n const deadline = Date.now() + timeout;\n\n while (Date.now() < deadline) {\n // Check if process exited early\n if (child.exitCode !== null) {\n throw new SearchSocketError(\n \"BUILD_SERVER_FAILED\",\n `vite preview exited with code ${child.exitCode} before becoming ready.`\n );\n }\n\n try {\n const res = await fetch(url, { signal: AbortSignal.timeout(2000) });\n if (res.status < 500) return;\n } catch {\n // Not ready yet\n }\n\n await new Promise((resolve) => setTimeout(resolve, 250));\n }\n\n throw new SearchSocketError(\n \"BUILD_SERVER_FAILED\",\n `vite preview did not become ready within ${timeout}ms. Check that \\`vite build\\` completed successfully.`\n );\n}\n\nexport async function startPreviewServer(\n cwd: string,\n options: { previewTimeout: number },\n logger: Logger\n): Promise<PreviewServer> {\n const viteBin = path.join(cwd, \"node_modules\", \".bin\", \"vite\");\n if (!fs.existsSync(viteBin)) {\n throw new SearchSocketError(\n \"BUILD_SERVER_FAILED\",\n `vite binary not found at ${viteBin}. Ensure vite is installed.`\n );\n }\n\n const port = await findFreePort();\n const baseUrl = `http://127.0.0.1:${port}`;\n\n logger.event(\"preview_server_starting\", { port });\n\n const child = spawn(viteBin, [\"preview\", \"--port\", String(port), \"--strictPort\", \"--host\", \"127.0.0.1\"], {\n cwd,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n env: { ...process.env }\n });\n\n let stderr = \"\";\n child.stderr?.on(\"data\", (chunk: Buffer) => {\n stderr += chunk.toString();\n });\n\n const shutdown = async (): Promise<void> => {\n if (child.exitCode !== null) return;\n\n child.kill(\"SIGTERM\");\n\n await Promise.race([\n new Promise<void>((resolve) => child.on(\"close\", () => resolve())),\n new Promise<void>((resolve) => setTimeout(() => {\n if (child.exitCode === null) child.kill(\"SIGKILL\");\n resolve();\n }, 3000))\n ]);\n };\n\n try {\n await waitForReady(baseUrl, options.previewTimeout, child);\n } catch (error) {\n await shutdown();\n if (stderr) {\n logger.warn(`vite preview stderr: ${stderr.slice(0, 500)}`);\n }\n throw error;\n }\n\n logger.event(\"preview_server_ready\", { port, baseUrl });\n\n return { baseUrl, port, shutdown };\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport fg from \"fast-glob\";\nimport type { PageSourceRecord, ResolvedSearchSocketConfig } from \"../../types\";\nimport { normalizeUrlPath } from \"../../utils/path\";\n\nfunction filePathToUrl(filePath: string, baseDir: string): string {\n const relative = path.relative(baseDir, filePath).replace(/\\\\/g, \"/\");\n const segments = relative.split(\"/\").filter(Boolean);\n\n if (/(^|\\/)\\+page\\.svelte$/.test(relative)) {\n const routeSegments = segments.slice();\n\n if ((routeSegments[0] ?? \"\").toLowerCase() === \"src\" && (routeSegments[1] ?? \"\").toLowerCase() === \"routes\") {\n routeSegments.splice(0, 2);\n } else if ((routeSegments[0] ?? \"\").toLowerCase() === \"routes\") {\n routeSegments.splice(0, 1);\n }\n\n const routePath = routeSegments\n .filter((segment) => segment !== \"+page.svelte\")\n .filter((segment) => segment && !segment.startsWith(\"(\"))\n .map((segment) =>\n segment\n .replace(/^\\[\\[[^\\]]+\\]\\]$/, \"optional\")\n .replace(/^\\[\\.\\.\\.[^\\]]+\\]$/, \"splat\")\n .replace(/^\\[[^\\]]+\\]$/, \"param\")\n )\n .join(\"/\");\n\n return normalizeUrlPath(routePath || \"/\");\n }\n\n const noExt = relative\n .replace(/\\.md$/i, \"\")\n .replace(/\\/index$/i, \"\");\n\n return normalizeUrlPath(noExt || \"/\");\n}\n\nfunction normalizeSvelteToMarkdown(source: string): string {\n return source\n .replace(/<script[\\s\\S]*?<\\/script>/g, \"\")\n .replace(/<style[\\s\\S]*?<\\/style>/g, \"\")\n .replace(/<[^>]+>/g, \" \")\n .replace(/\\{[^}]+\\}/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim();\n}\n\nexport async function loadContentFilesPages(\n cwd: string,\n config: ResolvedSearchSocketConfig,\n maxPages?: number\n): Promise<PageSourceRecord[]> {\n const contentConfig = config.source.contentFiles;\n if (!contentConfig) {\n throw new Error(\"content-files config is missing\");\n }\n\n const baseDir = path.resolve(cwd, contentConfig.baseDir);\n const files = await fg(contentConfig.globs, {\n cwd: baseDir,\n absolute: true,\n onlyFiles: true\n });\n\n const limit = typeof maxPages === \"number\" ? Math.max(0, Math.floor(maxPages)) : undefined;\n const selected = typeof limit === \"number\" ? files.slice(0, limit) : files;\n const pages: PageSourceRecord[] = [];\n\n for (const filePath of selected) {\n const raw = await fs.readFile(filePath, \"utf8\");\n const markdown = filePath.endsWith(\".md\") ? raw : normalizeSvelteToMarkdown(raw);\n pages.push({\n url: filePathToUrl(filePath, baseDir),\n markdown,\n sourcePath: path.relative(cwd, filePath).replace(/\\\\/g, \"/\"),\n outgoingLinks: []\n });\n }\n\n return pages;\n}\n","import { gunzipSync } from \"node:zlib\";\nimport { load as cheerioLoad } from \"cheerio\";\nimport pLimit from \"p-limit\";\nimport { Logger } from \"../../core/logger\";\nimport type { PageSourceRecord, ResolvedSearchSocketConfig } from \"../../types\";\nimport { ensureLeadingSlash, joinUrl, normalizeUrlPath } from \"../../utils/path\";\n\nconst logger = new Logger();\n\nfunction extractLocs(xml: string): string[] {\n const $ = cheerioLoad(xml, { xmlMode: true });\n const locs: string[] = [];\n $(\"loc\").each((_i, el) => {\n const text = $(el).text().trim();\n if (text) {\n locs.push(text);\n }\n });\n return locs;\n}\n\nfunction isSitemapIndex(xml: string): boolean {\n const $ = cheerioLoad(xml, { xmlMode: true });\n return $(\"sitemapindex\").length > 0;\n}\n\nasync function fetchSitemapXml(url: string): Promise<string> {\n const res = await fetch(url);\n if (!res.ok) {\n throw new Error(`Failed to fetch sitemap ${url}: ${res.status} ${res.statusText}`);\n }\n\n if (url.endsWith(\".gz\")) {\n const buffer = Buffer.from(await res.arrayBuffer());\n return gunzipSync(buffer).toString(\"utf8\");\n }\n\n return res.text();\n}\n\nfunction resolveSitemapUrl(baseUrl: string, candidate: string): string {\n return candidate.startsWith(\"http\") ? candidate : joinUrl(baseUrl, candidate);\n}\n\nasync function parseSitemap(xml: string, baseUrl: string, visitedSitemaps: Set<string>): Promise<string[]> {\n if (isSitemapIndex(xml)) {\n const childUrls = extractLocs(xml);\n const routes: string[] = [];\n\n for (const childUrl of childUrls) {\n const childRoutes = await parseSitemapFromUrl(childUrl, baseUrl, visitedSitemaps);\n routes.push(...childRoutes);\n }\n\n return [...new Set(routes)];\n }\n\n const locs = extractLocs(xml);\n const routes: string[] = [];\n\n for (const loc of locs) {\n try {\n const parsed = loc.startsWith(\"http://\") || loc.startsWith(\"https://\")\n ? new URL(loc)\n : new URL(loc, baseUrl);\n if (![\"http:\", \"https:\"].includes(parsed.protocol)) {\n continue;\n }\n routes.push(normalizeUrlPath(parsed.pathname));\n } catch {\n // ignore invalid entry\n }\n }\n\n return [...new Set(routes)];\n}\n\nasync function parseSitemapFromUrl(url: string, baseUrl: string, visitedSitemaps: Set<string>): Promise<string[]> {\n const resolved = resolveSitemapUrl(baseUrl, url);\n if (visitedSitemaps.has(resolved)) {\n return [];\n }\n\n visitedSitemaps.add(resolved);\n const xml = await fetchSitemapXml(resolved);\n return parseSitemap(xml, baseUrl, visitedSitemaps);\n}\n\nasync function resolveRoutes(config: ResolvedSearchSocketConfig): Promise<string[]> {\n const crawlConfig = config.source.crawl;\n if (!crawlConfig) {\n return [];\n }\n\n if (crawlConfig.routes.length > 0) {\n return [...new Set(crawlConfig.routes.map((route) => normalizeUrlPath(ensureLeadingSlash(route))))];\n }\n\n if (!crawlConfig.sitemapUrl) {\n return [\"/\"];\n }\n\n return parseSitemapFromUrl(crawlConfig.sitemapUrl, crawlConfig.baseUrl, new Set<string>());\n}\n\nexport async function loadCrawledPages(\n config: ResolvedSearchSocketConfig,\n maxPages?: number\n): Promise<PageSourceRecord[]> {\n const crawlConfig = config.source.crawl;\n if (!crawlConfig) {\n throw new Error(\"crawl source config is missing\");\n }\n\n const routes = await resolveRoutes(config);\n const maxCount = typeof maxPages === \"number\" ? Math.max(0, Math.floor(maxPages)) : undefined;\n const selected = typeof maxCount === \"number\" ? routes.slice(0, maxCount) : routes;\n\n const concurrencyLimit = pLimit(8);\n const results = await Promise.allSettled(\n selected.map((route) =>\n concurrencyLimit(async (): Promise<PageSourceRecord> => {\n const url = joinUrl(crawlConfig.baseUrl, route);\n const response = await fetch(url);\n\n if (!response.ok) {\n throw new Error(`Failed to fetch route ${route}: ${response.status} ${response.statusText}`);\n }\n\n return {\n url: normalizeUrlPath(route),\n html: await response.text(),\n sourcePath: url,\n outgoingLinks: []\n };\n })\n )\n );\n\n const pages: PageSourceRecord[] = [];\n for (let i = 0; i < results.length; i += 1) {\n const result = results[i];\n if (!result) continue;\n if (result.status === \"fulfilled\") {\n pages.push(result.value);\n } else {\n const route = selected[i] ?? \"unknown\";\n logger.warn(`Skipping route ${route}: ${result.reason instanceof Error ? result.reason.message : String(result.reason)}`);\n }\n }\n\n return pages;\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport fg from \"fast-glob\";\nimport type { PageSourceRecord, ResolvedSearchSocketConfig } from \"../../types\";\nimport { staticHtmlFileToUrl } from \"../../utils/path\";\n\nexport async function loadStaticOutputPages(\n cwd: string,\n config: ResolvedSearchSocketConfig,\n maxPages?: number\n): Promise<PageSourceRecord[]> {\n const outputDir = path.resolve(cwd, config.source.staticOutputDir);\n const htmlFiles = await fg([\"**/*.html\"], {\n cwd: outputDir,\n absolute: true\n });\n\n const limit = typeof maxPages === \"number\" ? Math.max(0, Math.floor(maxPages)) : undefined;\n const selected = typeof limit === \"number\" ? htmlFiles.slice(0, limit) : htmlFiles;\n\n const pages: PageSourceRecord[] = [];\n\n for (const filePath of selected) {\n const html = await fs.readFile(filePath, \"utf8\");\n pages.push({\n url: staticHtmlFileToUrl(filePath, outputDir),\n html,\n sourcePath: path.relative(cwd, filePath).replace(/\\\\/g, \"/\"),\n outgoingLinks: []\n });\n }\n\n return pages;\n}\n","export function nowIso(): string {\n return new Date().toISOString();\n}\n\nexport function hrTimeMs(start: bigint): number {\n return Number(process.hrtime.bigint() - start) / 1_000_000;\n}\n","import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { StreamableHTTPServerTransport } from \"@modelcontextprotocol/sdk/server/streamableHttp.js\";\nimport { createMcpExpressApp } from \"@modelcontextprotocol/sdk/server/express.js\";\nimport type { Request, Response } from \"express\";\nimport { z } from \"zod\";\nimport { SearchEngine } from \"../search/engine\";\nimport { loadConfig } from \"../config/load\";\nimport type { ResolvedSearchSocketConfig } from \"../types\";\n\nexport interface McpServerOptions {\n cwd?: string;\n configPath?: string;\n transport?: \"stdio\" | \"http\";\n httpPort?: number;\n httpPath?: string;\n}\n\nfunction createServer(engine: SearchEngine): McpServer {\n const server = new McpServer({\n name: \"searchsocket-mcp\",\n version: \"0.1.0\"\n });\n\n server.registerTool(\n \"search\",\n {\n description:\n \"Semantic site search. Returns url/title/snippet/score/routeFile for each match. Supports optional scope, pathPrefix, tags, and topK.\",\n inputSchema: {\n query: z.string().min(1),\n scope: z.string().optional(),\n topK: z.number().int().positive().max(100).optional(),\n pathPrefix: z.string().optional(),\n tags: z.array(z.string()).optional(),\n groupBy: z.enum([\"page\", \"chunk\"]).optional()\n }\n },\n async (input) => {\n const result = await engine.search({\n q: input.query,\n topK: input.topK,\n scope: input.scope,\n pathPrefix: input.pathPrefix,\n tags: input.tags,\n groupBy: input.groupBy\n });\n\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(result, null, 2)\n }\n ]\n };\n }\n );\n\n server.registerTool(\n \"get_page\",\n {\n description:\n \"Fetch indexed markdown for a specific path or URL, including frontmatter and routeFile mapping.\",\n inputSchema: {\n pathOrUrl: z.string().min(1),\n scope: z.string().optional()\n }\n },\n async (input) => {\n const page = await engine.getPage(input.pathOrUrl, input.scope);\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(page, null, 2)\n }\n ]\n };\n }\n );\n\n return server;\n}\n\nfunction redirectConsoleToStderr(): void {\n const originalLog = console.log;\n console.log = (...args: unknown[]) => {\n process.stderr.write(`[LOG] ${args.map(String).join(\" \")}\\n`);\n };\n\n console.warn = (...args: unknown[]) => {\n process.stderr.write(`[WARN] ${args.map(String).join(\" \")}\\n`);\n };\n\n void originalLog;\n}\n\nasync function startHttpServer(serverFactory: () => McpServer, config: ResolvedSearchSocketConfig, opts: McpServerOptions): Promise<void> {\n const app = createMcpExpressApp();\n const port = opts.httpPort ?? config.mcp.http.port;\n const endpointPath = opts.httpPath ?? config.mcp.http.path;\n\n app.post(endpointPath, async (req: Request, res: Response) => {\n const server = serverFactory();\n const transport = new StreamableHTTPServerTransport({\n sessionIdGenerator: undefined\n });\n\n try {\n await server.connect(transport);\n await transport.handleRequest(req, res, req.body);\n res.on(\"close\", () => {\n transport.close();\n server.close();\n });\n } catch (error) {\n if (!res.headersSent) {\n res.status(500).json({\n jsonrpc: \"2.0\",\n error: {\n code: -32603,\n message: error instanceof Error ? error.message : \"Internal server error\"\n },\n id: null\n });\n }\n }\n });\n\n app.get(endpointPath, (_req: Request, res: Response) => {\n res.writeHead(405).end(\n JSON.stringify({\n jsonrpc: \"2.0\",\n error: {\n code: -32000,\n message: \"Method not allowed\"\n },\n id: null\n })\n );\n });\n\n app.delete(endpointPath, (_req: Request, res: Response) => {\n res.writeHead(405).end(\n JSON.stringify({\n jsonrpc: \"2.0\",\n error: {\n code: -32000,\n message: \"Method not allowed\"\n },\n id: null\n })\n );\n });\n\n await new Promise<void>((resolve, reject) => {\n const instance = app.listen(port, \"127.0.0.1\", () => {\n process.stderr.write(`SearchSocket MCP HTTP server listening on http://127.0.0.1:${port}${endpointPath}\\n`);\n resolve();\n });\n instance.once(\"error\", reject);\n\n process.on(\"SIGINT\", async () => {\n await new Promise<void>((shutdownResolve) => instance.close(() => shutdownResolve()));\n process.exit(0);\n });\n });\n}\n\nexport async function runMcpServer(options: McpServerOptions = {}): Promise<void> {\n const config = await loadConfig({\n cwd: options.cwd,\n configPath: options.configPath\n });\n const resolvedTransport = options.transport ?? config.mcp.transport;\n\n // For stdio transport, redirect ALL output to stderr before server initialization\n // to prevent corrupting the JSON-RPC stream on stdout.\n if (resolvedTransport === \"stdio\") {\n redirectConsoleToStderr();\n }\n\n const engine = await SearchEngine.create({\n cwd: options.cwd,\n configPath: options.configPath,\n config\n });\n\n if (resolvedTransport === \"http\") {\n await startHttpServer(() => createServer(engine), config, options);\n return;\n }\n\n const server = createServer(engine);\n const stdioTransport = new StdioServerTransport();\n await server.connect(stdioTransport);\n}\n","import path from \"node:path\";\nimport { z } from \"zod\";\nimport { createEmbeddingsProvider } from \"../embeddings\";\nimport { SearchSocketError } from \"../errors\";\nimport { loadConfig } from \"../config/load\";\nimport { resolveScope } from \"../core/scope\";\nimport { createReranker } from \"../rerank\";\nimport { hrTimeMs } from \"../utils/time\";\nimport { normalizeUrlPath } from \"../utils/path\";\nimport { createVectorStore } from \"../vector/factory\";\nimport { rankHits, aggregateByPage } from \"./ranking\";\nimport type { RankedHit } from \"./ranking\";\nimport type {\n EmbeddingsProvider,\n Reranker,\n ResolvedSearchSocketConfig,\n Scope,\n SearchRequest,\n SearchResponse,\n SearchResult,\n VectorStore\n} from \"../types\";\n\nconst requestSchema = z.object({\n q: z.string().trim().min(1),\n topK: z.number().int().positive().max(100).optional(),\n scope: z.string().optional(),\n pathPrefix: z.string().optional(),\n tags: z.array(z.string()).optional(),\n rerank: z.boolean().optional(),\n groupBy: z.enum([\"page\", \"chunk\"]).optional()\n});\n\nexport interface SearchEngineOptions {\n cwd?: string;\n configPath?: string;\n config?: ResolvedSearchSocketConfig;\n embeddingsProvider?: EmbeddingsProvider;\n vectorStore?: VectorStore;\n reranker?: Reranker | null;\n}\n\nexport class SearchEngine {\n private readonly cwd: string;\n private readonly config: ResolvedSearchSocketConfig;\n private readonly embeddings: EmbeddingsProvider;\n private readonly vectorStore: VectorStore;\n private readonly reranker: Reranker | null;\n\n private constructor(options: {\n cwd: string;\n config: ResolvedSearchSocketConfig;\n embeddings: EmbeddingsProvider;\n vectorStore: VectorStore;\n reranker: Reranker | null;\n }) {\n this.cwd = options.cwd;\n this.config = options.config;\n this.embeddings = options.embeddings;\n this.vectorStore = options.vectorStore;\n this.reranker = options.reranker;\n }\n\n static async create(options: SearchEngineOptions = {}): Promise<SearchEngine> {\n const cwd = path.resolve(options.cwd ?? process.cwd());\n const config = options.config ?? (await loadConfig({ cwd, configPath: options.configPath }));\n\n const embeddings = options.embeddingsProvider ?? createEmbeddingsProvider(config);\n const vectorStore = options.vectorStore ?? await createVectorStore(config, cwd);\n const reranker = options.reranker === undefined\n ? createReranker(config)\n : options.reranker;\n\n return new SearchEngine({\n cwd,\n config,\n embeddings,\n vectorStore,\n reranker\n });\n }\n\n getConfig(): ResolvedSearchSocketConfig {\n return this.config;\n }\n\n async search(request: SearchRequest): Promise<SearchResponse> {\n const parsed = requestSchema.safeParse(request);\n if (!parsed.success) {\n throw new SearchSocketError(\"INVALID_REQUEST\", parsed.error.issues[0]?.message ?? \"Invalid request\", 400);\n }\n\n const input = parsed.data;\n const totalStart = process.hrtime.bigint();\n\n const resolvedScope = resolveScope(this.config, input.scope);\n await this.assertModelCompatibility(resolvedScope);\n\n const topK = input.topK ?? 10;\n const wantsRerank = Boolean(input.rerank);\n const groupByPage = (input.groupBy ?? \"page\") === \"page\";\n const candidateK = groupByPage\n ? Math.max(topK * 10, 50)\n : Math.max(50, topK);\n\n const embedStart = process.hrtime.bigint();\n const queryEmbeddings = await this.embeddings.embedTexts([input.q], this.config.embeddings.model);\n const queryVector = queryEmbeddings[0];\n if (!queryVector || queryVector.length === 0 || queryVector.some((value) => !Number.isFinite(value))) {\n throw new SearchSocketError(\"VECTOR_BACKEND_UNAVAILABLE\", \"Unable to create query embedding.\");\n }\n const embedMs = hrTimeMs(embedStart);\n\n const vectorStart = process.hrtime.bigint();\n const hits = await this.vectorStore.query(\n queryVector,\n {\n topK: candidateK,\n pathPrefix: input.pathPrefix,\n tags: input.tags\n },\n resolvedScope\n );\n const vectorMs = hrTimeMs(vectorStart);\n\n const ranked = rankHits(hits, this.config);\n let usedRerank = false;\n let rerankMs = 0;\n let ordered = ranked;\n\n if (wantsRerank) {\n const rerankStart = process.hrtime.bigint();\n ordered = await this.rerankHits(input.q, ranked, topK);\n rerankMs = hrTimeMs(rerankStart);\n usedRerank = true;\n }\n\n let results: SearchResult[];\n\n if (groupByPage) {\n const pages = aggregateByPage(ordered, this.config);\n const minRatio = this.config.ranking.minChunkScoreRatio;\n results = pages.slice(0, topK).map((page) => {\n const bestScore = page.bestChunk.finalScore;\n const minScore = Number.isFinite(bestScore) ? bestScore * minRatio : Number.NEGATIVE_INFINITY;\n const meaningful = page.matchingChunks\n .filter((c) => c.finalScore >= minScore)\n .slice(0, 5);\n return {\n url: page.url,\n title: page.title,\n sectionTitle: page.bestChunk.hit.metadata.sectionTitle || undefined,\n snippet: page.bestChunk.hit.metadata.snippet,\n score: Number(page.pageScore.toFixed(6)),\n routeFile: page.routeFile,\n chunks: meaningful.length > 1\n ? meaningful.map((c) => ({\n sectionTitle: c.hit.metadata.sectionTitle || undefined,\n snippet: c.hit.metadata.snippet,\n headingPath: c.hit.metadata.headingPath,\n score: Number(c.finalScore.toFixed(6))\n }))\n : undefined\n };\n });\n } else {\n results = ordered.slice(0, topK).map(({ hit, finalScore }) => ({\n url: hit.metadata.url,\n title: hit.metadata.title,\n sectionTitle: hit.metadata.sectionTitle || undefined,\n snippet: hit.metadata.snippet,\n score: Number(finalScore.toFixed(6)),\n routeFile: hit.metadata.routeFile\n }));\n }\n\n return {\n q: input.q,\n scope: resolvedScope.scopeName,\n results,\n meta: {\n timingsMs: {\n embed: Math.round(embedMs),\n vector: Math.round(vectorMs),\n rerank: Math.round(rerankMs),\n total: Math.round(hrTimeMs(totalStart))\n },\n usedRerank,\n modelId: this.config.embeddings.model\n }\n };\n }\n\n async getPage(pathOrUrl: string, scope?: string): Promise<{\n url: string;\n frontmatter: Record<string, unknown>;\n markdown: string;\n }> {\n const resolvedScope = resolveScope(this.config, scope);\n const urlPath = this.resolveInputPath(pathOrUrl);\n const page = await this.vectorStore.getPage(urlPath, resolvedScope);\n\n if (!page) {\n throw new SearchSocketError(\"INVALID_REQUEST\", `Indexed page not found for ${urlPath}`, 404);\n }\n\n return {\n url: page.url,\n frontmatter: {\n url: page.url,\n title: page.title,\n routeFile: page.routeFile,\n routeResolution: page.routeResolution,\n incomingLinks: page.incomingLinks,\n outgoingLinks: page.outgoingLinks,\n depth: page.depth,\n tags: page.tags,\n indexedAt: page.indexedAt\n },\n markdown: page.markdown\n };\n }\n\n async health(): Promise<{ ok: boolean; details?: string }> {\n return this.vectorStore.health();\n }\n\n private resolveInputPath(pathOrUrl: string): string {\n try {\n if (/^https?:\\/\\//.test(pathOrUrl)) {\n return normalizeUrlPath(new URL(pathOrUrl).pathname);\n }\n } catch {\n // fall through to plain path handling\n }\n\n const withoutQueryOrHash = pathOrUrl.split(/[?#]/)[0] ?? pathOrUrl;\n return normalizeUrlPath(withoutQueryOrHash);\n }\n\n private async assertModelCompatibility(scope: Scope): Promise<void> {\n const modelId = await this.vectorStore.getScopeModelId(scope);\n if (modelId && modelId !== this.config.embeddings.model) {\n throw new SearchSocketError(\n \"EMBEDDING_MODEL_MISMATCH\",\n `Scope ${scope.scopeName} was indexed with ${modelId}. Current config uses ${this.config.embeddings.model}. Re-index with --force.`\n );\n }\n }\n\n private async rerankHits(\n query: string,\n ranked: RankedHit[],\n topK: number\n ): Promise<RankedHit[]> {\n if (this.config.rerank.provider !== \"jina\") {\n throw new SearchSocketError(\n \"INVALID_REQUEST\",\n \"rerank=true requested but rerank.provider is not configured as 'jina'.\",\n 400\n );\n }\n\n if (!this.reranker) {\n throw new SearchSocketError(\n \"CONFIG_MISSING\",\n `rerank=true requested but ${this.config.rerank.jina.apiKeyEnv} is not set.`,\n 400\n );\n }\n\n const candidates = ranked.map(({ hit }) => ({\n id: hit.id,\n text: [hit.metadata.title, hit.metadata.sectionTitle, hit.metadata.snippet]\n .filter(Boolean)\n .join(\"\\n\")\n }));\n\n const reranked = await this.reranker.rerank(\n query,\n candidates,\n Math.max(topK, this.config.rerank.topN)\n );\n\n const rerankScoreById = new Map(reranked.map((entry) => [entry.id, entry.score]));\n\n return ranked\n .map((entry) => {\n const rerankScore = rerankScoreById.get(entry.hit.id);\n const safeBaseScore = Number.isFinite(entry.finalScore)\n ? entry.finalScore\n : Number.NEGATIVE_INFINITY;\n\n if (rerankScore === undefined || !Number.isFinite(rerankScore)) {\n return {\n ...entry,\n finalScore: safeBaseScore\n };\n }\n\n const combinedScore =\n (rerankScore as number) * this.config.ranking.weights.rerank + safeBaseScore * 0.001;\n\n return {\n ...entry,\n finalScore: Number.isFinite(combinedScore) ? combinedScore : safeBaseScore\n };\n })\n .sort((a, b) => {\n const delta = b.finalScore - a.finalScore;\n return Number.isNaN(delta) ? 0 : delta;\n });\n }\n}\n","import type { RerankCandidate, Reranker } from \"../types\";\n\nexport interface JinaRerankerOptions {\n apiKey: string;\n model: string;\n maxRetries?: number;\n}\n\ninterface JinaRerankResult {\n index?: number;\n relevance_score?: number;\n score?: number;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n\nexport class JinaReranker implements Reranker {\n private readonly apiKey: string;\n private readonly model: string;\n private readonly maxRetries: number;\n\n constructor(options: JinaRerankerOptions) {\n this.apiKey = options.apiKey;\n this.model = options.model;\n this.maxRetries = options.maxRetries ?? 4;\n }\n\n async rerank(query: string, candidates: RerankCandidate[], topN?: number): Promise<Array<{ id: string; score: number }>> {\n if (candidates.length === 0) {\n return [];\n }\n\n const body = {\n model: this.model,\n query,\n documents: candidates.map((candidate) => candidate.text),\n top_n: topN ?? candidates.length\n };\n\n let attempt = 0;\n\n while (attempt <= this.maxRetries) {\n attempt += 1;\n\n let response: Response;\n try {\n response = await fetch(\"https://api.jina.ai/v1/rerank\", {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n authorization: `Bearer ${this.apiKey}`\n },\n body: JSON.stringify(body)\n });\n } catch (error) {\n if (attempt <= this.maxRetries) {\n await sleep(Math.min(300 * 2 ** attempt, 4000));\n continue;\n }\n throw error;\n }\n\n if (!response.ok) {\n const retryable = response.status === 429 || response.status >= 500;\n if (retryable && attempt <= this.maxRetries) {\n await sleep(Math.min(300 * 2 ** attempt, 4000));\n continue;\n }\n\n const errorBody = await response.text();\n throw new Error(`Jina rerank failed (${response.status}): ${errorBody}`);\n }\n\n const payload = (await response.json()) as {\n results?: JinaRerankResult[];\n data?: JinaRerankResult[];\n };\n\n const rawResults = payload.results ?? payload.data ?? [];\n if (!Array.isArray(rawResults)) {\n throw new Error(\"Invalid Jina rerank response format\");\n }\n\n return rawResults\n .flatMap((item) => {\n const index = item.index;\n if (typeof index !== \"number\" || index < 0 || index >= candidates.length) {\n return [];\n }\n\n const candidate = candidates[index];\n if (!candidate) {\n return [];\n }\n\n const score = typeof item.relevance_score === \"number\" ? item.relevance_score : item.score ?? 0;\n\n return [\n {\n id: candidate.id,\n score\n }\n ];\n })\n .sort((a, b) => b.score - a.score);\n }\n\n throw new Error(\"Jina rerank request failed after retries\");\n }\n}\n","import type { Reranker, ResolvedSearchSocketConfig } from \"../types\";\nimport { JinaReranker } from \"./jina\";\n\nexport function createReranker(config: ResolvedSearchSocketConfig): Reranker | null {\n if (config.rerank.provider === \"none\") {\n return null;\n }\n\n if (config.rerank.provider === \"jina\") {\n const apiKey = process.env[config.rerank.jina.apiKeyEnv];\n if (!apiKey) {\n return null;\n }\n\n return new JinaReranker({\n apiKey,\n model: config.rerank.jina.model\n });\n }\n\n return null;\n}\n","import type { ResolvedSearchSocketConfig, VectorHit } from \"../types\";\n\nexport interface RankedHit {\n hit: VectorHit;\n finalScore: number;\n}\n\nexport interface PageResult {\n url: string;\n title: string;\n routeFile: string;\n pageScore: number;\n bestChunk: RankedHit;\n matchingChunks: RankedHit[];\n}\n\nfunction nonNegativeOrZero(value: number): number {\n if (!Number.isFinite(value)) {\n return 0;\n }\n return Math.max(0, value);\n}\n\nexport function rankHits(hits: VectorHit[], config: ResolvedSearchSocketConfig): RankedHit[] {\n return hits\n .map((hit) => {\n let score = Number.isFinite(hit.score) ? hit.score : Number.NEGATIVE_INFINITY;\n\n if (config.ranking.enableIncomingLinkBoost) {\n const incomingBoost = Math.log(1 + nonNegativeOrZero(hit.metadata.incomingLinks));\n score += incomingBoost * config.ranking.weights.incomingLinks;\n }\n\n if (config.ranking.enableDepthBoost) {\n const depthBoost = 1 / (1 + nonNegativeOrZero(hit.metadata.depth));\n score += depthBoost * config.ranking.weights.depth;\n }\n\n return {\n hit,\n finalScore: Number.isFinite(score) ? score : Number.NEGATIVE_INFINITY\n };\n })\n .sort((a, b) => {\n const delta = b.finalScore - a.finalScore;\n return Number.isNaN(delta) ? 0 : delta;\n });\n}\n\nexport function findPageWeight(url: string, pageWeights: Record<string, number>): number {\n // Normalize: strip trailing slash unless root\n const norm = (p: string) => (p !== \"/\" && p.endsWith(\"/\") ? p.slice(0, -1) : p);\n const normalizedUrl = norm(url);\n\n // Exact match first (after normalizing both sides)\n for (const [pattern, weight] of Object.entries(pageWeights)) {\n if (norm(pattern) === normalizedUrl) {\n return weight;\n }\n }\n\n // Prefix match — longest prefix wins; \"/\" only matches via exact above\n let bestPrefix = \"\";\n let bestWeight = 1;\n for (const [pattern, weight] of Object.entries(pageWeights)) {\n const normalizedPattern = norm(pattern);\n if (normalizedPattern === \"/\") continue; // root is exact-only, not a global prefix\n const prefix = `${normalizedPattern}/`;\n if (normalizedUrl.startsWith(prefix) && prefix.length > bestPrefix.length) {\n bestPrefix = prefix;\n bestWeight = weight;\n }\n }\n\n return bestWeight;\n}\n\nexport function aggregateByPage(\n ranked: RankedHit[],\n config: ResolvedSearchSocketConfig\n): PageResult[] {\n // 1. Group ranked hits by URL\n const groups = new Map<string, RankedHit[]>();\n for (const hit of ranked) {\n const url = hit.hit.metadata.url;\n const group = groups.get(url);\n if (group) group.push(hit);\n else groups.set(url, [hit]);\n }\n\n // 2. For each group, compute page score using score-weighted decay\n const { aggregationCap, aggregationDecay } = config.ranking;\n const pages: PageResult[] = [];\n for (const [url, chunks] of groups) {\n // Sort chunks by score desc within the group (NaN-safe)\n chunks.sort((a, b) => {\n const delta = b.finalScore - a.finalScore;\n return Number.isNaN(delta) ? 0 : delta;\n });\n const best = chunks[0]!;\n const maxScore = Number.isFinite(best.finalScore) ? best.finalScore : Number.NEGATIVE_INFINITY;\n\n // Score-weighted aggregation with exponential decay on top-N chunks.\n // Only additional chunks (i >= 1) contribute; single-chunk pages get zero bonus.\n const topChunks = chunks.slice(0, aggregationCap);\n let aggregationBonus = 0;\n for (let i = 1; i < topChunks.length; i++) {\n const chunkScore = Number.isFinite(topChunks[i]!.finalScore) ? topChunks[i]!.finalScore : 0;\n aggregationBonus += chunkScore * Math.pow(aggregationDecay, i);\n }\n let pageScore = maxScore + aggregationBonus * config.ranking.weights.aggregation;\n\n // Apply page weight if configured.\n // Note: page weights are multiplicative on the already-boosted score,\n // so they compound with aggregation. Use gentle values (1.05–1.2x).\n const pageWeight = findPageWeight(url, config.ranking.pageWeights);\n if (pageWeight !== 1) {\n pageScore *= pageWeight;\n }\n\n pages.push({\n url,\n title: best.hit.metadata.title,\n routeFile: best.hit.metadata.routeFile,\n pageScore: Number.isFinite(pageScore) ? pageScore : Number.NEGATIVE_INFINITY,\n bestChunk: best,\n matchingChunks: chunks\n });\n }\n\n // 3. Sort by pageScore desc (NaN-safe)\n return pages.sort((a, b) => {\n const delta = b.pageScore - a.pageScore;\n return Number.isNaN(delta) ? 0 : delta;\n });\n}\n"],"mappings":"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","names":["fs","path","execSync","fs","path","path","fs","path","createClient","client","path","fs","path","fs","path","path","fs","path","path","pLimit","fs","path","path","fs","logger","path","fs","logger","path","fs","pLimit","fs","path","fg","path","fg","fs","pLimit","logger","routes","pLimit","fs","path","fg","path","fg","fs","path","z","path","z","sleep","z","path","z","path","fs","execSync","logger","fg"]}