iosm-cli 0.1.3 → 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.
Files changed (56) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/README.md +33 -2
  3. package/dist/core/blast.d.ts +62 -0
  4. package/dist/core/blast.d.ts.map +1 -0
  5. package/dist/core/blast.js +448 -0
  6. package/dist/core/blast.js.map +1 -0
  7. package/dist/core/contract.d.ts +54 -0
  8. package/dist/core/contract.d.ts.map +1 -0
  9. package/dist/core/contract.js +300 -0
  10. package/dist/core/contract.js.map +1 -0
  11. package/dist/core/semantic/config.d.ts.map +1 -1
  12. package/dist/core/semantic/config.js +5 -0
  13. package/dist/core/semantic/config.js.map +1 -1
  14. package/dist/core/semantic/index.d.ts +1 -1
  15. package/dist/core/semantic/index.d.ts.map +1 -1
  16. package/dist/core/semantic/index.js +1 -1
  17. package/dist/core/semantic/index.js.map +1 -1
  18. package/dist/core/semantic/runtime.d.ts.map +1 -1
  19. package/dist/core/semantic/runtime.js +12 -1
  20. package/dist/core/semantic/runtime.js.map +1 -1
  21. package/dist/core/semantic/types.d.ts +6 -0
  22. package/dist/core/semantic/types.d.ts.map +1 -1
  23. package/dist/core/semantic/types.js +6 -0
  24. package/dist/core/semantic/types.js.map +1 -1
  25. package/dist/core/shadow-guard.d.ts +30 -0
  26. package/dist/core/shadow-guard.d.ts.map +1 -0
  27. package/dist/core/shadow-guard.js +81 -0
  28. package/dist/core/shadow-guard.js.map +1 -0
  29. package/dist/core/singular.d.ts +73 -0
  30. package/dist/core/singular.d.ts.map +1 -0
  31. package/dist/core/singular.js +413 -0
  32. package/dist/core/singular.js.map +1 -0
  33. package/dist/core/slash-commands.d.ts.map +1 -1
  34. package/dist/core/slash-commands.js +9 -1
  35. package/dist/core/slash-commands.js.map +1 -1
  36. package/dist/core/system-prompt.d.ts.map +1 -1
  37. package/dist/core/system-prompt.js +3 -1
  38. package/dist/core/system-prompt.js.map +1 -1
  39. package/dist/core/tools/semantic-search.d.ts.map +1 -1
  40. package/dist/core/tools/semantic-search.js +1 -0
  41. package/dist/core/tools/semantic-search.js.map +1 -1
  42. package/dist/main.d.ts.map +1 -1
  43. package/dist/main.js +8 -1
  44. package/dist/main.js.map +1 -1
  45. package/dist/modes/interactive/components/custom-editor.d.ts +8 -0
  46. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  47. package/dist/modes/interactive/components/custom-editor.js +70 -1
  48. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  49. package/dist/modes/interactive/interactive-mode.d.ts +43 -0
  50. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  51. package/dist/modes/interactive/interactive-mode.js +1304 -24
  52. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  53. package/docs/cli-reference.md +19 -1
  54. package/docs/configuration.md +5 -0
  55. package/docs/interactive-mode.md +131 -1
  56. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/core/semantic/config.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport type {\n\tSemanticConfigFile,\n\tSemanticMergedConfig,\n\tSemanticScope,\n\tSemanticScopedLoadResult,\n\tSemanticSearchConfig,\n\tSemanticProviderType,\n} from \"./types.js\";\nimport { SemanticConfigError } from \"./types.js\";\n\nconst DEFAULT_INCLUDE_GLOBS = [\"**/*.{ts,tsx,js,jsx,py,go,rs,java,md,json,yaml,yml}\"];\nconst DEFAULT_EXCLUDE_GLOBS = [\"**/.git/**\", \"**/node_modules/**\", \"**/dist/**\", \"**/build/**\", \"**/.iosm/**\"];\n\nconst DEFAULT_CONFIG: SemanticSearchConfig = {\n\tenabled: true,\n\tprovider: {\n\t\ttype: \"openrouter\",\n\t\tmodel: \"openai/text-embedding-3-small\",\n\t\tbatchSize: 32,\n\t\ttimeoutMs: 30_000,\n\t},\n\tindex: {\n\t\tincludeGlobs: [...DEFAULT_INCLUDE_GLOBS],\n\t\texcludeGlobs: [...DEFAULT_EXCLUDE_GLOBS],\n\t\tchunkMaxChars: 1200,\n\t\tchunkOverlapChars: 200,\n\t\tmaxFileBytes: 262_144,\n\t\tmaxFiles: 20_000,\n\t},\n};\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null;\n}\n\nfunction asString(value: unknown): string | undefined {\n\treturn typeof value === \"string\" ? value : undefined;\n}\n\nfunction asBoolean(value: unknown): boolean | undefined {\n\treturn typeof value === \"boolean\" ? value : undefined;\n}\n\nfunction asNumber(value: unknown): number | undefined {\n\treturn typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nfunction sanitizeStringArray(value: unknown): string[] | undefined {\n\tif (!Array.isArray(value)) return undefined;\n\tconst normalized = value\n\t\t.filter((item): item is string => typeof item === \"string\")\n\t\t.map((item) => item.trim())\n\t\t.filter((item) => item.length > 0);\n\treturn normalized.length > 0 ? normalized : undefined;\n}\n\nfunction sanitizeStringRecord(value: unknown): Record<string, string> | undefined {\n\tif (!isRecord(value)) return undefined;\n\tconst result: Record<string, string> = {};\n\tfor (const [key, rawValue] of Object.entries(value)) {\n\t\tif (typeof rawValue !== \"string\") continue;\n\t\tconst normalizedKey = key.trim();\n\t\tif (!normalizedKey) continue;\n\t\tresult[normalizedKey] = rawValue;\n\t}\n\treturn Object.keys(result).length > 0 ? result : undefined;\n}\n\nfunction sanitizeProviderType(value: unknown): SemanticProviderType | undefined {\n\tif (value === \"openrouter\" || value === \"ollama\" || value === \"custom_openai\") {\n\t\treturn value;\n\t}\n\treturn undefined;\n}\n\nfunction clampInt(value: number | undefined, fallback: number, min: number, max: number): number {\n\tif (value === undefined) return fallback;\n\tconst normalized = Math.floor(value);\n\tif (!Number.isFinite(normalized)) return fallback;\n\tif (normalized < min) return min;\n\tif (normalized > max) return max;\n\treturn normalized;\n}\n\nfunction parseSemanticConfigFile(path: string): SemanticConfigFile {\n\tif (!existsSync(path)) {\n\t\treturn {};\n\t}\n\tconst raw = readFileSync(path, \"utf8\");\n\tconst parsed = JSON.parse(raw) as unknown;\n\tif (!isRecord(parsed)) {\n\t\tthrow new SemanticConfigError(`Expected JSON object in ${path}`);\n\t}\n\n\tconst result: SemanticConfigFile = {};\n\tconst rawSemantic = parsed.semanticSearch;\n\tif (!isRecord(rawSemantic)) {\n\t\treturn result;\n\t}\n\n\tconst provider = isRecord(rawSemantic.provider)\n\t\t? {\n\t\t\t\ttype: sanitizeProviderType(rawSemantic.provider.type),\n\t\t\t\tmodel: asString(rawSemantic.provider.model),\n\t\t\t\tbaseUrl: asString(rawSemantic.provider.baseUrl),\n\t\t\t\tapiKeyEnv: asString(rawSemantic.provider.apiKeyEnv),\n\t\t\t\theaders: sanitizeStringRecord(rawSemantic.provider.headers),\n\t\t\t\tbatchSize: asNumber(rawSemantic.provider.batchSize),\n\t\t\t\ttimeoutMs: asNumber(rawSemantic.provider.timeoutMs),\n\t\t\t}\n\t\t: undefined;\n\n\tconst index = isRecord(rawSemantic.index)\n\t\t? {\n\t\t\t\tincludeGlobs: sanitizeStringArray(rawSemantic.index.includeGlobs),\n\t\t\t\texcludeGlobs: sanitizeStringArray(rawSemantic.index.excludeGlobs),\n\t\t\t\tchunkMaxChars: asNumber(rawSemantic.index.chunkMaxChars),\n\t\t\t\tchunkOverlapChars: asNumber(rawSemantic.index.chunkOverlapChars),\n\t\t\t\tmaxFileBytes: asNumber(rawSemantic.index.maxFileBytes),\n\t\t\t\tmaxFiles: asNumber(rawSemantic.index.maxFiles),\n\t\t\t}\n\t\t: undefined;\n\n\tresult.semanticSearch = {\n\t\tenabled: asBoolean(rawSemantic.enabled),\n\t\tprovider,\n\t\tindex,\n\t};\n\n\treturn result;\n}\n\nfunction mergeSemanticConfig(\n\tbase: SemanticConfigFile[\"semanticSearch\"] | undefined,\n\toverride: SemanticConfigFile[\"semanticSearch\"] | undefined,\n): SemanticConfigFile[\"semanticSearch\"] | undefined {\n\tif (!base && !override) return undefined;\n\treturn {\n\t\t...(base ?? {}),\n\t\t...(override ?? {}),\n\t\tprovider: {\n\t\t\t...(base?.provider ?? {}),\n\t\t\t...(override?.provider ?? {}),\n\t\t},\n\t\tindex: {\n\t\t\t...(base?.index ?? {}),\n\t\t\t...(override?.index ?? {}),\n\t\t},\n\t};\n}\n\nfunction resolveSemanticSearchConfig(\n\tpartial: SemanticConfigFile[\"semanticSearch\"] | undefined,\n): SemanticSearchConfig | undefined {\n\tif (!partial) return undefined;\n\n\tconst providerType = partial.provider?.type ?? DEFAULT_CONFIG.provider.type;\n\tconst model = (partial.provider?.model ?? DEFAULT_CONFIG.provider.model).trim();\n\tif (!model) {\n\t\tthrow new SemanticConfigError(`semanticSearch.provider.model cannot be empty`);\n\t}\n\n\treturn {\n\t\tenabled: partial.enabled ?? DEFAULT_CONFIG.enabled,\n\t\tprovider: {\n\t\t\ttype: providerType,\n\t\t\tmodel,\n\t\t\tbaseUrl: partial.provider?.baseUrl?.trim() || undefined,\n\t\t\tapiKeyEnv: partial.provider?.apiKeyEnv?.trim() || undefined,\n\t\t\theaders: partial.provider?.headers && Object.keys(partial.provider.headers).length > 0 ? partial.provider.headers : undefined,\n\t\t\tbatchSize: clampInt(partial.provider?.batchSize, DEFAULT_CONFIG.provider.batchSize, 1, 512),\n\t\t\ttimeoutMs: clampInt(partial.provider?.timeoutMs, DEFAULT_CONFIG.provider.timeoutMs, 1_000, 300_000),\n\t\t},\n\t\tindex: {\n\t\t\tincludeGlobs: partial.index?.includeGlobs && partial.index.includeGlobs.length > 0 ? partial.index.includeGlobs : [...DEFAULT_CONFIG.index.includeGlobs],\n\t\t\texcludeGlobs: partial.index?.excludeGlobs && partial.index.excludeGlobs.length > 0 ? partial.index.excludeGlobs : [...DEFAULT_CONFIG.index.excludeGlobs],\n\t\t\tchunkMaxChars: clampInt(partial.index?.chunkMaxChars, DEFAULT_CONFIG.index.chunkMaxChars, 200, 20_000),\n\t\t\tchunkOverlapChars: clampInt(partial.index?.chunkOverlapChars, DEFAULT_CONFIG.index.chunkOverlapChars, 0, 5_000),\n\t\t\tmaxFileBytes: clampInt(partial.index?.maxFileBytes, DEFAULT_CONFIG.index.maxFileBytes, 1_024, 16 * 1024 * 1024),\n\t\t\tmaxFiles: clampInt(partial.index?.maxFiles, DEFAULT_CONFIG.index.maxFiles, 1, 1_000_000),\n\t\t},\n\t};\n}\n\nexport function getSemanticConfigPath(scope: SemanticScope, cwd: string, agentDir: string): string {\n\treturn scope === \"project\" ? join(cwd, \".iosm\", \"semantic.json\") : join(agentDir, \"semantic.json\");\n}\n\nexport function readScopedSemanticConfig(scope: SemanticScope, cwd: string, agentDir: string): SemanticScopedLoadResult {\n\tconst path = getSemanticConfigPath(scope, cwd, agentDir);\n\ttry {\n\t\treturn {\n\t\t\tscope,\n\t\t\tpath,\n\t\t\tfile: parseSemanticConfigFile(path),\n\t\t};\n\t} catch (error) {\n\t\treturn {\n\t\t\tscope,\n\t\t\tpath,\n\t\t\tfile: {},\n\t\t\terror: error instanceof Error ? error : new Error(String(error)),\n\t\t};\n\t}\n}\n\nexport function loadMergedSemanticConfig(cwd: string, agentDir: string): SemanticMergedConfig {\n\tconst scoped = [readScopedSemanticConfig(\"user\", cwd, agentDir), readScopedSemanticConfig(\"project\", cwd, agentDir)];\n\tconst errors: string[] = [];\n\n\tfor (const entry of scoped) {\n\t\tif (entry.error) {\n\t\t\terrors.push(`${entry.scope} config (${entry.path}): ${entry.error.message}`);\n\t\t}\n\t}\n\n\tconst mergedPartial = mergeSemanticConfig(scoped[0]?.file.semanticSearch, scoped[1]?.file.semanticSearch);\n\tlet config: SemanticSearchConfig | undefined;\n\ttry {\n\t\tconfig = resolveSemanticSearchConfig(mergedPartial);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\terrors.push(`semanticSearch: ${message}`);\n\t\tconfig = undefined;\n\t}\n\n\treturn {\n\t\tconfig,\n\t\terrors,\n\t\tscoped,\n\t};\n}\n\nexport function writeScopedSemanticConfig(\n\tscope: SemanticScope,\n\tfile: SemanticConfigFile,\n\tcwd: string,\n\tagentDir: string,\n): string {\n\tconst path = getSemanticConfigPath(scope, cwd, agentDir);\n\tconst dir = dirname(path);\n\tif (!existsSync(dir)) {\n\t\tmkdirSync(dir, { recursive: true });\n\t}\n\twriteFileSync(path, `${JSON.stringify(file, null, 2)}\\n`, \"utf8\");\n\treturn path;\n}\n\nexport function upsertScopedSemanticSearchConfig(\n\tscope: SemanticScope,\n\tconfig: SemanticSearchConfig,\n\tcwd: string,\n\tagentDir: string,\n): string {\n\tconst current = readScopedSemanticConfig(scope, cwd, agentDir);\n\tif (current.error) {\n\t\tthrow new SemanticConfigError(`Cannot update ${scope} semantic config (${current.path}): ${current.error.message}`);\n\t}\n\tconst nextFile: SemanticConfigFile = {\n\t\t...current.file,\n\t\tsemanticSearch: {\n\t\t\tenabled: config.enabled,\n\t\t\tprovider: {\n\t\t\t\ttype: config.provider.type,\n\t\t\t\tmodel: config.provider.model,\n\t\t\t\tbaseUrl: config.provider.baseUrl,\n\t\t\t\tapiKeyEnv: config.provider.apiKeyEnv,\n\t\t\t\theaders: config.provider.headers,\n\t\t\t\tbatchSize: config.provider.batchSize,\n\t\t\t\ttimeoutMs: config.provider.timeoutMs,\n\t\t\t},\n\t\t\tindex: {\n\t\t\t\tincludeGlobs: [...config.index.includeGlobs],\n\t\t\t\texcludeGlobs: [...config.index.excludeGlobs],\n\t\t\t\tchunkMaxChars: config.index.chunkMaxChars,\n\t\t\t\tchunkOverlapChars: config.index.chunkOverlapChars,\n\t\t\t\tmaxFileBytes: config.index.maxFileBytes,\n\t\t\t\tmaxFiles: config.index.maxFiles,\n\t\t\t},\n\t\t},\n\t};\n\treturn writeScopedSemanticConfig(scope, nextFile, cwd, agentDir);\n}\n\nexport function getDefaultSemanticSearchConfig(): SemanticSearchConfig {\n\treturn {\n\t\tenabled: DEFAULT_CONFIG.enabled,\n\t\tprovider: { ...DEFAULT_CONFIG.provider },\n\t\tindex: {\n\t\t\tincludeGlobs: [...DEFAULT_CONFIG.index.includeGlobs],\n\t\t\texcludeGlobs: [...DEFAULT_CONFIG.index.excludeGlobs],\n\t\t\tchunkMaxChars: DEFAULT_CONFIG.index.chunkMaxChars,\n\t\t\tchunkOverlapChars: DEFAULT_CONFIG.index.chunkOverlapChars,\n\t\t\tmaxFileBytes: DEFAULT_CONFIG.index.maxFileBytes,\n\t\t\tmaxFiles: DEFAULT_CONFIG.index.maxFiles,\n\t\t},\n\t};\n}\n"]}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/core/semantic/config.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport type {\n\tSemanticConfigFile,\n\tSemanticMergedConfig,\n\tSemanticScope,\n\tSemanticScopedLoadResult,\n\tSemanticSearchConfig,\n\tSemanticProviderType,\n} from \"./types.js\";\nimport { SemanticConfigError } from \"./types.js\";\n\nconst DEFAULT_INCLUDE_GLOBS = [\"**/*.{ts,tsx,js,jsx,py,go,rs,java,md,json,yaml,yml}\"];\nconst DEFAULT_EXCLUDE_GLOBS = [\"**/.git/**\", \"**/node_modules/**\", \"**/dist/**\", \"**/build/**\", \"**/.iosm/**\"];\n\nconst DEFAULT_CONFIG: SemanticSearchConfig = {\n\tenabled: true,\n\tautoIndex: true,\n\tprovider: {\n\t\ttype: \"openrouter\",\n\t\tmodel: \"openai/text-embedding-3-small\",\n\t\tbatchSize: 32,\n\t\ttimeoutMs: 30_000,\n\t},\n\tindex: {\n\t\tincludeGlobs: [...DEFAULT_INCLUDE_GLOBS],\n\t\texcludeGlobs: [...DEFAULT_EXCLUDE_GLOBS],\n\t\tchunkMaxChars: 1200,\n\t\tchunkOverlapChars: 200,\n\t\tmaxFileBytes: 262_144,\n\t\tmaxFiles: 20_000,\n\t},\n};\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null;\n}\n\nfunction asString(value: unknown): string | undefined {\n\treturn typeof value === \"string\" ? value : undefined;\n}\n\nfunction asBoolean(value: unknown): boolean | undefined {\n\treturn typeof value === \"boolean\" ? value : undefined;\n}\n\nfunction asNumber(value: unknown): number | undefined {\n\treturn typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nfunction sanitizeStringArray(value: unknown): string[] | undefined {\n\tif (!Array.isArray(value)) return undefined;\n\tconst normalized = value\n\t\t.filter((item): item is string => typeof item === \"string\")\n\t\t.map((item) => item.trim())\n\t\t.filter((item) => item.length > 0);\n\treturn normalized.length > 0 ? normalized : undefined;\n}\n\nfunction sanitizeStringRecord(value: unknown): Record<string, string> | undefined {\n\tif (!isRecord(value)) return undefined;\n\tconst result: Record<string, string> = {};\n\tfor (const [key, rawValue] of Object.entries(value)) {\n\t\tif (typeof rawValue !== \"string\") continue;\n\t\tconst normalizedKey = key.trim();\n\t\tif (!normalizedKey) continue;\n\t\tresult[normalizedKey] = rawValue;\n\t}\n\treturn Object.keys(result).length > 0 ? result : undefined;\n}\n\nfunction sanitizeProviderType(value: unknown): SemanticProviderType | undefined {\n\tif (value === \"openrouter\" || value === \"ollama\" || value === \"custom_openai\") {\n\t\treturn value;\n\t}\n\treturn undefined;\n}\n\nfunction clampInt(value: number | undefined, fallback: number, min: number, max: number): number {\n\tif (value === undefined) return fallback;\n\tconst normalized = Math.floor(value);\n\tif (!Number.isFinite(normalized)) return fallback;\n\tif (normalized < min) return min;\n\tif (normalized > max) return max;\n\treturn normalized;\n}\n\nfunction parseSemanticConfigFile(path: string): SemanticConfigFile {\n\tif (!existsSync(path)) {\n\t\treturn {};\n\t}\n\tconst raw = readFileSync(path, \"utf8\");\n\tconst parsed = JSON.parse(raw) as unknown;\n\tif (!isRecord(parsed)) {\n\t\tthrow new SemanticConfigError(`Expected JSON object in ${path}`);\n\t}\n\n\tconst result: SemanticConfigFile = {};\n\tconst rawSemantic = parsed.semanticSearch;\n\tif (!isRecord(rawSemantic)) {\n\t\treturn result;\n\t}\n\n\tconst provider = isRecord(rawSemantic.provider)\n\t\t? {\n\t\t\t\ttype: sanitizeProviderType(rawSemantic.provider.type),\n\t\t\t\tmodel: asString(rawSemantic.provider.model),\n\t\t\t\tbaseUrl: asString(rawSemantic.provider.baseUrl),\n\t\t\t\tapiKeyEnv: asString(rawSemantic.provider.apiKeyEnv),\n\t\t\t\theaders: sanitizeStringRecord(rawSemantic.provider.headers),\n\t\t\t\tbatchSize: asNumber(rawSemantic.provider.batchSize),\n\t\t\t\ttimeoutMs: asNumber(rawSemantic.provider.timeoutMs),\n\t\t\t}\n\t\t: undefined;\n\n\tconst index = isRecord(rawSemantic.index)\n\t\t? {\n\t\t\t\tincludeGlobs: sanitizeStringArray(rawSemantic.index.includeGlobs),\n\t\t\t\texcludeGlobs: sanitizeStringArray(rawSemantic.index.excludeGlobs),\n\t\t\t\tchunkMaxChars: asNumber(rawSemantic.index.chunkMaxChars),\n\t\t\t\tchunkOverlapChars: asNumber(rawSemantic.index.chunkOverlapChars),\n\t\t\t\tmaxFileBytes: asNumber(rawSemantic.index.maxFileBytes),\n\t\t\t\tmaxFiles: asNumber(rawSemantic.index.maxFiles),\n\t\t\t}\n\t\t: undefined;\n\n\tresult.semanticSearch = {\n\t\tenabled: asBoolean(rawSemantic.enabled),\n\t\tautoIndex: asBoolean(rawSemantic.autoIndex),\n\t\tprovider,\n\t\tindex,\n\t};\n\n\treturn result;\n}\n\nfunction mergeSemanticConfig(\n\tbase: SemanticConfigFile[\"semanticSearch\"] | undefined,\n\toverride: SemanticConfigFile[\"semanticSearch\"] | undefined,\n): SemanticConfigFile[\"semanticSearch\"] | undefined {\n\tif (!base && !override) return undefined;\n\treturn {\n\t\t...(base ?? {}),\n\t\t...(override ?? {}),\n\t\tprovider: {\n\t\t\t...(base?.provider ?? {}),\n\t\t\t...(override?.provider ?? {}),\n\t\t},\n\t\tindex: {\n\t\t\t...(base?.index ?? {}),\n\t\t\t...(override?.index ?? {}),\n\t\t},\n\t};\n}\n\nfunction resolveSemanticSearchConfig(\n\tpartial: SemanticConfigFile[\"semanticSearch\"] | undefined,\n): SemanticSearchConfig | undefined {\n\tif (!partial) return undefined;\n\n\tconst providerType = partial.provider?.type ?? DEFAULT_CONFIG.provider.type;\n\tconst model = (partial.provider?.model ?? DEFAULT_CONFIG.provider.model).trim();\n\tif (!model) {\n\t\tthrow new SemanticConfigError(`semanticSearch.provider.model cannot be empty`);\n\t}\n\n\treturn {\n\t\tenabled: partial.enabled ?? DEFAULT_CONFIG.enabled,\n\t\tautoIndex: partial.autoIndex ?? DEFAULT_CONFIG.autoIndex,\n\t\tprovider: {\n\t\t\ttype: providerType,\n\t\t\tmodel,\n\t\t\tbaseUrl: partial.provider?.baseUrl?.trim() || undefined,\n\t\t\tapiKeyEnv: partial.provider?.apiKeyEnv?.trim() || undefined,\n\t\t\theaders: partial.provider?.headers && Object.keys(partial.provider.headers).length > 0 ? partial.provider.headers : undefined,\n\t\t\tbatchSize: clampInt(partial.provider?.batchSize, DEFAULT_CONFIG.provider.batchSize, 1, 512),\n\t\t\ttimeoutMs: clampInt(partial.provider?.timeoutMs, DEFAULT_CONFIG.provider.timeoutMs, 1_000, 300_000),\n\t\t},\n\t\tindex: {\n\t\t\tincludeGlobs: partial.index?.includeGlobs && partial.index.includeGlobs.length > 0 ? partial.index.includeGlobs : [...DEFAULT_CONFIG.index.includeGlobs],\n\t\t\texcludeGlobs: partial.index?.excludeGlobs && partial.index.excludeGlobs.length > 0 ? partial.index.excludeGlobs : [...DEFAULT_CONFIG.index.excludeGlobs],\n\t\t\tchunkMaxChars: clampInt(partial.index?.chunkMaxChars, DEFAULT_CONFIG.index.chunkMaxChars, 200, 20_000),\n\t\t\tchunkOverlapChars: clampInt(partial.index?.chunkOverlapChars, DEFAULT_CONFIG.index.chunkOverlapChars, 0, 5_000),\n\t\t\tmaxFileBytes: clampInt(partial.index?.maxFileBytes, DEFAULT_CONFIG.index.maxFileBytes, 1_024, 16 * 1024 * 1024),\n\t\t\tmaxFiles: clampInt(partial.index?.maxFiles, DEFAULT_CONFIG.index.maxFiles, 1, 1_000_000),\n\t\t},\n\t};\n}\n\nexport function getSemanticConfigPath(scope: SemanticScope, cwd: string, agentDir: string): string {\n\treturn scope === \"project\" ? join(cwd, \".iosm\", \"semantic.json\") : join(agentDir, \"semantic.json\");\n}\n\nexport function readScopedSemanticConfig(scope: SemanticScope, cwd: string, agentDir: string): SemanticScopedLoadResult {\n\tconst path = getSemanticConfigPath(scope, cwd, agentDir);\n\ttry {\n\t\treturn {\n\t\t\tscope,\n\t\t\tpath,\n\t\t\tfile: parseSemanticConfigFile(path),\n\t\t};\n\t} catch (error) {\n\t\treturn {\n\t\t\tscope,\n\t\t\tpath,\n\t\t\tfile: {},\n\t\t\terror: error instanceof Error ? error : new Error(String(error)),\n\t\t};\n\t}\n}\n\nexport function loadMergedSemanticConfig(cwd: string, agentDir: string): SemanticMergedConfig {\n\tconst scoped = [readScopedSemanticConfig(\"user\", cwd, agentDir), readScopedSemanticConfig(\"project\", cwd, agentDir)];\n\tconst errors: string[] = [];\n\n\tfor (const entry of scoped) {\n\t\tif (entry.error) {\n\t\t\terrors.push(`${entry.scope} config (${entry.path}): ${entry.error.message}`);\n\t\t}\n\t}\n\n\tconst mergedPartial = mergeSemanticConfig(scoped[0]?.file.semanticSearch, scoped[1]?.file.semanticSearch);\n\tlet config: SemanticSearchConfig | undefined;\n\ttry {\n\t\tconfig = resolveSemanticSearchConfig(mergedPartial);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\terrors.push(`semanticSearch: ${message}`);\n\t\tconfig = undefined;\n\t}\n\n\treturn {\n\t\tconfig,\n\t\terrors,\n\t\tscoped,\n\t};\n}\n\nexport function writeScopedSemanticConfig(\n\tscope: SemanticScope,\n\tfile: SemanticConfigFile,\n\tcwd: string,\n\tagentDir: string,\n): string {\n\tconst path = getSemanticConfigPath(scope, cwd, agentDir);\n\tconst dir = dirname(path);\n\tif (!existsSync(dir)) {\n\t\tmkdirSync(dir, { recursive: true });\n\t}\n\twriteFileSync(path, `${JSON.stringify(file, null, 2)}\\n`, \"utf8\");\n\treturn path;\n}\n\nexport function upsertScopedSemanticSearchConfig(\n\tscope: SemanticScope,\n\tconfig: SemanticSearchConfig,\n\tcwd: string,\n\tagentDir: string,\n): string {\n\tconst current = readScopedSemanticConfig(scope, cwd, agentDir);\n\tif (current.error) {\n\t\tthrow new SemanticConfigError(`Cannot update ${scope} semantic config (${current.path}): ${current.error.message}`);\n\t}\n\tconst nextFile: SemanticConfigFile = {\n\t\t...current.file,\n\t\tsemanticSearch: {\n\t\t\tenabled: config.enabled,\n\t\t\tautoIndex: config.autoIndex,\n\t\t\tprovider: {\n\t\t\t\ttype: config.provider.type,\n\t\t\t\tmodel: config.provider.model,\n\t\t\t\tbaseUrl: config.provider.baseUrl,\n\t\t\t\tapiKeyEnv: config.provider.apiKeyEnv,\n\t\t\t\theaders: config.provider.headers,\n\t\t\t\tbatchSize: config.provider.batchSize,\n\t\t\t\ttimeoutMs: config.provider.timeoutMs,\n\t\t\t},\n\t\t\tindex: {\n\t\t\t\tincludeGlobs: [...config.index.includeGlobs],\n\t\t\t\texcludeGlobs: [...config.index.excludeGlobs],\n\t\t\t\tchunkMaxChars: config.index.chunkMaxChars,\n\t\t\t\tchunkOverlapChars: config.index.chunkOverlapChars,\n\t\t\t\tmaxFileBytes: config.index.maxFileBytes,\n\t\t\t\tmaxFiles: config.index.maxFiles,\n\t\t\t},\n\t\t},\n\t};\n\treturn writeScopedSemanticConfig(scope, nextFile, cwd, agentDir);\n}\n\nexport function getDefaultSemanticSearchConfig(): SemanticSearchConfig {\n\treturn {\n\t\tenabled: DEFAULT_CONFIG.enabled,\n\t\tautoIndex: DEFAULT_CONFIG.autoIndex,\n\t\tprovider: { ...DEFAULT_CONFIG.provider },\n\t\tindex: {\n\t\t\tincludeGlobs: [...DEFAULT_CONFIG.index.includeGlobs],\n\t\t\texcludeGlobs: [...DEFAULT_CONFIG.index.excludeGlobs],\n\t\t\tchunkMaxChars: DEFAULT_CONFIG.index.chunkMaxChars,\n\t\t\tchunkOverlapChars: DEFAULT_CONFIG.index.chunkOverlapChars,\n\t\t\tmaxFileBytes: DEFAULT_CONFIG.index.maxFileBytes,\n\t\t\tmaxFiles: DEFAULT_CONFIG.index.maxFiles,\n\t\t},\n\t};\n}\n"]}
