{"version":3,"sources":["../node_modules/eventemitter3/index.js","../node_modules/ignore/index.js","../src/pi-extension.ts","../src/config/constants.ts","../src/config/defaults.ts","../src/config/env-substitution.ts","../src/config/validators.ts","../src/config/schema.ts","../src/embeddings/detector.ts","../src/utils/cost.ts","../src/tools/format-pr-impact.ts","../src/tools/operations.ts","../src/config/merger.ts","../src/config/paths.ts","../src/git/index.ts","../src/git/refs.ts","../src/config/rebase.ts","../src/utils/paths.ts","../src/indexer/index.ts","../node_modules/eventemitter3/index.mjs","../node_modules/p-timeout/index.js","../node_modules/p-queue/dist/lower-bound.js","../node_modules/p-queue/dist/priority-queue.js","../node_modules/p-queue/dist/index.js","../node_modules/is-network-error/index.js","../node_modules/p-retry/index.js","../src/embeddings/provider-types.ts","../src/utils/url-validation.ts","../src/embeddings/providers/custom.ts","../src/embeddings/providers/github-copilot.ts","../src/embeddings/providers/google.ts","../src/embeddings/providers/ollama.ts","../src/embeddings/providers/openai.ts","../src/embeddings/provider.ts","../src/rerank/index.ts","../src/utils/files.ts","../src/utils/logger.ts","../src/native/index.ts","../src/tools/changed-files.ts","../src/tools/knowledge-base-paths.ts","../src/tools/utils.ts","../src/tools/config-state.ts"],"sourcesContent":["'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n  , prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n  Events.prototype = Object.create(null);\n\n  //\n  // This hack is needed because the `__proto__` property is still inherited in\n  // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n  //\n  if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @private\n */\nfunction EE(fn, context, once) {\n  this.fn = fn;\n  this.context = context;\n  this.once = once || false;\n}\n\n/**\n * Add a listener for a given event.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} once Specify if the listener is a one-time listener.\n * @returns {EventEmitter}\n * @private\n */\nfunction addListener(emitter, event, fn, context, once) {\n  if (typeof fn !== 'function') {\n    throw new TypeError('The listener must be a function');\n  }\n\n  var listener = new EE(fn, context || emitter, once)\n    , evt = prefix ? prefix + event : event;\n\n  if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;\n  else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);\n  else emitter._events[evt] = [emitter._events[evt], listener];\n\n  return emitter;\n}\n\n/**\n * Clear event by name.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} evt The Event name.\n * @private\n */\nfunction clearEvent(emitter, evt) {\n  if (--emitter._eventsCount === 0) emitter._events = new Events();\n  else delete emitter._events[evt];\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @public\n */\nfunction EventEmitter() {\n  this._events = new Events();\n  this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n  var names = []\n    , events\n    , name;\n\n  if (this._eventsCount === 0) return names;\n\n  for (name in (events = this._events)) {\n    if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n  }\n\n  if (Object.getOwnPropertySymbols) {\n    return names.concat(Object.getOwnPropertySymbols(events));\n  }\n\n  return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Array} The registered listeners.\n * @public\n */\nEventEmitter.prototype.listeners = function listeners(event) {\n  var evt = prefix ? prefix + event : event\n    , handlers = this._events[evt];\n\n  if (!handlers) return [];\n  if (handlers.fn) return [handlers.fn];\n\n  for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {\n    ee[i] = handlers[i].fn;\n  }\n\n  return ee;\n};\n\n/**\n * Return the number of listeners listening to a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Number} The number of listeners.\n * @public\n */\nEventEmitter.prototype.listenerCount = function listenerCount(event) {\n  var evt = prefix ? prefix + event : event\n    , listeners = this._events[evt];\n\n  if (!listeners) return 0;\n  if (listeners.fn) return 1;\n  return listeners.length;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n  var evt = prefix ? prefix + event : event;\n\n  if (!this._events[evt]) return false;\n\n  var listeners = this._events[evt]\n    , len = arguments.length\n    , args\n    , i;\n\n  if (listeners.fn) {\n    if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n    switch (len) {\n      case 1: return listeners.fn.call(listeners.context), true;\n      case 2: return listeners.fn.call(listeners.context, a1), true;\n      case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n      case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n      case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n      case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n    }\n\n    for (i = 1, args = new Array(len -1); i < len; i++) {\n      args[i - 1] = arguments[i];\n    }\n\n    listeners.fn.apply(listeners.context, args);\n  } else {\n    var length = listeners.length\n      , j;\n\n    for (i = 0; i < length; i++) {\n      if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n      switch (len) {\n        case 1: listeners[i].fn.call(listeners[i].context); break;\n        case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n        case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n        case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n        default:\n          if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n            args[j - 1] = arguments[j];\n          }\n\n          listeners[i].fn.apply(listeners[i].context, args);\n      }\n    }\n  }\n\n  return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n  return addListener(this, event, fn, context, false);\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n  return addListener(this, event, fn, context, true);\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {*} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n  var evt = prefix ? prefix + event : event;\n\n  if (!this._events[evt]) return this;\n  if (!fn) {\n    clearEvent(this, evt);\n    return this;\n  }\n\n  var listeners = this._events[evt];\n\n  if (listeners.fn) {\n    if (\n      listeners.fn === fn &&\n      (!once || listeners.once) &&\n      (!context || listeners.context === context)\n    ) {\n      clearEvent(this, evt);\n    }\n  } else {\n    for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n      if (\n        listeners[i].fn !== fn ||\n        (once && !listeners[i].once) ||\n        (context && listeners[i].context !== context)\n      ) {\n        events.push(listeners[i]);\n      }\n    }\n\n    //\n    // Reset the array, or remove it completely if we have no more listeners.\n    //\n    if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n    else clearEvent(this, evt);\n  }\n\n  return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {(String|Symbol)} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n  var evt;\n\n  if (event) {\n    evt = prefix ? prefix + event : event;\n    if (this._events[evt]) clearEvent(this, evt);\n  } else {\n    this._events = new Events();\n    this._eventsCount = 0;\n  }\n\n  return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n  module.exports = EventEmitter;\n}\n","// A simple implementation of make-array\nfunction makeArray (subject) {\n  return Array.isArray(subject)\n    ? subject\n    : [subject]\n}\n\nconst UNDEFINED = undefined\nconst EMPTY = ''\nconst SPACE = ' '\nconst ESCAPE = '\\\\'\nconst REGEX_TEST_BLANK_LINE = /^\\s+$/\nconst REGEX_INVALID_TRAILING_BACKSLASH = /(?:[^\\\\]|^)\\\\$/\nconst REGEX_REPLACE_LEADING_EXCAPED_EXCLAMATION = /^\\\\!/\nconst REGEX_REPLACE_LEADING_EXCAPED_HASH = /^\\\\#/\nconst REGEX_SPLITALL_CRLF = /\\r?\\n/g\n\n// Invalid:\n// - /foo,\n// - ./foo,\n// - ../foo,\n// - .\n// - ..\n// Valid:\n// - .foo\nconst REGEX_TEST_INVALID_PATH = /^\\.{0,2}\\/|^\\.{1,2}$/\n\nconst REGEX_TEST_TRAILING_SLASH = /\\/$/\n\nconst SLASH = '/'\n\n// Do not use ternary expression here, since \"istanbul ignore next\" is buggy\nlet TMP_KEY_IGNORE = 'node-ignore'\n/* istanbul ignore else */\nif (typeof Symbol !== 'undefined') {\n  TMP_KEY_IGNORE = Symbol.for('node-ignore')\n}\nconst KEY_IGNORE = TMP_KEY_IGNORE\n\nconst define = (object, key, value) => {\n  Object.defineProperty(object, key, {value})\n  return value\n}\n\nconst REGEX_REGEXP_RANGE = /([0-z])-([0-z])/g\n\nconst RETURN_FALSE = () => false\n\n// Sanitize the range of a regular expression\n// The cases are complicated, see test cases for details\nconst sanitizeRange = range => range.replace(\n  REGEX_REGEXP_RANGE,\n  (match, from, to) => from.charCodeAt(0) <= to.charCodeAt(0)\n    ? match\n    // Invalid range (out of order) which is ok for gitignore rules but\n    //   fatal for JavaScript regular expression, so eliminate it.\n    : EMPTY\n)\n\n// See fixtures #59\nconst cleanRangeBackSlash = slashes => {\n  const {length} = slashes\n  return slashes.slice(0, length - length % 2)\n}\n\n// > If the pattern ends with a slash,\n// > it is removed for the purpose of the following description,\n// > but it would only find a match with a directory.\n// > In other words, foo/ will match a directory foo and paths underneath it,\n// > but will not match a regular file or a symbolic link foo\n// >  (this is consistent with the way how pathspec works in general in Git).\n// '`foo/`' will not match regular file '`foo`' or symbolic link '`foo`'\n// -> ignore-rules will not deal with it, because it costs extra `fs.stat` call\n//      you could use option `mark: true` with `glob`\n\n// '`foo/`' should not continue with the '`..`'\nconst REPLACERS = [\n\n  [\n    // Remove BOM\n    // TODO:\n    // Other similar zero-width characters?\n    /^\\uFEFF/,\n    () => EMPTY\n  ],\n\n  // > Trailing spaces are ignored unless they are quoted with backslash (\"\\\")\n  [\n    // (a\\ ) -> (a )\n    // (a  ) -> (a)\n    // (a ) -> (a)\n    // (a \\ ) -> (a  )\n    /((?:\\\\\\\\)*?)(\\\\?\\s+)$/,\n    (_, m1, m2) => m1 + (\n      m2.indexOf('\\\\') === 0\n        ? SPACE\n        : EMPTY\n    )\n  ],\n\n  // Replace (\\ ) with ' '\n  // (\\ ) -> ' '\n  // (\\\\ ) -> '\\\\ '\n  // (\\\\\\ ) -> '\\\\ '\n  [\n    /(\\\\+?)\\s/g,\n    (_, m1) => {\n      const {length} = m1\n      return m1.slice(0, length - length % 2) + SPACE\n    }\n  ],\n\n  // Escape metacharacters\n  // which is written down by users but means special for regular expressions.\n\n  // > There are 12 characters with special meanings:\n  // > - the backslash \\,\n  // > - the caret ^,\n  // > - the dollar sign $,\n  // > - the period or dot .,\n  // > - the vertical bar or pipe symbol |,\n  // > - the question mark ?,\n  // > - the asterisk or star *,\n  // > - the plus sign +,\n  // > - the opening parenthesis (,\n  // > - the closing parenthesis ),\n  // > - and the opening square bracket [,\n  // > - the opening curly brace {,\n  // > These special characters are often called \"metacharacters\".\n  [\n    /[\\\\$.|*+(){^]/g,\n    match => `\\\\${match}`\n  ],\n\n  [\n    // > a question mark (?) matches a single character\n    /(?!\\\\)\\?/g,\n    () => '[^/]'\n  ],\n\n  // leading slash\n  [\n\n    // > A leading slash matches the beginning of the pathname.\n    // > For example, \"/*.c\" matches \"cat-file.c\" but not \"mozilla-sha1/sha1.c\".\n    // A leading slash matches the beginning of the pathname\n    /^\\//,\n    () => '^'\n  ],\n\n  // replace special metacharacter slash after the leading slash\n  [\n    /\\//g,\n    () => '\\\\/'\n  ],\n\n  [\n    // > A leading \"**\" followed by a slash means match in all directories.\n    // > For example, \"**/foo\" matches file or directory \"foo\" anywhere,\n    // > the same as pattern \"foo\".\n    // > \"**/foo/bar\" matches file or directory \"bar\" anywhere that is directly\n    // >   under directory \"foo\".\n    // Notice that the '*'s have been replaced as '\\\\*'\n    /^\\^*\\\\\\*\\\\\\*\\\\\\//,\n\n    // '**/foo' <-> 'foo'\n    () => '^(?:.*\\\\/)?'\n  ],\n\n  // starting\n  [\n    // there will be no leading '/'\n    //   (which has been replaced by section \"leading slash\")\n    // If starts with '**', adding a '^' to the regular expression also works\n    /^(?=[^^])/,\n    function startingReplacer () {\n      // If has a slash `/` at the beginning or middle\n      return !/\\/(?!$)/.test(this)\n        // > Prior to 2.22.1\n        // > If the pattern does not contain a slash /,\n        // >   Git treats it as a shell glob pattern\n        // Actually, if there is only a trailing slash,\n        //   git also treats it as a shell glob pattern\n\n        // After 2.22.1 (compatible but clearer)\n        // > If there is a separator at the beginning or middle (or both)\n        // > of the pattern, then the pattern is relative to the directory\n        // > level of the particular .gitignore file itself.\n        // > Otherwise the pattern may also match at any level below\n        // > the .gitignore level.\n        ? '(?:^|\\\\/)'\n\n        // > Otherwise, Git treats the pattern as a shell glob suitable for\n        // >   consumption by fnmatch(3)\n        : '^'\n    }\n  ],\n\n  // two globstars\n  [\n    // Use lookahead assertions so that we could match more than one `'/**'`\n    /\\\\\\/\\\\\\*\\\\\\*(?=\\\\\\/|$)/g,\n\n    // Zero, one or several directories\n    // should not use '*', or it will be replaced by the next replacer\n\n    // Check if it is not the last `'/**'`\n    (_, index, str) => index + 6 < str.length\n\n      // case: /**/\n      // > A slash followed by two consecutive asterisks then a slash matches\n      // >   zero or more directories.\n      // > For example, \"a/**/b\" matches \"a/b\", \"a/x/b\", \"a/x/y/b\" and so on.\n      // '/**/'\n      ? '(?:\\\\/[^\\\\/]+)*'\n\n      // case: /**\n      // > A trailing `\"/**\"` matches everything inside.\n\n      // #21: everything inside but it should not include the current folder\n      : '\\\\/.+'\n  ],\n\n  // normal intermediate wildcards\n  [\n    // Never replace escaped '*'\n    // ignore rule '\\*' will match the path '*'\n\n    // 'abc.*/' -> go\n    // 'abc.*'  -> skip this rule,\n    //    coz trailing single wildcard will be handed by [trailing wildcard]\n    /(^|[^\\\\]+)(\\\\\\*)+(?=.+)/g,\n\n    // '*.js' matches '.js'\n    // '*.js' doesn't match 'abc'\n    (_, p1, p2) => {\n      // 1.\n      // > An asterisk \"*\" matches anything except a slash.\n      // 2.\n      // > Other consecutive asterisks are considered regular asterisks\n      // > and will match according to the previous rules.\n      const unescaped = p2.replace(/\\\\\\*/g, '[^\\\\/]*')\n      return p1 + unescaped\n    }\n  ],\n\n  [\n    // unescape, revert step 3 except for back slash\n    // For example, if a user escape a '\\\\*',\n    // after step 3, the result will be '\\\\\\\\\\\\*'\n    /\\\\\\\\\\\\(?=[$.|*+(){^])/g,\n    () => ESCAPE\n  ],\n\n  [\n    // '\\\\\\\\' -> '\\\\'\n    /\\\\\\\\/g,\n    () => ESCAPE\n  ],\n\n  [\n    // > The range notation, e.g. [a-zA-Z],\n    // > can be used to match one of the characters in a range.\n\n    // `\\` is escaped by step 3\n    /(\\\\)?\\[([^\\]/]*?)(\\\\*)($|\\])/g,\n    (match, leadEscape, range, endEscape, close) => leadEscape === ESCAPE\n      // '\\\\[bar]' -> '\\\\\\\\[bar\\\\]'\n      ? `\\\\[${range}${cleanRangeBackSlash(endEscape)}${close}`\n      : close === ']'\n        ? endEscape.length % 2 === 0\n          // A normal case, and it is a range notation\n          // '[bar]'\n          // '[bar\\\\\\\\]'\n          ? `[${sanitizeRange(range)}${endEscape}]`\n          // Invalid range notaton\n          // '[bar\\\\]' -> '[bar\\\\\\\\]'\n          : '[]'\n        : '[]'\n  ],\n\n  // ending\n  [\n    // 'js' will not match 'js.'\n    // 'ab' will not match 'abc'\n    /(?:[^*])$/,\n\n    // WTF!\n    // https://git-scm.com/docs/gitignore\n    // changes in [2.22.1](https://git-scm.com/docs/gitignore/2.22.1)\n    // which re-fixes #24, #38\n\n    // > If there is a separator at the end of the pattern then the pattern\n    // > will only match directories, otherwise the pattern can match both\n    // > files and directories.\n\n    // 'js*' will not match 'a.js'\n    // 'js/' will not match 'a.js'\n    // 'js' will match 'a.js' and 'a.js/'\n    match => /\\/$/.test(match)\n      // foo/ will not match 'foo'\n      ? `${match}$`\n      // foo matches 'foo' and 'foo/'\n      : `${match}(?=$|\\\\/$)`\n  ]\n]\n\nconst REGEX_REPLACE_TRAILING_WILDCARD = /(^|\\\\\\/)?\\\\\\*$/\nconst MODE_IGNORE = 'regex'\nconst MODE_CHECK_IGNORE = 'checkRegex'\nconst UNDERSCORE = '_'\n\nconst TRAILING_WILD_CARD_REPLACERS = {\n  [MODE_IGNORE] (_, p1) {\n    const prefix = p1\n      // '\\^':\n      // '/*' does not match EMPTY\n      // '/*' does not match everything\n\n      // '\\\\\\/':\n      // 'abc/*' does not match 'abc/'\n      ? `${p1}[^/]+`\n\n      // 'a*' matches 'a'\n      // 'a*' matches 'aa'\n      : '[^/]*'\n\n    return `${prefix}(?=$|\\\\/$)`\n  },\n\n  [MODE_CHECK_IGNORE] (_, p1) {\n    // When doing `git check-ignore`\n    const prefix = p1\n      // '\\\\\\/':\n      // 'abc/*' DOES match 'abc/' !\n      ? `${p1}[^/]*`\n\n      // 'a*' matches 'a'\n      // 'a*' matches 'aa'\n      : '[^/]*'\n\n    return `${prefix}(?=$|\\\\/$)`\n  }\n}\n\n// @param {pattern}\nconst makeRegexPrefix = pattern => REPLACERS.reduce(\n  (prev, [matcher, replacer]) =>\n    prev.replace(matcher, replacer.bind(pattern)),\n  pattern\n)\n\nconst isString = subject => typeof subject === 'string'\n\n// > A blank line matches no files, so it can serve as a separator for readability.\nconst checkPattern = pattern => pattern\n  && isString(pattern)\n  && !REGEX_TEST_BLANK_LINE.test(pattern)\n  && !REGEX_INVALID_TRAILING_BACKSLASH.test(pattern)\n\n  // > A line starting with # serves as a comment.\n  && pattern.indexOf('#') !== 0\n\nconst splitPattern = pattern => pattern\n.split(REGEX_SPLITALL_CRLF)\n.filter(Boolean)\n\nclass IgnoreRule {\n  constructor (\n    pattern,\n    mark,\n    body,\n    ignoreCase,\n    negative,\n    prefix\n  ) {\n    this.pattern = pattern\n    this.mark = mark\n    this.negative = negative\n\n    define(this, 'body', body)\n    define(this, 'ignoreCase', ignoreCase)\n    define(this, 'regexPrefix', prefix)\n  }\n\n  get regex () {\n    const key = UNDERSCORE + MODE_IGNORE\n\n    if (this[key]) {\n      return this[key]\n    }\n\n    return this._make(MODE_IGNORE, key)\n  }\n\n  get checkRegex () {\n    const key = UNDERSCORE + MODE_CHECK_IGNORE\n\n    if (this[key]) {\n      return this[key]\n    }\n\n    return this._make(MODE_CHECK_IGNORE, key)\n  }\n\n  _make (mode, key) {\n    const str = this.regexPrefix.replace(\n      REGEX_REPLACE_TRAILING_WILDCARD,\n\n      // It does not need to bind pattern\n      TRAILING_WILD_CARD_REPLACERS[mode]\n    )\n\n    const regex = this.ignoreCase\n      ? new RegExp(str, 'i')\n      : new RegExp(str)\n\n    return define(this, key, regex)\n  }\n}\n\nconst createRule = ({\n  pattern,\n  mark\n}, ignoreCase) => {\n  let negative = false\n  let body = pattern\n\n  // > An optional prefix \"!\" which negates the pattern;\n  if (body.indexOf('!') === 0) {\n    negative = true\n    body = body.substr(1)\n  }\n\n  body = body\n  // > Put a backslash (\"\\\") in front of the first \"!\" for patterns that\n  // >   begin with a literal \"!\", for example, `\"\\!important!.txt\"`.\n  .replace(REGEX_REPLACE_LEADING_EXCAPED_EXCLAMATION, '!')\n  // > Put a backslash (\"\\\") in front of the first hash for patterns that\n  // >   begin with a hash.\n  .replace(REGEX_REPLACE_LEADING_EXCAPED_HASH, '#')\n\n  const regexPrefix = makeRegexPrefix(body)\n\n  return new IgnoreRule(\n    pattern,\n    mark,\n    body,\n    ignoreCase,\n    negative,\n    regexPrefix\n  )\n}\n\nclass RuleManager {\n  constructor (ignoreCase) {\n    this._ignoreCase = ignoreCase\n    this._rules = []\n  }\n\n  _add (pattern) {\n    // #32\n    if (pattern && pattern[KEY_IGNORE]) {\n      this._rules = this._rules.concat(pattern._rules._rules)\n      this._added = true\n      return\n    }\n\n    if (isString(pattern)) {\n      pattern = {\n        pattern\n      }\n    }\n\n    if (checkPattern(pattern.pattern)) {\n      const rule = createRule(pattern, this._ignoreCase)\n      this._added = true\n      this._rules.push(rule)\n    }\n  }\n\n  // @param {Array<string> | string | Ignore} pattern\n  add (pattern) {\n    this._added = false\n\n    makeArray(\n      isString(pattern)\n        ? splitPattern(pattern)\n        : pattern\n    ).forEach(this._add, this)\n\n    return this._added\n  }\n\n  // Test one single path without recursively checking parent directories\n  //\n  // - checkUnignored `boolean` whether should check if the path is unignored,\n  //   setting `checkUnignored` to `false` could reduce additional\n  //   path matching.\n  // - check `string` either `MODE_IGNORE` or `MODE_CHECK_IGNORE`\n\n  // @returns {TestResult} true if a file is ignored\n  test (path, checkUnignored, mode) {\n    let ignored = false\n    let unignored = false\n    let matchedRule\n\n    this._rules.forEach(rule => {\n      const {negative} = rule\n\n      //          |           ignored : unignored\n      // -------- | ---------------------------------------\n      // negative |   0:0   |   0:1   |   1:0   |   1:1\n      // -------- | ------- | ------- | ------- | --------\n      //     0    |  TEST   |  TEST   |  SKIP   |    X\n      //     1    |  TESTIF |  SKIP   |  TEST   |    X\n\n      // - SKIP: always skip\n      // - TEST: always test\n      // - TESTIF: only test if checkUnignored\n      // - X: that never happen\n      if (\n        unignored === negative && ignored !== unignored\n        || negative && !ignored && !unignored && !checkUnignored\n      ) {\n        return\n      }\n\n      const matched = rule[mode].test(path)\n\n      if (!matched) {\n        return\n      }\n\n      ignored = !negative\n      unignored = negative\n\n      matchedRule = negative\n        ? UNDEFINED\n        : rule\n    })\n\n    const ret = {\n      ignored,\n      unignored\n    }\n\n    if (matchedRule) {\n      ret.rule = matchedRule\n    }\n\n    return ret\n  }\n}\n\nconst throwError = (message, Ctor) => {\n  throw new Ctor(message)\n}\n\nconst checkPath = (path, originalPath, doThrow) => {\n  if (!isString(path)) {\n    return doThrow(\n      `path must be a string, but got \\`${originalPath}\\``,\n      TypeError\n    )\n  }\n\n  // We don't know if we should ignore EMPTY, so throw\n  if (!path) {\n    return doThrow(`path must not be empty`, TypeError)\n  }\n\n  // Check if it is a relative path\n  if (checkPath.isNotRelative(path)) {\n    const r = '`path.relative()`d'\n    return doThrow(\n      `path should be a ${r} string, but got \"${originalPath}\"`,\n      RangeError\n    )\n  }\n\n  return true\n}\n\nconst isNotRelative = path => REGEX_TEST_INVALID_PATH.test(path)\n\ncheckPath.isNotRelative = isNotRelative\n\n// On windows, the following function will be replaced\n/* istanbul ignore next */\ncheckPath.convert = p => p\n\n\nclass Ignore {\n  constructor ({\n    ignorecase = true,\n    ignoreCase = ignorecase,\n    allowRelativePaths = false\n  } = {}) {\n    define(this, KEY_IGNORE, true)\n\n    this._rules = new RuleManager(ignoreCase)\n    this._strictPathCheck = !allowRelativePaths\n    this._initCache()\n  }\n\n  _initCache () {\n    // A cache for the result of `.ignores()`\n    this._ignoreCache = Object.create(null)\n\n    // A cache for the result of `.test()`\n    this._testCache = Object.create(null)\n  }\n\n  add (pattern) {\n    if (this._rules.add(pattern)) {\n      // Some rules have just added to the ignore,\n      //   making the behavior changed,\n      //   so we need to re-initialize the result cache\n      this._initCache()\n    }\n\n    return this\n  }\n\n  // legacy\n  addPattern (pattern) {\n    return this.add(pattern)\n  }\n\n  // @returns {TestResult}\n  _test (originalPath, cache, checkUnignored, slices) {\n    const path = originalPath\n      // Supports nullable path\n      && checkPath.convert(originalPath)\n\n    checkPath(\n      path,\n      originalPath,\n      this._strictPathCheck\n        ? throwError\n        : RETURN_FALSE\n    )\n\n    return this._t(path, cache, checkUnignored, slices)\n  }\n\n  checkIgnore (path) {\n    // If the path doest not end with a slash, `.ignores()` is much equivalent\n    //   to `git check-ignore`\n    if (!REGEX_TEST_TRAILING_SLASH.test(path)) {\n      return this.test(path)\n    }\n\n    const slices = path.split(SLASH).filter(Boolean)\n    slices.pop()\n\n    if (slices.length) {\n      const parent = this._t(\n        slices.join(SLASH) + SLASH,\n        this._testCache,\n        true,\n        slices\n      )\n\n      if (parent.ignored) {\n        return parent\n      }\n    }\n\n    return this._rules.test(path, false, MODE_CHECK_IGNORE)\n  }\n\n  _t (\n    // The path to be tested\n    path,\n\n    // The cache for the result of a certain checking\n    cache,\n\n    // Whether should check if the path is unignored\n    checkUnignored,\n\n    // The path slices\n    slices\n  ) {\n    if (path in cache) {\n      return cache[path]\n    }\n\n    if (!slices) {\n      // path/to/a.js\n      // ['path', 'to', 'a.js']\n      slices = path.split(SLASH).filter(Boolean)\n    }\n\n    slices.pop()\n\n    // If the path has no parent directory, just test it\n    if (!slices.length) {\n      return cache[path] = this._rules.test(path, checkUnignored, MODE_IGNORE)\n    }\n\n    const parent = this._t(\n      slices.join(SLASH) + SLASH,\n      cache,\n      checkUnignored,\n      slices\n    )\n\n    // If the path contains a parent directory, check the parent first\n    return cache[path] = parent.ignored\n      // > It is not possible to re-include a file if a parent directory of\n      // >   that file is excluded.\n      ? parent\n      : this._rules.test(path, checkUnignored, MODE_IGNORE)\n  }\n\n  ignores (path) {\n    return this._test(path, this._ignoreCache, false).ignored\n  }\n\n  createFilter () {\n    return path => !this.ignores(path)\n  }\n\n  filter (paths) {\n    return makeArray(paths).filter(this.createFilter())\n  }\n\n  // @returns {TestResult}\n  test (path) {\n    return this._test(path, this._testCache, true)\n  }\n}\n\nconst factory = options => new Ignore(options)\n\nconst isPathValid = path =>\n  checkPath(path && checkPath.convert(path), path, RETURN_FALSE)\n\n/* istanbul ignore next */\nconst setupWindows = () => {\n  /* eslint no-control-regex: \"off\" */\n  const makePosix = str => /^\\\\\\\\\\?\\\\/.test(str)\n  || /[\"<>|\\u0000-\\u001F]+/u.test(str)\n    ? str\n    : str.replace(/\\\\/g, '/')\n\n  checkPath.convert = makePosix\n\n  // 'C:\\\\foo'     <- 'C:\\\\foo' has been converted to 'C:/'\n  // 'd:\\\\foo'\n  const REGEX_TEST_WINDOWS_PATH_ABSOLUTE = /^[a-z]:\\//i\n  checkPath.isNotRelative = path =>\n    REGEX_TEST_WINDOWS_PATH_ABSOLUTE.test(path)\n    || isNotRelative(path)\n}\n\n\n// Windows\n// --------------------------------------------------------------\n/* istanbul ignore next */\nif (\n  // Detect `process` so that it can run in browsers.\n  typeof process !== 'undefined'\n  && process.platform === 'win32'\n) {\n  setupWindows()\n}\n\n// COMMONJS_EXPORTS ////////////////////////////////////////////////////////////\n\nmodule.exports = factory\n\n// Although it is an anti-pattern,\n//   it is still widely misused by a lot of libraries in github\n// Ref: https://github.com/search?q=ignore.default%28%29&type=code\nfactory.default = factory\n\nmodule.exports.isPathValid = isPathValid\n\n// For testing purposes\ndefine(module.exports, Symbol.for('setupWindows'), setupWindows)\n","import type { ExtensionAPI } from \"@earendil-works/pi-coding-agent\";\nimport { Type } from \"typebox\";\n\nimport { formatCostEstimate } from \"./utils/cost.js\";\nimport { formatPrImpact } from \"./tools/format-pr-impact.js\";\nimport {\n  addKnowledgeBase,\n  findSimilarCode,\n  getCallGraphData,\n  getCallGraphPath,\n  getIndexHealthCheck,\n  getIndexLogs,\n  getIndexMetrics,\n  getIndexStatus,\n  getPrImpact,\n  implementationLookup,\n  listKnowledgeBases,\n  removeKnowledgeBase,\n  runIndexCodebase,\n  searchCodebase,\n} from \"./tools/operations.js\";\nimport {\n  formatDefinitionLookup,\n  formatHealthCheck,\n  formatIndexStats,\n  formatSearchResults,\n  formatStatus,\n} from \"./tools/utils.js\";\n\nconst HOST = \"pi\" as const;\n\nconst ChunkType = Type.Union([\n  Type.Literal(\"function\"),\n  Type.Literal(\"class\"),\n  Type.Literal(\"method\"),\n  Type.Literal(\"interface\"),\n  Type.Literal(\"type\"),\n  Type.Literal(\"module\"),\n  Type.Literal(\"block\"),\n]);\n\nconst RelationshipType = Type.Union([\n  Type.Literal(\"Call\"),\n  Type.Literal(\"MethodCall\"),\n  Type.Literal(\"Constructor\"),\n  Type.Literal(\"Import\"),\n  Type.Literal(\"Inherits\"),\n  Type.Literal(\"Implements\"),\n]);\n\nfunction text(text: string, details?: unknown) {\n  return { content: [{ type: \"text\" as const, text }], details };\n}\n\nfunction projectRoot(ctx: { cwd?: string } | undefined): string | undefined {\n  return ctx?.cwd ?? process.cwd();\n}\n\nexport default function codebaseIndexPiExtension(pi: ExtensionAPI): void {\n  pi.registerTool({\n    name: \"codebase_search\",\n    label: \"Codebase Search\",\n    description: \"Semantic search over the indexed codebase. Describe behavior, not syntax.\",\n    parameters: Type.Object({\n      query: Type.String({ description: \"Natural language description of what code you're looking for\" }),\n      limit: Type.Optional(Type.Number({ description: \"Maximum results (default: 10)\" })),\n      fileType: Type.Optional(Type.String({ description: \"Filter by extension, e.g. ts, py, rs\" })),\n      directory: Type.Optional(Type.String({ description: \"Filter by directory path\" })),\n      chunkType: Type.Optional(ChunkType),\n      contextLines: Type.Optional(Type.Number({ description: \"Extra lines around each match\" })),\n    }),\n    async execute(_toolCallId, params, _signal, _onUpdate, ctx) {\n      const results = await searchCodebase(projectRoot(ctx), HOST, params.query, params);\n      return text(formatSearchResults(results), results);\n    },\n  });\n\n  pi.registerTool({\n    name: \"codebase_peek\",\n    label: \"Codebase Peek\",\n    description: \"Semantic search returning only metadata (file, lines, symbol) to save tokens.\",\n    parameters: Type.Object({\n      query: Type.String(),\n      limit: Type.Optional(Type.Number()),\n      fileType: Type.Optional(Type.String()),\n      directory: Type.Optional(Type.String()),\n      chunkType: Type.Optional(ChunkType),\n    }),\n    async execute(_toolCallId, params, _signal, _onUpdate, ctx) {\n      const results = await searchCodebase(projectRoot(ctx), HOST, params.query, { ...params, metadataOnly: true });\n      return text(formatSearchResults(results), results);\n    },\n  });\n\n  pi.registerTool({\n    name: \"find_similar\",\n    label: \"Find Similar Code\",\n    description: \"Find code similar to a snippet for duplicate detection and pattern discovery.\",\n    parameters: Type.Object({\n      code: Type.String({ description: \"Code snippet to compare\" }),\n      limit: Type.Optional(Type.Number()),\n      fileType: Type.Optional(Type.String()),\n      directory: Type.Optional(Type.String()),\n      chunkType: Type.Optional(ChunkType),\n      excludeFile: Type.Optional(Type.String()),\n    }),\n    async execute(_toolCallId, params, _signal, _onUpdate, ctx) {\n      const results = await findSimilarCode(projectRoot(ctx), HOST, params.code, params);\n      return text(formatSearchResults(results, \"similarity\"), results);\n    },\n  });\n\n  pi.registerTool({\n    name: \"implementation_lookup\",\n    label: \"Implementation Lookup\",\n    description: \"Find likely symbol definitions or implementations by name or natural language.\",\n    parameters: Type.Object({\n      query: Type.String(),\n      limit: Type.Optional(Type.Number()),\n      fileType: Type.Optional(Type.String()),\n      directory: Type.Optional(Type.String()),\n    }),\n    async execute(_toolCallId, params, _signal, _onUpdate, ctx) {\n      const results = await implementationLookup(projectRoot(ctx), HOST, params.query, params);\n      return text(formatDefinitionLookup(results, params.query), results);\n    },\n  });\n\n  pi.registerTool({\n    name: \"index_codebase\",\n    label: \"Index Codebase\",\n    description: \"Build or refresh the semantic codebase index.\",\n    parameters: Type.Object({\n      force: Type.Optional(Type.Boolean({ default: false })),\n      estimateOnly: Type.Optional(Type.Boolean({ default: false })),\n      verbose: Type.Optional(Type.Boolean({ default: false })),\n    }),\n    async execute(_toolCallId, params, _signal, _onUpdate, ctx) {\n      const result = await runIndexCodebase(projectRoot(ctx), HOST, params);\n      return result.kind === \"estimate\"\n        ? text(formatCostEstimate(result.estimate), result.estimate)\n        : text(formatIndexStats(result.stats, params.verbose ?? false), result.stats);\n    },\n  });\n\n  pi.registerTool({\n    name: \"index_status\",\n    label: \"Index Status\",\n    description: \"Check index health and current status.\",\n    parameters: Type.Object({}),\n    async execute(_toolCallId, _params, _signal, _onUpdate, ctx) {\n      const status = await getIndexStatus(projectRoot(ctx), HOST);\n      return text(formatStatus(status), status);\n    },\n  });\n\n  pi.registerTool({\n    name: \"index_health_check\",\n    label: \"Index Health Check\",\n    description: \"Garbage collect orphaned embeddings/chunks and report health.\",\n    parameters: Type.Object({}),\n    async execute(_toolCallId, _params, _signal, _onUpdate, ctx) {\n      const result = await getIndexHealthCheck(projectRoot(ctx), HOST);\n      return text(formatHealthCheck(result), result);\n    },\n  });\n\n  pi.registerTool({\n    name: \"index_metrics\",\n    label: \"Index Metrics\",\n    description: \"Return collected performance metrics when debug metrics are enabled.\",\n    parameters: Type.Object({}),\n    async execute(_toolCallId, _params, _signal, _onUpdate, ctx) {\n      const result = await getIndexMetrics(projectRoot(ctx), HOST);\n      return text(result.text, result);\n    },\n  });\n\n  pi.registerTool({\n    name: \"index_logs\",\n    label: \"Index Logs\",\n    description: \"Return recent debug logs when debug logging is enabled.\",\n    parameters: Type.Object({\n      limit: Type.Optional(Type.Number()),\n      category: Type.Optional(Type.Union([\n        Type.Literal(\"search\"),\n        Type.Literal(\"embedding\"),\n        Type.Literal(\"cache\"),\n        Type.Literal(\"gc\"),\n        Type.Literal(\"branch\"),\n        Type.Literal(\"general\"),\n      ])),\n      level: Type.Optional(Type.Union([Type.Literal(\"error\"), Type.Literal(\"warn\"), Type.Literal(\"info\"), Type.Literal(\"debug\")])),\n    }),\n    async execute(_toolCallId, params, _signal, _onUpdate, ctx) {\n      const result = await getIndexLogs(projectRoot(ctx), HOST, params);\n      return text(result.text, result);\n    },\n  });\n\n  pi.registerTool({\n    name: \"call_graph\",\n    label: \"Call Graph\",\n    description: \"Find callers or callees of a function/method in the indexed call graph.\",\n    parameters: Type.Object({\n      name: Type.String(),\n      direction: Type.Optional(Type.Union([Type.Literal(\"callers\"), Type.Literal(\"callees\")])),\n      symbolId: Type.Optional(Type.String()),\n      relationshipType: Type.Optional(RelationshipType),\n    }),\n    async execute(_toolCallId, params, _signal, _onUpdate, ctx) {\n      const result = await getCallGraphData(projectRoot(ctx), HOST, params);\n      return text(JSON.stringify(result, null, 2), result);\n    },\n  });\n\n  pi.registerTool({\n    name: \"call_graph_path\",\n    label: \"Call Graph Path\",\n    description: \"Find a call path between two functions/methods.\",\n    parameters: Type.Object({\n      from: Type.String(),\n      to: Type.String(),\n      maxDepth: Type.Optional(Type.Number({ default: 10 })),\n    }),\n    async execute(_toolCallId, params, _signal, _onUpdate, ctx) {\n      const result = await getCallGraphPath(projectRoot(ctx), HOST, params.from, params.to, params.maxDepth);\n      return text(JSON.stringify(result, null, 2), result);\n    },\n  });\n\n  pi.registerTool({\n    name: \"pr_impact\",\n    label: \"PR Impact\",\n    description: \"Analyze PR or branch impact through changed symbols and call graph neighborhoods.\",\n    parameters: Type.Object({\n      pr: Type.Optional(Type.Number()),\n      branch: Type.Optional(Type.String()),\n      maxDepth: Type.Optional(Type.Number({ default: 5 })),\n      hubThreshold: Type.Optional(Type.Number({ default: 10 })),\n      checkConflicts: Type.Optional(Type.Boolean({ default: false })),\n      direction: Type.Optional(Type.Union([Type.Literal(\"callers\"), Type.Literal(\"callees\"), Type.Literal(\"both\")])),\n    }),\n    async execute(_toolCallId, params, _signal, _onUpdate, ctx) {\n      const result = await getPrImpact(projectRoot(ctx), HOST, params);\n      return text(formatPrImpact(result), result);\n    },\n  });\n\n  pi.registerTool({\n    name: \"knowledge_base_list\",\n    label: \"List Knowledge Bases\",\n    description: \"List configured knowledge-base paths included in the index.\",\n    parameters: Type.Object({}),\n    async execute(_toolCallId, _params, _signal, _onUpdate, ctx) {\n      return text(listKnowledgeBases(projectRoot(ctx), HOST));\n    },\n  });\n\n  pi.registerTool({\n    name: \"knowledge_base_add\",\n    label: \"Add Knowledge Base\",\n    description: \"Add a knowledge-base path to the codebase index config.\",\n    parameters: Type.Object({ path: Type.String({ description: \"File or directory path to add\" }) }),\n    async execute(_toolCallId, params, _signal, _onUpdate, ctx) {\n      return text(addKnowledgeBase(projectRoot(ctx), HOST, params.path));\n    },\n  });\n\n  pi.registerTool({\n    name: \"knowledge_base_remove\",\n    label: \"Remove Knowledge Base\",\n    description: \"Remove a knowledge-base path from the codebase index config.\",\n    parameters: Type.Object({ path: Type.String({ description: \"File or directory path to remove\" }) }),\n    async execute(_toolCallId, params, _signal, _onUpdate, ctx) {\n      return text(removeKnowledgeBase(projectRoot(ctx), HOST, params.path));\n    },\n  });\n}\n","export const DEFAULT_INCLUDE = [\n  \"**/*.{ts,tsx,js,jsx,mjs,cjs}\",\n  \"**/*.{py,pyi}\",\n  \"**/*.{go,rs,java,kt,scala}\",\n  \"**/*.{c,cpp,cc,h,hpp}\",\n  \"**/*.{rb,php,inc,swift}\",\n  \"**/*.{cls,trigger}\",\n  \"**/*.{vue,svelte,astro}\",\n  \"**/*.{sql,graphql,proto}\",\n  \"**/*.{yaml,yml,toml}\",\n  \"**/*.{md,mdx}\",\n  \"**/*.{sh,bash,zsh}\",\n  \"**/*.{txt,html,htm}\",\n  \"**/*.zig\",\n  \"**/*.gd\",\n];\n\nexport const DEFAULT_EXCLUDE = [\n  \"**/node_modules/**\",\n  \"**/.git/**\",\n  \"**/dist/**\",\n  \"**/build/**\",\n  \"**/*build*/**\",\n  \"**/*.min.js\",\n  \"**/*.bundle.js\",\n  \"**/vendor/**\",\n  \"**/__pycache__/**\",\n  \"**/target/**\",\n  \"**/coverage/**\",\n  \"**/.next/**\",\n  \"**/.nuxt/**\",\n  \"**/.opencode/**\",\n  \"**/.*\",\n  \"**/.*/**\",\n];\n\nexport const EMBEDDING_MODELS = {\n  \"google\": {\n    // `text-embedding-004` is DEPRECATED - https://ai.google.dev/gemini-api/docs/deprecations\n    \"text-embedding-005\": {\n      provider: \"google\",\n      model: \"text-embedding-005\",\n      dimensions: 768,\n      maxTokens: 2048,\n      costPer1MTokens: 0.025,\n      taskAble: false,\n      // Note: on reality, this model allows for task-specific embeddings. See: https://docs.cloud.google.com/vertex-ai/generative-ai/docs/embeddings/task-types\n    },\n    \"gemini-embedding-001\": {\n      provider: \"google\",\n      model: \"gemini-embedding-001\",\n      // Native output is 3072D, but we use Matryoshka truncation via outputDimensionality\n      // to reduce to 1536D for better storage/search efficiency with minimal quality loss.\n      // Google recommends 768, 1536, or 3072. See: https://ai.google.dev/gemini-api/docs/embeddings\n      dimensions: 1536,\n      maxTokens: 2048,\n      costPer1MTokens: 0.15,\n      taskAble: true,\n    },\n  },\n  \"openai\": {\n    \"text-embedding-3-small\": {\n      provider: \"openai\",\n      model: \"text-embedding-3-small\",\n      dimensions: 1536,\n      maxTokens: 8191,\n      costPer1MTokens: 0.02,\n    },\n    \"text-embedding-3-large\": {\n      provider: \"openai\",\n      model: \"text-embedding-3-large\",\n      dimensions: 3072,\n      maxTokens: 8191,\n      costPer1MTokens: 0.13,\n    },\n  },\n  \"ollama\": {\n    \"nomic-embed-text\": {\n      provider: \"ollama\",\n      model: \"nomic-embed-text\",\n      dimensions: 768,\n      maxTokens: 2048,\n      costPer1MTokens: 0.00,\n    },\n    \"mxbai-embed-large\": {\n      provider: \"ollama\",\n      model: \"mxbai-embed-large\",\n      dimensions: 1024,\n      maxTokens: 512,\n      costPer1MTokens: 0.00,\n    },\n  },\n  \"github-copilot\": {\n    \"text-embedding-3-small\": {\n      provider: \"github-copilot\",\n      model: \"text-embedding-3-small\",\n      dimensions: 1536,\n      maxTokens: 8191,\n      costPer1MTokens: 0.00,\n    },\n  },\n} as const;\n\nexport const DEFAULT_PROVIDER_MODELS = {\n  \"github-copilot\": \"text-embedding-3-small\",\n  \"openai\": \"text-embedding-3-small\",\n  \"google\": \"gemini-embedding-001\",\n  \"ollama\": \"nomic-embed-text\",\n} as const;\n\nexport const AUTO_DETECT_PROVIDER_ORDER = [\n  \"ollama\",\n  \"github-copilot\",\n  \"openai\",\n  \"google\",\n] as const;\n","import type {\n  DebugConfig,\n  IndexingConfig,\n  RerankerProvider,\n  SearchConfig,\n} from \"./schema.js\";\n\nexport function getDefaultIndexingConfig(): IndexingConfig {\n  return {\n    autoIndex: false,\n    watchFiles: true,\n    maxFileSize: 1048576,\n    maxChunksPerFile: 100,\n    semanticOnly: false,\n    retries: 3,\n    retryDelayMs: 1000,\n    autoGc: true,\n    gcIntervalDays: 7,\n    gcOrphanThreshold: 100,\n    requireProjectMarker: true,\n    maxDepth: 5,\n    maxFilesPerDirectory: 100,\n    fallbackToTextOnMaxChunks: true,\n  };\n}\n\nexport function getDefaultSearchConfig(): SearchConfig {\n  return {\n    maxResults: 20,\n    minScore: 0.1,\n    includeContext: true,\n    hybridWeight: 0.5,\n    fusionStrategy: \"rrf\",\n    rrfK: 60,\n    rerankTopN: 20,\n    contextLines: 0,\n    routingHints: true,\n    routingGraphHandoffHints: false,\n    routingHintRole: \"system\",\n  };\n}\n\nexport function getDefaultRerankerBaseUrl(provider: RerankerProvider): string {\n  switch (provider) {\n    case \"cohere\":\n      return \"https://api.cohere.ai/v1\";\n    case \"jina\":\n      return \"https://api.jina.ai/v1\";\n    case \"custom\":\n      return \"\";\n  }\n}\n\nexport function getDefaultDebugConfig(): DebugConfig {\n  return {\n    enabled: false,\n    logLevel: \"info\",\n    logSearch: true,\n    logEmbedding: true,\n    logCache: true,\n    logGc: true,\n    logBranch: true,\n    metrics: true,\n  };\n}\n","const ENV_REFERENCE_PATTERN = /^\\{env:([A-Z_][A-Z0-9_]*)\\}$/;\nconst ENV_REFERENCE_LIKE_PATTERN = /\\{env:[^}]+\\}/;\n\nexport function substituteEnvString(value: string, keyPath: string): string {\n  const match = value.match(ENV_REFERENCE_PATTERN);\n\n  if (!match) {\n    if (ENV_REFERENCE_LIKE_PATTERN.test(value)) {\n      throw new Error(\n        `Invalid environment variable reference at '${keyPath}'. ` +\n        \"Expected the entire string to match '{env:VAR_NAME}' with VAR_NAME matching [A-Z_][A-Z0-9_]*.\"\n      );\n    }\n\n    return value;\n  }\n\n  const variableName = match[1];\n  const envValue = process.env[variableName];\n\n  if (envValue === undefined) {\n    throw new Error(`Missing environment variable '${variableName}' referenced by config at '${keyPath}'.`);\n  }\n\n  return envValue;\n}\n\nexport function substituteEnvReferences(raw: unknown, keyPath = \"$root\"): unknown {\n  if (typeof raw === \"string\") {\n    return substituteEnvString(raw, keyPath);\n  }\n\n  if (Array.isArray(raw)) {\n    return raw.map((item, index) => substituteEnvReferences(item, `${keyPath}[${index}]`));\n  }\n\n  if (raw && typeof raw === \"object\") {\n    return Object.fromEntries(\n      Object.entries(raw).map(([key, value]) => [key, substituteEnvReferences(value, `${keyPath}.${key}`)])\n    );\n  }\n\n  return raw;\n}\n","import type {\n  EmbeddingProvider,\n  IndexScope,\n  LogLevel,\n  ProviderModels,\n  RerankerProvider,\n  SearchConfig,\n} from \"./schema.js\";\n\nimport { EMBEDDING_MODELS } from \"./constants.js\";\nimport { substituteEnvString } from \"./env-substitution.js\";\n\nconst VALID_SCOPES: IndexScope[] = [\"project\", \"global\"];\nconst VALID_LOG_LEVELS: LogLevel[] = [\"error\", \"warn\", \"info\", \"debug\"];\n\nexport function isValidFusionStrategy(value: unknown): value is SearchConfig[\"fusionStrategy\"] {\n  return value === \"weighted\" || value === \"rrf\";\n}\n\nexport function isValidRerankerProvider(value: unknown): value is RerankerProvider {\n  return value === \"cohere\" || value === \"jina\" || value === \"custom\";\n}\n\nexport function isValidProvider(value: unknown): value is EmbeddingProvider {\n  return typeof value === \"string\" && Object.keys(EMBEDDING_MODELS).includes(value);\n}\n\nexport function isValidModel<P extends EmbeddingProvider>(\n  value: unknown,\n  provider: P\n): value is ProviderModels[P] {\n  return typeof value === \"string\" && Object.keys(EMBEDDING_MODELS[provider]).includes(value);\n}\n\nexport function isValidScope(value: unknown): value is IndexScope {\n  return typeof value === \"string\" && VALID_SCOPES.includes(value as IndexScope);\n}\n\nexport function isStringArray(value: unknown): value is string[] {\n  return Array.isArray(value) && value.every(item => typeof item === \"string\");\n}\n\nexport function getResolvedString(value: unknown, keyPath: string): string | undefined {\n  if (typeof value !== \"string\") {\n    return undefined;\n  }\n\n  return substituteEnvString(value, keyPath);\n}\n\nexport function getResolvedStringArray(value: unknown, keyPath: string): string[] | undefined {\n  if (!isStringArray(value)) {\n    return undefined;\n  }\n\n  return value.map((item, index) => substituteEnvString(item, `${keyPath}[${index}]`));\n}\n\nexport function isValidLogLevel(value: unknown): value is LogLevel {\n  return typeof value === \"string\" && VALID_LOG_LEVELS.includes(value as LogLevel);\n}\n","// Config schema without zod dependency to avoid version conflicts with OpenCode SDK\n\nimport { AUTO_DETECT_PROVIDER_ORDER, DEFAULT_INCLUDE, DEFAULT_EXCLUDE, EMBEDDING_MODELS, DEFAULT_PROVIDER_MODELS } from \"./constants.js\";\nimport {\n  getDefaultDebugConfig,\n  getDefaultIndexingConfig,\n  getDefaultRerankerBaseUrl,\n  getDefaultSearchConfig,\n} from \"./defaults.js\";\nimport {\n  getResolvedString,\n  getResolvedStringArray,\n  isStringArray,\n  isValidFusionStrategy,\n  isValidLogLevel,\n  isValidModel,\n  isValidProvider,\n  isValidRerankerProvider,\n  isValidScope,\n} from \"./validators.js\";\n\nexport { isValidModel } from \"./validators.js\";\n\nexport type IndexScope = \"project\" | \"global\";\n\nexport interface IndexingConfig {\n  autoIndex: boolean;\n  watchFiles: boolean;\n  maxFileSize: number;\n  maxChunksPerFile: number;\n  semanticOnly: boolean;\n  retries: number;\n  retryDelayMs: number;\n  autoGc: boolean;\n  gcIntervalDays: number;\n  gcOrphanThreshold: number;\n  /**\n   * When true (default), requires a project marker (.git, package.json, Cargo.toml, etc.)\n   * to be present before enabling file watching and auto-indexing.\n   */\n  requireProjectMarker: boolean;\n  /**\n   * Max directory traversal depth. -1 = unlimited, 0 = only files in the root dir,\n   * 1 = one level of subdirectories, etc. Default: 5\n   */\n  maxDepth: number;\n  /**\n   * Max number of files to index per directory. Always picks the smallest files first.\n   * Default: 100\n   */\n  maxFilesPerDirectory: number;\n  /**\n   * When a file hits maxChunksPerFile, fallback to text-based (chunk_by_lines) parsing\n   * instead of skipping the rest of the file. Default: true\n   */\n  fallbackToTextOnMaxChunks: boolean;\n}\n\nexport interface SearchConfig {\n  maxResults: number;\n  minScore: number;\n  includeContext: boolean;\n  hybridWeight: number;\n  fusionStrategy: \"weighted\" | \"rrf\";\n  rrfK: number;\n  rerankTopN: number;\n  contextLines: number;\n  routingHints: boolean;\n  routingGraphHandoffHints: boolean;\n  routingHintRole: \"system\" | \"developer\";\n}\n\nexport type RerankerProvider = \"cohere\" | \"jina\" | \"custom\";\n\nexport interface RerankerConfig {\n  /** Whether to enable reranking. Default: false */\n  enabled: boolean;\n  /** Provider shortcut for hosted rerank APIs. Use 'custom' to provide only baseUrl. */\n  provider: RerankerProvider;\n  /** Model name for reranking */\n  model: string;\n  /** Base URL of the rerank API endpoint */\n  baseUrl: string;\n  /** API key for the rerank service */\n  apiKey?: string;\n  /** Number of top documents to rerank */\n  topN: number;\n  /** Request timeout in milliseconds */\n  timeoutMs: number;\n}\n\nexport type LogLevel = \"error\" | \"warn\" | \"info\" | \"debug\";\n\nexport interface DebugConfig {\n  enabled: boolean;\n  logLevel: LogLevel;\n  logSearch: boolean;\n  logEmbedding: boolean;\n  logCache: boolean;\n  logGc: boolean;\n  logBranch: boolean;\n  metrics: boolean;\n}\n\nexport interface CustomProviderConfig {\n  /** Base URL of the OpenAI-compatible embeddings API. The path /embeddings is appended automatically (e.g. \"http://localhost:11434/v1\", \"https://api.example.com/v1\") */\n  baseUrl: string;\n  /** Model name to send in the API request (e.g. \"nomic-embed-text\") */\n  model: string;\n  /** Vector dimensions the model produces (e.g. 768 for nomic-embed-text) */\n  dimensions: number;\n  /** Optional API key for authenticated endpoints */\n  apiKey?: string;\n  /** Max tokens per input text (default: 8192) */\n  maxTokens?: number;\n  /** Request timeout in milliseconds (default: 30000) */\n  timeoutMs?: number;\n  /** Max concurrent embedding requests (default: 3). Increase for local servers like llama.cpp or vLLM. */\n  concurrency?: number;\n  /** Minimum delay between requests in milliseconds (default: 1000). Set to 0 for local servers. */\n  requestIntervalMs?: number;\n  maxBatchSize?: number;\n  max_batch_size?: number;\n}\n\nexport interface CodebaseIndexConfig {\n  embeddingProvider: EmbeddingProvider | 'custom' | 'auto';\n  embeddingModel?: EmbeddingModelName;\n  /** Configuration for custom OpenAI-compatible embedding providers (required when embeddingProvider is 'custom') */\n  customProvider?: CustomProviderConfig;\n  scope: IndexScope;\n  indexing?: Partial<IndexingConfig>;\n  search?: Partial<SearchConfig>;\n  debug?: Partial<DebugConfig>;\n  /** Reranking configuration for improving search result quality */\n  reranker?: Partial<RerankerConfig>;\n  /** External directories to index as knowledge bases (absolute or relative paths) */\n  knowledgeBases?: string[];\n  /** Override the default include patterns (replaces defaults) */\n  include: string[];\n  /** Override the default exclude patterns (replaces defaults) */\n  exclude: string[];\n  /** Additional file patterns to include (extends defaults) */\n  additionalInclude?: string[];\n}\n\nexport type ParsedCodebaseIndexConfig = CodebaseIndexConfig & {\n  indexing: IndexingConfig;\n  search: SearchConfig;\n  debug: DebugConfig;\n  reranker?: RerankerConfig;\n  knowledgeBases: string[];\n  additionalInclude: string[];\n};\n\nexport function parseConfig(raw: unknown): ParsedCodebaseIndexConfig {\n  const input = (raw && typeof raw === \"object\" ? raw : {}) as Record<string, unknown>;\n  const embeddingProviderValue = getResolvedString(input.embeddingProvider, \"$root.embeddingProvider\");\n  const scopeValue = getResolvedString(input.scope, \"$root.scope\");\n  const includeValue = getResolvedStringArray(input.include, \"$root.include\");\n  const excludeValue = getResolvedStringArray(input.exclude, \"$root.exclude\");\n\n  const defaultIndexing = getDefaultIndexingConfig();\n  const defaultSearch = getDefaultSearchConfig();\n  const defaultDebug = getDefaultDebugConfig();\n\n  const rawIndexing = (input.indexing && typeof input.indexing === \"object\" ? input.indexing : {}) as Record<string, unknown>;\n  const indexing: IndexingConfig = {\n    autoIndex: typeof rawIndexing.autoIndex === \"boolean\" ? rawIndexing.autoIndex : defaultIndexing.autoIndex,\n    watchFiles: typeof rawIndexing.watchFiles === \"boolean\" ? rawIndexing.watchFiles : defaultIndexing.watchFiles,\n    maxFileSize: typeof rawIndexing.maxFileSize === \"number\" ? rawIndexing.maxFileSize : defaultIndexing.maxFileSize,\n    maxChunksPerFile: typeof rawIndexing.maxChunksPerFile === \"number\" ? Math.max(1, rawIndexing.maxChunksPerFile) : defaultIndexing.maxChunksPerFile,\n    semanticOnly: typeof rawIndexing.semanticOnly === \"boolean\" ? rawIndexing.semanticOnly : defaultIndexing.semanticOnly,\n    retries: typeof rawIndexing.retries === \"number\" ? rawIndexing.retries : defaultIndexing.retries,\n    retryDelayMs: typeof rawIndexing.retryDelayMs === \"number\" ? rawIndexing.retryDelayMs : defaultIndexing.retryDelayMs,\n    autoGc: typeof rawIndexing.autoGc === \"boolean\" ? rawIndexing.autoGc : defaultIndexing.autoGc,\n    gcIntervalDays: typeof rawIndexing.gcIntervalDays === \"number\" ? Math.max(1, rawIndexing.gcIntervalDays) : defaultIndexing.gcIntervalDays,\n    gcOrphanThreshold: typeof rawIndexing.gcOrphanThreshold === \"number\" ? Math.max(0, rawIndexing.gcOrphanThreshold) : defaultIndexing.gcOrphanThreshold,\n    requireProjectMarker: typeof rawIndexing.requireProjectMarker === \"boolean\" ? rawIndexing.requireProjectMarker : defaultIndexing.requireProjectMarker,\n    maxDepth: typeof rawIndexing.maxDepth === \"number\" ? (rawIndexing.maxDepth < -1 ? -1 : rawIndexing.maxDepth) : defaultIndexing.maxDepth,\n    maxFilesPerDirectory: typeof rawIndexing.maxFilesPerDirectory === \"number\" ? Math.max(1, rawIndexing.maxFilesPerDirectory) : defaultIndexing.maxFilesPerDirectory,\n    fallbackToTextOnMaxChunks: typeof rawIndexing.fallbackToTextOnMaxChunks === \"boolean\" ? rawIndexing.fallbackToTextOnMaxChunks : defaultIndexing.fallbackToTextOnMaxChunks,\n  };\n\n  const rawSearch = (input.search && typeof input.search === \"object\" ? input.search : {}) as Record<string, unknown>;\n  const search: SearchConfig = {\n    maxResults: typeof rawSearch.maxResults === \"number\" ? rawSearch.maxResults : defaultSearch.maxResults,\n    minScore: typeof rawSearch.minScore === \"number\" ? rawSearch.minScore : defaultSearch.minScore,\n    includeContext: typeof rawSearch.includeContext === \"boolean\" ? rawSearch.includeContext : defaultSearch.includeContext,\n    hybridWeight: typeof rawSearch.hybridWeight === \"number\" ? Math.min(1, Math.max(0, rawSearch.hybridWeight)) : defaultSearch.hybridWeight,\n    fusionStrategy: isValidFusionStrategy(rawSearch.fusionStrategy) ? rawSearch.fusionStrategy : defaultSearch.fusionStrategy,\n    rrfK: typeof rawSearch.rrfK === \"number\" ? Math.max(1, Math.floor(rawSearch.rrfK)) : defaultSearch.rrfK,\n    rerankTopN: typeof rawSearch.rerankTopN === \"number\" ? Math.min(200, Math.max(0, Math.floor(rawSearch.rerankTopN))) : defaultSearch.rerankTopN,\n    contextLines: typeof rawSearch.contextLines === \"number\" ? Math.min(50, Math.max(0, rawSearch.contextLines)) : defaultSearch.contextLines,\n    routingHints: typeof rawSearch.routingHints === \"boolean\" ? rawSearch.routingHints : defaultSearch.routingHints,\n    routingGraphHandoffHints: typeof rawSearch.routingGraphHandoffHints === \"boolean\" ? rawSearch.routingGraphHandoffHints : defaultSearch.routingGraphHandoffHints,\n    routingHintRole: rawSearch.routingHintRole === \"developer\" || rawSearch.routingHintRole === \"system\"\n      ? rawSearch.routingHintRole\n      : defaultSearch.routingHintRole,\n  };\n\n  const rawDebug = (input.debug && typeof input.debug === \"object\" ? input.debug : {}) as Record<string, unknown>;\n  const debug: DebugConfig = {\n    enabled: typeof rawDebug.enabled === \"boolean\" ? rawDebug.enabled : defaultDebug.enabled,\n    logLevel: isValidLogLevel(rawDebug.logLevel) ? rawDebug.logLevel : defaultDebug.logLevel,\n    logSearch: typeof rawDebug.logSearch === \"boolean\" ? rawDebug.logSearch : defaultDebug.logSearch,\n    logEmbedding: typeof rawDebug.logEmbedding === \"boolean\" ? rawDebug.logEmbedding : defaultDebug.logEmbedding,\n    logCache: typeof rawDebug.logCache === \"boolean\" ? rawDebug.logCache : defaultDebug.logCache,\n    logGc: typeof rawDebug.logGc === \"boolean\" ? rawDebug.logGc : defaultDebug.logGc,\n    logBranch: typeof rawDebug.logBranch === \"boolean\" ? rawDebug.logBranch : defaultDebug.logBranch,\n    metrics: typeof rawDebug.metrics === \"boolean\" ? rawDebug.metrics : defaultDebug.metrics,\n  };\n\n  const rawKnowledgeBases = input.knowledgeBases;\n  const knowledgeBases: string[] = isStringArray(rawKnowledgeBases)\n    ? rawKnowledgeBases.filter(p => typeof p === \"string\" && p.trim().length > 0).map(p => p.trim())\n    : [];\n\n  const rawAdditionalInclude = input.additionalInclude;\n  const additionalInclude: string[] = isStringArray(rawAdditionalInclude)\n    ? rawAdditionalInclude\n      .filter(p => typeof p === \"string\" && p.trim().length > 0)\n      .map(p => p.trim())\n    : [];\n\n  let embeddingProvider: EmbeddingProvider | 'custom' | 'auto';\n  let embeddingModel: EmbeddingModelName | undefined;\n  let customProvider: CustomProviderConfig | undefined;\n  let reranker: RerankerConfig | undefined;\n  if (embeddingProviderValue === 'custom') {\n    embeddingProvider = 'custom';\n    const rawCustom = (input.customProvider && typeof input.customProvider === 'object' ? input.customProvider : null) as Record<string, unknown> | null;\n    const baseUrlValue = getResolvedString(rawCustom?.baseUrl, \"$root.customProvider.baseUrl\");\n    const modelValue = getResolvedString(rawCustom?.model, \"$root.customProvider.model\");\n    const apiKeyValue = getResolvedString(rawCustom?.apiKey, \"$root.customProvider.apiKey\");\n    if (rawCustom && typeof baseUrlValue === 'string' && baseUrlValue.trim().length > 0 && typeof modelValue === 'string' && modelValue.trim().length > 0 && typeof rawCustom.dimensions === 'number' && Number.isInteger(rawCustom.dimensions) && rawCustom.dimensions > 0) {\n      customProvider = {\n        baseUrl: baseUrlValue.trim().replace(/\\/+$/, ''),\n        model: modelValue,\n        dimensions: rawCustom.dimensions,\n        apiKey: apiKeyValue,\n        maxTokens: typeof rawCustom.maxTokens === 'number' ? rawCustom.maxTokens : undefined,\n        timeoutMs: typeof rawCustom.timeoutMs === 'number' ? Math.max(1000, rawCustom.timeoutMs) : undefined,\n        concurrency: typeof rawCustom.concurrency === 'number' ? Math.max(1, Math.floor(rawCustom.concurrency)) : undefined,\n        requestIntervalMs: typeof rawCustom.requestIntervalMs === 'number' ? Math.max(0, Math.floor(rawCustom.requestIntervalMs)) : undefined,\n        maxBatchSize: typeof rawCustom.maxBatchSize === 'number'\n          ? Math.max(1, Math.floor(rawCustom.maxBatchSize))\n          : typeof rawCustom.max_batch_size === 'number'\n            ? Math.max(1, Math.floor(rawCustom.max_batch_size))\n            : undefined,\n      };\n      // Warn if baseUrl doesn't end with an API version path like /v1.\n      // Note: using console.warn here because Logger isn't initialized yet at config parse time.\n      if (!/\\/v\\d+\\/?$/.test(customProvider.baseUrl)) {\n        console.warn(\n          `[codebase-index] Warning: customProvider.baseUrl (\"${customProvider.baseUrl}\") does not end with an API version path like /v1. ` +\n          `The plugin appends /embeddings automatically, so the full URL will be \"${customProvider.baseUrl}/embeddings\". ` +\n          `If your provider expects /v1/embeddings, set baseUrl to \"${customProvider.baseUrl}/v1\".`\n        );\n      }\n    } else {\n      throw new Error(\n        \"embeddingProvider is 'custom' but customProvider config is missing or invalid. \" +\n        \"Required fields: baseUrl (string), model (string), dimensions (positive integer).\"\n      );\n    }\n  } else if (isValidProvider(embeddingProviderValue)) {\n    embeddingProvider = embeddingProviderValue;\n    const rawEmbeddingModel = input.embeddingModel;\n    if (typeof rawEmbeddingModel === \"string\") {\n      const embeddingModelValue = getResolvedString(rawEmbeddingModel, \"$root.embeddingModel\");\n      if (embeddingModelValue) {\n        embeddingModel = isValidModel(embeddingModelValue, embeddingProvider) ? embeddingModelValue : DEFAULT_PROVIDER_MODELS[embeddingProvider];\n      }\n    } else if (rawEmbeddingModel) {\n      embeddingModel = DEFAULT_PROVIDER_MODELS[embeddingProvider];\n    }\n  } else {\n    embeddingProvider = 'auto';\n  }\n\n  const rawReranker = (input.reranker && typeof input.reranker === \"object\"\n    ? input.reranker\n    : {}) as Record<string, unknown>;\n  const rerankerEnabled = typeof rawReranker.enabled === \"boolean\" ? rawReranker.enabled : false;\n  if (rerankerEnabled) {\n    const provider = isValidRerankerProvider(rawReranker.provider) ? rawReranker.provider : \"custom\";\n    const model = getResolvedString(rawReranker.model, \"$root.reranker.model\");\n    if (!model || model.trim().length === 0) {\n      throw new Error(\"reranker is enabled but reranker.model is missing or invalid.\");\n    }\n\n    const configuredBaseUrl = getResolvedString(rawReranker.baseUrl, \"$root.reranker.baseUrl\");\n    const baseUrl = configuredBaseUrl?.trim() || getDefaultRerankerBaseUrl(provider);\n    if (baseUrl.length === 0) {\n      throw new Error(\"reranker is enabled but reranker.baseUrl is missing or invalid for provider 'custom'.\");\n    }\n\n    const apiKey = getResolvedString(rawReranker.apiKey, \"$root.reranker.apiKey\");\n    if ((provider === \"cohere\" || provider === \"jina\") && (!apiKey || apiKey.trim().length === 0)) {\n      throw new Error(`reranker provider '${provider}' requires reranker.apiKey when enabled.`);\n    }\n\n    reranker = {\n      enabled: true,\n      provider,\n      model: model.trim(),\n      baseUrl: baseUrl.replace(/\\/+$/, \"\"),\n      apiKey: apiKey?.trim() || undefined,\n      topN: typeof rawReranker.topN === \"number\" ? Math.min(50, Math.max(1, Math.floor(rawReranker.topN))) : 15,\n      timeoutMs: typeof rawReranker.timeoutMs === \"number\" ? Math.max(1000, Math.floor(rawReranker.timeoutMs)) : 10000,\n    };\n  }\n\n  return {\n    embeddingProvider,\n    embeddingModel,\n    customProvider,\n    scope: isValidScope(scopeValue) ? scopeValue : \"project\",\n    include: includeValue ?? DEFAULT_INCLUDE,\n    exclude: excludeValue ?? DEFAULT_EXCLUDE,\n    additionalInclude,\n    indexing,\n    search,\n    debug,\n    reranker,\n    knowledgeBases,\n  };\n}\n\nexport function getDefaultModelForProvider(provider: EmbeddingProvider): EmbeddingModelInfo {\n  const models = EMBEDDING_MODELS[provider];\n  const providerDefault = DEFAULT_PROVIDER_MODELS[provider];\n  return models[providerDefault as keyof typeof models];\n}\n\n/**\n * Built-in embedding providers derived from the static EMBEDDING_MODELS catalog.\n * 'custom' is intentionally excluded from this union because it has no static model\n * catalog — its model/dimensions/config are entirely user-defined at runtime via\n * CustomProviderConfig. Code that handles all providers uses `EmbeddingProvider | 'custom'`.\n */\nexport type EmbeddingProvider = keyof typeof EMBEDDING_MODELS;\n\nexport const availableProviders: EmbeddingProvider[] = Object.keys(EMBEDDING_MODELS) as EmbeddingProvider[];\n\nexport const autoDetectProviders: EmbeddingProvider[] = AUTO_DETECT_PROVIDER_ORDER.filter(\n  (provider): provider is EmbeddingProvider => provider in EMBEDDING_MODELS,\n);\n\nexport type ProviderModels = {\n  [P in keyof typeof EMBEDDING_MODELS]: keyof (typeof EMBEDDING_MODELS)[P]\n}\n\nexport type EmbeddingModelName = ProviderModels[keyof ProviderModels];\n\nexport type EmbeddingProviderModelInfo = {\n  [P in EmbeddingProvider]: (typeof EMBEDDING_MODELS)[P][keyof (typeof EMBEDDING_MODELS)[P]]\n}\n\n\n/** Shared fields across all embedding model types (built-in and custom) */\nexport interface BaseModelInfo {\n  model: string;\n  dimensions: number;\n  maxTokens: number;\n  costPer1MTokens: number;\n}\n\nexport type EmbeddingModelInfo = EmbeddingProviderModelInfo[EmbeddingProvider];\n","import { type EmbeddingProvider, type CustomProviderConfig, type BaseModelInfo, getDefaultModelForProvider, isValidModel, autoDetectProviders, EmbeddingModelName, EMBEDDING_MODELS } from \"../config\";\nimport { existsSync, readFileSync } from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\n\nexport interface ProviderCredentials {\n  provider: EmbeddingProvider | 'custom';\n  apiKey?: string;\n  baseUrl?: string;\n  refreshToken?: string;\n  accessToken?: string;\n  tokenExpires?: number;\n}\n\nexport interface CustomModelInfo extends BaseModelInfo {\n  provider: 'custom';\n  timeoutMs: number;\n  maxBatchSize?: number;\n}\n\nexport type ConfiguredProviderInfo = {\n  [P in EmbeddingProvider]: {\n    provider: P;\n    credentials: ProviderCredentials;\n    modelInfo: (typeof EMBEDDING_MODELS)[P][keyof (typeof EMBEDDING_MODELS)[P]];\n  }\n}[EmbeddingProvider] | {\n  provider: 'custom';\n  credentials: ProviderCredentials;\n  modelInfo: CustomModelInfo;\n}\n\ninterface OpenCodeAuthOAuth {\n  type: \"oauth\";\n  refresh: string;\n  access: string;\n  expires: number;\n  enterpriseUrl?: string;\n}\n\ninterface OpenCodeAuthAPI {\n  type: \"api\";\n  key: string;\n}\n\ntype OpenCodeAuth = OpenCodeAuthOAuth | OpenCodeAuthAPI;\n\nfunction getOpenCodeAuthPath(): string {\n  return path.join(os.homedir(), \".local\", \"share\", \"opencode\", \"auth.json\");\n}\n\nfunction loadOpenCodeAuth(): Record<string, OpenCodeAuth> {\n  const authPath = getOpenCodeAuthPath();\n  try {\n    if (existsSync(authPath)) {\n      return JSON.parse(readFileSync(authPath, \"utf-8\"));\n    }\n  } catch {\n    // Ignore auth file read errors\n  }\n  return {};\n}\n\nexport async function detectEmbeddingProvider<P extends EmbeddingProvider>(\n  preferredProvider: P, model?: EmbeddingModelName\n): Promise<ConfiguredProviderInfo> {\n  const credentials = await getProviderCredentials(preferredProvider);\n  if (credentials) {\n    if (!model) {\n      return {\n        provider: preferredProvider,\n        credentials,\n        modelInfo: getDefaultModelForProvider(preferredProvider),\n      } as ConfiguredProviderInfo;\n    }\n    if (!isValidModel(model, preferredProvider)) {\n      throw new Error(\n        `Model '${model}' is not supported by provider '${preferredProvider}'`\n      );\n    }\n    const providerModels = EMBEDDING_MODELS[preferredProvider];\n    return {\n      provider: preferredProvider,\n      credentials,\n      modelInfo: providerModels[model],\n    } as ConfiguredProviderInfo;\n  }\n  throw new Error(\n    `Preferred provider '${preferredProvider}' is not configured or authenticated`\n  );\n}\n\nexport async function tryDetectProvider(): Promise<ConfiguredProviderInfo> {\n  for (const provider of autoDetectProviders) {\n    const credentials = await getProviderCredentials(provider);\n    if (credentials) {\n      return {\n        provider,\n        credentials,\n        modelInfo: getDefaultModelForProvider(provider),\n      } as ConfiguredProviderInfo;\n    }\n  }\n\n  throw new Error(\n    `No embedding-capable provider found. Please authenticate with OpenCode using one of: ${autoDetectProviders.join(\", \")}.`\n  );\n}\n\nasync function getProviderCredentials(\n  provider: EmbeddingProvider\n): Promise<ProviderCredentials | null> {\n  switch (provider) {\n    case \"github-copilot\":\n      return getGitHubCopilotCredentials();\n    case \"openai\":\n      return getOpenAICredentials();\n    case \"google\":\n      return getGoogleCredentials();\n    case \"ollama\":\n      return getOllamaCredentials();\n    default:\n      return null;\n  }\n}\n\nfunction getGitHubCopilotCredentials(): ProviderCredentials | null {\n  const authData = loadOpenCodeAuth();\n  const copilotAuth = authData[\"github-copilot\"] || authData[\"github-copilot-enterprise\"];\n\n  if (!copilotAuth || copilotAuth.type !== \"oauth\") {\n    return null;\n  }\n\n  // Use GitHub Models API for embeddings (models.github.ai)\n  // Enterprise uses different URL pattern\n  const auth = copilotAuth as OpenCodeAuthOAuth;\n  const baseUrl = auth.enterpriseUrl\n    ? `https://copilot-api.${auth.enterpriseUrl.replace(/^https?:\\/\\//, \"\").replace(/\\/$/, \"\")}`\n    : \"https://models.github.ai\";\n\n  return {\n    provider: \"github-copilot\",\n    baseUrl,\n    refreshToken: copilotAuth.refresh,\n    accessToken: copilotAuth.access,\n    tokenExpires: copilotAuth.expires,\n  };\n}\n\nfunction getOpenAICredentials(): ProviderCredentials | null {\n  const authData = loadOpenCodeAuth();\n  const openaiAuth = authData[\"openai\"];\n\n  if (openaiAuth?.type === \"api\") {\n    return {\n      provider: \"openai\",\n      apiKey: openaiAuth.key,\n      baseUrl: \"https://api.openai.com/v1\",\n    };\n  }\n\n  return null;\n}\n\nfunction getGoogleCredentials(): ProviderCredentials | null {\n  const authData = loadOpenCodeAuth();\n  const googleAuth = authData[\"google\"] || authData[\"google-generative-ai\"];\n\n  if (googleAuth?.type === \"api\") {\n    return {\n      provider: \"google\",\n      apiKey: googleAuth.key,\n      baseUrl: \"https://generativelanguage.googleapis.com/v1beta\",\n    };\n  }\n\n  return null;\n}\n\nasync function getOllamaCredentials(): Promise<ProviderCredentials | null> {\n  const baseUrl = process.env.OLLAMA_HOST || \"http://localhost:11434\";\n\n  try {\n    const controller = new AbortController();\n    const timeoutId = setTimeout(() => controller.abort(), 2000);\n\n    const response = await fetch(`${baseUrl}/api/tags`, {\n      signal: controller.signal,\n    });\n\n    clearTimeout(timeoutId);\n\n    if (response.ok) {\n      const data = await response.json() as { models?: Array<{ name: string }> };\n      const hasEmbeddingModel = data.models?.some(\n        (m: { name: string }) =>\n          m.name.includes(\"nomic-embed\") ||\n          m.name.includes(\"mxbai-embed\") ||\n          m.name.includes(\"all-minilm\")\n      );\n\n      if (hasEmbeddingModel) {\n        return {\n          provider: \"ollama\",\n          baseUrl,\n        };\n      }\n    }\n  } catch {\n    return null;\n  }\n\n  return null;\n}\n\nexport function getProviderDisplayName(provider: EmbeddingProvider | 'custom'): string {\n  switch (provider) {\n    case \"github-copilot\":\n      return \"GitHub Copilot\";\n    case \"openai\":\n      return \"OpenAI\";\n    case \"google\":\n      return \"Google (Gemini)\";\n    case \"ollama\":\n      return \"Ollama (Local)\";\n    case \"custom\":\n      return \"Custom (OpenAI-compatible)\";\n    default:\n      return provider;\n  }\n}\n\nexport function createCustomProviderInfo(config: CustomProviderConfig): ConfiguredProviderInfo {\n  // Normalize baseUrl defensively — parseConfig() already strips trailing slashes,\n  // but direct callers (e.g. tests) may pass unnormalized URLs.\n  const baseUrl = config.baseUrl.replace(/\\/+$/, '');\n  return {\n    provider: 'custom',\n    credentials: {\n      provider: 'custom',\n      baseUrl,\n      apiKey: config.apiKey,\n    },\n    modelInfo: {\n      provider: 'custom',\n      model: config.model,\n      dimensions: config.dimensions,\n      maxTokens: config.maxTokens ?? 8192,\n      costPer1MTokens: 0,\n      timeoutMs: config.timeoutMs ?? 30_000,\n      maxBatchSize: config.maxBatchSize,\n    },\n  };\n}\n","import { BaseModelInfo } from \"../config/schema.js\";\nimport { getProviderDisplayName, ConfiguredProviderInfo } from \"../embeddings/detector.js\";\n\nexport interface CostEstimate {\n  filesCount: number;\n  totalSizeBytes: number;\n  estimatedChunks: number;\n  estimatedTokens: number;\n  estimatedCost: number;\n  provider: string;\n  model: string;\n  isFree: boolean;\n}\n\nexport function estimateTokens(text: string): number {\n  return Math.ceil(text.length / 4);\n}\n\nexport function estimateChunksFromFiles(\n  files: Array<{ path: string; size: number }>\n): number {\n  let totalChunks = 0;\n\n  for (const file of files) {\n    const avgChunkSize = 400;\n    const chunksPerFile = Math.max(1, Math.ceil(file.size / avgChunkSize));\n    totalChunks += chunksPerFile;\n  }\n\n  return totalChunks;\n}\n\nexport function estimateCost(\n  estimatedTokens: number,\n  modelInfo: BaseModelInfo\n): number {\n  return (estimatedTokens / 1_000_000) * modelInfo.costPer1MTokens;\n}\n\nexport function createCostEstimate(\n  files: Array<{ path: string; size: number }>,\n  provider: ConfiguredProviderInfo\n): CostEstimate {\n  const filesCount = files.length;\n  const totalSizeBytes = files.reduce((sum, f) => sum + f.size, 0);\n  const estimatedChunks = estimateChunksFromFiles(files);\n  const avgTokensPerChunk = 150;\n  const estimatedTokens = estimatedChunks * avgTokensPerChunk;\n  const estimatedCost = estimateCost(estimatedTokens, provider.modelInfo);\n\n  return {\n    filesCount,\n    totalSizeBytes,\n    estimatedChunks,\n    estimatedTokens,\n    estimatedCost,\n    provider: getProviderDisplayName(provider.provider),\n    model: provider.modelInfo.model,\n    isFree: provider.modelInfo.costPer1MTokens === 0,\n  };\n}\n\nexport function formatCostEstimate(estimate: CostEstimate): string {\n  const sizeFormatted = formatBytes(estimate.totalSizeBytes);\n  const filesFormatted = `${estimate.filesCount.toLocaleString()} files`;\n  const costFormatted = estimate.isFree\n    ? \"Free\"\n    : `~$${estimate.estimatedCost.toFixed(4)}`;\n\n  return `\n┌─────────────────────────────────────────────────────────────────┐\n│  📊 Indexing Estimate                                           │\n├─────────────────────────────────────────────────────────────────┤\n│                                                                 │\n│  Files to index:     ${filesFormatted.padEnd(40)}│\n│  Total size:         ${sizeFormatted.padEnd(40)}│\n│  Estimated chunks:   ${(\"~\" + estimate.estimatedChunks.toLocaleString() + \" chunks\").padEnd(40)}│\n│  Estimated tokens:   ${(\"~\" + estimate.estimatedTokens.toLocaleString() + \" tokens\").padEnd(40)}│\n│                                                                 │\n│  Provider: ${estimate.provider.padEnd(52)}│\n│  Model:    ${estimate.model.padEnd(52)}│\n│  Cost:     ${costFormatted.padEnd(52)}│\n│                                                                 │\n└─────────────────────────────────────────────────────────────────┘\n`;\n}\n\nexport function formatBytes(bytes: number): string {\n  if (bytes === 0) return \"0 B\";\n  const k = 1024;\n  const sizes = [\"B\", \"KB\", \"MB\", \"GB\"];\n  const i = Math.floor(Math.log(bytes) / Math.log(k));\n  return parseFloat((bytes / Math.pow(k, i)).toFixed(1)) + \" \" + sizes[i];\n}\n\n\nexport interface ConfirmationResult {\n  confirmed: boolean;\n  rememberChoice: boolean;\n}\n\nexport function formatConfirmationPrompt(): string {\n  return `\nProceed with indexing? [Y/n/always]\n\n  Y      - Index now\n  n      - Cancel\n  always - Index now and don't ask again for this project\n`;\n}\n\nexport function parseConfirmationResponse(response: string): ConfirmationResult {\n  const normalized = response.toLowerCase().trim();\n\n  if (normalized === \"\" || normalized === \"y\" || normalized === \"yes\") {\n    return { confirmed: true, rememberChoice: false };\n  }\n\n  if (normalized === \"always\" || normalized === \"a\") {\n    return { confirmed: true, rememberChoice: true };\n  }\n\n  return { confirmed: false, rememberChoice: false };\n}\n","import type { PrImpactResult } from \"../indexer/pr-impact-types.js\";\n\nexport function formatPrImpact(result: PrImpactResult): string {\n  const lines: string[] = [];\n\n  lines.push(`→ Files changed: ${result.changedFiles.length}`);\n  for (const file of result.changedFiles) {\n    lines.push(`  - ${file}`);\n  }\n\n  const directCount = result.directSymbols.length;\n  const transitiveCount = result.transitiveCallers.length;\n  const directionLabel = result.direction === 'callees' ? 'callees' : result.direction === 'both' ? 'reachable (callers + callees)' : 'callers';\n  lines.push(\n    `\\u2192 Symbols affected: ${result.totalAffected} (${directCount} direct, ${transitiveCount} transitive ${directionLabel})`,\n  );\n\n  if (directCount > 0) {\n    lines.push(\n      `  Direct: ${result.directSymbols.map((s) => `${s.name} (${s.kind})`).join(\", \")}`,\n    );\n  }\n\n  if (transitiveCount > 0) {\n    lines.push(\n      `  Transitive ${directionLabel}: ${result.transitiveCallers.map((s) => s.name).join(\", \")}`,\n    );\n  }\n  if (result.communities.length > 0) {\n    lines.push(\n      `→ Communities touched: ${result.communities.map((c) => c.label).join(\", \")}`,\n    );\n    for (const community of result.communities) {\n      lines.push(\n        `  - ${community.label}: ${community.symbolCount} symbols`,\n      );\n    }\n  } else {\n    lines.push(\"→ Communities touched: none\");\n  }\n\n  lines.push(`→ Risk: ${result.riskLevel} — ${result.riskReason}`);\n  if (result.hubNodes.length > 0) {\n    lines.push(\"  Hub nodes in change scope:\");\n    for (const hub of result.hubNodes) {\n      lines.push(`    - ${hub.name} (${hub.callerCount} callers) at ${hub.filePath}`);\n    }\n  }\n\n  if (result.conflictingPRs && result.conflictingPRs.length > 0) {\n    const conflictList = result.conflictingPRs.map(\n      (c) => `PR #${c.pr} (also touches ${c.overlappingCommunities.join(\", \")} community)`,\n    );\n    lines.push(`→ Potential conflicts with: ${conflictList.join(\", \")}`);\n  }\n\n  return lines.join(\"\\n\");\n}\n","import { existsSync, realpathSync, statSync } from \"fs\";\nimport * as path from \"path\";\nimport { loadProjectConfigLayer, materializeLocalProjectConfig } from \"../config/merger.js\";\nimport { parseConfig, type ParsedCodebaseIndexConfig } from \"../config/schema.js\";\nimport { getHostProjectIndexRelativePath, getHostProjectConfigRelativePath, resolveWorktreeFallbackProjectIndexPath } from \"../config/paths.js\";\nimport type { HostMode } from \"../config/host.js\";\nimport { Indexer } from \"../indexer/index.js\";\nimport { findKnowledgeBasePathIndex, hasMatchingKnowledgeBasePath, resolveKnowledgeBasePath } from \"./knowledge-base-paths.js\";\nimport { calculatePercentage, formatProgressTitle, formatStatus } from \"./utils.js\";\nimport type { LogLevel } from \"../config/schema.js\";\nimport type { LogEntry } from \"../utils/logger.js\";\nimport type { CostEstimate } from \"../utils/cost.js\";\nimport { getConfigPath, loadEditableConfig, loadRuntimeConfig, saveConfig } from \"./config-state.js\";\n\ntype IndexerCacheKey = `${HostMode}::${string}`;\n\ntype SearchResult = Awaited<ReturnType<Indexer[\"search\"]>>[number];\ntype CallGraphEdge = Awaited<ReturnType<Indexer[\"getCallers\"]>>[number];\ntype IndexStats = Awaited<ReturnType<Indexer[\"index\"]>>;\ntype StatusResult = Awaited<ReturnType<Indexer[\"getStatus\"]>>;\ntype HealthCheckResult = Awaited<ReturnType<Indexer[\"healthCheck\"]>>;\ntype PrImpactResult = Awaited<ReturnType<Indexer[\"getPrImpact\"]>>;\n\ntype ProgressCb = (title: string, metadata: Record<string, unknown>) => void | Promise<void>;\n\nconst indexerCache = new Map<IndexerCacheKey, Indexer>();\nconst configCache = new Map<IndexerCacheKey, ParsedCodebaseIndexConfig>();\nconst defaultProjectRoots = new Map<HostMode, string>();\n\nfunction getProjectRoot(projectRoot: string | undefined, host: HostMode): string {\n  if (projectRoot) {\n    return projectRoot;\n  }\n\n  const root = defaultProjectRoots.get(host);\n  if (!root) {\n    throw new Error(\"Codebase index tools not initialized. Plugin may not be loaded correctly.\");\n  }\n\n  return root;\n}\n\nfunction getIndexerCacheKey(projectRoot: string, host: HostMode): IndexerCacheKey {\n  return `${host}::${projectRoot}`;\n}\n\nfunction getOrCreateIndexer(projectRoot: string, host: HostMode): Indexer {\n  const key = getIndexerCacheKey(projectRoot, host);\n  const cached = indexerCache.get(key);\n  if (cached) {\n    return cached;\n  }\n\n  const config = parseConfig(loadRuntimeConfig(projectRoot, host));\n  const indexer = new Indexer(projectRoot, config, host);\n  indexerCache.set(key, indexer);\n  configCache.set(key, config);\n  return indexer;\n}\n\nexport function initializeTools(projectRoot: string, config: ParsedCodebaseIndexConfig, host: HostMode = \"opencode\"): void {\n  defaultProjectRoots.set(host, projectRoot);\n  const key = getIndexerCacheKey(projectRoot, host);\n  const indexer = new Indexer(projectRoot, config, host);\n  indexerCache.set(key, indexer);\n  configCache.set(key, config);\n}\n\nexport function getSharedIndexer(host: HostMode = \"opencode\"): Indexer {\n  return getIndexerForProject(undefined, host);\n}\n\nexport function getIndexerForProject(projectRoot: string | undefined, host: HostMode = \"opencode\"): Indexer {\n  const root = getProjectRoot(projectRoot, host);\n  return getOrCreateIndexer(root, host);\n}\n\nexport function refreshIndexerForDirectory(\n  projectRoot: string,\n  host: HostMode = \"opencode\",\n  config: ParsedCodebaseIndexConfig = parseConfig(loadRuntimeConfig(projectRoot, host)),\n): void {\n  const key = getIndexerCacheKey(projectRoot, host);\n  const indexer = new Indexer(projectRoot, config, host);\n  indexerCache.set(key, indexer);\n  configCache.set(key, config);\n}\n\nexport function shouldForceLocalizeProjectIndex(projectRoot: string | undefined, host: HostMode = \"opencode\"): boolean {\n  const root = getProjectRoot(projectRoot, host);\n  const localIndexPath = path.join(root, getHostProjectIndexRelativePath(host));\n  if (existsSync(localIndexPath)) {\n    return false;\n  }\n  const inheritedIndexPath = resolveWorktreeFallbackProjectIndexPath(root, host);\n  return inheritedIndexPath !== null;\n}\n\nexport async function searchCodebase(\n  projectRoot: string | undefined,\n  host: HostMode,\n  query: string,\n  options: {\n    limit?: number;\n    fileType?: string;\n    directory?: string;\n    chunkType?: string;\n    contextLines?: number;\n    metadataOnly?: boolean;\n    definitionIntent?: boolean;\n  } = {},\n): Promise<SearchResult[]> {\n  const indexer = getIndexerForProject(projectRoot, host);\n  return indexer.search(query, options.limit, {\n    fileType: options.fileType,\n    directory: options.directory,\n    chunkType: options.chunkType,\n    contextLines: options.contextLines,\n    metadataOnly: options.metadataOnly,\n    definitionIntent: options.definitionIntent,\n  });\n}\n\nexport async function findSimilarCode(\n  projectRoot: string | undefined,\n  host: HostMode,\n  code: string,\n  options: {\n    limit?: number;\n    fileType?: string;\n    directory?: string;\n    chunkType?: string;\n    excludeFile?: string;\n  } = {},\n): Promise<Awaited<ReturnType<Indexer[\"findSimilar\"]>>> {\n  const indexer = getIndexerForProject(projectRoot, host);\n  return indexer.findSimilar(code, options.limit, {\n    fileType: options.fileType,\n    directory: options.directory,\n    chunkType: options.chunkType,\n    excludeFile: options.excludeFile,\n  });\n}\n\nexport async function implementationLookup(\n  projectRoot: string | undefined,\n  host: HostMode,\n  query: string,\n  options: {\n    limit?: number;\n    fileType?: string;\n    directory?: string;\n  } = {},\n): Promise<SearchResult[]> {\n  const indexer = getIndexerForProject(projectRoot, host);\n  return indexer.search(query, options.limit, {\n    fileType: options.fileType,\n    directory: options.directory,\n    definitionIntent: true,\n  });\n}\n\nexport async function getCallGraphData(\n  projectRoot: string | undefined,\n  host: HostMode,\n  params: {\n    name: string;\n    direction?: \"callers\" | \"callees\";\n    symbolId?: string;\n    relationshipType?: \"Call\" | \"MethodCall\" | \"Constructor\" | \"Import\" | \"Inherits\" | \"Implements\";\n  },\n): Promise<{ direction: \"callers\" | \"callees\"; callers: CallGraphEdge[]; callees: CallGraphEdge[]; }> {\n  const indexer = getIndexerForProject(projectRoot, host);\n  if (params.direction === \"callees\") {\n    if (!params.symbolId) {\n      return { direction: \"callees\", callees: [], callers: [] };\n    }\n    const callees = await indexer.getCallees(params.symbolId, params.relationshipType);\n    return { direction: \"callees\", callees, callers: [] };\n  }\n\n  const callers = await indexer.getCallers(params.name, params.relationshipType);\n  return { direction: \"callers\", callers, callees: [] };\n}\n\nexport async function getCallGraphPath(\n  projectRoot: string | undefined,\n  host: HostMode,\n  from: string,\n  to: string,\n  maxDepth?: number,\n): Promise<Awaited<ReturnType<Indexer[\"findCallPath\"]>>> {\n  const indexer = getIndexerForProject(projectRoot, host);\n  return indexer.findCallPath(from, to, maxDepth);\n}\n\nexport async function runIndexCodebase(\n  projectRoot: string | undefined,\n  host: HostMode,\n  args: { force?: boolean; estimateOnly?: boolean; verbose?: boolean },\n  onProgress?: ProgressCb,\n): Promise<{ kind: \"estimate\"; estimate: CostEstimate } | { kind: \"stats\"; stats: IndexStats }> {\n  const root = getProjectRoot(projectRoot, host);\n  const key = getIndexerCacheKey(root, host);\n  const cachedConfig = configCache.get(key);\n  let indexer = getIndexerForProject(root, host);\n\n  if (args.estimateOnly) {\n    return { kind: \"estimate\", estimate: await indexer.estimateCost() };\n  }\n\n  if (args.force) {\n    if (shouldForceLocalizeProjectIndex(root, host)) {\n      materializeLocalProjectConfig(root, loadProjectConfigLayer(root, host), host);\n      refreshIndexerForDirectory(root, host, cachedConfig);\n      indexer = getIndexerForProject(root, host);\n    }\n    await indexer.clearIndex();\n    refreshIndexerForDirectory(root, host, cachedConfig);\n    indexer = getIndexerForProject(root, host);\n  }\n\n  const stats = await indexer.index((progress) => {\n    if (onProgress) {\n      return onProgress(formatProgressTitle(progress), {\n        phase: progress.phase,\n        filesProcessed: progress.filesProcessed,\n        totalFiles: progress.totalFiles,\n        chunksProcessed: progress.chunksProcessed,\n        totalChunks: progress.totalChunks,\n        percentage: calculatePercentage(progress),\n      });\n    }\n    return Promise.resolve();\n  });\n\n  return { kind: \"stats\", stats };\n}\n\nexport async function getIndexStatus(projectRoot: string | undefined, host: HostMode): Promise<StatusResult> {\n  const indexer = getIndexerForProject(projectRoot, host);\n  return indexer.getStatus();\n}\n\nexport async function getIndexHealthCheck(projectRoot: string | undefined, host: HostMode): Promise<HealthCheckResult> {\n  const indexer = getIndexerForProject(projectRoot, host);\n  return indexer.healthCheck();\n}\n\nexport async function getPrImpact(\n  projectRoot: string | undefined,\n  host: HostMode,\n  params: {\n    pr?: number;\n    branch?: string;\n    maxDepth?: number;\n    hubThreshold?: number;\n    checkConflicts?: boolean;\n    direction?: \"callers\" | \"callees\" | \"both\";\n  },\n): Promise<PrImpactResult> {\n  const indexer = getIndexerForProject(projectRoot, host);\n  return indexer.getPrImpact({\n    pr: params.pr,\n    branch: params.branch,\n    maxDepth: params.maxDepth,\n    hubThreshold: params.hubThreshold,\n    checkConflicts: params.checkConflicts,\n    direction: params.direction,\n  });\n}\n\nexport async function getIndexMetrics(projectRoot: string | undefined, host: HostMode): Promise<{ enabled: boolean; metricsEnabled: boolean; text: string }> {\n  const indexer = getIndexerForProject(projectRoot, host);\n  const logger = indexer.getLogger();\n\n  if (!logger.isEnabled()) {\n    return {\n      enabled: false,\n      metricsEnabled: false,\n      text: \"Debug mode is disabled. Enable it in your config:\\n\\n```json\\n{\\n  \\\"debug\\\": {\\n    \\\"enabled\\\": true,\\n    \\\"metrics\\\": true\\n  }\\n}\\n```\",\n    };\n  }\n\n  if (!logger.isMetricsEnabled()) {\n    return {\n      enabled: true,\n      metricsEnabled: false,\n      text: \"Metrics collection is disabled. Enable it in your config:\\n\\n```json\\n{\\n  \\\"debug\\\": {\\n    \\\"enabled\\\": true,\\n    \\\"metrics\\\": true\\n  }\\n}\\n```\",\n    };\n  }\n\n  return {\n    enabled: true,\n    metricsEnabled: true,\n    text: logger.formatMetrics(),\n  };\n}\n\nexport async function getIndexLogs(\n  projectRoot: string | undefined,\n  host: HostMode,\n  args: { limit?: number; category?: string; level?: LogLevel },\n): Promise<{ kind: \"disabled\"; text: string } | { kind: \"entries\"; text: string }> {\n  const indexer = getIndexerForProject(projectRoot, host);\n  const logger = indexer.getLogger();\n\n  if (!logger.isEnabled()) {\n    return {\n      kind: \"disabled\",\n      text: \"Debug mode is disabled. Enable it in your config:\\n\\n```json\\n{\\n  \\\"debug\\\": {\\n    \\\"enabled\\\": true\\n  }\\n}\\n```\",\n    };\n  }\n\n  let logs: LogEntry[];\n  if (args.category) {\n    logs = logger.getLogsByCategory(args.category, args.limit);\n  } else if (args.level) {\n    logs = logger.getLogsByLevel(args.level, args.limit);\n  } else {\n    logs = logger.getLogs(args.limit);\n  }\n\n  if (logs.length === 0) {\n    return {\n      kind: \"entries\",\n      text: \"No logs recorded yet. Logs are captured during indexing and search operations.\",\n    };\n  }\n\n  const text = logs.map((entry) => {\n    const dataStr = entry.data ? ` ${JSON.stringify(entry.data)}` : \"\";\n    return `[${entry.timestamp}] [${entry.level.toUpperCase()}] [${entry.category}] ${entry.message}${dataStr}`;\n  }).join(\"\\n\");\n\n  return { kind: \"entries\", text };\n}\n\nexport function addKnowledgeBase(\n  projectRoot: string | undefined,\n  host: HostMode,\n  knowledgeBasePath: string,\n): string {\n  const root = getProjectRoot(projectRoot, host);\n  const inputPath = knowledgeBasePath.trim();\n  const normalizedPath = path.resolve(\n    path.isAbsolute(inputPath)\n      ? inputPath\n      : resolveKnowledgeBasePath(inputPath, root),\n  );\n\n  if (!existsSync(normalizedPath)) {\n    return `Error: Directory does not exist: ${normalizedPath}`;\n  }\n\n  let realPath: string;\n  try {\n    realPath = realpathSync(normalizedPath);\n  } catch {\n    return `Error: Cannot resolve path: ${normalizedPath}`;\n  }\n\n  const blockedPrefixes = [\n    \"/etc\",\n    \"/proc\",\n    \"/sys\",\n    \"/dev\",\n    \"/boot\",\n    \"/root\",\n    \"/var/run\",\n    \"/var/log\",\n  ];\n  const homeDir = process.platform === \"win32\" ? process.env.USERPROFILE ?? \"\" : process.env.HOME ?? \"\";\n  const sensitiveDotDirs = [\n    \".ssh\",\n    \".gnupg\",\n    \".aws\",\n    \".config/gcloud\",\n    \".docker\",\n    \".kube\",\n  ];\n\n  for (const prefix of blockedPrefixes) {\n    if (realPath === prefix || realPath.startsWith(`${prefix}/`)) {\n      return `Error: Adding sensitive directory as knowledge base is not allowed: ${normalizedPath}`;\n    }\n  }\n\n  for (const dotDir of sensitiveDotDirs) {\n    const sensitiveDir = path.join(homeDir, dotDir);\n    if (sensitiveDir && (realPath === sensitiveDir || realPath.startsWith(`${sensitiveDir}/`))) {\n      return `Error: Adding sensitive directory as knowledge base is not allowed: ${normalizedPath}`;\n    }\n  }\n\n  try {\n    const stat = statSync(normalizedPath);\n    if (!stat.isDirectory()) {\n      return `Error: Path is not a directory: ${normalizedPath}`;\n    }\n  } catch (error: unknown) {\n    return `Error: Cannot access directory: ${normalizedPath} - ${error instanceof Error ? error.message : String(error)}`;\n  }\n\n  const config = loadEditableConfig(root, host);\n  const knowledgeBases: string[] = Array.isArray(config.knowledgeBases) ? (config.knowledgeBases as string[]) : [];\n  const alreadyExists = hasMatchingKnowledgeBasePath(knowledgeBases, normalizedPath, root);\n\n  if (alreadyExists) {\n    return `Knowledge base already configured: ${normalizedPath}`;\n  }\n\n  knowledgeBases.push(normalizedPath);\n  config.knowledgeBases = knowledgeBases;\n  saveConfig(root, config, host);\n  refreshIndexerForDirectory(root, host);\n\n  let result = `${normalizedPath}\\n`;\n  result += `Total knowledge bases: ${knowledgeBases.length}\\n`;\n  result += `Config path: ${getConfigPath(root, host)}\\n`;\n  result += `\\nRun /index to rebuild the index with the new knowledge base.`;\n  return result;\n}\n\nexport function listKnowledgeBases(projectRoot: string | undefined, host: HostMode): string {\n  const root = getProjectRoot(projectRoot, host);\n  const config = loadRuntimeConfig(root, host);\n  const knowledgeBases: string[] = Array.isArray(config.knowledgeBases) ? (config.knowledgeBases as string[]) : [];\n\n  if (knowledgeBases.length === 0) {\n    return \"No knowledge bases configured. Use add_knowledge_base to add folders.\";\n  }\n\n  let result = `Knowledge Bases (${knowledgeBases.length}):\\n\\n`;\n\n  for (let i = 0; i < knowledgeBases.length; i++) {\n    const kb = knowledgeBases[i];\n    const resolvedPath = resolveKnowledgeBasePath(kb, root);\n    const exists = existsSync(resolvedPath);\n\n    result += `[${i + 1}] ${kb}\\n`;\n    result += `    Resolved: ${resolvedPath}\\n`;\n    result += `    Status: ${exists ? \"Exists\" : \"NOT FOUND\"}\\n`;\n\n    if (exists) {\n      try {\n        const stat = statSync(resolvedPath);\n        result += `    Type: ${stat.isDirectory() ? \"Directory\" : \"File\"}\\n`;\n      } catch {\n        // ignore\n      }\n    }\n\n    result += \"\\n\";\n  }\n\n  const hasHostConfig = existsSync(path.join(root, getHostProjectConfigRelativePath(host)));\n  if (hasHostConfig) {\n    result += `\nConfig sources: 1 file(s).`;\n  }\n\n  result += `\\nConfig file: ${getConfigPath(root, host)}`;\n  return result;\n}\n\nexport function removeKnowledgeBase(\n  projectRoot: string | undefined,\n  host: HostMode,\n  knowledgeBasePath: string,\n): string {\n  const root = getProjectRoot(projectRoot, host);\n  const config = loadEditableConfig(root, host);\n  const knowledgeBases: string[] = Array.isArray(config.knowledgeBases) ? (config.knowledgeBases as string[]) : [];\n  const index = findKnowledgeBasePathIndex(knowledgeBases, knowledgeBasePath, root);\n\n  if (index === -1) {\n    return `Knowledge base not found: ${knowledgeBasePath}`;\n  }\n\n  const removed = knowledgeBases.splice(index, 1)[0];\n  config.knowledgeBases = knowledgeBases;\n  saveConfig(root, config, host);\n  refreshIndexerForDirectory(root, host);\n\n  let result = `Removed: ${removed}\\n\\n`;\n  result += `Remaining knowledge bases: ${knowledgeBases.length}\\n`;\n  result += `Config saved to: ${getConfigPath(root, host)}\\n`;\n  result += `\\nRun /index to rebuild the index without the removed knowledge base.`;\n\n  return result;\n}\n\nexport { formatStatus };\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"fs\";\nimport * as path from \"path\";\n\nimport { resolveGlobalConfigPath, resolveProjectConfigPath, resolveWritableProjectConfigPath } from \"./paths.js\";\nimport type { HostMode } from \"./host.js\";\nimport { resolveInheritedKnowledgeBaseEntries } from \"./rebase.js\";\n\nconst PROJECT_OVERRIDE_KEYS = [\n  \"embeddingProvider\",\n  \"customProvider\",\n  \"embeddingModel\",\n  \"reranker\",\n  \"include\",\n  \"exclude\",\n  \"indexing\",\n  \"search\",\n  \"debug\",\n  \"scope\",\n] as const;\n\nconst MERGE_ARRAY_KEYS = [\"knowledgeBases\", \"additionalInclude\"] as const;\n\ntype ProjectOverrideKey = (typeof PROJECT_OVERRIDE_KEYS)[number];\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n  return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isStringArray(value: unknown): value is string[] {\n  return Array.isArray(value) && value.every((item) => typeof item === \"string\");\n}\n\nfunction applyProjectOverride(\n  merged: Record<string, unknown>,\n  normalizedProjectConfig: Record<string, unknown>,\n  globalConfig: Record<string, unknown>,\n  key: ProjectOverrideKey,\n): void {\n  if (key in normalizedProjectConfig) {\n    merged[key] = normalizedProjectConfig[key];\n    return;\n  }\n\n  if (key in globalConfig) {\n    merged[key] = globalConfig[key];\n  }\n}\n\nfunction mergeUniqueStringArray(values: unknown[]): string[] {\n  return [...new Set(values.map((value) => String(value).trim()))];\n}\n\nfunction normalizeKnowledgeBasePath(value: unknown): string {\n  let normalized = path.normalize(String(value).trim());\n  const root = path.parse(normalized).root;\n\n  while (normalized.length > root.length && /[\\\\/]$/.test(normalized)) {\n    normalized = normalized.slice(0, -1);\n  }\n\n  return normalized;\n}\n\nfunction mergeKnowledgeBasePaths(values: unknown[]): string[] {\n  return [...new Set(values.map((value) => normalizeKnowledgeBasePath(value)).filter((value) => value.length > 0))];\n}\n\nfunction validateConfigLayerShape(rawConfig: unknown, filePath: string): Record<string, unknown> {\n  if (!isRecord(rawConfig)) {\n    throw new Error(`Config file ${filePath} must contain a JSON object at the root.`);\n  }\n\n  if (rawConfig.knowledgeBases !== undefined && !isStringArray(rawConfig.knowledgeBases)) {\n    throw new Error(`Config file ${filePath} field 'knowledgeBases' must be an array of strings.`);\n  }\n  if (rawConfig.additionalInclude !== undefined && !isStringArray(rawConfig.additionalInclude)) {\n    throw new Error(`Config file ${filePath} field 'additionalInclude' must be an array of strings.`);\n  }\n  if (rawConfig.include !== undefined && !isStringArray(rawConfig.include)) {\n    throw new Error(`Config file ${filePath} field 'include' must be an array of strings.`);\n  }\n  if (rawConfig.exclude !== undefined && !isStringArray(rawConfig.exclude)) {\n    throw new Error(`Config file ${filePath} field 'exclude' must be an array of strings.`);\n  }\n\n  for (const section of [\"customProvider\", \"indexing\", \"search\", \"debug\", \"reranker\"] as const) {\n    const value = rawConfig[section];\n    if (value !== undefined && !isRecord(value)) {\n      throw new Error(`Config file ${filePath} field '${section}' must be an object.`);\n    }\n  }\n\n  return rawConfig;\n}\n\nfunction loadJsonFile(filePath: string): unknown {\n  if (!existsSync(filePath)) {\n    return null;\n  }\n\n  try {\n    const content = readFileSync(filePath, \"utf-8\");\n    return validateConfigLayerShape(JSON.parse(content), filePath);\n  } catch (error: unknown) {\n    if (error instanceof Error && error.message.startsWith(\"Config file \")) {\n      throw error;\n    }\n    const message = error instanceof Error ? error.message : String(error);\n    throw new Error(`Failed to load config file ${filePath}: ${message}`);\n  }\n\n}\n\nexport function loadConfigFile(filePath: string): unknown {\n  return loadJsonFile(filePath);\n}\n\nexport function materializeLocalProjectConfig(\n  projectRoot: string,\n  config: unknown,\n  host: HostMode = \"opencode\",\n): string {\n  const localConfigPath = resolveWritableProjectConfigPath(projectRoot, host);\n  mkdirSync(path.dirname(localConfigPath), { recursive: true });\n  writeFileSync(localConfigPath, JSON.stringify(config, null, 2), \"utf-8\");\n  return localConfigPath;\n}\n\nexport function loadProjectConfigLayer(projectRoot: string, host: HostMode = \"opencode\"): Record<string, unknown> {\n  const projectConfigPath = resolveProjectConfigPath(projectRoot, host);\n  const projectConfig = loadJsonFile(projectConfigPath) as Record<string, unknown> | null;\n\n  if (!projectConfig) {\n    return {};\n  }\n\n  const normalizedConfig: Record<string, unknown> = { ...projectConfig };\n  const projectConfigBaseDir = path.dirname(path.dirname(projectConfigPath));\n\n  if (Array.isArray(normalizedConfig.knowledgeBases)) {\n    normalizedConfig.knowledgeBases = resolveInheritedKnowledgeBaseEntries(\n      normalizedConfig.knowledgeBases,\n      projectConfigBaseDir,\n      projectRoot,\n    );\n  }\n\n  return normalizedConfig;\n}\n\n/**\n * Loads and merges global and project configs.\n * \n * Merge rules:\n * - Global config is the base\n * - For most fields: project overrides global if set, otherwise load global (fallback)\n * - For knowledgeBases: merge arrays (union, deduplicated)\n * - For additionalInclude: merge arrays (union, deduplicated)\n * - For include/exclude: project overrides global if set, otherwise load global\n */\nexport function loadMergedConfig(projectRoot: string, host: HostMode = \"opencode\"): unknown {\n  const globalConfigPath = resolveGlobalConfigPath(host);\n  const projectConfigPath = resolveProjectConfigPath(projectRoot, host);\n  let globalConfig: Record<string, unknown> | null = null;\n  let globalConfigError: Error | null = null;\n\n  try {\n    globalConfig = loadJsonFile(globalConfigPath) as Record<string, unknown> | null;\n  } catch (error: unknown) {\n    globalConfigError = error instanceof Error ? error : new Error(String(error));\n  }\n\n  const projectConfig = loadJsonFile(projectConfigPath) as Record<string, unknown> | null;\n  const normalizedProjectConfig = loadProjectConfigLayer(projectRoot, host);\n\n  if (globalConfigError) {\n    if (!projectConfig) {\n      throw globalConfigError;\n    }\n    globalConfig = null;\n  }\n\n  if (!globalConfig && !projectConfig) {\n    return {};\n  }\n\n  if (!projectConfig && globalConfig) {\n    return globalConfig;\n  }\n\n  if (!globalConfig && projectConfig) {\n    return normalizedProjectConfig;\n  }\n\n  if (!globalConfig || !projectConfig) {\n    return globalConfig ?? normalizedProjectConfig;\n  }\n\n\n  const merged: Record<string, unknown> = { ...globalConfig };\n\n  for (const key of PROJECT_OVERRIDE_KEYS) {\n    applyProjectOverride(merged, normalizedProjectConfig, globalConfig, key);\n  }\n\n  // For other config sections: project overrides if set, otherwise use global\n  if (projectConfig) {\n    for (const key of Object.keys(projectConfig)) {\n      if (\n        PROJECT_OVERRIDE_KEYS.includes(key as ProjectOverrideKey) ||\n        MERGE_ARRAY_KEYS.includes(key as (typeof MERGE_ARRAY_KEYS)[number])\n      ) {\n        continue; // Already handled above\n      }\n      merged[key] = normalizedProjectConfig[key];\n    }\n  }\n\n  // For knowledgeBases: merge arrays (union, deduplicated)\n  const globalKbs = globalConfig && Array.isArray(globalConfig.knowledgeBases) ? globalConfig.knowledgeBases : [];\n  const projectKbs = projectConfig\n    ? (Array.isArray(normalizedProjectConfig.knowledgeBases) ? normalizedProjectConfig.knowledgeBases as string[] : [])\n    : [];\n  const allKbs = [...globalKbs, ...projectKbs];\n  merged.knowledgeBases = mergeKnowledgeBasePaths(allKbs);\n\n  // For additionalInclude: merge arrays (union, deduplicated)\n  const globalAdditional = globalConfig && Array.isArray(globalConfig.additionalInclude) ? globalConfig.additionalInclude : [];\n  const projectAdditional = projectConfig && Array.isArray(projectConfig.additionalInclude) ? projectConfig.additionalInclude : [];\n  const allAdditional = [...globalAdditional, ...projectAdditional];\n  merged.additionalInclude = mergeUniqueStringArray(allAdditional);\n\n  return merged;\n}\n","import { existsSync } from \"fs\";\nimport * as os from \"os\";\nimport * as path from \"path\";\n\nimport type { HostMode } from \"./host.js\";\nimport { resolveWorktreeMainRepoRoot } from \"../git/index.js\";\n\nconst OPENCODE_PROJECT_CONFIG_RELATIVE_PATH = path.join(\".opencode\", \"codebase-index.json\");\nconst OPENCODE_PROJECT_INDEX_RELATIVE_PATH = path.join(\".opencode\", \"index\");\nconst CODEBASE_INDEX_DIR = \".codebase-index\";\nconst CODEBASE_PROJECT_CONFIG_RELATIVE_PATH = path.join(CODEBASE_INDEX_DIR, \"config.json\");\nconst CODEBASE_PROJECT_INDEX_RELATIVE_PATH = path.join(CODEBASE_INDEX_DIR, \"index\");\nconst CLAUDE_DIR = \".claude\";\nconst CLAUDE_PROJECT_CONFIG_RELATIVE_PATH = path.join(CLAUDE_DIR, \"codebase-index.json\");\nconst CLAUDE_PROJECT_INDEX_RELATIVE_PATH = path.join(CLAUDE_DIR, \"index\");\n\nfunction getProjectConfigRelativePath(host: HostMode): string {\n  switch (host) {\n    case \"opencode\":\n      return OPENCODE_PROJECT_CONFIG_RELATIVE_PATH;\n    case \"claude\":\n      return CLAUDE_PROJECT_CONFIG_RELATIVE_PATH;\n    default:\n      return CODEBASE_PROJECT_CONFIG_RELATIVE_PATH;\n  }\n}\n\nfunction getProjectIndexRelativePath(host: HostMode): string {\n  switch (host) {\n    case \"opencode\":\n      return OPENCODE_PROJECT_INDEX_RELATIVE_PATH;\n    case \"claude\":\n      return CLAUDE_PROJECT_INDEX_RELATIVE_PATH;\n    default:\n      return CODEBASE_PROJECT_INDEX_RELATIVE_PATH;\n  }\n}\n\nfunction resolveWorktreeFallbackPath(projectRoot: string, relativePath: string): string | null {\n  const mainRepoRoot = resolveWorktreeMainRepoRoot(projectRoot);\n  if (!mainRepoRoot) {\n    return null;\n  }\n\n  const fallbackPath = path.join(mainRepoRoot, relativePath);\n  return existsSync(fallbackPath) ? fallbackPath : null;\n}\n\nexport function resolveWorktreeFallbackProjectIndexPath(projectRoot: string, host: HostMode): string | null {\n  const inheritedHostPath = resolveWorktreeFallbackPath(projectRoot, getProjectIndexRelativePath(host));\n  if (inheritedHostPath) {\n    return inheritedHostPath;\n  }\n\n  if (host !== \"opencode\") {\n    return resolveWorktreeFallbackPath(projectRoot, OPENCODE_PROJECT_INDEX_RELATIVE_PATH);\n  }\n\n  return null;\n}\n\nexport function getHostProjectConfigRelativePath(host: HostMode): string {\n  return getProjectConfigRelativePath(host);\n}\n\nexport function getHostProjectIndexRelativePath(host: HostMode): string {\n  return getProjectIndexRelativePath(host);\n}\n\nfunction hasHostProjectConfig(projectRoot: string, host: HostMode): boolean {\n  return existsSync(path.join(projectRoot, getProjectConfigRelativePath(host)));\n}\n\nexport function getGlobalIndexPath(host: HostMode = \"opencode\"): string {\n  switch (host) {\n    case \"opencode\":\n      return path.join(os.homedir(), \".opencode\", \"global-index\");\n    case \"claude\":\n      return path.join(os.homedir(), \".claude\", \"global-index\");\n    default:\n      return path.join(os.homedir(), \".codebase-index\", \"global-index\");\n  }\n}\n\nexport function getGlobalConfigPath(host: HostMode = \"opencode\"): string {\n  switch (host) {\n    case \"opencode\":\n      return path.join(os.homedir(), \".config\", \"opencode\", \"codebase-index.json\");\n    case \"claude\":\n      return path.join(os.homedir(), \".claude\", \"codebase-index.json\");\n    default:\n      return path.join(os.homedir(), \".config\", \"codebase-index\", \"config.json\");\n  }\n}\n\nexport function resolveGlobalConfigPath(host: HostMode = \"opencode\"): string {\n  const hostConfigPath = getGlobalConfigPath(host);\n  if (existsSync(hostConfigPath)) {\n    return hostConfigPath;\n  }\n\n  if (host !== \"opencode\") {\n    const legacyConfigPath = getGlobalConfigPath(\"opencode\");\n    if (existsSync(legacyConfigPath)) {\n      return legacyConfigPath;\n    }\n  }\n\n  return hostConfigPath;\n}\n\nexport function resolveGlobalIndexPath(host: HostMode = \"opencode\"): string {\n  const hostIndexPath = getGlobalIndexPath(host);\n  if (existsSync(hostIndexPath)) {\n    return hostIndexPath;\n  }\n\n  if (host !== \"opencode\") {\n    const legacyIndexPath = getGlobalIndexPath(\"opencode\");\n    if (existsSync(legacyIndexPath)) {\n      return legacyIndexPath;\n    }\n  }\n\n  return hostIndexPath;\n}\n\nexport function resolveProjectConfigPath(projectRoot: string, host: HostMode = \"opencode\"): string {\n  const hostConfigPath = path.join(projectRoot, getProjectConfigRelativePath(host));\n  if (existsSync(hostConfigPath)) {\n    return hostConfigPath;\n  }\n\n  if (host !== \"opencode\") {\n    const legacyConfigPath = path.join(projectRoot, OPENCODE_PROJECT_CONFIG_RELATIVE_PATH);\n    if (existsSync(legacyConfigPath)) {\n      return legacyConfigPath;\n    }\n  }\n\n  const hostFallback = resolveWorktreeFallbackPath(projectRoot, getProjectConfigRelativePath(host));\n  if (hostFallback) {\n    return hostFallback;\n  }\n\n  if (host !== \"opencode\") {\n    const legacyFallback = resolveWorktreeFallbackPath(projectRoot, OPENCODE_PROJECT_CONFIG_RELATIVE_PATH);\n    if (legacyFallback) {\n      return legacyFallback;\n    }\n  }\n\n  return hostConfigPath;\n}\n\nexport function resolveWritableProjectConfigPath(projectRoot: string, host: HostMode = \"opencode\"): string {\n  return path.join(projectRoot, getProjectConfigRelativePath(host));\n}\n\nexport function resolveProjectIndexPath(\n  projectRoot: string,\n  scope: \"project\" | \"global\",\n  host: HostMode = \"opencode\",\n): string {\n  if (scope === \"global\") {\n    return resolveGlobalIndexPath(host);\n  }\n\n  const localIndexPath = path.join(projectRoot, getProjectIndexRelativePath(host));\n  if (existsSync(localIndexPath)) {\n    return localIndexPath;\n  }\n\n  if (host !== \"opencode\") {\n    const legacyIndexPath = path.join(projectRoot, OPENCODE_PROJECT_INDEX_RELATIVE_PATH);\n    if (existsSync(legacyIndexPath) && !hasHostProjectConfig(projectRoot, host)) {\n      return legacyIndexPath;\n    }\n  }\n\n  if (hasHostProjectConfig(projectRoot, host)) {\n    return localIndexPath;\n  }\n\n  const hostFallback = resolveWorktreeFallbackPath(projectRoot, getProjectIndexRelativePath(host));\n  if (hostFallback) {\n    return hostFallback;\n  }\n\n  if (host !== \"opencode\") {\n    const legacyFallback = resolveWorktreeFallbackPath(projectRoot, OPENCODE_PROJECT_INDEX_RELATIVE_PATH);\n    if (legacyFallback) {\n      return legacyFallback;\n    }\n  }\n\n  return localIndexPath;\n}\n","import { existsSync, readFileSync, statSync } from \"fs\";\nimport * as path from \"path\";\nimport { collectBranchRefs, readPackedRefs, resolveCommonGitDir, tryResolveRefCommit } from \"./refs.js\";\n\nexport function resolveWorktreeMainRepoRoot(repoRoot: string): string | null {\n  const gitDir = resolveGitDir(repoRoot);\n  if (!gitDir) {\n    return null;\n  }\n\n  const commonGitDir = resolveCommonGitDir(gitDir);\n  if (commonGitDir === gitDir || path.basename(commonGitDir) !== \".git\") {\n    return null;\n  }\n\n  const mainRepoRoot = path.dirname(commonGitDir);\n  if (!existsSync(mainRepoRoot)) {\n    return null;\n  }\n\n  return path.resolve(mainRepoRoot) === path.resolve(repoRoot) ? null : mainRepoRoot;\n}\n\n/**\n * Resolves the actual git directory path.\n * \n * In a normal repo, `.git` is a directory containing HEAD, refs, etc.\n * In a worktree, `.git` is a file containing `gitdir: /path/to/actual/git/dir`.\n * \n * @returns The resolved git directory path, or null if not a git repo\n */\nexport function resolveGitDir(repoRoot: string): string | null {\n  const gitPath = path.join(repoRoot, \".git\");\n  \n  if (!existsSync(gitPath)) {\n    return null;\n  }\n  \n  try {\n    const stat = statSync(gitPath);\n    \n    if (stat.isDirectory()) {\n      return gitPath;\n    }\n    \n    if (stat.isFile()) {\n      const content = readFileSync(gitPath, \"utf-8\").trim();\n      const match = content.match(/^gitdir:\\s*(.+)$/);\n      if (match) {\n        const gitdir = match[1];\n        // Handle relative paths\n        const resolvedPath = path.isAbsolute(gitdir)\n          ? gitdir\n          : path.resolve(repoRoot, gitdir);\n        \n        if (existsSync(resolvedPath)) {\n          return resolvedPath;\n        }\n      }\n    }\n  } catch {\n    // Ignore errors (permission issues, etc.)\n  }\n  \n  return null;\n}\n\nexport function isGitRepo(dir: string): boolean {\n  return resolveGitDir(dir) !== null;\n}\n\nexport function getCurrentBranch(repoRoot: string): string | null {\n  const gitDir = resolveGitDir(repoRoot);\n  if (!gitDir) {\n    return null;\n  }\n  \n  const headPath = path.join(gitDir, \"HEAD\");\n  \n  if (!existsSync(headPath)) {\n    return null;\n  }\n\n  try {\n    const headContent = readFileSync(headPath, \"utf-8\").trim();\n    \n    const match = headContent.match(/^ref: refs\\/heads\\/(.+)$/);\n    if (match) {\n      return match[1];\n    }\n\n    if (/^[0-9a-f]{40}$/i.test(headContent)) {\n      return headContent.slice(0, 7);\n    }\n\n    return null;\n  } catch {\n    return null;\n  }\n}\n\nexport function getCurrentCommit(repoRoot: string): string | null {\n  const gitDir = resolveGitDir(repoRoot);\n  if (!gitDir) {\n    return null;\n  }\n  const refStoreDir = resolveCommonGitDir(gitDir);\n\n  const headPath = path.join(gitDir, \"HEAD\");\n  if (!existsSync(headPath)) {\n    return null;\n  }\n\n  try {\n    const headContent = readFileSync(headPath, \"utf-8\").trim();\n\n    if (/^[0-9a-f]{40}$/i.test(headContent)) {\n      return headContent;\n    }\n\n    const refMatch = headContent.match(/^ref:\\s*(.+)$/);\n    if (!refMatch) {\n      return null;\n    }\n\n    return tryResolveRefCommit(refStoreDir, refMatch[1]);\n  } catch {\n    return null;\n  }\n}\n\nexport function getBaseBranch(repoRoot: string): string {\n  const gitDir = resolveGitDir(repoRoot);\n  const refStoreDir = gitDir ? resolveCommonGitDir(gitDir) : null;\n  const candidates = [\"main\", \"master\", \"develop\", \"trunk\"];\n  \n  if (refStoreDir) {\n    for (const candidate of candidates) {\n      const refPath = path.join(refStoreDir, \"refs\", \"heads\", candidate);\n      if (existsSync(refPath)) {\n        return candidate;\n      }\n\n      const packedRefs = readPackedRefs(refStoreDir);\n      if (packedRefs.some((line) => line.endsWith(` refs/heads/${candidate}`))) {\n        return candidate;\n      }\n    }\n  }\n\n  return getCurrentBranch(repoRoot) ?? \"main\";\n}\n\nexport function getAllBranches(repoRoot: string): string[] {\n  const branchSet = new Set<string>();\n  const gitDir = resolveGitDir(repoRoot);\n  const refStoreDir = gitDir ? resolveCommonGitDir(gitDir) : null;\n  \n  if (!refStoreDir) {\n    return [];\n  }\n  \n  const refsPath = path.join(refStoreDir, \"refs\", \"heads\");\n  \n  if (!existsSync(refsPath)) {\n    return [];\n  }\n\n  const looseBranches: string[] = [];\n  collectBranchRefs(looseBranches, refsPath);\n  for (const branch of looseBranches) {\n    branchSet.add(branch);\n  }\n\n  const packedRefs = readPackedRefs(refStoreDir);\n  for (const line of packedRefs) {\n    const splitIndex = line.indexOf(\" \");\n    if (splitIndex <= 0) {\n      continue;\n    }\n\n    const ref = line.slice(splitIndex + 1).trim();\n    const prefix = \"refs/heads/\";\n    if (ref.startsWith(prefix)) {\n      branchSet.add(ref.slice(prefix.length));\n    }\n  }\n\n  return Array.from(branchSet).sort();\n}\n\nexport function getBranchOrDefault(repoRoot: string): string {\n  if (!isGitRepo(repoRoot)) {\n    return \"default\";\n  }\n  \n  return getCurrentBranch(repoRoot) ?? \"default\";\n}\n\nexport function getHeadPath(repoRoot: string): string {\n  const gitDir = resolveGitDir(repoRoot);\n  if (gitDir) {\n    return path.join(gitDir, \"HEAD\");\n  }\n  return path.join(repoRoot, \".git\", \"HEAD\");\n}\n","import { existsSync, readFileSync, readdirSync, statSync } from \"fs\";\nimport * as path from \"path\";\n\nexport function readPackedRefs(gitDir: string): string[] {\n  const packedRefsPath = path.join(gitDir, \"packed-refs\");\n  if (!existsSync(packedRefsPath)) {\n    return [];\n  }\n\n  try {\n    return readFileSync(packedRefsPath, \"utf-8\")\n      .split(\"\\n\")\n      .map((line) => line.trim())\n      .filter((line) => line.length > 0 && !line.startsWith(\"#\") && !line.startsWith(\"^\"));\n  } catch {\n    return [];\n  }\n}\n\nexport function resolveCommonGitDir(gitDir: string): string {\n  const commonDirPath = path.join(gitDir, \"commondir\");\n  if (!existsSync(commonDirPath)) {\n    return gitDir;\n  }\n\n  try {\n    const raw = readFileSync(commonDirPath, \"utf-8\").trim();\n    if (!raw) {\n      return gitDir;\n    }\n\n    const resolved = path.isAbsolute(raw) ? raw : path.resolve(gitDir, raw);\n    if (existsSync(resolved)) {\n      return resolved;\n    }\n  } catch {\n    return gitDir;\n  }\n\n  return gitDir;\n}\n\nexport function tryResolveRefCommit(gitDir: string, refPath: string): string | null {\n  const looseRefPath = path.join(gitDir, refPath);\n  if (existsSync(looseRefPath)) {\n    try {\n      const value = readFileSync(looseRefPath, \"utf-8\").trim();\n      if (/^[0-9a-f]{40}$/i.test(value)) {\n        return value;\n      }\n    } catch {\n      return null;\n    }\n  }\n\n  const packedRefs = readPackedRefs(gitDir);\n  for (const line of packedRefs) {\n    const splitIndex = line.indexOf(\" \");\n    if (splitIndex <= 0) {\n      continue;\n    }\n\n    const commit = line.slice(0, splitIndex).trim();\n    const packedRef = line.slice(splitIndex + 1).trim();\n    if (packedRef === refPath && /^[0-9a-f]{40}$/i.test(commit)) {\n      return commit;\n    }\n  }\n\n  return null;\n}\n\nexport function collectBranchRefs(branches: string[], baseDir: string, prefix = \"\"): void {\n  if (!existsSync(baseDir)) {\n    return;\n  }\n\n  try {\n    const entries = readdirSync(baseDir);\n    for (const entry of entries) {\n      const nextPath = path.join(baseDir, entry);\n      const nextPrefix = prefix ? `${prefix}/${entry}` : entry;\n      const stat = statSync(nextPath);\n      if (stat.isDirectory()) {\n        collectBranchRefs(branches, nextPath, nextPrefix);\n      } else if (stat.isFile()) {\n        branches.push(nextPrefix);\n      }\n    }\n  } catch {\n    return;\n  }\n}\n","import * as path from \"path\";\n\nimport { normalizePathSeparators } from \"../utils/paths.js\";\n\n\nfunction isWithinRoot(rootDir: string, targetPath: string): boolean {\n  const relativePath = path.relative(rootDir, targetPath);\n  return relativePath === \"\" || (!relativePath.startsWith(\"..\") && !path.isAbsolute(relativePath));\n}\n\nexport function rebasePathEntries(\n  values: unknown,\n  fromDir: string,\n  toDir: string,\n): string[] {\n  if (!Array.isArray(values)) {\n    return [];\n  }\n\n  return values\n    .filter((value): value is string => typeof value === \"string\")\n    .map((value) => {\n      const trimmed = value.trim();\n      if (!trimmed || path.isAbsolute(trimmed)) {\n        return trimmed;\n      }\n\n      return normalizePathSeparators(path.normalize(path.relative(toDir, path.resolve(fromDir, trimmed))));\n    })\n    .filter(Boolean);\n}\n\nexport function resolveInheritedKnowledgeBaseEntries(\n  values: unknown,\n  sourceRoot: string,\n  targetRoot: string,\n): string[] {\n  if (!Array.isArray(values)) {\n    return [];\n  }\n\n  return values\n    .filter((value): value is string => typeof value === \"string\")\n    .map((value) => {\n      const trimmed = value.trim();\n      if (!trimmed) {\n        return trimmed;\n      }\n\n      if (path.isAbsolute(trimmed)) {\n        if (isWithinRoot(sourceRoot, trimmed)) {\n          return normalizePathSeparators(path.normalize(path.relative(sourceRoot, trimmed) || \".\"));\n        }\n\n        return path.normalize(trimmed);\n      }\n\n      const resolvedFromSource = path.resolve(sourceRoot, trimmed);\n      if (isWithinRoot(sourceRoot, resolvedFromSource)) {\n        return normalizePathSeparators(path.normalize(trimmed));\n      }\n\n      return normalizePathSeparators(path.normalize(path.relative(targetRoot, resolvedFromSource)));\n    })\n    .filter(Boolean);\n}\n","import * as path from \"path\";\n\nexport function normalizePathSeparators(value: string): string {\n  return value.replace(/\\\\/g, \"/\");\n}\n\nexport function isHiddenPathSegment(part: string): boolean {\n  return part.startsWith(\".\") && part !== \".\" && part !== \"..\";\n}\n\nexport function isBuildPathSegment(part: string): boolean {\n  return part.toLowerCase().includes(\"build\");\n}\n\nexport function hasFilteredPathSegment(relativePath: string, separator: string = path.sep): boolean {\n  return relativePath.split(separator).some(\n    (part) => isHiddenPathSegment(part) || isBuildPathSegment(part)\n  );\n}\n\n/**\n * Directories that should never be watched when they appear as a top-level\n * segment of a relative path. These are OS-level directories that are either\n * permission-restricted or irrelevant to source code projects.\n *\n * macOS: Library, Applications, System, Volumes, private, cores\n * Linux: proc, sys, dev, run, snap\n * Windows: Windows, ProgramData, Program Files, $Recycle.Bin\n */\nconst RESTRICTED_DIRECTORIES = new Set([\n  // macOS\n  \"library\",\n  \"applications\",\n  \"system\",\n  \"volumes\",\n  \"private\",\n  \"cores\",\n  // Linux\n  \"proc\",\n  \"sys\",\n  \"dev\",\n  \"run\",\n  \"snap\",\n  // Windows\n  \"windows\",\n  \"programdata\",\n  \"program files\",\n  \"program files (x86)\",\n  \"$recycle.bin\",\n]);\n\n/**\n * Returns true if the first path segment is a known OS-restricted directory.\n * This prevents the watcher from descending into paths like ~/Library/ on macOS.\n */\nexport function isRestrictedDirectory(relativePath: string, separator: string = path.sep): boolean {\n  const firstSegment = relativePath.split(separator)[0];\n  if (!firstSegment) return false;\n  return RESTRICTED_DIRECTORIES.has(firstSegment.toLowerCase());\n}\n","import { existsSync, readFileSync, writeFileSync, renameSync, unlinkSync, mkdirSync, promises as fsPromises } from \"fs\";\nimport * as path from \"path\";\nimport { performance } from \"perf_hooks\";\nimport { execFile } from \"child_process\";\nimport { promisify } from \"util\";\nimport PQueue from \"p-queue\";\nimport pRetry from \"p-retry\";\n\nimport { ParsedCodebaseIndexConfig, type RerankerConfig } from \"../config/schema.js\";\nimport { detectEmbeddingProvider, ConfiguredProviderInfo, tryDetectProvider, createCustomProviderInfo } from \"../embeddings/detector.js\";\nimport {\n  createEmbeddingProvider,\n  EmbeddingProviderInterface,\n  CustomProviderNonRetryableError,\n} from \"../embeddings/provider.js\";\nimport { createReranker, RerankerInterface } from \"../rerank/index.js\";\nimport { collectFiles, SkippedFile } from \"../utils/files.js\";\nimport { createCostEstimate, CostEstimate } from \"../utils/cost.js\";\nimport { Logger, initializeLogger } from \"../utils/logger.js\";\nimport {\n  VectorStore,\n  InvertedIndex,\n  Database,\n  parseFiles,\n  createEmbeddingTexts,\n  generateChunkId,\n  generateChunkHash,\n  ChunkMetadata,\n  ChunkData,\n  createDynamicBatches,\n  hashFile,\n  hashContent,\n  extractCalls,\n  parseFileAsText,\n  estimateTokens,\n} from \"../native/index.js\";\nimport type { SymbolData, CallEdgeData, PathHopData, ReachabilityData, CommunityData, CentralityData } from \"../native/index.js\";\nimport { getBranchOrDefault, getBaseBranch, isGitRepo } from \"../git/index.js\";\nimport type { HostMode } from \"../config/host.js\";\nimport { getHostProjectIndexRelativePath, resolveProjectIndexPath } from \"../config/paths.js\";\nimport { getChangedFiles } from \"../tools/changed-files.js\";\nimport type { PrImpactResult } from \"./pr-impact-types.js\";\n\nexport const CALL_GRAPH_LANGUAGES = new Set([\"typescript\", \"tsx\", \"javascript\", \"jsx\", \"python\", \"go\", \"rust\", \"php\", \"apex\", \"zig\", \"gdscript\", \"matlab\"]);\n// Languages whose identifiers are case-insensitive at the language level.\n// The Rust call_extractor lowercases callee names for these languages (except\n// constructors and imports), so same-file resolution in this file must use\n// the same normalization when looking up symbols by name. Keep this set in\n// sync with the matching branch in native/src/call_extractor.rs.\nexport const CASE_INSENSITIVE_LANGUAGES = new Set([\"apex\"]);\nexport const CALL_GRAPH_SYMBOL_CHUNK_TYPES = new Set([\n  \"function_declaration\",\n  \"function\",\n  \"arrow_function\",\n  \"export_statement\",\n  \"method_definition\",\n  \"class_declaration\",\n  \"interface_declaration\",\n  \"type_alias_declaration\",\n  \"enum_declaration\",\n  \"function_definition\",\n  \"class_definition\",\n  \"decorated_definition\",\n  \"method_declaration\",\n  \"type_declaration\",\n  \"type_spec\",\n  \"function_item\",\n  \"impl_item\",\n  \"struct_item\",\n  \"enum_item\",\n  \"trait_item\",\n  \"mod_item\",\n  \"trait_declaration\",\n  \"trigger_declaration\",\n  \"test_declaration\",\n  \"struct_declaration\",\n  \"union_declaration\",\n  // GDScript declarations whose names participate in the call graph.\n  // `function_definition` and `class_definition` are already in the set\n  // above (shared with Python/C/Bash and Python, respectively).\n  \"constructor_definition\",\n  \"enum_definition\",\n  \"signal_statement\",\n  \"const_statement\",\n  \"class_name_statement\",\n]);\n\nfunction float32ArrayToBuffer(arr: number[]): Buffer {\n  const float32 = new Float32Array(arr);\n  return Buffer.from(float32.buffer);\n}\n\nfunction bufferToFloat32Array(buf: Buffer): Float32Array {\n  return new Float32Array(buf.buffer, buf.byteOffset, buf.byteLength / 4);\n}\n\nfunction getErrorMessage(error: unknown): string {\n  if (error instanceof Error) {\n    return error.message;\n  }\n  if (typeof error === \"string\") {\n    return error;\n  }\n  if (error && typeof error === \"object\" && \"message\" in error) {\n    return String((error as { message: unknown }).message);\n  }\n  return String(error);\n}\n\nfunction isRateLimitError(error: unknown): boolean {\n  const message = getErrorMessage(error);\n  return message.includes(\"429\") || message.toLowerCase().includes(\"rate limit\") || message.toLowerCase().includes(\"too many requests\");\n}\n\nfunction getSafeEmbeddingChunkTokenLimit(provider: ConfiguredProviderInfo): number {\n  const providerMaxTokens = provider.modelInfo.maxTokens;\n  const maxChunkTokens = Math.max(256, Math.floor(providerMaxTokens * 0.75));\n  return Math.min(2000, maxChunkTokens);\n}\n\nfunction getDynamicBatchOptions(provider: ConfiguredProviderInfo): { maxBatchTokens?: number; maxBatchItems?: number } {\n  if (provider.provider === \"ollama\") {\n    return {\n      maxBatchTokens: provider.modelInfo.maxTokens,\n      maxBatchItems: 1,\n    };\n  }\n\n  return {};\n}\n\nfunction isSqliteCorruptionError(error: unknown): boolean {\n  const message = getErrorMessage(error).toLowerCase();\n  return message.includes(\"database disk image is malformed\")\n    || message.includes(\"file is not a database\")\n    || message.includes(\"database schema is corrupt\")\n    || message.includes(\"sqlite_corrupt\");\n}\n\nexport interface IndexStats {\n  totalFiles: number;\n  totalChunks: number;\n  indexedChunks: number;\n  failedChunks: number;\n  tokensUsed: number;\n  durationMs: number;\n  existingChunks: number;\n  removedChunks: number;\n  skippedFiles: SkippedFile[];\n  parseFailures: string[];\n  failedBatchesPath?: string;\n  warning?: string;\n  resetCorruptedIndex?: boolean;\n}\n\ninterface CorruptedIndexResetResult {\n  warning: string;\n  resetCorruptedIndex: true;\n}\n\nexport interface SearchResult {\n  filePath: string;\n  startLine: number;\n  endLine: number;\n  content: string;\n  score: number;\n  chunkType: string;\n  name?: string;\n}\n\nexport interface HealthCheckResult {\n  removed: number;\n  filePaths: string[];\n  gcOrphanEmbeddings: number;\n  gcOrphanChunks: number;\n  gcOrphanSymbols: number;\n  gcOrphanCallEdges: number;\n  warning?: string;\n  resetCorruptedIndex?: boolean;\n}\n\nexport interface StatusResult {\n  indexed: boolean;\n  vectorCount: number;\n  provider: string;\n  model: string;\n  indexPath: string;\n  currentBranch: string;\n  baseBranch: string;\n  compatibility: IndexCompatibility | null;\n  failedBatchesCount: number;\n  failedBatchesPath?: string;\n  warning?: string;\n}\n\nconst STARTUP_WARNING_METADATA_KEY = \"index.startupWarning\";\n\nexport interface IndexProgress {\n  phase: \"scanning\" | \"parsing\" | \"embedding\" | \"storing\" | \"complete\";\n  filesProcessed: number;\n  totalFiles: number;\n  chunksProcessed: number;\n  totalChunks: number;\n  currentFile?: string;\n}\n\nexport type ProgressCallback = (progress: IndexProgress) => void;\n\ninterface PendingChunk {\n  id: string;\n  texts: Array<{\n    text: string;\n    tokenCount: number;\n  }>;\n  storageText: string;\n  content: string;\n  contentHash: string;\n  metadata: ChunkMetadata;\n}\n\ninterface PendingEmbeddingRequest {\n  chunk: PendingChunk;\n  partIndex: number;\n  text: string;\n  tokenCount: number;\n}\n\ninterface FailedBatch {\n  chunks: PendingChunk[];\n  error: string;\n  attemptCount: number;\n  lastAttempt: string;\n}\n\ninterface RetryableFailedChunk {\n  chunk: PendingChunk;\n  attemptCount: number;\n}\n\ninterface SerializedFailedBatch {\n  chunks: unknown[];\n  error: string;\n  attemptCount: number;\n  lastAttempt: string;\n}\n\ntype RankedCandidate = { id: string; score: number; metadata: ChunkMetadata };\n\ninterface RerankDocumentPayload {\n  id: string;\n  text: string;\n}\n\ntype ExternalRerankBand = \"implementation\" | \"documentation\" | \"test\" | \"other\";\n\ninterface HybridRankOptions {\n  fusionStrategy: \"weighted\" | \"rrf\";\n  rrfK: number;\n  rerankTopN: number;\n  limit: number;\n  hybridWeight: number;\n}\n\ninterface SemanticRankOptions {\n  rerankTopN: number;\n  limit: number;\n  prioritizeSourcePaths?: boolean;\n}\n\ninterface IndexMetadata {\n  indexVersion: string;\n  embeddingProvider: string;\n  embeddingModel: string;\n  embeddingDimensions: number;\n  embeddingStrategyVersion: string;\n  createdAt: string;\n  updatedAt: string;\n}\n\nenum IncompatibilityCode {\n  DIMENSION_MISMATCH = \"DIMENSION_MISMATCH\",\n  MODEL_MISMATCH = \"MODEL_MISMATCH\",\n  EMBEDDING_STRATEGY_MISMATCH = \"EMBEDDING_STRATEGY_MISMATCH\",\n}\n\ninterface IndexCompatibility {\n  compatible: boolean;\n  code?: IncompatibilityCode;\n  reason?: string;\n  storedMetadata?: IndexMetadata;\n}\n\nconst INDEX_METADATA_VERSION = \"1\";\nconst EMBEDDING_STRATEGY_VERSION = \"2\";\nconst RANKING_TOKEN_CACHE_LIMIT = 4096;\nconst RANK_HYBRID_CACHE_LIMIT = 256;\n\nfunction createPendingChunkStorageText(texts: PendingChunk[\"texts\"]): string {\n  const primaryText = texts[0]?.text ?? \"\";\n  if (texts.length <= 1) {\n    return primaryText;\n  }\n\n  return `${primaryText}\\n\\n... [split into ${texts.length} parts for embedding]`;\n}\n\nfunction normalizePendingChunk(rawChunk: unknown, maxChunkTokens?: number): PendingChunk | null {\n  if (!rawChunk || typeof rawChunk !== \"object\") {\n    return null;\n  }\n\n  const chunk = rawChunk as {\n    id?: unknown;\n    text?: unknown;\n    texts?: Array<{ text?: unknown; tokenCount?: unknown }>;\n    storageText?: unknown;\n    content?: unknown;\n    contentHash?: unknown;\n    metadata?: unknown;\n  };\n\n  if (typeof chunk.id !== \"string\" || typeof chunk.contentHash !== \"string\" || !chunk.metadata || typeof chunk.metadata !== \"object\") {\n    return null;\n  }\n\n  const texts = Array.isArray(chunk.texts)\n    ? chunk.texts\n      .map((entry) => {\n        if (!entry || typeof entry.text !== \"string\") {\n          return null;\n        }\n\n        return {\n          text: entry.text,\n          tokenCount: typeof entry.tokenCount === \"number\" && Number.isFinite(entry.tokenCount)\n            ? entry.tokenCount\n            : estimateTokens(entry.text),\n        };\n      })\n      .filter((entry): entry is PendingChunk[\"texts\"][number] => entry !== null)\n    : [];\n\n  if (texts.length === 0 && typeof chunk.text === \"string\") {\n    if (typeof chunk.content === \"string\" && chunk.content.length > 0 && chunk.metadata && typeof chunk.metadata === \"object\") {\n      const metadata = chunk.metadata as Partial<ChunkMetadata>;\n      const rebuiltChunk = {\n        content: chunk.content,\n        startLine: typeof metadata.startLine === \"number\" ? metadata.startLine : 1,\n        endLine: typeof metadata.endLine === \"number\" ? metadata.endLine : 1,\n        chunkType: typeof metadata.chunkType === \"string\" ? metadata.chunkType : \"other\",\n        name: typeof metadata.name === \"string\" ? metadata.name : undefined,\n        language: typeof metadata.language === \"string\" ? metadata.language : \"text\",\n      };\n      const filePath = typeof metadata.filePath === \"string\" ? metadata.filePath : \"unknown\";\n      texts.push(\n        ...createEmbeddingTexts(rebuiltChunk, filePath, maxChunkTokens).map((text) => ({\n          text,\n          tokenCount: estimateTokens(text),\n        }))\n      );\n    } else {\n      texts.push({\n        text: chunk.text,\n        tokenCount: estimateTokens(chunk.text),\n      });\n    }\n  }\n\n  if (texts.length === 0) {\n    return null;\n  }\n\n  return {\n    id: chunk.id,\n    texts,\n    storageText: typeof chunk.storageText === \"string\" ? chunk.storageText : createPendingChunkStorageText(texts),\n    content: typeof chunk.content === \"string\" ? chunk.content : \"\",\n    contentHash: chunk.contentHash,\n    metadata: chunk.metadata as ChunkMetadata,\n  };\n}\n\nfunction getPendingChunkFilePath(rawChunk: unknown): string | null {\n  if (!rawChunk || typeof rawChunk !== \"object\") {\n    return null;\n  }\n\n  const chunk = rawChunk as { metadata?: unknown };\n  if (!chunk.metadata || typeof chunk.metadata !== \"object\") {\n    return null;\n  }\n\n  const metadata = chunk.metadata as { filePath?: unknown };\n  return typeof metadata.filePath === \"string\" ? metadata.filePath : null;\n}\n\nfunction normalizeFailedBatch(batch: SerializedFailedBatch, maxChunkTokens?: number): FailedBatch | null {\n  const chunks = batch.chunks\n    .map((chunk) => normalizePendingChunk(chunk, maxChunkTokens))\n    .filter((chunk): chunk is PendingChunk => chunk !== null);\n\n  if (chunks.length === 0) {\n    return null;\n  }\n\n  return {\n    chunks,\n    error: batch.error,\n    attemptCount: batch.attemptCount,\n    lastAttempt: batch.lastAttempt,\n  } satisfies FailedBatch;\n}\n\nfunction createPendingEmbeddingRequests(chunks: PendingChunk[]): PendingEmbeddingRequest[] {\n  return chunks.flatMap((chunk) =>\n    chunk.texts.map((textPart, partIndex) => ({\n      chunk,\n      partIndex,\n      text: textPart.text,\n      tokenCount: textPart.tokenCount,\n    }))\n  );\n}\n\nfunction createPendingEmbeddingRequestBatches(\n  chunks: PendingChunk[],\n  options: { maxBatchTokens?: number; maxBatchItems?: number } = {}\n): PendingEmbeddingRequest[][] {\n  return createDynamicBatches(createPendingEmbeddingRequests(chunks), options);\n}\n\nfunction getUniquePendingChunksFromRequests(requests: PendingEmbeddingRequest[]): PendingChunk[] {\n  const uniqueChunks = new Map<string, PendingChunk>();\n  for (const request of requests) {\n    uniqueChunks.set(request.chunk.id, request.chunk);\n  }\n  return Array.from(uniqueChunks.values());\n}\n\nfunction coalesceFailedBatches(batches: FailedBatch[]): FailedBatch[] {\n  const grouped = new Map<string, FailedBatch>();\n\n  for (const batch of batches) {\n    const key = `${batch.attemptCount}:${batch.lastAttempt}:${batch.error}`;\n    const existing = grouped.get(key);\n    if (!existing) {\n      grouped.set(key, {\n        ...batch,\n        chunks: [...batch.chunks],\n      });\n      continue;\n    }\n\n    existing.chunks.push(...batch.chunks);\n  }\n\n  return Array.from(grouped.values());\n}\n\nfunction poolEmbeddingVectors(vectors: number[][], weights: number[]): number[] {\n  const firstVector = vectors[0];\n  if (!firstVector) {\n    return [];\n  }\n\n  const pooled = new Array<number>(firstVector.length).fill(0);\n  let totalWeight = 0;\n\n  for (let index = 0; index < vectors.length; index++) {\n    const vector = vectors[index];\n    const weight = Math.max(1, weights[index] ?? 1);\n    totalWeight += weight;\n\n    for (let dimension = 0; dimension < vector.length; dimension++) {\n      pooled[dimension] += vector[dimension] * weight;\n    }\n  }\n\n  if (totalWeight === 0) {\n    return firstVector;\n  }\n\n  return pooled.map((value) => value / totalWeight);\n}\n\nfunction hasAllEmbeddingParts(\n  parts: Array<{ vector: number[]; tokenCount: number } | undefined>,\n  expectedPartCount: number\n): boolean {\n  if (parts.length !== expectedPartCount) {\n    return false;\n  }\n\n  for (let index = 0; index < expectedPartCount; index++) {\n    if (parts[index] === undefined) {\n      return false;\n    }\n  }\n\n  return true;\n}\n\nfunction isPathWithinRoot(filePath: string, rootPath: string): boolean {\n  const normalizedFilePath = path.resolve(filePath);\n  const normalizedRoot = path.resolve(rootPath);\n  return normalizedFilePath === normalizedRoot || normalizedFilePath.startsWith(`${normalizedRoot}${path.sep}`);\n}\n\nconst rankingQueryTokenCache = new Map<string, Set<string>>();\nconst rankingNameTokenCache = new Map<string, Set<string>>();\nconst rankingPathTokenCache = new Map<string, Set<string>>();\nconst rankingTextTokenCache = new Map<string, Set<string>>();\nconst rankHybridResultsCache = new WeakMap<RankedCandidate[], WeakMap<RankedCandidate[], Map<string, RankedCandidate[]>>>();\n\nconst STOPWORDS = new Set([\n  \"the\", \"and\", \"for\", \"with\", \"from\", \"that\", \"this\", \"into\", \"using\", \"where\",\n  \"what\", \"when\", \"why\", \"how\", \"are\", \"was\", \"were\", \"be\", \"been\", \"being\",\n  \"find\", \"show\", \"get\", \"run\", \"use\", \"code\", \"function\", \"implementation\",\n  \"retrieve\", \"results\", \"result\", \"search\", \"pipeline\", \"top\", \"in\", \"on\", \"of\",\n  \"to\", \"by\", \"as\", \"or\", \"an\", \"a\",\n]);\n\nconst TEST_PATH_SEGMENTS = [\n  \"tests/\",\n  \"__tests__/\",\n  \"/test/\",\n  \"fixtures/\",\n  \"benchmark\",\n  \"README\",\n  \"ARCHITECTURE\",\n  \"docs/\",\n];\n\nconst IMPLEMENTATION_EXCLUDE_PATH_SEGMENTS = [\n  \"tests/\",\n  \"__tests__/\",\n  \"/test/\",\n  \"fixtures/\",\n  \"benchmark\",\n  \"readme\",\n  \"architecture\",\n  \"docs/\",\n  \"examples/\",\n  \"example/\",\n  \".github/\",\n  \"/scripts/\",\n  \"/migrations/\",\n  \"/generated/\",\n];\n\nconst SOURCE_INTENT_HINTS = new Set([\n  \"implement\",\n  \"implementation\",\n  \"function\",\n  \"method\",\n  \"class\",\n  \"logic\",\n  \"algorithm\",\n  \"pipeline\",\n  \"indexer\",\n  \"where\",\n]);\n\nconst DOC_TEST_INTENT_HINTS = new Set([\n  \"test\",\n  \"tests\",\n  \"fixture\",\n  \"fixtures\",\n  \"benchmark\",\n  \"readme\",\n  \"docs\",\n  \"documentation\",\n]);\n\nconst DOC_INTENT_HINTS = new Set([\n  \"readme\",\n  \"docs\",\n  \"documentation\",\n  \"guide\",\n  \"usage\",\n]);\n\nfunction setBoundedCache(\n  cache: Map<string, Set<string>>,\n  key: string,\n  value: Set<string>\n): void {\n  if (cache.size >= RANKING_TOKEN_CACHE_LIMIT) {\n    const oldest = cache.keys().next().value;\n    if (oldest !== undefined) {\n      cache.delete(oldest);\n    }\n  }\n  cache.set(key, value);\n}\n\nfunction tokenizeTextForRanking(text: string): Set<string> {\n  if (!text) {\n    return new Set<string>();\n  }\n\n  const lowered = text.toLowerCase();\n  const cache = rankingQueryTokenCache.get(lowered) ?? rankingTextTokenCache.get(lowered);\n  if (cache) {\n    return cache;\n  }\n\n  const tokens = new Set(\n    lowered\n      .replace(/[^\\w\\s]/g, \" \")\n      .split(/\\s+/)\n      .filter((token) => token.length > 1 && !STOPWORDS.has(token))\n  );\n\n  setBoundedCache(rankingQueryTokenCache, lowered, tokens);\n  setBoundedCache(rankingTextTokenCache, lowered, tokens);\n  return tokens;\n}\n\nfunction splitPathTokens(filePath: string): Set<string> {\n  const lowered = filePath.toLowerCase();\n  const cache = rankingPathTokenCache.get(lowered);\n  if (cache) {\n    return cache;\n  }\n\n  const normalized = lowered\n    .replace(/[^a-z0-9/._-]/g, \" \")\n    .split(/[/._-]+/)\n    .filter((token) => token.length > 1);\n  const tokens = new Set(normalized);\n  setBoundedCache(rankingPathTokenCache, lowered, tokens);\n  return tokens;\n}\n\nfunction splitNameTokens(name: string): Set<string> {\n  if (!name) {\n    return new Set<string>();\n  }\n\n  const lowered = name.toLowerCase();\n  const cache = rankingNameTokenCache.get(lowered);\n  if (cache) {\n    return cache;\n  }\n\n  const tokens = new Set(\n    lowered\n      .replace(/[^\\w\\s]/g, \" \")\n      .split(/\\s+/)\n      .filter((token) => token.length > 1)\n  );\n  setBoundedCache(rankingNameTokenCache, lowered, tokens);\n  return tokens;\n}\n\nfunction chunkTypeBoost(chunkType: string): number {\n  switch (chunkType) {\n    case \"function\":\n    case \"function_declaration\":\n    case \"method\":\n    case \"method_definition\":\n    case \"class\":\n    case \"class_declaration\":\n      return 0.2;\n    case \"interface\":\n    case \"type\":\n    case \"enum\":\n    case \"struct\":\n    case \"impl\":\n    case \"trait\":\n    case \"module\":\n      return 0.1;\n    default:\n      return 0;\n  }\n}\n\nfunction isTestOrDocPath(filePath: string): boolean {\n  return TEST_PATH_SEGMENTS.some((segment) => filePath.includes(segment));\n}\n\nfunction isLikelyImplementationPath(filePath: string): boolean {\n  const lowered = filePath.toLowerCase();\n  if (IMPLEMENTATION_EXCLUDE_PATH_SEGMENTS.some((segment) => lowered.includes(segment))) {\n    return false;\n  }\n\n  const ext = lowered.split(\".\").pop() ?? \"\";\n  if ([\"md\", \"mdx\", \"txt\", \"rst\", \"adoc\", \"snap\", \"json\", \"yaml\", \"yml\", \"lock\"].includes(ext)) {\n    return false;\n  }\n\n  return true;\n}\n\nfunction isDocumentationPath(filePath: string): boolean {\n  const lowered = filePath.toLowerCase();\n  const ext = lowered.split(\".\").pop() ?? \"\";\n  return lowered.includes(\"readme\") || [\"md\", \"mdx\", \"rst\", \"adoc\", \"txt\"].includes(ext);\n}\n\nfunction classifyExternalRerankBand(\n  candidate: RankedCandidate,\n  preferSourcePaths: boolean,\n  docIntent: boolean\n): ExternalRerankBand {\n  const isDocOrTest = isTestOrDocPath(candidate.metadata.filePath);\n  const isDocumentation = isDocumentationPath(candidate.metadata.filePath);\n  const isImplementation = isLikelyImplementationPath(candidate.metadata.filePath) &&\n    isImplementationChunkType(candidate.metadata.chunkType);\n\n  if (preferSourcePaths) {\n    if (isImplementation) return \"implementation\";\n    if (isDocumentation) return \"documentation\";\n    if (isDocOrTest) return \"test\";\n    return \"other\";\n  }\n\n  if (docIntent) {\n    if (isDocumentation) return \"documentation\";\n    if (isImplementation) return \"implementation\";\n    if (isDocOrTest) return \"test\";\n    return \"other\";\n  }\n\n  if (isImplementation) return \"implementation\";\n  if (isDocumentation) return \"documentation\";\n  if (isDocOrTest) return \"test\";\n  return \"other\";\n}\n\nfunction classifyQueryIntent(tokens: string[]): \"source\" | \"doc_test\" | \"neutral\" {\n  const sourceIntentHits = tokens.filter((t) => SOURCE_INTENT_HINTS.has(t)).length;\n  const docTestIntentHits = tokens.filter((t) => DOC_TEST_INTENT_HINTS.has(t)).length;\n\n  if (sourceIntentHits === 0 && docTestIntentHits === 0) {\n    return \"neutral\";\n  }\n\n  if (sourceIntentHits > docTestIntentHits) {\n    return \"source\";\n  }\n\n  if (docTestIntentHits > sourceIntentHits) {\n    return \"doc_test\";\n  }\n\n  return \"neutral\";\n}\n\nfunction classifyQueryIntentRaw(query: string): \"source\" | \"doc_test\" | \"neutral\" {\n  const lowerQuery = query.toLowerCase();\n  const docTestRawHits = Array.from(DOC_TEST_INTENT_HINTS).filter((hint) =>\n    new RegExp(`\\\\b${hint}\\\\b`).test(lowerQuery)\n  ).length;\n  const sourceRawHits = [\n    \"implement\",\n    \"implementation\",\n    \"implements\",\n    \"function\",\n    \"method\",\n    \"class\",\n    \"logic\",\n    \"algorithm\",\n    \"pipeline\",\n    \"indexer\",\n  ].filter((hint) => new RegExp(`\\\\b${hint}\\\\b`).test(lowerQuery)).length;\n\n  if (docTestRawHits > sourceRawHits) {\n    return \"doc_test\";\n  }\n\n  if (sourceRawHits > docTestRawHits && sourceRawHits > 0) {\n    return \"source\";\n  }\n\n  const hasWhereIsPattern = /\\bwhere\\s+is\\b/.test(lowerQuery);\n  const hasIdentifierHints = extractIdentifierHints(query).length > 0;\n  if (hasWhereIsPattern && hasIdentifierHints && docTestRawHits === 0) {\n    return \"source\";\n  }\n\n  const queryTokens = Array.from(tokenizeTextForRanking(query));\n  return classifyQueryIntent(queryTokens);\n}\n\nfunction classifyDocIntent(tokens: string[]): \"docs\" | \"test\" | \"mixed\" | \"none\" {\n  const docHits = tokens.filter((t) => DOC_INTENT_HINTS.has(t)).length;\n  const testHits = tokens.filter((t) => [\"test\", \"tests\", \"fixture\", \"fixtures\", \"benchmark\"].includes(t)).length;\n\n  if (docHits > 0 && testHits === 0) return \"docs\";\n  if (testHits > 0 && docHits === 0) return \"test\";\n  if (testHits > 0 || docHits > 0) return \"mixed\";\n  return \"none\";\n}\n\nfunction isImplementationChunkType(chunkType: string): boolean {\n  return [\n    \"export_statement\",\n    \"function\",\n    \"function_declaration\",\n    \"method\",\n    \"method_definition\",\n    \"class\",\n    \"class_declaration\",\n    \"interface\",\n    \"type\",\n    \"enum\",\n    \"module\",\n  ].includes(chunkType);\n}\n\nfunction extractIdentifierHints(query: string): string[] {\n  const identifiers = query.match(/[A-Za-z_][A-Za-z0-9_]*/g) ?? [];\n  return identifiers\n    .filter((id) => id.length >= 3)\n    .filter((id) => {\n      const lower = id.toLowerCase();\n      if (STOPWORDS.has(lower)) return false;\n      return /[A-Z]/.test(id) || id.includes(\"_\") || id.endsWith(\"Results\") || id.endsWith(\"Result\");\n    })\n    .map((id) => id.toLowerCase());\n}\n\nfunction extractCodeTermHints(query: string): string[] {\n  const terms = query.match(/[A-Za-z_][A-Za-z0-9_]*/g) ?? [];\n  return terms\n    .map((term) => term.toLowerCase())\n    .filter((term) => term.length >= 3)\n    .filter((term) => !STOPWORDS.has(term));\n}\n\nfunction normalizeIdentifierVariants(identifier: string): string[] {\n  const lower = identifier.toLowerCase();\n  const compact = lower.replace(/[^a-z0-9]/g, \"\");\n  const snake = compact.replace(/([a-z])([A-Z])/g, \"$1_$2\").toLowerCase();\n  const kebab = snake.replace(/_/g, \"-\");\n  const variants = [lower, compact, snake, kebab].filter((value) => value.length > 0);\n  return Array.from(new Set(variants));\n}\n\nfunction scoreIdentifierMatch(name: string | undefined, filePath: string, hints: string[]): number {\n  const nameLower = (name ?? \"\").toLowerCase();\n  const pathLower = filePath.toLowerCase();\n\n  let best = 0;\n  for (const hint of hints) {\n    const variants = normalizeIdentifierVariants(hint);\n    for (const variant of variants) {\n      if (nameLower === variant) {\n        best = Math.max(best, 1);\n      } else if (nameLower.includes(variant)) {\n        best = Math.max(best, 0.8);\n      } else if (pathLower.includes(variant)) {\n        best = Math.max(best, 0.6);\n      }\n    }\n  }\n\n  return best;\n}\n\nfunction extractPrimaryIdentifierQueryHint(query: string): string | null {\n  const identifiers = extractIdentifierHints(query);\n  if (identifiers.length > 0) {\n    return identifiers[0] ?? null;\n  }\n\n  const codeTerms = extractCodeTermHints(query);\n  const best = codeTerms.find((term) => term.length >= 6);\n  return best ?? null;\n}\n\nconst FILE_PATH_HINT_EXTENSIONS = [\n  \"ts\", \"tsx\", \"js\", \"jsx\", \"mjs\", \"cjs\", \"mts\", \"cts\",\n  \"py\", \"rs\", \"go\", \"java\", \"kt\", \"kts\", \"swift\", \"rb\", \"php\",\n  \"c\", \"h\", \"cc\", \"cpp\", \"cxx\", \"hpp\", \"cs\", \"scala\", \"lua\",\n  \"sh\", \"bash\", \"zsh\", \"json\", \"yaml\", \"yml\", \"toml\",\n];\n\nconst FILE_PATH_HINT_SUFFIX_REGEX = new RegExp(\n  \"\\\\s+\\\\bin\\\\s+[\\\"'`]?((?:\\\\.\\\\/)?(?:[A-Za-z0-9._-]+\\\\/)+[A-Za-z0-9._-]+\\\\.(?:\" +\n  FILE_PATH_HINT_EXTENSIONS.join(\"|\") +\n  \"))[\\\"'`]?[\\\\])}>.,;!?]*\\\\s*$\",\n  \"i\"\n);\n\nfunction normalizeFilePathForHintMatch(filePath: string): string {\n  return filePath.replace(/\\\\/g, \"/\").toLowerCase().replace(/^\\.\\//, \"\");\n}\n\nfunction pathMatchesHint(filePath: string, hint: string): boolean {\n  const normalizedPath = normalizeFilePathForHintMatch(filePath);\n  const normalizedHint = normalizeFilePathForHintMatch(hint);\n\n  return normalizedPath.endsWith(normalizedHint) ||\n    normalizedPath.includes(`/${normalizedHint}`) ||\n    normalizedPath.includes(normalizedHint);\n}\n\nexport function extractFilePathHint(query: string): string | null {\n  const match = query.match(FILE_PATH_HINT_SUFFIX_REGEX);\n  const rawPath = match?.[1];\n  if (!rawPath) {\n    return null;\n  }\n\n  return rawPath.replace(/^\\.\\//, \"\");\n}\n\nexport function stripFilePathHint(query: string): string {\n  const stripped = query.replace(FILE_PATH_HINT_SUFFIX_REGEX, \"\").trim();\n  return stripped.length > 0 ? stripped : query;\n}\n\nfunction buildDeterministicIdentifierPass(\n  query: string,\n  candidates: RankedCandidate[],\n  limit: number,\n  prioritizeSourcePaths: boolean = classifyQueryIntentRaw(query) === \"source\"\n): RankedCandidate[] {\n  if (!prioritizeSourcePaths) {\n    return [];\n  }\n\n  const primary = extractPrimaryIdentifierQueryHint(query);\n  if (!primary) {\n    return [];\n  }\n  const filePathHint = extractFilePathHint(query);\n  const primaryVariants = normalizeIdentifierVariants(primary);\n\n  const hints = [primary, ...extractIdentifierHints(query), ...extractCodeTermHints(query)]\n    .map((value) => value.toLowerCase())\n    .filter((value, idx, arr) => value.length >= 3 && arr.indexOf(value) === idx)\n    .slice(0, 8);\n\n  const deterministic = candidates\n    .filter((candidate) =>\n      isLikelyImplementationPath(candidate.metadata.filePath) &&\n      isImplementationChunkType(candidate.metadata.chunkType)\n    )\n    .map((candidate) => {\n      const nameLower = (candidate.metadata.name ?? \"\").toLowerCase();\n      const pathLower = candidate.metadata.filePath.toLowerCase();\n      let maxMatch = 0;\n      const nameMatchesPrimary = primaryVariants.some((variant) =>\n        nameLower === variant || nameLower.replace(/[^a-z0-9]/g, \"\") === variant.replace(/[^a-z0-9]/g, \"\")\n      );\n      const pathMatchesFileHint = filePathHint ? pathMatchesHint(candidate.metadata.filePath, filePathHint) : false;\n\n      for (const hint of hints) {\n        const variants = normalizeIdentifierVariants(hint);\n        for (const variant of variants) {\n          if (nameLower === variant) {\n            maxMatch = Math.max(maxMatch, 1);\n          } else if (nameLower.includes(variant)) {\n            maxMatch = Math.max(maxMatch, 0.85);\n          } else if (pathLower.includes(variant)) {\n            maxMatch = Math.max(maxMatch, 0.7);\n          }\n        }\n      }\n\n      if (pathMatchesFileHint && nameMatchesPrimary) {\n        maxMatch = Math.max(maxMatch, 1);\n      }\n\n      return {\n        candidate,\n        maxMatch,\n        pathMatchesFileHint,\n        nameMatchesPrimary,\n      };\n    })\n    .filter((entry) => entry.maxMatch >= 0.7)\n    .sort((a, b) => {\n      const aAnchored = a.pathMatchesFileHint && a.nameMatchesPrimary ? 1 : 0;\n      const bAnchored = b.pathMatchesFileHint && b.nameMatchesPrimary ? 1 : 0;\n      if (aAnchored !== bAnchored) return bAnchored - aAnchored;\n      if (b.maxMatch !== a.maxMatch) return b.maxMatch - a.maxMatch;\n      if (b.candidate.score !== a.candidate.score) return b.candidate.score - a.candidate.score;\n      return a.candidate.id.localeCompare(b.candidate.id);\n    })\n    .slice(0, Math.max(limit * 2, 12));\n\n  return deterministic.map((entry) => ({\n    id: entry.candidate.id,\n    score: entry.pathMatchesFileHint && entry.nameMatchesPrimary\n      ? 0.995\n      : Math.min(1, 0.9 + entry.maxMatch * 0.09),\n    metadata: entry.candidate.metadata,\n  }));\n}\n\nexport function fuseResultsWeighted(\n  semanticResults: RankedCandidate[],\n  keywordResults: RankedCandidate[],\n  keywordWeight: number,\n  limit: number\n): RankedCandidate[] {\n  const semanticWeight = 1 - keywordWeight;\n  const fusedScores = new Map<string, { score: number; metadata: ChunkMetadata }>();\n\n  for (const r of semanticResults) {\n    fusedScores.set(r.id, {\n      score: r.score * semanticWeight,\n      metadata: r.metadata,\n    });\n  }\n\n  for (const r of keywordResults) {\n    const existing = fusedScores.get(r.id);\n    if (existing) {\n      existing.score += r.score * keywordWeight;\n    } else {\n      fusedScores.set(r.id, {\n        score: r.score * keywordWeight,\n        metadata: r.metadata,\n      });\n    }\n  }\n\n  const results = Array.from(fusedScores.entries()).map(([id, data]) => ({\n    id,\n    score: data.score,\n    metadata: data.metadata,\n  }));\n\n  results.sort((a, b) => b.score - a.score || a.id.localeCompare(b.id));\n  return results.slice(0, limit);\n}\n\nexport function fuseResultsRrf(\n  semanticResults: RankedCandidate[],\n  keywordResults: RankedCandidate[],\n  rrfK: number,\n  limit: number\n): RankedCandidate[] {\n  const maxPossibleRaw = 2 / (rrfK + 1);\n  const rankByIdSemantic = new Map<string, number>();\n  const rankByIdKeyword = new Map<string, number>();\n  const metadataById = new Map<string, ChunkMetadata>();\n\n  semanticResults.forEach((result, index) => {\n    rankByIdSemantic.set(result.id, index + 1);\n    metadataById.set(result.id, result.metadata);\n  });\n\n  keywordResults.forEach((result, index) => {\n    rankByIdKeyword.set(result.id, index + 1);\n    if (!metadataById.has(result.id)) {\n      metadataById.set(result.id, result.metadata);\n    }\n  });\n\n  const allIds = new Set<string>([...rankByIdSemantic.keys(), ...rankByIdKeyword.keys()]);\n  const fused: RankedCandidate[] = [];\n\n  for (const id of allIds) {\n    const semanticRank = rankByIdSemantic.get(id);\n    const keywordRank = rankByIdKeyword.get(id);\n\n    const semanticScore = semanticRank ? 1 / (rrfK + semanticRank) : 0;\n    const keywordScore = keywordRank ? 1 / (rrfK + keywordRank) : 0;\n\n    const metadata = metadataById.get(id);\n    if (!metadata) continue;\n\n    fused.push({\n      id,\n      score: maxPossibleRaw > 0 ? (semanticScore + keywordScore) / maxPossibleRaw : 0,\n      metadata,\n    });\n  }\n\n  fused.sort((a, b) => b.score - a.score || a.id.localeCompare(b.id));\n  return fused.slice(0, limit);\n}\n\nexport function rerankResults(\n  query: string,\n  candidates: RankedCandidate[],\n  rerankTopN: number,\n  options?: { prioritizeSourcePaths?: boolean }\n): RankedCandidate[] {\n  if (rerankTopN <= 0 || candidates.length <= 1) {\n    return candidates;\n  }\n\n  const topN = Math.min(rerankTopN, candidates.length);\n  const queryTokens = tokenizeTextForRanking(query);\n  if (queryTokens.size === 0) {\n    return candidates;\n  }\n\n  const queryTokenList = Array.from(queryTokens);\n  const docIntent = classifyDocIntent(queryTokenList);\n  const preferSourcePaths = options?.prioritizeSourcePaths ?? classifyQueryIntentRaw(query) === \"source\";\n  const identifierHints = extractIdentifierHints(query);\n\n  const head = candidates.slice(0, topN).map((candidate, idx) => {\n    const pathTokens = splitPathTokens(candidate.metadata.filePath);\n    const nameTokens = splitNameTokens(candidate.metadata.name ?? \"\");\n    const chunkTypeTokens = tokenizeTextForRanking(candidate.metadata.chunkType);\n    let exactOrPrefixNameHits = 0;\n    let pathOverlap = 0;\n    let chunkTypeHits = 0;\n\n    for (const token of queryTokenList) {\n      if (nameTokens.has(token)) {\n        exactOrPrefixNameHits += 1;\n      } else {\n        for (const nameToken of nameTokens) {\n          if (nameToken.startsWith(token) || token.startsWith(nameToken)) {\n            exactOrPrefixNameHits += 1;\n            break;\n          }\n        }\n      }\n\n      if (pathTokens.has(token)) {\n        pathOverlap += 1;\n      }\n\n      if (chunkTypeTokens.has(token)) {\n        chunkTypeHits += 1;\n      }\n    }\n\n    const likelyTestOrDoc = isTestOrDocPath(candidate.metadata.filePath);\n    const lowerPath = candidate.metadata.filePath.toLowerCase();\n    const lowerName = (candidate.metadata.name ?? \"\").toLowerCase();\n    const hasIdentifierMatch = identifierHints.some((id) => lowerPath.includes(id) || lowerName.includes(id));\n\n    const implementationPathBoost = preferSourcePaths && isLikelyImplementationPath(candidate.metadata.filePath) ? 0.08 : 0;\n    const isReadmePath = candidate.metadata.filePath.toLowerCase().includes(\"readme\");\n    const testDocPenalty = preferSourcePaths && likelyTestOrDoc ? 0.12 : 0;\n    const readmeDocBoost = !preferSourcePaths && isReadmePath ? 0.08 : 0;\n    const identifierBoost = hasIdentifierMatch ? 0.12 : 0;\n    const tokenCoverage = queryTokenList.length > 0\n      ? (exactOrPrefixNameHits + pathOverlap + chunkTypeHits) / queryTokenList.length\n      : 0;\n    const coverageBoost = Math.min(0.12, tokenCoverage * 0.06);\n\n    const deterministicBoost =\n      exactOrPrefixNameHits * 0.08 +\n      pathOverlap * 0.03 +\n      chunkTypeHits * 0.02 +\n      coverageBoost +\n      identifierBoost +\n      implementationPathBoost -\n      testDocPenalty +\n      readmeDocBoost +\n      chunkTypeBoost(candidate.metadata.chunkType);\n\n    return {\n      candidate,\n      boostedScore: candidate.score + deterministicBoost,\n      originalIndex: idx,\n      hasIdentifierMatch,\n      implementationChunk: isImplementationChunkType(candidate.metadata.chunkType),\n      isLikelyImplementationPath: isLikelyImplementationPath(candidate.metadata.filePath),\n      isTestOrDocPath: likelyTestOrDoc,\n      isReadmePath,\n    };\n  });\n\n  head.sort((a, b) => {\n    if (b.boostedScore !== a.boostedScore) return b.boostedScore - a.boostedScore;\n    if (b.candidate.score !== a.candidate.score) return b.candidate.score - a.candidate.score;\n    if (a.originalIndex !== b.originalIndex) return a.originalIndex - b.originalIndex;\n    return a.candidate.id.localeCompare(b.candidate.id);\n  });\n\n  if (preferSourcePaths) {\n    head.sort((a, b) => {\n      const aId = a.hasIdentifierMatch ? 1 : 0;\n      const bId = b.hasIdentifierMatch ? 1 : 0;\n      if (aId !== bId) return bId - aId;\n\n      const aImpl = a.implementationChunk ? 1 : 0;\n      const bImpl = b.implementationChunk ? 1 : 0;\n      if (aImpl !== bImpl) return bImpl - aImpl;\n\n      const aImplementationPath = a.isLikelyImplementationPath ? 1 : 0;\n      const bImplementationPath = b.isLikelyImplementationPath ? 1 : 0;\n      if (aImplementationPath !== bImplementationPath) return bImplementationPath - aImplementationPath;\n\n      const aTestDoc = a.isTestOrDocPath ? 1 : 0;\n      const bTestDoc = b.isTestOrDocPath ? 1 : 0;\n      if (aTestDoc !== bTestDoc) return aTestDoc - bTestDoc;\n\n      return 0;\n    });\n  } else if (docIntent === \"docs\") {\n    head.sort((a, b) => {\n      const aReadme = a.isReadmePath ? 1 : 0;\n      const bReadme = b.isReadmePath ? 1 : 0;\n      if (aReadme !== bReadme) return bReadme - aReadme;\n      return 0;\n    });\n  }\n\n  const shouldDiversify = !(preferSourcePaths && identifierHints.length > 0);\n  const diversifiedHead = diversifyEntriesByFileAndSymbol(head, (entry) => entry.candidate, shouldDiversify);\n\n  const tail = candidates.slice(topN);\n  return [...diversifiedHead.map((entry) => entry.candidate), ...tail];\n}\n\nfunction diversifyEntriesByFileAndSymbol<T>(\n  entries: T[],\n  getCandidate: (entry: T) => RankedCandidate,\n  enabled: boolean\n): T[] {\n  if (!enabled || entries.length <= 2) {\n    return entries;\n  }\n\n  const groups = new Map<string, T[]>();\n  const groupOrder: string[] = [];\n\n  for (const entry of entries) {\n    const candidate = getCandidate(entry);\n    const filePath = candidate.metadata.filePath;\n    if (!groups.has(filePath)) {\n      groups.set(filePath, []);\n      groupOrder.push(filePath);\n    }\n    groups.get(filePath)?.push(entry);\n  }\n\n  const diversifiedGroups = groupOrder.map((filePath) => {\n    const group = groups.get(filePath) ?? [];\n    return diversifyGroupBySymbol(group, getCandidate);\n  });\n\n  const result: T[] = [];\n  let added = true;\n  let round = 0;\n  while (added) {\n    added = false;\n    for (const group of diversifiedGroups) {\n      const entry = group[round];\n      if (entry !== undefined) {\n        result.push(entry);\n        added = true;\n      }\n    }\n    round += 1;\n  }\n\n  return result;\n}\n\nfunction diversifyCandidatesByFile(candidates: RankedCandidate[], enabled: boolean): RankedCandidate[] {\n  return diversifyEntriesByFileAndSymbol(candidates, (candidate) => candidate, enabled);\n}\n\nfunction diversifyGroupBySymbol<T>(\n  entries: T[],\n  getCandidate: (entry: T) => RankedCandidate\n): T[] {\n  if (entries.length <= 2) {\n    return entries;\n  }\n\n  const seenKeys = new Set<string>();\n  const primary: T[] = [];\n  const remainder: T[] = [];\n\n  for (const entry of entries) {\n    const key = buildDiversityKey(getCandidate(entry).metadata);\n    if (!seenKeys.has(key)) {\n      seenKeys.add(key);\n      primary.push(entry);\n    } else {\n      remainder.push(entry);\n    }\n  }\n\n  return [...primary, ...remainder];\n}\n\nfunction buildDiversityKey(metadata: ChunkMetadata): string {\n  const normalizedPath = metadata.filePath.toLowerCase();\n  const normalizedName = (metadata.name ?? \"\").trim().toLowerCase();\n  if (normalizedName.length > 0) {\n    return `${normalizedPath}#${normalizedName}`;\n  }\n  return normalizedPath;\n}\n\nexport function rankHybridResults(\n  query: string,\n  semanticResults: RankedCandidate[],\n  keywordResults: RankedCandidate[],\n  options: HybridRankOptions & { prioritizeSourcePaths?: boolean }\n): RankedCandidate[] {\n  const prioritizeSourcePaths = options.prioritizeSourcePaths ?? classifyQueryIntentRaw(query) === \"source\";\n  const cacheKey = `${query}\\u0001${options.fusionStrategy}|${options.rrfK}|${options.hybridWeight}|${options.rerankTopN}|${options.limit}|${prioritizeSourcePaths ? 1 : 0}`;\n\n  let byKeyword = rankHybridResultsCache.get(semanticResults);\n  if (!byKeyword) {\n    byKeyword = new WeakMap<RankedCandidate[], Map<string, RankedCandidate[]>>();\n    rankHybridResultsCache.set(semanticResults, byKeyword);\n  }\n\n  let bucket = byKeyword.get(keywordResults);\n  if (!bucket) {\n    bucket = new Map<string, RankedCandidate[]>();\n    byKeyword.set(keywordResults, bucket);\n  } else {\n    const cached = bucket.get(cacheKey);\n    if (cached) {\n      return cached;\n    }\n  }\n\n  const overfetchLimit = Math.max(options.limit * 4, options.limit);\n  const fused = options.fusionStrategy === \"rrf\"\n    ? fuseResultsRrf(semanticResults, keywordResults, options.rrfK, overfetchLimit)\n    : fuseResultsWeighted(semanticResults, keywordResults, options.hybridWeight, overfetchLimit);\n\n  const rerankPoolLimit = Math.max(overfetchLimit, options.rerankTopN * 3, options.limit * 6);\n  const rerankPool = fused.slice(0, rerankPoolLimit);\n  const ranked = rerankResults(query, rerankPool, options.rerankTopN, {\n    prioritizeSourcePaths,\n  });\n\n  if (bucket.size >= RANK_HYBRID_CACHE_LIMIT) {\n    const oldest = bucket.keys().next().value;\n    if (oldest !== undefined) {\n      bucket.delete(oldest);\n    }\n  }\n  bucket.set(cacheKey, ranked);\n\n  return ranked;\n}\n\nexport function rankSemanticOnlyResults(\n  query: string,\n  semanticResults: RankedCandidate[],\n  options: SemanticRankOptions\n): RankedCandidate[] {\n  const overfetchLimit = Math.max(options.limit * 4, options.limit);\n  const bounded = semanticResults.slice(0, overfetchLimit);\n  return rerankResults(query, bounded, options.rerankTopN, {\n    prioritizeSourcePaths: options.prioritizeSourcePaths ?? false,\n  });\n}\n\nfunction promoteIdentifierMatches(\n  query: string,\n  combined: RankedCandidate[],\n  semanticCandidates: RankedCandidate[],\n  keywordCandidates: RankedCandidate[],\n  database?: Database,\n  branchChunkIds?: Set<string> | null,\n  prioritizeSourcePaths: boolean = classifyQueryIntentRaw(query) === \"source\"\n): RankedCandidate[] {\n  if (combined.length === 0) {\n    return combined;\n  }\n\n  if (!prioritizeSourcePaths) {\n    return combined;\n  }\n\n  const identifierHints = extractIdentifierHints(query);\n  if (identifierHints.length === 0) {\n    return combined;\n  }\n\n  const combinedById = new Map(combined.map((candidate) => [candidate.id, candidate]));\n  const candidateUnion = new Map<string, RankedCandidate>();\n  for (const candidate of semanticCandidates) {\n    candidateUnion.set(candidate.id, candidate);\n  }\n  for (const candidate of keywordCandidates) {\n    if (!candidateUnion.has(candidate.id)) {\n      candidateUnion.set(candidate.id, candidate);\n    }\n  }\n\n  if (database) {\n    for (const identifier of identifierHints) {\n      const symbols = database.getSymbolsByName(identifier);\n      for (const symbol of symbols) {\n        const chunks = database.getChunksByFile(symbol.filePath);\n        for (const chunk of chunks) {\n          if (branchChunkIds && !branchChunkIds.has(chunk.chunkId)) {\n            continue;\n          }\n\n          const chunkType = ((chunk.nodeType ?? \"other\") as ChunkMetadata[\"chunkType\"]);\n          if (!isImplementationChunkType(chunkType)) {\n            continue;\n          }\n\n          if (!isLikelyImplementationPath(chunk.filePath)) {\n            continue;\n          }\n\n          if (chunk.startLine > symbol.startLine || chunk.endLine < symbol.endLine) {\n            continue;\n          }\n\n          const existing = combinedById.get(chunk.chunkId) ?? candidateUnion.get(chunk.chunkId);\n          const metadata: ChunkMetadata = existing?.metadata ?? {\n            filePath: chunk.filePath,\n            startLine: chunk.startLine,\n            endLine: chunk.endLine,\n            chunkType,\n            name: chunk.name ?? undefined,\n            language: chunk.language,\n            hash: chunk.contentHash,\n          };\n\n          const baselineScore = existing?.score ?? 0.5;\n          candidateUnion.set(chunk.chunkId, {\n            id: chunk.chunkId,\n            score: Math.min(1, baselineScore + 0.5),\n            metadata,\n          });\n        }\n      }\n    }\n  }\n\n  const promoted: RankedCandidate[] = [];\n  for (const candidate of candidateUnion.values()) {\n    const filePathLower = candidate.metadata.filePath.toLowerCase();\n    const nameLower = (candidate.metadata.name ?? \"\").toLowerCase();\n    const exactIdentifierMatch = identifierHints.some((hint) => nameLower === hint);\n    const hasIdentifierMatch = exactIdentifierMatch || identifierHints.some((hint) =>\n      nameLower.includes(hint) ||\n      filePathLower.includes(hint)\n    );\n\n    if (!hasIdentifierMatch) {\n      continue;\n    }\n\n    if (!isImplementationChunkType(candidate.metadata.chunkType)) {\n      continue;\n    }\n\n    if (!isLikelyImplementationPath(candidate.metadata.filePath)) {\n      continue;\n    }\n\n    const existing = combinedById.get(candidate.id) ?? candidate;\n    const rescueBoost = exactIdentifierMatch ? 0.45 : 0.25;\n    const boostedScore = Math.min(1, Math.max(existing.score, candidate.score) + rescueBoost);\n    promoted.push({\n      id: existing.id,\n      score: boostedScore,\n      metadata: existing.metadata,\n    });\n  }\n\n  if (promoted.length === 0) {\n    return combined;\n  }\n\n  promoted.sort((a, b) => b.score - a.score || a.id.localeCompare(b.id));\n\n  const promotedIds = new Set(promoted.map((candidate) => candidate.id));\n  const remainder = combined.filter((candidate) => !promotedIds.has(candidate.id));\n  return [...promoted, ...remainder];\n}\n\nfunction buildSymbolDefinitionLane(\n  query: string,\n  database: Database,\n  branchChunkIds: Set<string> | null,\n  limit: number,\n  fallbackCandidates: RankedCandidate[],\n  prioritizeSourcePaths: boolean = classifyQueryIntentRaw(query) === \"source\"\n): RankedCandidate[] {\n  if (!prioritizeSourcePaths) {\n    return [];\n  }\n\n  const identifierHints = extractIdentifierHints(query);\n  const codeTermHints = extractCodeTermHints(query);\n  if (identifierHints.length === 0 && codeTermHints.length === 0) {\n    return [];\n  }\n\n  const symbolCandidates = new Map<string, RankedCandidate>();\n  const filePathHint = extractFilePathHint(query);\n  const primaryHint = extractPrimaryIdentifierQueryHint(query);\n\n  const upsertChunkCandidate = (\n    chunk: ReturnType<Database[\"getChunksByName\"]>[number],\n    identifier: string,\n    normalizedIdentifier: string,\n    baseScore?: number\n  ) => {\n    if (branchChunkIds && !branchChunkIds.has(chunk.chunkId)) {\n      return;\n    }\n\n    const chunkType = (chunk.nodeType ?? \"other\") as ChunkMetadata[\"chunkType\"];\n    if (!isImplementationChunkType(chunkType)) {\n      return;\n    }\n\n    if (!isLikelyImplementationPath(chunk.filePath)) {\n      return;\n    }\n\n    const nameLower = (chunk.name ?? \"\").toLowerCase();\n    const exactName =\n      nameLower === identifier ||\n      nameLower.replace(/_/g, \"\") === normalizedIdentifier;\n    const base = baseScore ?? (exactName ? 0.99 : 0.88);\n\n    const existing = symbolCandidates.get(chunk.chunkId);\n    if (!existing || base > existing.score) {\n      symbolCandidates.set(chunk.chunkId, {\n        id: chunk.chunkId,\n        score: base,\n        metadata: {\n          filePath: chunk.filePath,\n          startLine: chunk.startLine,\n          endLine: chunk.endLine,\n          chunkType,\n          name: chunk.name ?? undefined,\n          language: chunk.language,\n          hash: chunk.contentHash,\n        },\n      });\n    }\n  };\n\n  const normalizedHints = identifierHints\n    .flatMap((hint) => [\n      hint,\n      hint.replace(/_/g, \"\"),\n      hint.replace(/_/g, \"-\")\n    ])\n    .filter((hint, idx, arr) => hint.length >= 3 && arr.indexOf(hint) === idx)\n    .slice(0, 6);\n\n  for (const identifier of normalizedHints) {\n    const symbols = [\n      ...database.getSymbolsByName(identifier),\n      ...database.getSymbolsByNameCi(identifier),\n    ];\n\n    const chunksByName = [\n      ...database.getChunksByName(identifier),\n      ...database.getChunksByNameCi(identifier),\n    ];\n\n    const normalizedIdentifier = identifier.replace(/_/g, \"\");\n\n    const dedupSymbols = new Map<string, typeof symbols[number]>();\n    for (const symbol of symbols) {\n      dedupSymbols.set(symbol.id, symbol);\n    }\n\n    for (const symbol of dedupSymbols.values()) {\n      const chunks = database.getChunksByFile(symbol.filePath);\n      for (const chunk of chunks) {\n        if (chunk.startLine > symbol.startLine || chunk.endLine < symbol.endLine) {\n          continue;\n        }\n\n        upsertChunkCandidate(chunk, identifier, normalizedIdentifier);\n      }\n    }\n\n    const dedupChunksByName = new Map<string, typeof chunksByName[number]>();\n    for (const chunk of chunksByName) {\n      dedupChunksByName.set(chunk.chunkId, chunk);\n    }\n\n    for (const chunk of dedupChunksByName.values()) {\n      upsertChunkCandidate(chunk, identifier, normalizedIdentifier);\n    }\n  }\n\n  if (filePathHint && primaryHint) {\n    const primaryChunks = [\n      ...database.getChunksByName(primaryHint),\n      ...database.getChunksByNameCi(primaryHint),\n    ];\n    const dedupPrimaryChunks = new Map<string, typeof primaryChunks[number]>();\n    for (const chunk of primaryChunks) {\n      dedupPrimaryChunks.set(chunk.chunkId, chunk);\n    }\n\n    for (const chunk of dedupPrimaryChunks.values()) {\n      if (!pathMatchesHint(chunk.filePath, filePathHint)) {\n        continue;\n      }\n      const normalizedPrimary = primaryHint.replace(/_/g, \"\");\n      upsertChunkCandidate(chunk, primaryHint, normalizedPrimary, 1.0);\n    }\n  }\n\n  const ranked = Array.from(symbolCandidates.values()).sort((a, b) => b.score - a.score || a.id.localeCompare(b.id));\n  if (ranked.length === 0) {\n    const implementationFallback = fallbackCandidates.filter((candidate) =>\n      isImplementationChunkType(candidate.metadata.chunkType) &&\n      isLikelyImplementationPath(candidate.metadata.filePath)\n    );\n\n    for (const candidate of implementationFallback) {\n      const nameLower = (candidate.metadata.name ?? \"\").toLowerCase();\n      const pathLower = candidate.metadata.filePath.toLowerCase();\n\n      const exactHintMatch = normalizedHints.some((hint) => nameLower === hint || nameLower.replace(/_/g, \"\") === hint.replace(/_/g, \"\"));\n      const tokenizedName = tokenizeTextForRanking(nameLower);\n      const tokenHits = codeTermHints.filter((term) => tokenizedName.has(term) || pathLower.includes(term)).length;\n\n      if (!exactHintMatch && tokenHits === 0) {\n        continue;\n      }\n\n      const laneScore = exactHintMatch\n        ? Math.min(1, Math.max(candidate.score, 0.97))\n        : Math.min(0.95, Math.max(candidate.score, 0.82 + tokenHits * 0.03));\n      symbolCandidates.set(candidate.id, {\n        id: candidate.id,\n        score: laneScore,\n        metadata: candidate.metadata,\n      });\n    }\n\n    if (symbolCandidates.size === 0) {\n      const queryTokenSet = tokenizeTextForRanking(query);\n      const rankedFallback = implementationFallback\n        .map((candidate) => {\n          const nameTokens = tokenizeTextForRanking(candidate.metadata.name ?? \"\");\n          const pathTokens = splitPathTokens(candidate.metadata.filePath);\n          let overlap = 0;\n          for (const token of queryTokenSet) {\n            if (nameTokens.has(token) || pathTokens.has(token)) {\n              overlap += 1;\n            }\n          }\n          const overlapScore = queryTokenSet.size > 0 ? overlap / queryTokenSet.size : 0;\n          return {\n            candidate,\n            overlapScore,\n          };\n        })\n        .filter((entry) => entry.overlapScore > 0)\n        .sort((a, b) => b.overlapScore - a.overlapScore || b.candidate.score - a.candidate.score)\n        .slice(0, Math.max(limit, 3));\n\n      for (const entry of rankedFallback) {\n        symbolCandidates.set(entry.candidate.id, {\n          id: entry.candidate.id,\n          score: Math.min(0.94, Math.max(entry.candidate.score, 0.8 + entry.overlapScore * 0.1)),\n          metadata: entry.candidate.metadata,\n        });\n      }\n    }\n  }\n\n  const withFallback = Array.from(symbolCandidates.values()).sort((a, b) => b.score - a.score || a.id.localeCompare(b.id));\n  return withFallback.slice(0, Math.max(limit * 2, limit));\n}\n\nfunction buildIdentifierDefinitionLane(\n  query: string,\n  candidates: RankedCandidate[],\n  limit: number,\n  prioritizeSourcePaths: boolean = classifyQueryIntentRaw(query) === \"source\"\n): RankedCandidate[] {\n  if (!prioritizeSourcePaths) {\n    return [];\n  }\n\n  const primaryHint = extractPrimaryIdentifierQueryHint(query);\n  if (!primaryHint) {\n    return [];\n  }\n\n  const hints = [primaryHint, ...extractIdentifierHints(query), ...extractCodeTermHints(query)].slice(0, 8);\n  const scored = candidates\n    .filter((candidate) =>\n      isLikelyImplementationPath(candidate.metadata.filePath) &&\n      isImplementationChunkType(candidate.metadata.chunkType)\n    )\n    .map((candidate) => {\n      const matchScore = scoreIdentifierMatch(candidate.metadata.name, candidate.metadata.filePath, hints);\n      return {\n        candidate,\n        matchScore,\n      };\n    })\n    .filter((entry) => entry.matchScore > 0)\n    .sort((a, b) => {\n      if (b.matchScore !== a.matchScore) return b.matchScore - a.matchScore;\n      if (b.candidate.score !== a.candidate.score) return b.candidate.score - a.candidate.score;\n      return a.candidate.id.localeCompare(b.candidate.id);\n    })\n    .slice(0, Math.max(limit * 2, 10));\n\n  return scored.map((entry) => ({\n    id: entry.candidate.id,\n    score: Math.min(1, 0.9 + entry.matchScore * 0.09),\n    metadata: entry.candidate.metadata,\n  }));\n}\n\nexport function mergeTieredResults(\n  symbolLane: RankedCandidate[],\n  hybridLane: RankedCandidate[],\n  limit: number\n): RankedCandidate[] {\n  if (symbolLane.length === 0) {\n    return hybridLane.slice(0, limit);\n  }\n\n  const out: RankedCandidate[] = [];\n  const seen = new Set<string>();\n\n  for (const candidate of symbolLane) {\n    if (seen.has(candidate.id)) continue;\n    out.push(candidate);\n    seen.add(candidate.id);\n    if (out.length >= limit) return out;\n  }\n\n  for (const candidate of hybridLane) {\n    if (seen.has(candidate.id)) continue;\n    out.push(candidate);\n    seen.add(candidate.id);\n    if (out.length >= limit) return out;\n  }\n\n  return out;\n}\n\nfunction matchesSearchFilters(\n  candidate: RankedCandidate,\n  options: {\n    fileType?: string;\n    directory?: string;\n    chunkType?: string;\n  } | undefined,\n  minScore: number\n): boolean {\n  if (candidate.score < minScore) return false;\n\n  if (options?.fileType) {\n    const ext = candidate.metadata.filePath.split(\".\").pop()?.toLowerCase();\n    if (ext !== options.fileType.toLowerCase().replace(/^\\./, \"\")) return false;\n  }\n\n  if (options?.directory) {\n    const normalizedDir = options.directory.replace(/^\\/|\\/$/g, \"\");\n    if (!candidate.metadata.filePath.includes(`/${normalizedDir}/`) &&\n      !candidate.metadata.filePath.includes(`${normalizedDir}/`)) return false;\n  }\n\n  if (options?.chunkType && candidate.metadata.chunkType !== options.chunkType) {\n    return false;\n  }\n\n  return true;\n}\n\nfunction unionCandidates(\n  semanticCandidates: RankedCandidate[],\n  keywordCandidates: RankedCandidate[]\n): RankedCandidate[] {\n  const byId = new Map<string, RankedCandidate>();\n  for (const candidate of semanticCandidates) {\n    byId.set(candidate.id, candidate);\n  }\n  for (const candidate of keywordCandidates) {\n    const existing = byId.get(candidate.id);\n    if (!existing || candidate.score > existing.score) {\n      byId.set(candidate.id, candidate);\n    }\n  }\n  return Array.from(byId.values());\n}\n\nexport class Indexer {\n  private readonly host: HostMode;\n  private config: ParsedCodebaseIndexConfig;\n  private projectRoot: string;\n  private indexPath: string;\n  private store: VectorStore | null = null;\n  private invertedIndex: InvertedIndex | null = null;\n  private database: Database | null = null;\n  private provider: EmbeddingProviderInterface | null = null;\n  private configuredProviderInfo: ConfiguredProviderInfo | null = null;\n  private reranker: RerankerInterface | null = null;\n  private fileHashCache: Map<string, string> = new Map();\n  private fileHashCachePath: string = \"\";\n  private failedBatchesPath: string = \"\";\n  private currentBranch: string = \"default\";\n  private baseBranch: string = \"main\";\n  private logger: Logger;\n  private queryEmbeddingCache: Map<string, { embedding: number[]; timestamp: number }> = new Map();\n  private readonly maxQueryCacheSize = 100;\n  private readonly queryCacheTtlMs = 5 * 60 * 1000;\n  private readonly querySimilarityThreshold = 0.85;\n  private indexCompatibility: IndexCompatibility | null = null;\n  private indexingLockPath: string = \"\";\n\n  constructor(projectRoot: string, config: ParsedCodebaseIndexConfig, host: HostMode = \"opencode\") {\n    this.projectRoot = projectRoot;\n    this.config = config;\n    this.host = host;\n    this.indexPath = this.getIndexPath();\n    this.fileHashCachePath = path.join(this.indexPath, \"file-hashes.json\");\n    this.failedBatchesPath = path.join(this.indexPath, \"failed-batches.json\");\n    this.indexingLockPath = path.join(this.indexPath, \"indexing.lock\");\n    this.logger = initializeLogger(config.debug);\n  }\n\n  private getIndexPath(): string {\n    return resolveProjectIndexPath(this.projectRoot, this.config.scope, this.host);\n  }\n\n  private loadFileHashCache(): void {\n    if (!existsSync(this.fileHashCachePath)) {\n      return;\n    }\n\n    try {\n      const data = readFileSync(this.fileHashCachePath, \"utf-8\");\n      const parsed = JSON.parse(data);\n      this.fileHashCache = new Map(Object.entries(parsed));\n    } catch (error: unknown) {\n      const message = error instanceof Error ? error.message : String(error);\n      this.logger.warn(\"Failed to load file hash cache, resetting cache state\", {\n        fileHashCachePath: this.fileHashCachePath,\n        error: message,\n      });\n      this.fileHashCache = new Map();\n    }\n  }\n\n  private saveFileHashCache(): void {\n    const obj: Record<string, string> = {};\n    for (const [k, v] of this.fileHashCache) {\n      obj[k] = v;\n    }\n    this.atomicWriteSync(this.fileHashCachePath, JSON.stringify(obj));\n  }\n\n  private atomicWriteSync(targetPath: string, data: string): void {\n    const tempPath = `${targetPath}.tmp`;\n    mkdirSync(path.dirname(targetPath), { recursive: true });\n    writeFileSync(tempPath, data);\n    renameSync(tempPath, targetPath);\n  }\n\n  private getScopedRoots(): string[] {\n    const roots = new Set<string>([path.resolve(this.projectRoot)]);\n\n    for (const kbRoot of this.config.knowledgeBases) {\n      roots.add(path.resolve(this.projectRoot, kbRoot));\n    }\n\n    return Array.from(roots);\n  }\n\n  private getBranchCatalogKey(): string {\n    const branchName = this.currentBranch || \"default\";\n    if (this.config.scope !== \"global\") {\n      return branchName;\n    }\n\n    const projectHash = hashContent(path.resolve(this.projectRoot)).slice(0, 16);\n    return `${projectHash}:${branchName}`;\n  }\n\n  private getBranchCatalogKeyFor(branchName: string): string {\n    if (this.config.scope !== \"global\") {\n      return branchName;\n    }\n\n    const projectHash = hashContent(path.resolve(this.projectRoot)).slice(0, 16);\n    return `${projectHash}:${branchName}`;\n  }\n\n  private getLegacyBranchCatalogKey(): string {\n    return this.currentBranch || \"default\";\n  }\n\n  private getLegacyMigrationMetadataKey(): string {\n    const projectHash = hashContent(path.resolve(this.projectRoot)).slice(0, 16);\n    return `index.globalBranchMigration.${projectHash}`;\n  }\n\n  private getProjectEmbeddingStrategyMetadataKey(): string {\n    const projectHash = hashContent(path.resolve(this.projectRoot)).slice(0, 16);\n    return `index.embeddingStrategyVersion.${projectHash}`;\n  }\n\n  private getProjectForceReembedMetadataKey(): string {\n    const projectHash = hashContent(path.resolve(this.projectRoot)).slice(0, 16);\n    return `index.forceReembed.${projectHash}`;\n  }\n\n  private hasProjectForceReembedPending(): boolean {\n    return this.config.scope === \"global\" && this.database?.getMetadata(this.getProjectForceReembedMetadataKey()) === \"true\";\n  }\n\n  private hasScopedIndexedData(): boolean {\n    if (!this.store || this.config.scope !== \"global\") {\n      return false;\n    }\n\n    if (this.hasProjectForceReembedPending()) {\n      return false;\n    }\n\n    const roots = this.getScopedRoots();\n\n    if (Array.from(this.fileHashCache.keys()).some((filePath) => this.isFileInCurrentScope(filePath, roots))) {\n      return true;\n    }\n\n    if (this.loadSerializedFailedBatches().some((batch) =>\n      batch.chunks.some((chunk) => {\n        const filePath = getPendingChunkFilePath(chunk);\n        return filePath !== null && this.isFileInCurrentScope(filePath, roots);\n      })\n    )) {\n      return true;\n    }\n\n    if (!this.database) {\n      return false;\n    }\n\n    if (this.getBranchCatalogKeys().some((branchKey) => {\n      const branchChunkIds = this.database!.getBranchChunkIds(branchKey);\n      if (branchChunkIds.length > 0) {\n        return true;\n      }\n\n      return this.database!.getBranchSymbolIds(branchKey).length > 0;\n    })) {\n      return true;\n    }\n\n    const hasAnyBranchRows = this.database.getAllBranches().some((branchKey) => {\n      const branchChunkIds = this.database!.getBranchChunkIds(branchKey);\n      if (branchChunkIds.length > 0) {\n        return true;\n      }\n\n      return this.database!.getBranchSymbolIds(branchKey).length > 0;\n    });\n    if (hasAnyBranchRows) {\n      return false;\n    }\n\n    return this.store.getAllMetadata().some(({ metadata }) => this.isFileInCurrentScope(metadata.filePath, roots));\n  }\n\n  private loadStoredEmbeddingStrategyVersion(): string | null {\n    if (!this.database) {\n      return null;\n    }\n\n    if (this.hasProjectForceReembedPending()) {\n      return null;\n    }\n\n    if (this.config.scope !== \"global\") {\n      return this.database.getMetadata(\"index.embeddingStrategyVersion\") ?? \"1\";\n    }\n\n    const projectVersion = this.database.getMetadata(this.getProjectEmbeddingStrategyMetadataKey());\n    if (projectVersion) {\n      return projectVersion;\n    }\n\n    const legacySharedVersion = this.database.getMetadata(\"index.embeddingStrategyVersion\");\n    if (legacySharedVersion && this.hasScopedIndexedData()) {\n      return legacySharedVersion;\n    }\n\n    return null;\n  }\n\n  private getBranchCatalogKeys(): string[] {\n    const primary = this.getBranchCatalogKey();\n    if (this.config.scope !== \"global\") {\n      return [primary];\n    }\n\n    if (this.database?.getMetadata(this.getLegacyMigrationMetadataKey()) === \"done\") {\n      return [primary];\n    }\n\n    const legacy = this.getLegacyBranchCatalogKey();\n    return primary === legacy ? [primary] : [primary, legacy];\n  }\n\n  private getBranchCatalogCleanupKeys(): string[] {\n    const primary = this.getBranchCatalogKey();\n    if (this.config.scope !== \"global\") {\n      return [primary];\n    }\n\n    const legacy = this.getLegacyBranchCatalogKey();\n    return primary === legacy ? [primary] : [primary, legacy];\n  }\n\n  private getProjectLocalScopedOwnershipIds(roots: string[]): {\n    chunkIds: Set<string>;\n    symbolIds: Set<string>;\n  } {\n    const chunkIds = new Set<string>();\n    const symbolIds = new Set<string>();\n    if (!this.database) {\n      return { chunkIds, symbolIds };\n    }\n\n    const projectRootPath = path.resolve(this.projectRoot);\n    const projectLocalFilePaths = new Set<string>([\n      ...Array.from(this.fileHashCache.keys()).filter(\n        (filePath) => this.isFileInCurrentScope(filePath, roots) && isPathWithinRoot(filePath, projectRootPath)\n      ),\n      ...(this.store?.getAllMetadata() ?? [])\n        .map(({ metadata }) => metadata.filePath)\n        .filter(\n          (filePath) => this.isFileInCurrentScope(filePath, roots) && isPathWithinRoot(filePath, projectRootPath)\n        ),\n    ]);\n\n    for (const filePath of projectLocalFilePaths) {\n      for (const chunk of this.database.getChunksByFile(filePath)) {\n        chunkIds.add(chunk.chunkId);\n      }\n\n      for (const symbol of this.database.getSymbolsByFile(filePath)) {\n        symbolIds.add(symbol.id);\n      }\n    }\n\n    return { chunkIds, symbolIds };\n  }\n\n  private getProjectScopedBranchCatalogCleanupKeys(projectChunkIds: string[], projectSymbolIds: string[]): string[] {\n    if (this.config.scope !== \"global\") {\n      return this.getBranchCatalogCleanupKeys();\n    }\n\n    const projectHash = hashContent(path.resolve(this.projectRoot)).slice(0, 16);\n    const keys = new Set<string>();\n    const projectChunkIdSet = new Set(projectChunkIds);\n    const projectSymbolIdSet = new Set(projectSymbolIds);\n\n    for (const branchKey of this.database?.getAllBranches() ?? []) {\n      if (branchKey.startsWith(`${projectHash}:`)) {\n        keys.add(branchKey);\n        continue;\n      }\n\n      if (branchKey.includes(\":\")) {\n        continue;\n      }\n\n      const referencesProjectChunks = this.database?.getBranchChunkIds(branchKey).some((chunkId) => projectChunkIdSet.has(chunkId)) ?? false;\n      const referencesProjectSymbols = this.database?.getBranchSymbolIds(branchKey).some((symbolId) => projectSymbolIdSet.has(symbolId)) ?? false;\n      if (referencesProjectChunks || referencesProjectSymbols) {\n        keys.add(branchKey);\n      }\n    }\n\n    for (const branchKey of this.getBranchCatalogCleanupKeys()) {\n      keys.add(branchKey);\n    }\n\n    return Array.from(keys);\n  }\n\n  private isFileInCurrentScope(filePath: string, roots: string[]): boolean {\n    return roots.some((root) => isPathWithinRoot(filePath, root));\n  }\n\n  private clearScopedFileHashCache(roots: string[]): void {\n    for (const filePath of Array.from(this.fileHashCache.keys())) {\n      if (this.isFileInCurrentScope(filePath, roots)) {\n        this.fileHashCache.delete(filePath);\n      }\n    }\n    this.saveFileHashCache();\n  }\n\n  private replaceScopedFileHashCache(currentFileHashes: Map<string, string>, roots: string[]): void {\n    for (const filePath of Array.from(this.fileHashCache.keys())) {\n      if (this.isFileInCurrentScope(filePath, roots)) {\n        this.fileHashCache.delete(filePath);\n      }\n    }\n\n    for (const [filePath, hash] of currentFileHashes) {\n      this.fileHashCache.set(filePath, hash);\n    }\n\n    this.saveFileHashCache();\n  }\n\n  private partitionFailedBatches(roots: string[], maxChunkTokens?: number): { scoped: FailedBatch[]; retained: SerializedFailedBatch[] } {\n    const scoped: FailedBatch[] = [];\n    const retained: SerializedFailedBatch[] = [];\n\n    for (const batch of this.loadSerializedFailedBatches()) {\n      const scopedChunks = batch.chunks.filter((chunk) => {\n        const filePath = getPendingChunkFilePath(chunk);\n        return filePath !== null && this.isFileInCurrentScope(filePath, roots);\n      });\n      const retainedChunks = batch.chunks.filter((chunk) => {\n        const filePath = getPendingChunkFilePath(chunk);\n        return filePath === null || !this.isFileInCurrentScope(filePath, roots);\n      });\n\n      if (scopedChunks.length > 0) {\n        const normalizedBatch = normalizeFailedBatch({ ...batch, chunks: scopedChunks }, maxChunkTokens);\n        if (normalizedBatch) {\n          scoped.push(normalizedBatch);\n        }\n      }\n\n      if (retainedChunks.length > 0) {\n        retained.push({ ...batch, chunks: retainedChunks });\n      }\n    }\n\n    return { scoped, retained };\n  }\n\n  private clearScopedFailedBatches(roots: string[]): void {\n    const { retained: retainedBatches } = this.partitionFailedBatches(roots);\n    this.saveFailedBatches(retainedBatches);\n  }\n\n  private hasForeignScopedFileHashData(roots: string[]): boolean {\n    return Array.from(this.fileHashCache.keys()).some((filePath) => !this.isFileInCurrentScope(filePath, roots));\n  }\n\n  private hasForeignScopedFailedBatches(roots: string[]): boolean {\n    const { retained } = this.partitionFailedBatches(roots);\n    return retained.length > 0;\n  }\n\n  private hasForeignScopedBranchData(): boolean {\n    if (!this.database || this.config.scope !== \"global\") {\n      return false;\n    }\n\n    const projectHash = hashContent(path.resolve(this.projectRoot)).slice(0, 16);\n    const roots = this.getScopedRoots();\n    const { chunkIds: projectLocalChunkIds, symbolIds: projectLocalSymbolIds } = this.getProjectLocalScopedOwnershipIds(roots);\n\n    return this.database.getAllBranches().some(\n      (branchKey) => {\n        const branchChunkIds = this.database!.getBranchChunkIds(branchKey);\n        const branchSymbolIds = this.database!.getBranchSymbolIds(branchKey);\n        const hasBranchData = branchChunkIds.length > 0 || branchSymbolIds.length > 0;\n        if (!hasBranchData) {\n          return false;\n        }\n\n        if (branchKey.startsWith(`${projectHash}:`)) {\n          return false;\n        }\n\n        if (!branchKey.includes(\":\")) {\n          const referencesCurrentProjectChunks = branchChunkIds.some((chunkId) => projectLocalChunkIds.has(chunkId));\n          const referencesCurrentProjectSymbols = branchSymbolIds.some((symbolId) => projectLocalSymbolIds.has(symbolId));\n          return !(referencesCurrentProjectChunks || referencesCurrentProjectSymbols);\n        }\n\n        return true;\n      }\n    );\n  }\n\n  private saveScopedFailedBatches(batches: FailedBatch[], roots: string[]): void {\n    const { retained } = this.partitionFailedBatches(roots);\n    this.saveFailedBatches([...retained, ...batches]);\n  }\n\n  private clearSharedIndexProjectData(\n    store: VectorStore,\n    invertedIndex: InvertedIndex,\n    database: Database,\n    roots: string[]\n  ): { removedChunkIds: string[]; hasForeignData: boolean } {\n    const allMetadata = store.getAllMetadata();\n    const scopedEntries = allMetadata.filter(({ metadata }) => this.isFileInCurrentScope(metadata.filePath, roots));\n    const filePaths = new Set<string>([\n      ...Array.from(this.fileHashCache.keys()).filter((filePath) => this.isFileInCurrentScope(filePath, roots)),\n      ...scopedEntries.map(({ metadata }) => metadata.filePath),\n    ]);\n\n    const projectRootPath = path.resolve(this.projectRoot);\n    const projectLocalFilePaths = new Set<string>(\n      Array.from(filePaths).filter((filePath) => isPathWithinRoot(filePath, projectRootPath))\n    );\n\n    const removedChunkIds = new Set<string>(scopedEntries.map(({ key }) => key));\n    for (const filePath of filePaths) {\n      for (const chunk of database.getChunksByFile(filePath)) {\n        removedChunkIds.add(chunk.chunkId);\n      }\n    }\n    const removedChunkIdList = Array.from(removedChunkIds);\n\n    const projectLocalChunkIds = new Set<string>(\n      scopedEntries\n        .filter(({ metadata }) => isPathWithinRoot(metadata.filePath, projectRootPath))\n        .map(({ key }) => key)\n    );\n    for (const filePath of projectLocalFilePaths) {\n      for (const chunk of database.getChunksByFile(filePath)) {\n        projectLocalChunkIds.add(chunk.chunkId);\n      }\n    }\n\n    const symbolIds: string[] = [];\n    const projectLocalSymbolIds = new Set<string>();\n    for (const filePath of filePaths) {\n      for (const symbol of database.getSymbolsByFile(filePath)) {\n        symbolIds.push(symbol.id);\n        if (projectLocalFilePaths.has(filePath)) {\n          projectLocalSymbolIds.add(symbol.id);\n        }\n      }\n    }\n\n    for (const branchKey of this.getProjectScopedBranchCatalogCleanupKeys(Array.from(projectLocalChunkIds), Array.from(projectLocalSymbolIds))) {\n      database.deleteBranchChunksForBranch(branchKey, removedChunkIdList);\n    }\n    const sharedChunkIds = new Set(database.getReferencedChunkIds(removedChunkIdList));\n    const removableChunkIds = removedChunkIdList.filter((chunkId) => !sharedChunkIds.has(chunkId));\n\n    if (removableChunkIds.length > 0) {\n      this.rebuildVectorStoreExcludingChunkIds(store, database, removableChunkIds);\n      for (const chunkId of removableChunkIds) {\n        invertedIndex.removeChunk(chunkId);\n      }\n    }\n\n    for (const branchKey of this.getProjectScopedBranchCatalogCleanupKeys(Array.from(projectLocalChunkIds), Array.from(projectLocalSymbolIds))) {\n      database.deleteBranchSymbolsForBranch(branchKey, symbolIds);\n    }\n    const sharedSymbolIds = new Set(database.getReferencedSymbolIds(symbolIds));\n    const removableSymbolIds = symbolIds.filter((symbolId) => !sharedSymbolIds.has(symbolId));\n\n    database.clearCallEdgeTargetsForSymbols(removableSymbolIds);\n\n    for (const filePath of filePaths) {\n      const fileChunkIds = database.getChunksByFile(filePath).map((chunk) => chunk.chunkId);\n      const fileSymbols = database.getSymbolsByFile(filePath);\n\n      if (fileChunkIds.every((chunkId) => !sharedChunkIds.has(chunkId))) {\n        database.deleteChunksByFile(filePath);\n      }\n\n      if (fileSymbols.every((symbol) => !sharedSymbolIds.has(symbol.id))) {\n        database.deleteCallEdgesByFile(filePath);\n        database.deleteSymbolsByFile(filePath);\n      }\n    }\n\n    database.gcOrphanCallEdges();\n    database.gcOrphanSymbols();\n    database.gcOrphanEmbeddings();\n    database.gcOrphanChunks();\n\n    store.save();\n    invertedIndex.save();\n\n    return {\n      removedChunkIds: removedChunkIdList,\n      hasForeignData: allMetadata.some(({ metadata }) => !this.isFileInCurrentScope(metadata.filePath, roots)),\n    };\n  }\n\n  private checkForInterruptedIndexing(): boolean {\n    return existsSync(this.indexingLockPath);\n  }\n\n  private acquireIndexingLock(): void {\n    const lockData = {\n      startedAt: new Date().toISOString(),\n      pid: process.pid,\n    };\n    writeFileSync(this.indexingLockPath, JSON.stringify(lockData));\n  }\n\n  private releaseIndexingLock(): void {\n    if (existsSync(this.indexingLockPath)) {\n      unlinkSync(this.indexingLockPath);\n    }\n  }\n\n  private async recoverFromInterruptedIndexing(): Promise<void> {\n    this.logger.warn(\"Detected interrupted indexing session, recovering...\");\n\n    if (existsSync(this.fileHashCachePath)) {\n      unlinkSync(this.fileHashCachePath);\n    }\n\n    await this.healthCheck();\n    this.releaseIndexingLock();\n\n    this.logger.info(\"Recovery complete, next index will re-process all files\");\n  }\n\n  private loadFailedBatches(maxChunkTokens?: number): FailedBatch[] {\n    try {\n      return this.loadSerializedFailedBatches()\n        .map((batch) => normalizeFailedBatch(batch, maxChunkTokens))\n        .filter((batch): batch is FailedBatch => batch !== null);\n    } catch (error: unknown) {\n      const message = error instanceof Error ? error.message : String(error);\n      this.logger.warn(\"Failed to load failed batch state, skipping persisted retries\", {\n        failedBatchesPath: this.failedBatchesPath,\n        error: message,\n      });\n      return [];\n    }\n  }\n\n  private loadSerializedFailedBatches(): SerializedFailedBatch[] {\n    if (!existsSync(this.failedBatchesPath)) {\n      return [];\n    }\n\n    const data = readFileSync(this.failedBatchesPath, \"utf-8\");\n    const parsed = JSON.parse(data) as Array<{\n      chunks?: unknown[];\n      error?: unknown;\n      attemptCount?: unknown;\n      lastAttempt?: unknown;\n    }>;\n\n    return parsed\n      .map((batch) => {\n        const chunks = Array.isArray(batch.chunks) ? batch.chunks : [];\n        if (chunks.length === 0) {\n          return null;\n        }\n\n        return {\n          chunks,\n          error: typeof batch.error === \"string\" ? batch.error : \"Unknown embedding error\",\n          attemptCount: typeof batch.attemptCount === \"number\" ? batch.attemptCount : 1,\n          lastAttempt: typeof batch.lastAttempt === \"string\" ? batch.lastAttempt : new Date().toISOString(),\n        } satisfies SerializedFailedBatch;\n      })\n      .filter((batch): batch is SerializedFailedBatch => batch !== null);\n  }\n\n  private saveFailedBatches(batches: SerializedFailedBatch[]): void {\n    if (batches.length === 0) {\n      if (existsSync(this.failedBatchesPath)) {\n        try {\n          unlinkSync(this.failedBatchesPath);\n        } catch {\n          // Ignore cleanup failures; stale diagnostics are best-effort only.\n        }\n      }\n      return;\n    }\n    writeFileSync(this.failedBatchesPath, JSON.stringify(batches, null, 2));\n  }\n\n  private collectRetryableFailedChunks(\n    currentFileHashes: Map<string, string>,\n    unchangedFilePaths: Set<string>,\n    maxChunkTokens?: number\n  ): RetryableFailedChunk[] {\n    const retryableById = new Map<string, RetryableFailedChunk>();\n\n    for (const batch of this.loadFailedBatches(maxChunkTokens)) {\n      for (const chunk of batch.chunks) {\n        const filePath = chunk.metadata.filePath;\n        if (!currentFileHashes.has(filePath)) {\n          continue;\n        }\n        if (!unchangedFilePaths.has(filePath)) {\n          continue;\n        }\n\n        const existing = retryableById.get(chunk.id);\n        if (!existing || batch.attemptCount > existing.attemptCount) {\n          retryableById.set(chunk.id, {\n            chunk,\n            attemptCount: batch.attemptCount,\n          });\n        }\n      }\n    }\n\n    return Array.from(retryableById.values());\n  }\n\n  private getProviderRateLimits(provider: string): {\n    concurrency: number;\n    intervalMs: number;\n    minRetryMs: number;\n    maxRetryMs: number;\n  } {\n    switch (provider) {\n      case \"github-copilot\":\n        return { concurrency: 1, intervalMs: 4000, minRetryMs: 5000, maxRetryMs: 60000 };\n      case \"openai\":\n        return { concurrency: 3, intervalMs: 500, minRetryMs: 1000, maxRetryMs: 30000 };\n      case \"google\":\n        return { concurrency: 5, intervalMs: 200, minRetryMs: 1000, maxRetryMs: 30000 };\n      case \"ollama\":\n        return { concurrency: 5, intervalMs: 0, minRetryMs: 500, maxRetryMs: 5000 };\n      case \"custom\": {\n        // Custom providers allow user-configurable concurrency and request interval.\n        // Defaults are conservative (3 concurrent, 1s interval) for cloud endpoints;\n        // users running local servers should set concurrency higher and intervalMs to 0.\n        const customConfig = this.config.customProvider;\n        return {\n          concurrency: customConfig?.concurrency ?? 3,\n          intervalMs: customConfig?.requestIntervalMs ?? 1000,\n          minRetryMs: 1000,\n          maxRetryMs: 30000,\n        };\n      }\n      default:\n        return { concurrency: 3, intervalMs: 1000, minRetryMs: 1000, maxRetryMs: 30000 };\n    }\n  }\n\n  private async rerankCandidatesWithApi(\n    query: string,\n    candidates: RankedCandidate[],\n    options?: {\n      definitionIntent?: boolean;\n      hasIdentifierHints?: boolean;\n    }\n  ): Promise<RankedCandidate[]> {\n    const reranker = this.config.reranker;\n    if (!reranker || !reranker.enabled || candidates.length <= 1) {\n      return candidates;\n    }\n\n    const queryTokens = Array.from(tokenizeTextForRanking(query));\n    const preferSourcePaths = classifyQueryIntentRaw(query) === \"source\";\n    const docIntent = classifyDocIntent(queryTokens) === \"docs\";\n\n    if (options?.definitionIntent === true) {\n      return candidates;\n    }\n\n    if (options?.hasIdentifierHints === true && preferSourcePaths && !docIntent) {\n      return candidates;\n    }\n\n    const topN = Math.min(reranker.topN, candidates.length);\n    const head = candidates.slice(0, topN);\n    const tail = candidates.slice(topN);\n    const grouped = new Map<ExternalRerankBand, RankedCandidate[]>([\n      [\"implementation\", []],\n      [\"documentation\", []],\n      [\"test\", []],\n      [\"other\", []],\n    ]);\n\n    for (const candidate of head) {\n      const band = classifyExternalRerankBand(candidate, preferSourcePaths, docIntent);\n      grouped.get(band)?.push(candidate);\n    }\n\n    const orderedBands: ExternalRerankBand[] = preferSourcePaths\n      ? [\"implementation\", \"other\", \"documentation\", \"test\"]\n      : docIntent\n        ? [\"documentation\", \"implementation\", \"other\", \"test\"]\n        : [\"implementation\", \"other\", \"documentation\", \"test\"];\n\n    try {\n      const rerankedHead: RankedCandidate[] = [];\n      for (const band of orderedBands) {\n        const bandCandidates = grouped.get(band) ?? [];\n        if (bandCandidates.length <= 1) {\n          rerankedHead.push(...bandCandidates);\n          continue;\n        }\n\n        const documents = await Promise.all(\n          bandCandidates.map(async (candidate) => ({\n            id: candidate.id,\n            text: await this.createRerankerDocumentText(candidate),\n          }))\n        );\n        const rankedIds = await this.callExternalReranker(query, documents, reranker);\n        if (rankedIds.length === 0) {\n          rerankedHead.push(...bandCandidates);\n          continue;\n        }\n\n        const order = new Map(rankedIds.map((id, index) => [id, index]));\n        const bandReranked = [...bandCandidates].sort((a, b) => {\n          const aRank = order.get(a.id) ?? Number.MAX_SAFE_INTEGER;\n          const bRank = order.get(b.id) ?? Number.MAX_SAFE_INTEGER;\n          if (aRank !== bRank) {\n            return aRank - bRank;\n          }\n          if (b.score !== a.score) {\n            return b.score - a.score;\n          }\n          return a.id.localeCompare(b.id);\n        });\n        const shouldDiversifyBand = !options?.hasIdentifierHints;\n        rerankedHead.push(...diversifyCandidatesByFile(bandReranked, shouldDiversifyBand));\n      }\n\n      this.logger.search(\"debug\", \"Applied external reranker\", {\n        provider: reranker.provider,\n        model: reranker.model,\n        candidateCount: head.length,\n        bands: orderedBands,\n      });\n\n      return [...rerankedHead, ...tail];\n    } catch (error) {\n      this.logger.search(\"warn\", \"External reranker failed; using deterministic order\", {\n        provider: reranker.provider,\n        model: reranker.model,\n        error: getErrorMessage(error),\n      });\n      return candidates;\n    }\n  }\n\n  private async callExternalReranker(\n    query: string,\n    documents: RerankDocumentPayload[],\n    reranker: RerankerConfig\n  ): Promise<string[]> {\n    const headers: Record<string, string> = {\n      \"Content-Type\": \"application/json\",\n    };\n    if (reranker.apiKey) {\n      headers.Authorization = `Bearer ${reranker.apiKey}`;\n    }\n\n    const controller = new AbortController();\n    const timeout = setTimeout(() => controller.abort(), reranker.timeoutMs);\n    try {\n      const response = await fetch(`${reranker.baseUrl}/rerank`, {\n        method: \"POST\",\n        headers,\n        body: JSON.stringify({\n          model: reranker.model,\n          query,\n          documents: documents.map((document) => document.text),\n          top_n: documents.length,\n          return_documents: false,\n        }),\n        signal: controller.signal,\n      });\n\n      if (!response.ok) {\n        throw new Error(`Reranker API error: ${response.status} - ${await response.text()}`);\n      }\n\n      const body = await response.json() as {\n        results?: Array<{ index?: number; relevance_score?: number }>;\n      };\n      if (!Array.isArray(body.results)) {\n        throw new Error(\"Reranker API returned unexpected response format.\");\n      }\n\n      return body.results\n        .map((result) => {\n          const index = typeof result.index === \"number\" ? result.index : -1;\n          return documents[index]?.id;\n        })\n        .filter((id): id is string => typeof id === \"string\");\n    } catch (error) {\n      if (error instanceof Error && error.name === \"AbortError\") {\n        throw new Error(`Reranker request timed out after ${reranker.timeoutMs}ms`);\n      }\n      throw error;\n    } finally {\n      clearTimeout(timeout);\n    }\n  }\n\n  private async createRerankerDocumentText(candidate: RankedCandidate): Promise<string> {\n    const parts = [\n      `path: ${candidate.metadata.filePath}`,\n      `chunk_type: ${candidate.metadata.chunkType}`,\n      `language: ${candidate.metadata.language}`,\n      `lines: ${candidate.metadata.startLine}-${candidate.metadata.endLine}`,\n    ];\n\n    if (candidate.metadata.name) {\n      parts.push(`name: ${candidate.metadata.name}`);\n    }\n\n    const intent = isLikelyImplementationPath(candidate.metadata.filePath) ? \"implementation\" : \"doc_or_test\";\n    parts.push(`intent_hint: ${intent}`);\n\n    try {\n      const fileContent = await fsPromises.readFile(candidate.metadata.filePath, \"utf-8\");\n      const lines = fileContent.split(\"\\n\");\n      const snippetStartLine = Math.max(1, candidate.metadata.startLine - 2);\n      const snippetEndLine = Math.min(lines.length, candidate.metadata.endLine + 2);\n      const snippet = lines.slice(snippetStartLine - 1, snippetEndLine).join(\"\\n\").trim();\n      parts.push(\"snippet:\");\n      parts.push(snippet.length > 0 ? snippet : \"[empty]\");\n    } catch {\n      parts.push(\"snippet:\");\n      parts.push(\"[unavailable]\");\n    }\n\n    return parts.join(\"\\n\");\n  }\n\n  async initialize(): Promise<void> {\n    if (this.config.embeddingProvider === 'custom') {\n      if (!this.config.customProvider) {\n        throw new Error(\"embeddingProvider is 'custom' but customProvider config is missing.\");\n      }\n      this.configuredProviderInfo = createCustomProviderInfo(this.config.customProvider);\n    } else if (this.config.embeddingProvider === 'auto') {\n      this.configuredProviderInfo = await tryDetectProvider();\n    } else {\n      this.configuredProviderInfo = await detectEmbeddingProvider(this.config.embeddingProvider, this.config.embeddingModel);\n    }\n\n    if (!this.configuredProviderInfo) {\n      throw new Error(\n        \"No embedding provider available. Configure GitHub Copilot, OpenAI, Google, Ollama, or a custom OpenAI-compatible endpoint.\"\n      );\n    }\n\n    this.logger.info(\"Initializing indexer\", {\n      provider: this.configuredProviderInfo.provider,\n      model: this.configuredProviderInfo.modelInfo.model,\n      scope: this.config.scope,\n      rerankerEnabled: this.config.reranker?.enabled ?? false,\n    });\n\n    this.provider = createEmbeddingProvider(this.configuredProviderInfo);\n\n    if (this.config.reranker?.enabled) {\n      this.reranker = createReranker(this.config.reranker);\n      if (this.reranker.isAvailable()) {\n        this.logger.info(\"Reranker initialized\", {\n          model: this.config.reranker.model,\n          baseUrl: this.config.reranker.baseUrl,\n        });\n      }\n    }\n\n    await fsPromises.mkdir(this.indexPath, { recursive: true });\n\n    // NOTE: Interrupted indexing recovery is deferred until after store,\n    // invertedIndex, and database are initialized (see below). Running it here\n    // would cause infinite recursion: recovery → healthCheck → ensureInitialized\n    // → initialize (store not yet set) → recovery → ...\n\n    const dimensions = this.configuredProviderInfo.modelInfo.dimensions;\n    const storePath = path.join(this.indexPath, \"vectors\");\n    this.store = new VectorStore(storePath, dimensions);\n\n    const indexFilePath = path.join(this.indexPath, \"vectors.usearch\");\n    if (existsSync(indexFilePath)) {\n      this.store.load();\n    }\n\n    const invertedIndexPath = path.join(this.indexPath, \"inverted-index.json\");\n    this.invertedIndex = new InvertedIndex(invertedIndexPath);\n    try {\n      this.invertedIndex.load();\n    } catch {\n      if (existsSync(invertedIndexPath)) {\n        await fsPromises.unlink(invertedIndexPath);\n      }\n      this.invertedIndex = new InvertedIndex(invertedIndexPath);\n    }\n\n    const dbPath = path.join(this.indexPath, \"codebase.db\");\n    let dbIsNew = !existsSync(dbPath);\n    try {\n      this.database = new Database(dbPath);\n    } catch (error) {\n      if (!(await this.tryResetCorruptedIndex(\"initializing index database\", error))) {\n        throw error;\n      }\n\n      this.store = new VectorStore(storePath, dimensions);\n      this.invertedIndex = new InvertedIndex(invertedIndexPath);\n      this.database = new Database(dbPath);\n      dbIsNew = true;\n    }\n\n    if (isGitRepo(this.projectRoot)) {\n      this.currentBranch = getBranchOrDefault(this.projectRoot);\n      this.baseBranch = getBaseBranch(this.projectRoot);\n      this.logger.branch(\"info\", \"Detected git repository\", {\n        currentBranch: this.currentBranch,\n        baseBranch: this.baseBranch,\n      });\n    } else {\n      this.currentBranch = \"default\";\n      this.baseBranch = \"default\";\n      this.logger.branch(\"debug\", \"Not a git repository, using default branch\");\n    }\n\n    // Recover from interrupted indexing AFTER store, invertedIndex, and database\n    // are all initialized. healthCheck() calls ensureInitialized() which checks\n    // these fields — if they're not set, it re-enters initialize() causing infinite\n    // recursion and 70GB+ memory usage.\n    if (this.checkForInterruptedIndexing()) {\n      await this.recoverFromInterruptedIndexing();\n    }\n\n    if (dbIsNew && this.store.count() > 0) {\n      this.migrateFromLegacyIndex();\n    }\n\n    this.loadFileHashCache();\n\n    this.indexCompatibility = this.validateIndexCompatibility(this.configuredProviderInfo);\n    if (!this.indexCompatibility.compatible) {\n      this.logger.warn(\"Index compatibility issue detected\", {\n        reason: this.indexCompatibility.reason,\n        storedMetadata: this.indexCompatibility.storedMetadata,\n        configuredProviderInfo: this.configuredProviderInfo,\n      });\n    }\n\n    // Auto-GC: Run garbage collection if enabled and interval has elapsed\n    if (this.config.indexing.autoGc) {\n      await this.maybeRunAutoGc();\n    }\n  }\n\n  private async maybeRunAutoGc(): Promise<void> {\n    if (!this.database) return;\n\n    const lastGcTimestamp = this.database.getMetadata(\"lastGcTimestamp\");\n    const now = Date.now();\n    const intervalMs = this.config.indexing.gcIntervalDays * 24 * 60 * 60 * 1000;\n\n    let shouldRunGc = false;\n    if (!lastGcTimestamp) {\n      // Never run GC before, run it now\n      shouldRunGc = true;\n    } else {\n      const lastGcTime = parseInt(lastGcTimestamp, 10);\n      if (!isNaN(lastGcTime) && now - lastGcTime > intervalMs) {\n        shouldRunGc = true;\n      }\n    }\n\n    if (shouldRunGc) {\n      const result = await this.healthCheck();\n      if (result.warning) {\n        this.database.setMetadata(STARTUP_WARNING_METADATA_KEY, result.warning);\n      } else {\n        this.database.deleteMetadata(STARTUP_WARNING_METADATA_KEY);\n      }\n      this.database.setMetadata(\"lastGcTimestamp\", now.toString());\n    }\n  }\n\n  private async maybeRunOrphanGc(): Promise<CorruptedIndexResetResult | null> {\n    if (!this.database) return null;\n\n    const stats = this.database.getStats();\n    if (!stats) return null;\n\n    const orphanCount = stats.embeddingCount - stats.chunkCount;\n    if (orphanCount > this.config.indexing.gcOrphanThreshold) {\n      try {\n        this.database.gcOrphanEmbeddings();\n        this.database.gcOrphanChunks();\n      } catch (error) {\n        if (await this.tryResetCorruptedIndex(\"running automatic orphan garbage collection\", error)) {\n          return {\n            resetCorruptedIndex: true,\n            warning: this.getCorruptedIndexWarning(path.join(this.indexPath, \"codebase.db\")),\n          };\n        }\n        throw error;\n      }\n      this.database.setMetadata(\"lastGcTimestamp\", Date.now().toString());\n    }\n\n    return null;\n  }\n\n  private rebuildVectorStoreExcludingChunkIds(\n    store: VectorStore,\n    database: Database,\n    excludedChunkIds: Iterable<string>\n  ): void {\n    const excludedSet = new Set(excludedChunkIds);\n    if (excludedSet.size === 0) {\n      return;\n    }\n\n    const retainedEntries = store\n      .getAllMetadata()\n      .filter(({ key }) => !excludedSet.has(key));\n\n    const storeBasePath = path.join(this.indexPath, \"vectors\");\n    const storeIndexPath = `${storeBasePath}.usearch`;\n    const storeMetadataPath = `${storeBasePath}.meta.json`;\n    const backupIndexPath = `${storeIndexPath}.bak`;\n    const backupMetadataPath = `${storeMetadataPath}.bak`;\n\n    let backedUpIndex = false;\n    let backedUpMetadata = false;\n    let rebuiltCount = 0;\n    let skippedCount = 0;\n\n    if (existsSync(backupIndexPath)) {\n      unlinkSync(backupIndexPath);\n    }\n    if (existsSync(backupMetadataPath)) {\n      unlinkSync(backupMetadataPath);\n    }\n\n    try {\n      if (existsSync(storeIndexPath)) {\n        renameSync(storeIndexPath, backupIndexPath);\n        backedUpIndex = true;\n      }\n      if (existsSync(storeMetadataPath)) {\n        renameSync(storeMetadataPath, backupMetadataPath);\n        backedUpMetadata = true;\n      }\n\n      store.clear();\n\n      for (const { key, metadata } of retainedEntries) {\n        const chunk = database.getChunk(key);\n        if (!chunk) {\n          skippedCount += 1;\n          continue;\n        }\n\n        const embeddingBuffer = database.getEmbedding(chunk.contentHash);\n        if (!embeddingBuffer) {\n          skippedCount += 1;\n          continue;\n        }\n\n        const vector = bufferToFloat32Array(embeddingBuffer);\n        store.add(key, Array.from(vector), metadata);\n        rebuiltCount += 1;\n      }\n\n      store.save();\n\n      if (backedUpIndex && existsSync(backupIndexPath)) {\n        unlinkSync(backupIndexPath);\n      }\n      if (backedUpMetadata && existsSync(backupMetadataPath)) {\n        unlinkSync(backupMetadataPath);\n      }\n\n      this.logger.gc(\"info\", \"Rebuilt vector store to avoid native remove\", {\n        excludedChunks: excludedSet.size,\n        rebuiltChunks: rebuiltCount,\n        skippedChunks: skippedCount,\n      });\n    } catch (error) {\n      try {\n        store.clear();\n      } catch {\n        // Ignore best-effort cleanup before restore.\n      }\n\n      if (existsSync(storeIndexPath)) {\n        unlinkSync(storeIndexPath);\n      }\n      if (existsSync(storeMetadataPath)) {\n        unlinkSync(storeMetadataPath);\n      }\n\n      if (backedUpIndex && existsSync(backupIndexPath)) {\n        renameSync(backupIndexPath, storeIndexPath);\n      }\n      if (backedUpMetadata && existsSync(backupMetadataPath)) {\n        renameSync(backupMetadataPath, storeMetadataPath);\n      }\n\n      if (backedUpIndex || backedUpMetadata) {\n        store.load();\n      }\n\n      throw error;\n    }\n  }\n\n  private getCorruptedIndexWarning(dbPath: string): string {\n    if (this.config.scope === \"global\") {\n      return `Detected a corrupted shared global SQLite index at ${dbPath}. Automatic repair is disabled for global scope because it may delete other projects' index data. Remove or repair the shared index manually, then rerun index_codebase with force=true.`;\n    }\n\n    return `Detected a corrupted local SQLite index at ${dbPath} and reset the local index. Run index_codebase to rebuild search data.`;\n  }\n\n  private async tryResetCorruptedIndex(stage: string, error: unknown): Promise<boolean> {\n    if (!isSqliteCorruptionError(error)) {\n      return false;\n    }\n\n    const dbPath = path.join(this.indexPath, \"codebase.db\");\n    const warning = this.getCorruptedIndexWarning(dbPath);\n    const errorMessage = getErrorMessage(error);\n\n    if (this.config.scope === \"global\") {\n      this.logger.error(\"Detected corrupted shared global index database\", {\n        stage,\n        dbPath,\n        error: errorMessage,\n      });\n      throw new Error(`${warning} Original SQLite error: ${errorMessage}`);\n    }\n\n    this.logger.warn(\"Detected corrupted local index database, resetting local index\", {\n      stage,\n      dbPath,\n      error: errorMessage,\n    });\n\n    this.store = null;\n    this.invertedIndex = null;\n    this.database?.close();\n    this.database = null;\n    this.indexCompatibility = null;\n    this.fileHashCache.clear();\n\n    const resetPaths = [\n      path.join(this.indexPath, \"codebase.db\"),\n      path.join(this.indexPath, \"codebase.db-shm\"),\n      path.join(this.indexPath, \"codebase.db-wal\"),\n      path.join(this.indexPath, \"vectors.usearch\"),\n      path.join(this.indexPath, \"inverted-index.json\"),\n      path.join(this.indexPath, \"file-hashes.json\"),\n      path.join(this.indexPath, \"failed-batches.json\"),\n      path.join(this.indexPath, \"indexing.lock\"),\n      path.join(this.indexPath, \"vectors\"),\n    ];\n\n    await Promise.all(resetPaths.map(async (targetPath) => {\n      try {\n        await fsPromises.rm(targetPath, { recursive: true, force: true });\n      } catch {\n        // Best-effort cleanup. The follow-up reinitialization will recreate what it needs.\n      }\n    }));\n\n    await fsPromises.mkdir(this.indexPath, { recursive: true });\n    return true;\n  }\n\n  private migrateFromLegacyIndex(): void {\n    if (!this.store || !this.database) return;\n\n    const allMetadata = this.store.getAllMetadata();\n    const chunkIds: string[] = [];\n    const chunkDataBatch: ChunkData[] = [];\n\n    for (const { key, metadata } of allMetadata) {\n      const chunkData: ChunkData = {\n        chunkId: key,\n        contentHash: metadata.hash,\n        filePath: metadata.filePath,\n        startLine: metadata.startLine,\n        endLine: metadata.endLine,\n        nodeType: metadata.chunkType,\n        name: metadata.name,\n        language: metadata.language,\n      };\n      chunkDataBatch.push(chunkData);\n      chunkIds.push(key);\n    }\n\n    if (chunkDataBatch.length > 0) {\n      this.database.upsertChunksBatch(chunkDataBatch);\n    }\n    this.database.addChunksToBranchBatch(this.getBranchCatalogKey(), chunkIds);\n  }\n\n  private loadIndexMetadata(): IndexMetadata | null {\n    if (!this.database) return null;\n\n    const version = this.database.getMetadata(\"index.version\");\n    if (!version) return null;\n\n      return {\n        indexVersion: version,\n        embeddingProvider: this.database.getMetadata(\"index.embeddingProvider\") ?? \"\",\n        embeddingModel: this.database.getMetadata(\"index.embeddingModel\") ?? \"\",\n        embeddingDimensions: parseInt(this.database.getMetadata(\"index.embeddingDimensions\") ?? \"0\", 10),\n        embeddingStrategyVersion: this.loadStoredEmbeddingStrategyVersion() ?? EMBEDDING_STRATEGY_VERSION,\n        createdAt: this.database.getMetadata(\"index.createdAt\") ?? \"\",\n        updatedAt: this.database.getMetadata(\"index.updatedAt\") ?? \"\",\n      };\n  }\n\n  private saveIndexMetadata(provider: ConfiguredProviderInfo): void {\n    if (!this.database) return;\n\n    const now = new Date().toISOString();\n    const existingCreatedAt = this.database.getMetadata(\"index.createdAt\");\n    const completeProjectEmbeddingStrategyReset = !this.hasProjectForceReembedPending();\n\n    this.database.setMetadata(\"index.version\", INDEX_METADATA_VERSION);\n    this.database.setMetadata(\"index.embeddingProvider\", provider.provider);\n    this.database.setMetadata(\"index.embeddingModel\", provider.modelInfo.model);\n    this.database.setMetadata(\"index.embeddingDimensions\", provider.modelInfo.dimensions.toString());\n    if (this.config.scope === \"global\") {\n      if (completeProjectEmbeddingStrategyReset) {\n        this.database.setMetadata(this.getProjectEmbeddingStrategyMetadataKey(), EMBEDDING_STRATEGY_VERSION);\n      }\n      this.database.setMetadata(this.getLegacyMigrationMetadataKey(), \"done\");\n      if (completeProjectEmbeddingStrategyReset) {\n        this.database.deleteMetadata(this.getProjectForceReembedMetadataKey());\n      }\n    } else {\n      this.database.setMetadata(\"index.embeddingStrategyVersion\", EMBEDDING_STRATEGY_VERSION);\n    }\n    this.database.setMetadata(\"index.updatedAt\", now);\n\n    if (!existingCreatedAt) {\n      this.database.setMetadata(\"index.createdAt\", now);\n    }\n  }\n\n  private validateIndexCompatibility(provider: ConfiguredProviderInfo): IndexCompatibility {\n    const storedMetadata = this.loadIndexMetadata();\n\n    if (!storedMetadata) {\n      return { compatible: true };\n    }\n\n    const currentProvider = provider.provider;\n    const currentModel = provider.modelInfo.model;\n    const currentDimensions = provider.modelInfo.dimensions;\n\n    if (storedMetadata.embeddingDimensions !== currentDimensions) {\n      return {\n        compatible: false,\n        code: IncompatibilityCode.DIMENSION_MISMATCH,\n        reason: `Dimension mismatch: index has ${storedMetadata.embeddingDimensions}D vectors (${storedMetadata.embeddingProvider}/${storedMetadata.embeddingModel}), but current provider uses ${currentDimensions}D (${currentProvider}/${currentModel}). Run index_codebase with force=true to rebuild.`,\n        storedMetadata,\n      };\n    }\n\n    if (storedMetadata.embeddingModel !== currentModel) {\n      return {\n        compatible: false,\n        code: IncompatibilityCode.MODEL_MISMATCH,\n        reason: `Model mismatch: index was built with \"${storedMetadata.embeddingModel}\", but current model is \"${currentModel}\". Embeddings are incompatible. Run index_codebase with force=true to rebuild.`,\n        storedMetadata,\n      };\n    }\n\n    if (storedMetadata.embeddingStrategyVersion !== EMBEDDING_STRATEGY_VERSION) {\n      return {\n        compatible: false,\n        code: IncompatibilityCode.EMBEDDING_STRATEGY_MISMATCH,\n        reason: `Embedding strategy mismatch: index was built with embedding strategy v${storedMetadata.embeddingStrategyVersion}, but the current code requires v${EMBEDDING_STRATEGY_VERSION}. Run index_codebase with force=true to rebuild cached embeddings.`,\n        storedMetadata,\n      };\n    }\n\n    if (storedMetadata.embeddingProvider !== currentProvider) {\n      this.logger.warn(\"Provider changed\", {\n        storedProvider: storedMetadata.embeddingProvider,\n        currentProvider,\n      });\n    }\n\n    return {\n      compatible: true,\n      storedMetadata,\n    };\n  }\n\n  checkCompatibility(): IndexCompatibility {\n    if (!this.indexCompatibility) {\n      if (!this.configuredProviderInfo) {\n        throw new Error('No embedding provider info, you must initialize the indexer first.');\n      }\n\n      this.indexCompatibility = this.validateIndexCompatibility(this.configuredProviderInfo);\n    }\n    return this.indexCompatibility;\n  }\n\n  private async ensureInitialized(): Promise<{\n    store: VectorStore;\n    provider: EmbeddingProviderInterface;\n    invertedIndex: InvertedIndex;\n    configuredProviderInfo: ConfiguredProviderInfo;\n    database: Database;\n  }> {\n    if (!this.store || !this.provider || !this.invertedIndex || !this.configuredProviderInfo || !this.database) {\n      await this.initialize();\n    }\n    return {\n      store: this.store!,\n      provider: this.provider!,\n      invertedIndex: this.invertedIndex!,\n      configuredProviderInfo: this.configuredProviderInfo!,\n      database: this.database!,\n    };\n  }\n\n  async estimateCost(): Promise<CostEstimate> {\n    const { configuredProviderInfo } = await this.ensureInitialized();\n\n    const includePatterns = [...this.config.include, ...this.config.additionalInclude];\n    const { files } = await collectFiles(\n      this.projectRoot,\n      includePatterns,\n      this.config.exclude,\n      this.config.indexing.maxFileSize,\n      this.config.knowledgeBases,\n      { maxDepth: this.config.indexing.maxDepth, maxFilesPerDirectory: this.config.indexing.maxFilesPerDirectory }\n    );\n\n    return createCostEstimate(files, configuredProviderInfo);\n  }\n\n  async index(onProgress?: ProgressCallback): Promise<IndexStats> {\n    const { store, provider, invertedIndex, database, configuredProviderInfo } = await this.ensureInitialized();\n    const scopedRoots = this.config.scope === \"global\" ? this.getScopedRoots() : null;\n    const branchCatalogKey = this.getBranchCatalogKey();\n    const forceScopedReembed = scopedRoots !== null && database.getMetadata(this.getProjectForceReembedMetadataKey()) === \"true\";\n    const failedForcedChunkIds = new Set<string>();\n\n    if (!this.indexCompatibility?.compatible) {\n      throw new Error(\n        `${this.indexCompatibility?.reason} ` +\n        `Run index_codebase with force=true to rebuild the index.`\n      );\n    }\n\n    this.acquireIndexingLock();\n    this.logger.recordIndexingStart();\n    this.logger.info(\"Starting indexing\", { projectRoot: this.projectRoot });\n\n    const startTime = Date.now();\n    const stats: IndexStats = {\n      totalFiles: 0,\n      totalChunks: 0,\n      indexedChunks: 0,\n      failedChunks: 0,\n      tokensUsed: 0,\n      durationMs: 0,\n      existingChunks: 0,\n      removedChunks: 0,\n      skippedFiles: [],\n      parseFailures: [],\n    };\n    const failedBatchesForCurrentRun: FailedBatch[] = [];\n\n    onProgress?.({\n      phase: \"scanning\",\n      filesProcessed: 0,\n      totalFiles: 0,\n      chunksProcessed: 0,\n      totalChunks: 0,\n    });\n\n    this.loadFileHashCache();\n\n    const includePatterns = [...this.config.include, ...this.config.additionalInclude];\n    const { files, skipped } = await collectFiles(\n      this.projectRoot,\n      includePatterns,\n      this.config.exclude,\n      this.config.indexing.maxFileSize,\n      this.config.knowledgeBases,\n      { maxDepth: this.config.indexing.maxDepth, maxFilesPerDirectory: this.config.indexing.maxFilesPerDirectory }\n    );\n\n    stats.totalFiles = files.length;\n    stats.skippedFiles = skipped;\n\n    this.logger.recordFilesScanned(files.length);\n    this.logger.cache(\"debug\", \"Scanning files for changes\", {\n      totalFiles: files.length,\n      skippedFiles: skipped.length,\n    });\n\n    const changedFiles: Array<{ path: string; content: string; hash: string }> = [];\n    const unchangedFilePaths = new Set<string>();\n    const currentFileHashes = new Map<string, string>();\n\n    for (const f of files) {\n      const currentHash = hashFile(f.path);\n      currentFileHashes.set(f.path, currentHash);\n\n      if (this.fileHashCache.get(f.path) === currentHash) {\n        unchangedFilePaths.add(f.path);\n        this.logger.recordCacheHit();\n      } else {\n        const content = await fsPromises.readFile(f.path, \"utf-8\");\n        changedFiles.push({ path: f.path, content, hash: currentHash });\n        this.logger.recordCacheMiss();\n      }\n    }\n\n    this.logger.cache(\"info\", \"File hash cache results\", {\n      unchanged: unchangedFilePaths.size,\n      changed: changedFiles.length,\n    });\n\n    onProgress?.({\n      phase: \"parsing\",\n      filesProcessed: 0,\n      totalFiles: files.length,\n      chunksProcessed: 0,\n      totalChunks: 0,\n    });\n\n    const parseStartTime = performance.now();\n    const parsedFiles = parseFiles(changedFiles);\n    const parseMs = performance.now() - parseStartTime;\n\n    this.logger.recordFilesParsed(parsedFiles.length);\n    this.logger.recordParseDuration(parseMs);\n    this.logger.debug(\"Parsed changed files\", { parsedCount: parsedFiles.length, parseMs: parseMs.toFixed(2) });\n\n    const existingChunks = new Map<string, string>();\n    const existingChunksByFile = new Map<string, Set<string>>();\n    for (const { key, metadata } of store.getAllMetadata()) {\n      if (scopedRoots && !this.isFileInCurrentScope(metadata.filePath, scopedRoots)) {\n        continue;\n      }\n      if (forceScopedReembed && scopedRoots && this.isFileInCurrentScope(metadata.filePath, scopedRoots)) {\n        continue;\n      }\n      existingChunks.set(key, metadata.hash);\n      const fileChunks = existingChunksByFile.get(metadata.filePath) || new Set();\n      fileChunks.add(key);\n      existingChunksByFile.set(metadata.filePath, fileChunks);\n    }\n\n    const currentChunkIds = new Set<string>();\n    const currentFilePaths = new Set<string>();\n    const pendingChunks: PendingChunk[] = [];\n\n    for (const filePath of unchangedFilePaths) {\n      currentFilePaths.add(filePath);\n      const fileChunks = existingChunksByFile.get(filePath);\n      if (fileChunks) {\n        for (const chunkId of fileChunks) {\n          currentChunkIds.add(chunkId);\n        }\n      }\n    }\n\n    const chunkDataBatch: ChunkData[] = [];\n\n    for (const parsed of parsedFiles) {\n      currentFilePaths.add(parsed.path);\n\n      if (parsed.chunks.length === 0) {\n        const relativePath = path.relative(this.projectRoot, parsed.path);\n        stats.parseFailures.push(relativePath);\n      }\n\n      let fileChunkCount = 0;\n      let chunksToProcess = parsed.chunks;\n\n      if (this.config.indexing.fallbackToTextOnMaxChunks && chunksToProcess.length > this.config.indexing.maxChunksPerFile) {\n        const changedFile = changedFiles.find(f => f.path === parsed.path);\n        if (changedFile) {\n          const textChunks = parseFileAsText(parsed.path, changedFile.content);\n          chunksToProcess = textChunks;\n        }\n      }\n\n      for (const chunk of chunksToProcess) {\n        if (fileChunkCount >= this.config.indexing.maxChunksPerFile) {\n          break;\n        }\n\n        if (this.config.indexing.semanticOnly && chunk.chunkType === \"other\") {\n          continue;\n        }\n\n        const id = generateChunkId(parsed.path, chunk);\n        const contentHash = generateChunkHash(chunk);\n        currentChunkIds.add(id);\n\n        chunkDataBatch.push({\n          chunkId: id,\n          contentHash,\n          filePath: parsed.path,\n          startLine: chunk.startLine,\n          endLine: chunk.endLine,\n          nodeType: chunk.chunkType,\n          name: chunk.name,\n          language: chunk.language,\n        });\n\n        if (existingChunks.get(id) === contentHash) {\n          fileChunkCount++;\n          continue;\n        }\n\n        const texts = createEmbeddingTexts(chunk, parsed.path, getSafeEmbeddingChunkTokenLimit(configuredProviderInfo)).map((text) => ({\n          text,\n          tokenCount: estimateTokens(text),\n        }));\n        const metadata: ChunkMetadata = {\n          filePath: parsed.path,\n          startLine: chunk.startLine,\n          endLine: chunk.endLine,\n          chunkType: chunk.chunkType,\n          name: chunk.name,\n          language: chunk.language,\n          hash: contentHash,\n        };\n\n        pendingChunks.push({\n          id,\n          texts,\n          storageText: createPendingChunkStorageText(texts),\n          content: chunk.content,\n          contentHash,\n          metadata,\n        });\n        fileChunkCount++;\n      }\n    }\n\n    const retryableFailedChunks = this.collectRetryableFailedChunks(\n      currentFileHashes,\n      unchangedFilePaths,\n      getSafeEmbeddingChunkTokenLimit(configuredProviderInfo)\n    );\n    const retryableFailedAttemptCounts = new Map<string, number>();\n    const retryableChunksWithExistingData = new Set<string>();\n    if (retryableFailedChunks.length > 0) {\n      const pendingChunkIds = new Set(pendingChunks.map((chunk) => chunk.id));\n      for (const { chunk, attemptCount } of retryableFailedChunks) {\n        retryableFailedAttemptCounts.set(chunk.id, attemptCount);\n        if (existingChunks.has(chunk.id)) {\n          retryableChunksWithExistingData.add(chunk.id);\n        }\n        if (!pendingChunkIds.has(chunk.id)) {\n          pendingChunks.push(chunk);\n          pendingChunkIds.add(chunk.id);\n          currentChunkIds.add(chunk.id);\n        }\n      }\n    }\n\n    if (chunkDataBatch.length > 0) {\n      database.upsertChunksBatch(chunkDataBatch);\n    }\n\n    const allSymbolIds = new Set<string>();\n    const symbolsByFile = new Map<string, SymbolData[]>();\n\n    for (let i = 0; i < parsedFiles.length; i++) {\n      const parsed = parsedFiles[i];\n      const changedFile = changedFiles[i];\n\n      database.deleteCallEdgesByFile(parsed.path);\n      database.deleteSymbolsByFile(parsed.path);\n\n      const fileSymbols: SymbolData[] = [];\n\n      for (const chunk of parsed.chunks) {\n        if (!chunk.name || !CALL_GRAPH_SYMBOL_CHUNK_TYPES.has(chunk.chunkType)) continue;\n\n        const symbolId = `sym_${hashContent(parsed.path + \":\" + chunk.name + \":\" + chunk.chunkType + \":\" + chunk.startLine).slice(0, 16)}`;\n        const symbol: SymbolData = {\n          id: symbolId,\n          filePath: parsed.path,\n          name: chunk.name,\n          kind: chunk.chunkType,\n          startLine: chunk.startLine,\n          startCol: 0,\n          endLine: chunk.endLine,\n          endCol: 0,\n          language: chunk.language,\n        };\n        fileSymbols.push(symbol);\n        allSymbolIds.add(symbolId);\n      }\n\n      // For case-insensitive languages (e.g. Apex), the Rust call extractor\n      // already lowercases non-constructor / non-import callee names, so we\n      // must lowercase the symbol-map keys here too. Otherwise a declaration\n      // like `MyMethod` would not match a lowercased call edge target like\n      // `mymethod`, leaving same-file calls unresolved (toSymbolId = NULL).\n      const fileLanguage = parsed.chunks[0]?.language;\n      const isCaseInsensitiveLanguage =\n        !!fileLanguage && CASE_INSENSITIVE_LANGUAGES.has(fileLanguage);\n      const normalizeSymbolKey = (name: string): string =>\n        isCaseInsensitiveLanguage ? name.toLowerCase() : name;\n\n      const symbolsByName = new Map<string, SymbolData[]>();\n      for (const symbol of fileSymbols) {\n        const key = normalizeSymbolKey(symbol.name);\n        const existing = symbolsByName.get(key) ?? [];\n        existing.push(symbol);\n        symbolsByName.set(key, existing);\n      }\n\n      if (fileSymbols.length > 0) {\n        database.upsertSymbolsBatch(fileSymbols);\n        symbolsByFile.set(parsed.path, fileSymbols);\n      }\n\n      if (!fileLanguage || !CALL_GRAPH_LANGUAGES.has(fileLanguage)) continue;\n\n      const callSites = extractCalls(changedFile.content, fileLanguage);\n      if (callSites.length === 0) continue;\n\n      const edges: CallEdgeData[] = [];\n      for (const site of callSites) {\n        const enclosingSymbol = fileSymbols.find(\n          (sym) => site.line >= sym.startLine && site.line <= sym.endLine\n        );\n        if (!enclosingSymbol) continue;\n\n        const edgeId = `edge_${hashContent(enclosingSymbol.id + \":\" + site.calleeName + \":\" + site.line + \":\" + site.column).slice(0, 16)}`;\n        edges.push({\n          id: edgeId,\n          fromSymbolId: enclosingSymbol.id,\n          targetName: site.calleeName,\n          toSymbolId: undefined,\n          callType: site.callType,\n          confidence: site.confidence,\n          line: site.line,\n          col: site.column,\n          isResolved: false,\n        });\n      }\n\n      if (edges.length > 0) {\n        database.upsertCallEdgesBatch(edges);\n\n        // Resolve same-file calls (with the same case-insensitivity rules\n        // used to build symbolsByName above).\n        for (const edge of edges) {\n          const candidates = symbolsByName.get(normalizeSymbolKey(edge.targetName));\n          if (candidates && candidates.length === 1) {\n            database.resolveCallEdge(edge.id, candidates[0].id);\n          }\n        }\n      }\n    }\n\n    for (const filePath of unchangedFilePaths) {\n      const existingSymbols = database.getSymbolsByFile(filePath);\n      for (const sym of existingSymbols) {\n        allSymbolIds.add(sym.id);\n      }\n    }\n\n    const removedChunkIds: string[] = [];\n    for (const [chunkId] of existingChunks) {\n      if (!currentChunkIds.has(chunkId)) {\n        removedChunkIds.push(chunkId);\n      }\n    }\n\n    if (removedChunkIds.length > 0) {\n      this.rebuildVectorStoreExcludingChunkIds(store, database, removedChunkIds);\n      for (const chunkId of removedChunkIds) {\n        invertedIndex.removeChunk(chunkId);\n      }\n      database.deleteChunksByIds(removedChunkIds);\n    }\n\n    const removedCount = removedChunkIds.length;\n\n    stats.totalChunks = pendingChunks.length;\n    stats.existingChunks = currentChunkIds.size - pendingChunks.length;\n    stats.removedChunks = removedCount;\n\n    this.logger.recordChunksProcessed(currentChunkIds.size);\n    this.logger.recordChunksRemoved(removedCount);\n    this.logger.info(\"Chunk analysis complete\", {\n      pending: pendingChunks.length,\n      existing: stats.existingChunks,\n      removed: removedCount,\n    });\n\n    if (pendingChunks.length === 0 && removedCount === 0) {\n      database.clearBranch(branchCatalogKey);\n      database.addChunksToBranchBatch(branchCatalogKey, Array.from(currentChunkIds));\n      database.clearBranchSymbols(branchCatalogKey);\n      database.addSymbolsToBranchBatch(branchCatalogKey, Array.from(allSymbolIds));\n      if (scopedRoots) {\n        this.replaceScopedFileHashCache(currentFileHashes, scopedRoots);\n        this.clearScopedFailedBatches(scopedRoots);\n      } else {\n        this.fileHashCache = currentFileHashes;\n        this.saveFileHashCache();\n        this.saveFailedBatches([]);\n      }\n      this.saveIndexMetadata(configuredProviderInfo);\n      this.indexCompatibility = { compatible: true };\n      stats.durationMs = Date.now() - startTime;\n      onProgress?.({\n        phase: \"complete\",\n        filesProcessed: files.length,\n        totalFiles: files.length,\n        chunksProcessed: 0,\n        totalChunks: 0,\n      });\n      this.releaseIndexingLock();\n      return stats;\n    }\n\n    if (pendingChunks.length === 0) {\n      database.clearBranch(branchCatalogKey);\n      database.addChunksToBranchBatch(branchCatalogKey, Array.from(currentChunkIds));\n      database.clearBranchSymbols(branchCatalogKey);\n      database.addSymbolsToBranchBatch(branchCatalogKey, Array.from(allSymbolIds));\n      store.save();\n      invertedIndex.save();\n      if (scopedRoots) {\n        this.replaceScopedFileHashCache(currentFileHashes, scopedRoots);\n        this.clearScopedFailedBatches(scopedRoots);\n      } else {\n        this.fileHashCache = currentFileHashes;\n        this.saveFileHashCache();\n        this.saveFailedBatches([]);\n      }\n      this.saveIndexMetadata(configuredProviderInfo);\n      this.indexCompatibility = { compatible: true };\n      stats.durationMs = Date.now() - startTime;\n      onProgress?.({\n        phase: \"complete\",\n        filesProcessed: files.length,\n        totalFiles: files.length,\n        chunksProcessed: 0,\n        totalChunks: 0,\n      });\n      this.releaseIndexingLock();\n      return stats;\n    }\n\n    onProgress?.({\n      phase: \"embedding\",\n      filesProcessed: files.length,\n      totalFiles: files.length,\n      chunksProcessed: 0,\n      totalChunks: pendingChunks.length,\n    });\n\n    const allContentHashes = pendingChunks.map((c) => c.contentHash);\n    const missingHashes = new Set(database.getMissingEmbeddings(allContentHashes));\n    const forcedReembedChunkIds = forceScopedReembed\n      ? new Set(pendingChunks.map((chunk) => chunk.id))\n      : new Set<string>();\n\n    const chunksNeedingEmbedding = pendingChunks.filter((c) => forcedReembedChunkIds.has(c.id) || missingHashes.has(c.contentHash));\n    const chunksWithExistingEmbedding = pendingChunks.filter((c) => !forcedReembedChunkIds.has(c.id) && !missingHashes.has(c.contentHash));\n\n    this.logger.cache(\"info\", \"Embedding cache lookup\", {\n      needsEmbedding: chunksNeedingEmbedding.length,\n      fromCache: chunksWithExistingEmbedding.length,\n    });\n    this.logger.recordChunksFromCache(chunksWithExistingEmbedding.length);\n\n    for (const chunk of chunksWithExistingEmbedding) {\n      const embeddingBuffer = database.getEmbedding(chunk.contentHash);\n      if (embeddingBuffer) {\n        const vector = bufferToFloat32Array(embeddingBuffer);\n        store.add(chunk.id, Array.from(vector), chunk.metadata);\n        invertedIndex.removeChunk(chunk.id);\n        invertedIndex.addChunk(chunk.id, chunk.content);\n        stats.indexedChunks++;\n      }\n    }\n\n    const providerRateLimits = this.getProviderRateLimits(configuredProviderInfo.provider);\n    const queue = new PQueue({\n      concurrency: providerRateLimits.concurrency,\n      interval: providerRateLimits.intervalMs,\n      intervalCap: providerRateLimits.concurrency\n    });\n    const pendingChunksById = new Map(chunksNeedingEmbedding.map((chunk) => [chunk.id, chunk]));\n    const embeddingPartsByChunk = new Map<string, Array<{ vector: number[]; tokenCount: number } | undefined>>();\n    const completedChunkIds = new Set<string>();\n    const failedChunkIds = new Set<string>();\n    const requestBatches = createPendingEmbeddingRequestBatches(\n      chunksNeedingEmbedding,\n      getDynamicBatchOptions(configuredProviderInfo)\n    );\n    let rateLimitBackoffMs = 0;\n\n    for (const requestBatch of requestBatches) {\n      queue.add(async () => {\n        if (rateLimitBackoffMs > 0) {\n          await new Promise(resolve => setTimeout(resolve, rateLimitBackoffMs));\n        }\n\n        try {\n          const result = await pRetry(\n            async () => {\n              const texts = requestBatch.map((request) => request.text);\n              return provider.embedBatch(texts);\n            },\n            {\n              retries: this.config.indexing.retries,\n              minTimeout: Math.max(this.config.indexing.retryDelayMs, providerRateLimits.minRetryMs),\n              maxTimeout: providerRateLimits.maxRetryMs,\n              factor: 2,\n              shouldRetry: (error) => !((error as { error?: Error }).error instanceof CustomProviderNonRetryableError),\n              onFailedAttempt: (error) => {\n                const message = getErrorMessage(error);\n                if (isRateLimitError(error)) {\n                  rateLimitBackoffMs = Math.min(providerRateLimits.maxRetryMs, (rateLimitBackoffMs || providerRateLimits.minRetryMs) * 2);\n                  this.logger.embedding(\"warn\", `Rate limited, backing off`, {\n                    attempt: error.attemptNumber,\n                    retriesLeft: error.retriesLeft,\n                    backoffMs: rateLimitBackoffMs,\n                  });\n                } else {\n                  this.logger.embedding(\"error\", `Embedding batch failed`, {\n                    attempt: error.attemptNumber,\n                    error: message,\n                  });\n                }\n              },\n            }\n          );\n\n          if (rateLimitBackoffMs > 0) {\n            rateLimitBackoffMs = Math.max(0, rateLimitBackoffMs - 2000);\n          }\n\n          const touchedChunkIds = new Set<string>();\n\n          requestBatch.forEach((request, idx) => {\n            if (failedChunkIds.has(request.chunk.id) || completedChunkIds.has(request.chunk.id)) {\n              return;\n            }\n\n            const vector = result.embeddings[idx];\n            if (!vector) {\n              throw new Error(`Embedding API returned too few vectors for chunk ${request.chunk.id}`);\n            }\n\n            const parts = embeddingPartsByChunk.get(request.chunk.id) ?? [];\n            parts[request.partIndex] = {\n              vector,\n              tokenCount: request.tokenCount,\n            };\n            embeddingPartsByChunk.set(request.chunk.id, parts);\n            touchedChunkIds.add(request.chunk.id);\n          });\n\n          const pooledResults: Array<{ chunk: PendingChunk; vector: number[] }> = [];\n          for (const chunkId of touchedChunkIds) {\n            if (failedChunkIds.has(chunkId) || completedChunkIds.has(chunkId)) {\n              continue;\n            }\n\n            const chunk = pendingChunksById.get(chunkId);\n            if (!chunk) {\n              continue;\n            }\n\n            const parts = embeddingPartsByChunk.get(chunk.id) ?? [];\n            if (!hasAllEmbeddingParts(parts, chunk.texts.length)) {\n              continue;\n            }\n\n            const orderedParts = parts as Array<{ vector: number[]; tokenCount: number }>;\n            pooledResults.push({\n              chunk,\n              vector: poolEmbeddingVectors(\n                orderedParts.map((part) => part.vector),\n                orderedParts.map((part) => part.tokenCount)\n              ),\n            });\n          }\n\n          if (pooledResults.length > 0) {\n            const items = pooledResults.map(({ chunk, vector }) => ({\n              id: chunk.id,\n              vector,\n              metadata: chunk.metadata,\n            }));\n\n            store.addBatch(items);\n\n            const embeddingBatchItems = pooledResults.map(({ chunk, vector }) => ({\n              contentHash: chunk.contentHash,\n              embedding: float32ArrayToBuffer(vector),\n              chunkText: chunk.storageText,\n              model: configuredProviderInfo.modelInfo.model,\n            }));\n\n            try {\n              database.upsertEmbeddingsBatch(embeddingBatchItems);\n            } catch (dbError) {\n              this.rebuildVectorStoreExcludingChunkIds(\n                store,\n                database,\n                pooledResults.map(({ chunk }) => chunk.id)\n              );\n              throw dbError;\n            }\n\n            for (const { chunk } of pooledResults) {\n              invertedIndex.removeChunk(chunk.id);\n              invertedIndex.addChunk(chunk.id, chunk.content);\n              completedChunkIds.add(chunk.id);\n              embeddingPartsByChunk.delete(chunk.id);\n            }\n\n            stats.indexedChunks += pooledResults.length;\n            this.logger.recordChunksEmbedded(pooledResults.length);\n          }\n\n          stats.tokensUsed += result.totalTokensUsed;\n\n          this.logger.recordEmbeddingApiCall(result.totalTokensUsed);\n          this.logger.embedding(\"debug\", `Embedded batch`, {\n            batchSize: pooledResults.length,\n            requestCount: requestBatch.length,\n            tokens: result.totalTokensUsed,\n          });\n\n          onProgress?.({\n            phase: \"embedding\",\n            filesProcessed: files.length,\n            totalFiles: files.length,\n            chunksProcessed: stats.indexedChunks,\n            totalChunks: pendingChunks.length,\n          });\n        } catch (error) {\n          const failedChunks = getUniquePendingChunksFromRequests(requestBatch)\n            .filter((chunk) => !completedChunkIds.has(chunk.id));\n          const failureMessage = getErrorMessage(error);\n          const failureTimestamp = new Date().toISOString();\n\n          for (const chunk of failedChunks) {\n            if (!failedChunkIds.has(chunk.id)) {\n              failedChunkIds.add(chunk.id);\n              stats.failedChunks += 1;\n            }\n\n            if (forceScopedReembed) {\n              failedForcedChunkIds.add(chunk.id);\n            }\n\n            embeddingPartsByChunk.delete(chunk.id);\n\n            const existingFailedBatchIndex = failedBatchesForCurrentRun.findIndex(\n              (failedBatch) => failedBatch.chunks[0]?.id === chunk.id\n            );\n            const existingFailedBatch = existingFailedBatchIndex === -1\n              ? undefined\n              : failedBatchesForCurrentRun[existingFailedBatchIndex];\n            const failedBatch = {\n              chunks: [chunk],\n              error: failureMessage,\n              attemptCount: (existingFailedBatch?.attemptCount ?? retryableFailedAttemptCounts.get(chunk.id) ?? 0) + 1,\n              lastAttempt: failureTimestamp,\n            } satisfies FailedBatch;\n\n            if (existingFailedBatchIndex === -1) {\n              failedBatchesForCurrentRun.push(failedBatch);\n            } else {\n              failedBatchesForCurrentRun[existingFailedBatchIndex] = failedBatch;\n            }\n          }\n\n          this.logger.recordEmbeddingError();\n          this.logger.embedding(\"error\", `Failed to embed batch after retries`, {\n            batchSize: failedChunks.length,\n            requestCount: requestBatch.length,\n            error: failureMessage,\n          });\n        }\n      });\n    }\n\n    await queue.onIdle();\n    if (scopedRoots) {\n      this.saveScopedFailedBatches(coalesceFailedBatches(failedBatchesForCurrentRun), scopedRoots);\n    } else {\n      this.saveFailedBatches(coalesceFailedBatches(failedBatchesForCurrentRun));\n    }\n\n    onProgress?.({\n      phase: \"storing\",\n      filesProcessed: files.length,\n      totalFiles: files.length,\n      chunksProcessed: stats.indexedChunks,\n      totalChunks: pendingChunks.length,\n    });\n\n    const branchChunkIds = Array.from(currentChunkIds).filter(\n      (chunkId) => {\n        const isNewlyFailed = failedChunkIds.has(chunkId) && !retryableChunksWithExistingData.has(chunkId);\n        const isForcedFailed = forceScopedReembed && failedForcedChunkIds.has(chunkId);\n        return !isNewlyFailed && !isForcedFailed;\n      }\n    );\n    database.clearBranch(branchCatalogKey);\n    database.addChunksToBranchBatch(branchCatalogKey, branchChunkIds);\n    database.clearBranchSymbols(branchCatalogKey);\n    database.addSymbolsToBranchBatch(branchCatalogKey, Array.from(allSymbolIds));\n\n    store.save();\n    invertedIndex.save();\n    if (scopedRoots) {\n      this.replaceScopedFileHashCache(currentFileHashes, scopedRoots);\n    } else {\n      this.fileHashCache = currentFileHashes;\n      this.saveFileHashCache();\n    }\n\n    if (this.config.indexing.autoGc && stats.removedChunks > 0) {\n      const gcReset = await this.maybeRunOrphanGc();\n      if (gcReset) {\n        stats.durationMs = Date.now() - startTime;\n        stats.warning = gcReset.warning;\n        stats.resetCorruptedIndex = true;\n\n        this.logger.recordIndexingEnd();\n        this.logger.warn(\"Indexing ended after resetting corrupted local index during automatic GC\", {\n          files: stats.totalFiles,\n          indexed: stats.indexedChunks,\n          existing: stats.existingChunks,\n          removed: stats.removedChunks,\n          failed: stats.failedChunks,\n          tokens: stats.tokensUsed,\n          durationMs: stats.durationMs,\n        });\n\n        return stats;\n      }\n    }\n\n    stats.durationMs = Date.now() - startTime;\n\n    if (forceScopedReembed && failedForcedChunkIds.size === 0) {\n      database.deleteMetadata(this.getProjectForceReembedMetadataKey());\n    }\n    this.saveIndexMetadata(configuredProviderInfo);\n    this.indexCompatibility = { compatible: true };\n\n    this.logger.recordIndexingEnd();\n    this.logger.info(\"Indexing complete\", {\n      files: stats.totalFiles,\n      indexed: stats.indexedChunks,\n      existing: stats.existingChunks,\n      removed: stats.removedChunks,\n      failed: stats.failedChunks,\n      tokens: stats.tokensUsed,\n      durationMs: stats.durationMs,\n    });\n\n    if (stats.failedChunks > 0) {\n      stats.failedBatchesPath = this.failedBatchesPath;\n    }\n\n    onProgress?.({\n      phase: \"complete\",\n      filesProcessed: files.length,\n      totalFiles: files.length,\n      chunksProcessed: stats.indexedChunks,\n      totalChunks: pendingChunks.length,\n    });\n\n    this.releaseIndexingLock();\n    return stats;\n  }\n\n  private async getQueryEmbedding(query: string, provider: EmbeddingProviderInterface): Promise<number[]> {\n    const now = Date.now();\n    const cached = this.queryEmbeddingCache.get(query);\n\n    if (cached && (now - cached.timestamp) < this.queryCacheTtlMs) {\n      this.logger.cache(\"debug\", \"Query embedding cache hit (exact)\", { query: query.slice(0, 50) });\n      this.logger.recordQueryCacheHit();\n      return cached.embedding;\n    }\n\n    const similarMatch = this.findSimilarCachedQuery(query, now);\n    if (similarMatch) {\n      this.logger.cache(\"debug\", \"Query embedding cache hit (similar)\", {\n        query: query.slice(0, 50),\n        similarTo: similarMatch.key.slice(0, 50),\n        similarity: similarMatch.similarity.toFixed(3),\n      });\n      this.logger.recordQueryCacheSimilarHit();\n      return similarMatch.embedding;\n    }\n\n    this.logger.cache(\"debug\", \"Query embedding cache miss\", { query: query.slice(0, 50) });\n    this.logger.recordQueryCacheMiss();\n    const { embedding, tokensUsed } = await provider.embedQuery(query);\n    this.logger.recordEmbeddingApiCall(tokensUsed);\n\n    if (this.queryEmbeddingCache.size >= this.maxQueryCacheSize) {\n      const oldestKey = this.queryEmbeddingCache.keys().next().value;\n      if (oldestKey) {\n        this.queryEmbeddingCache.delete(oldestKey);\n      }\n    }\n\n    this.queryEmbeddingCache.set(query, { embedding, timestamp: now });\n    return embedding;\n  }\n\n  private findSimilarCachedQuery(\n    query: string,\n    now: number\n  ): { key: string; embedding: number[]; similarity: number } | null {\n    const queryTokens = this.tokenize(query);\n    if (queryTokens.size === 0) return null;\n\n    let bestMatch: { key: string; embedding: number[]; similarity: number } | null = null;\n\n    for (const [cachedQuery, { embedding, timestamp }] of this.queryEmbeddingCache) {\n      if ((now - timestamp) >= this.queryCacheTtlMs) continue;\n\n      const cachedTokens = this.tokenize(cachedQuery);\n      const similarity = this.jaccardSimilarity(queryTokens, cachedTokens);\n\n      if (similarity >= this.querySimilarityThreshold) {\n        if (!bestMatch || similarity > bestMatch.similarity) {\n          bestMatch = { key: cachedQuery, embedding, similarity };\n        }\n      }\n    }\n\n    return bestMatch;\n  }\n\n  private tokenize(text: string): Set<string> {\n    return new Set(\n      text\n        .toLowerCase()\n        .replace(/[^\\w\\s]/g, \" \")\n        .split(/\\s+/)\n        .filter(t => t.length > 1)\n    );\n  }\n\n  private jaccardSimilarity(a: Set<string>, b: Set<string>): number {\n    if (a.size === 0 && b.size === 0) return 1;\n    if (a.size === 0 || b.size === 0) return 0;\n\n    let intersection = 0;\n    for (const token of a) {\n      if (b.has(token)) intersection++;\n    }\n\n    const union = a.size + b.size - intersection;\n    return intersection / union;\n  }\n\n  async search(\n    query: string,\n    limit?: number,\n    options?: {\n      hybridWeight?: number;\n      fileType?: string;\n      directory?: string;\n      chunkType?: string;\n      contextLines?: number;\n      filterByBranch?: boolean;\n      metadataOnly?: boolean;\n      definitionIntent?: boolean;\n    }\n  ): Promise<SearchResult[]> {\n    const { store, provider, database } = await this.ensureInitialized();\n\n    const compatibility = this.checkCompatibility();\n    if (!compatibility.compatible) {\n      throw new Error(\n        `${compatibility.reason ?? \"Index is incompatible with current embedding provider.\"} ` +\n        `A possible solution is to run index_codebase with force=true to rebuild the index.`\n      );\n    }\n\n    const searchStartTime = performance.now();\n\n    if (store.count() === 0) {\n      this.logger.search(\"debug\", \"Search on empty index\", { query });\n      return [];\n    }\n\n    const maxResults = limit ?? this.config.search.maxResults;\n    const hybridWeight = options?.hybridWeight ?? this.config.search.hybridWeight;\n    const fusionStrategy = this.config.search.fusionStrategy;\n    const rrfK = this.config.search.rrfK;\n    const rerankTopN = this.config.search.rerankTopN;\n    const filterByBranch = options?.filterByBranch ?? true;\n    const sourceIntent = options?.definitionIntent === true || classifyQueryIntentRaw(query) === \"source\";\n    const identifierHints = extractIdentifierHints(query);\n\n    this.logger.search(\"debug\", \"Starting search\", {\n      query,\n      maxResults,\n      hybridWeight,\n      fusionStrategy,\n      rrfK,\n      rerankTopN,\n      filterByBranch,\n    });\n\n    const embeddingStartTime = performance.now();\n    const embeddingQuery = stripFilePathHint(query);\n    const embedding = await this.getQueryEmbedding(embeddingQuery, provider);\n    const embeddingMs = performance.now() - embeddingStartTime;\n\n    const vectorStartTime = performance.now();\n    const semanticResults = store.search(embedding, maxResults * 4);\n    const vectorMs = performance.now() - vectorStartTime;\n\n    const keywordStartTime = performance.now();\n    const keywordResults = await this.keywordSearch(query, maxResults * 4);\n    const keywordMs = performance.now() - keywordStartTime;\n\n    let branchChunkIds: Set<string> | null = null;\n    if (filterByBranch && (this.config.scope === \"global\" || this.currentBranch !== \"default\")) {\n      branchChunkIds = new Set(\n        this.getBranchCatalogKeys().flatMap((branchKey) => database.getBranchChunkIds(branchKey))\n      );\n    }\n\n    const prefilterStartTime = performance.now();\n    const shouldPrefilterByBranch = branchChunkIds !== null && (this.config.scope === \"global\" || branchChunkIds.size > 0);\n    const allowBranchPrefilterFallback = this.config.scope !== \"global\";\n    const prefilteredSemantic = shouldPrefilterByBranch && branchChunkIds\n      ? semanticResults.filter((r) => branchChunkIds.has(r.id))\n      : semanticResults;\n    const prefilteredKeyword = shouldPrefilterByBranch && branchChunkIds\n      ? keywordResults.filter((r) => branchChunkIds.has(r.id))\n      : keywordResults;\n\n    const semanticCandidates = (allowBranchPrefilterFallback && shouldPrefilterByBranch && semanticResults.length > 0 && prefilteredSemantic.length === 0)\n      ? semanticResults\n      : prefilteredSemantic;\n    const keywordCandidates = (allowBranchPrefilterFallback && shouldPrefilterByBranch && keywordResults.length > 0 && prefilteredKeyword.length === 0)\n      ? keywordResults\n      : prefilteredKeyword;\n    const prefilterMs = performance.now() - prefilterStartTime;\n\n    if (this.config.scope !== \"global\" && branchChunkIds && branchChunkIds.size === 0) {\n      this.logger.search(\"warn\", \"Branch prefilter skipped because branch catalog is empty\", {\n        branch: this.currentBranch,\n      });\n    }\n\n    if (allowBranchPrefilterFallback && shouldPrefilterByBranch && semanticResults.length > 0 && prefilteredSemantic.length === 0) {\n      this.logger.search(\"warn\", \"Branch prefilter produced no semantic overlap, using unfiltered semantic candidates\", {\n        branch: this.currentBranch,\n      });\n    }\n\n    if (allowBranchPrefilterFallback && shouldPrefilterByBranch && keywordResults.length > 0 && prefilteredKeyword.length === 0) {\n      this.logger.search(\"warn\", \"Branch prefilter produced no keyword overlap, using unfiltered keyword candidates\", {\n        branch: this.currentBranch,\n      });\n    }\n\n    const fusionStartTime = performance.now();\n    const combined = rankHybridResults(query, semanticCandidates, keywordCandidates, {\n      fusionStrategy,\n      rrfK,\n      rerankTopN,\n      limit: maxResults,\n      hybridWeight,\n      prioritizeSourcePaths: sourceIntent,\n    });\n    const rerankedCombined = await this.rerankCandidatesWithApi(query, combined, {\n      definitionIntent: options?.definitionIntent === true,\n      hasIdentifierHints: identifierHints.length > 0,\n    });\n    const fusionMs = performance.now() - fusionStartTime;\n\n    const rescued = promoteIdentifierMatches(\n      query,\n      rerankedCombined,\n      semanticCandidates,\n      keywordCandidates,\n      database,\n      branchChunkIds,\n      sourceIntent\n    );\n\n    const union = unionCandidates(semanticCandidates, keywordCandidates);\n\n    const deterministicIdentifierLane = buildDeterministicIdentifierPass(\n      query,\n      union,\n      maxResults,\n      sourceIntent\n    );\n\n    const identifierLane = buildIdentifierDefinitionLane(\n      query,\n      union,\n      maxResults,\n      sourceIntent\n    );\n\n    const symbolLane = buildSymbolDefinitionLane(\n      query,\n      database,\n      branchChunkIds,\n      maxResults,\n      union,\n      sourceIntent\n    );\n\n    const prePrimaryLane = mergeTieredResults(deterministicIdentifierLane, identifierLane, maxResults * 4);\n    const primaryLane = mergeTieredResults(prePrimaryLane, symbolLane, maxResults * 4);\n    const tiered = mergeTieredResults(primaryLane, rescued, maxResults * 4);\n    const hasCodeHints = extractCodeTermHints(query).length > 0 || identifierHints.length > 0;\n\n    const baseFiltered = tiered.filter((r) => matchesSearchFilters(r, options, this.config.search.minScore));\n\n    const implementationOnly = baseFiltered.filter((r) =>\n      isLikelyImplementationPath(r.metadata.filePath) &&\n      isImplementationChunkType(r.metadata.chunkType)\n    );\n\n    const filtered = (sourceIntent && hasCodeHints && implementationOnly.length > 0\n      ? implementationOnly\n      : baseFiltered\n    ).slice(0, maxResults);\n\n    const identifierFallback = (!options?.definitionIntent && filtered.length === 0 && identifierHints.length > 0)\n      ? buildSymbolDefinitionLane(query, database, branchChunkIds, maxResults, union, true)\n        .filter((r) => matchesSearchFilters(r, options, this.config.search.minScore))\n        .slice(0, maxResults)\n      : [];\n\n    const finalResults = filtered.length > 0 ? filtered : identifierFallback;\n\n    const totalSearchMs = performance.now() - searchStartTime;\n    this.logger.recordSearch(totalSearchMs, {\n      embeddingMs,\n      vectorMs,\n      keywordMs,\n      fusionMs,\n    });\n    this.logger.search(\"info\", \"Search complete\", {\n      query,\n      results: finalResults.length,\n      totalMs: Math.round(totalSearchMs * 100) / 100,\n      embeddingMs: Math.round(embeddingMs * 100) / 100,\n      vectorMs: Math.round(vectorMs * 100) / 100,\n      keywordMs: Math.round(keywordMs * 100) / 100,\n      prefilterMs: Math.round(prefilterMs * 100) / 100,\n      fusionMs: Math.round(fusionMs * 100) / 100,\n    });\n\n    const metadataOnly = options?.metadataOnly ?? false;\n\n    return Promise.all(\n      finalResults.map(async (r) => {\n        let content = \"\";\n        let contextStartLine = r.metadata.startLine;\n        let contextEndLine = r.metadata.endLine;\n\n        if (!metadataOnly && this.config.search.includeContext) {\n          try {\n            const fileContent = await fsPromises.readFile(\n              r.metadata.filePath,\n              \"utf-8\"\n            );\n            const lines = fileContent.split(\"\\n\");\n            const contextLines = options?.contextLines ?? this.config.search.contextLines;\n\n            contextStartLine = Math.max(1, r.metadata.startLine - contextLines);\n            contextEndLine = Math.min(lines.length, r.metadata.endLine + contextLines);\n\n            content = lines\n              .slice(contextStartLine - 1, contextEndLine)\n              .join(\"\\n\");\n          } catch {\n            content = \"[File not accessible]\";\n          }\n        }\n\n        return {\n          filePath: r.metadata.filePath,\n          startLine: contextStartLine,\n          endLine: contextEndLine,\n          content,\n          score: r.score,\n          chunkType: r.metadata.chunkType,\n          name: r.metadata.name,\n        };\n      })\n    );\n  }\n\n  private async keywordSearch(\n    query: string,\n    limit: number\n  ): Promise<Array<{ id: string; score: number; metadata: ChunkMetadata }>> {\n    const { store, invertedIndex } = await this.ensureInitialized();\n    const scores = invertedIndex.search(query);\n\n    if (scores.size === 0) {\n      return [];\n    }\n\n    // Only fetch metadata for chunks returned by BM25 (O(n) where n = result count)\n    // instead of getAllMetadata() which fetches ALL chunks in the index\n    const chunkIds = Array.from(scores.keys());\n    const metadataMap = store.getMetadataBatch(chunkIds);\n\n    const results: Array<{ id: string; score: number; metadata: ChunkMetadata }> = [];\n    for (const [chunkId, score] of scores) {\n      const metadata = metadataMap.get(chunkId);\n      if (metadata && score > 0) {\n        results.push({ id: chunkId, score, metadata });\n      }\n    }\n\n    results.sort((a, b) => b.score - a.score);\n    return results.slice(0, limit);\n  }\n\n  async getStatus(): Promise<StatusResult> {\n    const { store, configuredProviderInfo, database } = await this.ensureInitialized();\n    const failedBatchesCount = this.getFailedBatchesCount();\n\n    return {\n      indexed: store.count() > 0,\n      vectorCount: store.count(),\n      provider: configuredProviderInfo.provider,\n      model: configuredProviderInfo.modelInfo.model,\n      indexPath: this.indexPath,\n      currentBranch: this.currentBranch,\n      baseBranch: this.baseBranch,\n      compatibility: this.indexCompatibility,\n      failedBatchesCount,\n      failedBatchesPath: failedBatchesCount > 0 ? this.failedBatchesPath : undefined,\n      warning: database.getMetadata(STARTUP_WARNING_METADATA_KEY) ?? undefined,\n    };\n  }\n\n  async clearIndex(): Promise<void> {\n    const { store, invertedIndex, database } = await this.ensureInitialized();\n\n    if (this.config.scope === \"global\") {\n      store.load();\n      invertedIndex.load();\n      this.loadFileHashCache();\n      const roots = this.getScopedRoots();\n      const compatibility = this.checkCompatibility();\n      const allMetadata = store.getAllMetadata();\n      const hasForeignData =\n        allMetadata.some(({ metadata }) => !this.isFileInCurrentScope(metadata.filePath, roots)) ||\n        this.hasForeignScopedBranchData() ||\n        this.hasForeignScopedFileHashData(roots) ||\n        this.hasForeignScopedFailedBatches(roots);\n\n      if (!compatibility.compatible && hasForeignData) {\n        if (compatibility.code === IncompatibilityCode.EMBEDDING_STRATEGY_MISMATCH) {\n          this.clearSharedIndexProjectData(store, invertedIndex, database, roots);\n          this.clearScopedFileHashCache(roots);\n          this.clearScopedFailedBatches(roots);\n          database.setMetadata(this.getProjectForceReembedMetadataKey(), \"true\");\n          database.deleteMetadata(this.getProjectEmbeddingStrategyMetadataKey());\n          this.indexCompatibility = { compatible: true };\n          return;\n        }\n\n        throw new Error(\n          `Global index compatibility reset is unsafe because the shared index contains files from other projects. ` +\n          `The current global index cannot be force-rebuilt for ${this.projectRoot} without deleting other repositories' indexed data. ` +\n          `Use scope=\"project\" for isolated rebuilds, or manually delete the shared global index if you intend to rebuild all projects.`\n        );\n      }\n\n      if (!hasForeignData) {\n        store.clear();\n        store.save();\n        invertedIndex.clear();\n        invertedIndex.save();\n\n        this.fileHashCache.clear();\n        this.saveFileHashCache();\n\n        database.clearAllIndexedData();\n        this.saveFailedBatches([]);\n\n        database.deleteMetadata(\"index.version\");\n        database.deleteMetadata(\"index.embeddingProvider\");\n        database.deleteMetadata(\"index.embeddingModel\");\n        database.deleteMetadata(\"index.embeddingDimensions\");\n        database.deleteMetadata(\"index.embeddingStrategyVersion\");\n        database.deleteMetadata(this.getProjectEmbeddingStrategyMetadataKey());\n        database.deleteMetadata(this.getProjectForceReembedMetadataKey());\n        database.deleteMetadata(this.getLegacyMigrationMetadataKey());\n        database.deleteMetadata(\"index.createdAt\");\n        database.deleteMetadata(\"index.updatedAt\");\n\n        this.indexCompatibility = this.validateIndexCompatibility(this.configuredProviderInfo!);\n        return;\n      }\n\n      this.clearSharedIndexProjectData(store, invertedIndex, database, roots);\n      this.clearScopedFileHashCache(roots);\n      this.clearScopedFailedBatches(roots);\n      this.indexCompatibility = compatibility;\n      return;\n    }\n\n    const localProjectIndexPaths = [path.join(this.projectRoot, getHostProjectIndexRelativePath(this.host))];\n    if (this.host !== \"opencode\") {\n      localProjectIndexPaths.push(path.join(this.projectRoot, getHostProjectIndexRelativePath(\"opencode\")));\n    }\n\n    const isLocalProjectIndex = localProjectIndexPaths.some(\n      (localPath) => path.resolve(this.indexPath) === path.resolve(localPath)\n    );\n    if (!isLocalProjectIndex) {\n      throw new Error(\n        \"Project-scoped force rebuild is unsafe while using an inherited worktree index. \" +\n        \"Create a local project config boundary before clearing the index.\"\n      );\n    }\n\n    store.clear();\n    store.save();\n    invertedIndex.clear();\n    invertedIndex.save();\n\n    // Clear file hash cache so all files are re-parsed\n    this.fileHashCache.clear();\n    this.saveFileHashCache();\n\n    // cannot reuse stale chunks, symbols, or embeddings from a prior provider.\n    database.clearAllIndexedData();\n    this.saveFailedBatches([]);\n\n    database.deleteMetadata(\"index.version\");\n    database.deleteMetadata(\"index.embeddingProvider\");\n    database.deleteMetadata(\"index.embeddingModel\");\n    database.deleteMetadata(\"index.embeddingDimensions\");\n    database.deleteMetadata(\"index.embeddingStrategyVersion\");\n    database.deleteMetadata(this.getProjectEmbeddingStrategyMetadataKey());\n    database.deleteMetadata(this.getProjectForceReembedMetadataKey());\n    database.deleteMetadata(this.getLegacyMigrationMetadataKey());\n    database.deleteMetadata(\"index.createdAt\");\n    database.deleteMetadata(\"index.updatedAt\");\n\n    this.indexCompatibility = this.validateIndexCompatibility(this.configuredProviderInfo!);\n  }\n\n  async healthCheck(): Promise<HealthCheckResult> {\n    const { store, invertedIndex, database } = await this.ensureInitialized();\n\n    this.logger.gc(\"info\", \"Starting health check\");\n\n    const allMetadata = store.getAllMetadata();\n    const filePathsToChunkKeys = new Map<string, string[]>();\n\n    for (const { key, metadata } of allMetadata) {\n      const existing = filePathsToChunkKeys.get(metadata.filePath) || [];\n      existing.push(key);\n      filePathsToChunkKeys.set(metadata.filePath, existing);\n    }\n\n    const removedFilePaths: string[] = [];\n    const removedChunkKeys: string[] = [];\n    const chunkKeysByRemovedFile = new Map<string, string[]>();\n\n    for (const [filePath, chunkKeys] of filePathsToChunkKeys) {\n      if (!existsSync(filePath)) {\n        chunkKeysByRemovedFile.set(filePath, chunkKeys);\n        for (const key of chunkKeys) {\n          removedChunkKeys.push(key);\n        }\n        removedFilePaths.push(filePath);\n      }\n    }\n\n    if (removedChunkKeys.length > 0) {\n      this.rebuildVectorStoreExcludingChunkIds(store, database, removedChunkKeys);\n      for (const key of removedChunkKeys) {\n        invertedIndex.removeChunk(key);\n      }\n    }\n\n    for (const filePath of removedFilePaths) {\n      const fileChunkKeys = chunkKeysByRemovedFile.get(filePath) ?? [];\n      if (fileChunkKeys.length > 0) {\n        database.deleteChunksByIds(fileChunkKeys);\n      }\n      database.deleteCallEdgesByFile(filePath);\n      database.deleteSymbolsByFile(filePath);\n    }\n\n    const removedCount = removedChunkKeys.length;\n\n    if (removedCount > 0) {\n      store.save();\n      invertedIndex.save();\n    }\n\n    let gcOrphanEmbeddings: number;\n    let gcOrphanChunks: number;\n    let gcOrphanSymbols: number;\n    let gcOrphanCallEdges: number;\n\n    try {\n      gcOrphanEmbeddings = database.gcOrphanEmbeddings();\n      gcOrphanChunks = database.gcOrphanChunks();\n      gcOrphanSymbols = database.gcOrphanSymbols();\n      gcOrphanCallEdges = database.gcOrphanCallEdges();\n    } catch (error) {\n      if (!(await this.tryResetCorruptedIndex(\"running index health check\", error))) {\n        throw error;\n      }\n\n      await this.ensureInitialized();\n\n      return {\n        removed: 0,\n        filePaths: [],\n        gcOrphanEmbeddings: 0,\n        gcOrphanChunks: 0,\n        gcOrphanSymbols: 0,\n        gcOrphanCallEdges: 0,\n        resetCorruptedIndex: true,\n        warning: this.getCorruptedIndexWarning(path.join(this.indexPath, \"codebase.db\")),\n      };\n    }\n\n    this.logger.recordGc(removedCount, gcOrphanChunks, gcOrphanEmbeddings);\n    this.logger.gc(\"info\", \"Health check complete\", {\n      removedStale: removedCount,\n      orphanEmbeddings: gcOrphanEmbeddings,\n      orphanChunks: gcOrphanChunks,\n      removedFiles: removedFilePaths.length,\n    });\n\n    return { removed: removedCount, filePaths: removedFilePaths, gcOrphanEmbeddings, gcOrphanChunks, gcOrphanSymbols, gcOrphanCallEdges };\n  }\n\n  async retryFailedBatches(): Promise<{ succeeded: number; failed: number; remaining: number }> {\n    const { store, provider, invertedIndex, database, configuredProviderInfo } = await this.ensureInitialized();\n    const maxChunkTokens = getSafeEmbeddingChunkTokenLimit(configuredProviderInfo);\n    const providerRateLimits = this.getProviderRateLimits(configuredProviderInfo.provider);\n\n    const roots = this.config.scope === \"global\" ? this.getScopedRoots() : null;\n    const { scoped: scopedFailedBatches, retained: retainedFailedBatches } = roots\n      ? this.partitionFailedBatches(roots, maxChunkTokens)\n      : { scoped: this.loadFailedBatches(maxChunkTokens), retained: [] as FailedBatch[] };\n    const failedBatches = scopedFailedBatches;\n    if (failedBatches.length === 0) {\n      return { succeeded: 0, failed: 0, remaining: 0 };\n    }\n\n    let succeeded = 0;\n    let failed = 0;\n    const stillFailing: FailedBatch[] = [];\n\n    for (const batch of failedBatches) {\n      const batchChunksById = new Map(batch.chunks.map((chunk) => [chunk.id, chunk]));\n      const embeddingPartsByChunk = new Map<string, Array<{ vector: number[]; tokenCount: number } | undefined>>();\n      const completedChunkIds = new Set<string>();\n      const failedChunkIds = new Set<string>();\n      const failedChunksForBatch = new Map<string, FailedBatch>();\n      const pooledResults: Array<{ chunk: PendingChunk; vector: number[] }> = [];\n      try {\n        const requestBatches = createPendingEmbeddingRequestBatches(\n          batch.chunks,\n          getDynamicBatchOptions(configuredProviderInfo)\n        );\n\n        for (const requestBatch of requestBatches) {\n          try {\n            const result = await pRetry(\n              async () => {\n                const texts = requestBatch.map((request) => request.text);\n                return provider.embedBatch(texts);\n              },\n              {\n                retries: this.config.indexing.retries,\n                minTimeout: Math.max(this.config.indexing.retryDelayMs, providerRateLimits.minRetryMs),\n                maxTimeout: providerRateLimits.maxRetryMs,\n                factor: 2,\n                shouldRetry: (error) => !((error as { error?: Error }).error instanceof CustomProviderNonRetryableError),\n              }\n            );\n\n            const touchedChunkIds = new Set<string>();\n            requestBatch.forEach((request, idx) => {\n              if (failedChunkIds.has(request.chunk.id) || completedChunkIds.has(request.chunk.id)) {\n                return;\n              }\n\n              const vector = result.embeddings[idx];\n              if (!vector) {\n                throw new Error(`Embedding API returned too few vectors for chunk ${request.chunk.id}`);\n              }\n\n              const parts = embeddingPartsByChunk.get(request.chunk.id) ?? [];\n              parts[request.partIndex] = {\n                vector,\n                tokenCount: request.tokenCount,\n              };\n              embeddingPartsByChunk.set(request.chunk.id, parts);\n              touchedChunkIds.add(request.chunk.id);\n            });\n\n            for (const chunkId of touchedChunkIds) {\n              if (failedChunkIds.has(chunkId) || completedChunkIds.has(chunkId)) {\n                continue;\n              }\n\n              const chunk = batchChunksById.get(chunkId);\n              if (!chunk) {\n                continue;\n              }\n\n              const parts = embeddingPartsByChunk.get(chunk.id) ?? [];\n              if (!hasAllEmbeddingParts(parts, chunk.texts.length)) {\n                continue;\n              }\n\n              const orderedParts = parts as Array<{ vector: number[]; tokenCount: number }>;\n              pooledResults.push({\n                chunk,\n                vector: poolEmbeddingVectors(\n                  orderedParts.map((part) => part.vector),\n                  orderedParts.map((part) => part.tokenCount)\n                ),\n              });\n            }\n\n            this.logger.recordEmbeddingApiCall(result.totalTokensUsed);\n          } catch (error) {\n            const failureMessage = String(error);\n            const failureTimestamp = new Date().toISOString();\n            const failedChunks = getUniquePendingChunksFromRequests(requestBatch)\n              .filter((chunk) => !completedChunkIds.has(chunk.id) && !failedChunkIds.has(chunk.id));\n\n            for (const chunk of failedChunks) {\n              failedChunkIds.add(chunk.id);\n              embeddingPartsByChunk.delete(chunk.id);\n              failedChunksForBatch.set(chunk.id, {\n                chunks: [chunk],\n                attemptCount: batch.attemptCount + 1,\n                lastAttempt: failureTimestamp,\n                error: failureMessage,\n              });\n            }\n\n            failed += failedChunks.length;\n            this.logger.recordEmbeddingError();\n          }\n        }\n\n        const successfulResults = pooledResults.filter(({ chunk }) => !failedChunkIds.has(chunk.id));\n\n        const items = successfulResults.map(({ chunk, vector }) => ({\n          id: chunk.id,\n          vector,\n          metadata: chunk.metadata,\n        }));\n\n        if (items.length > 0) {\n          store.addBatch(items);\n        }\n\n        if (successfulResults.length > 0) {\n          try {\n            database.upsertEmbeddingsBatch(\n              successfulResults.map(({ chunk, vector }) => ({\n                contentHash: chunk.contentHash,\n                embedding: float32ArrayToBuffer(vector),\n                chunkText: chunk.storageText,\n                model: configuredProviderInfo.modelInfo.model,\n              }))\n            );\n          } catch (dbError) {\n            this.rebuildVectorStoreExcludingChunkIds(\n              store,\n              database,\n              successfulResults.map(({ chunk }) => chunk.id)\n            );\n            throw dbError;\n          }\n        }\n\n        for (const { chunk } of successfulResults) {\n          invertedIndex.removeChunk(chunk.id);\n          invertedIndex.addChunk(chunk.id, chunk.content);\n          completedChunkIds.add(chunk.id);\n          embeddingPartsByChunk.delete(chunk.id);\n        }\n\n        database.addChunksToBranchBatch(\n          this.getBranchCatalogKey(),\n          successfulResults.map(({ chunk }) => chunk.id)\n        );\n\n        this.logger.recordChunksEmbedded(successfulResults.length);\n\n        succeeded += successfulResults.length;\n        stillFailing.push(...failedChunksForBatch.values());\n      } catch (error) {\n        const failureMessage = getErrorMessage(error);\n        const failureTimestamp = new Date().toISOString();\n        const unaccountedChunks = batch.chunks.filter(\n          (chunk) => !failedChunksForBatch.has(chunk.id) && !completedChunkIds.has(chunk.id)\n        );\n\n        for (const chunk of unaccountedChunks) {\n          failedChunksForBatch.set(chunk.id, {\n            chunks: [chunk],\n            attemptCount: batch.attemptCount + 1,\n            lastAttempt: failureTimestamp,\n            error: failureMessage,\n          });\n        }\n\n        failed += unaccountedChunks.length;\n        this.logger.recordEmbeddingError();\n        stillFailing.push(...coalesceFailedBatches(Array.from(failedChunksForBatch.values())));\n      }\n    }\n\n    const persistedStillFailing = coalesceFailedBatches(stillFailing);\n\n    if (roots) {\n      this.saveFailedBatches([...retainedFailedBatches, ...persistedStillFailing]);\n    } else {\n      this.saveFailedBatches(persistedStillFailing);\n    }\n\n    if (succeeded > 0) {\n      store.save();\n      invertedIndex.save();\n    }\n\n    if (roots && succeeded > 0 && persistedStillFailing.length === 0 && this.hasProjectForceReembedPending()) {\n      database.deleteMetadata(this.getProjectForceReembedMetadataKey());\n      this.saveIndexMetadata(configuredProviderInfo);\n      this.indexCompatibility = { compatible: true };\n    }\n\n    return { succeeded, failed, remaining: persistedStillFailing.length };\n  }\n\n  getFailedBatchesCount(): number {\n    if (this.config.scope === \"global\") {\n      return this.partitionFailedBatches(this.getScopedRoots()).scoped.length;\n    }\n    return this.loadFailedBatches().length;\n  }\n\n  getCurrentBranch(): string {\n    return this.currentBranch;\n  }\n\n  getBaseBranch(): string {\n    return this.baseBranch;\n  }\n\n  refreshBranchInfo(): void {\n    if (isGitRepo(this.projectRoot)) {\n      this.currentBranch = getBranchOrDefault(this.projectRoot);\n      this.baseBranch = getBaseBranch(this.projectRoot);\n    }\n  }\n\n  async getDatabaseStats(): Promise<{ embeddingCount: number; chunkCount: number; branchChunkCount: number; branchCount: number } | null> {\n    const { database } = await this.ensureInitialized();\n    return database.getStats();\n  }\n\n  getLogger(): Logger {\n    return this.logger;\n  }\n\n  async findSimilar(\n    code: string,\n    limit: number = this.config.search.maxResults,\n    options?: {\n      fileType?: string;\n      directory?: string;\n      chunkType?: string;\n      excludeFile?: string;\n      filterByBranch?: boolean;\n    }\n  ): Promise<SearchResult[]> {\n    const { store, provider, database } = await this.ensureInitialized();\n\n    const compatibility = this.checkCompatibility();\n    if (!compatibility.compatible) {\n      throw new Error(\n        `${compatibility.reason ?? \"Index is incompatible with current embedding provider.\"} ` +\n        `Run index_codebase with force=true to rebuild the index.`\n      );\n    }\n\n    const searchStartTime = performance.now();\n\n    if (store.count() === 0) {\n      this.logger.search(\"debug\", \"Find similar on empty index\");\n      return [];\n    }\n\n    const filterByBranch = options?.filterByBranch ?? true;\n\n    this.logger.search(\"debug\", \"Starting find similar\", {\n      codeLength: code.length,\n      limit,\n      filterByBranch,\n    });\n\n    const embeddingStartTime = performance.now();\n    const { embedding, tokensUsed } = await provider.embedDocument(code);\n    const embeddingMs = performance.now() - embeddingStartTime;\n    this.logger.recordEmbeddingApiCall(tokensUsed);\n\n    const vectorStartTime = performance.now();\n    const semanticResults = store.search(embedding, limit * 2);\n    const vectorMs = performance.now() - vectorStartTime;\n\n    let branchChunkIds: Set<string> | null = null;\n    if (filterByBranch && (this.config.scope === \"global\" || this.currentBranch !== \"default\")) {\n      branchChunkIds = new Set(\n        this.getBranchCatalogKeys().flatMap((branchKey) => database.getBranchChunkIds(branchKey))\n      );\n    }\n\n    const prefilterStartTime = performance.now();\n    const shouldPrefilterByBranch = branchChunkIds !== null && (this.config.scope === \"global\" || branchChunkIds.size > 0);\n    const allowBranchPrefilterFallback = this.config.scope !== \"global\";\n    const prefilteredSemantic = shouldPrefilterByBranch && branchChunkIds\n      ? semanticResults.filter((r) => branchChunkIds.has(r.id))\n      : semanticResults;\n    const semanticCandidates = (allowBranchPrefilterFallback && shouldPrefilterByBranch && semanticResults.length > 0 && prefilteredSemantic.length === 0)\n      ? semanticResults\n      : prefilteredSemantic;\n    const prefilterMs = performance.now() - prefilterStartTime;\n\n    if (this.config.scope !== \"global\" && branchChunkIds && branchChunkIds.size === 0) {\n      this.logger.search(\"warn\", \"Branch prefilter skipped because branch catalog is empty\", {\n        branch: this.currentBranch,\n      });\n    }\n\n    if (allowBranchPrefilterFallback && shouldPrefilterByBranch && semanticResults.length > 0 && prefilteredSemantic.length === 0) {\n      this.logger.search(\"warn\", \"Branch prefilter produced no semantic overlap, using unfiltered semantic candidates\", {\n        branch: this.currentBranch,\n      });\n    }\n\n    const rerankTopN = this.config.search.rerankTopN;\n\n    const ranked = rankSemanticOnlyResults(code, semanticCandidates, {\n      rerankTopN,\n      limit,\n      prioritizeSourcePaths: false,\n    });\n\n    const filtered = ranked.filter((r) => {\n      if (r.score < this.config.search.minScore) return false;\n\n      if (options?.excludeFile) {\n        if (r.metadata.filePath === options.excludeFile) return false;\n      }\n\n      if (options?.fileType) {\n        const ext = r.metadata.filePath.split(\".\").pop()?.toLowerCase();\n        if (ext !== options.fileType.toLowerCase().replace(/^\\./, \"\")) return false;\n      }\n\n      if (options?.directory) {\n        const normalizedDir = options.directory.replace(/^\\/|\\/$/g, \"\");\n        if (!r.metadata.filePath.includes(`/${normalizedDir}/`) &&\n          !r.metadata.filePath.includes(`${normalizedDir}/`)) return false;\n      }\n\n      if (options?.chunkType) {\n        if (r.metadata.chunkType !== options.chunkType) return false;\n      }\n\n      return true;\n    }).slice(0, limit);\n\n    const totalSearchMs = performance.now() - searchStartTime;\n    this.logger.recordSearch(totalSearchMs, {\n      embeddingMs,\n      vectorMs,\n      keywordMs: 0,\n      fusionMs: 0,\n    });\n    this.logger.search(\"info\", \"Find similar complete\", {\n      codeLength: code.length,\n      results: filtered.length,\n      totalMs: Math.round(totalSearchMs * 100) / 100,\n      embeddingMs: Math.round(embeddingMs * 100) / 100,\n      vectorMs: Math.round(vectorMs * 100) / 100,\n      prefilterMs: Math.round(prefilterMs * 100) / 100,\n    });\n\n    return Promise.all(\n      filtered.map(async (r) => {\n        let content = \"\";\n\n        if (this.config.search.includeContext) {\n          try {\n            const fileContent = await fsPromises.readFile(\n              r.metadata.filePath,\n              \"utf-8\"\n            );\n            const lines = fileContent.split(\"\\n\");\n            content = lines\n              .slice(r.metadata.startLine - 1, r.metadata.endLine)\n              .join(\"\\n\");\n          } catch {\n            content = \"[File not accessible]\";\n          }\n        }\n\n        return {\n          filePath: r.metadata.filePath,\n          startLine: r.metadata.startLine,\n          endLine: r.metadata.endLine,\n          content,\n          score: r.score,\n          chunkType: r.metadata.chunkType,\n          name: r.metadata.name,\n        };\n      })\n    );\n  }\n\n  async getCallers(targetName: string, callTypeFilter?: string): Promise<CallEdgeData[]> {\n    const { database } = await this.ensureInitialized();\n    const seen = new Set<string>();\n    const results: CallEdgeData[] = [];\n\n    for (const branchKey of this.getBranchCatalogKeys()) {\n      for (const edge of database.getCallersWithContext(targetName, branchKey, callTypeFilter)) {\n        if (!seen.has(edge.id)) {\n          seen.add(edge.id);\n          results.push(edge);\n        }\n      }\n    }\n\n    return results;\n  }\n\n  async getCallees(symbolId: string, callTypeFilter?: string): Promise<CallEdgeData[]> {\n    const { database } = await this.ensureInitialized();\n    const seen = new Set<string>();\n    const results: CallEdgeData[] = [];\n\n    for (const branchKey of this.getBranchCatalogKeys()) {\n      for (const edge of database.getCallees(symbolId, branchKey, callTypeFilter)) {\n        if (!seen.has(edge.id)) {\n          seen.add(edge.id);\n          results.push(edge);\n        }\n      }\n    }\n\n    return results;\n  }\n\n  async findCallPath(fromName: string, toName: string, maxDepth?: number): Promise<PathHopData[]> {\n    const { database } = await this.ensureInitialized();\n    let shortest: PathHopData[] = [];\n\n    for (const branchKey of this.getBranchCatalogKeys()) {\n      const path = database.findShortestPath(fromName, toName, branchKey, maxDepth);\n      if (path.length > 0 && (shortest.length === 0 || path.length < shortest.length)) {\n        shortest = path;\n      }\n    }\n\n    return shortest;\n  }\n\n  async getSymbolsForBranch(branch?: string): Promise<SymbolData[]> {\n    const { database } = await this.ensureInitialized();\n    const resolvedBranch = branch ?? this.getBranchCatalogKey();\n    return database.getSymbolsForBranch(resolvedBranch);\n  }\n\n  async getSymbolsForFiles(filePaths: string[], branch?: string): Promise<SymbolData[]> {\n    const { database } = await this.ensureInitialized();\n    const resolvedBranch = branch ?? this.getBranchCatalogKey();\n    return database.getSymbolsForFiles(filePaths, resolvedBranch);\n  }\n\n  async getTransitiveReachability(\n    rootSymbolIds: string[],\n    direction: \"callers\" | \"callees\",\n    maxDepth?: number\n  ): Promise<ReachabilityData[]> {\n    const { database } = await this.ensureInitialized();\n    const branch = this.getBranchCatalogKey();\n    return database.getTransitiveReachability(rootSymbolIds, branch, direction, maxDepth);\n  }\n\n  async detectCommunities(branch?: string, symbolIds?: string[]): Promise<CommunityData[]> {\n    const { database } = await this.ensureInitialized();\n    const resolvedBranch = branch ?? this.getBranchCatalogKey();\n    return database.detectCommunities(resolvedBranch, symbolIds);\n  }\n\n  async computeCentrality(branch?: string): Promise<CentralityData[]> {\n    const { database } = await this.ensureInitialized();\n    const resolvedBranch = branch ?? this.getBranchCatalogKey();\n    return database.computeCentrality(resolvedBranch);\n  }\n\n  async getPrImpact(opts: {\n    pr?: number;\n    branch?: string;\n    maxDepth?: number;\n    hubThreshold?: number;\n    checkConflicts?: boolean;\n    direction?: \"callers\" | \"callees\" | \"both\";\n  }): Promise<PrImpactResult> {\n    const { database } = await this.ensureInitialized();\n    const execFileAsync = promisify(execFile);\n\n    const changedFilesResult = await getChangedFiles({\n      pr: opts.pr,\n      branch: opts.branch,\n      projectRoot: this.projectRoot,\n      baseBranch: this.baseBranch,\n    });\n    const changedFiles = changedFilesResult.files;\n    const headRefName = changedFilesResult.headRefName;\n\n    if (opts.pr !== undefined && headRefName === undefined) {\n      throw new Error(\n        `Could not resolve head branch for PR #${opts.pr}. Run index_codebase on the PR branch first.`,\n      );\n    }\n\n    const resolvedBranch = opts.pr !== undefined\n      ? headRefName\n      : opts.branch || this.currentBranch;\n    const branchKey = this.getBranchCatalogKeyFor(resolvedBranch || \"default\");\n\n    const branchSymbols = database.getSymbolsForBranch(branchKey);\n    if (branchSymbols.length === 0) {\n      throw new Error(\n        \"Run index_codebase first to build the call graph and symbol index for this branch.\"\n      );\n    }\n\n    const absoluteChangedFiles = changedFiles.map((f) => path.resolve(this.projectRoot, f));\n    const directSymbols = database.getSymbolsForFiles(absoluteChangedFiles, branchKey);\n    const directIds = directSymbols.map((s) => s.id);\n\n    const direction = opts.direction ?? \"both\";\n    const maxDepth = opts.maxDepth ?? 5;\n    const transitiveCallers = database.getTransitiveReachability(\n      directIds,\n      branchKey,\n      direction,\n      maxDepth\n    );\n\n    const affectedIdsSet = new Set<string>(directIds);\n    for (const caller of transitiveCallers) {\n      affectedIdsSet.add(caller.symbolId);\n    }\n    const allAffectedIds = Array.from(affectedIdsSet);\n\n    const communitiesData = database.detectCommunities(branchKey, allAffectedIds);\n    const communityMap = new Map<string, { label: string; symbolCount: number; directSymbols: Set<string> }>();\n    for (const c of communitiesData) {\n      if (!communityMap.has(c.communityLabel)) {\n        communityMap.set(c.communityLabel, {\n          label: c.communityLabel,\n          symbolCount: 0,\n          directSymbols: new Set(),\n        });\n      }\n      const entry = communityMap.get(c.communityLabel)!;\n      entry.symbolCount++;\n      if (directIds.includes(c.symbolId)) {\n        entry.directSymbols.add(c.symbolId);\n      }\n    }\n    const communities = Array.from(communityMap.values()).map((c) => ({\n      label: c.label,\n      symbolCount: c.symbolCount,\n      directSymbols: Array.from(c.directSymbols),\n    }));\n\n    const centralityData = database.computeCentrality(branchKey);\n    const hubThreshold = opts.hubThreshold ?? 10;\n    const hubNodes = centralityData\n      .filter((c) => directIds.includes(c.symbolId) && c.callerCount >= hubThreshold)\n      .map((c) => ({\n        id: c.symbolId,\n        name: c.symbolName,\n        callerCount: c.callerCount,\n        filePath: c.filePath,\n      }));\n\n    const totalAffected = allAffectedIds.length;\n    let riskLevel: \"LOW\" | \"MEDIUM\" | \"HIGH\";\n    let riskReason: string;\n\n    if (totalAffected < 5 && hubNodes.length === 0) {\n      riskLevel = \"LOW\";\n      riskReason = `Small impact: ${totalAffected} affected symbols, no hub nodes touched.`;\n    } else if (totalAffected > 20 || hubNodes.length > 1) {\n      riskLevel = \"HIGH\";\n      riskReason = `Large impact: ${totalAffected} affected symbols${hubNodes.length > 0 ? `, ${hubNodes.length} hub nodes touched` : \"\"}.`;\n    } else {\n      riskLevel = \"MEDIUM\";\n      riskReason = `Moderate impact: ${totalAffected} affected symbols${hubNodes.length === 1 ? \", 1 hub node touched\" : \"\"}.`;\n    }\n\n    let conflictingPRs: PrImpactResult[\"conflictingPRs\"];\n    if (opts.checkConflicts) {\n      conflictingPRs = [];\n      try {\n        const { stdout } = await execFileAsync(\n          \"gh\",\n          [\"pr\", \"list\", \"--state\", \"open\", \"--json\", \"number,headRefName\", \"--limit\", \"10000\"],\n          { cwd: this.projectRoot, timeout: 30000 }\n        );\n        const openPRs = JSON.parse(stdout) as Array<{ number: number; headRefName: string }>;\n\n        const currentCommunityLabels = new Set(communities.map((c) => c.label));\n        const allCommunitiesData = database.detectCommunities(branchKey);\n        const symbolToCommunity = new Map<string, string>();\n        const structuralKey = (filePath: string, name: string): string =>\n          `${filePath.toLowerCase()}:${name.toLowerCase()}`;\n        for (const c of allCommunitiesData) {\n          symbolToCommunity.set(structuralKey(c.filePath, c.symbolName), c.communityLabel);\n        }\n\n        for (const openPr of openPRs) {\n          if (openPr.number === opts.pr) continue;\n\n          try {\n            const otherChanged = await getChangedFiles({\n              pr: openPr.number,\n              projectRoot: this.projectRoot,\n              baseBranch: this.baseBranch,\n            });\n            const otherAbsolute = otherChanged.files.map((f) => path.resolve(this.projectRoot, f));\n            const otherBranchKey = this.getBranchCatalogKeyFor(openPr.headRefName);\n            const otherSymbols = database.getSymbolsForFiles(otherAbsolute, otherBranchKey);\n            const otherLabels = new Set<string>();\n            for (const sym of otherSymbols) {\n              const label = symbolToCommunity.get(structuralKey(sym.filePath, sym.name));\n              if (label) {\n                otherLabels.add(label);\n              }\n            }\n            const overlapping = Array.from(otherLabels).filter((l) =>\n              currentCommunityLabels.has(l)\n            );\n            if (overlapping.length > 0) {\n              conflictingPRs.push({\n                pr: openPr.number,\n                branch: openPr.headRefName,\n                overlappingCommunities: overlapping,\n              });\n            }\n          } catch {\n            /* skip PRs we can't analyze */\n          }\n        }\n      } catch {\n        /* gh CLI not available or failed; skip conflict detection */\n      }\n    }\n\n    return {\n      changedFiles,\n      directSymbols: directSymbols.map((s) => ({\n        id: s.id,\n        name: s.name,\n        kind: s.kind,\n        filePath: s.filePath,\n      })),\n      transitiveCallers: transitiveCallers.map((c) => ({\n        id: c.symbolId,\n        name: c.symbolName,\n        filePath: c.filePath,\n        depth: c.depth,\n      })),\n      totalAffected,\n      communities,\n      hubNodes,\n      riskLevel,\n      riskReason,\n      direction,\n      conflictingPRs,\n    };\n  }\n\n  async getVisualizationData(options?: { directory?: string }): Promise<{\n    symbols: SymbolData[];\n    edges: CallEdgeData[];\n  }> {\n    const { database, store } = await this.ensureInitialized();\n    const seenSymbols = new Map<string, SymbolData>();\n    const seenEdges = new Map<string, CallEdgeData>();\n\n    for (const branchKey of this.getBranchCatalogKeys()) {\n      // Get all symbol IDs on this branch\n      const symbolIds = database.getBranchSymbolIds(branchKey);\n      const symbolIdSet = new Set(symbolIds);\n\n      // Get unique file paths from branch chunks' metadata\n      const chunkIds = database.getBranchChunkIds(branchKey);\n      const metadataMap = chunkIds.length > 0 ? store.getMetadataBatch(chunkIds) : new Map<string, import(\"../native/index.js\").ChunkMetadata>();\n      const filePaths = new Set<string>();\n      for (const [, meta] of metadataMap) {\n        if (meta.filePath) filePaths.add(meta.filePath);\n      }\n\n      const directory = options?.directory?.replace(/\\/$/, \"\");\n      const absoluteDirectoryFilter = directory\n        ? path.resolve(this.projectRoot, directory)\n        : undefined;\n\n      // Gather symbols from each file\n      for (const filePath of filePaths) {\n        if (directory) {\n          const absoluteFilePath = path.resolve(filePath);\n          const matchesRelative = filePath === directory || filePath.startsWith(directory + \"/\");\n          const matchesProjectRelative = absoluteDirectoryFilter !== undefined && (\n            absoluteFilePath === absoluteDirectoryFilter || absoluteFilePath.startsWith(absoluteDirectoryFilter + path.sep)\n          );\n          if (!matchesRelative && !matchesProjectRelative) {\n            continue;\n          }\n        }\n        for (const sym of database.getSymbolsByFile(filePath)) {\n          if (symbolIdSet.has(sym.id) && !seenSymbols.has(sym.id)) {\n            seenSymbols.set(sym.id, sym);\n          }\n        }\n      }\n\n      // Gather edges from each symbol\n      for (const symbolId of seenSymbols.keys()) {\n        for (const edge of database.getCallees(symbolId, branchKey)) {\n          if (!seenEdges.has(edge.id)) {\n            seenEdges.set(edge.id, edge);\n          }\n        }\n      }\n    }\n\n    return { symbols: [...seenSymbols.values()], edges: [...seenEdges.values()] };\n  }\n\n  async close(): Promise<void> {\n    await this.database?.close();\n    this.database = null;\n    this.store = null;\n    this.invertedIndex = null;\n    this.provider = null;\n    this.reranker = null;\n  }\n}\n","import EventEmitter from './index.js'\n\nexport { EventEmitter }\nexport default EventEmitter\n","export class TimeoutError extends Error {\n\tname = 'TimeoutError';\n\n\tconstructor(message, options) {\n\t\tsuper(message, options);\n\t\tError.captureStackTrace?.(this, TimeoutError);\n\t}\n}\n\nconst getAbortedReason = signal => signal.reason ?? new DOMException('This operation was aborted.', 'AbortError');\n\nexport default function pTimeout(promise, options) {\n\tconst {\n\t\tmilliseconds,\n\t\tfallback,\n\t\tmessage,\n\t\tcustomTimers = {setTimeout, clearTimeout},\n\t\tsignal,\n\t} = options;\n\n\tlet timer;\n\tlet abortHandler;\n\n\tconst wrappedPromise = new Promise((resolve, reject) => {\n\t\tif (typeof milliseconds !== 'number' || Math.sign(milliseconds) !== 1) {\n\t\t\tthrow new TypeError(`Expected \\`milliseconds\\` to be a positive number, got \\`${milliseconds}\\``);\n\t\t}\n\n\t\tif (signal?.aborted) {\n\t\t\treject(getAbortedReason(signal));\n\t\t\treturn;\n\t\t}\n\n\t\tif (signal) {\n\t\t\tabortHandler = () => {\n\t\t\t\treject(getAbortedReason(signal));\n\t\t\t};\n\n\t\t\tsignal.addEventListener('abort', abortHandler, {once: true});\n\t\t}\n\n\t\t// Use .then() instead of async IIFE to preserve stack traces\n\t\t// eslint-disable-next-line promise/prefer-await-to-then, promise/prefer-catch\n\t\tpromise.then(resolve, reject);\n\n\t\tif (milliseconds === Number.POSITIVE_INFINITY) {\n\t\t\treturn;\n\t\t}\n\n\t\t// We create the error outside of `setTimeout` to preserve the stack trace.\n\t\tconst timeoutError = new TimeoutError();\n\n\t\t// `.call(undefined, ...)` is needed for custom timers to avoid context issues\n\t\ttimer = customTimers.setTimeout.call(undefined, () => {\n\t\t\tif (fallback) {\n\t\t\t\ttry {\n\t\t\t\t\tresolve(fallback());\n\t\t\t\t} catch (error) {\n\t\t\t\t\treject(error);\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (typeof promise.cancel === 'function') {\n\t\t\t\tpromise.cancel();\n\t\t\t}\n\n\t\t\tif (message === false) {\n\t\t\t\tresolve();\n\t\t\t} else if (message instanceof Error) {\n\t\t\t\treject(message);\n\t\t\t} else {\n\t\t\t\ttimeoutError.message = message ?? `Promise timed out after ${milliseconds} milliseconds`;\n\t\t\t\treject(timeoutError);\n\t\t\t}\n\t\t}, milliseconds);\n\t});\n\n\t// eslint-disable-next-line promise/prefer-await-to-then\n\tconst cancelablePromise = wrappedPromise.finally(() => {\n\t\tcancelablePromise.clear();\n\t\tif (abortHandler && signal) {\n\t\t\tsignal.removeEventListener('abort', abortHandler);\n\t\t}\n\t});\n\n\tcancelablePromise.clear = () => {\n\t\t// `.call(undefined, ...)` is needed for custom timers to avoid context issues\n\t\tcustomTimers.clearTimeout.call(undefined, timer);\n\t\ttimer = undefined;\n\t};\n\n\treturn cancelablePromise;\n}\n","// Port of lower_bound from https://en.cppreference.com/w/cpp/algorithm/lower_bound\n// Used to compute insertion index to keep queue sorted after insertion\nexport default function lowerBound(array, value, comparator) {\n    let first = 0;\n    let count = array.length;\n    while (count > 0) {\n        const step = Math.trunc(count / 2);\n        let it = first + step;\n        if (comparator(array[it], value) <= 0) {\n            first = ++it;\n            count -= step + 1;\n        }\n        else {\n            count = step;\n        }\n    }\n    return first;\n}\n","import lowerBound from './lower-bound.js';\nexport default class PriorityQueue {\n    #queue = [];\n    enqueue(run, options) {\n        const { priority = 0, id, } = options ?? {};\n        const element = {\n            priority,\n            id,\n            run,\n        };\n        if (this.size === 0 || this.#queue[this.size - 1].priority >= priority) {\n            this.#queue.push(element);\n            return;\n        }\n        const index = lowerBound(this.#queue, element, (a, b) => b.priority - a.priority);\n        this.#queue.splice(index, 0, element);\n    }\n    setPriority(id, priority) {\n        const index = this.#queue.findIndex((element) => element.id === id);\n        if (index === -1) {\n            throw new ReferenceError(`No promise function with the id \"${id}\" exists in the queue.`);\n        }\n        const [item] = this.#queue.splice(index, 1);\n        this.enqueue(item.run, { priority, id });\n    }\n    remove(idOrRun) {\n        const index = this.#queue.findIndex((element) => {\n            if (typeof idOrRun === 'string') {\n                return element.id === idOrRun;\n            }\n            return element.run === idOrRun;\n        });\n        if (index !== -1) {\n            this.#queue.splice(index, 1);\n        }\n    }\n    dequeue() {\n        const item = this.#queue.shift();\n        return item?.run;\n    }\n    filter(options) {\n        return this.#queue.filter((element) => element.priority === options.priority).map((element) => element.run);\n    }\n    get size() {\n        return this.#queue.length;\n    }\n}\n","import { EventEmitter } from 'eventemitter3';\nimport pTimeout from 'p-timeout';\nimport PriorityQueue from './priority-queue.js';\n/**\nPromise queue with concurrency control.\n*/\nexport default class PQueue extends EventEmitter {\n    #carryoverIntervalCount;\n    #isIntervalIgnored;\n    #intervalCount = 0;\n    #intervalCap;\n    #rateLimitedInInterval = false;\n    #rateLimitFlushScheduled = false;\n    #interval;\n    #intervalEnd = 0;\n    #lastExecutionTime = 0;\n    #intervalId;\n    #timeoutId;\n    #strict;\n    // Circular buffer implementation for better performance\n    #strictTicks = [];\n    #strictTicksStartIndex = 0;\n    #queue;\n    #queueClass;\n    #pending = 0;\n    // The `!` is needed because of https://github.com/microsoft/TypeScript/issues/32194\n    #concurrency;\n    #isPaused;\n    // Use to assign a unique identifier to a promise function, if not explicitly specified\n    #idAssigner = 1n;\n    // Track currently running tasks for debugging\n    #runningTasks = new Map();\n    #queueAbortListenerCleanupFunctions = new Set();\n    /**\n    Get or set the default timeout for all tasks. Can be changed at runtime.\n\n    Operations will throw a `TimeoutError` if they don't complete within the specified time.\n\n    The timeout begins when the operation is dequeued and starts execution, not while it's waiting in the queue.\n\n    @example\n    ```\n    const queue = new PQueue({timeout: 5000});\n\n    // Change timeout for all future tasks\n    queue.timeout = 10000;\n    ```\n    */\n    timeout;\n    constructor(options) {\n        super();\n        // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n        options = {\n            carryoverIntervalCount: false,\n            intervalCap: Number.POSITIVE_INFINITY,\n            interval: 0,\n            concurrency: Number.POSITIVE_INFINITY,\n            autoStart: true,\n            queueClass: PriorityQueue,\n            strict: false,\n            ...options,\n        };\n        if (!(typeof options.intervalCap === 'number' && options.intervalCap >= 1)) {\n            throw new TypeError(`Expected \\`intervalCap\\` to be a number from 1 and up, got \\`${options.intervalCap?.toString() ?? ''}\\` (${typeof options.intervalCap})`);\n        }\n        if (options.interval === undefined || !(Number.isFinite(options.interval) && options.interval >= 0)) {\n            throw new TypeError(`Expected \\`interval\\` to be a finite number >= 0, got \\`${options.interval?.toString() ?? ''}\\` (${typeof options.interval})`);\n        }\n        if (options.strict && options.interval === 0) {\n            throw new TypeError('The `strict` option requires a non-zero `interval`');\n        }\n        if (options.strict && options.intervalCap === Number.POSITIVE_INFINITY) {\n            throw new TypeError('The `strict` option requires a finite `intervalCap`');\n        }\n        // TODO: Remove this fallback in the next major version\n        // eslint-disable-next-line @typescript-eslint/no-deprecated\n        this.#carryoverIntervalCount = options.carryoverIntervalCount ?? options.carryoverConcurrencyCount ?? false;\n        this.#isIntervalIgnored = options.intervalCap === Number.POSITIVE_INFINITY || options.interval === 0;\n        this.#intervalCap = options.intervalCap;\n        this.#interval = options.interval;\n        this.#strict = options.strict;\n        this.#queue = new options.queueClass();\n        this.#queueClass = options.queueClass;\n        this.concurrency = options.concurrency;\n        if (options.timeout !== undefined && !(Number.isFinite(options.timeout) && options.timeout > 0)) {\n            throw new TypeError(`Expected \\`timeout\\` to be a positive finite number, got \\`${options.timeout}\\` (${typeof options.timeout})`);\n        }\n        this.timeout = options.timeout;\n        this.#isPaused = options.autoStart === false;\n        this.#setupRateLimitTracking();\n    }\n    #cleanupStrictTicks(now) {\n        // Remove ticks outside the current interval window using circular buffer approach\n        while (this.#strictTicksStartIndex < this.#strictTicks.length) {\n            const oldestTick = this.#strictTicks[this.#strictTicksStartIndex];\n            if (oldestTick !== undefined && now - oldestTick >= this.#interval) {\n                this.#strictTicksStartIndex++;\n            }\n            else {\n                break;\n            }\n        }\n        // Compact the array when it becomes inefficient or fully consumed\n        // Compact when: (start index is large AND more than half wasted) OR all ticks expired\n        const shouldCompact = (this.#strictTicksStartIndex > 100 && this.#strictTicksStartIndex > this.#strictTicks.length / 2)\n            || this.#strictTicksStartIndex === this.#strictTicks.length;\n        if (shouldCompact) {\n            this.#strictTicks = this.#strictTicks.slice(this.#strictTicksStartIndex);\n            this.#strictTicksStartIndex = 0;\n        }\n    }\n    // Helper methods for interval consumption\n    #consumeIntervalSlot(now) {\n        if (this.#strict) {\n            this.#strictTicks.push(now);\n        }\n        else {\n            this.#intervalCount++;\n        }\n    }\n    #rollbackIntervalSlot() {\n        if (this.#strict) {\n            // Pop from the end of the actual data (not from start index)\n            if (this.#strictTicks.length > this.#strictTicksStartIndex) {\n                this.#strictTicks.pop();\n            }\n        }\n        else if (this.#intervalCount > 0) {\n            this.#intervalCount--;\n        }\n    }\n    #getActiveTicksCount() {\n        return this.#strictTicks.length - this.#strictTicksStartIndex;\n    }\n    get #doesIntervalAllowAnother() {\n        if (this.#isIntervalIgnored) {\n            return true;\n        }\n        if (this.#strict) {\n            // Cleanup already done by #isIntervalPausedAt before this is called\n            return this.#getActiveTicksCount() < this.#intervalCap;\n        }\n        return this.#intervalCount < this.#intervalCap;\n    }\n    get #doesConcurrentAllowAnother() {\n        return this.#pending < this.#concurrency;\n    }\n    #next() {\n        this.#pending--;\n        if (this.#pending === 0) {\n            this.emit('pendingZero');\n        }\n        this.#tryToStartAnother();\n        this.emit('next');\n    }\n    #onResumeInterval() {\n        // Clear timeout ID before processing to prevent race condition\n        // Must clear before #onInterval to allow new timeouts to be scheduled\n        this.#timeoutId = undefined;\n        this.#onInterval();\n        this.#initializeIntervalIfNeeded();\n    }\n    #isIntervalPausedAt(now) {\n        // Strict mode: check if we need to wait for oldest tick to age out\n        if (this.#strict) {\n            this.#cleanupStrictTicks(now);\n            // If at capacity, need to wait for oldest tick to age out\n            const activeTicksCount = this.#getActiveTicksCount();\n            if (activeTicksCount >= this.#intervalCap) {\n                const oldestTick = this.#strictTicks[this.#strictTicksStartIndex];\n                // After cleanup, remaining ticks are within interval, so delay is always > 0\n                const delay = this.#interval - (now - oldestTick);\n                this.#createIntervalTimeout(delay);\n                return true;\n            }\n            return false;\n        }\n        // Fixed window mode (original logic)\n        if (this.#intervalId === undefined) {\n            const delay = this.#intervalEnd - now;\n            if (delay < 0) {\n                // If the interval has expired while idle, check if we should enforce the interval\n                // from the last task execution. This ensures proper spacing between tasks even\n                // when the queue becomes empty and then new tasks are added.\n                if (this.#lastExecutionTime > 0) {\n                    const timeSinceLastExecution = now - this.#lastExecutionTime;\n                    if (timeSinceLastExecution < this.#interval) {\n                        // Not enough time has passed since the last task execution\n                        this.#createIntervalTimeout(this.#interval - timeSinceLastExecution);\n                        return true;\n                    }\n                }\n                // Enough time has passed or no previous execution, allow execution\n                this.#intervalCount = (this.#carryoverIntervalCount) ? this.#pending : 0;\n            }\n            else {\n                // Act as the interval is pending\n                this.#createIntervalTimeout(delay);\n                return true;\n            }\n        }\n        return false;\n    }\n    #createIntervalTimeout(delay) {\n        if (this.#timeoutId !== undefined) {\n            return;\n        }\n        this.#timeoutId = setTimeout(() => {\n            this.#onResumeInterval();\n        }, delay);\n    }\n    #clearIntervalTimer() {\n        if (this.#intervalId) {\n            clearInterval(this.#intervalId);\n            this.#intervalId = undefined;\n        }\n    }\n    #clearTimeoutTimer() {\n        if (this.#timeoutId) {\n            clearTimeout(this.#timeoutId);\n            this.#timeoutId = undefined;\n        }\n    }\n    #tryToStartAnother() {\n        if (this.#queue.size === 0) {\n            // We can clear the interval (\"pause\")\n            // Because we can redo it later (\"resume\")\n            this.#clearIntervalTimer();\n            this.emit('empty');\n            if (this.#pending === 0) {\n                // Clear timeout as well when completely idle\n                this.#clearTimeoutTimer();\n                // Compact strict ticks when idle to free memory\n                if (this.#strict && this.#strictTicksStartIndex > 0) {\n                    const now = Date.now();\n                    this.#cleanupStrictTicks(now);\n                }\n                this.emit('idle');\n            }\n            return false;\n        }\n        let taskStarted = false;\n        if (!this.#isPaused) {\n            const now = Date.now();\n            const canInitializeInterval = !this.#isIntervalPausedAt(now);\n            if (this.#doesIntervalAllowAnother && this.#doesConcurrentAllowAnother) {\n                const job = this.#queue.dequeue();\n                if (!this.#isIntervalIgnored) {\n                    this.#consumeIntervalSlot(now);\n                    this.#scheduleRateLimitUpdate();\n                }\n                this.emit('active');\n                job();\n                if (canInitializeInterval) {\n                    this.#initializeIntervalIfNeeded();\n                }\n                taskStarted = true;\n            }\n        }\n        return taskStarted;\n    }\n    #initializeIntervalIfNeeded() {\n        if (this.#isIntervalIgnored || this.#intervalId !== undefined) {\n            return;\n        }\n        // Strict mode uses timeouts instead of interval timers\n        if (this.#strict) {\n            return;\n        }\n        this.#intervalId = setInterval(() => {\n            this.#onInterval();\n        }, this.#interval);\n        this.#intervalEnd = Date.now() + this.#interval;\n    }\n    #onInterval() {\n        // Non-strict mode uses interval timers and intervalCount\n        if (!this.#strict) {\n            if (this.#intervalCount === 0 && this.#pending === 0 && this.#intervalId) {\n                this.#clearIntervalTimer();\n            }\n            this.#intervalCount = this.#carryoverIntervalCount ? this.#pending : 0;\n        }\n        this.#processQueue();\n        this.#scheduleRateLimitUpdate();\n    }\n    /**\n    Executes all queued functions until it reaches the limit.\n    */\n    #processQueue() {\n        // eslint-disable-next-line no-empty\n        while (this.#tryToStartAnother()) { }\n    }\n    get concurrency() {\n        return this.#concurrency;\n    }\n    set concurrency(newConcurrency) {\n        if (!(typeof newConcurrency === 'number' && newConcurrency >= 1)) {\n            throw new TypeError(`Expected \\`concurrency\\` to be a number from 1 and up, got \\`${newConcurrency}\\` (${typeof newConcurrency})`);\n        }\n        this.#concurrency = newConcurrency;\n        this.#processQueue();\n    }\n    /**\n    Updates the priority of a promise function by its id, affecting its execution order. Requires a defined concurrency limit to take effect.\n\n    For example, this can be used to prioritize a promise function to run earlier.\n\n    ```js\n    import PQueue from 'p-queue';\n\n    const queue = new PQueue({concurrency: 1});\n\n    queue.add(async () => '🦄', {priority: 1});\n    queue.add(async () => '🦀', {priority: 0, id: '🦀'});\n    queue.add(async () => '🦄', {priority: 1});\n    queue.add(async () => '🦄', {priority: 1});\n\n    queue.setPriority('🦀', 2);\n    ```\n\n    In this case, the promise function with `id: '🦀'` runs second.\n\n    You can also deprioritize a promise function to delay its execution:\n\n    ```js\n    import PQueue from 'p-queue';\n\n    const queue = new PQueue({concurrency: 1});\n\n    queue.add(async () => '🦄', {priority: 1});\n    queue.add(async () => '🦀', {priority: 1, id: '🦀'});\n    queue.add(async () => '🦄');\n    queue.add(async () => '🦄', {priority: 0});\n\n    queue.setPriority('🦀', -1);\n    ```\n    Here, the promise function with `id: '🦀'` executes last.\n    */\n    setPriority(id, priority) {\n        if (typeof priority !== 'number' || !Number.isFinite(priority)) {\n            throw new TypeError(`Expected \\`priority\\` to be a finite number, got \\`${priority}\\` (${typeof priority})`);\n        }\n        this.#queue.setPriority(id, priority);\n    }\n    async add(function_, options = {}) {\n        // Create a copy to avoid mutating the original options object\n        options = {\n            timeout: this.timeout,\n            ...options,\n            // Assign unique ID if not provided\n            id: options.id ?? (this.#idAssigner++).toString(),\n        };\n        return new Promise((resolve, reject) => {\n            // Create a unique symbol for tracking this task\n            const taskSymbol = Symbol(`task-${options.id}`);\n            let cleanupQueueAbortHandler = () => undefined;\n            const run = async () => {\n                // Task is now running — remove the queued-state abort listener\n                cleanupQueueAbortHandler();\n                this.#pending++;\n                // Track this running task\n                this.#runningTasks.set(taskSymbol, {\n                    id: options.id,\n                    priority: options.priority ?? 0, // Match priority-queue default\n                    startTime: Date.now(),\n                    timeout: options.timeout,\n                });\n                let eventListener;\n                try {\n                    // Check abort signal - if aborted, need to decrement the counter\n                    // that was incremented in tryToStartAnother\n                    try {\n                        options.signal?.throwIfAborted();\n                    }\n                    catch (error) {\n                        this.#rollbackIntervalConsumption();\n                        // Clean up tracking before throwing\n                        this.#runningTasks.delete(taskSymbol);\n                        throw error;\n                    }\n                    this.#lastExecutionTime = Date.now();\n                    let operation = function_({ signal: options.signal });\n                    if (options.timeout) {\n                        operation = pTimeout(Promise.resolve(operation), {\n                            milliseconds: options.timeout,\n                            message: `Task timed out after ${options.timeout}ms (queue has ${this.#pending} running, ${this.#queue.size} waiting)`,\n                        });\n                    }\n                    if (options.signal) {\n                        const { signal } = options;\n                        operation = Promise.race([operation, new Promise((_resolve, reject) => {\n                                eventListener = () => {\n                                    reject(signal.reason);\n                                };\n                                signal.addEventListener('abort', eventListener, { once: true });\n                            })]);\n                    }\n                    const result = await operation;\n                    resolve(result);\n                    this.emit('completed', result);\n                }\n                catch (error) {\n                    reject(error);\n                    this.emit('error', error);\n                }\n                finally {\n                    // Clean up abort event listener\n                    if (eventListener) {\n                        options.signal?.removeEventListener('abort', eventListener);\n                    }\n                    // Remove from running tasks\n                    this.#runningTasks.delete(taskSymbol);\n                    // Use queueMicrotask to prevent deep recursion while maintaining timing\n                    queueMicrotask(() => {\n                        this.#next();\n                    });\n                }\n            };\n            this.#queue.enqueue(run, options);\n            const removeQueuedTask = () => {\n                if (this.#queue instanceof PriorityQueue) {\n                    this.#queue.remove(run);\n                    return;\n                }\n                this.#queue.remove?.(options.id); // Intentionally best-effort: queued abort removal is only supported for queue classes that implement `.remove()`.\n            };\n            // Handle abort while task is waiting in the queue\n            if (options.signal) {\n                const { signal } = options;\n                const queueAbortHandler = () => {\n                    cleanupQueueAbortHandler();\n                    removeQueuedTask();\n                    reject(signal.reason);\n                    this.#tryToStartAnother();\n                    this.emit('next');\n                };\n                cleanupQueueAbortHandler = () => {\n                    signal.removeEventListener('abort', queueAbortHandler);\n                    this.#queueAbortListenerCleanupFunctions.delete(cleanupQueueAbortHandler);\n                };\n                if (signal.aborted) {\n                    queueAbortHandler();\n                    return;\n                }\n                signal.addEventListener('abort', queueAbortHandler, { once: true });\n                this.#queueAbortListenerCleanupFunctions.add(cleanupQueueAbortHandler);\n            }\n            this.emit('add');\n            this.#tryToStartAnother();\n        });\n    }\n    async addAll(functions, options) {\n        return Promise.all(functions.map(async (function_) => this.add(function_, options)));\n    }\n    /**\n    Start (or resume) executing enqueued tasks within concurrency limit. No need to call this if queue is not paused (via `options.autoStart = false` or by `.pause()` method.)\n    */\n    start() {\n        if (!this.#isPaused) {\n            return this;\n        }\n        this.#isPaused = false;\n        this.#processQueue();\n        return this;\n    }\n    /**\n    Put queue execution on hold.\n    */\n    pause() {\n        this.#isPaused = true;\n    }\n    /**\n    Clear the queue.\n    */\n    clear() {\n        for (const cleanupQueueAbortHandler of this.#queueAbortListenerCleanupFunctions) {\n            cleanupQueueAbortHandler();\n        }\n        this.#queue = new this.#queueClass();\n        // Clear interval timer since queue is now empty (consistent with #tryToStartAnother)\n        this.#clearIntervalTimer();\n        // Note: We preserve strict mode rate-limiting state (ticks and timeout)\n        // because clear() only clears queued tasks, not rate limit history.\n        // This ensures that rate limits are still enforced after clearing the queue.\n        // Note: We don't clear #runningTasks as those tasks are still running\n        // They will be removed when they complete in the finally block\n        // Force synchronous update since clear() should have immediate effect\n        this.#updateRateLimitState();\n        // Emit events so waiters (onEmpty, onIdle, onSizeLessThan) can resolve\n        this.emit('empty');\n        if (this.#pending === 0) {\n            this.#clearTimeoutTimer();\n            this.emit('idle');\n        }\n        this.emit('next');\n    }\n    /**\n    Can be called multiple times. Useful if you for example add additional items at a later time.\n\n    @returns A promise that settles when the queue becomes empty.\n    */\n    async onEmpty() {\n        // Instantly resolve if the queue is empty\n        if (this.#queue.size === 0) {\n            return;\n        }\n        await this.#onEvent('empty');\n    }\n    /**\n    @returns A promise that settles when the queue size is less than the given limit: `queue.size < limit`.\n\n    If you want to avoid having the queue grow beyond a certain size you can `await queue.onSizeLessThan()` before adding a new item.\n\n    Note that this only limits the number of items waiting to start. There could still be up to `concurrency` jobs already running that this call does not include in its calculation.\n    */\n    async onSizeLessThan(limit) {\n        // Instantly resolve if the queue is empty.\n        if (this.#queue.size < limit) {\n            return;\n        }\n        await this.#onEvent('next', () => this.#queue.size < limit);\n    }\n    /**\n    The difference with `.onEmpty` is that `.onIdle` guarantees that all work from the queue has finished. `.onEmpty` merely signals that the queue is empty, but it could mean that some promises haven't completed yet.\n\n    @returns A promise that settles when the queue becomes empty, and all promises have completed; `queue.size === 0 && queue.pending === 0`.\n    */\n    async onIdle() {\n        // Instantly resolve if none pending and if nothing else is queued\n        if (this.#pending === 0 && this.#queue.size === 0) {\n            return;\n        }\n        await this.#onEvent('idle');\n    }\n    /**\n    The difference with `.onIdle` is that `.onPendingZero` only waits for currently running tasks to finish, ignoring queued tasks.\n\n    @returns A promise that settles when all currently running tasks have completed; `queue.pending === 0`.\n    */\n    async onPendingZero() {\n        if (this.#pending === 0) {\n            return;\n        }\n        await this.#onEvent('pendingZero');\n    }\n    /**\n    @returns A promise that settles when the queue becomes rate-limited due to intervalCap.\n    */\n    async onRateLimit() {\n        if (this.isRateLimited) {\n            return;\n        }\n        await this.#onEvent('rateLimit');\n    }\n    /**\n    @returns A promise that settles when the queue is no longer rate-limited.\n    */\n    async onRateLimitCleared() {\n        if (!this.isRateLimited) {\n            return;\n        }\n        await this.#onEvent('rateLimitCleared');\n    }\n    /**\n    @returns A promise that rejects when any task in the queue errors.\n\n    Use with `Promise.race([queue.onError(), queue.onIdle()])` to fail fast on the first error while still resolving normally when the queue goes idle.\n\n    Important: The promise returned by `add()` still rejects. You must handle each `add()` promise (for example, `.catch(() => {})`) to avoid unhandled rejections.\n\n    @example\n    ```\n    import PQueue from 'p-queue';\n\n    const queue = new PQueue({concurrency: 2});\n\n    queue.add(() => fetchData(1)).catch(() => {});\n    queue.add(() => fetchData(2)).catch(() => {});\n    queue.add(() => fetchData(3)).catch(() => {});\n\n    // Stop processing on first error\n    try {\n        await Promise.race([\n            queue.onError(),\n            queue.onIdle()\n        ]);\n    } catch (error) {\n        queue.pause(); // Stop processing remaining tasks\n        console.error('Queue failed:', error);\n    }\n    ```\n    */\n    // eslint-disable-next-line @typescript-eslint/promise-function-async\n    onError() {\n        return new Promise((_resolve, reject) => {\n            const handleError = (error) => {\n                this.off('error', handleError);\n                reject(error);\n            };\n            this.on('error', handleError);\n        });\n    }\n    async #onEvent(event, filter) {\n        return new Promise(resolve => {\n            const listener = () => {\n                if (filter && !filter()) {\n                    return;\n                }\n                this.off(event, listener);\n                resolve();\n            };\n            this.on(event, listener);\n        });\n    }\n    /**\n    Size of the queue, the number of queued items waiting to run.\n    */\n    get size() {\n        return this.#queue.size;\n    }\n    /**\n    Size of the queue, filtered by the given options.\n\n    For example, this can be used to find the number of items remaining in the queue with a specific priority level.\n    */\n    sizeBy(options) {\n        // eslint-disable-next-line unicorn/no-array-callback-reference\n        return this.#queue.filter(options).length;\n    }\n    /**\n    Number of running items (no longer in the queue).\n    */\n    get pending() {\n        return this.#pending;\n    }\n    /**\n    Whether the queue is currently paused.\n    */\n    get isPaused() {\n        return this.#isPaused;\n    }\n    #setupRateLimitTracking() {\n        // Only schedule updates when rate limiting is enabled\n        if (this.#isIntervalIgnored) {\n            return;\n        }\n        // Wire up to lifecycle events that affect rate limit state\n        // Only 'add' and 'next' can actually change rate limit state\n        this.on('add', () => {\n            if (this.#queue.size > 0) {\n                this.#scheduleRateLimitUpdate();\n            }\n        });\n        this.on('next', () => {\n            this.#scheduleRateLimitUpdate();\n        });\n    }\n    #scheduleRateLimitUpdate() {\n        // Skip if rate limiting is not enabled or already scheduled\n        if (this.#isIntervalIgnored || this.#rateLimitFlushScheduled) {\n            return;\n        }\n        this.#rateLimitFlushScheduled = true;\n        queueMicrotask(() => {\n            this.#rateLimitFlushScheduled = false;\n            this.#updateRateLimitState();\n        });\n    }\n    #rollbackIntervalConsumption() {\n        if (this.#isIntervalIgnored) {\n            return;\n        }\n        this.#rollbackIntervalSlot();\n        this.#scheduleRateLimitUpdate();\n    }\n    #updateRateLimitState() {\n        const previous = this.#rateLimitedInInterval;\n        // Early exit if rate limiting is disabled or queue is empty\n        if (this.#isIntervalIgnored || this.#queue.size === 0) {\n            if (previous) {\n                this.#rateLimitedInInterval = false;\n                this.emit('rateLimitCleared');\n            }\n            return;\n        }\n        // Get the current count based on mode\n        let count;\n        if (this.#strict) {\n            const now = Date.now();\n            this.#cleanupStrictTicks(now);\n            count = this.#getActiveTicksCount();\n        }\n        else {\n            count = this.#intervalCount;\n        }\n        const shouldBeRateLimited = count >= this.#intervalCap;\n        if (shouldBeRateLimited !== previous) {\n            this.#rateLimitedInInterval = shouldBeRateLimited;\n            this.emit(shouldBeRateLimited ? 'rateLimit' : 'rateLimitCleared');\n        }\n    }\n    /**\n    Whether the queue is currently rate-limited due to intervalCap.\n    */\n    get isRateLimited() {\n        return this.#rateLimitedInInterval;\n    }\n    /**\n    Whether the queue is saturated. Returns `true` when:\n    - All concurrency slots are occupied and tasks are waiting, OR\n    - The queue is rate-limited and tasks are waiting\n\n    Useful for detecting backpressure and potential hanging tasks.\n\n    ```js\n    import PQueue from 'p-queue';\n\n    const queue = new PQueue({concurrency: 2});\n\n    // Backpressure handling\n    if (queue.isSaturated) {\n        console.log('Queue is saturated, waiting for capacity...');\n        await queue.onSizeLessThan(queue.concurrency);\n    }\n\n    // Monitoring for stuck tasks\n    setInterval(() => {\n        if (queue.isSaturated) {\n            console.warn(`Queue saturated: ${queue.pending} running, ${queue.size} waiting`);\n        }\n    }, 60000);\n    ```\n    */\n    get isSaturated() {\n        return (this.#pending === this.#concurrency && this.#queue.size > 0)\n            || (this.isRateLimited && this.#queue.size > 0);\n    }\n    /**\n    The tasks currently being executed. Each task includes its `id`, `priority`, `startTime`, and `timeout` (if set).\n\n    Returns an array of task info objects.\n\n    ```js\n    import PQueue from 'p-queue';\n\n    const queue = new PQueue({concurrency: 2});\n\n    // Add tasks with IDs for better debugging\n    queue.add(() => fetchUser(123), {id: 'user-123'});\n    queue.add(() => fetchPosts(456), {id: 'posts-456', priority: 1});\n\n    // Check what's running\n    console.log(queue.runningTasks);\n    // => [{\n    //   id: 'user-123',\n    //   priority: 0,\n    //   startTime: 1759253001716,\n    //   timeout: undefined\n    // }, {\n    //   id: 'posts-456',\n    //   priority: 1,\n    //   startTime: 1759253001916,\n    //   timeout: undefined\n    // }]\n    ```\n    */\n    get runningTasks() {\n        // Return fresh array with fresh objects to prevent mutations\n        return [...this.#runningTasks.values()].map(task => ({ ...task }));\n    }\n}\n/**\nError thrown when a task times out.\n\n@example\n```\nimport PQueue, {TimeoutError} from 'p-queue';\n\nconst queue = new PQueue({timeout: 1000});\n\ntry {\n    await queue.add(() => someTask());\n} catch (error) {\n    if (error instanceof TimeoutError) {\n        console.log('Task timed out');\n    }\n}\n```\n*/\nexport { TimeoutError } from 'p-timeout';\n","const objectToString = Object.prototype.toString;\n\nconst isError = value => objectToString.call(value) === '[object Error]';\n\nconst errorMessages = new Set([\n\t'network error', // Chrome\n\t'NetworkError when attempting to fetch resource.', // Firefox\n\t'The Internet connection appears to be offline.', // Safari 16\n\t'Network request failed', // `cross-fetch`\n\t'fetch failed', // Undici (Node.js)\n\t'terminated', // Undici (Node.js)\n\t' A network error occurred.', // Bun (WebKit)\n\t'Network connection lost', // Cloudflare Workers (fetch)\n]);\n\nexport default function isNetworkError(error) {\n\tconst isValid = error\n\t\t&& isError(error)\n\t\t&& error.name === 'TypeError'\n\t\t&& typeof error.message === 'string';\n\n\tif (!isValid) {\n\t\treturn false;\n\t}\n\n\tconst {message, stack} = error;\n\n\t// Safari 17+ has generic message but no stack for network errors\n\tif (message === 'Load failed') {\n\t\treturn stack === undefined\n\t\t\t// Sentry adds its own stack trace to the fetch error, so also check for that\n\t\t\t|| '__sentry_captured__' in error;\n\t}\n\n\t// Deno network errors start with specific text\n\tif (message.startsWith('error sending request for url')) {\n\t\treturn true;\n\t}\n\n\t// Chrome: exact \"Failed to fetch\" or with hostname: \"Failed to fetch (example.com)\"\n\tif (message === 'Failed to fetch' || (message.startsWith('Failed to fetch (') && message.endsWith(')'))) {\n\t\treturn true;\n\t}\n\n\t// Standard network error messages\n\treturn errorMessages.has(message);\n}\n","import isNetworkError from 'is-network-error';\n\nfunction validateRetries(retries) {\n\tif (typeof retries === 'number') {\n\t\tif (retries < 0) {\n\t\t\tthrow new TypeError('Expected `retries` to be a non-negative number.');\n\t\t}\n\n\t\tif (Number.isNaN(retries)) {\n\t\t\tthrow new TypeError('Expected `retries` to be a valid number or Infinity, got NaN.');\n\t\t}\n\t} else if (retries !== undefined) {\n\t\tthrow new TypeError('Expected `retries` to be a number or Infinity.');\n\t}\n}\n\nfunction validateNumberOption(name, value, {min = 0, allowInfinity = false} = {}) {\n\tif (value === undefined) {\n\t\treturn;\n\t}\n\n\tif (typeof value !== 'number' || Number.isNaN(value)) {\n\t\tthrow new TypeError(`Expected \\`${name}\\` to be a number${allowInfinity ? ' or Infinity' : ''}.`);\n\t}\n\n\tif (!allowInfinity && !Number.isFinite(value)) {\n\t\tthrow new TypeError(`Expected \\`${name}\\` to be a finite number.`);\n\t}\n\n\tif (value < min) {\n\t\tthrow new TypeError(`Expected \\`${name}\\` to be \\u2265 ${min}.`);\n\t}\n}\n\nexport class AbortError extends Error {\n\tconstructor(message) {\n\t\tsuper();\n\n\t\tif (message instanceof Error) {\n\t\t\tthis.originalError = message;\n\t\t\t({message} = message);\n\t\t} else {\n\t\t\tthis.originalError = new Error(message);\n\t\t\tthis.originalError.stack = this.stack;\n\t\t}\n\n\t\tthis.name = 'AbortError';\n\t\tthis.message = message;\n\t}\n}\n\nfunction calculateDelay(retriesConsumed, options) {\n\tconst attempt = Math.max(1, retriesConsumed + 1);\n\tconst random = options.randomize ? (Math.random() + 1) : 1;\n\n\tlet timeout = Math.round(random * options.minTimeout * (options.factor ** (attempt - 1)));\n\ttimeout = Math.min(timeout, options.maxTimeout);\n\n\treturn timeout;\n}\n\nfunction calculateRemainingTime(start, max) {\n\tif (!Number.isFinite(max)) {\n\t\treturn max;\n\t}\n\n\treturn max - (performance.now() - start);\n}\n\nasync function onAttemptFailure({error, attemptNumber, retriesConsumed, startTime, options}) {\n\tconst normalizedError = error instanceof Error\n\t\t? error\n\t\t: new TypeError(`Non-error was thrown: \"${error}\". You should only throw errors.`);\n\n\tif (normalizedError instanceof AbortError) {\n\t\tthrow normalizedError.originalError;\n\t}\n\n\tconst retriesLeft = Number.isFinite(options.retries)\n\t\t? Math.max(0, options.retries - retriesConsumed)\n\t\t: options.retries;\n\n\tconst maxRetryTime = options.maxRetryTime ?? Number.POSITIVE_INFINITY;\n\n\tconst context = Object.freeze({\n\t\terror: normalizedError,\n\t\tattemptNumber,\n\t\tretriesLeft,\n\t\tretriesConsumed,\n\t});\n\n\tawait options.onFailedAttempt(context);\n\n\tif (calculateRemainingTime(startTime, maxRetryTime) <= 0) {\n\t\tthrow normalizedError;\n\t}\n\n\tconst consumeRetry = await options.shouldConsumeRetry(context);\n\n\tconst remainingTime = calculateRemainingTime(startTime, maxRetryTime);\n\n\tif (remainingTime <= 0 || retriesLeft <= 0) {\n\t\tthrow normalizedError;\n\t}\n\n\tif (normalizedError instanceof TypeError && !isNetworkError(normalizedError)) {\n\t\tif (consumeRetry) {\n\t\t\tthrow normalizedError;\n\t\t}\n\n\t\toptions.signal?.throwIfAborted();\n\t\treturn false;\n\t}\n\n\tif (!await options.shouldRetry(context)) {\n\t\tthrow normalizedError;\n\t}\n\n\tif (!consumeRetry) {\n\t\toptions.signal?.throwIfAborted();\n\t\treturn false;\n\t}\n\n\tconst delayTime = calculateDelay(retriesConsumed, options);\n\tconst finalDelay = Math.min(delayTime, remainingTime);\n\n\toptions.signal?.throwIfAborted();\n\n\tif (finalDelay > 0) {\n\t\tawait new Promise((resolve, reject) => {\n\t\t\tconst onAbort = () => {\n\t\t\t\tclearTimeout(timeoutToken);\n\t\t\t\toptions.signal?.removeEventListener('abort', onAbort);\n\t\t\t\treject(options.signal.reason);\n\t\t\t};\n\n\t\t\tconst timeoutToken = setTimeout(() => {\n\t\t\t\toptions.signal?.removeEventListener('abort', onAbort);\n\t\t\t\tresolve();\n\t\t\t}, finalDelay);\n\n\t\t\tif (options.unref) {\n\t\t\t\ttimeoutToken.unref?.();\n\t\t\t}\n\n\t\t\toptions.signal?.addEventListener('abort', onAbort, {once: true});\n\t\t});\n\t}\n\n\toptions.signal?.throwIfAborted();\n\n\treturn true;\n}\n\nexport default async function pRetry(input, options = {}) {\n\toptions = {...options};\n\n\tvalidateRetries(options.retries);\n\n\tif (Object.hasOwn(options, 'forever')) {\n\t\tthrow new Error('The `forever` option is no longer supported. For many use-cases, you can set `retries: Infinity` instead.');\n\t}\n\n\toptions.retries ??= 10;\n\toptions.factor ??= 2;\n\toptions.minTimeout ??= 1000;\n\toptions.maxTimeout ??= Number.POSITIVE_INFINITY;\n\toptions.maxRetryTime ??= Number.POSITIVE_INFINITY;\n\toptions.randomize ??= false;\n\toptions.onFailedAttempt ??= () => {};\n\toptions.shouldRetry ??= () => true;\n\toptions.shouldConsumeRetry ??= () => true;\n\n\t// Validate numeric options and normalize edge cases\n\tvalidateNumberOption('factor', options.factor, {min: 0, allowInfinity: false});\n\tvalidateNumberOption('minTimeout', options.minTimeout, {min: 0, allowInfinity: false});\n\tvalidateNumberOption('maxTimeout', options.maxTimeout, {min: 0, allowInfinity: true});\n\tvalidateNumberOption('maxRetryTime', options.maxRetryTime, {min: 0, allowInfinity: true});\n\n\t// Treat non-positive factor as 1 to avoid zero backoff or negative behavior\n\tif (!(options.factor > 0)) {\n\t\toptions.factor = 1;\n\t}\n\n\toptions.signal?.throwIfAborted();\n\n\tlet attemptNumber = 0;\n\tlet retriesConsumed = 0;\n\tconst startTime = performance.now();\n\n\twhile (Number.isFinite(options.retries) ? retriesConsumed <= options.retries : true) {\n\t\tattemptNumber++;\n\n\t\ttry {\n\t\t\toptions.signal?.throwIfAborted();\n\n\t\t\tconst result = await input(attemptNumber);\n\n\t\t\toptions.signal?.throwIfAborted();\n\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tif (await onAttemptFailure({\n\t\t\t\terror,\n\t\t\t\tattemptNumber,\n\t\t\t\tretriesConsumed,\n\t\t\t\tstartTime,\n\t\t\t\toptions,\n\t\t\t})) {\n\t\t\t\tretriesConsumed++;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Should not reach here, but in case it does, throw an error\n\tthrow new Error('Retry attempts exhausted without throwing an error.');\n}\n\nexport function makeRetriable(function_, options) {\n\treturn function (...arguments_) {\n\t\treturn pRetry(() => function_.apply(this, arguments_), options);\n\t};\n}\n","import { type BaseModelInfo } from \"../config/schema.js\";\n\nimport { type ProviderCredentials } from \"./detector.js\";\n\nexport interface EmbeddingResult {\n  embedding: number[];\n  tokensUsed: number;\n}\n\nexport interface EmbeddingBatchResult {\n  embeddings: number[][];\n  totalTokensUsed: number;\n}\n\nexport interface EmbeddingProviderInterface {\n  embedQuery(query: string): Promise<EmbeddingResult>;\n  embedDocument(document: string): Promise<EmbeddingResult>;\n  embedBatch(texts: string[]): Promise<EmbeddingBatchResult>;\n  getModelInfo(): BaseModelInfo;\n}\n\nexport abstract class BaseEmbeddingProvider<TModelInfo extends BaseModelInfo>\n  implements EmbeddingProviderInterface {\n  public constructor(\n    protected readonly credentials: ProviderCredentials,\n    protected readonly modelInfo: TModelInfo\n  ) { }\n\n  public async embedQuery(query: string): Promise<EmbeddingResult> {\n    const result = await this.embedBatch([query]);\n    return {\n      embedding: result.embeddings[0],\n      tokensUsed: result.totalTokensUsed,\n    };\n  }\n\n  public async embedDocument(document: string): Promise<EmbeddingResult> {\n    const result = await this.embedBatch([document]);\n    return {\n      embedding: result.embeddings[0],\n      tokensUsed: result.totalTokensUsed,\n    };\n  }\n\n  public getModelInfo(): TModelInfo {\n    return this.modelInfo;\n  }\n\n  public abstract embedBatch(texts: string[]): Promise<EmbeddingBatchResult>;\n}\n\n/**\n * Thrown by CustomEmbeddingProvider for HTTP 4xx errors (except 429 rate limit).\n * The Indexer's pRetry config uses instanceof to bail immediately on these errors\n * instead of retrying — preventing long retry loops on bad API keys or invalid models.\n */\nexport class CustomProviderNonRetryableError extends Error {\n  public constructor(message: string) {\n    super(message);\n    this.name = \"CustomProviderNonRetryableError\";\n  }\n}\n","/**\n * URL validation utilities to prevent SSRF attacks against cloud metadata services.\n *\n * IMPORTANT: This intentionally allows localhost and private IPs because the custom\n * embedding provider is commonly used with local servers (Ollama, llama.cpp, vLLM,\n * text-embeddings-inference). The threat model is a malicious committed config file\n * targeting cloud metadata endpoints, not blocking legitimate local usage.\n *\n * KNOWN LIMITATION: This validates the hostname string only, not the resolved IP.\n * A DNS rebinding attack (hostname that resolves to 169.254.169.254) bypasses this\n * check. Full mitigation would require DNS resolution pinning (resolve → check IP →\n * connect), which needs a custom HTTP agent. Acceptable for now given the local-only\n * threat model and the low likelihood of DNS rebinding in committed config files.\n */\n\n/** Cloud metadata service IPs and hostnames that should never be contacted. */\nconst BLOCKED_METADATA_IPS = [\n  /^169\\.254\\.169\\.254$/, // AWS/Azure/GCP metadata\n  /^169\\.254\\.170\\.2$/, // AWS ECS task metadata\n  /^fd00:ec2::254$/, // AWS IMDSv2 IPv6\n];\n\nconst BLOCKED_HOSTNAMES = new Set([\n  \"metadata.google.internal\",\n  \"metadata.google\",\n  \"metadata.goog\",\n  \"kubernetes.default.svc\",\n]);\n\nexport interface UrlValidationResult {\n  valid: boolean;\n  reason?: string;\n}\n\n/**\n * Validates that a URL does not point to cloud metadata services or use dangerous protocols.\n * Allows localhost and private IPs for local embedding servers.\n * Returns { valid: true } if the URL is safe, or { valid: false, reason } if blocked.\n */\nexport function validateExternalUrl(urlString: string): UrlValidationResult {\n  let parsed: URL;\n  try {\n    parsed = new URL(urlString);\n  } catch {\n    return { valid: false, reason: `Invalid URL: ${sanitizeUrlForError(urlString)}` };\n  }\n\n  // Block non-HTTP protocols (file://, gopher://, ftp://, etc.)\n  if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n    return { valid: false, reason: `Blocked protocol: ${parsed.protocol}` };\n  }\n\n  const hostname = parsed.hostname.toLowerCase();\n\n  // Block known cloud metadata hostnames\n  if (BLOCKED_HOSTNAMES.has(hostname)) {\n    return { valid: false, reason: `Blocked: cloud metadata service (${hostname})` };\n  }\n\n  // Block cloud metadata IPs\n  for (const pattern of BLOCKED_METADATA_IPS) {\n    if (pattern.test(hostname)) {\n      return { valid: false, reason: `Blocked: cloud metadata IP (${hostname})` };\n    }\n  }\n\n  // Block link-local range (169.254.x.x) — used exclusively for metadata/APIPA, not user servers\n  if (/^169\\.254\\./.test(hostname)) {\n    return { valid: false, reason: `Blocked: link-local address (${hostname})` };\n  }\n\n  return { valid: true };\n}\n\n/**\n * Strips credentials and sensitive parts from a URL for safe inclusion in error messages.\n */\nexport function sanitizeUrlForError(url: string): string {\n  try {\n    const parsed = new URL(url);\n    // Remove username:password from URL\n    parsed.username = \"\";\n    parsed.password = \"\";\n    return parsed.toString();\n  } catch {\n    // If URL can't be parsed, truncate and mask\n    const maxLen = 80;\n    if (url.length > maxLen) {\n      return url.slice(0, maxLen) + \"...\";\n    }\n    return url;\n  }\n}\n","import { type CustomModelInfo, type ProviderCredentials } from \"../detector.js\";\nimport {\n  BaseEmbeddingProvider,\n  CustomProviderNonRetryableError,\n  type EmbeddingBatchResult,\n} from \"../provider-types.js\";\nimport { sanitizeUrlForError, validateExternalUrl } from \"../../utils/url-validation.js\";\n\nexport class CustomEmbeddingProvider extends BaseEmbeddingProvider<CustomModelInfo> {\n  public constructor(credentials: ProviderCredentials, modelInfo: CustomModelInfo) {\n    super(credentials, modelInfo);\n  }\n\n  private splitIntoRequestBatches(texts: string[]): string[][] {\n    const maxBatchSize = this.modelInfo.maxBatchSize;\n\n    if (!maxBatchSize || texts.length <= maxBatchSize) {\n      return [texts];\n    }\n\n    const batches: string[][] = [];\n    for (let i = 0; i < texts.length; i += maxBatchSize) {\n      batches.push(texts.slice(i, i + maxBatchSize));\n    }\n    return batches;\n  }\n\n  private async embedRequest(texts: string[]): Promise<EmbeddingBatchResult> {\n    if (texts.length === 0) {\n      return {\n        embeddings: [],\n        totalTokensUsed: 0,\n      };\n    }\n\n    const headers: Record<string, string> = {\n      \"Content-Type\": \"application/json\",\n    };\n    if (this.credentials.apiKey) {\n      headers.Authorization = `Bearer ${this.credentials.apiKey}`;\n    }\n\n    const baseUrl = this.credentials.baseUrl ?? \"\";\n    const fullUrl = `${baseUrl}/embeddings`;\n\n    const urlCheck = validateExternalUrl(fullUrl);\n    if (!urlCheck.valid) {\n      throw new CustomProviderNonRetryableError(\n        `Custom embedding provider URL blocked (SSRF protection): ${urlCheck.reason}`\n      );\n    }\n\n    const timeoutMs = this.modelInfo.timeoutMs;\n    const controller = new AbortController();\n    const timeout = setTimeout(() => controller.abort(), timeoutMs);\n\n    let response: Response;\n    try {\n      response = await fetch(fullUrl, {\n        method: \"POST\",\n        headers,\n        body: JSON.stringify({\n          model: this.modelInfo.model,\n          input: texts,\n        }),\n        signal: controller.signal,\n      });\n    } catch (error: unknown) {\n      if (error instanceof Error && error.name === \"AbortError\") {\n        throw new Error(`Custom embedding API request timed out after ${timeoutMs}ms for ${sanitizeUrlForError(fullUrl)}`);\n      }\n      throw error;\n    } finally {\n      clearTimeout(timeout);\n    }\n\n    if (!response.ok) {\n      const errorText = (await response.text()).slice(0, 500);\n      if (response.status >= 400 && response.status < 500 && response.status !== 429) {\n        throw new CustomProviderNonRetryableError(`Custom embedding API error (non-retryable): ${response.status} - ${errorText}`);\n      }\n      throw new Error(`Custom embedding API error: ${response.status} - ${errorText}`);\n    }\n\n    const data = await response.json() as {\n      data?: Array<{ embedding: number[] }>;\n      usage?: { total_tokens: number };\n    };\n\n    if (data.data && Array.isArray(data.data)) {\n      if (data.data.length > 0) {\n        const actualDims = data.data[0].embedding.length;\n        if (actualDims !== this.modelInfo.dimensions) {\n          throw new Error(\n            `Dimension mismatch: customProvider.dimensions is ${this.modelInfo.dimensions}, ` +\n            `but the API returned vectors with ${actualDims} dimensions. ` +\n            `Update your config to match the model's actual output dimensions.`\n          );\n        }\n      }\n\n      if (data.data.length !== texts.length) {\n        throw new Error(\n          `Embedding count mismatch: sent ${texts.length} texts but received ${data.data.length} embeddings. ` +\n          `The custom embedding server may not support batch input.`\n        );\n      }\n\n      return {\n        embeddings: data.data.map((d) => d.embedding),\n        totalTokensUsed: data.usage?.total_tokens ?? texts.reduce((sum, t) => sum + Math.ceil(t.length / 4), 0),\n      };\n    }\n\n    throw new Error(\"Custom embedding API returned unexpected response format. Expected OpenAI-compatible format with data[].embedding.\");\n  }\n\n  public async embedBatch(texts: string[]): Promise<EmbeddingBatchResult> {\n    const requestBatches = this.splitIntoRequestBatches(texts);\n    const embeddings: number[][] = [];\n    let totalTokensUsed = 0;\n\n    for (const batch of requestBatches) {\n      const result = await this.embedRequest(batch);\n      embeddings.push(...result.embeddings);\n      totalTokensUsed += result.totalTokensUsed;\n    }\n\n    return {\n      embeddings,\n      totalTokensUsed,\n    };\n  }\n}\n","import { type EmbeddingProviderModelInfo } from \"../../config/schema.js\";\n\nimport { type ProviderCredentials } from \"../detector.js\";\nimport { BaseEmbeddingProvider, type EmbeddingBatchResult } from \"../provider-types.js\";\n\nexport class GitHubCopilotEmbeddingProvider extends BaseEmbeddingProvider<EmbeddingProviderModelInfo[\"github-copilot\"]> {\n  public constructor(\n    credentials: ProviderCredentials,\n    modelInfo: EmbeddingProviderModelInfo[\"github-copilot\"]\n  ) {\n    super(credentials, modelInfo);\n  }\n\n  private getToken(): string {\n    if (!this.credentials.refreshToken) {\n      throw new Error(\"No OAuth token available for GitHub\");\n    }\n    return this.credentials.refreshToken;\n  }\n\n  public async embedBatch(texts: string[]): Promise<EmbeddingBatchResult> {\n    const token = this.getToken();\n\n    const response = await fetch(`${this.credentials.baseUrl}/inference/embeddings`, {\n      method: \"POST\",\n      headers: {\n        Authorization: `Bearer ${token}`,\n        \"Content-Type\": \"application/json\",\n        Accept: \"application/vnd.github+json\",\n        \"X-GitHub-Api-Version\": \"2022-11-28\",\n      },\n      body: JSON.stringify({\n        model: `openai/${this.modelInfo.model}`,\n        input: texts,\n      }),\n    });\n\n    if (!response.ok) {\n      const error = (await response.text()).slice(0, 500);\n      throw new Error(`GitHub Copilot embedding API error: ${response.status} - ${error}`);\n    }\n\n    const data = await response.json() as {\n      data: Array<{ embedding: number[] }>;\n      usage: { total_tokens: number };\n    };\n\n    return {\n      embeddings: data.data.map((d) => d.embedding),\n      totalTokensUsed: data.usage.total_tokens,\n    };\n  }\n}\n","import { type EmbeddingProviderModelInfo } from \"../../config/schema.js\";\n\nimport { type ProviderCredentials } from \"../detector.js\";\nimport {\n  BaseEmbeddingProvider,\n  type EmbeddingBatchResult,\n  type EmbeddingResult,\n} from \"../provider-types.js\";\n\nexport class GoogleEmbeddingProvider extends BaseEmbeddingProvider<EmbeddingProviderModelInfo[\"google\"]> {\n  private static readonly BATCH_SIZE = 20;\n\n  public constructor(\n    credentials: ProviderCredentials,\n    modelInfo: EmbeddingProviderModelInfo[\"google\"]\n  ) {\n    super(credentials, modelInfo);\n  }\n\n  public async embedQuery(query: string): Promise<EmbeddingResult> {\n    const taskType = this.modelInfo.taskAble ? \"CODE_RETRIEVAL_QUERY\" : undefined;\n    const result = await this.embedWithTaskType([query], taskType);\n    return {\n      embedding: result.embeddings[0],\n      tokensUsed: result.totalTokensUsed,\n    };\n  }\n\n  public async embedDocument(document: string): Promise<EmbeddingResult> {\n    const taskType = this.modelInfo.taskAble ? \"RETRIEVAL_DOCUMENT\" : undefined;\n    const result = await this.embedWithTaskType([document], taskType);\n    return {\n      embedding: result.embeddings[0],\n      tokensUsed: result.totalTokensUsed,\n    };\n  }\n\n  public async embedBatch(texts: string[]): Promise<EmbeddingBatchResult> {\n    const taskType = this.modelInfo.taskAble ? \"RETRIEVAL_DOCUMENT\" : undefined;\n    return this.embedWithTaskType(texts, taskType);\n  }\n\n  private async embedWithTaskType(\n    texts: string[],\n    taskType?: string\n  ): Promise<EmbeddingBatchResult> {\n    const batches: string[][] = [];\n    for (let i = 0; i < texts.length; i += GoogleEmbeddingProvider.BATCH_SIZE) {\n      batches.push(texts.slice(i, i + GoogleEmbeddingProvider.BATCH_SIZE));\n    }\n\n    const batchResults = await Promise.all(\n      batches.map(async (batch) => {\n        const requests = batch.map((text) => ({\n          model: `models/${this.modelInfo.model}`,\n          content: {\n            parts: [{ text }],\n          },\n          taskType,\n          outputDimensionality: this.modelInfo.dimensions,\n        }));\n\n        const response = await fetch(\n          `${this.credentials.baseUrl}/models/${this.modelInfo.model}:batchEmbedContents`,\n          {\n            method: \"POST\",\n            headers: {\n              \"Content-Type\": \"application/json\",\n              ...(this.credentials.apiKey && { \"x-goog-api-key\": this.credentials.apiKey }),\n            },\n            body: JSON.stringify({ requests }),\n          }\n        );\n\n        if (!response.ok) {\n          const error = (await response.text()).slice(0, 500);\n          throw new Error(`Google embedding API error: ${response.status} - ${error}`);\n        }\n\n        const data = (await response.json()) as {\n          embeddings: Array<{ values: number[] }>;\n        };\n\n        return {\n          embeddings: data.embeddings.map((e) => e.values),\n          tokensUsed: batch.reduce((sum, text) => sum + Math.ceil(text.length / 4), 0),\n        };\n      })\n    );\n\n    return {\n      embeddings: batchResults.flatMap((r) => r.embeddings),\n      totalTokensUsed: batchResults.reduce((sum, r) => sum + r.tokensUsed, 0),\n    };\n  }\n}\n","import { type EmbeddingProviderModelInfo } from \"../../config/schema.js\";\n\nimport { type ProviderCredentials } from \"../detector.js\";\nimport { BaseEmbeddingProvider, type EmbeddingBatchResult } from \"../provider-types.js\";\n\nexport class OllamaEmbeddingProvider extends BaseEmbeddingProvider<EmbeddingProviderModelInfo[\"ollama\"]> {\n  private static readonly MIN_TRUNCATION_CHARS = 512;\n\n  public constructor(\n    credentials: ProviderCredentials,\n    modelInfo: EmbeddingProviderModelInfo[\"ollama\"]\n  ) {\n    super(credentials, modelInfo);\n  }\n\n  private estimateTokens(text: string): number {\n    return Math.ceil(text.length / 4);\n  }\n\n  private truncateToCharLimit(text: string, maxChars: number): string {\n    if (text.length <= maxChars) {\n      return text;\n    }\n\n    return `${text.slice(0, Math.max(0, maxChars - 17))}\\n... [truncated]`;\n  }\n\n  private isContextLengthError(error: unknown): boolean {\n    const message = (error instanceof Error ? error.message : String(error)).toLowerCase();\n    return (message.includes(\"context length\") && (message.includes(\"exceed\") || message.includes(\"exceeded\") || message.includes(\"too long\")))\n      || message.includes(\"input length exceeds the context length\")\n      || message.includes(\"context length exceeded\");\n  }\n\n  private buildTruncationCandidates(text: string): string[] {\n    const baseMaxChars = Math.max(1, this.modelInfo.maxTokens * 4);\n    const candidateLimits = new Set<number>();\n    const baselineLimit = text.length > baseMaxChars\n      ? baseMaxChars\n      : Math.max(\n          OllamaEmbeddingProvider.MIN_TRUNCATION_CHARS,\n          Math.floor(text.length * 0.9)\n        );\n\n    if (baselineLimit < text.length) {\n      candidateLimits.add(baselineLimit);\n    }\n\n    for (const factor of [0.75, 0.6, 0.45, 0.35, 0.25]) {\n      const scaledLimit = Math.max(\n        OllamaEmbeddingProvider.MIN_TRUNCATION_CHARS,\n        Math.floor(baselineLimit * factor)\n      );\n      if (scaledLimit < text.length) {\n        candidateLimits.add(scaledLimit);\n      }\n    }\n\n    candidateLimits.add(Math.min(text.length - 1, OllamaEmbeddingProvider.MIN_TRUNCATION_CHARS));\n\n    const candidates: string[] = [];\n    const seen = new Set<string>();\n    for (const limit of [...candidateLimits].sort((a, b) => b - a)) {\n      if (limit <= 0 || limit >= text.length) {\n        continue;\n      }\n\n      const truncated = this.truncateToCharLimit(text, limit);\n      if (truncated === text || seen.has(truncated)) {\n        continue;\n      }\n\n      seen.add(truncated);\n      candidates.push(truncated);\n    }\n\n    return candidates;\n  }\n\n  private async embedSingleWithFallback(text: string): Promise<{ embedding: number[]; tokensUsed: number }> {\n    try {\n      return await this.embedSingle(text);\n    } catch (error) {\n      if (!this.isContextLengthError(error)) {\n        throw error;\n      }\n\n      let lastError: unknown = error;\n      for (const truncated of this.buildTruncationCandidates(text)) {\n        try {\n          return await this.embedSingle(truncated);\n        } catch (retryError) {\n          if (!this.isContextLengthError(retryError)) {\n            throw retryError;\n          }\n          lastError = retryError;\n        }\n      }\n\n      throw lastError;\n    }\n  }\n\n  private async embedSingle(text: string): Promise<{ embedding: number[]; tokensUsed: number }> {\n    const response = await fetch(`${this.credentials.baseUrl}/api/embeddings`, {\n      method: \"POST\",\n      headers: {\n        \"Content-Type\": \"application/json\",\n      },\n      body: JSON.stringify({\n        model: this.modelInfo.model,\n        prompt: text,\n        truncate: false,\n      }),\n    });\n\n    if (!response.ok) {\n      const error = (await response.text()).slice(0, 500);\n      throw new Error(`Ollama embedding API error: ${response.status} - ${error}`);\n    }\n\n    const data = (await response.json()) as {\n      embedding: number[];\n    };\n\n    return {\n      embedding: data.embedding,\n      tokensUsed: this.estimateTokens(text),\n    };\n  }\n\n  public async embedBatch(texts: string[]): Promise<EmbeddingBatchResult> {\n    const results: Array<{ embedding: number[]; tokensUsed: number }> = [];\n\n    for (const text of texts) {\n      results.push(await this.embedSingleWithFallback(text));\n    }\n\n    return {\n      embeddings: results.map((r) => r.embedding),\n      totalTokensUsed: results.reduce((sum, r) => sum + r.tokensUsed, 0),\n    };\n  }\n}\n","import { type EmbeddingProviderModelInfo } from \"../../config/schema.js\";\n\nimport { type ProviderCredentials } from \"../detector.js\";\nimport { BaseEmbeddingProvider, type EmbeddingBatchResult } from \"../provider-types.js\";\n\nexport class OpenAIEmbeddingProvider extends BaseEmbeddingProvider<EmbeddingProviderModelInfo[\"openai\"]> {\n  public constructor(\n    credentials: ProviderCredentials,\n    modelInfo: EmbeddingProviderModelInfo[\"openai\"]\n  ) {\n    super(credentials, modelInfo);\n  }\n\n  public async embedBatch(texts: string[]): Promise<EmbeddingBatchResult> {\n    const response = await fetch(`${this.credentials.baseUrl}/embeddings`, {\n      method: \"POST\",\n      headers: {\n        Authorization: `Bearer ${this.credentials.apiKey}`,\n        \"Content-Type\": \"application/json\",\n      },\n      body: JSON.stringify({\n        model: this.modelInfo.model,\n        input: texts,\n      }),\n    });\n\n    if (!response.ok) {\n      const error = (await response.text()).slice(0, 500);\n      throw new Error(`OpenAI embedding API error: ${response.status} - ${error}`);\n    }\n\n    const data = await response.json() as {\n      data: Array<{ embedding: number[] }>;\n      usage: { total_tokens: number };\n    };\n\n    return {\n      embeddings: data.data.map((d) => d.embedding),\n      totalTokensUsed: data.usage.total_tokens,\n    };\n  }\n}\n","import { type ConfiguredProviderInfo } from \"./detector.js\";\nimport { CustomEmbeddingProvider } from \"./providers/custom.js\";\nimport { GitHubCopilotEmbeddingProvider } from \"./providers/github-copilot.js\";\nimport { GoogleEmbeddingProvider } from \"./providers/google.js\";\nimport { OllamaEmbeddingProvider } from \"./providers/ollama.js\";\nimport { OpenAIEmbeddingProvider } from \"./providers/openai.js\";\n\nexport {\n  BaseEmbeddingProvider,\n  CustomProviderNonRetryableError,\n  type EmbeddingBatchResult,\n  type EmbeddingProviderInterface,\n  type EmbeddingResult,\n} from \"./provider-types.js\";\n\nexport function createEmbeddingProvider(\n  configuredProviderInfo: ConfiguredProviderInfo,\n): import(\"./provider-types.js\").EmbeddingProviderInterface {\n  switch (configuredProviderInfo.provider) {\n    case \"github-copilot\":\n      return new GitHubCopilotEmbeddingProvider(configuredProviderInfo.credentials, configuredProviderInfo.modelInfo);\n    case \"openai\":\n      return new OpenAIEmbeddingProvider(configuredProviderInfo.credentials, configuredProviderInfo.modelInfo);\n    case \"google\":\n      return new GoogleEmbeddingProvider(configuredProviderInfo.credentials, configuredProviderInfo.modelInfo);\n    case \"ollama\":\n      return new OllamaEmbeddingProvider(configuredProviderInfo.credentials, configuredProviderInfo.modelInfo);\n    case \"custom\":\n      return new CustomEmbeddingProvider(configuredProviderInfo.credentials, configuredProviderInfo.modelInfo);\n    default: {\n      const _exhaustive: never = configuredProviderInfo;\n      throw new Error(`Unsupported embedding provider: ${(_exhaustive as ConfiguredProviderInfo).provider}`);\n    }\n  }\n}\n","import { RerankerConfig } from \"../config/schema.js\";\n\nexport interface RerankResult {\n  index: number;\n  relevanceScore: number;\n  document?: string;\n}\n\nexport interface RerankResponse {\n  results: RerankResult[];\n  tokensUsed?: number;\n}\n\nexport interface RerankerInterface {\n  isAvailable(): boolean;\n  rerank(query: string, documents: string[], topN?: number): Promise<RerankResponse>;\n}\n\nexport function createReranker(config: RerankerConfig): RerankerInterface {\n  if (!config.enabled) {\n    return new NoOpReranker();\n  }\n  return new SiliconFlowReranker(config);\n}\n\nclass NoOpReranker implements RerankerInterface {\n  isAvailable(): boolean {\n    return false;\n  }\n\n  async rerank(_query: string, documents: string[], _topN?: number): Promise<RerankResponse> {\n    return {\n      results: documents.map((_, index) => ({ index, relevanceScore: 0 })),\n    };\n  }\n}\n\nclass SiliconFlowReranker implements RerankerInterface {\n  private config: RerankerConfig;\n\n  constructor(config: RerankerConfig) {\n    this.config = config;\n  }\n\n  isAvailable(): boolean {\n    return this.config.enabled && !!this.config.baseUrl && !!this.config.model;\n  }\n\n  async rerank(query: string, documents: string[], topN?: number): Promise<RerankResponse> {\n    if (documents.length === 0) {\n      return { results: [] };\n    }\n\n    const headers: Record<string, string> = {\n      \"Content-Type\": \"application/json\",\n    };\n    if (this.config.apiKey) {\n      headers[\"Authorization\"] = `Bearer ${this.config.apiKey}`;\n    }\n\n    const baseUrl = this.config.baseUrl;\n    if (!baseUrl) {\n      throw new Error(\"Reranker baseUrl is required. Configure reranker.baseUrl in your codebase-index.json.\");\n    }\n    const timeoutMs = this.config.timeoutMs ?? 30000;\n    const controller = new AbortController();\n    const timeout = setTimeout(() => controller.abort(), timeoutMs);\n\n    try {\n      const response = await fetch(`${baseUrl}/rerank`, {\n        method: \"POST\",\n        headers,\n        body: JSON.stringify({\n          model: this.config.model,\n          query,\n          documents,\n          top_n: topN ?? this.config.topN ?? 20,\n          return_documents: false,\n        }),\n        signal: controller.signal,\n      });\n\n      clearTimeout(timeout);\n\n      if (!response.ok) {\n        const errorText = await response.text();\n        throw new Error(`Rerank API error: ${response.status} - ${errorText}`);\n      }\n\n      const data = await response.json() as {\n        results: Array<{\n          index: number;\n          relevance_score: number;\n          document?: { text: string };\n        }>;\n        meta?: {\n          tokens?: {\n            input_tokens: number;\n            output_tokens: number;\n          };\n        };\n      };\n\n      return {\n        results: data.results.map((r) => ({\n          index: r.index,\n          relevanceScore: r.relevance_score,\n          document: r.document?.text,\n        })),\n        tokensUsed: data.meta?.tokens?.input_tokens,\n      };\n    } catch (error: unknown) {\n      clearTimeout(timeout);\n      if (error instanceof Error && error.name === 'AbortError') {\n        throw new Error(`Rerank API request timed out after ${timeoutMs}ms`);\n      }\n      throw error;\n    }\n  }\n}\n","import ignore, { Ignore } from \"ignore\";\nimport { existsSync, readFileSync, promises as fsPromises } from \"fs\";\nimport * as path from \"path\";\n\nimport { hasFilteredPathSegment, isBuildPathSegment, isHiddenPathSegment } from \"./paths.js\";\n\nconst PROJECT_MARKERS = [\n  \".git\",\n  \"package.json\",\n  \"Cargo.toml\",\n  \"go.mod\",\n  \"pyproject.toml\",\n  \"setup.py\",\n  \"requirements.txt\",\n  \"Gemfile\",\n  \"composer.json\",\n  \"pom.xml\",\n  \"build.gradle\",\n  \"CMakeLists.txt\",\n  \"Makefile\",\n  \".opencode\",\n  \".codebase-index\",\n];\n\nexport function hasProjectMarker(projectRoot: string): boolean {\n  for (const marker of PROJECT_MARKERS) {\n    if (existsSync(path.join(projectRoot, marker))) {\n      return true;\n    }\n  }\n  return false;\n}\n\nexport interface SkippedFile {\n  path: string;\n  reason: \"too_large\" | \"excluded\" | \"gitignore\" | \"no_match\";\n}\n\nexport interface CollectFilesResult {\n  files: Array<{ path: string; size: number }>;\n  skipped: SkippedFile[];\n}\n\nexport function createIgnoreFilter(projectRoot: string): Ignore {\n  const ig = ignore();\n\n  const defaultIgnores = [\n    \"node_modules\",\n    \".git\",\n    \"dist\",\n    \"build\",\n    \".next\",\n    \".nuxt\",\n    \"coverage\",\n    \"__pycache__\",\n    \"target\",\n    \"vendor\",\n    \".opencode\",\n    \".codebase-index\",\n    \".*\",\n    \"**/.*\",\n    \"**/.*/**\",\n    \"**/*build*/**\",\n  ];\n\n  ig.add(defaultIgnores);\n\n  const gitignorePath = path.join(projectRoot, \".gitignore\");\n  if (existsSync(gitignorePath)) {\n    const gitignoreContent = readFileSync(gitignorePath, \"utf-8\");\n    ig.add(gitignoreContent);\n  }\n\n  return ig;\n}\n\nexport function shouldIncludeFile(\n  filePath: string,\n  projectRoot: string,\n  includePatterns: string[],\n  excludePatterns: string[],\n  ignoreFilter: Ignore\n): boolean {\n  const relativePath = path.relative(projectRoot, filePath);\n\n  if (hasFilteredPathSegment(relativePath, path.sep)) {\n    return false;\n  }\n\n  if (ignoreFilter.ignores(relativePath)) {\n    return false;\n  }\n\n  for (const pattern of excludePatterns) {\n    if (matchGlob(relativePath, pattern)) {\n      return false;\n    }\n  }\n\n  for (const pattern of includePatterns) {\n    if (matchGlob(relativePath, pattern)) {\n      return true;\n    }\n  }\n\n  return false;\n}\n\nfunction matchGlob(filePath: string, pattern: string): boolean {\n  if (pattern.startsWith(\"**/\")) {\n    const withoutPrefix = pattern.slice(3);\n    if (withoutPrefix && matchGlob(filePath, withoutPrefix)) {\n      return true;\n    }\n  }\n\n  const escapedPattern = pattern.replace(/[.+^$()|[\\]\\\\]/g, \"\\\\$&\");\n\n  let regexPattern = escapedPattern\n    .replace(/\\*\\*/g, \"<<<DOUBLESTAR>>>\")\n    .replace(/\\*/g, \"[^/]*\")\n    .replace(/<<<DOUBLESTAR>>>/g, \".*\")\n    .replace(/\\?/g, \".\")\n    .replace(/\\{([^}]+)\\}/g, (_, p1) => `(${p1.split(\",\").join(\"|\")})`);\n\n  // **/*.js → matches both root \"file.js\" and nested \"dir/file.js\"\n  if (regexPattern.startsWith(\".*/\")) {\n    regexPattern = `(.*\\\\/)?${regexPattern.slice(3)}`;\n  }\n\n  const regex = new RegExp(`^${regexPattern}$`);\n  return regex.test(filePath);\n}\n\nexport interface WalkOptions {\n  maxDepth: number;\n  maxFilesPerDirectory: number;\n}\n\nexport async function* walkDirectory(\n  dir: string,\n  projectRoot: string,\n  includePatterns: string[],\n  excludePatterns: string[],\n  ignoreFilter: Ignore,\n  maxFileSize: number,\n  skipped: SkippedFile[],\n  options: WalkOptions,\n  currentDepth: number = 0\n): AsyncGenerator<{ path: string; size: number }> {\n  const entries = await fsPromises.readdir(dir, { withFileTypes: true });\n\n  const filesInDir: Array<{ path: string; size: number }> = [];\n  const subdirs: Array<{ fullPath: string; relativePath: string }> = [];\n\n  for (const entry of entries) {\n    const fullPath = path.join(dir, entry.name);\n    const relativePath = path.relative(projectRoot, fullPath);\n\n    if (isHiddenPathSegment(entry.name)) {\n      if (entry.isDirectory()) {\n        skipped.push({ path: relativePath, reason: \"excluded\" });\n      }\n      continue;\n    }\n\n    if (entry.isDirectory() && isBuildPathSegment(entry.name)) {\n      skipped.push({ path: relativePath, reason: \"excluded\" });\n      continue;\n    }\n\n    if (ignoreFilter.ignores(relativePath)) {\n      if (entry.isFile()) {\n        skipped.push({ path: relativePath, reason: \"gitignore\" });\n      }\n      continue;\n    }\n\n    if (entry.isDirectory()) {\n      subdirs.push({ fullPath, relativePath });\n    } else if (entry.isFile()) {\n      const stat = await fsPromises.stat(fullPath);\n\n      if (stat.size > maxFileSize) {\n        skipped.push({ path: relativePath, reason: \"too_large\" });\n        continue;\n      }\n\n      for (const pattern of excludePatterns) {\n        if (matchGlob(relativePath, pattern)) {\n          skipped.push({ path: relativePath, reason: \"excluded\" });\n          continue;\n        }\n      }\n\n      let matched = false;\n      for (const pattern of includePatterns) {\n        if (matchGlob(relativePath, pattern)) {\n          matched = true;\n          break;\n        }\n      }\n\n      if (matched) {\n        filesInDir.push({ path: fullPath, size: stat.size });\n      }\n    }\n  }\n\n  filesInDir.sort((a, b) => a.size - b.size);\n  const limitedFiles = filesInDir.slice(0, options.maxFilesPerDirectory);\n  for (const f of limitedFiles) {\n    yield f;\n  }\n  for (let i = options.maxFilesPerDirectory; i < filesInDir.length; i++) {\n    skipped.push({ path: path.relative(projectRoot, filesInDir[i].path), reason: \"excluded\" });\n  }\n\n  const canRecurse = options.maxDepth === -1 || currentDepth < options.maxDepth;\n  if (canRecurse) {\n    for (const sub of subdirs) {\n      yield* walkDirectory(\n        sub.fullPath,\n        projectRoot,\n        includePatterns,\n        excludePatterns,\n        ignoreFilter,\n        maxFileSize,\n        skipped,\n        options,\n        currentDepth + 1\n      );\n    }\n  }\n}\n\nexport async function collectFiles(\n  projectRoot: string,\n  includePatterns: string[],\n  excludePatterns: string[],\n  maxFileSize: number,\n  additionalRoots?: string[],\n  walkOptions?: WalkOptions\n): Promise<CollectFilesResult> {\n  const opts: WalkOptions = walkOptions ?? { maxDepth: 5, maxFilesPerDirectory: 100 };\n  const ignoreFilter = createIgnoreFilter(projectRoot);\n  const files: Array<{ path: string; size: number }> = [];\n  const skipped: SkippedFile[] = [];\n\n  for await (const file of walkDirectory(\n    projectRoot,\n    projectRoot,\n    includePatterns,\n    excludePatterns,\n    ignoreFilter,\n    maxFileSize,\n    skipped,\n    opts,\n    0\n  )) {\n    files.push(file);\n  }\n\n  if (additionalRoots && additionalRoots.length > 0) {\n    const normalizedRoots = new Set<string>();\n    for (const kbRoot of additionalRoots) {\n      const resolved = path.normalize(\n        path.isAbsolute(kbRoot) ? kbRoot : path.resolve(projectRoot, kbRoot)\n      );\n      normalizedRoots.add(resolved);\n    }\n\n    for (const resolvedKbRoot of normalizedRoots) {\n      try {\n        const stat = await fsPromises.stat(resolvedKbRoot);\n        if (!stat.isDirectory()) {\n          skipped.push({ path: resolvedKbRoot, reason: \"excluded\" });\n          continue;\n        }\n        const kbIgnoreFilter = createIgnoreFilter(resolvedKbRoot);\n        for await (const file of walkDirectory(\n          resolvedKbRoot,\n          resolvedKbRoot,\n          includePatterns,\n          excludePatterns,\n          kbIgnoreFilter,\n          maxFileSize,\n          skipped,\n          opts,\n          0\n        )) {\n          files.push(file);\n        }\n      } catch {\n        skipped.push({ path: resolvedKbRoot, reason: \"excluded\" });\n      }\n    }\n  }\n\n  return { files, skipped };\n}\n","import type { DebugConfig, LogLevel } from \"../config/schema.js\";\n\nconst LOG_LEVEL_PRIORITY: Record<LogLevel, number> = {\n  error: 0,\n  warn: 1,\n  info: 2,\n  debug: 3,\n};\n\nexport interface Metrics {\n  indexingStartTime?: number;\n  indexingEndTime?: number;\n  filesScanned: number;\n  filesParsed: number;\n  parseMs: number;\n  chunksProcessed: number;\n  chunksEmbedded: number;\n  chunksFromCache: number;\n  chunksRemoved: number;\n  embeddingApiCalls: number;\n  embeddingTokensUsed: number;\n  embeddingErrors: number;\n  \n  searchCount: number;\n  searchTotalMs: number;\n  searchAvgMs: number;\n  searchLastMs: number;\n  embeddingCallMs: number;\n  vectorSearchMs: number;\n  keywordSearchMs: number;\n  fusionMs: number;\n  \n  cacheHits: number;\n  cacheMisses: number;\n  \n  queryCacheHits: number;\n  queryCacheSimilarHits: number;\n  queryCacheMisses: number;\n  \n  gcRuns: number;\n  gcOrphansRemoved: number;\n  gcChunksRemoved: number;\n  gcEmbeddingsRemoved: number;\n}\n\nexport interface LogEntry {\n  timestamp: string;\n  level: LogLevel;\n  category: string;\n  message: string;\n  data?: Record<string, unknown>;\n}\n\nfunction createEmptyMetrics(): Metrics {\n  return {\n    filesScanned: 0,\n    filesParsed: 0,\n    parseMs: 0,\n    chunksProcessed: 0,\n    chunksEmbedded: 0,\n    chunksFromCache: 0,\n    chunksRemoved: 0,\n    embeddingApiCalls: 0,\n    embeddingTokensUsed: 0,\n    embeddingErrors: 0,\n    searchCount: 0,\n    searchTotalMs: 0,\n    searchAvgMs: 0,\n    searchLastMs: 0,\n    embeddingCallMs: 0,\n    vectorSearchMs: 0,\n    keywordSearchMs: 0,\n    fusionMs: 0,\n    cacheHits: 0,\n    cacheMisses: 0,\n    queryCacheHits: 0,\n    queryCacheSimilarHits: 0,\n    queryCacheMisses: 0,\n    gcRuns: 0,\n    gcOrphansRemoved: 0,\n    gcChunksRemoved: 0,\n    gcEmbeddingsRemoved: 0,\n  };\n}\n\nexport class Logger {\n  private config: DebugConfig;\n  private metrics: Metrics;\n  private logs: LogEntry[] = [];\n  private maxLogs = 1000;\n\n  constructor(config: DebugConfig) {\n    this.config = config;\n    this.metrics = createEmptyMetrics();\n  }\n\n  private shouldLog(level: LogLevel): boolean {\n    if (!this.config.enabled) return false;\n    return LOG_LEVEL_PRIORITY[level] <= LOG_LEVEL_PRIORITY[this.config.logLevel];\n  }\n\n  private log(level: LogLevel, category: string, message: string, data?: Record<string, unknown>): void {\n    if (!this.shouldLog(level)) return;\n\n    const entry: LogEntry = {\n      timestamp: new Date().toISOString(),\n      level,\n      category,\n      message,\n      data,\n    };\n\n    this.logs.push(entry);\n    if (this.logs.length > this.maxLogs) {\n      this.logs.shift();\n    }\n  }\n\n  private withMetrics(fn: () => void): void {\n    if (!this.config.metrics) return;\n    fn();\n  }\n\n  search(level: LogLevel, message: string, data?: Record<string, unknown>): void {\n    if (this.config.logSearch) {\n      this.log(level, \"search\", message, data);\n    }\n  }\n\n  embedding(level: LogLevel, message: string, data?: Record<string, unknown>): void {\n    if (this.config.logEmbedding) {\n      this.log(level, \"embedding\", message, data);\n    }\n  }\n\n  cache(level: LogLevel, message: string, data?: Record<string, unknown>): void {\n    if (this.config.logCache) {\n      this.log(level, \"cache\", message, data);\n    }\n  }\n\n  gc(level: LogLevel, message: string, data?: Record<string, unknown>): void {\n    if (this.config.logGc) {\n      this.log(level, \"gc\", message, data);\n    }\n  }\n\n  branch(level: LogLevel, message: string, data?: Record<string, unknown>): void {\n    if (this.config.logBranch) {\n      this.log(level, \"branch\", message, data);\n    }\n  }\n\n  info(message: string, data?: Record<string, unknown>): void {\n    this.log(\"info\", \"general\", message, data);\n  }\n\n  warn(message: string, data?: Record<string, unknown>): void {\n    this.log(\"warn\", \"general\", message, data);\n  }\n\n  error(message: string, data?: Record<string, unknown>): void {\n    this.log(\"error\", \"general\", message, data);\n  }\n\n  debug(message: string, data?: Record<string, unknown>): void {\n    this.log(\"debug\", \"general\", message, data);\n  }\n\n  recordIndexingStart(): void {\n    this.withMetrics(() => {\n      this.metrics.indexingStartTime = Date.now();\n    });\n  }\n\n  recordIndexingEnd(): void {\n    this.withMetrics(() => {\n      this.metrics.indexingEndTime = Date.now();\n    });\n  }\n\n  recordFilesScanned(count: number): void {\n    this.withMetrics(() => {\n      this.metrics.filesScanned = count;\n    });\n  }\n\n  recordFilesParsed(count: number): void {\n    this.withMetrics(() => {\n      this.metrics.filesParsed = count;\n    });\n  }\n\n  recordParseDuration(durationMs: number): void {\n    this.withMetrics(() => {\n      this.metrics.parseMs = durationMs;\n    });\n  }\n\n  recordChunksProcessed(count: number): void {\n    this.withMetrics(() => {\n      this.metrics.chunksProcessed += count;\n    });\n  }\n\n  recordChunksEmbedded(count: number): void {\n    this.withMetrics(() => {\n      this.metrics.chunksEmbedded += count;\n    });\n  }\n\n  recordChunksFromCache(count: number): void {\n    this.withMetrics(() => {\n      this.metrics.chunksFromCache += count;\n    });\n  }\n\n  recordChunksRemoved(count: number): void {\n    this.withMetrics(() => {\n      this.metrics.chunksRemoved += count;\n    });\n  }\n\n  recordEmbeddingApiCall(tokens: number): void {\n    this.withMetrics(() => {\n      this.metrics.embeddingApiCalls++;\n      this.metrics.embeddingTokensUsed += tokens;\n    });\n  }\n\n  recordEmbeddingError(): void {\n    this.withMetrics(() => {\n      this.metrics.embeddingErrors++;\n    });\n  }\n\n  recordSearch(durationMs: number, breakdown?: { embeddingMs: number; vectorMs: number; keywordMs: number; fusionMs: number }): void {\n    this.withMetrics(() => {\n      this.metrics.searchCount++;\n      this.metrics.searchTotalMs += durationMs;\n      this.metrics.searchLastMs = durationMs;\n      this.metrics.searchAvgMs = this.metrics.searchTotalMs / this.metrics.searchCount;\n\n      if (breakdown) {\n        this.metrics.embeddingCallMs = breakdown.embeddingMs;\n        this.metrics.vectorSearchMs = breakdown.vectorMs;\n        this.metrics.keywordSearchMs = breakdown.keywordMs;\n        this.metrics.fusionMs = breakdown.fusionMs;\n      }\n    });\n  }\n\n  recordCacheHit(): void {\n    this.withMetrics(() => {\n      this.metrics.cacheHits++;\n    });\n  }\n\n  recordCacheMiss(): void {\n    this.withMetrics(() => {\n      this.metrics.cacheMisses++;\n    });\n  }\n\n  recordQueryCacheHit(): void {\n    this.withMetrics(() => {\n      this.metrics.queryCacheHits++;\n    });\n  }\n\n  recordQueryCacheSimilarHit(): void {\n    this.withMetrics(() => {\n      this.metrics.queryCacheSimilarHits++;\n    });\n  }\n\n  recordQueryCacheMiss(): void {\n    this.withMetrics(() => {\n      this.metrics.queryCacheMisses++;\n    });\n  }\n\n  recordGc(orphans: number, chunks: number, embeddings: number): void {\n    this.withMetrics(() => {\n      this.metrics.gcRuns++;\n      this.metrics.gcOrphansRemoved += orphans;\n      this.metrics.gcChunksRemoved += chunks;\n      this.metrics.gcEmbeddingsRemoved += embeddings;\n    });\n  }\n\n  getMetrics(): Metrics {\n    return { ...this.metrics };\n  }\n\n  getLogs(limit?: number): LogEntry[] {\n    const logs = [...this.logs];\n    if (limit) {\n      return logs.slice(-limit);\n    }\n    return logs;\n  }\n\n  getLogsByCategory(category: string, limit?: number): LogEntry[] {\n    const filtered = this.logs.filter(l => l.category === category);\n    if (limit) {\n      return filtered.slice(-limit);\n    }\n    return filtered;\n  }\n\n  getLogsByLevel(level: LogLevel, limit?: number): LogEntry[] {\n    const filtered = this.logs.filter(l => l.level === level);\n    if (limit) {\n      return filtered.slice(-limit);\n    }\n    return filtered;\n  }\n\n  resetMetrics(): void {\n    this.metrics = createEmptyMetrics();\n  }\n\n  clearLogs(): void {\n    this.logs = [];\n  }\n\n  formatMetrics(): string {\n    const m = this.metrics;\n    const lines: string[] = [];\n    \n    if (m.indexingStartTime && m.indexingEndTime) {\n      const duration = m.indexingEndTime - m.indexingStartTime;\n      lines.push(`Indexing duration: ${(duration / 1000).toFixed(2)}s`);\n    }\n    \n    lines.push(\"\");\n    lines.push(\"Indexing:\");\n    lines.push(`  Files scanned: ${m.filesScanned}`);\n    lines.push(`  Files parsed: ${m.filesParsed}`);\n    lines.push(`  Chunks processed: ${m.chunksProcessed}`);\n    lines.push(`  Chunks embedded: ${m.chunksEmbedded}`);\n    lines.push(`  Chunks from cache: ${m.chunksFromCache}`);\n    lines.push(`  Chunks removed: ${m.chunksRemoved}`);\n    \n    lines.push(\"\");\n    lines.push(\"Embedding API:\");\n    lines.push(`  API calls: ${m.embeddingApiCalls}`);\n    lines.push(`  Tokens used: ${m.embeddingTokensUsed.toLocaleString()}`);\n    lines.push(`  Errors: ${m.embeddingErrors}`);\n    \n    if (m.searchCount > 0) {\n      lines.push(\"\");\n      lines.push(\"Search:\");\n      lines.push(`  Total searches: ${m.searchCount}`);\n      lines.push(`  Average time: ${m.searchAvgMs.toFixed(2)}ms`);\n      lines.push(`  Last search: ${m.searchLastMs.toFixed(2)}ms`);\n      if (m.embeddingCallMs > 0) {\n        lines.push(`    - Embedding: ${m.embeddingCallMs.toFixed(2)}ms`);\n        lines.push(`    - Vector search: ${m.vectorSearchMs.toFixed(2)}ms`);\n        lines.push(`    - Keyword search: ${m.keywordSearchMs.toFixed(2)}ms`);\n        lines.push(`    - Fusion: ${m.fusionMs.toFixed(2)}ms`);\n      }\n    }\n    \n    const totalCacheOps = m.cacheHits + m.cacheMisses;\n    if (totalCacheOps > 0) {\n      lines.push(\"\");\n      lines.push(\"Cache:\");\n      lines.push(`  Hits: ${m.cacheHits}`);\n      lines.push(`  Misses: ${m.cacheMisses}`);\n      lines.push(`  Hit rate: ${((m.cacheHits / totalCacheOps) * 100).toFixed(1)}%`);\n    }\n    \n    if (m.gcRuns > 0) {\n      lines.push(\"\");\n      lines.push(\"Garbage Collection:\");\n      lines.push(`  GC runs: ${m.gcRuns}`);\n      lines.push(`  Orphans removed: ${m.gcOrphansRemoved}`);\n      lines.push(`  Chunks removed: ${m.gcChunksRemoved}`);\n      lines.push(`  Embeddings removed: ${m.gcEmbeddingsRemoved}`);\n    }\n    \n    return lines.join(\"\\n\");\n  }\n\n  formatRecentLogs(limit = 20): string {\n    const logs = this.getLogs(limit);\n    if (logs.length === 0) {\n      return \"No logs recorded.\";\n    }\n    \n    return logs.map(l => {\n      const dataStr = l.data ? ` ${JSON.stringify(l.data)}` : \"\";\n      return `[${l.timestamp}] [${l.level.toUpperCase()}] [${l.category}] ${l.message}${dataStr}`;\n    }).join(\"\\n\");\n  }\n\n  isEnabled(): boolean {\n    return this.config.enabled;\n  }\n\n  isMetricsEnabled(): boolean {\n    return this.config.enabled && this.config.metrics;\n  }\n}\n\nlet globalLogger: Logger | null = null;\n\nexport function initializeLogger(config: DebugConfig): Logger {\n  globalLogger = new Logger(config);\n  return globalLogger;\n}\n\nexport function getLogger(): Logger | null {\n  return globalLogger;\n}\n","import * as path from \"path\";\nimport * as os from \"os\";\nimport * as module from \"module\";\nimport { fileURLToPath } from \"url\";\n\nfunction getNativeBinding() {\n  const platform = os.platform();\n  const arch = os.arch();\n\n  let bindingName: string;\n  \n  if (platform === \"darwin\" && arch === \"arm64\") {\n    bindingName = \"codebase-index-native.darwin-arm64.node\";\n  } else if (platform === \"darwin\" && arch === \"x64\") {\n    bindingName = \"codebase-index-native.darwin-x64.node\";\n  } else if (platform === \"linux\" && arch === \"x64\") {\n    bindingName = \"codebase-index-native.linux-x64-gnu.node\";\n  } else if (platform === \"linux\" && arch === \"arm64\") {\n    bindingName = \"codebase-index-native.linux-arm64-gnu.node\";\n  } else if (platform === \"win32\" && arch === \"x64\") {\n    bindingName = \"codebase-index-native.win32-x64-msvc.node\";\n  } else {\n    throw new Error(`Unsupported platform: ${platform}-${arch}`);\n  }\n\n  // Determine the current directory - handle ESM, CJS, and bundled contexts\n  let currentDir: string;\n  let requireTarget: string;\n  \n  // Check for ESM context with valid import.meta.url\n  if (typeof import.meta !== 'undefined' && import.meta.url) {\n    currentDir = path.dirname(fileURLToPath(import.meta.url));\n    requireTarget = import.meta.url;\n  } \n  // Fallback to __dirname for CJS/bundled contexts\n  else if (typeof __dirname !== 'undefined') {\n    currentDir = __dirname;\n    requireTarget = __filename;\n  }\n  // Last resort: use process.cwd() - shouldn't normally hit this\n  else {\n    currentDir = process.cwd();\n    requireTarget = path.join(currentDir, \"index.js\");\n  }\n  \n  // The native module is in the 'native' folder at package root\n  // From dist/index.js, we go up one level to package root, then into native/\n  // From src/native/index.ts (dev/test), we go up two levels to package root\n  const normalizedDir = currentDir.replace(/\\\\/g, '/');\n  const isDevMode = normalizedDir.includes('/src/native') || currentDir.includes(path.join('src', 'native'));\n  const packageRoot = isDevMode\n    ? path.resolve(currentDir, '../..')\n    : path.resolve(currentDir, '..');\n  const nativePath = path.join(packageRoot, 'native', bindingName);\n  \n  // Load the native module - use standard require for .node files\n  const require = module.createRequire(requireTarget);\n  return require(nativePath);\n}\n\nfunction createMockNativeBinding() {\n  const error = new Error(\"Native module not available. Please rebuild with 'npm run build:native'.\");\n  \n  return {\n    parseFile: () => { throw error; },\n    parseFiles: () => { throw error; },\n    hashContent: () => { throw error; },\n    hashFile: () => { throw error; },\n    extractCalls: () => { throw error; },\n    VectorStore: class {\n      constructor() { throw error; }\n    },\n    InvertedIndex: class {\n      constructor() { throw error; }\n      serialize() { throw error; }\n      deserialize() { throw error; }\n    },\n    Database: class {\n      constructor() { throw error; }\n      close() { throw error; }\n      getTransitiveReachability() { throw error; }\n      detectCommunities() { throw error; }\n      computeCentrality() { throw error; }\n    },\n}\n}\n\nlet native: any;\ntry {\n  native = getNativeBinding();\n} catch (e) {\n  console.error(\"[codebase-index] Failed to load native module:\", e);\n  native = createMockNativeBinding();\n}\n\nexport interface FileInput {\n  path: string;\n  content: string;\n}\n\nexport interface CodeChunk {\n  content: string;\n  startLine: number;\n  endLine: number;\n  chunkType: ChunkType;\n  name?: string;\n  language: string;\n}\n\nexport type ChunkType =\n  | \"function\"\n  | \"class\"\n  | \"method\"\n  | \"interface\"\n  | \"type\"\n  | \"enum\"\n  | \"struct\"\n  | \"impl\"\n  | \"trait\"\n  | \"module\"\n  | \"import\"\n  | \"export\"\n  | \"comment\"\n  | \"other\";\n\nexport interface ParsedFile {\n  path: string;\n  chunks: CodeChunk[];\n  hash: string;\n}\n\n\nexport type Confidence = \"Direct\" | \"Inferred\";\n\nexport type CallType = \"Call\" | \"MethodCall\" | \"Constructor\" | \"Import\" | \"Inherits\" | \"Implements\";\n\nexport interface CallSiteData {\n  calleeName: string;\n  line: number;\n  column: number;\n  callType: CallType;\n  confidence: Confidence;\n}\n\nexport interface SymbolData {\n  id: string;\n  filePath: string;\n  name: string;\n  kind: string;\n  startLine: number;\n  startCol: number;\n  endLine: number;\n  endCol: number;\n  language: string;\n}\n\nexport interface CallEdgeData {\n  id: string;\n  fromSymbolId: string;\n  fromSymbolName?: string;\n  fromSymbolFilePath?: string;\n  targetName: string;\n  toSymbolId?: string;\n  callType: string;\n  confidence: string;\n  line: number;\n  col: number;\n  isResolved: boolean;\n}\n\nexport interface PathHopData {\n  symbolId: string;\n  symbolName: string;\n  filePath: string;\n  line: number;\n  callType: string;\n}\n\nexport interface ReachabilityData {\n  symbolId: string;\n  symbolName: string;\n  filePath: string;\n  depth: number;\n}\n\nexport interface CommunityData {\n  symbolId: string;\n  symbolName: string;\n  filePath: string;\n  communityId: number;\n  communityLabel: string;\n}\n\nexport interface CentralityData {\n  symbolId: string;\n  symbolName: string;\n  filePath: string;\n  callerCount: number;\n  calleeCount: number;\n  totalConnections: number;\n}\n\nexport interface SearchResult {\n  id: string;\n  score: number;\n  metadata: ChunkMetadata;\n}\n\nexport interface ChunkMetadata {\n  filePath: string;\n  startLine: number;\n  endLine: number;\n  chunkType: ChunkType;\n  name?: string;\n  language: string;\n  hash: string;\n}\n\nexport function parseFile(filePath: string, content: string): CodeChunk[] {\n  const result = native.parseFile(filePath, content);\n  return result.map(mapChunk);\n}\n\nexport function parseFileAsText(filePath: string, content: string): CodeChunk[] {\n  const result = native.parseFileAsText(filePath, content);\n  return result.map(mapChunk);\n}\n\nexport function parseFiles(files: FileInput[]): ParsedFile[] {\n  const result = native.parseFiles(files);\n  return result.map((f: any) => ({\n    path: f.path,\n    chunks: f.chunks.map(mapChunk),\n    hash: f.hash,\n  }));\n}\n\nfunction mapChunk(c: any): CodeChunk {\n  return {\n    content: c.content,\n    startLine: c.startLine ?? c.start_line,\n    endLine: c.endLine ?? c.end_line,\n    chunkType: (c.chunkType ?? c.chunk_type) as ChunkType,\n    name: c.name ?? undefined,\n    language: c.language,\n  };\n}\n\nexport function hashContent(content: string): string {\n  return native.hashContent(content);\n}\n\nexport function hashFile(filePath: string): string {\n  return native.hashFile(filePath);\n}\n\n\nexport function extractCalls(content: string, language: string): CallSiteData[] {\n  return native.extractCalls(content, language);\n}\n\nexport class VectorStore {\n  private inner: any;\n  private dimensions: number;\n\n  constructor(indexPath: string, dimensions: number) {\n    this.inner = new native.VectorStore(indexPath, dimensions);\n    this.dimensions = dimensions;\n  }\n\n  add(id: string, vector: number[], metadata: ChunkMetadata): void {\n    if (vector.length !== this.dimensions) {\n      throw new Error(\n        `Vector dimension mismatch: expected ${this.dimensions}, got ${vector.length}`\n      );\n    }\n    this.inner.add(id, vector, JSON.stringify(metadata));\n  }\n\n  addBatch(\n    items: Array<{ id: string; vector: number[]; metadata: ChunkMetadata }>\n  ): void {\n    const ids = items.map((i) => i.id);\n    const vectors = items.map((i) => {\n      if (i.vector.length !== this.dimensions) {\n        throw new Error(\n          `Vector dimension mismatch for ${i.id}: expected ${this.dimensions}, got ${i.vector.length}`\n        );\n      }\n      return i.vector;\n    });\n    const metadata = items.map((i) => JSON.stringify(i.metadata));\n    this.inner.addBatch(ids, vectors, metadata);\n  }\n\n  search(queryVector: number[], limit: number = 10): SearchResult[] {\n    if (queryVector.length !== this.dimensions) {\n      throw new Error(\n        `Query vector dimension mismatch: expected ${this.dimensions}, got ${queryVector.length}`\n      );\n    }\n    const results = this.inner.search(queryVector, limit);\n    return results.map((r: any) => ({\n      id: r.id,\n      score: r.score,\n      metadata: JSON.parse(r.metadata) as ChunkMetadata,\n    }));\n  }\n\n  remove(id: string): boolean {\n    return this.inner.remove(id);\n  }\n\n  save(): void {\n    this.inner.save();\n  }\n\n  load(): void {\n    this.inner.load();\n  }\n\n  count(): number {\n    return this.inner.count();\n  }\n\n  clear(): void {\n    this.inner.clear();\n  }\n\n  getDimensions(): number {\n    return this.dimensions;\n  }\n\n  getAllKeys(): string[] {\n    return this.inner.getAllKeys();\n  }\n\n  getAllMetadata(): Array<{ key: string; metadata: ChunkMetadata }> {\n    const results = this.inner.getAllMetadata();\n    return results.map((r: { key: string; metadata: string }) => ({\n      key: r.key,\n      metadata: JSON.parse(r.metadata) as ChunkMetadata,\n    }));\n  }\n\n  getMetadata(id: string): ChunkMetadata | undefined {\n    const result = this.inner.getMetadata(id);\n    if (result === null || result === undefined) {\n      return undefined;\n    }\n    return JSON.parse(result) as ChunkMetadata;\n  }\n\n  getMetadataBatch(ids: string[]): Map<string, ChunkMetadata> {\n    const results = this.inner.getMetadataBatch(ids);\n    const map = new Map<string, ChunkMetadata>();\n    for (const { key, metadata } of results) {\n      map.set(key, JSON.parse(metadata) as ChunkMetadata);\n    }\n    return map;\n  }\n}\n\n// Token estimation: ~4 chars per token for code (conservative)\nconst CHARS_PER_TOKEN = 4;\nconst MAX_BATCH_TOKENS = 7500; // Leave buffer under 8192 API limit\nconst MAX_SINGLE_CHUNK_TOKENS = 2000; // Default truncation cap for individual chunks\n\nexport function estimateTokens(text: string): number {\n  return Math.ceil(text.length / CHARS_PER_TOKEN);\n}\n\nfunction getEmbeddingHeaderParts(chunk: CodeChunk, filePath: string): string[] {\n  const parts: string[] = [];\n\n  const fileName = filePath.split(\"/\").pop() || filePath;\n  const dirPath = filePath.split(\"/\").slice(-3, -1).join(\"/\");\n\n  const langDescriptors: Record<string, string> = {\n    typescript: \"TypeScript\",\n    javascript: \"JavaScript\",\n    python: \"Python\",\n    rust: \"Rust\",\n    go: \"Go\",\n    java: \"Java\",\n  };\n\n  const typeDescriptors: Record<string, string> = {\n    function_declaration: \"function\",\n    function: \"function\",\n    arrow_function: \"arrow function\",\n    method_definition: \"method\",\n    class_declaration: \"class\",\n    interface_declaration: \"interface\",\n    type_alias_declaration: \"type alias\",\n    enum_declaration: \"enum\",\n    export_statement: \"export\",\n    lexical_declaration: \"variable declaration\",\n    function_definition: \"function\",\n    class_definition: \"class\",\n    function_item: \"function\",\n    impl_item: \"implementation\",\n    struct_item: \"struct\",\n    enum_item: \"enum\",\n    trait_item: \"trait\",\n  };\n\n  const lang = langDescriptors[chunk.language] || chunk.language;\n  const typeDesc = typeDescriptors[chunk.chunkType] || chunk.chunkType;\n\n  if (chunk.name) {\n    parts.push(`${lang} ${typeDesc} \"${chunk.name}\"`);\n  } else {\n    parts.push(`${lang} ${typeDesc}`);\n  }\n\n  if (dirPath) {\n    parts.push(`in ${dirPath}/${fileName}`);\n  } else {\n    parts.push(`in ${fileName}`);\n  }\n\n  const semanticHints = extractSemanticHints(chunk.name || \"\", chunk.content);\n  if (semanticHints.length > 0) {\n    parts.push(`Purpose: ${semanticHints.join(\", \")}`);\n  }\n\n  return parts;\n}\n\nfunction buildEmbeddingText(headerParts: string[], content: string, partIndex?: number, partCount?: number): string {\n  const parts = [...headerParts];\n  if (partCount && partCount > 1 && partIndex) {\n    parts.push(`Part ${partIndex}/${partCount}`);\n  }\n  parts.push(\"\");\n  parts.push(content);\n  return parts.join(\"\\n\");\n}\n\nfunction splitOversizedContent(content: string, maxContentChars: number): string[] {\n  if (content.length <= maxContentChars) {\n    return [content];\n  }\n\n  const overlapChars = Math.max(CHARS_PER_TOKEN * 32, Math.min(Math.floor(maxContentChars * 0.15), CHARS_PER_TOKEN * 128));\n  const stepChars = Math.max(1, maxContentChars - overlapChars);\n  const segments: string[] = [];\n\n  for (let start = 0; start < content.length; start += stepChars) {\n    const end = Math.min(content.length, start + maxContentChars);\n    segments.push(content.slice(start, end));\n    if (end >= content.length) {\n      break;\n    }\n  }\n\n  return segments;\n}\n\nexport function createEmbeddingTexts(chunk: CodeChunk, filePath: string, maxChunkTokens = MAX_SINGLE_CHUNK_TOKENS): string[] {\n  const headerParts = getEmbeddingHeaderParts(chunk, filePath);\n  const headerLength = buildEmbeddingText(headerParts, \"\", 1, 9).length;\n  const maxContentChars = Math.max(1, (maxChunkTokens * CHARS_PER_TOKEN) - headerLength);\n  const segments = splitOversizedContent(chunk.content, maxContentChars);\n\n  if (segments.length === 1) {\n    return [buildEmbeddingText(headerParts, segments[0])];\n  }\n\n  return segments.map((segment, index) => buildEmbeddingText(headerParts, segment, index + 1, segments.length));\n}\n\nexport function createEmbeddingText(chunk: CodeChunk, filePath: string, maxChunkTokens = MAX_SINGLE_CHUNK_TOKENS): string {\n  const text = createEmbeddingTexts(chunk, filePath, maxChunkTokens)[0];\n  if (!text) {\n    return \"\";\n  }\n\n  const maxChars = maxChunkTokens * CHARS_PER_TOKEN;\n  if (text.length <= maxChars) {\n    return text;\n  }\n\n  return text.slice(0, Math.max(0, maxChars - 17)) + \"\\n... [truncated]\";\n}\n\nexport interface DynamicBatchOptions {\n  maxBatchTokens?: number;\n  maxBatchItems?: number;\n}\n\nexport function createDynamicBatches<T extends { text: string; tokenCount?: number }>(chunks: T[], options: DynamicBatchOptions = {}): T[][] {\n  const batches: T[][] = [];\n  let currentBatch: T[] = [];\n  let currentTokens = 0;\n  const maxBatchTokens = Math.max(1, options.maxBatchTokens ?? MAX_BATCH_TOKENS);\n  const maxBatchItems = Math.max(1, options.maxBatchItems ?? Number.MAX_SAFE_INTEGER);\n  \n  for (const chunk of chunks) {\n    const chunkTokens = chunk.tokenCount ?? estimateTokens(chunk.text);\n\n    if (\n      currentBatch.length > 0\n      && (currentTokens + chunkTokens > maxBatchTokens || currentBatch.length >= maxBatchItems)\n    ) {\n      batches.push(currentBatch);\n      currentBatch = [];\n      currentTokens = 0;\n    }\n    \n    currentBatch.push(chunk);\n    currentTokens += chunkTokens;\n  }\n  \n  if (currentBatch.length > 0) {\n    batches.push(currentBatch);\n  }\n  \n  return batches;\n}\n\nfunction extractSemanticHints(name: string, content: string): string[] {\n  const hints: string[] = [];\n  const combined = `${name} ${content}`.toLowerCase();\n  \n  const signature = extractFunctionSignature(content);\n  if (signature) {\n    hints.push(signature);\n  }\n  \n  const patterns: Array<[RegExp, string]> = [\n    [/auth|login|logout|signin|signout|credential/i, \"authentication\"],\n    [/password|hash|bcrypt|argon/i, \"password handling\"],\n    [/token|jwt|bearer|oauth/i, \"token management\"],\n    [/user|account|profile|member/i, \"user management\"],\n    [/permission|role|access|authorize/i, \"authorization\"],\n    [/validate|verify|check|assert/i, \"validation\"],\n    [/error|exception|throw|catch/i, \"error handling\"],\n    [/log|debug|trace|info|warn/i, \"logging\"],\n    [/cache|memoize|store/i, \"caching\"],\n    [/fetch|request|response|api|http/i, \"HTTP/API\"],\n    [/database|db|query|sql|mongo/i, \"database\"],\n    [/file|read|write|stream|path/i, \"file operations\"],\n    [/parse|serialize|json|xml/i, \"data parsing\"],\n    [/encrypt|decrypt|crypto|secret|cipher|cryptographic/i, \"encryption/cryptography\"],\n    [/test|spec|mock|stub|expect/i, \"testing\"],\n    [/config|setting|option|env/i, \"configuration\"],\n    [/route|endpoint|handler|controller|middleware/i, \"routing/middleware\"],\n    [/render|component|view|template/i, \"UI rendering\"],\n    [/state|redux|store|dispatch/i, \"state management\"],\n    [/hook|effect|memo|callback/i, \"React hooks\"],\n  ];\n  \n  for (const [pattern, hint] of patterns) {\n    if (pattern.test(combined) && !hints.includes(hint)) {\n      hints.push(hint);\n    }\n  }\n  \n  return hints.slice(0, 6);\n}\n\nfunction extractFunctionSignature(content: string): string | null {\n  const tsJsPatterns = [\n    /(?:export\\s+)?(?:async\\s+)?function\\s+(\\w+)\\s*(?:<[^>]+>)?\\s*\\(([^)]*)\\)\\s*(?::\\s*([^{]+))?/,\n    /(?:export\\s+)?const\\s+(\\w+)\\s*(?::\\s*[^=]+)?\\s*=\\s*(?:async\\s+)?\\(([^)]*)\\)\\s*(?::\\s*([^=>{]+))?\\s*=>/,\n    /(?:export\\s+)?const\\s+(\\w+)\\s*(?::\\s*[^=]+)?\\s*=\\s*(?:async\\s+)?function\\s*\\(([^)]*)\\)/,\n  ];\n  \n  const pyPatterns = [\n    /def\\s+(\\w+)\\s*\\(([^)]*)\\)\\s*(?:->\\s*([^:]+))?:/,\n    /async\\s+def\\s+(\\w+)\\s*\\(([^)]*)\\)\\s*(?:->\\s*([^:]+))?:/,\n  ];\n  \n  const goPatterns = [\n    /func\\s+(?:\\([^)]+\\)\\s+)?(\\w+)\\s*\\(([^)]*)\\)\\s*(?:\\(([^)]+)\\)|([^{\\n]+))?/,\n  ];\n  \n  const rustPatterns = [\n    /(?:pub\\s+)?(?:async\\s+)?fn\\s+(\\w+)\\s*(?:<[^>]+>)?\\s*\\(([^)]*)\\)\\s*(?:->\\s*([^{]+))?/,\n  ];\n  \n  for (const pattern of [...tsJsPatterns, ...pyPatterns, ...goPatterns, ...rustPatterns]) {\n    const match = content.match(pattern);\n    if (match) {\n      const funcName = match[1];\n      const params = match[2]?.trim() || \"\";\n      const returnType = (match[3] || match[4])?.trim();\n      \n      const paramNames = extractParamNames(params);\n      \n      let sig = `${funcName}(${paramNames.join(\", \")})`;\n      if (returnType && returnType.length < 50) {\n        sig += ` -> ${returnType.replace(/\\s+/g, \" \").trim()}`;\n      }\n      \n      if (sig.length < 100) {\n        return sig;\n      }\n    }\n  }\n  \n  return null;\n}\n\nfunction extractParamNames(params: string): string[] {\n  if (!params.trim()) return [];\n  \n  const names: string[] = [];\n  const parts = params.split(\",\");\n  \n  for (const part of parts) {\n    const trimmed = part.trim();\n    if (!trimmed) continue;\n    \n    const tsMatch = trimmed.match(/^(\\w+)\\s*[?:]?/);\n    const pyMatch = trimmed.match(/^(\\w+)\\s*(?::|=)/);\n    const goMatch = trimmed.match(/^(\\w+)\\s+\\w/);\n    const rustMatch = trimmed.match(/^(\\w+)\\s*:/);\n    \n    const match = tsMatch || pyMatch || goMatch || rustMatch;\n    if (match && match[1] !== \"self\" && match[1] !== \"this\") {\n      names.push(match[1]);\n    }\n  }\n  \n  return names.slice(0, 5);\n}\n\nexport function generateChunkId(filePath: string, chunk: CodeChunk): string {\n  const hash = hashContent(`${filePath}:${chunk.startLine}:${chunk.endLine}:${chunk.content}`);\n  return `chunk_${hash.slice(0, 16)}`;\n}\n\nexport function generateChunkHash(chunk: CodeChunk): string {\n  return hashContent(chunk.content);\n}\n\nexport interface KeywordSearchResult {\n  chunkId: string;\n  score: number;\n}\n\nexport class InvertedIndex {\n  private inner: any;\n\n  constructor(indexPath: string) {\n    this.inner = new native.InvertedIndex(indexPath);\n  }\n\n  load(): void {\n    this.inner.load();\n  }\n\n  save(): void {\n    this.inner.save();\n  }\n\n  serialize(): string {\n    return this.inner.serialize();\n  }\n\n  deserialize(json: string): void {\n    this.inner.deserialize(json);\n  }\n\n  addChunk(chunkId: string, content: string): void {\n    this.inner.addChunk(chunkId, content);\n  }\n\n  removeChunk(chunkId: string): boolean {\n    return this.inner.removeChunk(chunkId);\n  }\n\n  search(query: string, limit?: number): Map<string, number> {\n    const results = this.inner.search(query, limit ?? 100);\n    const map = new Map<string, number>();\n    for (const r of results) {\n      map.set(r.chunkId, r.score);\n    }\n    return map;\n  }\n\n  hasChunk(chunkId: string): boolean {\n    return this.inner.hasChunk(chunkId);\n  }\n\n  clear(): void {\n    this.inner.clear();\n  }\n\n  getDocumentCount(): number {\n    return this.inner.documentCount();\n  }\n}\n\nexport interface ChunkData {\n  chunkId: string;\n  contentHash: string;\n  filePath: string;\n  startLine: number;\n  endLine: number;\n  nodeType?: string;\n  name?: string;\n  language: string;\n}\n\nexport interface BranchDelta {\n  added: string[];\n  removed: string[];\n}\n\nexport interface DatabaseStats {\n  embeddingCount: number;\n  chunkCount: number;\n  branchChunkCount: number;\n  branchCount: number;\n  symbolCount: number;\n  callEdgeCount: number;\n}\n\nexport class Database {\n  private inner: any;\n  private closed = false;\n\n  constructor(dbPath: string) {\n    this.inner = new native.Database(dbPath);\n  }\n\n  private throwIfClosed(): void {\n    if (this.closed) {\n      throw new Error(\"Database is closed\");\n    }\n  }\n\n  close(): void {\n    if (this.closed) {\n      return;\n    }\n\n    if (typeof this.inner.close === \"function\") {\n      this.inner.close();\n    }\n\n    this.closed = true;\n  }\n\n  embeddingExists(contentHash: string): boolean {\n    this.throwIfClosed();\n    return this.inner.embeddingExists(contentHash);\n  }\n\n  getEmbedding(contentHash: string): Buffer | null {\n    this.throwIfClosed();\n    return this.inner.getEmbedding(contentHash) ?? null;\n  }\n\n  upsertEmbedding(\n    contentHash: string,\n    embedding: Buffer,\n    chunkText: string,\n    model: string\n  ): void {\n    this.throwIfClosed();\n    this.inner.upsertEmbedding(contentHash, embedding, chunkText, model);\n  }\n\n  upsertEmbeddingsBatch(\n    items: Array<{\n      contentHash: string;\n      embedding: Buffer;\n      chunkText: string;\n      model: string;\n    }>\n  ): void {\n    this.throwIfClosed();\n    if (items.length === 0) return;\n    this.inner.upsertEmbeddingsBatch(items);\n  }\n\n  getMissingEmbeddings(contentHashes: string[]): string[] {\n    this.throwIfClosed();\n    return this.inner.getMissingEmbeddings(contentHashes);\n  }\n\n  upsertChunk(chunk: ChunkData): void {\n    this.throwIfClosed();\n    this.inner.upsertChunk(chunk);\n  }\n\n  upsertChunksBatch(chunks: ChunkData[]): void {\n    this.throwIfClosed();\n    if (chunks.length === 0) return;\n    this.inner.upsertChunksBatch(chunks);\n  }\n\n  getChunk(chunkId: string): ChunkData | null {\n    this.throwIfClosed();\n    return this.inner.getChunk(chunkId) ?? null;\n  }\n\n  getChunksByFile(filePath: string): ChunkData[] {\n    this.throwIfClosed();\n    return this.inner.getChunksByFile(filePath);\n  }\n\n  getChunksByName(name: string): ChunkData[] {\n    this.throwIfClosed();\n    return this.inner.getChunksByName(name);\n  }\n\n  getChunksByNameCi(name: string): ChunkData[] {\n    this.throwIfClosed();\n    return this.inner.getChunksByNameCi(name);\n  }\n\n  deleteChunksByFile(filePath: string): number {\n    this.throwIfClosed();\n    return this.inner.deleteChunksByFile(filePath);\n  }\n\n  deleteChunksByIds(chunkIds: string[]): number {\n    this.throwIfClosed();\n    if (chunkIds.length === 0) return 0;\n    return this.inner.deleteChunksByIds(chunkIds);\n  }\n\n  addChunksToBranch(branch: string, chunkIds: string[]): void {\n    this.throwIfClosed();\n    this.inner.addChunksToBranch(branch, chunkIds);\n  }\n\n  addChunksToBranchBatch(branch: string, chunkIds: string[]): void {\n    this.throwIfClosed();\n    if (chunkIds.length === 0) return;\n    this.inner.addChunksToBranchBatch(branch, chunkIds);\n  }\n\n  clearBranch(branch: string): number {\n    this.throwIfClosed();\n    return this.inner.clearBranch(branch);\n  }\n\n  deleteBranchChunksByChunkIds(chunkIds: string[]): number {\n    this.throwIfClosed();\n    if (chunkIds.length === 0) return 0;\n    return this.inner.deleteBranchChunksByChunkIds(chunkIds);\n  }\n\n  deleteBranchChunksForBranch(branch: string, chunkIds: string[]): number {\n    this.throwIfClosed();\n    if (chunkIds.length === 0) return 0;\n    return this.inner.deleteBranchChunksForBranch(branch, chunkIds);\n  }\n\n  getBranchChunkIds(branch: string): string[] {\n    this.throwIfClosed();\n    return this.inner.getBranchChunkIds(branch);\n  }\n\n  getBranchDelta(branch: string, baseBranch: string): BranchDelta {\n    this.throwIfClosed();\n    return this.inner.getBranchDelta(branch, baseBranch);\n  }\n\n  getReferencedChunkIds(chunkIds: string[]): string[] {\n    this.throwIfClosed();\n    if (chunkIds.length === 0) return [];\n    return this.inner.getReferencedChunkIds(chunkIds);\n  }\n\n  chunkExistsOnBranch(branch: string, chunkId: string): boolean {\n    this.throwIfClosed();\n    return this.inner.chunkExistsOnBranch(branch, chunkId);\n  }\n\n  getAllBranches(): string[] {\n    this.throwIfClosed();\n    return this.inner.getAllBranches();\n  }\n\n  getMetadata(key: string): string | null {\n    this.throwIfClosed();\n    return this.inner.getMetadata(key) ?? null;\n  }\n\n  setMetadata(key: string, value: string): void {\n    this.throwIfClosed();\n    this.inner.setMetadata(key, value);\n  }\n\n  deleteMetadata(key: string): boolean {\n    this.throwIfClosed();\n    return this.inner.deleteMetadata(key);\n  }\n\n  clearAllIndexedData(): void {\n    this.throwIfClosed();\n    this.inner.clearAllIndexedData();\n  }\n\n  clearCallEdgeTargetsForSymbols(symbolIds: string[]): number {\n    this.throwIfClosed();\n    if (symbolIds.length === 0) return 0;\n    return this.inner.clearCallEdgeTargetsForSymbols(symbolIds);\n  }\n\n  gcOrphanEmbeddings(): number {\n    this.throwIfClosed();\n    return this.inner.gcOrphanEmbeddings();\n  }\n\n  gcOrphanChunks(): number {\n    this.throwIfClosed();\n    return this.inner.gcOrphanChunks();\n  }\n\n  getStats(): DatabaseStats {\n    this.throwIfClosed();\n    return this.inner.getStats();\n  }\n\n\n\n  upsertSymbol(symbol: SymbolData): void {\n    this.throwIfClosed();\n    this.inner.upsertSymbol(symbol);\n  }\n\n  upsertSymbolsBatch(symbols: SymbolData[]): void {\n    this.throwIfClosed();\n    if (symbols.length === 0) return;\n    this.inner.upsertSymbolsBatch(symbols);\n  }\n\n  getSymbolsByFile(filePath: string): SymbolData[] {\n    this.throwIfClosed();\n    return this.inner.getSymbolsByFile(filePath);\n  }\n\n  getSymbolByName(name: string, filePath: string): SymbolData | null {\n    this.throwIfClosed();\n    return this.inner.getSymbolByName(name, filePath) ?? null;\n  }\n\n  getSymbolsByName(name: string): SymbolData[] {\n    this.throwIfClosed();\n    return this.inner.getSymbolsByName(name);\n  }\n\n  getSymbolsByNameCi(name: string): SymbolData[] {\n    this.throwIfClosed();\n    return this.inner.getSymbolsByNameCi(name);\n  }\n  getSymbolsForBranch(branch: string): SymbolData[] {\n    this.throwIfClosed();\n    return this.inner.getSymbolsForBranch(branch);\n  }\n\n  getSymbolsForFiles(filePaths: string[], branch: string): SymbolData[] {\n    this.throwIfClosed();\n    return this.inner.getSymbolsForFiles(filePaths, branch);\n  }\n\n  deleteSymbolsByFile(filePath: string): number {\n    this.throwIfClosed();\n    return this.inner.deleteSymbolsByFile(filePath);\n  }\n\n\n\n  upsertCallEdge(edge: CallEdgeData): void {\n    this.throwIfClosed();\n    this.inner.upsertCallEdge(edge);\n  }\n\n  upsertCallEdgesBatch(edges: CallEdgeData[]): void {\n    this.throwIfClosed();\n    if (edges.length === 0) return;\n    this.inner.upsertCallEdgesBatch(edges);\n  }\n\n  getCallers(targetName: string, branch: string, callTypeFilter?: string): CallEdgeData[] {\n    this.throwIfClosed();\n    return this.inner.getCallers(targetName, branch, callTypeFilter ?? null);\n  }\n\n  getCallersWithContext(targetName: string, branch: string, callTypeFilter?: string): CallEdgeData[] {\n    this.throwIfClosed();\n    return this.inner.getCallersWithContext(targetName, branch, callTypeFilter ?? null);\n  }\n\n  getCallees(symbolId: string, branch: string, callTypeFilter?: string): CallEdgeData[] {\n    this.throwIfClosed();\n    return this.inner.getCallees(symbolId, branch, callTypeFilter ?? null);\n  }\n\n  deleteCallEdgesByFile(filePath: string): number {\n    this.throwIfClosed();\n    return this.inner.deleteCallEdgesByFile(filePath);\n  }\n\n  resolveCallEdge(edgeId: string, toSymbolId: string): void {\n    this.throwIfClosed();\n    this.inner.resolveCallEdge(edgeId, toSymbolId);\n  }\n\n  findShortestPath(fromName: string, toName: string, branch: string, maxDepth?: number): PathHopData[] {\n    this.throwIfClosed();\n    return this.inner.findShortestPath(fromName, toName, branch, maxDepth ?? null);\n  }\n\n\n\n  addSymbolsToBranch(branch: string, symbolIds: string[]): void {\n    this.throwIfClosed();\n    this.inner.addSymbolsToBranch(branch, symbolIds);\n  }\n\n  addSymbolsToBranchBatch(branch: string, symbolIds: string[]): void {\n    this.throwIfClosed();\n    if (symbolIds.length === 0) return;\n    this.inner.addSymbolsToBranchBatch(branch, symbolIds);\n  }\n\n  getBranchSymbolIds(branch: string): string[] {\n    this.throwIfClosed();\n    return this.inner.getBranchSymbolIds(branch);\n  }\n\n  clearBranchSymbols(branch: string): number {\n    this.throwIfClosed();\n    return this.inner.clearBranchSymbols(branch);\n  }\n\n  getReferencedSymbolIds(symbolIds: string[]): string[] {\n    this.throwIfClosed();\n    if (symbolIds.length === 0) return [];\n    return this.inner.getReferencedSymbolIds(symbolIds);\n  }\n\n  deleteBranchSymbolsBySymbolIds(symbolIds: string[]): number {\n    this.throwIfClosed();\n    if (symbolIds.length === 0) return 0;\n    return this.inner.deleteBranchSymbolsBySymbolIds(symbolIds);\n  }\n\n  deleteBranchSymbolsForBranch(branch: string, symbolIds: string[]): number {\n    this.throwIfClosed();\n    if (symbolIds.length === 0) return 0;\n    return this.inner.deleteBranchSymbolsForBranch(branch, symbolIds);\n  }\n\n\n\n  gcOrphanSymbols(): number {\n    this.throwIfClosed();\n    return this.inner.gcOrphanSymbols();\n  }\n\n  gcOrphanCallEdges(): number {\n    this.throwIfClosed();\n    return this.inner.gcOrphanCallEdges();\n  }\n\n  getTransitiveReachability(\n    rootSymbolIds: string[],\n    branch: string,\n    direction: string,\n    maxDepth?: number\n  ): ReachabilityData[] {\n    this.throwIfClosed();\n    return this.inner.getTransitiveReachability(\n      rootSymbolIds,\n      branch,\n      direction,\n      maxDepth ?? null\n    );\n  }\n\n  detectCommunities(\n    branch: string,\n    symbolIds?: string[]\n  ): CommunityData[] {\n    this.throwIfClosed();\n    return this.inner.detectCommunities(branch, symbolIds ?? null);\n  }\n\n  computeCentrality(branch: string): CentralityData[] {\n    this.throwIfClosed();\n    return this.inner.computeCentrality(branch);\n  }\n}\n","import * as path from \"path\";\nimport { execFile } from \"child_process\";\nimport { promisify } from \"util\";\n\nconst execFileAsync = promisify(execFile);\n\nfunction getErrorMessage(error: unknown): string {\n  if (error instanceof Error) return error.message;\n  return String(error);\n}\n\nexport interface ChangedFilesResult {\n  files: string[];\n  baseBranch: string;\n  source: \"gh\" | \"git\";\n  headRefName?: string;\n}\n\nexport interface GetChangedFilesOptions {\n  pr?: number;\n  branch?: string;\n  projectRoot: string;\n  baseBranch?: string;\n}\n\ninterface GhPrViewResponse {\n  headRefName?: string;\n  baseRefName?: string;\n  files?: Array<{ path: string }>;\n}\n\nexport async function getChangedFiles(\n  opts: GetChangedFilesOptions,\n): Promise<ChangedFilesResult> {\n  const { pr, branch, projectRoot, baseBranch = \"main\" } = opts;\n\n  if (pr !== undefined) {\n    return getChangedFilesForPr(pr, projectRoot, baseBranch);\n  }\n\n  return getChangedFilesForBranch(branch, projectRoot, baseBranch);\n}\n\nasync function getChangedFilesForPr(\n  pr: number,\n  projectRoot: string,\n  baseBranch: string,\n): Promise<ChangedFilesResult> {\n  let headRefName: string | undefined;\n  let actualBaseBranch = baseBranch;\n\n  try {\n    const { stdout } = await execFileAsync(\n      \"gh\",\n      [\"pr\", \"view\", String(pr), \"--json\", \"headRefName,baseRefName,files\"],\n      { cwd: projectRoot, timeout: 30000 },\n    );\n\n    const data = JSON.parse(stdout) as GhPrViewResponse;\n    headRefName = data.headRefName;\n    actualBaseBranch = data.baseRefName || baseBranch;\n\n    if (data.files && data.files.length > 0) {\n      return {\n        files: normalizeFiles(\n          data.files.map((f) => f.path),\n          projectRoot,\n        ),\n        baseBranch: actualBaseBranch,\n        source: \"gh\",\n        headRefName,\n      };\n    }\n  } catch (error) {\n    throw new Error(\n      `Failed to retrieve PR #${pr} via gh CLI: ${getErrorMessage(error)}`,\n    );\n  }\n\n  if (headRefName === undefined) {\n    throw new Error(\n      `PR #${pr} returned no usable branch or file information.`,\n    );\n  }\n\n  const result = await getChangedFilesForBranch(headRefName, projectRoot, actualBaseBranch);\n  return { ...result, headRefName };\n}\n\nasync function getChangedFilesForBranch(\n  branch: string | undefined,\n  projectRoot: string,\n  baseBranch: string,\n): Promise<ChangedFilesResult> {\n  const targetBranch = branch || (await getCurrentBranch(projectRoot));\n  const mergeBase = await getMergeBase(projectRoot, baseBranch, targetBranch);\n\n  const { stdout } = await execFileAsync(\n    \"git\",\n    [\"diff\", \"--name-only\", `${mergeBase}...${targetBranch}`],\n    { cwd: projectRoot, timeout: 30000 },\n  );\n\n  return {\n    files: normalizeFiles(stdout.split(\"\\n\"), projectRoot),\n    baseBranch,\n    source: \"git\",\n    headRefName: targetBranch,\n  };\n}\n\nasync function getCurrentBranch(projectRoot: string): Promise<string> {\n  const { stdout } = await execFileAsync(\n    \"git\",\n    [\"branch\", \"--show-current\"],\n    { cwd: projectRoot, timeout: 30000 },\n  );\n  return stdout.trim() || \"HEAD\";\n}\n\nasync function getMergeBase(\n  projectRoot: string,\n  baseBranch: string,\n  branch: string,\n): Promise<string> {\n  const { stdout } = await execFileAsync(\n    \"git\",\n    [\"merge-base\", baseBranch, branch],\n    { cwd: projectRoot, timeout: 30000 },\n  );\n  return stdout.trim();\n}\n\nfunction normalizeFiles(rawFiles: string[], projectRoot: string): string[] {\n  const seen = new Set<string>();\n  const result: string[] = [];\n\n  for (const raw of rawFiles) {\n    const trimmed = raw.trim();\n    if (!trimmed) continue;\n\n    const absolute = path.resolve(projectRoot, trimmed);\n    const relative = path.relative(projectRoot, absolute);\n    const cleaned = relative.startsWith(\"./\")\n      ? relative.slice(2)\n      : relative;\n\n    if (!seen.has(cleaned)) {\n      seen.add(cleaned);\n      result.push(cleaned);\n    }\n  }\n\n  return result;\n}\n","import * as path from \"path\";\n\nimport { normalizePathSeparators } from \"../utils/paths.js\";\n\nexport function resolveConfigPathValue(value: string, baseDir: string): string {\n  const trimmed = value.trim();\n  if (!trimmed) {\n    return trimmed;\n  }\n\n  const absolutePath = path.isAbsolute(trimmed) ? trimmed : path.resolve(baseDir, trimmed);\n  return path.normalize(absolutePath);\n}\n\nexport function serializeConfigPathValue(value: string, baseDir: string): string {\n  const trimmed = value.trim();\n  if (!trimmed) {\n    return trimmed;\n  }\n\n  if (!path.isAbsolute(trimmed)) {\n    return normalizePathSeparators(path.normalize(trimmed));\n  }\n\n  const relativePath = path.relative(baseDir, trimmed);\n  if (!relativePath || (!relativePath.startsWith(\"..\") && !path.isAbsolute(relativePath))) {\n    return normalizePathSeparators(path.normalize(relativePath || \".\"));\n  }\n\n  return path.normalize(trimmed);\n}\n\nexport function resolveKnowledgeBasePath(value: string, projectRoot: string): string {\n  return path.isAbsolute(value) ? value : path.resolve(projectRoot, value);\n}\n\nexport function normalizeKnowledgeBasePath(value: string, projectRoot: string): string {\n  return path.normalize(resolveKnowledgeBasePath(value, projectRoot));\n}\n\nexport function hasMatchingKnowledgeBasePath(\n  knowledgeBases: string[],\n  inputPath: string,\n  projectRoot: string,\n): boolean {\n  const normalizedInput = path.normalize(inputPath);\n  return knowledgeBases.some((kb) => normalizeKnowledgeBasePath(kb, projectRoot) === normalizedInput);\n}\n\nexport function findKnowledgeBasePathIndex(\n  knowledgeBases: string[],\n  inputPath: string,\n  projectRoot: string,\n): number {\n  const normalizedInput = path.normalize(inputPath);\n  return knowledgeBases.findIndex(\n    (kb) => path.normalize(kb) === normalizedInput || normalizeKnowledgeBasePath(kb, projectRoot) === normalizedInput\n  );\n}\n","import { IndexStats, IndexProgress, SearchResult, HealthCheckResult, StatusResult } from \"../indexer/index.js\";\nimport type { LogEntry } from \"../utils/logger.js\";\n\nconst MAX_CONTENT_LINES = 30;\n\nfunction truncateContent(content: string): string {\n  const lines = content.split(\"\\n\");\n  if (lines.length <= MAX_CONTENT_LINES) return content;\n  return (\n    lines.slice(0, MAX_CONTENT_LINES).join(\"\\n\") +\n    `\\n// ... (${lines.length - MAX_CONTENT_LINES} more lines)`\n  );\n}\n\nexport function formatIndexStats(stats: IndexStats, verbose: boolean = false): string {\n  if (stats.resetCorruptedIndex) {\n    return stats.warning ?? \"Detected a corrupted local index and reset it during indexing. Run index_codebase again to rebuild search data.\";\n  }\n\n  const lines: string[] = [];\n\n  if (stats.failedChunks > 0) {\n    lines.push(`INDEXING WARNING: ${stats.failedChunks} chunks failed to embed.`);\n    if (stats.failedBatchesPath) {\n      lines.push(`Inspect failed batches at: ${stats.failedBatchesPath}`);\n    }\n    lines.push(\"\");\n  }\n  \n  if (stats.indexedChunks === 0 && stats.removedChunks === 0) {\n    lines.push(`${stats.totalFiles} files processed, ${stats.existingChunks} code chunks already up to date.`);\n  } else if (stats.indexedChunks === 0) {\n    lines.push(`${stats.totalFiles} files, removed ${stats.removedChunks} stale chunks, ${stats.existingChunks} chunks remain.`);\n  } else {\n    let main = `${stats.totalFiles} files processed, ${stats.indexedChunks} new chunks embedded.`;\n    if (stats.existingChunks > 0) {\n      main += ` ${stats.existingChunks} unchanged chunks skipped.`;\n    }\n    lines.push(main);\n\n    if (stats.removedChunks > 0) {\n      lines.push(`Removed ${stats.removedChunks} stale chunks.`);\n    }\n\n    if (stats.failedChunks > 0) {\n      lines.push(`Failed: ${stats.failedChunks} chunks.`);\n    }\n\n    lines.push(`Tokens: ${stats.tokensUsed.toLocaleString()}, Duration: ${(stats.durationMs / 1000).toFixed(1)}s`);\n  }\n\n  if (verbose) {\n    if (stats.skippedFiles.length > 0) {\n      const tooLarge = stats.skippedFiles.filter(f => f.reason === \"too_large\");\n      const excluded = stats.skippedFiles.filter(f => f.reason === \"excluded\");\n      const gitignored = stats.skippedFiles.filter(f => f.reason === \"gitignore\");\n      \n      lines.push(\"\");\n      lines.push(`Skipped files: ${stats.skippedFiles.length}`);\n      if (tooLarge.length > 0) {\n        lines.push(`  Too large (${tooLarge.length}): ${tooLarge.slice(0, 5).map(f => f.path).join(\", \")}${tooLarge.length > 5 ? \"...\" : \"\"}`);\n      }\n      if (excluded.length > 0) {\n        lines.push(`  Excluded (${excluded.length}): ${excluded.slice(0, 5).map(f => f.path).join(\", \")}${excluded.length > 5 ? \"...\" : \"\"}`);\n      }\n      if (gitignored.length > 0) {\n        lines.push(`  Gitignored (${gitignored.length}): ${gitignored.slice(0, 5).map(f => f.path).join(\", \")}${gitignored.length > 5 ? \"...\" : \"\"}`);\n      }\n    }\n\n    if (stats.parseFailures.length > 0) {\n      lines.push(\"\");\n      lines.push(`Files with no extractable chunks (${stats.parseFailures.length}): ${stats.parseFailures.slice(0, 10).join(\", \")}${stats.parseFailures.length > 10 ? \"...\" : \"\"}`);\n    }\n  }\n\n  return lines.join(\"\\n\");\n}\n\nexport function formatStatus(status: StatusResult): string {\n  if (!status.indexed) {\n    if (status.warning) {\n      return status.warning;\n    }\n\n    if (status.failedBatchesCount > 0) {\n      const lines = [\n        \"Codebase is not indexed. The last indexing run left failed embedding batches.\",\n        \"Fix the provider/model configuration, then rerun index_codebase normally to retry the saved failed batches. Use force=true only for a full rebuild or compatibility reset.\",\n      ];\n\n      if (status.failedBatchesPath) {\n        lines.push(`Failed batches: ${status.failedBatchesPath}`);\n      }\n\n      return lines.join(\"\\n\");\n    }\n\n    return \"Codebase is not indexed. Run index_codebase to create an index.\";\n  }\n\n  const lines = [\n    `Indexed chunks: ${status.vectorCount.toLocaleString()}`,\n    `Provider: ${status.provider}`,\n    `Model: ${status.model}`,\n    `Location: ${status.indexPath}`,\n  ];\n\n  if (status.currentBranch !== \"default\") {\n    lines.push(`Current branch: ${status.currentBranch}`);\n    lines.push(`Base branch: ${status.baseBranch}`);\n  }\n\n  if (status.failedBatchesCount > 0) {\n    lines.push(\"\");\n    lines.push(`INDEXING WARNING: ${status.failedBatchesCount} failed embedding batch${status.failedBatchesCount === 1 ? \" remains\" : \"es remain\"}.`);\n    if (status.failedBatchesPath) {\n      lines.push(`Failed batches: ${status.failedBatchesPath}`);\n    }\n  }\n\n  if (status.compatibility && !status.compatibility.compatible) {\n    lines.push(\"\");\n    lines.push(`COMPATIBILITY WARNING: ${status.compatibility.reason}`);\n    if (status.compatibility.storedMetadata) {\n      const stored = status.compatibility.storedMetadata;\n      lines.push(`Index was built with: ${stored.embeddingProvider}/${stored.embeddingModel} (${stored.embeddingDimensions}D)`);\n      lines.push(`Current config:       ${status.provider}/${status.model}`);\n    }\n  } else if (!status.compatibility) {\n    lines.push(`Compatibility: No compatibility information found. Maybe the index is not initialized yet, try running index_codebase.`);\n  } else {\n    lines.push(`Compatibility: Index is compatible with the current provider and model.`);\n  }\n\n  return lines.join(\"\\n\");\n}\n\nexport function formatProgressTitle(progress: IndexProgress): string {\n  switch (progress.phase) {\n    case \"scanning\":\n      return \"Scanning files...\";\n    case \"parsing\":\n      return `Parsing: ${progress.filesProcessed}/${progress.totalFiles} files`;\n    case \"embedding\":\n      return `Embedding: ${progress.chunksProcessed}/${progress.totalChunks} chunks`;\n    case \"storing\":\n      return \"Storing index...\";\n    case \"complete\":\n      return \"Indexing complete\";\n    default:\n      return \"Indexing...\";\n  }\n}\n\nexport function calculatePercentage(progress: IndexProgress): number {\n  if (progress.phase === \"scanning\") return 0;\n  if (progress.phase === \"complete\") return 100;\n  \n  if (progress.phase === \"parsing\") {\n    if (progress.totalFiles === 0) return 5;\n    return Math.round(5 + (progress.filesProcessed / progress.totalFiles) * 15);\n  }\n  \n  if (progress.phase === \"embedding\") {\n    if (progress.totalChunks === 0) return 20;\n    return Math.round(20 + (progress.chunksProcessed / progress.totalChunks) * 70);\n  }\n  \n  if (progress.phase === \"storing\") return 95;\n  \n  return 0;\n}\n\nexport function formatCodebasePeek(results: SearchResult[]): string {\n  if (results.length === 0) {\n    return \"No matching code found. Try a different query or run index_codebase first.\";\n  }\n\n  const formatted = results.map((r, idx) => {\n    const location = `${r.filePath}:${r.startLine}-${r.endLine}`;\n    const name = r.name ? `\"${r.name}\"` : \"(anonymous)\";\n    return `[${idx + 1}] ${r.chunkType} ${name} at ${location} (score: ${r.score.toFixed(2)})`;\n  });\n\n  return formatted.join(\"\\n\");\n}\n\nexport function formatHealthCheck(result: HealthCheckResult): string {\n  if (result.resetCorruptedIndex) {\n    return result.warning ?? \"Detected a corrupted local index and reset it. Run index_codebase to rebuild search data.\";\n  }\n\n  if (result.removed === 0 && result.gcOrphanEmbeddings === 0 && result.gcOrphanChunks === 0 && result.gcOrphanSymbols === 0 && result.gcOrphanCallEdges === 0) {\n    return \"Index is healthy. No stale entries found.\";\n  }\n\n  const lines: string[] = [];\n  \n  if (result.removed > 0) {\n    lines.push(`Removed stale entries: ${result.removed}`);\n  }\n  \n  if (result.gcOrphanEmbeddings > 0) {\n    lines.push(`Garbage collected orphan embeddings: ${result.gcOrphanEmbeddings}`);\n  }\n  \n  if (result.gcOrphanChunks > 0) {\n    lines.push(`Garbage collected orphan chunks: ${result.gcOrphanChunks}`);\n  }\n\n  if (result.gcOrphanSymbols > 0) {\n    lines.push(`Garbage collected orphan symbols: ${result.gcOrphanSymbols}`);\n  }\n\n  if (result.gcOrphanCallEdges > 0) {\n    lines.push(`Garbage collected orphan call edges: ${result.gcOrphanCallEdges}`);\n  }\n\n  if (result.filePaths.length > 0) {\n    lines.push(`Cleaned paths: ${result.filePaths.join(\", \")}`);\n  }\n\n  return lines.join(\"\\n\");\n}\n\nexport function formatLogs(logs: LogEntry[]): string {\n  if (logs.length === 0) {\n    return \"No logs recorded yet. Logs are captured during indexing and search operations.\";\n  }\n\n  return logs.map(l => {\n    const dataStr = l.data ? ` ${JSON.stringify(l.data)}` : \"\";\n    return `[${l.timestamp}] [${l.level.toUpperCase()}] [${l.category}] ${l.message}${dataStr}`;\n  }).join(\"\\n\");\n}\n\nfunction formatResultHeader(result: SearchResult, index: number): string {\n  return result.name\n    ? `[${index + 1}] ${result.chunkType} \"${result.name}\" in ${result.filePath}:${result.startLine}-${result.endLine}`\n    : `[${index + 1}] ${result.chunkType} in ${result.filePath}:${result.startLine}-${result.endLine}`;\n}\n\nexport function formatDefinitionLookup(results: SearchResult[], query: string): string {\n  if (results.length === 0) {\n    return `No definition found for \"${query}\". Try codebase_search for broader discovery, or verify the symbol name.`;\n  }\n\n  const formatted = results.map((r, idx) => {\n    const header = formatResultHeader(r, idx);\n    return `${header} (score: ${r.score.toFixed(2)})\\n\\`\\`\\`\\n${truncateContent(r.content)}\\n\\`\\`\\``;\n  });\n\n  return formatted.join(\"\\n\\n\");\n}\n\nexport type ScoreFormat = \"score\" | \"similarity\";\n\nexport function formatSearchResults(results: SearchResult[], scoreFormat: ScoreFormat = \"similarity\"): string {\n  const formatted = results.map((r, idx) => {\n    const header = formatResultHeader(r, idx);\n\n    const scoreLabel = scoreFormat === \"similarity\"\n      ? `(similarity: ${(r.score * 100).toFixed(1)}%)`\n      : `(score: ${r.score.toFixed(2)})`;\n\n    return `${header} ${scoreLabel}\\n\\`\\`\\`\\n${truncateContent(r.content)}\\n\\`\\`\\``;\n  });\n\n  return formatted.join(\"\\n\\n\");\n}\n","import { existsSync, mkdirSync, writeFileSync } from \"fs\";\nimport * as path from \"path\";\n\nimport { loadMergedConfig, loadProjectConfigLayer } from \"../config/merger.js\";\nimport { resolveWritableProjectConfigPath } from \"../config/paths.js\";\nimport { resolveConfigPathValue, serializeConfigPathValue } from \"./knowledge-base-paths.js\";\nimport type { HostMode } from \"../config/host.js\";\n\nfunction normalizeKnowledgeBasePaths(\n  config: Record<string, unknown>,\n  projectRoot: string,\n): Record<string, unknown> {\n  const normalized = { ...config };\n\n  if (Array.isArray(normalized.knowledgeBases)) {\n    normalized.knowledgeBases = (normalized.knowledgeBases as string[]).map((kb) =>\n      resolveConfigPathValue(kb, projectRoot)\n    );\n  }\n\n  return normalized;\n}\n\nfunction toConfigRecord(rawConfig: unknown): Record<string, unknown> {\n  if (!rawConfig || typeof rawConfig !== \"object\") {\n    return {};\n  }\n\n  return { ...(rawConfig as Record<string, unknown>) };\n}\n\nexport function getConfigPath(projectRoot: string, host: HostMode = \"opencode\"): string {\n  return resolveWritableProjectConfigPath(projectRoot, host);\n}\n\nexport function loadRuntimeConfig(projectRoot: string, host: HostMode = \"opencode\"): Record<string, unknown> {\n  return normalizeKnowledgeBasePaths(toConfigRecord(loadMergedConfig(projectRoot, host)), projectRoot);\n}\n\nexport function loadEditableConfig(projectRoot: string, host: HostMode = \"opencode\"): Record<string, unknown> {\n  return normalizeKnowledgeBasePaths(toConfigRecord(loadProjectConfigLayer(projectRoot, host)), projectRoot);\n}\n\nexport function saveConfig(projectRoot: string, config: Record<string, unknown>, host: HostMode = \"opencode\"): void {\n  const configPath = getConfigPath(projectRoot, host);\n  const configDir = path.dirname(configPath);\n  const configBaseDir = path.dirname(configDir);\n  if (!existsSync(configDir)) {\n    mkdirSync(configDir, { recursive: true });\n  }\n\n  const serializableConfig: Record<string, unknown> = { ...config };\n\n  if (Array.isArray(serializableConfig.knowledgeBases)) {\n    serializableConfig.knowledgeBases = (serializableConfig.knowledgeBases as string[]).map((kb) =>\n      serializeConfigPathValue(kb, configBaseDir)\n    );\n  }\n\n  writeFileSync(configPath, JSON.stringify(serializableConfig, null, 2) + \"\\n\", \"utf-8\");\n}\n"],"mappings":"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","names":["exports","module","EventEmitter","exports","module","path","Ignore","import_fs","path","import_fs","path","import_fs","os","path","import_fs","path","import_fs","path","projectRoot","path","path","isStringArray","projectRoot","import_fs","path","import_child_process","import_util","resolve","EventEmitter","resolve","reject","resolve","text","text","import_fs","path","projectRoot","ignore","projectRoot","fsPromises","path","os","module","platform","arch","require","text","path","projectRoot","getCurrentBranch","relative","getErrorMessage","text","projectRoot","getErrorMessage","fsPromises","resolve","failedBatch","path","execFileAsync","path","projectRoot","normalizeKnowledgeBasePath","lines","import_fs","path","projectRoot","projectRoot","projectRoot","text","text"]}