@@ -4,5 +4,5 @@ export { clearSemanticIndex, getSemanticIndexDir, getSemanticIndexFiles, getSema
4
4
  export { createSemanticEmbeddingProvider, isLikelyEmbeddingModelId, listOllamaLocalModels, listOpenRouterEmbeddingModels, } from "./providers.js";
5
5
  export { SemanticSearchRuntime } from "./runtime.js";
6
6
  export type { SemanticAction, SemanticChunkForEmbedding, SemanticConfigFile, SemanticFileFingerprint, SemanticIndexConfig, SemanticIndexMeta, SemanticIndexOperationResult, SemanticIndexedChunk, SemanticIndexedVector, SemanticMergedConfig, SemanticProviderConfig, SemanticProviderType, SemanticQueryHit, SemanticQueryResult, SemanticScope, SemanticScopedLoadResult, SemanticSearchConfig, SemanticStatusResult, SemanticStaleReason, SemanticToolResult, } from "./types.js";
7
- export { SemanticConfigError, SemanticConfigMissingError, SemanticRebuildRequiredError, } from "./types.js";
7
+ export { SemanticConfigError, SemanticConfigMissingError, SemanticIndexRequiredError, SemanticRebuildRequiredError, } from "./types.js";
8
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/semantic/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,8BAA8B,EAC9B,qBAAqB,EACrB,wBAAwB,EACxB,wBAAwB,EACxB,gCAAgC,EAChC,yBAAyB,GACzB,MAAM,aAAa,CAAC;AACrB,OAAO,EACN,sBAAsB,EACtB,uBAAuB,EACvB,KAAK,sBAAsB,EAC3B,KAAK,kBAAkB,GACvB,MAAM,UAAU,CAAC;AAClB,OAAO,EACN,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EACrB,qBAAqB,EACrB,sBAAsB,EACtB,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,GAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACN,+BAA+B,EAC/B,wBAAwB,EACxB,qBAAqB,EACrB,6BAA6B,GAC7B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACrD,YAAY,EACX,cAAc,EACd,yBAAyB,EACzB,kBAAkB,EAClB,uBAAuB,EACvB,mBAAmB,EACnB,iBAAiB,EACjB,4BAA4B,EAC5B,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,EACpB,sBAAsB,EACtB,oBAAoB,EACpB,gBAAgB,EAChB,mBAAmB,EACnB,aAAa,EACb,wBAAwB,EACxB,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,GAClB,MAAM,YAAY,CAAC;AACpB,OAAO,EACN,mBAAmB,EACnB,0BAA0B,EAC1B,4BAA4B,GAC5B,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/semantic/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,8BAA8B,EAC9B,qBAAqB,EACrB,wBAAwB,EACxB,wBAAwB,EACxB,gCAAgC,EAChC,yBAAyB,GACzB,MAAM,aAAa,CAAC;AACrB,OAAO,EACN,sBAAsB,EACtB,uBAAuB,EACvB,KAAK,sBAAsB,EAC3B,KAAK,kBAAkB,GACvB,MAAM,UAAU,CAAC;AAClB,OAAO,EACN,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EACrB,qBAAqB,EACrB,sBAAsB,EACtB,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,GAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACN,+BAA+B,EAC/B,wBAAwB,EACxB,qBAAqB,EACrB,6BAA6B,GAC7B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACrD,YAAY,EACX,cAAc,EACd,yBAAyB,EACzB,kBAAkB,EAClB,uBAAuB,EACvB,mBAAmB,EACnB,iBAAiB,EACjB,4BAA4B,EAC5B,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,EACpB,sBAAsB,EACtB,oBAAoB,EACpB,gBAAgB,EAChB,mBAAmB,EACnB,aAAa,EACb,wBAAwB,EACxB,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,GAClB,MAAM,YAAY,CAAC;AACpB,OAAO,EACN,mBAAmB,EACnB,0BAA0B,EAC1B,0BAA0B,EAC1B,4BAA4B,GAC5B,MAAM,YAAY,CAAC"}
@@ -3,5 +3,5 @@ export { getSemanticCommandHelp, parseSemanticCliCommand, } from "./cli.js";
3
3
  export { clearSemanticIndex, getSemanticIndexDir, getSemanticIndexFiles, getSemanticIndexesDir, getSemanticProjectHash, getSemanticRootDir, loadSemanticIndex, writeSemanticIndex, } from "./index-store.js";
4
4
  export { createSemanticEmbeddingProvider, isLikelyEmbeddingModelId, listOllamaLocalModels, listOpenRouterEmbeddingModels, } from "./providers.js";
5
5
  export { SemanticSearchRuntime } from "./runtime.js";
6
- export { SemanticConfigError, SemanticConfigMissingError, SemanticRebuildRequiredError, } from "./types.js";
6
+ export { SemanticConfigError, SemanticConfigMissingError, SemanticIndexRequiredError, SemanticRebuildRequiredError, } from "./types.js";
7
7
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/semantic/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,8BAA8B,EAC9B,qBAAqB,EACrB,wBAAwB,EACxB,wBAAwB,EACxB,gCAAgC,EAChC,yBAAyB,GACzB,MAAM,aAAa,CAAC;AACrB,OAAO,EACN,sBAAsB,EACtB,uBAAuB,GAGvB,MAAM,UAAU,CAAC;AAClB,OAAO,EACN,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EACrB,qBAAqB,EACrB,sBAAsB,EACtB,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,GAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACN,+BAA+B,EAC/B,wBAAwB,EACxB,qBAAqB,EACrB,6BAA6B,GAC7B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAuBrD,OAAO,EACN,mBAAmB,EACnB,0BAA0B,EAC1B,4BAA4B,GAC5B,MAAM,YAAY,CAAC","sourcesContent":["export {\n\tgetDefaultSemanticSearchConfig,\n\tgetSemanticConfigPath,\n\tloadMergedSemanticConfig,\n\treadScopedSemanticConfig,\n\tupsertScopedSemanticSearchConfig,\n\twriteScopedSemanticConfig,\n} from \"./config.js\";\nexport {\n\tgetSemanticCommandHelp,\n\tparseSemanticCliCommand,\n\ttype ParseSemanticCliResult,\n\ttype SemanticCliCommand,\n} from \"./cli.js\";\nexport {\n\tclearSemanticIndex,\n\tgetSemanticIndexDir,\n\tgetSemanticIndexFiles,\n\tgetSemanticIndexesDir,\n\tgetSemanticProjectHash,\n\tgetSemanticRootDir,\n\tloadSemanticIndex,\n\twriteSemanticIndex,\n} from \"./index-store.js\";\nexport {\n\tcreateSemanticEmbeddingProvider,\n\tisLikelyEmbeddingModelId,\n\tlistOllamaLocalModels,\n\tlistOpenRouterEmbeddingModels,\n} from \"./providers.js\";\nexport { SemanticSearchRuntime } from \"./runtime.js\";\nexport type {\n\tSemanticAction,\n\tSemanticChunkForEmbedding,\n\tSemanticConfigFile,\n\tSemanticFileFingerprint,\n\tSemanticIndexConfig,\n\tSemanticIndexMeta,\n\tSemanticIndexOperationResult,\n\tSemanticIndexedChunk,\n\tSemanticIndexedVector,\n\tSemanticMergedConfig,\n\tSemanticProviderConfig,\n\tSemanticProviderType,\n\tSemanticQueryHit,\n\tSemanticQueryResult,\n\tSemanticScope,\n\tSemanticScopedLoadResult,\n\tSemanticSearchConfig,\n\tSemanticStatusResult,\n\tSemanticStaleReason,\n\tSemanticToolResult,\n} from \"./types.js\";\nexport {\n\tSemanticConfigError,\n\tSemanticConfigMissingError,\n\tSemanticRebuildRequiredError,\n} from \"./types.js\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/semantic/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,8BAA8B,EAC9B,qBAAqB,EACrB,wBAAwB,EACxB,wBAAwB,EACxB,gCAAgC,EAChC,yBAAyB,GACzB,MAAM,aAAa,CAAC;AACrB,OAAO,EACN,sBAAsB,EACtB,uBAAuB,GAGvB,MAAM,UAAU,CAAC;AAClB,OAAO,EACN,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EACrB,qBAAqB,EACrB,sBAAsB,EACtB,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,GAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACN,+BAA+B,EAC/B,wBAAwB,EACxB,qBAAqB,EACrB,6BAA6B,GAC7B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAuBrD,OAAO,EACN,mBAAmB,EACnB,0BAA0B,EAC1B,0BAA0B,EAC1B,4BAA4B,GAC5B,MAAM,YAAY,CAAC","sourcesContent":["export {\n\tgetDefaultSemanticSearchConfig,\n\tgetSemanticConfigPath,\n\tloadMergedSemanticConfig,\n\treadScopedSemanticConfig,\n\tupsertScopedSemanticSearchConfig,\n\twriteScopedSemanticConfig,\n} from \"./config.js\";\nexport {\n\tgetSemanticCommandHelp,\n\tparseSemanticCliCommand,\n\ttype ParseSemanticCliResult,\n\ttype SemanticCliCommand,\n} from \"./cli.js\";\nexport {\n\tclearSemanticIndex,\n\tgetSemanticIndexDir,\n\tgetSemanticIndexFiles,\n\tgetSemanticIndexesDir,\n\tgetSemanticProjectHash,\n\tgetSemanticRootDir,\n\tloadSemanticIndex,\n\twriteSemanticIndex,\n} from \"./index-store.js\";\nexport {\n\tcreateSemanticEmbeddingProvider,\n\tisLikelyEmbeddingModelId,\n\tlistOllamaLocalModels,\n\tlistOpenRouterEmbeddingModels,\n} from \"./providers.js\";\nexport { SemanticSearchRuntime } from \"./runtime.js\";\nexport type {\n\tSemanticAction,\n\tSemanticChunkForEmbedding,\n\tSemanticConfigFile,\n\tSemanticFileFingerprint,\n\tSemanticIndexConfig,\n\tSemanticIndexMeta,\n\tSemanticIndexOperationResult,\n\tSemanticIndexedChunk,\n\tSemanticIndexedVector,\n\tSemanticMergedConfig,\n\tSemanticProviderConfig,\n\tSemanticProviderType,\n\tSemanticQueryHit,\n\tSemanticQueryResult,\n\tSemanticScope,\n\tSemanticScopedLoadResult,\n\tSemanticSearchConfig,\n\tSemanticStatusResult,\n\tSemanticStaleReason,\n\tSemanticToolResult,\n} from \"./types.js\";\nexport {\n\tSemanticConfigError,\n\tSemanticConfigMissingError,\n\tSemanticIndexRequiredError,\n\tSemanticRebuildRequiredError,\n} from \"./types.js\";\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../src/core/semantic/runtime.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAatD,OAAO,KAAK,EAGX,4BAA4B,EAI5B,mBAAmB,EAEnB,oBAAoB,EAGpB,MAAM,YAAY,CAAC;AAMpB,UAAU,sBAAsB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,WAAW,CAAC;CAC1B;AAiED,qBAAa,qBAAqB;IACjC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAc;gBAE/B,OAAO,EAAE,sBAAsB;IAMrC,OAAO,CAAC,MAAM,EAAE,QAAQ,GAAG,OAAO,CAAC,oBAAoB,CAAC;IACxD,OAAO,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,4BAA4B,CAAC;IAC/D,OAAO,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,4BAA4B,CAAC;IACjE,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAcpF,MAAM,IAAI,OAAO,CAAC,oBAAoB,CAAC;IA+CvC,KAAK,IAAI,OAAO,CAAC,4BAA4B,CAAC;IAI9C,OAAO,IAAI,OAAO,CAAC,4BAA4B,CAAC;IAIhD,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAkF1E,OAAO,CAAC,4BAA4B;IAcpC,OAAO,CAAC,eAAe;IAsCvB,OAAO,CAAC,qBAAqB;IAkB7B,OAAO,CAAC,uBAAuB;IAiB/B,OAAO,CAAC,mBAAmB;IAqC3B,OAAO,CAAC,mBAAmB;IAe3B,OAAO,CAAC,sBAAsB;IAS9B,OAAO,CAAC,sBAAsB;YAWhB,UAAU;CA4KxB"}
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../src/core/semantic/runtime.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAatD,OAAO,KAAK,EAGX,4BAA4B,EAI5B,mBAAmB,EAEnB,oBAAoB,EAGpB,MAAM,YAAY,CAAC;AAOpB,UAAU,sBAAsB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,WAAW,CAAC;CAC1B;AAiED,qBAAa,qBAAqB;IACjC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAc;gBAE/B,OAAO,EAAE,sBAAsB;IAMrC,OAAO,CAAC,MAAM,EAAE,QAAQ,GAAG,OAAO,CAAC,oBAAoB,CAAC;IACxD,OAAO,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,4BAA4B,CAAC;IAC/D,OAAO,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,4BAA4B,CAAC;IACjE,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAcpF,MAAM,IAAI,OAAO,CAAC,oBAAoB,CAAC;IAiDvC,KAAK,IAAI,OAAO,CAAC,4BAA4B,CAAC;IAI9C,OAAO,IAAI,OAAO,CAAC,4BAA4B,CAAC;IAIhD,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAiG1E,OAAO,CAAC,4BAA4B;IAcpC,OAAO,CAAC,eAAe;IAsCvB,OAAO,CAAC,qBAAqB;IAkB7B,OAAO,CAAC,uBAAuB;IAiB/B,OAAO,CAAC,mBAAmB;IAqC3B,OAAO,CAAC,mBAAmB;IAe3B,OAAO,CAAC,sBAAsB;IAS9B,OAAO,CAAC,sBAAsB;YAWhB,UAAU;CA4KxB"}
@@ -6,7 +6,7 @@ import { getSemanticConfigPath, loadMergedSemanticConfig, } from "./config.js";
6
6
  import { chunkTextForSemantic } from "./chunking.js";
7
7
  import { getSemanticIndexDir, getSemanticProjectHash, loadSemanticIndex, writeSemanticIndex, } from "./index-store.js";
8
8
  import { createSemanticEmbeddingProvider } from "./providers.js";
9
- import { SemanticConfigMissingError, SemanticRebuildRequiredError, } from "./types.js";
9
+ import { SemanticConfigMissingError, SemanticIndexRequiredError, SemanticRebuildRequiredError, } from "./types.js";
10
10
  function toPosixPath(filePath) {
11
11
  return filePath.split(sep).join("/");
12
12
  }
@@ -87,6 +87,7 @@ export class SemanticSearchRuntime {
87
87
  action: "status",
88
88
  configured: false,
89
89
  enabled: false,
90
+ autoIndex: false,
90
91
  indexed: false,
91
92
  stale: true,
92
93
  staleReason: "missing_index",
@@ -105,6 +106,7 @@ export class SemanticSearchRuntime {
105
106
  action: "status",
106
107
  configured: true,
107
108
  enabled: config.enabled,
109
+ autoIndex: config.autoIndex,
108
110
  indexed: loaded.exists && !!loaded.meta,
109
111
  stale: stale.stale,
110
112
  staleReason: stale.reason,
@@ -142,6 +144,15 @@ export class SemanticSearchRuntime {
142
144
  status.staleReason === "chunking_changed" ||
143
145
  status.staleReason === "index_filters_changed" ||
144
146
  status.staleReason === "dimension_mismatch";
147
+ if (!config.autoIndex) {
148
+ if (!status.indexed) {
149
+ throw new SemanticIndexRequiredError("Semantic index is missing and auto-indexing is disabled. Run /semantic index (or iosm semantic index), or enable auto-indexing in /semantic.");
150
+ }
151
+ if (requiresRebuild) {
152
+ throw new SemanticRebuildRequiredError(`Semantic index is stale${status.staleReason ? ` (${status.staleReason})` : ""} and auto-indexing is disabled. Run /semantic rebuild.`);
153
+ }
154
+ throw new SemanticIndexRequiredError(`Semantic index is stale${status.staleReason ? ` (${status.staleReason})` : ""} and auto-indexing is disabled. Run /semantic index (or enable auto-indexing in /semantic).`);
155
+ }
145
156
  await this.buildIndex(requiresRebuild);
146
157
  autoRefreshed = true;
147
158
  }
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../../src/core/semantic/runtime.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\nimport { existsSync, readFileSync, statSync } from \"node:fs\";\nimport { relative, resolve, sep } from \"node:path\";\nimport { globSync } from \"glob\";\nimport type { AuthStorage } from \"../auth-storage.js\";\nimport {\n\tgetSemanticConfigPath,\n\tloadMergedSemanticConfig,\n} from \"./config.js\";\nimport { chunkTextForSemantic, type SemanticChunkDraft } from \"./chunking.js\";\nimport {\n\tgetSemanticIndexDir,\n\tgetSemanticProjectHash,\n\tloadSemanticIndex,\n\twriteSemanticIndex,\n} from \"./index-store.js\";\nimport { createSemanticEmbeddingProvider } from \"./providers.js\";\nimport type {\n\tSemanticIndexConfig,\n\tSemanticIndexMeta,\n\tSemanticIndexOperationResult,\n\tSemanticIndexedChunk,\n\tSemanticIndexedVector,\n\tSemanticQueryHit,\n\tSemanticQueryResult,\n\tSemanticSearchConfig,\n\tSemanticStatusResult,\n\tSemanticStaleReason,\n\tSemanticToolResult,\n} from \"./types.js\";\nimport {\n\tSemanticConfigMissingError,\n\tSemanticRebuildRequiredError,\n} from \"./types.js\";\n\ninterface SemanticRuntimeOptions {\n\tcwd: string;\n\tagentDir: string;\n\tauthStorage?: AuthStorage;\n}\n\ninterface ScannedSemanticFile {\n\tabsPath: string;\n\trelPath: string;\n\tsize: number;\n\tmtimeMs: number;\n\thash: string;\n\ttext: string;\n}\n\nfunction toPosixPath(filePath: string): string {\n\treturn filePath.split(sep).join(\"/\");\n}\n\nfunction sha256(input: string): string {\n\treturn createHash(\"sha256\").update(input).digest(\"hex\");\n}\n\nfunction fileHashFromContent(content: string): string {\n\treturn sha256(content);\n}\n\nfunction chunkId(path: string, draft: SemanticChunkDraft, index: number): string {\n\treturn sha256(`${path}:${draft.hash}:${draft.lineStart}:${draft.lineEnd}:${index}`).slice(0, 24);\n}\n\nfunction normalizeIndexPath(cwd: string, absolutePath: string): string {\n\tconst rel = relative(cwd, absolutePath);\n\treturn toPosixPath(rel);\n}\n\nfunction cosineSimilarity(a: number[], b: number[], normA: number, normB: number): number {\n\tif (normA <= 0 || normB <= 0 || a.length !== b.length) return 0;\n\tlet dot = 0;\n\tfor (let index = 0; index < a.length; index++) {\n\t\tdot += a[index]! * b[index]!;\n\t}\n\treturn dot / (normA * normB);\n}\n\nfunction vectorNorm(vector: number[]): number {\n\tlet sum = 0;\n\tfor (const value of vector) {\n\t\tsum += value * value;\n\t}\n\treturn Math.sqrt(sum);\n}\n\nfunction ageSecondsFromIso(iso: string): number | undefined {\n\tconst ms = Date.parse(iso);\n\tif (!Number.isFinite(ms)) return undefined;\n\tconst ageMs = Date.now() - ms;\n\tif (ageMs < 0) return 0;\n\treturn Math.floor(ageMs / 1000);\n}\n\nfunction clampTopK(value: number | undefined): number {\n\tif (!Number.isFinite(value)) return 8;\n\tconst normalized = Math.floor(value as number);\n\tif (normalized < 1) return 1;\n\tif (normalized > 20) return 20;\n\treturn normalized;\n}\n\nexport class SemanticSearchRuntime {\n\tprivate readonly cwd: string;\n\tprivate readonly agentDir: string;\n\tprivate readonly authStorage?: AuthStorage;\n\n\tconstructor(options: SemanticRuntimeOptions) {\n\t\tthis.cwd = resolve(options.cwd);\n\t\tthis.agentDir = options.agentDir;\n\t\tthis.authStorage = options.authStorage;\n\t}\n\n\tasync execute(action: \"status\"): Promise<SemanticStatusResult>;\n\tasync execute(action: \"index\"): Promise<SemanticIndexOperationResult>;\n\tasync execute(action: \"rebuild\"): Promise<SemanticIndexOperationResult>;\n\tasync execute(action: \"query\", query: string, topK?: number): Promise<SemanticQueryResult>;\n\tasync execute(action: \"status\" | \"index\" | \"rebuild\" | \"query\", query?: string, topK?: number): Promise<SemanticToolResult> {\n\t\tif (action === \"status\") {\n\t\t\treturn this.status();\n\t\t}\n\t\tif (action === \"index\") {\n\t\t\treturn this.index();\n\t\t}\n\t\tif (action === \"rebuild\") {\n\t\t\treturn this.rebuild();\n\t\t}\n\t\treturn this.query(query ?? \"\", topK);\n\t}\n\n\tasync status(): Promise<SemanticStatusResult> {\n\t\tconst userConfigPath = getSemanticConfigPath(\"user\", this.cwd, this.agentDir);\n\t\tconst projectConfigPath = getSemanticConfigPath(\"project\", this.cwd, this.agentDir);\n\t\tconst indexPath = getSemanticIndexDir(this.cwd, this.agentDir);\n\t\tconst merged = loadMergedSemanticConfig(this.cwd, this.agentDir);\n\t\tconst config = merged.config;\n\n\t\tif (!config) {\n\t\t\treturn {\n\t\t\t\taction: \"status\",\n\t\t\t\tconfigured: false,\n\t\t\t\tenabled: false,\n\t\t\t\tindexed: false,\n\t\t\t\tstale: true,\n\t\t\t\tstaleReason: \"missing_index\",\n\t\t\t\tfiles: 0,\n\t\t\t\tchunks: 0,\n\t\t\t\tindexPath,\n\t\t\t\tconfigPathUser: userConfigPath,\n\t\t\t\tconfigPathProject: projectConfigPath,\n\t\t\t};\n\t\t}\n\n\t\tconst loaded = loadSemanticIndex(indexPath);\n\t\tconst stale = this.detectStaleness(config, loaded.meta);\n\t\tconst files = loaded.meta ? Object.keys(loaded.meta.fileMap).length : 0;\n\t\tconst chunks = loaded.chunks.length;\n\n\t\treturn {\n\t\t\taction: \"status\",\n\t\t\tconfigured: true,\n\t\t\tenabled: config.enabled,\n\t\t\tindexed: loaded.exists && !!loaded.meta,\n\t\t\tstale: stale.stale,\n\t\t\tstaleReason: stale.reason,\n\t\t\tprovider: config.provider.type,\n\t\t\tmodel: config.provider.model,\n\t\t\tfiles,\n\t\t\tchunks,\n\t\t\tdimension: loaded.meta?.dimension,\n\t\t\tageSeconds: loaded.meta ? ageSecondsFromIso(loaded.meta.builtAt) : undefined,\n\t\t\tindexPath,\n\t\t\tconfigPathUser: userConfigPath,\n\t\t\tconfigPathProject: projectConfigPath,\n\t\t};\n\t}\n\n\tasync index(): Promise<SemanticIndexOperationResult> {\n\t\treturn this.buildIndex(false);\n\t}\n\n\tasync rebuild(): Promise<SemanticIndexOperationResult> {\n\t\treturn this.buildIndex(true);\n\t}\n\n\tasync query(rawQuery: string, topK?: number): Promise<SemanticQueryResult> {\n\t\tconst query = rawQuery.trim();\n\t\tif (!query) {\n\t\t\tthrow new Error(\"semantic query cannot be empty\");\n\t\t}\n\n\t\tconst config = this.loadConfiguredSemanticConfig();\n\t\tif (!config.enabled) {\n\t\t\tthrow new Error(\"semantic search is disabled in semantic.json\");\n\t\t}\n\n\t\tconst status = await this.status();\n\t\tlet autoRefreshed = false;\n\t\tif (!status.indexed || status.stale) {\n\t\t\tconst requiresRebuild =\n\t\t\t\t!status.indexed ||\n\t\t\t\tstatus.staleReason === \"provider_changed\" ||\n\t\t\t\tstatus.staleReason === \"chunking_changed\" ||\n\t\t\t\tstatus.staleReason === \"index_filters_changed\" ||\n\t\t\t\tstatus.staleReason === \"dimension_mismatch\";\n\t\t\tawait this.buildIndex(requiresRebuild);\n\t\t\tautoRefreshed = true;\n\t\t}\n\n\t\tconst indexPath = getSemanticIndexDir(this.cwd, this.agentDir);\n\t\tconst loaded = loadSemanticIndex(indexPath);\n\t\tconst meta = loaded.meta;\n\t\tif (!meta || loaded.vectors.length === 0 || loaded.chunks.length === 0) {\n\t\t\treturn {\n\t\t\t\taction: \"query\",\n\t\t\t\tquery,\n\t\t\t\ttopK: clampTopK(topK),\n\t\t\t\tautoRefreshed,\n\t\t\t\thits: [],\n\t\t\t};\n\t\t}\n\n\t\tconst provider = await createSemanticEmbeddingProvider(config.provider, {\n\t\t\tauthStorage: this.authStorage,\n\t\t});\n\t\tconst queryVector = (await provider.embed([query]))[0];\n\t\tif (!queryVector) {\n\t\t\tthrow new Error(\"provider returned no embedding for query\");\n\t\t}\n\n\t\tif (queryVector.length !== meta.dimension) {\n\t\t\tthrow new SemanticRebuildRequiredError(\n\t\t\t\t`Embedding dimension changed (${queryVector.length} != ${meta.dimension}). Run /semantic rebuild.`,\n\t\t\t);\n\t\t}\n\n\t\tconst chunkById = new Map<string, SemanticIndexedChunk>();\n\t\tfor (const chunk of loaded.chunks) {\n\t\t\tchunkById.set(chunk.id, chunk);\n\t\t}\n\t\tconst queryNorm = vectorNorm(queryVector);\n\t\tconst ranked: SemanticQueryHit[] = [];\n\t\tfor (const vector of loaded.vectors) {\n\t\t\tconst chunk = chunkById.get(vector.id);\n\t\t\tif (!chunk) continue;\n\t\t\tconst score = cosineSimilarity(queryVector, vector.vector, queryNorm, vector.norm);\n\t\t\tif (!Number.isFinite(score)) continue;\n\t\t\tranked.push({\n\t\t\t\tscore,\n\t\t\t\tpath: chunk.path,\n\t\t\t\tlineStart: chunk.lineStart,\n\t\t\t\tlineEnd: chunk.lineEnd,\n\t\t\t\tsnippet: chunk.preview,\n\t\t\t});\n\t\t}\n\n\t\tranked.sort((a, b) => b.score - a.score);\n\t\tconst effectiveTopK = clampTopK(topK);\n\t\treturn {\n\t\t\taction: \"query\",\n\t\t\tquery,\n\t\t\ttopK: effectiveTopK,\n\t\t\tautoRefreshed,\n\t\t\thits: ranked.slice(0, effectiveTopK),\n\t\t};\n\t}\n\n\tprivate loadConfiguredSemanticConfig(): SemanticSearchConfig {\n\t\tconst merged = loadMergedSemanticConfig(this.cwd, this.agentDir);\n\t\tif (!merged.config) {\n\t\t\tthrow new SemanticConfigMissingError(\n\t\t\t\tgetSemanticConfigPath(\"user\", this.cwd, this.agentDir),\n\t\t\t\tgetSemanticConfigPath(\"project\", this.cwd, this.agentDir),\n\t\t\t);\n\t\t}\n\t\tif (merged.errors.length > 0) {\n\t\t\tthrow new Error(`semantic config warnings: ${merged.errors.join(\" | \")}`);\n\t\t}\n\t\treturn merged.config;\n\t}\n\n\tprivate detectStaleness(\n\t\tconfig: SemanticSearchConfig,\n\t\tmeta: SemanticIndexMeta | undefined,\n\t): { stale: boolean; reason?: SemanticStaleReason } {\n\t\tif (!meta) {\n\t\t\treturn { stale: true, reason: \"missing_index\" };\n\t\t}\n\t\tif (meta.dimension <= 0) {\n\t\t\treturn { stale: true, reason: \"dimension_mismatch\" };\n\t\t}\n\t\tif (meta.providerFingerprint !== this.providerFingerprint(config)) {\n\t\t\treturn { stale: true, reason: \"provider_changed\" };\n\t\t}\n\t\tif (meta.chunkConfigFingerprint !== this.chunkConfigFingerprint(config.index)) {\n\t\t\treturn { stale: true, reason: \"chunking_changed\" };\n\t\t}\n\t\tif (meta.indexFilterFingerprint !== this.indexFilterFingerprint(config.index)) {\n\t\t\treturn { stale: true, reason: \"index_filters_changed\" };\n\t\t}\n\n\t\tconst statusFileMap = this.collectProjectFileStats(config.index);\n\t\tconst indexedPaths = Object.keys(meta.fileMap);\n\t\tif (indexedPaths.length !== statusFileMap.size) {\n\t\t\treturn { stale: true, reason: \"files_changed\" };\n\t\t}\n\t\tfor (const [path, current] of statusFileMap.entries()) {\n\t\t\tconst previous = meta.fileMap[path];\n\t\t\tif (!previous) {\n\t\t\t\treturn { stale: true, reason: \"files_changed\" };\n\t\t\t}\n\t\t\tif (previous.size !== current.size || previous.mtimeMs !== current.mtimeMs) {\n\t\t\t\treturn { stale: true, reason: \"files_changed\" };\n\t\t\t}\n\t\t}\n\n\t\treturn { stale: false };\n\t}\n\n\tprivate collectCandidatePaths(indexConfig: SemanticIndexConfig): string[] {\n\t\tconst results = new Set<string>();\n\t\tfor (const pattern of indexConfig.includeGlobs) {\n\t\t\tfor (const filePath of globSync(pattern, {\n\t\t\t\tcwd: this.cwd,\n\t\t\t\tabsolute: true,\n\t\t\t\tnodir: true,\n\t\t\t\tdot: true,\n\t\t\t\tignore: indexConfig.excludeGlobs,\n\t\t\t\tfollow: false,\n\t\t\t})) {\n\t\t\t\tresults.add(resolve(filePath));\n\t\t\t}\n\t\t}\n\n\t\treturn [...results].sort().slice(0, indexConfig.maxFiles);\n\t}\n\n\tprivate collectProjectFileStats(indexConfig: SemanticIndexConfig): Map<string, { size: number; mtimeMs: number }> {\n\t\tconst map = new Map<string, { size: number; mtimeMs: number }>();\n\t\tfor (const absPath of this.collectCandidatePaths(indexConfig)) {\n\t\t\tlet stat;\n\t\t\ttry {\n\t\t\t\tstat = statSync(absPath);\n\t\t\t} catch {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!stat.isFile()) continue;\n\t\t\tif (stat.size > indexConfig.maxFileBytes) continue;\n\t\t\tconst relPath = normalizeIndexPath(this.cwd, absPath);\n\t\t\tmap.set(relPath, { size: stat.size, mtimeMs: stat.mtimeMs });\n\t\t}\n\t\treturn map;\n\t}\n\n\tprivate collectProjectFiles(indexConfig: SemanticIndexConfig): ScannedSemanticFile[] {\n\t\tconst files: ScannedSemanticFile[] = [];\n\t\tfor (const absPath of this.collectCandidatePaths(indexConfig)) {\n\t\t\tlet stat;\n\t\t\ttry {\n\t\t\t\tstat = statSync(absPath);\n\t\t\t} catch {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!stat.isFile()) continue;\n\t\t\tif (stat.size > indexConfig.maxFileBytes) continue;\n\n\t\t\tlet buffer: Buffer;\n\t\t\ttry {\n\t\t\t\tbuffer = readFileSync(absPath);\n\t\t\t} catch {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (buffer.includes(0)) continue;\n\n\t\t\tconst text = buffer.toString(\"utf8\");\n\t\t\tconst trimmed = text.trim();\n\t\t\tif (!trimmed) continue;\n\n\t\t\tconst relPath = normalizeIndexPath(this.cwd, absPath);\n\t\t\tfiles.push({\n\t\t\t\tabsPath,\n\t\t\t\trelPath,\n\t\t\t\tsize: stat.size,\n\t\t\t\tmtimeMs: stat.mtimeMs,\n\t\t\t\thash: fileHashFromContent(text.replace(/\\r\\n/g, \"\\n\")),\n\t\t\t\ttext: text.replace(/\\r\\n/g, \"\\n\"),\n\t\t\t});\n\t\t}\n\t\treturn files;\n\t}\n\n\tprivate providerFingerprint(config: SemanticSearchConfig): string {\n\t\tconst stableHeaders = config.provider.headers\n\t\t\t? Object.entries(config.provider.headers).sort(([a], [b]) => a.localeCompare(b))\n\t\t\t: [];\n\t\treturn sha256(\n\t\t\tJSON.stringify({\n\t\t\t\ttype: config.provider.type,\n\t\t\t\tmodel: config.provider.model,\n\t\t\t\tbaseUrl: config.provider.baseUrl ?? \"\",\n\t\t\t\theaders: stableHeaders,\n\t\t\t\tapiKeyEnv: config.provider.apiKeyEnv ?? \"\",\n\t\t\t}),\n\t\t);\n\t}\n\n\tprivate chunkConfigFingerprint(indexConfig: SemanticIndexConfig): string {\n\t\treturn sha256(\n\t\t\tJSON.stringify({\n\t\t\t\tchunkMaxChars: indexConfig.chunkMaxChars,\n\t\t\t\tchunkOverlapChars: indexConfig.chunkOverlapChars,\n\t\t\t}),\n\t\t);\n\t}\n\n\tprivate indexFilterFingerprint(indexConfig: SemanticIndexConfig): string {\n\t\treturn sha256(\n\t\t\tJSON.stringify({\n\t\t\t\tincludeGlobs: [...indexConfig.includeGlobs].sort(),\n\t\t\t\texcludeGlobs: [...indexConfig.excludeGlobs].sort(),\n\t\t\t\tmaxFileBytes: indexConfig.maxFileBytes,\n\t\t\t\tmaxFiles: indexConfig.maxFiles,\n\t\t\t}),\n\t\t);\n\t}\n\n\tprivate async buildIndex(forceRebuild: boolean): Promise<SemanticIndexOperationResult> {\n\t\tconst startedAt = Date.now();\n\t\tconst config = this.loadConfiguredSemanticConfig();\n\t\tif (!config.enabled) {\n\t\t\tthrow new Error(\"semantic search is disabled in semantic.json\");\n\t\t}\n\n\t\tconst indexDir = getSemanticIndexDir(this.cwd, this.agentDir);\n\t\tconst existing = loadSemanticIndex(indexDir);\n\t\tconst existingMeta = existing.meta;\n\t\tconst providerFingerprint = this.providerFingerprint(config);\n\t\tconst chunkFingerprint = this.chunkConfigFingerprint(config.index);\n\t\tconst filterFingerprint = this.indexFilterFingerprint(config.index);\n\n\t\tif (\n\t\t\t!forceRebuild &&\n\t\t\texistingMeta &&\n\t\t\t(existingMeta.providerFingerprint !== providerFingerprint ||\n\t\t\t\texistingMeta.chunkConfigFingerprint !== chunkFingerprint ||\n\t\t\t\texistingMeta.indexFilterFingerprint !== filterFingerprint)\n\t\t) {\n\t\t\tthrow new SemanticRebuildRequiredError(\n\t\t\t\t\"Semantic index settings changed. Run /semantic rebuild (or iosm semantic rebuild).\",\n\t\t\t);\n\t\t}\n\n\t\tconst provider = await createSemanticEmbeddingProvider(config.provider, {\n\t\t\tauthStorage: this.authStorage,\n\t\t});\n\t\tconst files = this.collectProjectFiles(config.index);\n\t\tconst existingChunkById = new Map(existing.chunks.map((chunk) => [chunk.id, chunk]));\n\t\tconst existingVectorById = new Map(existing.vectors.map((vector) => [vector.id, vector]));\n\n\t\tconst nextChunks: SemanticIndexedChunk[] = [];\n\t\tconst nextVectors: SemanticIndexedVector[] = [];\n\t\tconst nextFileMap: SemanticIndexMeta[\"fileMap\"] = {};\n\n\t\tlet changedFiles = 0;\n\t\tlet newFiles = 0;\n\t\tlet reusedFiles = 0;\n\t\tlet removedFiles = 0;\n\t\t// Full rebuild must not inherit previous dimension. Otherwise provider/model\n\t\t// dimension changes can keep throwing mismatch even after rebuild.\n\t\tlet dimension = forceRebuild ? undefined : existingMeta?.dimension;\n\n\t\tconst currentPaths = new Set(files.map((file) => file.relPath));\n\t\tif (existingMeta) {\n\t\t\tfor (const path of Object.keys(existingMeta.fileMap)) {\n\t\t\t\tif (!currentPaths.has(path)) {\n\t\t\t\t\tremovedFiles += 1;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (const file of files) {\n\t\t\tconst prev = !forceRebuild ? existingMeta?.fileMap[file.relPath] : undefined;\n\t\t\tconst canReuse =\n\t\t\t\t!!prev &&\n\t\t\t\tprev.hash === file.hash &&\n\t\t\t\tprev.chunks.length > 0 &&\n\t\t\t\tprev.chunks.every((id) => existingChunkById.has(id) && existingVectorById.has(id));\n\n\t\t\tif (canReuse && prev) {\n\t\t\t\treusedFiles += 1;\n\t\t\t\tfor (const chunkId of prev.chunks) {\n\t\t\t\t\tconst chunk = existingChunkById.get(chunkId);\n\t\t\t\t\tconst vector = existingVectorById.get(chunkId);\n\t\t\t\t\tif (!chunk || !vector) continue;\n\t\t\t\t\tnextChunks.push(chunk);\n\t\t\t\t\tnextVectors.push(vector);\n\t\t\t\t}\n\t\t\t\tnextFileMap[file.relPath] = {\n\t\t\t\t\tpath: file.relPath,\n\t\t\t\t\tsize: file.size,\n\t\t\t\t\tmtimeMs: file.mtimeMs,\n\t\t\t\t\thash: file.hash,\n\t\t\t\t\tchunks: [...prev.chunks],\n\t\t\t\t};\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (prev) changedFiles += 1;\n\t\t\telse newFiles += 1;\n\n\t\t\tconst drafts = chunkTextForSemantic(file.text, config.index);\n\t\t\tconst chunkRecords = drafts.map((draft, index) => {\n\t\t\t\tconst id = chunkId(file.relPath, draft, index);\n\t\t\t\treturn {\n\t\t\t\t\tid,\n\t\t\t\t\tpath: file.relPath,\n\t\t\t\t\tlineStart: draft.lineStart,\n\t\t\t\t\tlineEnd: draft.lineEnd,\n\t\t\t\t\tpreview: draft.preview,\n\t\t\t\t\thash: draft.hash,\n\t\t\t\t\ttext: draft.text,\n\t\t\t\t};\n\t\t\t});\n\t\t\tconst chunkIds = chunkRecords.map((chunk) => chunk.id);\n\t\t\tnextFileMap[file.relPath] = {\n\t\t\t\tpath: file.relPath,\n\t\t\t\tsize: file.size,\n\t\t\t\tmtimeMs: file.mtimeMs,\n\t\t\t\thash: file.hash,\n\t\t\t\tchunks: chunkIds,\n\t\t\t};\n\n\t\t\tif (chunkRecords.length === 0) continue;\n\t\t\tconst embeddings = await provider.embed(chunkRecords.map((chunk) => chunk.text));\n\t\t\tif (embeddings.length !== chunkRecords.length) {\n\t\t\t\tthrow new Error(`Embedding provider returned ${embeddings.length} vectors for ${chunkRecords.length} chunks.`);\n\t\t\t}\n\n\t\t\tfor (let index = 0; index < chunkRecords.length; index++) {\n\t\t\t\tconst chunk = chunkRecords[index]!;\n\t\t\t\tconst vector = embeddings[index]!;\n\t\t\t\tif (!Array.isArray(vector) || vector.length === 0) {\n\t\t\t\t\tthrow new Error(\"Embedding provider returned an empty vector.\");\n\t\t\t\t}\n\t\t\t\tif (dimension === undefined || dimension <= 0) {\n\t\t\t\t\tdimension = vector.length;\n\t\t\t\t} else if (dimension !== vector.length) {\n\t\t\t\t\tthrow new SemanticRebuildRequiredError(\n\t\t\t\t\t\t`Embedding dimension mismatch (${vector.length} != ${dimension}). Run /semantic rebuild.`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tnextChunks.push({\n\t\t\t\t\tid: chunk.id,\n\t\t\t\t\tpath: chunk.path,\n\t\t\t\t\tlineStart: chunk.lineStart,\n\t\t\t\t\tlineEnd: chunk.lineEnd,\n\t\t\t\t\tpreview: chunk.preview,\n\t\t\t\t\thash: chunk.hash,\n\t\t\t\t});\n\t\t\t\tnextVectors.push({\n\t\t\t\t\tid: chunk.id,\n\t\t\t\t\tvector,\n\t\t\t\t\tnorm: vectorNorm(vector),\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tconst builtAt = new Date().toISOString();\n\t\tconst meta: SemanticIndexMeta = {\n\t\t\tversion: 1,\n\t\t\tcwd: this.cwd,\n\t\t\tprojectHash: getSemanticProjectHash(this.cwd),\n\t\t\tproviderFingerprint,\n\t\t\tproviderType: config.provider.type,\n\t\t\tmodel: config.provider.model,\n\t\t\tdimension: dimension ?? 0,\n\t\t\tbuiltAt,\n\t\t\tchunkConfigFingerprint: chunkFingerprint,\n\t\t\tindexFilterFingerprint: filterFingerprint,\n\t\t\tfileMap: nextFileMap,\n\t\t};\n\t\twriteSemanticIndex(indexDir, meta, nextChunks, nextVectors);\n\n\t\treturn {\n\t\t\taction: forceRebuild ? \"rebuild\" : \"index\",\n\t\t\tindexPath: indexDir,\n\t\t\tdurationMs: Date.now() - startedAt,\n\t\t\tprocessedFiles: files.length,\n\t\t\tnewFiles,\n\t\t\tchangedFiles,\n\t\t\tremovedFiles,\n\t\t\treusedFiles,\n\t\t\tchunks: nextChunks.length,\n\t\t\tdimension: meta.dimension,\n\t\t\tbuiltAt,\n\t\t};\n\t}\n}\n"]}
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../../src/core/semantic/runtime.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\nimport { existsSync, readFileSync, statSync } from \"node:fs\";\nimport { relative, resolve, sep } from \"node:path\";\nimport { globSync } from \"glob\";\nimport type { AuthStorage } from \"../auth-storage.js\";\nimport {\n\tgetSemanticConfigPath,\n\tloadMergedSemanticConfig,\n} from \"./config.js\";\nimport { chunkTextForSemantic, type SemanticChunkDraft } from \"./chunking.js\";\nimport {\n\tgetSemanticIndexDir,\n\tgetSemanticProjectHash,\n\tloadSemanticIndex,\n\twriteSemanticIndex,\n} from \"./index-store.js\";\nimport { createSemanticEmbeddingProvider } from \"./providers.js\";\nimport type {\n\tSemanticIndexConfig,\n\tSemanticIndexMeta,\n\tSemanticIndexOperationResult,\n\tSemanticIndexedChunk,\n\tSemanticIndexedVector,\n\tSemanticQueryHit,\n\tSemanticQueryResult,\n\tSemanticSearchConfig,\n\tSemanticStatusResult,\n\tSemanticStaleReason,\n\tSemanticToolResult,\n} from \"./types.js\";\nimport {\n\tSemanticConfigMissingError,\n\tSemanticIndexRequiredError,\n\tSemanticRebuildRequiredError,\n} from \"./types.js\";\n\ninterface SemanticRuntimeOptions {\n\tcwd: string;\n\tagentDir: string;\n\tauthStorage?: AuthStorage;\n}\n\ninterface ScannedSemanticFile {\n\tabsPath: string;\n\trelPath: string;\n\tsize: number;\n\tmtimeMs: number;\n\thash: string;\n\ttext: string;\n}\n\nfunction toPosixPath(filePath: string): string {\n\treturn filePath.split(sep).join(\"/\");\n}\n\nfunction sha256(input: string): string {\n\treturn createHash(\"sha256\").update(input).digest(\"hex\");\n}\n\nfunction fileHashFromContent(content: string): string {\n\treturn sha256(content);\n}\n\nfunction chunkId(path: string, draft: SemanticChunkDraft, index: number): string {\n\treturn sha256(`${path}:${draft.hash}:${draft.lineStart}:${draft.lineEnd}:${index}`).slice(0, 24);\n}\n\nfunction normalizeIndexPath(cwd: string, absolutePath: string): string {\n\tconst rel = relative(cwd, absolutePath);\n\treturn toPosixPath(rel);\n}\n\nfunction cosineSimilarity(a: number[], b: number[], normA: number, normB: number): number {\n\tif (normA <= 0 || normB <= 0 || a.length !== b.length) return 0;\n\tlet dot = 0;\n\tfor (let index = 0; index < a.length; index++) {\n\t\tdot += a[index]! * b[index]!;\n\t}\n\treturn dot / (normA * normB);\n}\n\nfunction vectorNorm(vector: number[]): number {\n\tlet sum = 0;\n\tfor (const value of vector) {\n\t\tsum += value * value;\n\t}\n\treturn Math.sqrt(sum);\n}\n\nfunction ageSecondsFromIso(iso: string): number | undefined {\n\tconst ms = Date.parse(iso);\n\tif (!Number.isFinite(ms)) return undefined;\n\tconst ageMs = Date.now() - ms;\n\tif (ageMs < 0) return 0;\n\treturn Math.floor(ageMs / 1000);\n}\n\nfunction clampTopK(value: number | undefined): number {\n\tif (!Number.isFinite(value)) return 8;\n\tconst normalized = Math.floor(value as number);\n\tif (normalized < 1) return 1;\n\tif (normalized > 20) return 20;\n\treturn normalized;\n}\n\nexport class SemanticSearchRuntime {\n\tprivate readonly cwd: string;\n\tprivate readonly agentDir: string;\n\tprivate readonly authStorage?: AuthStorage;\n\n\tconstructor(options: SemanticRuntimeOptions) {\n\t\tthis.cwd = resolve(options.cwd);\n\t\tthis.agentDir = options.agentDir;\n\t\tthis.authStorage = options.authStorage;\n\t}\n\n\tasync execute(action: \"status\"): Promise<SemanticStatusResult>;\n\tasync execute(action: \"index\"): Promise<SemanticIndexOperationResult>;\n\tasync execute(action: \"rebuild\"): Promise<SemanticIndexOperationResult>;\n\tasync execute(action: \"query\", query: string, topK?: number): Promise<SemanticQueryResult>;\n\tasync execute(action: \"status\" | \"index\" | \"rebuild\" | \"query\", query?: string, topK?: number): Promise<SemanticToolResult> {\n\t\tif (action === \"status\") {\n\t\t\treturn this.status();\n\t\t}\n\t\tif (action === \"index\") {\n\t\t\treturn this.index();\n\t\t}\n\t\tif (action === \"rebuild\") {\n\t\t\treturn this.rebuild();\n\t\t}\n\t\treturn this.query(query ?? \"\", topK);\n\t}\n\n\tasync status(): Promise<SemanticStatusResult> {\n\t\tconst userConfigPath = getSemanticConfigPath(\"user\", this.cwd, this.agentDir);\n\t\tconst projectConfigPath = getSemanticConfigPath(\"project\", this.cwd, this.agentDir);\n\t\tconst indexPath = getSemanticIndexDir(this.cwd, this.agentDir);\n\t\tconst merged = loadMergedSemanticConfig(this.cwd, this.agentDir);\n\t\tconst config = merged.config;\n\n\t\tif (!config) {\n\t\t\treturn {\n\t\t\t\taction: \"status\",\n\t\t\t\tconfigured: false,\n\t\t\t\tenabled: false,\n\t\t\t\tautoIndex: false,\n\t\t\t\tindexed: false,\n\t\t\t\tstale: true,\n\t\t\t\tstaleReason: \"missing_index\",\n\t\t\t\tfiles: 0,\n\t\t\t\tchunks: 0,\n\t\t\t\tindexPath,\n\t\t\t\tconfigPathUser: userConfigPath,\n\t\t\t\tconfigPathProject: projectConfigPath,\n\t\t\t};\n\t\t}\n\n\t\tconst loaded = loadSemanticIndex(indexPath);\n\t\tconst stale = this.detectStaleness(config, loaded.meta);\n\t\tconst files = loaded.meta ? Object.keys(loaded.meta.fileMap).length : 0;\n\t\tconst chunks = loaded.chunks.length;\n\n\t\treturn {\n\t\t\taction: \"status\",\n\t\t\tconfigured: true,\n\t\t\tenabled: config.enabled,\n\t\t\tautoIndex: config.autoIndex,\n\t\t\tindexed: loaded.exists && !!loaded.meta,\n\t\t\tstale: stale.stale,\n\t\t\tstaleReason: stale.reason,\n\t\t\tprovider: config.provider.type,\n\t\t\tmodel: config.provider.model,\n\t\t\tfiles,\n\t\t\tchunks,\n\t\t\tdimension: loaded.meta?.dimension,\n\t\t\tageSeconds: loaded.meta ? ageSecondsFromIso(loaded.meta.builtAt) : undefined,\n\t\t\tindexPath,\n\t\t\tconfigPathUser: userConfigPath,\n\t\t\tconfigPathProject: projectConfigPath,\n\t\t};\n\t}\n\n\tasync index(): Promise<SemanticIndexOperationResult> {\n\t\treturn this.buildIndex(false);\n\t}\n\n\tasync rebuild(): Promise<SemanticIndexOperationResult> {\n\t\treturn this.buildIndex(true);\n\t}\n\n\tasync query(rawQuery: string, topK?: number): Promise<SemanticQueryResult> {\n\t\tconst query = rawQuery.trim();\n\t\tif (!query) {\n\t\t\tthrow new Error(\"semantic query cannot be empty\");\n\t\t}\n\n\t\tconst config = this.loadConfiguredSemanticConfig();\n\t\tif (!config.enabled) {\n\t\t\tthrow new Error(\"semantic search is disabled in semantic.json\");\n\t\t}\n\n\t\tconst status = await this.status();\n\t\tlet autoRefreshed = false;\n\t\tif (!status.indexed || status.stale) {\n\t\t\tconst requiresRebuild =\n\t\t\t\t!status.indexed ||\n\t\t\t\tstatus.staleReason === \"provider_changed\" ||\n\t\t\t\tstatus.staleReason === \"chunking_changed\" ||\n\t\t\t\tstatus.staleReason === \"index_filters_changed\" ||\n\t\t\t\tstatus.staleReason === \"dimension_mismatch\";\n\t\t\tif (!config.autoIndex) {\n\t\t\t\tif (!status.indexed) {\n\t\t\t\t\tthrow new SemanticIndexRequiredError(\n\t\t\t\t\t\t\"Semantic index is missing and auto-indexing is disabled. Run /semantic index (or iosm semantic index), or enable auto-indexing in /semantic.\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (requiresRebuild) {\n\t\t\t\t\tthrow new SemanticRebuildRequiredError(\n\t\t\t\t\t\t`Semantic index is stale${status.staleReason ? ` (${status.staleReason})` : \"\"} and auto-indexing is disabled. Run /semantic rebuild.`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tthrow new SemanticIndexRequiredError(\n\t\t\t\t\t`Semantic index is stale${status.staleReason ? ` (${status.staleReason})` : \"\"} and auto-indexing is disabled. Run /semantic index (or enable auto-indexing in /semantic).`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tawait this.buildIndex(requiresRebuild);\n\t\t\tautoRefreshed = true;\n\t\t}\n\n\t\tconst indexPath = getSemanticIndexDir(this.cwd, this.agentDir);\n\t\tconst loaded = loadSemanticIndex(indexPath);\n\t\tconst meta = loaded.meta;\n\t\tif (!meta || loaded.vectors.length === 0 || loaded.chunks.length === 0) {\n\t\t\treturn {\n\t\t\t\taction: \"query\",\n\t\t\t\tquery,\n\t\t\t\ttopK: clampTopK(topK),\n\t\t\t\tautoRefreshed,\n\t\t\t\thits: [],\n\t\t\t};\n\t\t}\n\n\t\tconst provider = await createSemanticEmbeddingProvider(config.provider, {\n\t\t\tauthStorage: this.authStorage,\n\t\t});\n\t\tconst queryVector = (await provider.embed([query]))[0];\n\t\tif (!queryVector) {\n\t\t\tthrow new Error(\"provider returned no embedding for query\");\n\t\t}\n\n\t\tif (queryVector.length !== meta.dimension) {\n\t\t\tthrow new SemanticRebuildRequiredError(\n\t\t\t\t`Embedding dimension changed (${queryVector.length} != ${meta.dimension}). Run /semantic rebuild.`,\n\t\t\t);\n\t\t}\n\n\t\tconst chunkById = new Map<string, SemanticIndexedChunk>();\n\t\tfor (const chunk of loaded.chunks) {\n\t\t\tchunkById.set(chunk.id, chunk);\n\t\t}\n\t\tconst queryNorm = vectorNorm(queryVector);\n\t\tconst ranked: SemanticQueryHit[] = [];\n\t\tfor (const vector of loaded.vectors) {\n\t\t\tconst chunk = chunkById.get(vector.id);\n\t\t\tif (!chunk) continue;\n\t\t\tconst score = cosineSimilarity(queryVector, vector.vector, queryNorm, vector.norm);\n\t\t\tif (!Number.isFinite(score)) continue;\n\t\t\tranked.push({\n\t\t\t\tscore,\n\t\t\t\tpath: chunk.path,\n\t\t\t\tlineStart: chunk.lineStart,\n\t\t\t\tlineEnd: chunk.lineEnd,\n\t\t\t\tsnippet: chunk.preview,\n\t\t\t});\n\t\t}\n\n\t\tranked.sort((a, b) => b.score - a.score);\n\t\tconst effectiveTopK = clampTopK(topK);\n\t\treturn {\n\t\t\taction: \"query\",\n\t\t\tquery,\n\t\t\ttopK: effectiveTopK,\n\t\t\tautoRefreshed,\n\t\t\thits: ranked.slice(0, effectiveTopK),\n\t\t};\n\t}\n\n\tprivate loadConfiguredSemanticConfig(): SemanticSearchConfig {\n\t\tconst merged = loadMergedSemanticConfig(this.cwd, this.agentDir);\n\t\tif (!merged.config) {\n\t\t\tthrow new SemanticConfigMissingError(\n\t\t\t\tgetSemanticConfigPath(\"user\", this.cwd, this.agentDir),\n\t\t\t\tgetSemanticConfigPath(\"project\", this.cwd, this.agentDir),\n\t\t\t);\n\t\t}\n\t\tif (merged.errors.length > 0) {\n\t\t\tthrow new Error(`semantic config warnings: ${merged.errors.join(\" | \")}`);\n\t\t}\n\t\treturn merged.config;\n\t}\n\n\tprivate detectStaleness(\n\t\tconfig: SemanticSearchConfig,\n\t\tmeta: SemanticIndexMeta | undefined,\n\t): { stale: boolean; reason?: SemanticStaleReason } {\n\t\tif (!meta) {\n\t\t\treturn { stale: true, reason: \"missing_index\" };\n\t\t}\n\t\tif (meta.dimension <= 0) {\n\t\t\treturn { stale: true, reason: \"dimension_mismatch\" };\n\t\t}\n\t\tif (meta.providerFingerprint !== this.providerFingerprint(config)) {\n\t\t\treturn { stale: true, reason: \"provider_changed\" };\n\t\t}\n\t\tif (meta.chunkConfigFingerprint !== this.chunkConfigFingerprint(config.index)) {\n\t\t\treturn { stale: true, reason: \"chunking_changed\" };\n\t\t}\n\t\tif (meta.indexFilterFingerprint !== this.indexFilterFingerprint(config.index)) {\n\t\t\treturn { stale: true, reason: \"index_filters_changed\" };\n\t\t}\n\n\t\tconst statusFileMap = this.collectProjectFileStats(config.index);\n\t\tconst indexedPaths = Object.keys(meta.fileMap);\n\t\tif (indexedPaths.length !== statusFileMap.size) {\n\t\t\treturn { stale: true, reason: \"files_changed\" };\n\t\t}\n\t\tfor (const [path, current] of statusFileMap.entries()) {\n\t\t\tconst previous = meta.fileMap[path];\n\t\t\tif (!previous) {\n\t\t\t\treturn { stale: true, reason: \"files_changed\" };\n\t\t\t}\n\t\t\tif (previous.size !== current.size || previous.mtimeMs !== current.mtimeMs) {\n\t\t\t\treturn { stale: true, reason: \"files_changed\" };\n\t\t\t}\n\t\t}\n\n\t\treturn { stale: false };\n\t}\n\n\tprivate collectCandidatePaths(indexConfig: SemanticIndexConfig): string[] {\n\t\tconst results = new Set<string>();\n\t\tfor (const pattern of indexConfig.includeGlobs) {\n\t\t\tfor (const filePath of globSync(pattern, {\n\t\t\t\tcwd: this.cwd,\n\t\t\t\tabsolute: true,\n\t\t\t\tnodir: true,\n\t\t\t\tdot: true,\n\t\t\t\tignore: indexConfig.excludeGlobs,\n\t\t\t\tfollow: false,\n\t\t\t})) {\n\t\t\t\tresults.add(resolve(filePath));\n\t\t\t}\n\t\t}\n\n\t\treturn [...results].sort().slice(0, indexConfig.maxFiles);\n\t}\n\n\tprivate collectProjectFileStats(indexConfig: SemanticIndexConfig): Map<string, { size: number; mtimeMs: number }> {\n\t\tconst map = new Map<string, { size: number; mtimeMs: number }>();\n\t\tfor (const absPath of this.collectCandidatePaths(indexConfig)) {\n\t\t\tlet stat;\n\t\t\ttry {\n\t\t\t\tstat = statSync(absPath);\n\t\t\t} catch {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!stat.isFile()) continue;\n\t\t\tif (stat.size > indexConfig.maxFileBytes) continue;\n\t\t\tconst relPath = normalizeIndexPath(this.cwd, absPath);\n\t\t\tmap.set(relPath, { size: stat.size, mtimeMs: stat.mtimeMs });\n\t\t}\n\t\treturn map;\n\t}\n\n\tprivate collectProjectFiles(indexConfig: SemanticIndexConfig): ScannedSemanticFile[] {\n\t\tconst files: ScannedSemanticFile[] = [];\n\t\tfor (const absPath of this.collectCandidatePaths(indexConfig)) {\n\t\t\tlet stat;\n\t\t\ttry {\n\t\t\t\tstat = statSync(absPath);\n\t\t\t} catch {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (!stat.isFile()) continue;\n\t\t\tif (stat.size > indexConfig.maxFileBytes) continue;\n\n\t\t\tlet buffer: Buffer;\n\t\t\ttry {\n\t\t\t\tbuffer = readFileSync(absPath);\n\t\t\t} catch {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (buffer.includes(0)) continue;\n\n\t\t\tconst text = buffer.toString(\"utf8\");\n\t\t\tconst trimmed = text.trim();\n\t\t\tif (!trimmed) continue;\n\n\t\t\tconst relPath = normalizeIndexPath(this.cwd, absPath);\n\t\t\tfiles.push({\n\t\t\t\tabsPath,\n\t\t\t\trelPath,\n\t\t\t\tsize: stat.size,\n\t\t\t\tmtimeMs: stat.mtimeMs,\n\t\t\t\thash: fileHashFromContent(text.replace(/\\r\\n/g, \"\\n\")),\n\t\t\t\ttext: text.replace(/\\r\\n/g, \"\\n\"),\n\t\t\t});\n\t\t}\n\t\treturn files;\n\t}\n\n\tprivate providerFingerprint(config: SemanticSearchConfig): string {\n\t\tconst stableHeaders = config.provider.headers\n\t\t\t? Object.entries(config.provider.headers).sort(([a], [b]) => a.localeCompare(b))\n\t\t\t: [];\n\t\treturn sha256(\n\t\t\tJSON.stringify({\n\t\t\t\ttype: config.provider.type,\n\t\t\t\tmodel: config.provider.model,\n\t\t\t\tbaseUrl: config.provider.baseUrl ?? \"\",\n\t\t\t\theaders: stableHeaders,\n\t\t\t\tapiKeyEnv: config.provider.apiKeyEnv ?? \"\",\n\t\t\t}),\n\t\t);\n\t}\n\n\tprivate chunkConfigFingerprint(indexConfig: SemanticIndexConfig): string {\n\t\treturn sha256(\n\t\t\tJSON.stringify({\n\t\t\t\tchunkMaxChars: indexConfig.chunkMaxChars,\n\t\t\t\tchunkOverlapChars: indexConfig.chunkOverlapChars,\n\t\t\t}),\n\t\t);\n\t}\n\n\tprivate indexFilterFingerprint(indexConfig: SemanticIndexConfig): string {\n\t\treturn sha256(\n\t\t\tJSON.stringify({\n\t\t\t\tincludeGlobs: [...indexConfig.includeGlobs].sort(),\n\t\t\t\texcludeGlobs: [...indexConfig.excludeGlobs].sort(),\n\t\t\t\tmaxFileBytes: indexConfig.maxFileBytes,\n\t\t\t\tmaxFiles: indexConfig.maxFiles,\n\t\t\t}),\n\t\t);\n\t}\n\n\tprivate async buildIndex(forceRebuild: boolean): Promise<SemanticIndexOperationResult> {\n\t\tconst startedAt = Date.now();\n\t\tconst config = this.loadConfiguredSemanticConfig();\n\t\tif (!config.enabled) {\n\t\t\tthrow new Error(\"semantic search is disabled in semantic.json\");\n\t\t}\n\n\t\tconst indexDir = getSemanticIndexDir(this.cwd, this.agentDir);\n\t\tconst existing = loadSemanticIndex(indexDir);\n\t\tconst existingMeta = existing.meta;\n\t\tconst providerFingerprint = this.providerFingerprint(config);\n\t\tconst chunkFingerprint = this.chunkConfigFingerprint(config.index);\n\t\tconst filterFingerprint = this.indexFilterFingerprint(config.index);\n\n\t\tif (\n\t\t\t!forceRebuild &&\n\t\t\texistingMeta &&\n\t\t\t(existingMeta.providerFingerprint !== providerFingerprint ||\n\t\t\t\texistingMeta.chunkConfigFingerprint !== chunkFingerprint ||\n\t\t\t\texistingMeta.indexFilterFingerprint !== filterFingerprint)\n\t\t) {\n\t\t\tthrow new SemanticRebuildRequiredError(\n\t\t\t\t\"Semantic index settings changed. Run /semantic rebuild (or iosm semantic rebuild).\",\n\t\t\t);\n\t\t}\n\n\t\tconst provider = await createSemanticEmbeddingProvider(config.provider, {\n\t\t\tauthStorage: this.authStorage,\n\t\t});\n\t\tconst files = this.collectProjectFiles(config.index);\n\t\tconst existingChunkById = new Map(existing.chunks.map((chunk) => [chunk.id, chunk]));\n\t\tconst existingVectorById = new Map(existing.vectors.map((vector) => [vector.id, vector]));\n\n\t\tconst nextChunks: SemanticIndexedChunk[] = [];\n\t\tconst nextVectors: SemanticIndexedVector[] = [];\n\t\tconst nextFileMap: SemanticIndexMeta[\"fileMap\"] = {};\n\n\t\tlet changedFiles = 0;\n\t\tlet newFiles = 0;\n\t\tlet reusedFiles = 0;\n\t\tlet removedFiles = 0;\n\t\t// Full rebuild must not inherit previous dimension. Otherwise provider/model\n\t\t// dimension changes can keep throwing mismatch even after rebuild.\n\t\tlet dimension = forceRebuild ? undefined : existingMeta?.dimension;\n\n\t\tconst currentPaths = new Set(files.map((file) => file.relPath));\n\t\tif (existingMeta) {\n\t\t\tfor (const path of Object.keys(existingMeta.fileMap)) {\n\t\t\t\tif (!currentPaths.has(path)) {\n\t\t\t\t\tremovedFiles += 1;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (const file of files) {\n\t\t\tconst prev = !forceRebuild ? existingMeta?.fileMap[file.relPath] : undefined;\n\t\t\tconst canReuse =\n\t\t\t\t!!prev &&\n\t\t\t\tprev.hash === file.hash &&\n\t\t\t\tprev.chunks.length > 0 &&\n\t\t\t\tprev.chunks.every((id) => existingChunkById.has(id) && existingVectorById.has(id));\n\n\t\t\tif (canReuse && prev) {\n\t\t\t\treusedFiles += 1;\n\t\t\t\tfor (const chunkId of prev.chunks) {\n\t\t\t\t\tconst chunk = existingChunkById.get(chunkId);\n\t\t\t\t\tconst vector = existingVectorById.get(chunkId);\n\t\t\t\t\tif (!chunk || !vector) continue;\n\t\t\t\t\tnextChunks.push(chunk);\n\t\t\t\t\tnextVectors.push(vector);\n\t\t\t\t}\n\t\t\t\tnextFileMap[file.relPath] = {\n\t\t\t\t\tpath: file.relPath,\n\t\t\t\t\tsize: file.size,\n\t\t\t\t\tmtimeMs: file.mtimeMs,\n\t\t\t\t\thash: file.hash,\n\t\t\t\t\tchunks: [...prev.chunks],\n\t\t\t\t};\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (prev) changedFiles += 1;\n\t\t\telse newFiles += 1;\n\n\t\t\tconst drafts = chunkTextForSemantic(file.text, config.index);\n\t\t\tconst chunkRecords = drafts.map((draft, index) => {\n\t\t\t\tconst id = chunkId(file.relPath, draft, index);\n\t\t\t\treturn {\n\t\t\t\t\tid,\n\t\t\t\t\tpath: file.relPath,\n\t\t\t\t\tlineStart: draft.lineStart,\n\t\t\t\t\tlineEnd: draft.lineEnd,\n\t\t\t\t\tpreview: draft.preview,\n\t\t\t\t\thash: draft.hash,\n\t\t\t\t\ttext: draft.text,\n\t\t\t\t};\n\t\t\t});\n\t\t\tconst chunkIds = chunkRecords.map((chunk) => chunk.id);\n\t\t\tnextFileMap[file.relPath] = {\n\t\t\t\tpath: file.relPath,\n\t\t\t\tsize: file.size,\n\t\t\t\tmtimeMs: file.mtimeMs,\n\t\t\t\thash: file.hash,\n\t\t\t\tchunks: chunkIds,\n\t\t\t};\n\n\t\t\tif (chunkRecords.length === 0) continue;\n\t\t\tconst embeddings = await provider.embed(chunkRecords.map((chunk) => chunk.text));\n\t\t\tif (embeddings.length !== chunkRecords.length) {\n\t\t\t\tthrow new Error(`Embedding provider returned ${embeddings.length} vectors for ${chunkRecords.length} chunks.`);\n\t\t\t}\n\n\t\t\tfor (let index = 0; index < chunkRecords.length; index++) {\n\t\t\t\tconst chunk = chunkRecords[index]!;\n\t\t\t\tconst vector = embeddings[index]!;\n\t\t\t\tif (!Array.isArray(vector) || vector.length === 0) {\n\t\t\t\t\tthrow new Error(\"Embedding provider returned an empty vector.\");\n\t\t\t\t}\n\t\t\t\tif (dimension === undefined || dimension <= 0) {\n\t\t\t\t\tdimension = vector.length;\n\t\t\t\t} else if (dimension !== vector.length) {\n\t\t\t\t\tthrow new SemanticRebuildRequiredError(\n\t\t\t\t\t\t`Embedding dimension mismatch (${vector.length} != ${dimension}). Run /semantic rebuild.`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tnextChunks.push({\n\t\t\t\t\tid: chunk.id,\n\t\t\t\t\tpath: chunk.path,\n\t\t\t\t\tlineStart: chunk.lineStart,\n\t\t\t\t\tlineEnd: chunk.lineEnd,\n\t\t\t\t\tpreview: chunk.preview,\n\t\t\t\t\thash: chunk.hash,\n\t\t\t\t});\n\t\t\t\tnextVectors.push({\n\t\t\t\t\tid: chunk.id,\n\t\t\t\t\tvector,\n\t\t\t\t\tnorm: vectorNorm(vector),\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tconst builtAt = new Date().toISOString();\n\t\tconst meta: SemanticIndexMeta = {\n\t\t\tversion: 1,\n\t\t\tcwd: this.cwd,\n\t\t\tprojectHash: getSemanticProjectHash(this.cwd),\n\t\t\tproviderFingerprint,\n\t\t\tproviderType: config.provider.type,\n\t\t\tmodel: config.provider.model,\n\t\t\tdimension: dimension ?? 0,\n\t\t\tbuiltAt,\n\t\t\tchunkConfigFingerprint: chunkFingerprint,\n\t\t\tindexFilterFingerprint: filterFingerprint,\n\t\t\tfileMap: nextFileMap,\n\t\t};\n\t\twriteSemanticIndex(indexDir, meta, nextChunks, nextVectors);\n\n\t\treturn {\n\t\t\taction: forceRebuild ? \"rebuild\" : \"index\",\n\t\t\tindexPath: indexDir,\n\t\t\tdurationMs: Date.now() - startedAt,\n\t\t\tprocessedFiles: files.length,\n\t\t\tnewFiles,\n\t\t\tchangedFiles,\n\t\t\tremovedFiles,\n\t\t\treusedFiles,\n\t\t\tchunks: nextChunks.length,\n\t\t\tdimension: meta.dimension,\n\t\t\tbuiltAt,\n\t\t};\n\t}\n}\n"]}
@@ -21,12 +21,14 @@ export interface SemanticIndexConfig {
21
21
  }
22
22
  export interface SemanticSearchConfig {
23
23
  enabled: boolean;
24
+ autoIndex: boolean;
24
25
  provider: SemanticProviderConfig;
25
26
  index: SemanticIndexConfig;
26
27
  }
27
28
  export interface SemanticConfigFile {
28
29
  semanticSearch?: Partial<{
29
30
  enabled: boolean;
31
+ autoIndex: boolean;
30
32
  provider: Partial<{
31
33
  type: SemanticProviderType;
32
34
  model: string;
@@ -110,6 +112,7 @@ export interface SemanticStatusResult {
110
112
  action: "status";
111
113
  configured: boolean;
112
114
  enabled: boolean;
115
+ autoIndex: boolean;
113
116
  indexed: boolean;
114
117
  stale: boolean;
115
118
  staleReason?: SemanticStaleReason;
@@ -148,4 +151,7 @@ export declare class SemanticConfigMissingError extends Error {
148
151
  export declare class SemanticRebuildRequiredError extends Error {
149
152
  constructor(message: string);
150
153
  }
154
+ export declare class SemanticIndexRequiredError extends Error {
155
+ constructor(message: string);
156
+ }
151
157
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/semantic/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/semantic/types.ts"],"names":[],"mappings":"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"}
@@ -14,4 +14,10 @@ export class SemanticRebuildRequiredError extends Error {
14
14
  this.name = "SemanticRebuildRequiredError";
15
15
  }
16
16
  }
17
+ export class SemanticIndexRequiredError extends Error {
18
+ constructor(message) {
19
+ super(message);
20
+ this.name = "SemanticIndexRequiredError";
21
+ }
22
+ }
17
23
  //# sourceMappingURL=types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/core/semantic/types.ts"],"names":[],"mappings":"AAsKA,MAAM,OAAO,mBAAoB,SAAQ,KAAK;CAAG;AAEjD,MAAM,OAAO,0BAA2B,SAAQ,KAAK;IAIpD,YAAY,cAAsB,EAAE,iBAAyB;QAC5D,KAAK,CACJ,8EAA8E,cAAc,cAAc,iBAAiB,aAAa,CACxI,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,4BAA4B,CAAC;QACzC,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACrC,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;IAC5C,CAAC;CACD;AAED,MAAM,OAAO,4BAA6B,SAAQ,KAAK;IACtD,YAAY,OAAe;QAC1B,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,8BAA8B,CAAC;IAC5C,CAAC;CACD","sourcesContent":["export type SemanticScope = \"user\" | \"project\";\nexport type SemanticProviderType = \"openrouter\" | \"ollama\" | \"custom_openai\";\nexport type SemanticAction = \"status\" | \"index\" | \"rebuild\" | \"query\";\nexport type SemanticStaleReason =\n\t| \"missing_index\"\n\t| \"provider_changed\"\n\t| \"chunking_changed\"\n\t| \"index_filters_changed\"\n\t| \"files_changed\"\n\t| \"dimension_mismatch\";\n\nexport interface SemanticProviderConfig {\n\ttype: SemanticProviderType;\n\tmodel: string;\n\tbaseUrl?: string;\n\tapiKeyEnv?: string;\n\theaders?: Record<string, string>;\n\tbatchSize: number;\n\ttimeoutMs: number;\n}\n\nexport interface SemanticIndexConfig {\n\tincludeGlobs: string[];\n\texcludeGlobs: string[];\n\tchunkMaxChars: number;\n\tchunkOverlapChars: number;\n\tmaxFileBytes: number;\n\tmaxFiles: number;\n}\n\nexport interface SemanticSearchConfig {\n\tenabled: boolean;\n\tprovider: SemanticProviderConfig;\n\tindex: SemanticIndexConfig;\n}\n\nexport interface SemanticConfigFile {\n\tsemanticSearch?: Partial<{\n\t\tenabled: boolean;\n\t\tprovider: Partial<{\n\t\t\ttype: SemanticProviderType;\n\t\t\tmodel: string;\n\t\t\tbaseUrl: string;\n\t\t\tapiKeyEnv: string;\n\t\t\theaders: Record<string, string>;\n\t\t\tbatchSize: number;\n\t\t\ttimeoutMs: number;\n\t\t}>;\n\t\tindex: Partial<{\n\t\t\tincludeGlobs: string[];\n\t\t\texcludeGlobs: string[];\n\t\t\tchunkMaxChars: number;\n\t\t\tchunkOverlapChars: number;\n\t\t\tmaxFileBytes: number;\n\t\t\tmaxFiles: number;\n\t\t}>;\n\t}>;\n}\n\nexport interface SemanticScopedLoadResult {\n\tscope: SemanticScope;\n\tpath: string;\n\tfile: SemanticConfigFile;\n\terror?: Error;\n}\n\nexport interface SemanticMergedConfig {\n\tconfig?: SemanticSearchConfig;\n\terrors: string[];\n\tscoped: SemanticScopedLoadResult[];\n}\n\nexport interface SemanticFileFingerprint {\n\tpath: string;\n\tsize: number;\n\tmtimeMs: number;\n\thash: string;\n\tchunks: string[];\n}\n\nexport interface SemanticIndexMeta {\n\tversion: 1;\n\tcwd: string;\n\tprojectHash: string;\n\tproviderFingerprint: string;\n\tproviderType: SemanticProviderType;\n\tmodel: string;\n\tdimension: number;\n\tbuiltAt: string;\n\tchunkConfigFingerprint: string;\n\tindexFilterFingerprint: string;\n\tfileMap: Record<string, SemanticFileFingerprint>;\n}\n\nexport interface SemanticIndexedChunk {\n\tid: string;\n\tpath: string;\n\tlineStart: number;\n\tlineEnd: number;\n\tpreview: string;\n\thash: string;\n}\n\nexport interface SemanticIndexedVector {\n\tid: string;\n\tvector: number[];\n\tnorm: number;\n}\n\nexport interface SemanticChunkForEmbedding extends SemanticIndexedChunk {\n\ttext: string;\n}\n\nexport interface SemanticIndexOperationResult {\n\taction: \"index\" | \"rebuild\";\n\tindexPath: string;\n\tdurationMs: number;\n\tprocessedFiles: number;\n\tnewFiles: number;\n\tchangedFiles: number;\n\tremovedFiles: number;\n\treusedFiles: number;\n\tchunks: number;\n\tdimension: number;\n\tbuiltAt: string;\n}\n\nexport interface SemanticStatusResult {\n\taction: \"status\";\n\tconfigured: boolean;\n\tenabled: boolean;\n\tindexed: boolean;\n\tstale: boolean;\n\tstaleReason?: SemanticStaleReason;\n\tprovider?: SemanticProviderType;\n\tmodel?: string;\n\tfiles: number;\n\tchunks: number;\n\tdimension?: number;\n\tageSeconds?: number;\n\tindexPath: string;\n\tconfigPathUser: string;\n\tconfigPathProject: string;\n}\n\nexport interface SemanticQueryHit {\n\tscore: number;\n\tpath: string;\n\tlineStart: number;\n\tlineEnd: number;\n\tsnippet: string;\n}\n\nexport interface SemanticQueryResult {\n\taction: \"query\";\n\tquery: string;\n\ttopK: number;\n\tautoRefreshed: boolean;\n\thits: SemanticQueryHit[];\n}\n\nexport type SemanticToolResult =\n\t| SemanticStatusResult\n\t| SemanticIndexOperationResult\n\t| SemanticQueryResult;\n\nexport class SemanticConfigError extends Error {}\n\nexport class SemanticConfigMissingError extends Error {\n\treadonly userConfigPath: string;\n\treadonly projectConfigPath: string;\n\n\tconstructor(userConfigPath: string, projectConfigPath: string) {\n\t\tsuper(\n\t\t\t`Semantic search config not found. Create one with /semantic setup or write ${userConfigPath} (user) or ${projectConfigPath} (project).`,\n\t\t);\n\t\tthis.name = \"SemanticConfigMissingError\";\n\t\tthis.userConfigPath = userConfigPath;\n\t\tthis.projectConfigPath = projectConfigPath;\n\t}\n}\n\nexport class SemanticRebuildRequiredError extends Error {\n\tconstructor(message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"SemanticRebuildRequiredError\";\n\t}\n}\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/core/semantic/types.ts"],"names":[],"mappings":"AAyKA,MAAM,OAAO,mBAAoB,SAAQ,KAAK;CAAG;AAEjD,MAAM,OAAO,0BAA2B,SAAQ,KAAK;IAIpD,YAAY,cAAsB,EAAE,iBAAyB;QAC5D,KAAK,CACJ,8EAA8E,cAAc,cAAc,iBAAiB,aAAa,CACxI,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,4BAA4B,CAAC;QACzC,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACrC,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;IAC5C,CAAC;CACD;AAED,MAAM,OAAO,4BAA6B,SAAQ,KAAK;IACtD,YAAY,OAAe;QAC1B,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,8BAA8B,CAAC;IAC5C,CAAC;CACD;AAED,MAAM,OAAO,0BAA2B,SAAQ,KAAK;IACpD,YAAY,OAAe;QAC1B,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,4BAA4B,CAAC;IAC1C,CAAC;CACD","sourcesContent":["export type SemanticScope = \"user\" | \"project\";\nexport type SemanticProviderType = \"openrouter\" | \"ollama\" | \"custom_openai\";\nexport type SemanticAction = \"status\" | \"index\" | \"rebuild\" | \"query\";\nexport type SemanticStaleReason =\n\t| \"missing_index\"\n\t| \"provider_changed\"\n\t| \"chunking_changed\"\n\t| \"index_filters_changed\"\n\t| \"files_changed\"\n\t| \"dimension_mismatch\";\n\nexport interface SemanticProviderConfig {\n\ttype: SemanticProviderType;\n\tmodel: string;\n\tbaseUrl?: string;\n\tapiKeyEnv?: string;\n\theaders?: Record<string, string>;\n\tbatchSize: number;\n\ttimeoutMs: number;\n}\n\nexport interface SemanticIndexConfig {\n\tincludeGlobs: string[];\n\texcludeGlobs: string[];\n\tchunkMaxChars: number;\n\tchunkOverlapChars: number;\n\tmaxFileBytes: number;\n\tmaxFiles: number;\n}\n\nexport interface SemanticSearchConfig {\n\tenabled: boolean;\n\tautoIndex: boolean;\n\tprovider: SemanticProviderConfig;\n\tindex: SemanticIndexConfig;\n}\n\nexport interface SemanticConfigFile {\n\tsemanticSearch?: Partial<{\n\t\tenabled: boolean;\n\t\tautoIndex: boolean;\n\t\tprovider: Partial<{\n\t\t\ttype: SemanticProviderType;\n\t\t\tmodel: string;\n\t\t\tbaseUrl: string;\n\t\t\tapiKeyEnv: string;\n\t\t\theaders: Record<string, string>;\n\t\t\tbatchSize: number;\n\t\t\ttimeoutMs: number;\n\t\t}>;\n\t\tindex: Partial<{\n\t\t\tincludeGlobs: string[];\n\t\t\texcludeGlobs: string[];\n\t\t\tchunkMaxChars: number;\n\t\t\tchunkOverlapChars: number;\n\t\t\tmaxFileBytes: number;\n\t\t\tmaxFiles: number;\n\t\t}>;\n\t}>;\n}\n\nexport interface SemanticScopedLoadResult {\n\tscope: SemanticScope;\n\tpath: string;\n\tfile: SemanticConfigFile;\n\terror?: Error;\n}\n\nexport interface SemanticMergedConfig {\n\tconfig?: SemanticSearchConfig;\n\terrors: string[];\n\tscoped: SemanticScopedLoadResult[];\n}\n\nexport interface SemanticFileFingerprint {\n\tpath: string;\n\tsize: number;\n\tmtimeMs: number;\n\thash: string;\n\tchunks: string[];\n}\n\nexport interface SemanticIndexMeta {\n\tversion: 1;\n\tcwd: string;\n\tprojectHash: string;\n\tproviderFingerprint: string;\n\tproviderType: SemanticProviderType;\n\tmodel: string;\n\tdimension: number;\n\tbuiltAt: string;\n\tchunkConfigFingerprint: string;\n\tindexFilterFingerprint: string;\n\tfileMap: Record<string, SemanticFileFingerprint>;\n}\n\nexport interface SemanticIndexedChunk {\n\tid: string;\n\tpath: string;\n\tlineStart: number;\n\tlineEnd: number;\n\tpreview: string;\n\thash: string;\n}\n\nexport interface SemanticIndexedVector {\n\tid: string;\n\tvector: number[];\n\tnorm: number;\n}\n\nexport interface SemanticChunkForEmbedding extends SemanticIndexedChunk {\n\ttext: string;\n}\n\nexport interface SemanticIndexOperationResult {\n\taction: \"index\" | \"rebuild\";\n\tindexPath: string;\n\tdurationMs: number;\n\tprocessedFiles: number;\n\tnewFiles: number;\n\tchangedFiles: number;\n\tremovedFiles: number;\n\treusedFiles: number;\n\tchunks: number;\n\tdimension: number;\n\tbuiltAt: string;\n}\n\nexport interface SemanticStatusResult {\n\taction: \"status\";\n\tconfigured: boolean;\n\tenabled: boolean;\n\tautoIndex: boolean;\n\tindexed: boolean;\n\tstale: boolean;\n\tstaleReason?: SemanticStaleReason;\n\tprovider?: SemanticProviderType;\n\tmodel?: string;\n\tfiles: number;\n\tchunks: number;\n\tdimension?: number;\n\tageSeconds?: number;\n\tindexPath: string;\n\tconfigPathUser: string;\n\tconfigPathProject: string;\n}\n\nexport interface SemanticQueryHit {\n\tscore: number;\n\tpath: string;\n\tlineStart: number;\n\tlineEnd: number;\n\tsnippet: string;\n}\n\nexport interface SemanticQueryResult {\n\taction: \"query\";\n\tquery: string;\n\ttopK: number;\n\tautoRefreshed: boolean;\n\thits: SemanticQueryHit[];\n}\n\nexport type SemanticToolResult =\n\t| SemanticStatusResult\n\t| SemanticIndexOperationResult\n\t| SemanticQueryResult;\n\nexport class SemanticConfigError extends Error {}\n\nexport class SemanticConfigMissingError extends Error {\n\treadonly userConfigPath: string;\n\treadonly projectConfigPath: string;\n\n\tconstructor(userConfigPath: string, projectConfigPath: string) {\n\t\tsuper(\n\t\t\t`Semantic search config not found. Create one with /semantic setup or write ${userConfigPath} (user) or ${projectConfigPath} (project).`,\n\t\t);\n\t\tthis.name = \"SemanticConfigMissingError\";\n\t\tthis.userConfigPath = userConfigPath;\n\t\tthis.projectConfigPath = projectConfigPath;\n\t}\n}\n\nexport class SemanticRebuildRequiredError extends Error {\n\tconstructor(message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"SemanticRebuildRequiredError\";\n\t}\n}\n\nexport class SemanticIndexRequiredError extends Error {\n\tconstructor(message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"SemanticIndexRequiredError\";\n\t}\n}\n"]}
@@ -0,0 +1,30 @@
1
+ export interface ShadowGuardOptions {
2
+ getActiveTools: () => string[];
3
+ getAllTools: () => string[];
4
+ setActiveTools: (toolNames: string[]) => void;
5
+ }
6
+ export interface ShadowGuardState {
7
+ enabled: boolean;
8
+ strict: boolean;
9
+ blockedTools: string[];
10
+ }
11
+ export declare class ShadowGuard {
12
+ private readonly getActiveTools;
13
+ private readonly getAllTools;
14
+ private readonly setActiveTools;
15
+ private enabled;
16
+ private strict;
17
+ private restoreToolNames;
18
+ constructor(options: ShadowGuardOptions);
19
+ getState(): ShadowGuardState;
20
+ isEnabled(): boolean;
21
+ getRestoreToolNames(): string[];
22
+ setRestoreToolNames(toolNames: string[]): void;
23
+ enable(): ShadowGuardState;
24
+ disable(): ShadowGuardState;
25
+ reset(): void;
26
+ enforceReadOnlyToolsIfEnabled(): void;
27
+ shouldDenyTool(toolName: string): boolean;
28
+ private applyReadOnlyTools;
29
+ }
30
+ //# sourceMappingURL=shadow-guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shadow-guard.d.ts","sourceRoot":"","sources":["../../src/core/shadow-guard.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,kBAAkB;IAClC,cAAc,EAAE,MAAM,MAAM,EAAE,CAAC;IAC/B,WAAW,EAAE,MAAM,MAAM,EAAE,CAAC;IAC5B,cAAc,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;CAC9C;AAED,MAAM,WAAW,gBAAgB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,YAAY,EAAE,MAAM,EAAE,CAAC;CACvB;AAaD,qBAAa,WAAW;IACvB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAiB;IAC7C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAgC;IAC/D,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,gBAAgB,CAAgB;gBAE5B,OAAO,EAAE,kBAAkB;IAMvC,QAAQ,IAAI,gBAAgB;IAQ5B,SAAS,IAAI,OAAO;IAIpB,mBAAmB,IAAI,MAAM,EAAE;IAI/B,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,IAAI;IAI9C,MAAM,IAAI,gBAAgB;IAS1B,OAAO,IAAI,gBAAgB;IAa3B,KAAK,IAAI,IAAI;IAKb,6BAA6B,IAAI,IAAI;IAKrC,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIzC,OAAO,CAAC,kBAAkB;CAS1B"}
@@ -0,0 +1,81 @@
1
+ import { readOnlyTools } from "./tools/index.js";
2
+ const SHADOW_MUTATING_TOOLS = new Set(["edit", "write", "bash", "task"]);
3
+ const SHADOW_SAFE_ADDITIONAL_TOOLS = new Set(["todo_read", "ask_user"]);
4
+ function uniqueTools(names) {
5
+ const seen = new Set();
6
+ const result = [];
7
+ for (const name of names) {
8
+ if (!name || seen.has(name))
9
+ continue;
10
+ seen.add(name);
11
+ result.push(name);
12
+ }
13
+ return result;
14
+ }
15
+ export class ShadowGuard {
16
+ constructor(options) {
17
+ this.enabled = false;
18
+ this.strict = true;
19
+ this.restoreToolNames = [];
20
+ this.getActiveTools = options.getActiveTools;
21
+ this.getAllTools = options.getAllTools;
22
+ this.setActiveTools = options.setActiveTools;
23
+ }
24
+ getState() {
25
+ return {
26
+ enabled: this.enabled,
27
+ strict: this.strict,
28
+ blockedTools: [...SHADOW_MUTATING_TOOLS],
29
+ };
30
+ }
31
+ isEnabled() {
32
+ return this.enabled;
33
+ }
34
+ getRestoreToolNames() {
35
+ return [...this.restoreToolNames];
36
+ }
37
+ setRestoreToolNames(toolNames) {
38
+ this.restoreToolNames = uniqueTools(toolNames);
39
+ }
40
+ enable() {
41
+ if (!this.enabled) {
42
+ this.restoreToolNames = uniqueTools(this.getActiveTools());
43
+ this.enabled = true;
44
+ }
45
+ this.applyReadOnlyTools();
46
+ return this.getState();
47
+ }
48
+ disable() {
49
+ if (!this.enabled) {
50
+ return this.getState();
51
+ }
52
+ const restore = uniqueTools(this.restoreToolNames);
53
+ if (restore.length > 0) {
54
+ this.setActiveTools(restore);
55
+ }
56
+ this.enabled = false;
57
+ return this.getState();
58
+ }
59
+ reset() {
60
+ this.enabled = false;
61
+ this.restoreToolNames = [];
62
+ }
63
+ enforceReadOnlyToolsIfEnabled() {
64
+ if (!this.enabled)
65
+ return;
66
+ this.applyReadOnlyTools();
67
+ }
68
+ shouldDenyTool(toolName) {
69
+ return this.enabled && this.strict && SHADOW_MUTATING_TOOLS.has(toolName);
70
+ }
71
+ applyReadOnlyTools() {
72
+ const availableTools = new Set(this.getAllTools());
73
+ const whitelist = new Set([
74
+ ...readOnlyTools.map((tool) => tool.name),
75
+ ...SHADOW_SAFE_ADDITIONAL_TOOLS,
76
+ ]);
77
+ const nextActive = [...availableTools].filter((toolName) => whitelist.has(toolName));
78
+ this.setActiveTools(uniqueTools(nextActive));
79
+ }
80
+ }
81
+ //# sourceMappingURL=shadow-guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shadow-guard.js","sourceRoot":"","sources":["../../src/core/shadow-guard.ts"],"names":[],"mappings":"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","sourcesContent":["import { readOnlyTools } from \"./tools/index.js\";\n\nconst SHADOW_MUTATING_TOOLS = new Set([\"edit\", \"write\", \"bash\", \"task\"]);\nconst SHADOW_SAFE_ADDITIONAL_TOOLS = new Set([\"todo_read\", \"ask_user\"]);\n\nexport interface ShadowGuardOptions {\n\tgetActiveTools: () => string[];\n\tgetAllTools: () => string[];\n\tsetActiveTools: (toolNames: string[]) => void;\n}\n\nexport interface ShadowGuardState {\n\tenabled: boolean;\n\tstrict: boolean;\n\tblockedTools: string[];\n}\n\nfunction uniqueTools(names: string[]): string[] {\n\tconst seen = new Set<string>();\n\tconst result: string[] = [];\n\tfor (const name of names) {\n\t\tif (!name || seen.has(name)) continue;\n\t\tseen.add(name);\n\t\tresult.push(name);\n\t}\n\treturn result;\n}\n\nexport class ShadowGuard {\n\tprivate readonly getActiveTools: () => string[];\n\tprivate readonly getAllTools: () => string[];\n\tprivate readonly setActiveTools: (toolNames: string[]) => void;\n\tprivate enabled = false;\n\tprivate strict = true;\n\tprivate restoreToolNames: string[] = [];\n\n\tconstructor(options: ShadowGuardOptions) {\n\t\tthis.getActiveTools = options.getActiveTools;\n\t\tthis.getAllTools = options.getAllTools;\n\t\tthis.setActiveTools = options.setActiveTools;\n\t}\n\n\tgetState(): ShadowGuardState {\n\t\treturn {\n\t\t\tenabled: this.enabled,\n\t\t\tstrict: this.strict,\n\t\t\tblockedTools: [...SHADOW_MUTATING_TOOLS],\n\t\t};\n\t}\n\n\tisEnabled(): boolean {\n\t\treturn this.enabled;\n\t}\n\n\tgetRestoreToolNames(): string[] {\n\t\treturn [...this.restoreToolNames];\n\t}\n\n\tsetRestoreToolNames(toolNames: string[]): void {\n\t\tthis.restoreToolNames = uniqueTools(toolNames);\n\t}\n\n\tenable(): ShadowGuardState {\n\t\tif (!this.enabled) {\n\t\t\tthis.restoreToolNames = uniqueTools(this.getActiveTools());\n\t\t\tthis.enabled = true;\n\t\t}\n\t\tthis.applyReadOnlyTools();\n\t\treturn this.getState();\n\t}\n\n\tdisable(): ShadowGuardState {\n\t\tif (!this.enabled) {\n\t\t\treturn this.getState();\n\t\t}\n\n\t\tconst restore = uniqueTools(this.restoreToolNames);\n\t\tif (restore.length > 0) {\n\t\t\tthis.setActiveTools(restore);\n\t\t}\n\t\tthis.enabled = false;\n\t\treturn this.getState();\n\t}\n\n\treset(): void {\n\t\tthis.enabled = false;\n\t\tthis.restoreToolNames = [];\n\t}\n\n\tenforceReadOnlyToolsIfEnabled(): void {\n\t\tif (!this.enabled) return;\n\t\tthis.applyReadOnlyTools();\n\t}\n\n\tshouldDenyTool(toolName: string): boolean {\n\t\treturn this.enabled && this.strict && SHADOW_MUTATING_TOOLS.has(toolName);\n\t}\n\n\tprivate applyReadOnlyTools(): void {\n\t\tconst availableTools = new Set(this.getAllTools());\n\t\tconst whitelist = new Set<string>([\n\t\t\t...readOnlyTools.map((tool) => tool.name),\n\t\t\t...SHADOW_SAFE_ADDITIONAL_TOOLS,\n\t\t]);\n\t\tconst nextActive = [...availableTools].filter((toolName) => whitelist.has(toolName));\n\t\tthis.setActiveTools(uniqueTools(nextActive));\n\t}\n}\n"]}