opencode-codebase-index 0.1.4 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../node_modules/eventemitter3/index.js","../node_modules/ignore/index.js","../src/index.ts","../src/config/schema.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/detector.ts","../src/embeddings/provider.ts","../src/utils/files.ts","../src/utils/cost.ts","../src/native/index.ts","../src/indexer/inverted-index.ts","../node_modules/chokidar/index.js","../node_modules/readdirp/index.js","../node_modules/chokidar/handler.js","../src/watcher/index.ts","../src/tools/index.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 { Plugin } from \"@opencode-ai/plugin\";\nimport { existsSync, readFileSync } from \"fs\";\nimport * as path from \"path\";\n\nimport { parseConfig } from \"./config/schema.js\";\nimport { Indexer } from \"./indexer/index.js\";\nimport { createWatcherWithIndexer } from \"./watcher/index.js\";\nimport {\n codebase_search,\n index_codebase,\n index_status,\n index_health_check,\n initializeTools,\n} from \"./tools/index.js\";\n\nfunction loadPluginConfig(projectRoot: string): unknown {\n const configPath = path.join(projectRoot, \".opencode\", \"codebase-index.json\");\n try {\n if (existsSync(configPath)) {\n const content = readFileSync(configPath, \"utf-8\");\n return JSON.parse(content);\n }\n } catch {\n // Ignore config file read errors, use defaults\n }\n return {};\n}\n\nconst plugin: Plugin = async ({ directory }) => {\n const projectRoot = directory;\n const rawConfig = loadPluginConfig(projectRoot);\n const config = parseConfig(rawConfig);\n\n initializeTools(projectRoot, config);\n\n const indexer = new Indexer(projectRoot, config);\n\n if (config.indexing.autoIndex) {\n indexer.initialize().then(() => {\n indexer.index().catch(() => {});\n }).catch(() => {});\n }\n\n if (config.indexing.watchFiles) {\n createWatcherWithIndexer(indexer, projectRoot, config);\n }\n\n return {\n tool: {\n codebase_search,\n index_codebase,\n index_status,\n index_health_check,\n },\n };\n};\n\nexport default plugin;\n\nexport { Indexer } from \"./indexer/index.js\";\nexport { FileWatcher } from \"./watcher/index.js\";\nexport * from \"./config/schema.js\";\nexport {\n VectorStore,\n parseFile,\n parseFiles,\n hashContent,\n hashFile,\n createEmbeddingText,\n createDynamicBatches,\n generateChunkId,\n generateChunkHash,\n type FileInput,\n type CodeChunk,\n type ChunkType,\n type ParsedFile,\n type SearchResult,\n type ChunkMetadata,\n} from \"./native/index.js\";\nexport * from \"./embeddings/index.js\";\nexport * from \"./utils/index.js\";\n","import { z } from \"zod\";\n\nexport const EmbeddingProviderSchema = z.enum([\n \"auto\",\n \"github-copilot\",\n \"openai\",\n \"google\",\n \"ollama\",\n]);\n\nexport type EmbeddingProvider = z.infer<typeof EmbeddingProviderSchema>;\n\nexport const IndexScopeSchema = z.enum([\"project\", \"global\"]);\n\nexport type IndexScope = z.infer<typeof IndexScopeSchema>;\n\nexport const IndexingConfigSchema = z.object({\n autoIndex: z.boolean().default(false),\n watchFiles: z.boolean().default(true),\n maxFileSize: z.number().default(1048576),\n retries: z.number().default(3),\n retryDelayMs: z.number().default(1000),\n});\n\nexport type IndexingConfig = z.infer<typeof IndexingConfigSchema>;\n\nexport const SearchConfigSchema = z.object({\n maxResults: z.number().default(20),\n minScore: z.number().default(0.1),\n includeContext: z.boolean().default(true),\n hybridWeight: z.number().min(0).max(1).default(0.5),\n contextLines: z.number().min(0).max(50).default(0),\n});\n\nexport type SearchConfig = z.infer<typeof SearchConfigSchema>;\n\nexport const CodebaseIndexConfigSchema = z.object({\n embeddingProvider: EmbeddingProviderSchema.default(\"auto\"),\n embeddingModel: z.string().default(\"auto\"),\n scope: IndexScopeSchema.default(\"project\"),\n \n indexing: IndexingConfigSchema.optional(),\n search: SearchConfigSchema.optional(),\n\n include: z.array(z.string()).default([\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,swift}\",\n \"**/*.{vue,svelte,astro}\",\n \"**/*.{sql,graphql,proto}\",\n \"**/*.{yaml,yml,toml}\",\n \"**/*.{md,mdx}\",\n \"**/*.{sh,bash,zsh}\",\n ]),\n\n exclude: z.array(z.string()).default([\n \"**/node_modules/**\",\n \"**/.git/**\",\n \"**/dist/**\",\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\nexport type CodebaseIndexConfig = z.infer<typeof CodebaseIndexConfigSchema>;\n\nfunction getDefaultIndexingConfig(): IndexingConfig {\n return {\n autoIndex: false,\n watchFiles: true,\n maxFileSize: 1048576,\n retries: 3,\n retryDelayMs: 1000,\n };\n}\n\nfunction getDefaultSearchConfig(): SearchConfig {\n return {\n maxResults: 20,\n minScore: 0.1,\n includeContext: true,\n hybridWeight: 0.5,\n contextLines: 0,\n };\n}\n\nexport type ParsedCodebaseIndexConfig = CodebaseIndexConfig & {\n indexing: IndexingConfig;\n search: SearchConfig;\n};\n\nexport function parseConfig(raw: unknown): ParsedCodebaseIndexConfig {\n const parsed = CodebaseIndexConfigSchema.parse(raw ?? {});\n return {\n ...parsed,\n indexing: parsed.indexing ?? getDefaultIndexingConfig(),\n search: parsed.search ?? getDefaultSearchConfig(),\n };\n}\n\nexport function getDefaultConfig(): CodebaseIndexConfig {\n return CodebaseIndexConfigSchema.parse({});\n}\n\nexport interface EmbeddingModelInfo {\n provider: EmbeddingProvider;\n model: string;\n dimensions: number;\n maxTokens: number;\n costPer1MTokens: number;\n}\n\nexport const EMBEDDING_MODELS: Record<string, EmbeddingModelInfo> = {\n \"github-copilot/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 \"openai/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 \"openai/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 \"google/text-embedding-004\": {\n provider: \"google\",\n model: \"text-embedding-004\",\n dimensions: 768,\n maxTokens: 2048,\n costPer1MTokens: 0.00,\n },\n \"ollama/nomic-embed-text\": {\n provider: \"ollama\",\n model: \"nomic-embed-text\",\n dimensions: 768,\n maxTokens: 8192,\n costPer1MTokens: 0.00,\n },\n \"ollama/mxbai-embed-large\": {\n provider: \"ollama\",\n model: \"mxbai-embed-large\",\n dimensions: 1024,\n maxTokens: 512,\n costPer1MTokens: 0.00,\n },\n};\n\nexport function getDefaultModelForProvider(provider: EmbeddingProvider): EmbeddingModelInfo {\n switch (provider) {\n case \"github-copilot\":\n return EMBEDDING_MODELS[\"github-copilot/text-embedding-3-small\"];\n case \"openai\":\n return EMBEDDING_MODELS[\"openai/text-embedding-3-small\"];\n case \"google\":\n return EMBEDDING_MODELS[\"google/text-embedding-004\"];\n case \"ollama\":\n return EMBEDDING_MODELS[\"ollama/nomic-embed-text\"];\n default:\n return EMBEDDING_MODELS[\"github/text-embedding-3-small\"];\n }\n}\n","import { existsSync, readFileSync, writeFileSync, promises as fsPromises } from \"fs\";\nimport * as path from \"path\";\nimport PQueue from \"p-queue\";\nimport pRetry from \"p-retry\";\n\nimport { ParsedCodebaseIndexConfig } from \"../config/schema.js\";\nimport { detectEmbeddingProvider, DetectedProvider } from \"../embeddings/detector.js\";\nimport {\n createEmbeddingProvider,\n EmbeddingProviderInterface,\n} from \"../embeddings/provider.js\";\nimport { collectFiles, SkippedFile } from \"../utils/files.js\";\nimport { createCostEstimate, CostEstimate } from \"../utils/cost.js\";\nimport {\n VectorStore,\n parseFiles,\n createEmbeddingText,\n generateChunkId,\n generateChunkHash,\n ChunkMetadata,\n createDynamicBatches,\n hashFile,\n} from \"../native/index.js\";\nimport { InvertedIndex } from \"./inverted-index.js\";\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}\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 text: string;\n content: string;\n metadata: ChunkMetadata;\n}\n\nexport class Indexer {\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 provider: EmbeddingProviderInterface | null = null;\n private detectedProvider: DetectedProvider | null = null;\n private fileHashCache: Map<string, string> = new Map();\n private fileHashCachePath: string = \"\";\n\n constructor(projectRoot: string, config: ParsedCodebaseIndexConfig) {\n this.projectRoot = projectRoot;\n this.config = config;\n this.indexPath = this.getIndexPath();\n this.fileHashCachePath = path.join(this.indexPath, \"file-hashes.json\");\n }\n\n private getIndexPath(): string {\n if (this.config.scope === \"global\") {\n const homeDir = process.env.HOME || process.env.USERPROFILE || \"\";\n return path.join(homeDir, \".opencode\", \"global-index\");\n }\n return path.join(this.projectRoot, \".opencode\", \"index\");\n }\n\n private loadFileHashCache(): void {\n try {\n if (existsSync(this.fileHashCachePath)) {\n const data = readFileSync(this.fileHashCachePath, \"utf-8\");\n const parsed = JSON.parse(data);\n this.fileHashCache = new Map(Object.entries(parsed));\n }\n } catch {\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 writeFileSync(this.fileHashCachePath, JSON.stringify(obj));\n }\n\n async initialize(): Promise<void> {\n this.detectedProvider = await detectEmbeddingProvider(this.config.embeddingProvider);\n if (!this.detectedProvider) {\n throw new Error(\n \"No embedding provider available. Configure GitHub, OpenAI, Google, or Ollama.\"\n );\n }\n\n this.provider = createEmbeddingProvider(\n this.detectedProvider.credentials,\n this.detectedProvider.modelInfo\n );\n\n await fsPromises.mkdir(this.indexPath, { recursive: true });\n\n const dimensions = this.detectedProvider.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 this.invertedIndex = new InvertedIndex(this.indexPath);\n this.invertedIndex.load();\n }\n\n private async ensureInitialized(): Promise<{\n store: VectorStore;\n provider: EmbeddingProviderInterface;\n invertedIndex: InvertedIndex;\n detectedProvider: DetectedProvider;\n }> {\n if (!this.store || !this.provider || !this.invertedIndex || !this.detectedProvider) {\n await this.initialize();\n }\n return {\n store: this.store!,\n provider: this.provider!,\n invertedIndex: this.invertedIndex!,\n detectedProvider: this.detectedProvider!,\n };\n }\n\n async estimateCost(): Promise<CostEstimate> {\n const { detectedProvider } = await this.ensureInitialized();\n\n const { files } = await collectFiles(\n this.projectRoot,\n this.config.include,\n this.config.exclude,\n this.config.indexing.maxFileSize\n );\n\n return createCostEstimate(files, detectedProvider);\n }\n\n async index(onProgress?: ProgressCallback): Promise<IndexStats> {\n const { store, provider, invertedIndex } = await this.ensureInitialized();\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\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 { files, skipped } = await collectFiles(\n this.projectRoot,\n this.config.include,\n this.config.exclude,\n this.config.indexing.maxFileSize\n );\n\n stats.totalFiles = files.length;\n stats.skippedFiles = skipped;\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 } else {\n const content = await fsPromises.readFile(f.path, \"utf-8\");\n changedFiles.push({ path: f.path, content, hash: currentHash });\n }\n }\n\n onProgress?.({\n phase: \"parsing\",\n filesProcessed: 0,\n totalFiles: files.length,\n chunksProcessed: 0,\n totalChunks: 0,\n });\n\n const parsedFiles = parseFiles(changedFiles);\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 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 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 for (const chunk of parsed.chunks) {\n const id = generateChunkId(parsed.path, chunk);\n const contentHash = generateChunkHash(chunk);\n currentChunkIds.add(id);\n\n if (existingChunks.get(id) === contentHash) {\n continue;\n }\n\n const text = createEmbeddingText(chunk, parsed.path);\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({ id, text, content: chunk.content, metadata });\n }\n }\n\n let removedCount = 0;\n for (const [chunkId] of existingChunks) {\n if (!currentChunkIds.has(chunkId)) {\n store.remove(chunkId);\n invertedIndex.removeChunk(chunkId);\n removedCount++;\n }\n }\n\n stats.totalChunks = pendingChunks.length;\n stats.existingChunks = currentChunkIds.size - pendingChunks.length;\n stats.removedChunks = removedCount;\n\n if (pendingChunks.length === 0 && removedCount === 0) {\n this.fileHashCache = currentFileHashes;\n this.saveFileHashCache();\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 return stats;\n }\n\n if (pendingChunks.length === 0) {\n store.save();\n invertedIndex.save();\n this.fileHashCache = currentFileHashes;\n this.saveFileHashCache();\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 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 queue = new PQueue({ concurrency: 3 });\n const dynamicBatches = createDynamicBatches(pendingChunks);\n\n for (const batch of dynamicBatches) {\n queue.add(async () => {\n try {\n const result = await pRetry(\n async () => {\n const texts = batch.map((c) => c.text);\n return provider.embedBatch(texts);\n },\n {\n retries: this.config.indexing.retries,\n minTimeout: this.config.indexing.retryDelayMs,\n onFailedAttempt: (error) => {\n console.error(\n `Embedding batch failed (attempt ${error.attemptNumber}): ${String(error)}`\n );\n },\n }\n );\n\n const items = batch.map((chunk, idx) => ({\n id: chunk.id,\n vector: result.embeddings[idx],\n metadata: chunk.metadata,\n }));\n\n store.addBatch(items);\n \n for (const chunk of batch) {\n invertedIndex.removeChunk(chunk.id);\n invertedIndex.addChunk(chunk.id, chunk.content);\n }\n \n stats.indexedChunks += batch.length;\n stats.tokensUsed += result.totalTokensUsed;\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 stats.failedChunks += batch.length;\n console.error(`Failed to embed batch after retries: ${error}`);\n }\n });\n }\n\n await queue.onIdle();\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 store.save();\n invertedIndex.save();\n this.fileHashCache = currentFileHashes;\n this.saveFileHashCache();\n\n stats.durationMs = Date.now() - startTime;\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 return stats;\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 }\n ): Promise<\n Array<{\n filePath: string;\n startLine: number;\n endLine: number;\n content: string;\n score: number;\n chunkType: string;\n name?: string;\n }>\n > {\n const { store, provider } = await this.ensureInitialized();\n\n if (store.count() === 0) {\n return [];\n }\n\n const maxResults = limit ?? this.config.search.maxResults;\n const hybridWeight = options?.hybridWeight ?? this.config.search.hybridWeight;\n\n const { embedding } = await provider.embed(query);\n const semanticResults = store.search(embedding, maxResults * 4);\n\n const keywordResults = await this.keywordSearch(query, maxResults * 4);\n\n const combined = this.fuseResults(semanticResults, keywordResults, hybridWeight, maxResults * 4);\n\n const filtered = combined.filter((r) => {\n if (r.score < this.config.search.minScore) return false;\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, maxResults);\n\n return Promise.all(\n filtered.map(async (r) => {\n let content = \"\";\n let contextStartLine = r.metadata.startLine;\n let contextEndLine = r.metadata.endLine;\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 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 const allMetadata = store.getAllMetadata();\n const metadataMap = new Map<string, ChunkMetadata>();\n for (const { key, metadata } of allMetadata) {\n metadataMap.set(key, metadata);\n }\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 private fuseResults(\n semanticResults: Array<{ id: string; score: number; metadata: ChunkMetadata }>,\n keywordResults: Array<{ id: string; score: number; metadata: ChunkMetadata }>,\n keywordWeight: number,\n limit: number\n ): Array<{ id: string; score: number; metadata: ChunkMetadata }> {\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);\n return results.slice(0, limit);\n }\n\n async getStatus(): Promise<{\n indexed: boolean;\n vectorCount: number;\n provider: string;\n model: string;\n indexPath: string;\n }> {\n const { store, detectedProvider } = await this.ensureInitialized();\n\n return {\n indexed: store.count() > 0,\n vectorCount: store.count(),\n provider: detectedProvider.provider,\n model: detectedProvider.modelInfo.model,\n indexPath: this.indexPath,\n };\n }\n\n async clearIndex(): Promise<void> {\n const { store, invertedIndex } = await this.ensureInitialized();\n\n store.clear();\n store.save();\n invertedIndex.clear();\n invertedIndex.save();\n }\n\n async healthCheck(): Promise<{ removed: number; filePaths: string[] }> {\n const { store, invertedIndex } = await this.ensureInitialized();\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 let removedCount = 0;\n\n for (const [filePath, chunkKeys] of filePathsToChunkKeys) {\n if (!existsSync(filePath)) {\n for (const key of chunkKeys) {\n store.remove(key);\n invertedIndex.removeChunk(key);\n removedCount++;\n }\n removedFilePaths.push(filePath);\n }\n }\n\n if (removedCount > 0) {\n store.save();\n invertedIndex.save();\n }\n\n return { removed: removedCount, filePaths: removedFilePaths };\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 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 /**\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 this.#queue.enqueue(async () => {\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 }, options);\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 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'Failed to fetch', // 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// 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 { EmbeddingProvider, getDefaultModelForProvider, EmbeddingModelInfo } from \"../config/schema.js\";\nimport { existsSync, readFileSync } from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\n\nexport interface ProviderCredentials {\n provider: EmbeddingProvider;\n apiKey?: string;\n baseUrl?: string;\n refreshToken?: string;\n accessToken?: string;\n tokenExpires?: number;\n}\n\nexport interface DetectedProvider {\n provider: EmbeddingProvider;\n credentials: ProviderCredentials;\n modelInfo: EmbeddingModelInfo;\n}\n\nconst EMBEDDING_CAPABLE_PROVIDERS: EmbeddingProvider[] = [\n \"github-copilot\",\n \"openai\",\n \"google\",\n \"ollama\",\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(\n preferredProvider?: EmbeddingProvider\n): Promise<DetectedProvider> {\n if (preferredProvider && preferredProvider !== \"auto\") {\n const credentials = await getProviderCredentials(preferredProvider);\n if (credentials) {\n return {\n provider: preferredProvider,\n credentials,\n modelInfo: getDefaultModelForProvider(preferredProvider),\n };\n }\n throw new Error(\n `Preferred provider '${preferredProvider}' is not configured or authenticated`\n );\n }\n\n for (const provider of EMBEDDING_CAPABLE_PROVIDERS) {\n const credentials = await getProviderCredentials(provider);\n if (credentials) {\n return {\n provider,\n credentials,\n modelInfo: getDefaultModelForProvider(provider),\n };\n }\n }\n\n throw new Error(\n `No embedding-capable provider found. Please authenticate with OpenCode using one of: ${EMBEDDING_CAPABLE_PROVIDERS.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 const baseUrl = (copilotAuth as OpenCodeAuthOAuth).enterpriseUrl\n ? `https://copilot-api.${(copilotAuth as OpenCodeAuthOAuth).enterpriseUrl!.replace(/^https?:\\/\\//, \"\").replace(/\\/$/, \"\")}`\n : \"https://api.githubcopilot.com\";\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): 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 default:\n return provider;\n }\n}\n","import { EmbeddingModelInfo } from \"../config/schema.js\";\nimport { ProviderCredentials } from \"./detector.js\";\nimport { readFileSync, writeFileSync } from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\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 embed(text: string): Promise<EmbeddingResult>;\n embedBatch(texts: string[]): Promise<EmbeddingBatchResult>;\n getModelInfo(): EmbeddingModelInfo;\n}\n\nexport function createEmbeddingProvider(\n credentials: ProviderCredentials,\n modelInfo: EmbeddingModelInfo\n): EmbeddingProviderInterface {\n switch (credentials.provider) {\n case \"github-copilot\":\n return new GitHubCopilotEmbeddingProvider(credentials, modelInfo);\n case \"openai\":\n return new OpenAIEmbeddingProvider(credentials, modelInfo);\n case \"google\":\n return new GoogleEmbeddingProvider(credentials, modelInfo);\n case \"ollama\":\n return new OllamaEmbeddingProvider(credentials, modelInfo);\n default:\n throw new Error(`Unsupported embedding provider: ${credentials.provider}`);\n }\n}\n\nconst COPILOT_HEADERS = {\n \"User-Agent\": \"GitHubCopilotChat/0.35.0\",\n \"Editor-Version\": \"vscode/1.107.0\",\n \"Editor-Plugin-Version\": \"copilot-chat/0.35.0\",\n \"Copilot-Integration-Id\": \"vscode-chat\",\n \"Openai-Intent\": \"conversation-edits\",\n};\n\nclass GitHubCopilotEmbeddingProvider implements EmbeddingProviderInterface {\n private accessToken: string;\n private tokenExpires: number;\n\n constructor(\n private credentials: ProviderCredentials,\n private modelInfo: EmbeddingModelInfo\n ) {\n this.accessToken = credentials.accessToken || \"\";\n this.tokenExpires = credentials.tokenExpires || 0;\n }\n\n private async ensureValidToken(): Promise<string> {\n if (this.accessToken && this.tokenExpires > Date.now()) {\n return this.accessToken;\n }\n\n if (!this.credentials.refreshToken) {\n throw new Error(\"No refresh token available for GitHub Copilot\");\n }\n\n const response = await fetch(\"https://api.github.com/copilot_internal/v2/token\", {\n headers: {\n Accept: \"application/json\",\n Authorization: `Bearer ${this.credentials.refreshToken}`,\n ...COPILOT_HEADERS,\n },\n });\n\n if (!response.ok) {\n throw new Error(`Token refresh failed: ${response.status}`);\n }\n\n const tokenData = await response.json() as { token: string; expires_at: number };\n this.accessToken = tokenData.token;\n this.tokenExpires = tokenData.expires_at * 1000 - 5 * 60 * 1000;\n\n this.persistToken(tokenData.token, this.tokenExpires);\n\n return this.accessToken;\n }\n\n private persistToken(token: string, expires: number): void {\n try {\n const authPath = path.join(os.homedir(), \".local\", \"share\", \"opencode\", \"auth.json\");\n const authData = JSON.parse(readFileSync(authPath, \"utf-8\"));\n \n if (authData[\"github-copilot\"]) {\n authData[\"github-copilot\"].access = token;\n authData[\"github-copilot\"].expires = expires;\n writeFileSync(authPath, JSON.stringify(authData, null, 2));\n }\n } catch {\n // Ignore token cache write errors\n }\n }\n\n async embed(text: string): Promise<EmbeddingResult> {\n const result = await this.embedBatch([text]);\n return {\n embedding: result.embeddings[0],\n tokensUsed: result.totalTokensUsed,\n };\n }\n\n async embedBatch(texts: string[]): Promise<EmbeddingBatchResult> {\n const token = await this.ensureValidToken();\n\n const response = await fetch(`${this.credentials.baseUrl}/embeddings`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n ...COPILOT_HEADERS,\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();\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 getModelInfo(): EmbeddingModelInfo {\n return this.modelInfo;\n }\n}\n\nclass OpenAIEmbeddingProvider implements EmbeddingProviderInterface {\n constructor(\n private credentials: ProviderCredentials,\n private modelInfo: EmbeddingModelInfo\n ) {}\n\n async embed(text: string): Promise<EmbeddingResult> {\n const result = await this.embedBatch([text]);\n return {\n embedding: result.embeddings[0],\n tokensUsed: result.totalTokensUsed,\n };\n }\n\n 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();\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 getModelInfo(): EmbeddingModelInfo {\n return this.modelInfo;\n }\n}\n\nclass GoogleEmbeddingProvider implements EmbeddingProviderInterface {\n constructor(\n private credentials: ProviderCredentials,\n private modelInfo: EmbeddingModelInfo\n ) {}\n\n async embed(text: string): Promise<EmbeddingResult> {\n const result = await this.embedBatch([text]);\n return {\n embedding: result.embeddings[0],\n tokensUsed: result.totalTokensUsed,\n };\n }\n\n async embedBatch(texts: string[]): Promise<EmbeddingBatchResult> {\n const embeddings: number[][] = [];\n let totalTokens = 0;\n\n for (const text of texts) {\n const response = await fetch(\n `${this.credentials.baseUrl}/models/${this.modelInfo.model}:embedContent?key=${this.credentials.apiKey}`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n content: {\n parts: [{ text }],\n },\n }),\n }\n );\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Google embedding API error: ${response.status} - ${error}`);\n }\n\n const data = await response.json() as {\n embedding: { values: number[] };\n };\n\n embeddings.push(data.embedding.values);\n totalTokens += Math.ceil(text.length / 4);\n }\n\n return {\n embeddings,\n totalTokensUsed: totalTokens,\n };\n }\n\n getModelInfo(): EmbeddingModelInfo {\n return this.modelInfo;\n }\n}\n\nclass OllamaEmbeddingProvider implements EmbeddingProviderInterface {\n constructor(\n private credentials: ProviderCredentials,\n private modelInfo: EmbeddingModelInfo\n ) {}\n\n async embed(text: string): Promise<EmbeddingResult> {\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 }),\n });\n\n if (!response.ok) {\n const error = await response.text();\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: Math.ceil(text.length / 4),\n };\n }\n\n async embedBatch(texts: string[]): Promise<EmbeddingBatchResult> {\n const embeddings: number[][] = [];\n let totalTokens = 0;\n\n for (const text of texts) {\n const result = await this.embed(text);\n embeddings.push(result.embedding);\n totalTokens += result.tokensUsed;\n }\n\n return {\n embeddings,\n totalTokensUsed: totalTokens,\n };\n }\n\n getModelInfo(): EmbeddingModelInfo {\n return this.modelInfo;\n }\n}\n","import ignore, { Ignore } from \"ignore\";\nimport { existsSync, readFileSync, promises as fsPromises } from \"fs\";\nimport * as path from \"path\";\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 ];\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 (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 const regexPattern = pattern\n .replace(/\\*\\*/g, \"<<<DOUBLESTAR>>>\")\n .replace(/\\*/g, \"[^/]*\")\n .replace(/<<<DOUBLESTAR>>>/g, \".*\")\n .replace(/\\?/g, \".\")\n .replace(/\\{([^}]+)\\}/g, (_, p1) => `(${p1.split(\",\").join(\"|\")})`);\n\n const regex = new RegExp(`^${regexPattern}$`);\n return regex.test(filePath);\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): AsyncGenerator<{ path: string; size: number }> {\n const entries = await fsPromises.readdir(dir, { withFileTypes: true });\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 (ignoreFilter.ignores(relativePath)) {\n if (entry.isFile()) {\n skipped.push({ path: relativePath, reason: \"gitignore\" });\n }\n continue;\n }\n\n if (entry.isDirectory()) {\n yield* walkDirectory(\n fullPath,\n projectRoot,\n includePatterns,\n excludePatterns,\n ignoreFilter,\n maxFileSize,\n skipped\n );\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 yield { path: fullPath, size: stat.size };\n }\n }\n }\n}\n\nexport async function collectFiles(\n projectRoot: string,\n includePatterns: string[],\n excludePatterns: string[],\n maxFileSize: number\n): Promise<CollectFilesResult> {\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 )) {\n files.push(file);\n }\n\n return { files, skipped };\n}\n","import { EmbeddingModelInfo } from \"../config/schema.js\";\nimport { getProviderDisplayName, DetectedProvider } 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: EmbeddingModelInfo\n): number {\n return (estimatedTokens / 1_000_000) * modelInfo.costPer1MTokens;\n}\n\nexport function createCostEstimate(\n files: Array<{ path: string; size: number }>,\n provider: DetectedProvider\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 costFormatted = estimate.isFree\n ? \"Free\"\n : `~$${estimate.estimatedCost.toFixed(4)}`;\n\n return `\n┌─────────────────────────────────────────────────────────────────┐\n│ 📊 Indexing Estimate │\n├─────────────────────────────────────────────────────────────────┤\n│ │\n│ Files to index: ${padRight(estimate.filesCount.toLocaleString() + \" files\", 40)}│\n│ Total size: ${padRight(sizeFormatted, 40)}│\n│ Estimated chunks: ${padRight(\"~\" + estimate.estimatedChunks.toLocaleString() + \" chunks\", 40)}│\n│ Estimated tokens: ${padRight(\"~\" + estimate.estimatedTokens.toLocaleString() + \" tokens\", 40)}│\n│ │\n│ Provider: ${padRight(estimate.provider, 52)}│\n│ Model: ${padRight(estimate.model, 52)}│\n│ Cost: ${padRight(costFormatted, 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\nfunction padRight(str: string, length: number): string {\n return str.padEnd(length);\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 * as path from \"path\";\nimport * as os from \"os\";\nimport { fileURLToPath } from \"url\";\nimport { createRequire } from \"module\";\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 \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 } \n // Fallback to __dirname for CJS/bundled contexts\n else if (typeof __dirname !== 'undefined') {\n currentDir = __dirname;\n }\n // Last resort: use process.cwd() - shouldn't normally hit this\n else {\n currentDir = process.cwd();\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 isDevMode = currentDir.includes('/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 // eslint-disable-next-line @typescript-eslint/no-require-imports\n return require(nativePath);\n}\n\nconst native = getNativeBinding();\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\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 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\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\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; // Truncate individual chunks beyond this\n\nexport function estimateTokens(text: string): number {\n return Math.ceil(text.length / CHARS_PER_TOKEN);\n}\n\nexport function createEmbeddingText(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 parts.push(\"\");\n \n let content = chunk.content;\n const headerLength = parts.join(\"\\n\").length;\n const maxContentChars = (MAX_SINGLE_CHUNK_TOKENS * CHARS_PER_TOKEN) - headerLength;\n \n if (content.length > maxContentChars) {\n content = content.slice(0, maxContentChars) + \"\\n... [truncated]\";\n }\n \n parts.push(content);\n\n return parts.join(\"\\n\");\n}\n\nexport function createDynamicBatches(chunks: Array<{ text: string; [key: string]: any }>): Array<Array<{ text: string; [key: string]: any }>> {\n const batches: Array<Array<{ text: string; [key: string]: any }>> = [];\n let currentBatch: Array<{ text: string; [key: string]: any }> = [];\n let currentTokens = 0;\n \n for (const chunk of chunks) {\n const chunkTokens = estimateTokens(chunk.text);\n \n if (currentBatch.length > 0 && currentTokens + chunkTokens > MAX_BATCH_TOKENS) {\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","import { existsSync, readFileSync, writeFileSync } from \"fs\";\nimport * as path from \"path\";\n\ninterface InvertedIndexData {\n termToChunks: Record<string, string[]>;\n chunkTokens: Record<string, Record<string, number>>;\n avgDocLength: number;\n}\n\nexport class InvertedIndex {\n private indexPath: string;\n private termToChunks: Map<string, Set<string>> = new Map();\n private chunkTokens: Map<string, Map<string, number>> = new Map();\n private totalTokenCount = 0;\n\n constructor(indexPath: string) {\n this.indexPath = path.join(indexPath, \"inverted-index.json\");\n }\n\n load(): void {\n if (!existsSync(this.indexPath)) {\n return;\n }\n\n try {\n const content = readFileSync(this.indexPath, \"utf-8\");\n const data = JSON.parse(content) as InvertedIndexData;\n\n for (const [term, chunkIds] of Object.entries(data.termToChunks)) {\n this.termToChunks.set(term, new Set(chunkIds));\n }\n\n for (const [chunkId, tokens] of Object.entries(data.chunkTokens)) {\n const tokenMap = new Map(Object.entries(tokens).map(([k, v]) => [k, v as number]));\n this.chunkTokens.set(chunkId, tokenMap);\n for (const count of tokenMap.values()) {\n this.totalTokenCount += count;\n }\n }\n } catch {\n this.termToChunks.clear();\n this.chunkTokens.clear();\n this.totalTokenCount = 0;\n }\n }\n\n save(): void {\n const data: InvertedIndexData = {\n termToChunks: {},\n chunkTokens: {},\n avgDocLength: this.getAvgDocLength(),\n };\n\n for (const [term, chunkIds] of this.termToChunks) {\n data.termToChunks[term] = Array.from(chunkIds);\n }\n\n for (const [chunkId, tokens] of this.chunkTokens) {\n data.chunkTokens[chunkId] = Object.fromEntries(tokens);\n }\n\n writeFileSync(this.indexPath, JSON.stringify(data));\n }\n\n addChunk(chunkId: string, content: string): void {\n const tokens = this.tokenize(content);\n const termFreq = new Map<string, number>();\n\n for (const token of tokens) {\n termFreq.set(token, (termFreq.get(token) || 0) + 1);\n\n const chunks = this.termToChunks.get(token) || new Set();\n chunks.add(chunkId);\n this.termToChunks.set(token, chunks);\n }\n\n this.chunkTokens.set(chunkId, termFreq);\n this.totalTokenCount += tokens.length;\n }\n\n removeChunk(chunkId: string): void {\n const tokens = this.chunkTokens.get(chunkId);\n if (!tokens) return;\n\n for (const [token, count] of tokens) {\n this.totalTokenCount -= count;\n const chunks = this.termToChunks.get(token);\n if (chunks) {\n chunks.delete(chunkId);\n if (chunks.size === 0) {\n this.termToChunks.delete(token);\n }\n }\n }\n\n this.chunkTokens.delete(chunkId);\n }\n\n search(query: string): Map<string, number> {\n const queryTokens = this.tokenize(query);\n if (queryTokens.length === 0) {\n return new Map();\n }\n\n const candidateChunks = new Set<string>();\n for (const token of queryTokens) {\n const chunks = this.termToChunks.get(token);\n if (chunks) {\n for (const chunkId of chunks) {\n candidateChunks.add(chunkId);\n }\n }\n }\n\n const scores = new Map<string, number>();\n const k1 = 1.2;\n const b = 0.75;\n const N = this.chunkTokens.size;\n const avgDocLength = this.getAvgDocLength();\n\n for (const chunkId of candidateChunks) {\n const termFreq = this.chunkTokens.get(chunkId);\n if (!termFreq) continue;\n\n const docLength = Array.from(termFreq.values()).reduce((a, b) => a + b, 0);\n let score = 0;\n\n for (const term of queryTokens) {\n const tf = termFreq.get(term) || 0;\n if (tf === 0) continue;\n\n const df = this.termToChunks.get(term)?.size || 0;\n const idf = Math.log((N - df + 0.5) / (df + 0.5) + 1);\n\n const tfNorm = (tf * (k1 + 1)) / (tf + k1 * (1 - b + b * (docLength / avgDocLength)));\n score += idf * tfNorm;\n }\n\n scores.set(chunkId, score);\n }\n\n const maxScore = Math.max(...scores.values(), 1);\n for (const [chunkId, score] of scores) {\n scores.set(chunkId, score / maxScore);\n }\n\n return scores;\n }\n\n hasChunk(chunkId: string): boolean {\n return this.chunkTokens.has(chunkId);\n }\n\n clear(): void {\n this.termToChunks.clear();\n this.chunkTokens.clear();\n this.totalTokenCount = 0;\n }\n\n getDocumentCount(): number {\n return this.chunkTokens.size;\n }\n\n private getAvgDocLength(): number {\n const count = this.chunkTokens.size;\n return count > 0 ? this.totalTokenCount / count : 100;\n }\n\n private tokenize(text: string): string[] {\n return text\n .toLowerCase()\n .replace(/[^\\w\\s]/g, \" \")\n .split(/\\s+/)\n .filter((t) => t.length > 2);\n }\n}\n","/*! chokidar - MIT License (c) 2012 Paul Miller (paulmillr.com) */\nimport { EventEmitter } from 'node:events';\nimport { stat as statcb, Stats } from 'node:fs';\nimport { readdir, stat } from 'node:fs/promises';\nimport * as sp from 'node:path';\nimport { readdirp, ReaddirpStream } from 'readdirp';\nimport { EMPTY_FN, EVENTS as EV, isIBMi, isWindows, NodeFsHandler, STR_CLOSE, STR_END, } from './handler.js';\nconst SLASH = '/';\nconst SLASH_SLASH = '//';\nconst ONE_DOT = '.';\nconst TWO_DOTS = '..';\nconst STRING_TYPE = 'string';\nconst BACK_SLASH_RE = /\\\\/g;\nconst DOUBLE_SLASH_RE = /\\/\\//g;\nconst DOT_RE = /\\..*\\.(sw[px])$|~$|\\.subl.*\\.tmp/;\nconst REPLACER_RE = /^\\.[/\\\\]/;\nfunction arrify(item) {\n return Array.isArray(item) ? item : [item];\n}\nconst isMatcherObject = (matcher) => typeof matcher === 'object' && matcher !== null && !(matcher instanceof RegExp);\nfunction createPattern(matcher) {\n if (typeof matcher === 'function')\n return matcher;\n if (typeof matcher === 'string')\n return (string) => matcher === string;\n if (matcher instanceof RegExp)\n return (string) => matcher.test(string);\n if (typeof matcher === 'object' && matcher !== null) {\n return (string) => {\n if (matcher.path === string)\n return true;\n if (matcher.recursive) {\n const relative = sp.relative(matcher.path, string);\n if (!relative) {\n return false;\n }\n return !relative.startsWith('..') && !sp.isAbsolute(relative);\n }\n return false;\n };\n }\n return () => false;\n}\nfunction normalizePath(path) {\n if (typeof path !== 'string')\n throw new Error('string expected');\n path = sp.normalize(path);\n path = path.replace(/\\\\/g, '/');\n let prepend = false;\n if (path.startsWith('//'))\n prepend = true;\n path = path.replace(DOUBLE_SLASH_RE, '/');\n if (prepend)\n path = '/' + path;\n return path;\n}\nfunction matchPatterns(patterns, testString, stats) {\n const path = normalizePath(testString);\n for (let index = 0; index < patterns.length; index++) {\n const pattern = patterns[index];\n if (pattern(path, stats)) {\n return true;\n }\n }\n return false;\n}\nfunction anymatch(matchers, testString) {\n if (matchers == null) {\n throw new TypeError('anymatch: specify first argument');\n }\n // Early cache for matchers.\n const matchersArray = arrify(matchers);\n const patterns = matchersArray.map((matcher) => createPattern(matcher));\n if (testString == null) {\n return (testString, stats) => {\n return matchPatterns(patterns, testString, stats);\n };\n }\n return matchPatterns(patterns, testString);\n}\nconst unifyPaths = (paths_) => {\n const paths = arrify(paths_).flat();\n if (!paths.every((p) => typeof p === STRING_TYPE)) {\n throw new TypeError(`Non-string provided as watch path: ${paths}`);\n }\n return paths.map(normalizePathToUnix);\n};\n// If SLASH_SLASH occurs at the beginning of path, it is not replaced\n// because \"//StoragePC/DrivePool/Movies\" is a valid network path\nconst toUnix = (string) => {\n let str = string.replace(BACK_SLASH_RE, SLASH);\n let prepend = false;\n if (str.startsWith(SLASH_SLASH)) {\n prepend = true;\n }\n str = str.replace(DOUBLE_SLASH_RE, SLASH);\n if (prepend) {\n str = SLASH + str;\n }\n return str;\n};\n// Our version of upath.normalize\n// TODO: this is not equal to path-normalize module - investigate why\nconst normalizePathToUnix = (path) => toUnix(sp.normalize(toUnix(path)));\n// TODO: refactor\nconst normalizeIgnored = (cwd = '') => (path) => {\n if (typeof path === 'string') {\n return normalizePathToUnix(sp.isAbsolute(path) ? path : sp.join(cwd, path));\n }\n else {\n return path;\n }\n};\nconst getAbsolutePath = (path, cwd) => {\n if (sp.isAbsolute(path)) {\n return path;\n }\n return sp.join(cwd, path);\n};\nconst EMPTY_SET = Object.freeze(new Set());\n/**\n * Directory entry.\n */\nclass DirEntry {\n path;\n _removeWatcher;\n items;\n constructor(dir, removeWatcher) {\n this.path = dir;\n this._removeWatcher = removeWatcher;\n this.items = new Set();\n }\n add(item) {\n const { items } = this;\n if (!items)\n return;\n if (item !== ONE_DOT && item !== TWO_DOTS)\n items.add(item);\n }\n async remove(item) {\n const { items } = this;\n if (!items)\n return;\n items.delete(item);\n if (items.size > 0)\n return;\n const dir = this.path;\n try {\n await readdir(dir);\n }\n catch (err) {\n if (this._removeWatcher) {\n this._removeWatcher(sp.dirname(dir), sp.basename(dir));\n }\n }\n }\n has(item) {\n const { items } = this;\n if (!items)\n return;\n return items.has(item);\n }\n getChildren() {\n const { items } = this;\n if (!items)\n return [];\n return [...items.values()];\n }\n dispose() {\n this.items.clear();\n this.path = '';\n this._removeWatcher = EMPTY_FN;\n this.items = EMPTY_SET;\n Object.freeze(this);\n }\n}\nconst STAT_METHOD_F = 'stat';\nconst STAT_METHOD_L = 'lstat';\nexport class WatchHelper {\n fsw;\n path;\n watchPath;\n fullWatchPath;\n dirParts;\n followSymlinks;\n statMethod;\n constructor(path, follow, fsw) {\n this.fsw = fsw;\n const watchPath = path;\n this.path = path = path.replace(REPLACER_RE, '');\n this.watchPath = watchPath;\n this.fullWatchPath = sp.resolve(watchPath);\n this.dirParts = [];\n this.dirParts.forEach((parts) => {\n if (parts.length > 1)\n parts.pop();\n });\n this.followSymlinks = follow;\n this.statMethod = follow ? STAT_METHOD_F : STAT_METHOD_L;\n }\n entryPath(entry) {\n return sp.join(this.watchPath, sp.relative(this.watchPath, entry.fullPath));\n }\n filterPath(entry) {\n const { stats } = entry;\n if (stats && stats.isSymbolicLink())\n return this.filterDir(entry);\n const resolvedPath = this.entryPath(entry);\n // TODO: what if stats is undefined? remove !\n return this.fsw._isntIgnored(resolvedPath, stats) && this.fsw._hasReadPermissions(stats);\n }\n filterDir(entry) {\n return this.fsw._isntIgnored(this.entryPath(entry), entry.stats);\n }\n}\n/**\n * Watches files & directories for changes. Emitted events:\n * `add`, `addDir`, `change`, `unlink`, `unlinkDir`, `all`, `error`\n *\n * new FSWatcher()\n * .add(directories)\n * .on('add', path => log('File', path, 'was added'))\n */\nexport class FSWatcher extends EventEmitter {\n closed;\n options;\n _closers;\n _ignoredPaths;\n _throttled;\n _streams;\n _symlinkPaths;\n _watched;\n _pendingWrites;\n _pendingUnlinks;\n _readyCount;\n _emitReady;\n _closePromise;\n _userIgnored;\n _readyEmitted;\n _emitRaw;\n _boundRemove;\n _nodeFsHandler;\n // Not indenting methods for history sake; for now.\n constructor(_opts = {}) {\n super();\n this.closed = false;\n this._closers = new Map();\n this._ignoredPaths = new Set();\n this._throttled = new Map();\n this._streams = new Set();\n this._symlinkPaths = new Map();\n this._watched = new Map();\n this._pendingWrites = new Map();\n this._pendingUnlinks = new Map();\n this._readyCount = 0;\n this._readyEmitted = false;\n const awf = _opts.awaitWriteFinish;\n const DEF_AWF = { stabilityThreshold: 2000, pollInterval: 100 };\n const opts = {\n // Defaults\n persistent: true,\n ignoreInitial: false,\n ignorePermissionErrors: false,\n interval: 100,\n binaryInterval: 300,\n followSymlinks: true,\n usePolling: false,\n // useAsync: false,\n atomic: true, // NOTE: overwritten later (depends on usePolling)\n ..._opts,\n // Change format\n ignored: _opts.ignored ? arrify(_opts.ignored) : arrify([]),\n awaitWriteFinish: awf === true ? DEF_AWF : typeof awf === 'object' ? { ...DEF_AWF, ...awf } : false,\n };\n // Always default to polling on IBM i because fs.watch() is not available on IBM i.\n if (isIBMi)\n opts.usePolling = true;\n // Editor atomic write normalization enabled by default with fs.watch\n if (opts.atomic === undefined)\n opts.atomic = !opts.usePolling;\n // opts.atomic = typeof _opts.atomic === 'number' ? _opts.atomic : 100;\n // Global override. Useful for developers, who need to force polling for all\n // instances of chokidar, regardless of usage / dependency depth\n const envPoll = process.env.CHOKIDAR_USEPOLLING;\n if (envPoll !== undefined) {\n const envLower = envPoll.toLowerCase();\n if (envLower === 'false' || envLower === '0')\n opts.usePolling = false;\n else if (envLower === 'true' || envLower === '1')\n opts.usePolling = true;\n else\n opts.usePolling = !!envLower;\n }\n const envInterval = process.env.CHOKIDAR_INTERVAL;\n if (envInterval)\n opts.interval = Number.parseInt(envInterval, 10);\n // This is done to emit ready only once, but each 'add' will increase that?\n let readyCalls = 0;\n this._emitReady = () => {\n readyCalls++;\n if (readyCalls >= this._readyCount) {\n this._emitReady = EMPTY_FN;\n this._readyEmitted = true;\n // use process.nextTick to allow time for listener to be bound\n process.nextTick(() => this.emit(EV.READY));\n }\n };\n this._emitRaw = (...args) => this.emit(EV.RAW, ...args);\n this._boundRemove = this._remove.bind(this);\n this.options = opts;\n this._nodeFsHandler = new NodeFsHandler(this);\n // You’re frozen when your heart’s not open.\n Object.freeze(opts);\n }\n _addIgnoredPath(matcher) {\n if (isMatcherObject(matcher)) {\n // return early if we already have a deeply equal matcher object\n for (const ignored of this._ignoredPaths) {\n if (isMatcherObject(ignored) &&\n ignored.path === matcher.path &&\n ignored.recursive === matcher.recursive) {\n return;\n }\n }\n }\n this._ignoredPaths.add(matcher);\n }\n _removeIgnoredPath(matcher) {\n this._ignoredPaths.delete(matcher);\n // now find any matcher objects with the matcher as path\n if (typeof matcher === 'string') {\n for (const ignored of this._ignoredPaths) {\n // TODO (43081j): make this more efficient.\n // probably just make a `this._ignoredDirectories` or some\n // such thing.\n if (isMatcherObject(ignored) && ignored.path === matcher) {\n this._ignoredPaths.delete(ignored);\n }\n }\n }\n }\n // Public methods\n /**\n * Adds paths to be watched on an existing FSWatcher instance.\n * @param paths_ file or file list. Other arguments are unused\n */\n add(paths_, _origAdd, _internal) {\n const { cwd } = this.options;\n this.closed = false;\n this._closePromise = undefined;\n let paths = unifyPaths(paths_);\n if (cwd) {\n paths = paths.map((path) => {\n const absPath = getAbsolutePath(path, cwd);\n // Check `path` instead of `absPath` because the cwd portion can't be a glob\n return absPath;\n });\n }\n paths.forEach((path) => {\n this._removeIgnoredPath(path);\n });\n this._userIgnored = undefined;\n if (!this._readyCount)\n this._readyCount = 0;\n this._readyCount += paths.length;\n Promise.all(paths.map(async (path) => {\n const res = await this._nodeFsHandler._addToNodeFs(path, !_internal, undefined, 0, _origAdd);\n if (res)\n this._emitReady();\n return res;\n })).then((results) => {\n if (this.closed)\n return;\n results.forEach((item) => {\n if (item)\n this.add(sp.dirname(item), sp.basename(_origAdd || item));\n });\n });\n return this;\n }\n /**\n * Close watchers or start ignoring events from specified paths.\n */\n unwatch(paths_) {\n if (this.closed)\n return this;\n const paths = unifyPaths(paths_);\n const { cwd } = this.options;\n paths.forEach((path) => {\n // convert to absolute path unless relative path already matches\n if (!sp.isAbsolute(path) && !this._closers.has(path)) {\n if (cwd)\n path = sp.join(cwd, path);\n path = sp.resolve(path);\n }\n this._closePath(path);\n this._addIgnoredPath(path);\n if (this._watched.has(path)) {\n this._addIgnoredPath({\n path,\n recursive: true,\n });\n }\n // reset the cached userIgnored anymatch fn\n // to make ignoredPaths changes effective\n this._userIgnored = undefined;\n });\n return this;\n }\n /**\n * Close watchers and remove all listeners from watched paths.\n */\n close() {\n if (this._closePromise) {\n return this._closePromise;\n }\n this.closed = true;\n // Memory management.\n this.removeAllListeners();\n const closers = [];\n this._closers.forEach((closerList) => closerList.forEach((closer) => {\n const promise = closer();\n if (promise instanceof Promise)\n closers.push(promise);\n }));\n this._streams.forEach((stream) => stream.destroy());\n this._userIgnored = undefined;\n this._readyCount = 0;\n this._readyEmitted = false;\n this._watched.forEach((dirent) => dirent.dispose());\n this._closers.clear();\n this._watched.clear();\n this._streams.clear();\n this._symlinkPaths.clear();\n this._throttled.clear();\n this._closePromise = closers.length\n ? Promise.all(closers).then(() => undefined)\n : Promise.resolve();\n return this._closePromise;\n }\n /**\n * Expose list of watched paths\n * @returns for chaining\n */\n getWatched() {\n const watchList = {};\n this._watched.forEach((entry, dir) => {\n const key = this.options.cwd ? sp.relative(this.options.cwd, dir) : dir;\n const index = key || ONE_DOT;\n watchList[index] = entry.getChildren().sort();\n });\n return watchList;\n }\n emitWithAll(event, args) {\n this.emit(event, ...args);\n if (event !== EV.ERROR)\n this.emit(EV.ALL, event, ...args);\n }\n // Common helpers\n // --------------\n /**\n * Normalize and emit events.\n * Calling _emit DOES NOT MEAN emit() would be called!\n * @param event Type of event\n * @param path File or directory path\n * @param stats arguments to be passed with event\n * @returns the error if defined, otherwise the value of the FSWatcher instance's `closed` flag\n */\n async _emit(event, path, stats) {\n if (this.closed)\n return;\n const opts = this.options;\n if (isWindows)\n path = sp.normalize(path);\n if (opts.cwd)\n path = sp.relative(opts.cwd, path);\n const args = [path];\n if (stats != null)\n args.push(stats);\n const awf = opts.awaitWriteFinish;\n let pw;\n if (awf && (pw = this._pendingWrites.get(path))) {\n pw.lastChange = new Date();\n return this;\n }\n if (opts.atomic) {\n if (event === EV.UNLINK) {\n this._pendingUnlinks.set(path, [event, ...args]);\n setTimeout(() => {\n this._pendingUnlinks.forEach((entry, path) => {\n this.emit(...entry);\n this.emit(EV.ALL, ...entry);\n this._pendingUnlinks.delete(path);\n });\n }, typeof opts.atomic === 'number' ? opts.atomic : 100);\n return this;\n }\n if (event === EV.ADD && this._pendingUnlinks.has(path)) {\n event = EV.CHANGE;\n this._pendingUnlinks.delete(path);\n }\n }\n if (awf && (event === EV.ADD || event === EV.CHANGE) && this._readyEmitted) {\n const awfEmit = (err, stats) => {\n if (err) {\n event = EV.ERROR;\n args[0] = err;\n this.emitWithAll(event, args);\n }\n else if (stats) {\n // if stats doesn't exist the file must have been deleted\n if (args.length > 1) {\n args[1] = stats;\n }\n else {\n args.push(stats);\n }\n this.emitWithAll(event, args);\n }\n };\n this._awaitWriteFinish(path, awf.stabilityThreshold, event, awfEmit);\n return this;\n }\n if (event === EV.CHANGE) {\n const isThrottled = !this._throttle(EV.CHANGE, path, 50);\n if (isThrottled)\n return this;\n }\n if (opts.alwaysStat &&\n stats === undefined &&\n (event === EV.ADD || event === EV.ADD_DIR || event === EV.CHANGE)) {\n const fullPath = opts.cwd ? sp.join(opts.cwd, path) : path;\n let stats;\n try {\n stats = await stat(fullPath);\n }\n catch (err) {\n // do nothing\n }\n // Suppress event when fs_stat fails, to avoid sending undefined 'stat'\n if (!stats || this.closed)\n return;\n args.push(stats);\n }\n this.emitWithAll(event, args);\n return this;\n }\n /**\n * Common handler for errors\n * @returns The error if defined, otherwise the value of the FSWatcher instance's `closed` flag\n */\n _handleError(error) {\n const code = error && error.code;\n if (error &&\n code !== 'ENOENT' &&\n code !== 'ENOTDIR' &&\n (!this.options.ignorePermissionErrors || (code !== 'EPERM' && code !== 'EACCES'))) {\n this.emit(EV.ERROR, error);\n }\n return error || this.closed;\n }\n /**\n * Helper utility for throttling\n * @param actionType type being throttled\n * @param path being acted upon\n * @param timeout duration of time to suppress duplicate actions\n * @returns tracking object or false if action should be suppressed\n */\n _throttle(actionType, path, timeout) {\n if (!this._throttled.has(actionType)) {\n this._throttled.set(actionType, new Map());\n }\n const action = this._throttled.get(actionType);\n if (!action)\n throw new Error('invalid throttle');\n const actionPath = action.get(path);\n if (actionPath) {\n actionPath.count++;\n return false;\n }\n // eslint-disable-next-line prefer-const\n let timeoutObject;\n const clear = () => {\n const item = action.get(path);\n const count = item ? item.count : 0;\n action.delete(path);\n clearTimeout(timeoutObject);\n if (item)\n clearTimeout(item.timeoutObject);\n return count;\n };\n timeoutObject = setTimeout(clear, timeout);\n const thr = { timeoutObject, clear, count: 0 };\n action.set(path, thr);\n return thr;\n }\n _incrReadyCount() {\n return this._readyCount++;\n }\n /**\n * Awaits write operation to finish.\n * Polls a newly created file for size variations. When files size does not change for 'threshold' milliseconds calls callback.\n * @param path being acted upon\n * @param threshold Time in milliseconds a file size must be fixed before acknowledging write OP is finished\n * @param event\n * @param awfEmit Callback to be called when ready for event to be emitted.\n */\n _awaitWriteFinish(path, threshold, event, awfEmit) {\n const awf = this.options.awaitWriteFinish;\n if (typeof awf !== 'object')\n return;\n const pollInterval = awf.pollInterval;\n let timeoutHandler;\n let fullPath = path;\n if (this.options.cwd && !sp.isAbsolute(path)) {\n fullPath = sp.join(this.options.cwd, path);\n }\n const now = new Date();\n const writes = this._pendingWrites;\n function awaitWriteFinishFn(prevStat) {\n statcb(fullPath, (err, curStat) => {\n if (err || !writes.has(path)) {\n if (err && err.code !== 'ENOENT')\n awfEmit(err);\n return;\n }\n const now = Number(new Date());\n if (prevStat && curStat.size !== prevStat.size) {\n writes.get(path).lastChange = now;\n }\n const pw = writes.get(path);\n const df = now - pw.lastChange;\n if (df >= threshold) {\n writes.delete(path);\n awfEmit(undefined, curStat);\n }\n else {\n timeoutHandler = setTimeout(awaitWriteFinishFn, pollInterval, curStat);\n }\n });\n }\n if (!writes.has(path)) {\n writes.set(path, {\n lastChange: now,\n cancelWait: () => {\n writes.delete(path);\n clearTimeout(timeoutHandler);\n return event;\n },\n });\n timeoutHandler = setTimeout(awaitWriteFinishFn, pollInterval);\n }\n }\n /**\n * Determines whether user has asked to ignore this path.\n */\n _isIgnored(path, stats) {\n if (this.options.atomic && DOT_RE.test(path))\n return true;\n if (!this._userIgnored) {\n const { cwd } = this.options;\n const ign = this.options.ignored;\n const ignored = (ign || []).map(normalizeIgnored(cwd));\n const ignoredPaths = [...this._ignoredPaths];\n const list = [...ignoredPaths.map(normalizeIgnored(cwd)), ...ignored];\n this._userIgnored = anymatch(list, undefined);\n }\n return this._userIgnored(path, stats);\n }\n _isntIgnored(path, stat) {\n return !this._isIgnored(path, stat);\n }\n /**\n * Provides a set of common helpers and properties relating to symlink handling.\n * @param path file or directory pattern being watched\n */\n _getWatchHelpers(path) {\n return new WatchHelper(path, this.options.followSymlinks, this);\n }\n // Directory helpers\n // -----------------\n /**\n * Provides directory tracking objects\n * @param directory path of the directory\n */\n _getWatchedDir(directory) {\n const dir = sp.resolve(directory);\n if (!this._watched.has(dir))\n this._watched.set(dir, new DirEntry(dir, this._boundRemove));\n return this._watched.get(dir);\n }\n // File helpers\n // ------------\n /**\n * Check for read permissions: https://stackoverflow.com/a/11781404/1358405\n */\n _hasReadPermissions(stats) {\n if (this.options.ignorePermissionErrors)\n return true;\n return Boolean(Number(stats.mode) & 0o400);\n }\n /**\n * Handles emitting unlink events for\n * files and directories, and via recursion, for\n * files and directories within directories that are unlinked\n * @param directory within which the following item is located\n * @param item base path of item/directory\n */\n _remove(directory, item, isDirectory) {\n // if what is being deleted is a directory, get that directory's paths\n // for recursive deleting and cleaning of watched object\n // if it is not a directory, nestedDirectoryChildren will be empty array\n const path = sp.join(directory, item);\n const fullPath = sp.resolve(path);\n isDirectory =\n isDirectory != null ? isDirectory : this._watched.has(path) || this._watched.has(fullPath);\n // prevent duplicate handling in case of arriving here nearly simultaneously\n // via multiple paths (such as _handleFile and _handleDir)\n if (!this._throttle('remove', path, 100))\n return;\n // if the only watched file is removed, watch for its return\n if (!isDirectory && this._watched.size === 1) {\n this.add(directory, item, true);\n }\n // This will create a new entry in the watched object in either case\n // so we got to do the directory check beforehand\n const wp = this._getWatchedDir(path);\n const nestedDirectoryChildren = wp.getChildren();\n // Recursively remove children directories / files.\n nestedDirectoryChildren.forEach((nested) => this._remove(path, nested));\n // Check if item was on the watched list and remove it\n const parent = this._getWatchedDir(directory);\n const wasTracked = parent.has(item);\n parent.remove(item);\n // Fixes issue #1042 -> Relative paths were detected and added as symlinks\n // (https://github.com/paulmillr/chokidar/blob/e1753ddbc9571bdc33b4a4af172d52cb6e611c10/lib/nodefs-handler.js#L612),\n // but never removed from the map in case the path was deleted.\n // This leads to an incorrect state if the path was recreated:\n // https://github.com/paulmillr/chokidar/blob/e1753ddbc9571bdc33b4a4af172d52cb6e611c10/lib/nodefs-handler.js#L553\n if (this._symlinkPaths.has(fullPath)) {\n this._symlinkPaths.delete(fullPath);\n }\n // If we wait for this file to be fully written, cancel the wait.\n let relPath = path;\n if (this.options.cwd)\n relPath = sp.relative(this.options.cwd, path);\n if (this.options.awaitWriteFinish && this._pendingWrites.has(relPath)) {\n const event = this._pendingWrites.get(relPath).cancelWait();\n if (event === EV.ADD)\n return;\n }\n // The Entry will either be a directory that just got removed\n // or a bogus entry to a file, in either case we have to remove it\n this._watched.delete(path);\n this._watched.delete(fullPath);\n const eventName = isDirectory ? EV.UNLINK_DIR : EV.UNLINK;\n if (wasTracked && !this._isIgnored(path))\n this._emit(eventName, path);\n // Avoid conflicts if we later create another file with the same name\n this._closePath(path);\n }\n /**\n * Closes all watchers for a path\n */\n _closePath(path) {\n this._closeFile(path);\n const dir = sp.dirname(path);\n this._getWatchedDir(dir).remove(sp.basename(path));\n }\n /**\n * Closes only file-specific watchers\n */\n _closeFile(path) {\n const closers = this._closers.get(path);\n if (!closers)\n return;\n closers.forEach((closer) => closer());\n this._closers.delete(path);\n }\n _addPathCloser(path, closer) {\n if (!closer)\n return;\n let list = this._closers.get(path);\n if (!list) {\n list = [];\n this._closers.set(path, list);\n }\n list.push(closer);\n }\n _readdirp(root, opts) {\n if (this.closed)\n return;\n const options = { type: EV.ALL, alwaysStat: true, lstat: true, ...opts, depth: 0 };\n let stream = readdirp(root, options);\n this._streams.add(stream);\n stream.once(STR_CLOSE, () => {\n stream = undefined;\n });\n stream.once(STR_END, () => {\n if (stream) {\n this._streams.delete(stream);\n stream = undefined;\n }\n });\n return stream;\n }\n}\n/**\n * Instantiates watcher with paths to be tracked.\n * @param paths file / directory paths\n * @param options opts, such as `atomic`, `awaitWriteFinish`, `ignored`, and others\n * @returns an instance of FSWatcher for chaining.\n * @example\n * const watcher = watch('.').on('all', (event, path) => { console.log(event, path); });\n * watch('.', { atomic: true, awaitWriteFinish: true, ignored: (f, stats) => stats?.isFile() && !f.endsWith('.js') })\n */\nexport function watch(paths, options = {}) {\n const watcher = new FSWatcher(options);\n watcher.add(paths);\n return watcher;\n}\nexport default { watch: watch, FSWatcher: FSWatcher };\n","import { lstat, readdir, realpath, stat } from 'node:fs/promises';\nimport { join as pjoin, relative as prelative, resolve as presolve, sep as psep } from 'node:path';\nimport { Readable } from 'node:stream';\nexport const EntryTypes = {\n FILE_TYPE: 'files',\n DIR_TYPE: 'directories',\n FILE_DIR_TYPE: 'files_directories',\n EVERYTHING_TYPE: 'all',\n};\nconst defaultOptions = {\n root: '.',\n fileFilter: (_entryInfo) => true,\n directoryFilter: (_entryInfo) => true,\n type: EntryTypes.FILE_TYPE,\n lstat: false,\n depth: 2147483648,\n alwaysStat: false,\n highWaterMark: 4096,\n};\nObject.freeze(defaultOptions);\nconst RECURSIVE_ERROR_CODE = 'READDIRP_RECURSIVE_ERROR';\nconst NORMAL_FLOW_ERRORS = new Set(['ENOENT', 'EPERM', 'EACCES', 'ELOOP', RECURSIVE_ERROR_CODE]);\nconst ALL_TYPES = [\n EntryTypes.DIR_TYPE,\n EntryTypes.EVERYTHING_TYPE,\n EntryTypes.FILE_DIR_TYPE,\n EntryTypes.FILE_TYPE,\n];\nconst DIR_TYPES = new Set([\n EntryTypes.DIR_TYPE,\n EntryTypes.EVERYTHING_TYPE,\n EntryTypes.FILE_DIR_TYPE,\n]);\nconst FILE_TYPES = new Set([\n EntryTypes.EVERYTHING_TYPE,\n EntryTypes.FILE_DIR_TYPE,\n EntryTypes.FILE_TYPE,\n]);\nconst isNormalFlowError = (error) => NORMAL_FLOW_ERRORS.has(error.code);\nconst wantBigintFsStats = process.platform === 'win32';\nconst emptyFn = (_entryInfo) => true;\nconst normalizeFilter = (filter) => {\n if (filter === undefined)\n return emptyFn;\n if (typeof filter === 'function')\n return filter;\n if (typeof filter === 'string') {\n const fl = filter.trim();\n return (entry) => entry.basename === fl;\n }\n if (Array.isArray(filter)) {\n const trItems = filter.map((item) => item.trim());\n return (entry) => trItems.some((f) => entry.basename === f);\n }\n return emptyFn;\n};\n/** Readable readdir stream, emitting new files as they're being listed. */\nexport class ReaddirpStream extends Readable {\n parents;\n reading;\n parent;\n _stat;\n _maxDepth;\n _wantsDir;\n _wantsFile;\n _wantsEverything;\n _root;\n _isDirent;\n _statsProp;\n _rdOptions;\n _fileFilter;\n _directoryFilter;\n constructor(options = {}) {\n super({\n objectMode: true,\n autoDestroy: true,\n highWaterMark: options.highWaterMark,\n });\n const opts = { ...defaultOptions, ...options };\n const { root, type } = opts;\n this._fileFilter = normalizeFilter(opts.fileFilter);\n this._directoryFilter = normalizeFilter(opts.directoryFilter);\n const statMethod = opts.lstat ? lstat : stat;\n // Use bigint stats if it's windows and stat() supports options (node 10+).\n if (wantBigintFsStats) {\n this._stat = (path) => statMethod(path, { bigint: true });\n }\n else {\n this._stat = statMethod;\n }\n this._maxDepth =\n opts.depth != null && Number.isSafeInteger(opts.depth) ? opts.depth : defaultOptions.depth;\n this._wantsDir = type ? DIR_TYPES.has(type) : false;\n this._wantsFile = type ? FILE_TYPES.has(type) : false;\n this._wantsEverything = type === EntryTypes.EVERYTHING_TYPE;\n this._root = presolve(root);\n this._isDirent = !opts.alwaysStat;\n this._statsProp = this._isDirent ? 'dirent' : 'stats';\n this._rdOptions = { encoding: 'utf8', withFileTypes: this._isDirent };\n // Launch stream with one parent, the root dir.\n this.parents = [this._exploreDir(root, 1)];\n this.reading = false;\n this.parent = undefined;\n }\n async _read(batch) {\n if (this.reading)\n return;\n this.reading = true;\n try {\n while (!this.destroyed && batch > 0) {\n const par = this.parent;\n const fil = par && par.files;\n if (fil && fil.length > 0) {\n const { path, depth } = par;\n const slice = fil.splice(0, batch).map((dirent) => this._formatEntry(dirent, path));\n const awaited = await Promise.all(slice);\n for (const entry of awaited) {\n if (!entry)\n continue;\n if (this.destroyed)\n return;\n const entryType = await this._getEntryType(entry);\n if (entryType === 'directory' && this._directoryFilter(entry)) {\n if (depth <= this._maxDepth) {\n this.parents.push(this._exploreDir(entry.fullPath, depth + 1));\n }\n if (this._wantsDir) {\n this.push(entry);\n batch--;\n }\n }\n else if ((entryType === 'file' || this._includeAsFile(entry)) &&\n this._fileFilter(entry)) {\n if (this._wantsFile) {\n this.push(entry);\n batch--;\n }\n }\n }\n }\n else {\n const parent = this.parents.pop();\n if (!parent) {\n this.push(null);\n break;\n }\n this.parent = await parent;\n if (this.destroyed)\n return;\n }\n }\n }\n catch (error) {\n this.destroy(error);\n }\n finally {\n this.reading = false;\n }\n }\n async _exploreDir(path, depth) {\n let files;\n try {\n files = await readdir(path, this._rdOptions);\n }\n catch (error) {\n this._onError(error);\n }\n return { files, depth, path };\n }\n async _formatEntry(dirent, path) {\n let entry;\n const basename = this._isDirent ? dirent.name : dirent;\n try {\n const fullPath = presolve(pjoin(path, basename));\n entry = { path: prelative(this._root, fullPath), fullPath, basename };\n entry[this._statsProp] = this._isDirent ? dirent : await this._stat(fullPath);\n }\n catch (err) {\n this._onError(err);\n return;\n }\n return entry;\n }\n _onError(err) {\n if (isNormalFlowError(err) && !this.destroyed) {\n this.emit('warn', err);\n }\n else {\n this.destroy(err);\n }\n }\n async _getEntryType(entry) {\n // entry may be undefined, because a warning or an error were emitted\n // and the statsProp is undefined\n if (!entry && this._statsProp in entry) {\n return '';\n }\n const stats = entry[this._statsProp];\n if (stats.isFile())\n return 'file';\n if (stats.isDirectory())\n return 'directory';\n if (stats && stats.isSymbolicLink()) {\n const full = entry.fullPath;\n try {\n const entryRealPath = await realpath(full);\n const entryRealPathStats = await lstat(entryRealPath);\n if (entryRealPathStats.isFile()) {\n return 'file';\n }\n if (entryRealPathStats.isDirectory()) {\n const len = entryRealPath.length;\n if (full.startsWith(entryRealPath) && full.substr(len, 1) === psep) {\n const recursiveError = new Error(`Circular symlink detected: \"${full}\" points to \"${entryRealPath}\"`);\n // @ts-ignore\n recursiveError.code = RECURSIVE_ERROR_CODE;\n return this._onError(recursiveError);\n }\n return 'directory';\n }\n }\n catch (error) {\n this._onError(error);\n return '';\n }\n }\n }\n _includeAsFile(entry) {\n const stats = entry && entry[this._statsProp];\n return stats && this._wantsEverything && !stats.isDirectory();\n }\n}\n/**\n * Streaming version: Reads all files and directories in given root recursively.\n * Consumes ~constant small amount of RAM.\n * @param root Root directory\n * @param options Options to specify root (start directory), filters and recursion depth\n */\nexport function readdirp(root, options = {}) {\n // @ts-ignore\n let type = options.entryType || options.type;\n if (type === 'both')\n type = EntryTypes.FILE_DIR_TYPE; // backwards-compatibility\n if (type)\n options.type = type;\n if (!root) {\n throw new Error('readdirp: root argument is required. Usage: readdirp(root, options)');\n }\n else if (typeof root !== 'string') {\n throw new TypeError('readdirp: root argument must be a string. Usage: readdirp(root, options)');\n }\n else if (type && !ALL_TYPES.includes(type)) {\n throw new Error(`readdirp: Invalid type passed. Use one of ${ALL_TYPES.join(', ')}`);\n }\n options.root = root;\n return new ReaddirpStream(options);\n}\n/**\n * Promise version: Reads all files and directories in given root recursively.\n * Compared to streaming version, will consume a lot of RAM e.g. when 1 million files are listed.\n * @returns array of paths and their entry infos\n */\nexport function readdirpPromise(root, options = {}) {\n return new Promise((resolve, reject) => {\n const files = [];\n readdirp(root, options)\n .on('data', (entry) => files.push(entry))\n .on('end', () => resolve(files))\n .on('error', (error) => reject(error));\n });\n}\nexport default readdirp;\n","import { watch as fs_watch, unwatchFile, watchFile } from 'node:fs';\nimport { realpath as fsrealpath, lstat, open, stat } from 'node:fs/promises';\nimport { type as osType } from 'node:os';\nimport * as sp from 'node:path';\nexport const STR_DATA = 'data';\nexport const STR_END = 'end';\nexport const STR_CLOSE = 'close';\nexport const EMPTY_FN = () => { };\nexport const IDENTITY_FN = (val) => val;\nconst pl = process.platform;\nexport const isWindows = pl === 'win32';\nexport const isMacos = pl === 'darwin';\nexport const isLinux = pl === 'linux';\nexport const isFreeBSD = pl === 'freebsd';\nexport const isIBMi = osType() === 'OS400';\nexport const EVENTS = {\n ALL: 'all',\n READY: 'ready',\n ADD: 'add',\n CHANGE: 'change',\n ADD_DIR: 'addDir',\n UNLINK: 'unlink',\n UNLINK_DIR: 'unlinkDir',\n RAW: 'raw',\n ERROR: 'error',\n};\nconst EV = EVENTS;\nconst THROTTLE_MODE_WATCH = 'watch';\nconst statMethods = { lstat, stat };\nconst KEY_LISTENERS = 'listeners';\nconst KEY_ERR = 'errHandlers';\nconst KEY_RAW = 'rawEmitters';\nconst HANDLER_KEYS = [KEY_LISTENERS, KEY_ERR, KEY_RAW];\n// prettier-ignore\nconst binaryExtensions = new Set([\n '3dm', '3ds', '3g2', '3gp', '7z', 'a', 'aac', 'adp', 'afdesign', 'afphoto', 'afpub', 'ai',\n 'aif', 'aiff', 'alz', 'ape', 'apk', 'appimage', 'ar', 'arj', 'asf', 'au', 'avi',\n 'bak', 'baml', 'bh', 'bin', 'bk', 'bmp', 'btif', 'bz2', 'bzip2',\n 'cab', 'caf', 'cgm', 'class', 'cmx', 'cpio', 'cr2', 'cur', 'dat', 'dcm', 'deb', 'dex', 'djvu',\n 'dll', 'dmg', 'dng', 'doc', 'docm', 'docx', 'dot', 'dotm', 'dra', 'DS_Store', 'dsk', 'dts',\n 'dtshd', 'dvb', 'dwg', 'dxf',\n 'ecelp4800', 'ecelp7470', 'ecelp9600', 'egg', 'eol', 'eot', 'epub', 'exe',\n 'f4v', 'fbs', 'fh', 'fla', 'flac', 'flatpak', 'fli', 'flv', 'fpx', 'fst', 'fvt',\n 'g3', 'gh', 'gif', 'graffle', 'gz', 'gzip',\n 'h261', 'h263', 'h264', 'icns', 'ico', 'ief', 'img', 'ipa', 'iso',\n 'jar', 'jpeg', 'jpg', 'jpgv', 'jpm', 'jxr', 'key', 'ktx',\n 'lha', 'lib', 'lvp', 'lz', 'lzh', 'lzma', 'lzo',\n 'm3u', 'm4a', 'm4v', 'mar', 'mdi', 'mht', 'mid', 'midi', 'mj2', 'mka', 'mkv', 'mmr', 'mng',\n 'mobi', 'mov', 'movie', 'mp3',\n 'mp4', 'mp4a', 'mpeg', 'mpg', 'mpga', 'mxu',\n 'nef', 'npx', 'numbers', 'nupkg',\n 'o', 'odp', 'ods', 'odt', 'oga', 'ogg', 'ogv', 'otf', 'ott',\n 'pages', 'pbm', 'pcx', 'pdb', 'pdf', 'pea', 'pgm', 'pic', 'png', 'pnm', 'pot', 'potm',\n 'potx', 'ppa', 'ppam',\n 'ppm', 'pps', 'ppsm', 'ppsx', 'ppt', 'pptm', 'pptx', 'psd', 'pya', 'pyc', 'pyo', 'pyv',\n 'qt',\n 'rar', 'ras', 'raw', 'resources', 'rgb', 'rip', 'rlc', 'rmf', 'rmvb', 'rpm', 'rtf', 'rz',\n 's3m', 's7z', 'scpt', 'sgi', 'shar', 'snap', 'sil', 'sketch', 'slk', 'smv', 'snk', 'so',\n 'stl', 'suo', 'sub', 'swf',\n 'tar', 'tbz', 'tbz2', 'tga', 'tgz', 'thmx', 'tif', 'tiff', 'tlz', 'ttc', 'ttf', 'txz',\n 'udf', 'uvh', 'uvi', 'uvm', 'uvp', 'uvs', 'uvu',\n 'viv', 'vob',\n 'war', 'wav', 'wax', 'wbmp', 'wdp', 'weba', 'webm', 'webp', 'whl', 'wim', 'wm', 'wma',\n 'wmv', 'wmx', 'woff', 'woff2', 'wrm', 'wvx',\n 'xbm', 'xif', 'xla', 'xlam', 'xls', 'xlsb', 'xlsm', 'xlsx', 'xlt', 'xltm', 'xltx', 'xm',\n 'xmind', 'xpi', 'xpm', 'xwd', 'xz',\n 'z', 'zip', 'zipx',\n]);\nconst isBinaryPath = (filePath) => binaryExtensions.has(sp.extname(filePath).slice(1).toLowerCase());\n// TODO: emit errors properly. Example: EMFILE on Macos.\nconst foreach = (val, fn) => {\n if (val instanceof Set) {\n val.forEach(fn);\n }\n else {\n fn(val);\n }\n};\nconst addAndConvert = (main, prop, item) => {\n let container = main[prop];\n if (!(container instanceof Set)) {\n main[prop] = container = new Set([container]);\n }\n container.add(item);\n};\nconst clearItem = (cont) => (key) => {\n const set = cont[key];\n if (set instanceof Set) {\n set.clear();\n }\n else {\n delete cont[key];\n }\n};\nconst delFromSet = (main, prop, item) => {\n const container = main[prop];\n if (container instanceof Set) {\n container.delete(item);\n }\n else if (container === item) {\n delete main[prop];\n }\n};\nconst isEmptySet = (val) => (val instanceof Set ? val.size === 0 : !val);\nconst FsWatchInstances = new Map();\n/**\n * Instantiates the fs_watch interface\n * @param path to be watched\n * @param options to be passed to fs_watch\n * @param listener main event handler\n * @param errHandler emits info about errors\n * @param emitRaw emits raw event data\n * @returns {NativeFsWatcher}\n */\nfunction createFsWatchInstance(path, options, listener, errHandler, emitRaw) {\n const handleEvent = (rawEvent, evPath) => {\n listener(path);\n emitRaw(rawEvent, evPath, { watchedPath: path });\n // emit based on events occurring for files from a directory's watcher in\n // case the file's watcher misses it (and rely on throttling to de-dupe)\n if (evPath && path !== evPath) {\n fsWatchBroadcast(sp.resolve(path, evPath), KEY_LISTENERS, sp.join(path, evPath));\n }\n };\n try {\n return fs_watch(path, {\n persistent: options.persistent,\n }, handleEvent);\n }\n catch (error) {\n errHandler(error);\n return undefined;\n }\n}\n/**\n * Helper for passing fs_watch event data to a collection of listeners\n * @param fullPath absolute path bound to fs_watch instance\n */\nconst fsWatchBroadcast = (fullPath, listenerType, val1, val2, val3) => {\n const cont = FsWatchInstances.get(fullPath);\n if (!cont)\n return;\n foreach(cont[listenerType], (listener) => {\n listener(val1, val2, val3);\n });\n};\n/**\n * Instantiates the fs_watch interface or binds listeners\n * to an existing one covering the same file system entry\n * @param path\n * @param fullPath absolute path\n * @param options to be passed to fs_watch\n * @param handlers container for event listener functions\n */\nconst setFsWatchListener = (path, fullPath, options, handlers) => {\n const { listener, errHandler, rawEmitter } = handlers;\n let cont = FsWatchInstances.get(fullPath);\n let watcher;\n if (!options.persistent) {\n watcher = createFsWatchInstance(path, options, listener, errHandler, rawEmitter);\n if (!watcher)\n return;\n return watcher.close.bind(watcher);\n }\n if (cont) {\n addAndConvert(cont, KEY_LISTENERS, listener);\n addAndConvert(cont, KEY_ERR, errHandler);\n addAndConvert(cont, KEY_RAW, rawEmitter);\n }\n else {\n watcher = createFsWatchInstance(path, options, fsWatchBroadcast.bind(null, fullPath, KEY_LISTENERS), errHandler, // no need to use broadcast here\n fsWatchBroadcast.bind(null, fullPath, KEY_RAW));\n if (!watcher)\n return;\n watcher.on(EV.ERROR, async (error) => {\n const broadcastErr = fsWatchBroadcast.bind(null, fullPath, KEY_ERR);\n if (cont)\n cont.watcherUnusable = true; // documented since Node 10.4.1\n // Workaround for https://github.com/joyent/node/issues/4337\n if (isWindows && error.code === 'EPERM') {\n try {\n const fd = await open(path, 'r');\n await fd.close();\n broadcastErr(error);\n }\n catch (err) {\n // do nothing\n }\n }\n else {\n broadcastErr(error);\n }\n });\n cont = {\n listeners: listener,\n errHandlers: errHandler,\n rawEmitters: rawEmitter,\n watcher,\n };\n FsWatchInstances.set(fullPath, cont);\n }\n // const index = cont.listeners.indexOf(listener);\n // removes this instance's listeners and closes the underlying fs_watch\n // instance if there are no more listeners left\n return () => {\n delFromSet(cont, KEY_LISTENERS, listener);\n delFromSet(cont, KEY_ERR, errHandler);\n delFromSet(cont, KEY_RAW, rawEmitter);\n if (isEmptySet(cont.listeners)) {\n // Check to protect against issue gh-730.\n // if (cont.watcherUnusable) {\n cont.watcher.close();\n // }\n FsWatchInstances.delete(fullPath);\n HANDLER_KEYS.forEach(clearItem(cont));\n // @ts-ignore\n cont.watcher = undefined;\n Object.freeze(cont);\n }\n };\n};\n// fs_watchFile helpers\n// object to hold per-process fs_watchFile instances\n// (may be shared across chokidar FSWatcher instances)\nconst FsWatchFileInstances = new Map();\n/**\n * Instantiates the fs_watchFile interface or binds listeners\n * to an existing one covering the same file system entry\n * @param path to be watched\n * @param fullPath absolute path\n * @param options options to be passed to fs_watchFile\n * @param handlers container for event listener functions\n * @returns closer\n */\nconst setFsWatchFileListener = (path, fullPath, options, handlers) => {\n const { listener, rawEmitter } = handlers;\n let cont = FsWatchFileInstances.get(fullPath);\n // let listeners = new Set();\n // let rawEmitters = new Set();\n const copts = cont && cont.options;\n if (copts && (copts.persistent < options.persistent || copts.interval > options.interval)) {\n // \"Upgrade\" the watcher to persistence or a quicker interval.\n // This creates some unlikely edge case issues if the user mixes\n // settings in a very weird way, but solving for those cases\n // doesn't seem worthwhile for the added complexity.\n // listeners = cont.listeners;\n // rawEmitters = cont.rawEmitters;\n unwatchFile(fullPath);\n cont = undefined;\n }\n if (cont) {\n addAndConvert(cont, KEY_LISTENERS, listener);\n addAndConvert(cont, KEY_RAW, rawEmitter);\n }\n else {\n // TODO\n // listeners.add(listener);\n // rawEmitters.add(rawEmitter);\n cont = {\n listeners: listener,\n rawEmitters: rawEmitter,\n options,\n watcher: watchFile(fullPath, options, (curr, prev) => {\n foreach(cont.rawEmitters, (rawEmitter) => {\n rawEmitter(EV.CHANGE, fullPath, { curr, prev });\n });\n const currmtime = curr.mtimeMs;\n if (curr.size !== prev.size || currmtime > prev.mtimeMs || currmtime === 0) {\n foreach(cont.listeners, (listener) => listener(path, curr));\n }\n }),\n };\n FsWatchFileInstances.set(fullPath, cont);\n }\n // const index = cont.listeners.indexOf(listener);\n // Removes this instance's listeners and closes the underlying fs_watchFile\n // instance if there are no more listeners left.\n return () => {\n delFromSet(cont, KEY_LISTENERS, listener);\n delFromSet(cont, KEY_RAW, rawEmitter);\n if (isEmptySet(cont.listeners)) {\n FsWatchFileInstances.delete(fullPath);\n unwatchFile(fullPath);\n cont.options = cont.watcher = undefined;\n Object.freeze(cont);\n }\n };\n};\n/**\n * @mixin\n */\nexport class NodeFsHandler {\n fsw;\n _boundHandleError;\n constructor(fsW) {\n this.fsw = fsW;\n this._boundHandleError = (error) => fsW._handleError(error);\n }\n /**\n * Watch file for changes with fs_watchFile or fs_watch.\n * @param path to file or dir\n * @param listener on fs change\n * @returns closer for the watcher instance\n */\n _watchWithNodeFs(path, listener) {\n const opts = this.fsw.options;\n const directory = sp.dirname(path);\n const basename = sp.basename(path);\n const parent = this.fsw._getWatchedDir(directory);\n parent.add(basename);\n const absolutePath = sp.resolve(path);\n const options = {\n persistent: opts.persistent,\n };\n if (!listener)\n listener = EMPTY_FN;\n let closer;\n if (opts.usePolling) {\n const enableBin = opts.interval !== opts.binaryInterval;\n options.interval = enableBin && isBinaryPath(basename) ? opts.binaryInterval : opts.interval;\n closer = setFsWatchFileListener(path, absolutePath, options, {\n listener,\n rawEmitter: this.fsw._emitRaw,\n });\n }\n else {\n closer = setFsWatchListener(path, absolutePath, options, {\n listener,\n errHandler: this._boundHandleError,\n rawEmitter: this.fsw._emitRaw,\n });\n }\n return closer;\n }\n /**\n * Watch a file and emit add event if warranted.\n * @returns closer for the watcher instance\n */\n _handleFile(file, stats, initialAdd) {\n if (this.fsw.closed) {\n return;\n }\n const dirname = sp.dirname(file);\n const basename = sp.basename(file);\n const parent = this.fsw._getWatchedDir(dirname);\n // stats is always present\n let prevStats = stats;\n // if the file is already being watched, do nothing\n if (parent.has(basename))\n return;\n const listener = async (path, newStats) => {\n if (!this.fsw._throttle(THROTTLE_MODE_WATCH, file, 5))\n return;\n if (!newStats || newStats.mtimeMs === 0) {\n try {\n const newStats = await stat(file);\n if (this.fsw.closed)\n return;\n // Check that change event was not fired because of changed only accessTime.\n const at = newStats.atimeMs;\n const mt = newStats.mtimeMs;\n if (!at || at <= mt || mt !== prevStats.mtimeMs) {\n this.fsw._emit(EV.CHANGE, file, newStats);\n }\n if ((isMacos || isLinux || isFreeBSD) && prevStats.ino !== newStats.ino) {\n this.fsw._closeFile(path);\n prevStats = newStats;\n const closer = this._watchWithNodeFs(file, listener);\n if (closer)\n this.fsw._addPathCloser(path, closer);\n }\n else {\n prevStats = newStats;\n }\n }\n catch (error) {\n // Fix issues where mtime is null but file is still present\n this.fsw._remove(dirname, basename);\n }\n // add is about to be emitted if file not already tracked in parent\n }\n else if (parent.has(basename)) {\n // Check that change event was not fired because of changed only accessTime.\n const at = newStats.atimeMs;\n const mt = newStats.mtimeMs;\n if (!at || at <= mt || mt !== prevStats.mtimeMs) {\n this.fsw._emit(EV.CHANGE, file, newStats);\n }\n prevStats = newStats;\n }\n };\n // kick off the watcher\n const closer = this._watchWithNodeFs(file, listener);\n // emit an add event if we're supposed to\n if (!(initialAdd && this.fsw.options.ignoreInitial) && this.fsw._isntIgnored(file)) {\n if (!this.fsw._throttle(EV.ADD, file, 0))\n return;\n this.fsw._emit(EV.ADD, file, stats);\n }\n return closer;\n }\n /**\n * Handle symlinks encountered while reading a dir.\n * @param entry returned by readdirp\n * @param directory path of dir being read\n * @param path of this item\n * @param item basename of this item\n * @returns true if no more processing is needed for this entry.\n */\n async _handleSymlink(entry, directory, path, item) {\n if (this.fsw.closed) {\n return;\n }\n const full = entry.fullPath;\n const dir = this.fsw._getWatchedDir(directory);\n if (!this.fsw.options.followSymlinks) {\n // watch symlink directly (don't follow) and detect changes\n this.fsw._incrReadyCount();\n let linkPath;\n try {\n linkPath = await fsrealpath(path);\n }\n catch (e) {\n this.fsw._emitReady();\n return true;\n }\n if (this.fsw.closed)\n return;\n if (dir.has(item)) {\n if (this.fsw._symlinkPaths.get(full) !== linkPath) {\n this.fsw._symlinkPaths.set(full, linkPath);\n this.fsw._emit(EV.CHANGE, path, entry.stats);\n }\n }\n else {\n dir.add(item);\n this.fsw._symlinkPaths.set(full, linkPath);\n this.fsw._emit(EV.ADD, path, entry.stats);\n }\n this.fsw._emitReady();\n return true;\n }\n // don't follow the same symlink more than once\n if (this.fsw._symlinkPaths.has(full)) {\n return true;\n }\n this.fsw._symlinkPaths.set(full, true);\n }\n _handleRead(directory, initialAdd, wh, target, dir, depth, throttler) {\n // Normalize the directory name on Windows\n directory = sp.join(directory, '');\n const throttleKey = target ? `${directory}:${target}` : directory;\n throttler = this.fsw._throttle('readdir', throttleKey, 1000);\n if (!throttler)\n return;\n const previous = this.fsw._getWatchedDir(wh.path);\n const current = new Set();\n let stream = this.fsw._readdirp(directory, {\n fileFilter: (entry) => wh.filterPath(entry),\n directoryFilter: (entry) => wh.filterDir(entry),\n });\n if (!stream)\n return;\n stream\n .on(STR_DATA, async (entry) => {\n if (this.fsw.closed) {\n stream = undefined;\n return;\n }\n const item = entry.path;\n let path = sp.join(directory, item);\n current.add(item);\n if (entry.stats.isSymbolicLink() &&\n (await this._handleSymlink(entry, directory, path, item))) {\n return;\n }\n if (this.fsw.closed) {\n stream = undefined;\n return;\n }\n // Files that present in current directory snapshot\n // but absent in previous are added to watch list and\n // emit `add` event.\n if (item === target || (!target && !previous.has(item))) {\n this.fsw._incrReadyCount();\n // ensure relativeness of path is preserved in case of watcher reuse\n path = sp.join(dir, sp.relative(dir, path));\n this._addToNodeFs(path, initialAdd, wh, depth + 1);\n }\n })\n .on(EV.ERROR, this._boundHandleError);\n return new Promise((resolve, reject) => {\n if (!stream)\n return reject();\n stream.once(STR_END, () => {\n if (this.fsw.closed) {\n stream = undefined;\n return;\n }\n const wasThrottled = throttler ? throttler.clear() : false;\n resolve(undefined);\n // Files that absent in current directory snapshot\n // but present in previous emit `remove` event\n // and are removed from @watched[directory].\n previous\n .getChildren()\n .filter((item) => {\n return item !== directory && !current.has(item);\n })\n .forEach((item) => {\n this.fsw._remove(directory, item);\n });\n stream = undefined;\n // one more time for any missed in case changes came in extremely quickly\n if (wasThrottled)\n this._handleRead(directory, false, wh, target, dir, depth, throttler);\n });\n });\n }\n /**\n * Read directory to add / remove files from `@watched` list and re-read it on change.\n * @param dir fs path\n * @param stats\n * @param initialAdd\n * @param depth relative to user-supplied path\n * @param target child path targeted for watch\n * @param wh Common watch helpers for this path\n * @param realpath\n * @returns closer for the watcher instance.\n */\n async _handleDir(dir, stats, initialAdd, depth, target, wh, realpath) {\n const parentDir = this.fsw._getWatchedDir(sp.dirname(dir));\n const tracked = parentDir.has(sp.basename(dir));\n if (!(initialAdd && this.fsw.options.ignoreInitial) && !target && !tracked) {\n this.fsw._emit(EV.ADD_DIR, dir, stats);\n }\n // ensure dir is tracked (harmless if redundant)\n parentDir.add(sp.basename(dir));\n this.fsw._getWatchedDir(dir);\n let throttler;\n let closer;\n const oDepth = this.fsw.options.depth;\n if ((oDepth == null || depth <= oDepth) && !this.fsw._symlinkPaths.has(realpath)) {\n if (!target) {\n await this._handleRead(dir, initialAdd, wh, target, dir, depth, throttler);\n if (this.fsw.closed)\n return;\n }\n closer = this._watchWithNodeFs(dir, (dirPath, stats) => {\n // if current directory is removed, do nothing\n if (stats && stats.mtimeMs === 0)\n return;\n this._handleRead(dirPath, false, wh, target, dir, depth, throttler);\n });\n }\n return closer;\n }\n /**\n * Handle added file, directory, or glob pattern.\n * Delegates call to _handleFile / _handleDir after checks.\n * @param path to file or ir\n * @param initialAdd was the file added at watch instantiation?\n * @param priorWh depth relative to user-supplied path\n * @param depth Child path actually targeted for watch\n * @param target Child path actually targeted for watch\n */\n async _addToNodeFs(path, initialAdd, priorWh, depth, target) {\n const ready = this.fsw._emitReady;\n if (this.fsw._isIgnored(path) || this.fsw.closed) {\n ready();\n return false;\n }\n const wh = this.fsw._getWatchHelpers(path);\n if (priorWh) {\n wh.filterPath = (entry) => priorWh.filterPath(entry);\n wh.filterDir = (entry) => priorWh.filterDir(entry);\n }\n // evaluate what is at the path we're being asked to watch\n try {\n const stats = await statMethods[wh.statMethod](wh.watchPath);\n if (this.fsw.closed)\n return;\n if (this.fsw._isIgnored(wh.watchPath, stats)) {\n ready();\n return false;\n }\n const follow = this.fsw.options.followSymlinks;\n let closer;\n if (stats.isDirectory()) {\n const absPath = sp.resolve(path);\n const targetPath = follow ? await fsrealpath(path) : path;\n if (this.fsw.closed)\n return;\n closer = await this._handleDir(wh.watchPath, stats, initialAdd, depth, target, wh, targetPath);\n if (this.fsw.closed)\n return;\n // preserve this symlink's target path\n if (absPath !== targetPath && targetPath !== undefined) {\n this.fsw._symlinkPaths.set(absPath, targetPath);\n }\n }\n else if (stats.isSymbolicLink()) {\n const targetPath = follow ? await fsrealpath(path) : path;\n if (this.fsw.closed)\n return;\n const parent = sp.dirname(wh.watchPath);\n this.fsw._getWatchedDir(parent).add(wh.watchPath);\n this.fsw._emit(EV.ADD, wh.watchPath, stats);\n closer = await this._handleDir(parent, stats, initialAdd, depth, path, wh, targetPath);\n if (this.fsw.closed)\n return;\n // preserve this symlink's target path\n if (targetPath !== undefined) {\n this.fsw._symlinkPaths.set(sp.resolve(path), targetPath);\n }\n }\n else {\n closer = this._handleFile(wh.watchPath, stats, initialAdd);\n }\n ready();\n if (closer)\n this.fsw._addPathCloser(path, closer);\n return false;\n }\n catch (error) {\n if (this.fsw._handleError(error)) {\n ready();\n return path;\n }\n }\n }\n}\n","import chokidar, { FSWatcher } from \"chokidar\";\nimport * as path from \"path\";\n\nimport { CodebaseIndexConfig } from \"../config/schema.js\";\nimport { createIgnoreFilter, shouldIncludeFile } from \"../utils/files.js\";\nimport { Indexer } from \"../indexer/index.js\";\n\nexport type FileChangeType = \"add\" | \"change\" | \"unlink\";\n\nexport interface FileChange {\n type: FileChangeType;\n path: string;\n}\n\nexport type ChangeHandler = (changes: FileChange[]) => Promise<void>;\n\nexport class FileWatcher {\n private watcher: FSWatcher | null = null;\n private projectRoot: string;\n private config: CodebaseIndexConfig;\n private pendingChanges: Map<string, FileChangeType> = new Map();\n private debounceTimer: NodeJS.Timeout | null = null;\n private debounceMs = 1000;\n private onChanges: ChangeHandler | null = null;\n\n constructor(projectRoot: string, config: CodebaseIndexConfig) {\n this.projectRoot = projectRoot;\n this.config = config;\n }\n\n start(handler: ChangeHandler): void {\n if (this.watcher) {\n return;\n }\n\n this.onChanges = handler;\n const ignoreFilter = createIgnoreFilter(this.projectRoot);\n\n this.watcher = chokidar.watch(this.projectRoot, {\n ignored: (filePath: string) => {\n const relativePath = path.relative(this.projectRoot, filePath);\n if (!relativePath) return false;\n\n if (ignoreFilter.ignores(relativePath)) {\n return true;\n }\n\n return false;\n },\n persistent: true,\n ignoreInitial: true,\n awaitWriteFinish: {\n stabilityThreshold: 300,\n pollInterval: 100,\n },\n });\n\n this.watcher.on(\"add\", (filePath) => this.handleChange(\"add\", filePath));\n this.watcher.on(\"change\", (filePath) => this.handleChange(\"change\", filePath));\n this.watcher.on(\"unlink\", (filePath) => this.handleChange(\"unlink\", filePath));\n }\n\n private handleChange(type: FileChangeType, filePath: string): void {\n if (\n !shouldIncludeFile(\n filePath,\n this.projectRoot,\n this.config.include,\n this.config.exclude,\n createIgnoreFilter(this.projectRoot)\n )\n ) {\n return;\n }\n\n this.pendingChanges.set(filePath, type);\n this.scheduleFlush();\n }\n\n private scheduleFlush(): void {\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n }\n\n this.debounceTimer = setTimeout(() => {\n this.flush();\n }, this.debounceMs);\n }\n\n private async flush(): Promise<void> {\n if (this.pendingChanges.size === 0 || !this.onChanges) {\n return;\n }\n\n const changes: FileChange[] = Array.from(this.pendingChanges.entries()).map(\n ([path, type]) => ({ path, type })\n );\n\n this.pendingChanges.clear();\n\n try {\n await this.onChanges(changes);\n } catch (error) {\n console.error(\"Error handling file changes:\", error);\n }\n }\n\n stop(): void {\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n this.debounceTimer = null;\n }\n\n if (this.watcher) {\n this.watcher.close();\n this.watcher = null;\n }\n\n this.pendingChanges.clear();\n this.onChanges = null;\n }\n\n isRunning(): boolean {\n return this.watcher !== null;\n }\n}\n\nexport function createWatcherWithIndexer(\n indexer: Indexer,\n projectRoot: string,\n config: CodebaseIndexConfig\n): FileWatcher {\n const watcher = new FileWatcher(projectRoot, config);\n\n watcher.start(async (changes) => {\n const hasAddOrChange = changes.some(\n (c) => c.type === \"add\" || c.type === \"change\"\n );\n const hasDelete = changes.some((c) => c.type === \"unlink\");\n\n if (hasAddOrChange || hasDelete) {\n await indexer.index();\n }\n });\n\n return watcher;\n}\n","import { tool, type ToolDefinition } from \"@opencode-ai/plugin\";\n\nimport { Indexer, IndexStats } from \"../indexer/index.js\";\nimport { ParsedCodebaseIndexConfig } from \"../config/schema.js\";\nimport { formatCostEstimate } from \"../utils/cost.js\";\n\n// Use Zod from plugin to ensure version compatibility\nconst z = tool.schema;\n\nlet sharedIndexer: Indexer | null = null;\n\nexport function initializeTools(projectRoot: string, config: ParsedCodebaseIndexConfig): void {\n sharedIndexer = new Indexer(projectRoot, config);\n}\n\nfunction getIndexer(): Indexer {\n if (!sharedIndexer) {\n throw new Error(\"Codebase index tools not initialized. Plugin may not be loaded correctly.\");\n }\n return sharedIndexer;\n}\n\nexport const codebase_search: ToolDefinition = tool({\n description:\n \"Search codebase by MEANING, not keywords. Use when you don't know exact function/class names. Returns focused results (5-10 files). For known identifiers like 'validateToken' or 'UserService', use grep instead - it's faster and finds all occurrences. Best for: 'find authentication logic', 'code that handles payments', 'error middleware'.\",\n args: {\n query: z\n .string()\n .describe(\"Natural language description of what code you're looking for. Describe behavior, not syntax.\"),\n limit: z\n .number()\n .optional()\n .default(10)\n .describe(\"Maximum number of results to return\"),\n fileType: z\n .string()\n .optional()\n .describe(\"Filter by file extension (e.g., 'ts', 'py', 'rs')\"),\n directory: z\n .string()\n .optional()\n .describe(\"Filter by directory path (e.g., 'src/utils', 'lib')\"),\n chunkType: z\n .enum([\"function\", \"class\", \"method\", \"interface\", \"type\", \"enum\", \"struct\", \"impl\", \"trait\", \"module\", \"other\"])\n .optional()\n .describe(\"Filter by code chunk type\"),\n contextLines: z\n .number()\n .optional()\n .describe(\"Number of extra lines to include before/after each match (default: 0)\"),\n },\n async execute(args) {\n const indexer = getIndexer();\n const results = await indexer.search(args.query, args.limit, {\n fileType: args.fileType,\n directory: args.directory,\n chunkType: args.chunkType,\n contextLines: args.contextLines,\n });\n\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 header = r.name\n ? `[${idx + 1}] ${r.chunkType} \"${r.name}\" in ${r.filePath}:${r.startLine}-${r.endLine}`\n : `[${idx + 1}] ${r.chunkType} in ${r.filePath}:${r.startLine}-${r.endLine}`;\n\n return `${header} (score: ${r.score.toFixed(2)})\\n\\`\\`\\`\\n${r.content}\\n\\`\\`\\``;\n });\n\n return `Found ${results.length} results for \"${args.query}\":\\n\\n${formatted.join(\"\\n\\n\")}`;\n },\n});\n\nexport const index_codebase: ToolDefinition = tool({\n description:\n \"Index the codebase for semantic search. Creates vector embeddings of code chunks. Incremental - only re-indexes changed files (~50ms when nothing changed). Run before first codebase_search.\",\n args: {\n force: z\n .boolean()\n .optional()\n .default(false)\n .describe(\"Force reindex even if already indexed\"),\n estimateOnly: z\n .boolean()\n .optional()\n .default(false)\n .describe(\"Only show cost estimate without indexing\"),\n verbose: z\n .boolean()\n .optional()\n .default(false)\n .describe(\"Show detailed info about skipped files and parsing failures\"),\n },\n async execute(args) {\n const indexer = getIndexer();\n\n if (args.estimateOnly) {\n const estimate = await indexer.estimateCost();\n return formatCostEstimate(estimate);\n }\n\n if (args.force) {\n await indexer.clearIndex();\n }\n\n const stats = await indexer.index();\n return formatIndexStats(stats, args.verbose);\n },\n});\n\nexport const index_status: ToolDefinition = tool({\n description:\n \"Check the status of the codebase index. Shows whether the codebase is indexed, how many chunks are stored, and the embedding provider being used.\",\n args: {},\n async execute() {\n const indexer = getIndexer();\n const status = await indexer.getStatus();\n return formatStatus(status);\n },\n});\n\nexport const index_health_check: ToolDefinition = tool({\n description:\n \"Check index health and remove stale entries from deleted files. Run this to clean up the index after files have been deleted.\",\n args: {},\n async execute() {\n const indexer = getIndexer();\n const result = await indexer.healthCheck();\n\n if (result.removed === 0) {\n return \"Index is healthy. No stale entries found.\";\n }\n\n const lines = [\n `Health check complete:`,\n ` Removed stale entries: ${result.removed}`,\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});\n\nfunction formatIndexStats(stats: IndexStats, verbose: boolean = false): string {\n const lines: string[] = [];\n \n if (stats.indexedChunks === 0 && stats.removedChunks === 0) {\n lines.push(`Indexed. ${stats.totalFiles} files processed, ${stats.existingChunks} code chunks already up to date.`);\n } else if (stats.indexedChunks === 0) {\n lines.push(`Indexed. ${stats.totalFiles} files, removed ${stats.removedChunks} stale chunks, ${stats.existingChunks} chunks remain.`);\n } else {\n let main = `Indexed. ${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\nfunction formatStatus(status: {\n indexed: boolean;\n vectorCount: number;\n provider: string;\n model: string;\n indexPath: string;\n}): string {\n if (!status.indexed) {\n return \"Codebase is not indexed. Run index_codebase to create an index.\";\n }\n\n return [\n `Index status:`,\n ` Indexed chunks: ${status.vectorCount.toLocaleString()}`,\n ` Provider: ${status.provider}`,\n ` Model: ${status.model}`,\n ` Location: ${status.indexPath}`,\n ].join(\"\\n\");\n}\n"],"mappings":"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","names":["exports","module","EventEmitter","exports","module","SLASH","path","Ignore","import_fs","path","import_fs","path","resolve","EventEmitter","resolve","reject","resolve","import_fs","path","os","import_fs","path","ignore","fsPromises","stat","path","os","platform","arch","estimateTokens","import_fs","path","b","fsPromises","import_node_fs","import_promises","sp","path","presolve","basename","pjoin","prelative","psep","import_promises","osType","path","fs_watch","rawEmitter","listener","basename","dirname","newStats","closer","fsrealpath","resolve","realpath","stats","relative","path","testString","stats","statcb","now","stat","path","path","z"]}
|
|
1
|
+
{"version":3,"sources":["../node_modules/eventemitter3/index.js","../node_modules/ignore/index.js","../src/index.ts","../src/config/schema.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/detector.ts","../src/embeddings/provider.ts","../src/utils/files.ts","../src/utils/cost.ts","../src/native/index.ts","../src/indexer/inverted-index.ts","../node_modules/chokidar/index.js","../node_modules/readdirp/index.js","../node_modules/chokidar/handler.js","../src/watcher/index.ts","../src/tools/index.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 { Plugin } from \"@opencode-ai/plugin\";\nimport { existsSync, readFileSync } from \"fs\";\nimport * as path from \"path\";\n\nimport { parseConfig } from \"./config/schema.js\";\nimport { Indexer } from \"./indexer/index.js\";\nimport { createWatcherWithIndexer } from \"./watcher/index.js\";\nimport {\n codebase_search,\n index_codebase,\n index_status,\n index_health_check,\n initializeTools,\n} from \"./tools/index.js\";\n\nfunction loadPluginConfig(projectRoot: string): unknown {\n const configPath = path.join(projectRoot, \".opencode\", \"codebase-index.json\");\n try {\n if (existsSync(configPath)) {\n const content = readFileSync(configPath, \"utf-8\");\n return JSON.parse(content);\n }\n } catch {\n // Ignore config file read errors, use defaults\n }\n return {};\n}\n\nconst plugin: Plugin = async ({ directory }) => {\n const projectRoot = directory;\n const rawConfig = loadPluginConfig(projectRoot);\n const config = parseConfig(rawConfig);\n\n initializeTools(projectRoot, config);\n\n const indexer = new Indexer(projectRoot, config);\n\n if (config.indexing.autoIndex) {\n indexer.initialize().then(() => {\n indexer.index().catch(() => {});\n }).catch(() => {});\n }\n\n if (config.indexing.watchFiles) {\n createWatcherWithIndexer(indexer, projectRoot, config);\n }\n\n return {\n tool: {\n codebase_search,\n index_codebase,\n index_status,\n index_health_check,\n },\n };\n};\n\nexport default plugin;\n\nexport { Indexer } from \"./indexer/index.js\";\nexport { FileWatcher } from \"./watcher/index.js\";\nexport * from \"./config/schema.js\";\nexport {\n VectorStore,\n parseFile,\n parseFiles,\n hashContent,\n hashFile,\n createEmbeddingText,\n createDynamicBatches,\n generateChunkId,\n generateChunkHash,\n type FileInput,\n type CodeChunk,\n type ChunkType,\n type ParsedFile,\n type SearchResult,\n type ChunkMetadata,\n} from \"./native/index.js\";\nexport * from \"./embeddings/index.js\";\nexport * from \"./utils/index.js\";\n","import { z } from \"zod\";\n\nexport const EmbeddingProviderSchema = z.enum([\n \"auto\",\n \"github-copilot\",\n \"openai\",\n \"google\",\n \"ollama\",\n]);\n\nexport type EmbeddingProvider = z.infer<typeof EmbeddingProviderSchema>;\n\nexport const IndexScopeSchema = z.enum([\"project\", \"global\"]);\n\nexport type IndexScope = z.infer<typeof IndexScopeSchema>;\n\nexport const IndexingConfigSchema = z.object({\n autoIndex: z.boolean().default(false),\n watchFiles: z.boolean().default(true),\n maxFileSize: z.number().default(1048576),\n retries: z.number().default(3),\n retryDelayMs: z.number().default(1000),\n});\n\nexport type IndexingConfig = z.infer<typeof IndexingConfigSchema>;\n\nexport const SearchConfigSchema = z.object({\n maxResults: z.number().default(20),\n minScore: z.number().default(0.1),\n includeContext: z.boolean().default(true),\n hybridWeight: z.number().min(0).max(1).default(0.5),\n contextLines: z.number().min(0).max(50).default(0),\n});\n\nexport type SearchConfig = z.infer<typeof SearchConfigSchema>;\n\nexport const CodebaseIndexConfigSchema = z.object({\n embeddingProvider: EmbeddingProviderSchema.default(\"auto\"),\n embeddingModel: z.string().default(\"auto\"),\n scope: IndexScopeSchema.default(\"project\"),\n \n indexing: IndexingConfigSchema.optional(),\n search: SearchConfigSchema.optional(),\n\n include: z.array(z.string()).default([\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,swift}\",\n \"**/*.{vue,svelte,astro}\",\n \"**/*.{sql,graphql,proto}\",\n \"**/*.{yaml,yml,toml}\",\n \"**/*.{md,mdx}\",\n \"**/*.{sh,bash,zsh}\",\n ]),\n\n exclude: z.array(z.string()).default([\n \"**/node_modules/**\",\n \"**/.git/**\",\n \"**/dist/**\",\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\nexport type CodebaseIndexConfig = z.infer<typeof CodebaseIndexConfigSchema>;\n\nfunction getDefaultIndexingConfig(): IndexingConfig {\n return {\n autoIndex: false,\n watchFiles: true,\n maxFileSize: 1048576,\n retries: 3,\n retryDelayMs: 1000,\n };\n}\n\nfunction getDefaultSearchConfig(): SearchConfig {\n return {\n maxResults: 20,\n minScore: 0.1,\n includeContext: true,\n hybridWeight: 0.5,\n contextLines: 0,\n };\n}\n\nexport type ParsedCodebaseIndexConfig = CodebaseIndexConfig & {\n indexing: IndexingConfig;\n search: SearchConfig;\n};\n\nexport function parseConfig(raw: unknown): ParsedCodebaseIndexConfig {\n const parsed = CodebaseIndexConfigSchema.parse(raw ?? {});\n return {\n ...parsed,\n indexing: parsed.indexing ?? getDefaultIndexingConfig(),\n search: parsed.search ?? getDefaultSearchConfig(),\n };\n}\n\nexport function getDefaultConfig(): CodebaseIndexConfig {\n return CodebaseIndexConfigSchema.parse({});\n}\n\nexport interface EmbeddingModelInfo {\n provider: EmbeddingProvider;\n model: string;\n dimensions: number;\n maxTokens: number;\n costPer1MTokens: number;\n}\n\nexport const EMBEDDING_MODELS: Record<string, EmbeddingModelInfo> = {\n \"github-copilot/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 \"openai/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 \"openai/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 \"google/text-embedding-004\": {\n provider: \"google\",\n model: \"text-embedding-004\",\n dimensions: 768,\n maxTokens: 2048,\n costPer1MTokens: 0.00,\n },\n \"ollama/nomic-embed-text\": {\n provider: \"ollama\",\n model: \"nomic-embed-text\",\n dimensions: 768,\n maxTokens: 8192,\n costPer1MTokens: 0.00,\n },\n \"ollama/mxbai-embed-large\": {\n provider: \"ollama\",\n model: \"mxbai-embed-large\",\n dimensions: 1024,\n maxTokens: 512,\n costPer1MTokens: 0.00,\n },\n};\n\nexport function getDefaultModelForProvider(provider: EmbeddingProvider): EmbeddingModelInfo {\n switch (provider) {\n case \"github-copilot\":\n return EMBEDDING_MODELS[\"github-copilot/text-embedding-3-small\"];\n case \"openai\":\n return EMBEDDING_MODELS[\"openai/text-embedding-3-small\"];\n case \"google\":\n return EMBEDDING_MODELS[\"google/text-embedding-004\"];\n case \"ollama\":\n return EMBEDDING_MODELS[\"ollama/nomic-embed-text\"];\n default:\n return EMBEDDING_MODELS[\"github/text-embedding-3-small\"];\n }\n}\n","import { existsSync, readFileSync, writeFileSync, promises as fsPromises } from \"fs\";\nimport * as path from \"path\";\nimport PQueue from \"p-queue\";\nimport pRetry from \"p-retry\";\n\nimport { ParsedCodebaseIndexConfig } from \"../config/schema.js\";\nimport { detectEmbeddingProvider, DetectedProvider } from \"../embeddings/detector.js\";\nimport {\n createEmbeddingProvider,\n EmbeddingProviderInterface,\n} from \"../embeddings/provider.js\";\nimport { collectFiles, SkippedFile } from \"../utils/files.js\";\nimport { createCostEstimate, CostEstimate } from \"../utils/cost.js\";\nimport {\n VectorStore,\n parseFiles,\n createEmbeddingText,\n generateChunkId,\n generateChunkHash,\n ChunkMetadata,\n createDynamicBatches,\n hashFile,\n} from \"../native/index.js\";\nimport { InvertedIndex } from \"./inverted-index.js\";\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}\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 text: string;\n content: string;\n metadata: ChunkMetadata;\n}\n\nexport class Indexer {\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 provider: EmbeddingProviderInterface | null = null;\n private detectedProvider: DetectedProvider | null = null;\n private fileHashCache: Map<string, string> = new Map();\n private fileHashCachePath: string = \"\";\n\n constructor(projectRoot: string, config: ParsedCodebaseIndexConfig) {\n this.projectRoot = projectRoot;\n this.config = config;\n this.indexPath = this.getIndexPath();\n this.fileHashCachePath = path.join(this.indexPath, \"file-hashes.json\");\n }\n\n private getIndexPath(): string {\n if (this.config.scope === \"global\") {\n const homeDir = process.env.HOME || process.env.USERPROFILE || \"\";\n return path.join(homeDir, \".opencode\", \"global-index\");\n }\n return path.join(this.projectRoot, \".opencode\", \"index\");\n }\n\n private loadFileHashCache(): void {\n try {\n if (existsSync(this.fileHashCachePath)) {\n const data = readFileSync(this.fileHashCachePath, \"utf-8\");\n const parsed = JSON.parse(data);\n this.fileHashCache = new Map(Object.entries(parsed));\n }\n } catch {\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 writeFileSync(this.fileHashCachePath, JSON.stringify(obj));\n }\n\n async initialize(): Promise<void> {\n this.detectedProvider = await detectEmbeddingProvider(this.config.embeddingProvider);\n if (!this.detectedProvider) {\n throw new Error(\n \"No embedding provider available. Configure GitHub, OpenAI, Google, or Ollama.\"\n );\n }\n\n this.provider = createEmbeddingProvider(\n this.detectedProvider.credentials,\n this.detectedProvider.modelInfo\n );\n\n await fsPromises.mkdir(this.indexPath, { recursive: true });\n\n const dimensions = this.detectedProvider.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 this.invertedIndex = new InvertedIndex(this.indexPath);\n this.invertedIndex.load();\n }\n\n private async ensureInitialized(): Promise<{\n store: VectorStore;\n provider: EmbeddingProviderInterface;\n invertedIndex: InvertedIndex;\n detectedProvider: DetectedProvider;\n }> {\n if (!this.store || !this.provider || !this.invertedIndex || !this.detectedProvider) {\n await this.initialize();\n }\n return {\n store: this.store!,\n provider: this.provider!,\n invertedIndex: this.invertedIndex!,\n detectedProvider: this.detectedProvider!,\n };\n }\n\n async estimateCost(): Promise<CostEstimate> {\n const { detectedProvider } = await this.ensureInitialized();\n\n const { files } = await collectFiles(\n this.projectRoot,\n this.config.include,\n this.config.exclude,\n this.config.indexing.maxFileSize\n );\n\n return createCostEstimate(files, detectedProvider);\n }\n\n async index(onProgress?: ProgressCallback): Promise<IndexStats> {\n const { store, provider, invertedIndex } = await this.ensureInitialized();\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\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 { files, skipped } = await collectFiles(\n this.projectRoot,\n this.config.include,\n this.config.exclude,\n this.config.indexing.maxFileSize\n );\n\n stats.totalFiles = files.length;\n stats.skippedFiles = skipped;\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 } else {\n const content = await fsPromises.readFile(f.path, \"utf-8\");\n changedFiles.push({ path: f.path, content, hash: currentHash });\n }\n }\n\n onProgress?.({\n phase: \"parsing\",\n filesProcessed: 0,\n totalFiles: files.length,\n chunksProcessed: 0,\n totalChunks: 0,\n });\n\n const parsedFiles = parseFiles(changedFiles);\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 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 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 for (const chunk of parsed.chunks) {\n const id = generateChunkId(parsed.path, chunk);\n const contentHash = generateChunkHash(chunk);\n currentChunkIds.add(id);\n\n if (existingChunks.get(id) === contentHash) {\n continue;\n }\n\n const text = createEmbeddingText(chunk, parsed.path);\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({ id, text, content: chunk.content, metadata });\n }\n }\n\n let removedCount = 0;\n for (const [chunkId] of existingChunks) {\n if (!currentChunkIds.has(chunkId)) {\n store.remove(chunkId);\n invertedIndex.removeChunk(chunkId);\n removedCount++;\n }\n }\n\n stats.totalChunks = pendingChunks.length;\n stats.existingChunks = currentChunkIds.size - pendingChunks.length;\n stats.removedChunks = removedCount;\n\n if (pendingChunks.length === 0 && removedCount === 0) {\n this.fileHashCache = currentFileHashes;\n this.saveFileHashCache();\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 return stats;\n }\n\n if (pendingChunks.length === 0) {\n store.save();\n invertedIndex.save();\n this.fileHashCache = currentFileHashes;\n this.saveFileHashCache();\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 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 queue = new PQueue({ concurrency: 3 });\n const dynamicBatches = createDynamicBatches(pendingChunks);\n\n for (const batch of dynamicBatches) {\n queue.add(async () => {\n try {\n const result = await pRetry(\n async () => {\n const texts = batch.map((c) => c.text);\n return provider.embedBatch(texts);\n },\n {\n retries: this.config.indexing.retries,\n minTimeout: this.config.indexing.retryDelayMs,\n onFailedAttempt: (error) => {\n console.error(\n `Embedding batch failed (attempt ${error.attemptNumber}): ${String(error)}`\n );\n },\n }\n );\n\n const items = batch.map((chunk, idx) => ({\n id: chunk.id,\n vector: result.embeddings[idx],\n metadata: chunk.metadata,\n }));\n\n store.addBatch(items);\n \n for (const chunk of batch) {\n invertedIndex.removeChunk(chunk.id);\n invertedIndex.addChunk(chunk.id, chunk.content);\n }\n \n stats.indexedChunks += batch.length;\n stats.tokensUsed += result.totalTokensUsed;\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 stats.failedChunks += batch.length;\n console.error(`Failed to embed batch after retries: ${error}`);\n }\n });\n }\n\n await queue.onIdle();\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 store.save();\n invertedIndex.save();\n this.fileHashCache = currentFileHashes;\n this.saveFileHashCache();\n\n stats.durationMs = Date.now() - startTime;\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 return stats;\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 }\n ): Promise<\n Array<{\n filePath: string;\n startLine: number;\n endLine: number;\n content: string;\n score: number;\n chunkType: string;\n name?: string;\n }>\n > {\n const { store, provider } = await this.ensureInitialized();\n\n if (store.count() === 0) {\n return [];\n }\n\n const maxResults = limit ?? this.config.search.maxResults;\n const hybridWeight = options?.hybridWeight ?? this.config.search.hybridWeight;\n\n const { embedding } = await provider.embed(query);\n const semanticResults = store.search(embedding, maxResults * 4);\n\n const keywordResults = await this.keywordSearch(query, maxResults * 4);\n\n const combined = this.fuseResults(semanticResults, keywordResults, hybridWeight, maxResults * 4);\n\n const filtered = combined.filter((r) => {\n if (r.score < this.config.search.minScore) return false;\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, maxResults);\n\n return Promise.all(\n filtered.map(async (r) => {\n let content = \"\";\n let contextStartLine = r.metadata.startLine;\n let contextEndLine = r.metadata.endLine;\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 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 const allMetadata = store.getAllMetadata();\n const metadataMap = new Map<string, ChunkMetadata>();\n for (const { key, metadata } of allMetadata) {\n metadataMap.set(key, metadata);\n }\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 private fuseResults(\n semanticResults: Array<{ id: string; score: number; metadata: ChunkMetadata }>,\n keywordResults: Array<{ id: string; score: number; metadata: ChunkMetadata }>,\n keywordWeight: number,\n limit: number\n ): Array<{ id: string; score: number; metadata: ChunkMetadata }> {\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);\n return results.slice(0, limit);\n }\n\n async getStatus(): Promise<{\n indexed: boolean;\n vectorCount: number;\n provider: string;\n model: string;\n indexPath: string;\n }> {\n const { store, detectedProvider } = await this.ensureInitialized();\n\n return {\n indexed: store.count() > 0,\n vectorCount: store.count(),\n provider: detectedProvider.provider,\n model: detectedProvider.modelInfo.model,\n indexPath: this.indexPath,\n };\n }\n\n async clearIndex(): Promise<void> {\n const { store, invertedIndex } = await this.ensureInitialized();\n\n store.clear();\n store.save();\n invertedIndex.clear();\n invertedIndex.save();\n }\n\n async healthCheck(): Promise<{ removed: number; filePaths: string[] }> {\n const { store, invertedIndex } = await this.ensureInitialized();\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 let removedCount = 0;\n\n for (const [filePath, chunkKeys] of filePathsToChunkKeys) {\n if (!existsSync(filePath)) {\n for (const key of chunkKeys) {\n store.remove(key);\n invertedIndex.removeChunk(key);\n removedCount++;\n }\n removedFilePaths.push(filePath);\n }\n }\n\n if (removedCount > 0) {\n store.save();\n invertedIndex.save();\n }\n\n return { removed: removedCount, filePaths: removedFilePaths };\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 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 /**\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 this.#queue.enqueue(async () => {\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 }, options);\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 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'Failed to fetch', // 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// 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 { EmbeddingProvider, getDefaultModelForProvider, EmbeddingModelInfo } from \"../config/schema.js\";\nimport { existsSync, readFileSync } from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\n\nexport interface ProviderCredentials {\n provider: EmbeddingProvider;\n apiKey?: string;\n baseUrl?: string;\n refreshToken?: string;\n accessToken?: string;\n tokenExpires?: number;\n}\n\nexport interface DetectedProvider {\n provider: EmbeddingProvider;\n credentials: ProviderCredentials;\n modelInfo: EmbeddingModelInfo;\n}\n\nconst EMBEDDING_CAPABLE_PROVIDERS: EmbeddingProvider[] = [\n \"github-copilot\",\n \"openai\",\n \"google\",\n \"ollama\",\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(\n preferredProvider?: EmbeddingProvider\n): Promise<DetectedProvider> {\n if (preferredProvider && preferredProvider !== \"auto\") {\n const credentials = await getProviderCredentials(preferredProvider);\n if (credentials) {\n return {\n provider: preferredProvider,\n credentials,\n modelInfo: getDefaultModelForProvider(preferredProvider),\n };\n }\n throw new Error(\n `Preferred provider '${preferredProvider}' is not configured or authenticated`\n );\n }\n\n for (const provider of EMBEDDING_CAPABLE_PROVIDERS) {\n const credentials = await getProviderCredentials(provider);\n if (credentials) {\n return {\n provider,\n credentials,\n modelInfo: getDefaultModelForProvider(provider),\n };\n }\n }\n\n throw new Error(\n `No embedding-capable provider found. Please authenticate with OpenCode using one of: ${EMBEDDING_CAPABLE_PROVIDERS.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 const baseUrl = (copilotAuth as OpenCodeAuthOAuth).enterpriseUrl\n ? `https://copilot-api.${(copilotAuth as OpenCodeAuthOAuth).enterpriseUrl!.replace(/^https?:\\/\\//, \"\").replace(/\\/$/, \"\")}`\n : \"https://api.githubcopilot.com\";\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): 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 default:\n return provider;\n }\n}\n","import { EmbeddingModelInfo } from \"../config/schema.js\";\nimport { ProviderCredentials } from \"./detector.js\";\nimport { readFileSync, writeFileSync } from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\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 embed(text: string): Promise<EmbeddingResult>;\n embedBatch(texts: string[]): Promise<EmbeddingBatchResult>;\n getModelInfo(): EmbeddingModelInfo;\n}\n\nexport function createEmbeddingProvider(\n credentials: ProviderCredentials,\n modelInfo: EmbeddingModelInfo\n): EmbeddingProviderInterface {\n switch (credentials.provider) {\n case \"github-copilot\":\n return new GitHubCopilotEmbeddingProvider(credentials, modelInfo);\n case \"openai\":\n return new OpenAIEmbeddingProvider(credentials, modelInfo);\n case \"google\":\n return new GoogleEmbeddingProvider(credentials, modelInfo);\n case \"ollama\":\n return new OllamaEmbeddingProvider(credentials, modelInfo);\n default:\n throw new Error(`Unsupported embedding provider: ${credentials.provider}`);\n }\n}\n\nconst COPILOT_HEADERS = {\n \"User-Agent\": \"GitHubCopilotChat/0.35.0\",\n \"Editor-Version\": \"vscode/1.107.0\",\n \"Editor-Plugin-Version\": \"copilot-chat/0.35.0\",\n \"Copilot-Integration-Id\": \"vscode-chat\",\n \"Openai-Intent\": \"conversation-edits\",\n};\n\nclass GitHubCopilotEmbeddingProvider implements EmbeddingProviderInterface {\n private accessToken: string;\n private tokenExpires: number;\n\n constructor(\n private credentials: ProviderCredentials,\n private modelInfo: EmbeddingModelInfo\n ) {\n this.accessToken = credentials.accessToken || \"\";\n this.tokenExpires = credentials.tokenExpires || 0;\n }\n\n private async ensureValidToken(): Promise<string> {\n if (this.accessToken && this.tokenExpires > Date.now()) {\n return this.accessToken;\n }\n\n if (!this.credentials.refreshToken) {\n throw new Error(\"No refresh token available for GitHub Copilot\");\n }\n\n const response = await fetch(\"https://api.github.com/copilot_internal/v2/token\", {\n headers: {\n Accept: \"application/json\",\n Authorization: `Bearer ${this.credentials.refreshToken}`,\n ...COPILOT_HEADERS,\n },\n });\n\n if (!response.ok) {\n throw new Error(`Token refresh failed: ${response.status}`);\n }\n\n const tokenData = await response.json() as { token: string; expires_at: number };\n this.accessToken = tokenData.token;\n this.tokenExpires = tokenData.expires_at * 1000 - 5 * 60 * 1000;\n\n this.persistToken(tokenData.token, this.tokenExpires);\n\n return this.accessToken;\n }\n\n private persistToken(token: string, expires: number): void {\n try {\n const authPath = path.join(os.homedir(), \".local\", \"share\", \"opencode\", \"auth.json\");\n const authData = JSON.parse(readFileSync(authPath, \"utf-8\"));\n \n if (authData[\"github-copilot\"]) {\n authData[\"github-copilot\"].access = token;\n authData[\"github-copilot\"].expires = expires;\n writeFileSync(authPath, JSON.stringify(authData, null, 2));\n }\n } catch {\n // Ignore token cache write errors\n }\n }\n\n async embed(text: string): Promise<EmbeddingResult> {\n const result = await this.embedBatch([text]);\n return {\n embedding: result.embeddings[0],\n tokensUsed: result.totalTokensUsed,\n };\n }\n\n async embedBatch(texts: string[]): Promise<EmbeddingBatchResult> {\n const token = await this.ensureValidToken();\n\n const response = await fetch(`${this.credentials.baseUrl}/embeddings`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n ...COPILOT_HEADERS,\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();\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 getModelInfo(): EmbeddingModelInfo {\n return this.modelInfo;\n }\n}\n\nclass OpenAIEmbeddingProvider implements EmbeddingProviderInterface {\n constructor(\n private credentials: ProviderCredentials,\n private modelInfo: EmbeddingModelInfo\n ) {}\n\n async embed(text: string): Promise<EmbeddingResult> {\n const result = await this.embedBatch([text]);\n return {\n embedding: result.embeddings[0],\n tokensUsed: result.totalTokensUsed,\n };\n }\n\n 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();\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 getModelInfo(): EmbeddingModelInfo {\n return this.modelInfo;\n }\n}\n\nclass GoogleEmbeddingProvider implements EmbeddingProviderInterface {\n constructor(\n private credentials: ProviderCredentials,\n private modelInfo: EmbeddingModelInfo\n ) {}\n\n async embed(text: string): Promise<EmbeddingResult> {\n const result = await this.embedBatch([text]);\n return {\n embedding: result.embeddings[0],\n tokensUsed: result.totalTokensUsed,\n };\n }\n\n async embedBatch(texts: string[]): Promise<EmbeddingBatchResult> {\n const embeddings: number[][] = [];\n let totalTokens = 0;\n\n for (const text of texts) {\n const response = await fetch(\n `${this.credentials.baseUrl}/models/${this.modelInfo.model}:embedContent?key=${this.credentials.apiKey}`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n content: {\n parts: [{ text }],\n },\n }),\n }\n );\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Google embedding API error: ${response.status} - ${error}`);\n }\n\n const data = await response.json() as {\n embedding: { values: number[] };\n };\n\n embeddings.push(data.embedding.values);\n totalTokens += Math.ceil(text.length / 4);\n }\n\n return {\n embeddings,\n totalTokensUsed: totalTokens,\n };\n }\n\n getModelInfo(): EmbeddingModelInfo {\n return this.modelInfo;\n }\n}\n\nclass OllamaEmbeddingProvider implements EmbeddingProviderInterface {\n constructor(\n private credentials: ProviderCredentials,\n private modelInfo: EmbeddingModelInfo\n ) {}\n\n async embed(text: string): Promise<EmbeddingResult> {\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 }),\n });\n\n if (!response.ok) {\n const error = await response.text();\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: Math.ceil(text.length / 4),\n };\n }\n\n async embedBatch(texts: string[]): Promise<EmbeddingBatchResult> {\n const embeddings: number[][] = [];\n let totalTokens = 0;\n\n for (const text of texts) {\n const result = await this.embed(text);\n embeddings.push(result.embedding);\n totalTokens += result.tokensUsed;\n }\n\n return {\n embeddings,\n totalTokensUsed: totalTokens,\n };\n }\n\n getModelInfo(): EmbeddingModelInfo {\n return this.modelInfo;\n }\n}\n","import ignore, { Ignore } from \"ignore\";\nimport { existsSync, readFileSync, promises as fsPromises } from \"fs\";\nimport * as path from \"path\";\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 ];\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 (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 const regexPattern = pattern\n .replace(/\\*\\*/g, \"<<<DOUBLESTAR>>>\")\n .replace(/\\*/g, \"[^/]*\")\n .replace(/<<<DOUBLESTAR>>>/g, \".*\")\n .replace(/\\?/g, \".\")\n .replace(/\\{([^}]+)\\}/g, (_, p1) => `(${p1.split(\",\").join(\"|\")})`);\n\n const regex = new RegExp(`^${regexPattern}$`);\n return regex.test(filePath);\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): AsyncGenerator<{ path: string; size: number }> {\n const entries = await fsPromises.readdir(dir, { withFileTypes: true });\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 (ignoreFilter.ignores(relativePath)) {\n if (entry.isFile()) {\n skipped.push({ path: relativePath, reason: \"gitignore\" });\n }\n continue;\n }\n\n if (entry.isDirectory()) {\n yield* walkDirectory(\n fullPath,\n projectRoot,\n includePatterns,\n excludePatterns,\n ignoreFilter,\n maxFileSize,\n skipped\n );\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 yield { path: fullPath, size: stat.size };\n }\n }\n }\n}\n\nexport async function collectFiles(\n projectRoot: string,\n includePatterns: string[],\n excludePatterns: string[],\n maxFileSize: number\n): Promise<CollectFilesResult> {\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 )) {\n files.push(file);\n }\n\n return { files, skipped };\n}\n","import { EmbeddingModelInfo } from \"../config/schema.js\";\nimport { getProviderDisplayName, DetectedProvider } 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: EmbeddingModelInfo\n): number {\n return (estimatedTokens / 1_000_000) * modelInfo.costPer1MTokens;\n}\n\nexport function createCostEstimate(\n files: Array<{ path: string; size: number }>,\n provider: DetectedProvider\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 costFormatted = estimate.isFree\n ? \"Free\"\n : `~$${estimate.estimatedCost.toFixed(4)}`;\n\n return `\n┌─────────────────────────────────────────────────────────────────┐\n│ 📊 Indexing Estimate │\n├─────────────────────────────────────────────────────────────────┤\n│ │\n│ Files to index: ${padRight(estimate.filesCount.toLocaleString() + \" files\", 40)}│\n│ Total size: ${padRight(sizeFormatted, 40)}│\n│ Estimated chunks: ${padRight(\"~\" + estimate.estimatedChunks.toLocaleString() + \" chunks\", 40)}│\n│ Estimated tokens: ${padRight(\"~\" + estimate.estimatedTokens.toLocaleString() + \" tokens\", 40)}│\n│ │\n│ Provider: ${padRight(estimate.provider, 52)}│\n│ Model: ${padRight(estimate.model, 52)}│\n│ Cost: ${padRight(costFormatted, 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\nfunction padRight(str: string, length: number): string {\n return str.padEnd(length);\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 * as path from \"path\";\nimport * as os from \"os\";\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 \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 } \n // Fallback to __dirname for CJS/bundled contexts\n else if (typeof __dirname !== 'undefined') {\n currentDir = __dirname;\n }\n // Last resort: use process.cwd() - shouldn't normally hit this\n else {\n currentDir = process.cwd();\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 isDevMode = currentDir.includes('/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 // eslint-disable-next-line @typescript-eslint/no-require-imports\n return require(nativePath);\n}\n\nconst native = getNativeBinding();\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\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 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\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\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; // Truncate individual chunks beyond this\n\nexport function estimateTokens(text: string): number {\n return Math.ceil(text.length / CHARS_PER_TOKEN);\n}\n\nexport function createEmbeddingText(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 parts.push(\"\");\n \n let content = chunk.content;\n const headerLength = parts.join(\"\\n\").length;\n const maxContentChars = (MAX_SINGLE_CHUNK_TOKENS * CHARS_PER_TOKEN) - headerLength;\n \n if (content.length > maxContentChars) {\n content = content.slice(0, maxContentChars) + \"\\n... [truncated]\";\n }\n \n parts.push(content);\n\n return parts.join(\"\\n\");\n}\n\nexport function createDynamicBatches(chunks: Array<{ text: string; [key: string]: any }>): Array<Array<{ text: string; [key: string]: any }>> {\n const batches: Array<Array<{ text: string; [key: string]: any }>> = [];\n let currentBatch: Array<{ text: string; [key: string]: any }> = [];\n let currentTokens = 0;\n \n for (const chunk of chunks) {\n const chunkTokens = estimateTokens(chunk.text);\n \n if (currentBatch.length > 0 && currentTokens + chunkTokens > MAX_BATCH_TOKENS) {\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","import { existsSync, readFileSync, writeFileSync } from \"fs\";\nimport * as path from \"path\";\n\ninterface InvertedIndexData {\n termToChunks: Record<string, string[]>;\n chunkTokens: Record<string, Record<string, number>>;\n avgDocLength: number;\n}\n\nexport class InvertedIndex {\n private indexPath: string;\n private termToChunks: Map<string, Set<string>> = new Map();\n private chunkTokens: Map<string, Map<string, number>> = new Map();\n private totalTokenCount = 0;\n\n constructor(indexPath: string) {\n this.indexPath = path.join(indexPath, \"inverted-index.json\");\n }\n\n load(): void {\n if (!existsSync(this.indexPath)) {\n return;\n }\n\n try {\n const content = readFileSync(this.indexPath, \"utf-8\");\n const data = JSON.parse(content) as InvertedIndexData;\n\n for (const [term, chunkIds] of Object.entries(data.termToChunks)) {\n this.termToChunks.set(term, new Set(chunkIds));\n }\n\n for (const [chunkId, tokens] of Object.entries(data.chunkTokens)) {\n const tokenMap = new Map(Object.entries(tokens).map(([k, v]) => [k, v as number]));\n this.chunkTokens.set(chunkId, tokenMap);\n for (const count of tokenMap.values()) {\n this.totalTokenCount += count;\n }\n }\n } catch {\n this.termToChunks.clear();\n this.chunkTokens.clear();\n this.totalTokenCount = 0;\n }\n }\n\n save(): void {\n const data: InvertedIndexData = {\n termToChunks: {},\n chunkTokens: {},\n avgDocLength: this.getAvgDocLength(),\n };\n\n for (const [term, chunkIds] of this.termToChunks) {\n data.termToChunks[term] = Array.from(chunkIds);\n }\n\n for (const [chunkId, tokens] of this.chunkTokens) {\n data.chunkTokens[chunkId] = Object.fromEntries(tokens);\n }\n\n writeFileSync(this.indexPath, JSON.stringify(data));\n }\n\n addChunk(chunkId: string, content: string): void {\n const tokens = this.tokenize(content);\n const termFreq = new Map<string, number>();\n\n for (const token of tokens) {\n termFreq.set(token, (termFreq.get(token) || 0) + 1);\n\n const chunks = this.termToChunks.get(token) || new Set();\n chunks.add(chunkId);\n this.termToChunks.set(token, chunks);\n }\n\n this.chunkTokens.set(chunkId, termFreq);\n this.totalTokenCount += tokens.length;\n }\n\n removeChunk(chunkId: string): void {\n const tokens = this.chunkTokens.get(chunkId);\n if (!tokens) return;\n\n for (const [token, count] of tokens) {\n this.totalTokenCount -= count;\n const chunks = this.termToChunks.get(token);\n if (chunks) {\n chunks.delete(chunkId);\n if (chunks.size === 0) {\n this.termToChunks.delete(token);\n }\n }\n }\n\n this.chunkTokens.delete(chunkId);\n }\n\n search(query: string): Map<string, number> {\n const queryTokens = this.tokenize(query);\n if (queryTokens.length === 0) {\n return new Map();\n }\n\n const candidateChunks = new Set<string>();\n for (const token of queryTokens) {\n const chunks = this.termToChunks.get(token);\n if (chunks) {\n for (const chunkId of chunks) {\n candidateChunks.add(chunkId);\n }\n }\n }\n\n const scores = new Map<string, number>();\n const k1 = 1.2;\n const b = 0.75;\n const N = this.chunkTokens.size;\n const avgDocLength = this.getAvgDocLength();\n\n for (const chunkId of candidateChunks) {\n const termFreq = this.chunkTokens.get(chunkId);\n if (!termFreq) continue;\n\n const docLength = Array.from(termFreq.values()).reduce((a, b) => a + b, 0);\n let score = 0;\n\n for (const term of queryTokens) {\n const tf = termFreq.get(term) || 0;\n if (tf === 0) continue;\n\n const df = this.termToChunks.get(term)?.size || 0;\n const idf = Math.log((N - df + 0.5) / (df + 0.5) + 1);\n\n const tfNorm = (tf * (k1 + 1)) / (tf + k1 * (1 - b + b * (docLength / avgDocLength)));\n score += idf * tfNorm;\n }\n\n scores.set(chunkId, score);\n }\n\n const maxScore = Math.max(...scores.values(), 1);\n for (const [chunkId, score] of scores) {\n scores.set(chunkId, score / maxScore);\n }\n\n return scores;\n }\n\n hasChunk(chunkId: string): boolean {\n return this.chunkTokens.has(chunkId);\n }\n\n clear(): void {\n this.termToChunks.clear();\n this.chunkTokens.clear();\n this.totalTokenCount = 0;\n }\n\n getDocumentCount(): number {\n return this.chunkTokens.size;\n }\n\n private getAvgDocLength(): number {\n const count = this.chunkTokens.size;\n return count > 0 ? this.totalTokenCount / count : 100;\n }\n\n private tokenize(text: string): string[] {\n return text\n .toLowerCase()\n .replace(/[^\\w\\s]/g, \" \")\n .split(/\\s+/)\n .filter((t) => t.length > 2);\n }\n}\n","/*! chokidar - MIT License (c) 2012 Paul Miller (paulmillr.com) */\nimport { EventEmitter } from 'node:events';\nimport { stat as statcb, Stats } from 'node:fs';\nimport { readdir, stat } from 'node:fs/promises';\nimport * as sp from 'node:path';\nimport { readdirp, ReaddirpStream } from 'readdirp';\nimport { EMPTY_FN, EVENTS as EV, isIBMi, isWindows, NodeFsHandler, STR_CLOSE, STR_END, } from './handler.js';\nconst SLASH = '/';\nconst SLASH_SLASH = '//';\nconst ONE_DOT = '.';\nconst TWO_DOTS = '..';\nconst STRING_TYPE = 'string';\nconst BACK_SLASH_RE = /\\\\/g;\nconst DOUBLE_SLASH_RE = /\\/\\//g;\nconst DOT_RE = /\\..*\\.(sw[px])$|~$|\\.subl.*\\.tmp/;\nconst REPLACER_RE = /^\\.[/\\\\]/;\nfunction arrify(item) {\n return Array.isArray(item) ? item : [item];\n}\nconst isMatcherObject = (matcher) => typeof matcher === 'object' && matcher !== null && !(matcher instanceof RegExp);\nfunction createPattern(matcher) {\n if (typeof matcher === 'function')\n return matcher;\n if (typeof matcher === 'string')\n return (string) => matcher === string;\n if (matcher instanceof RegExp)\n return (string) => matcher.test(string);\n if (typeof matcher === 'object' && matcher !== null) {\n return (string) => {\n if (matcher.path === string)\n return true;\n if (matcher.recursive) {\n const relative = sp.relative(matcher.path, string);\n if (!relative) {\n return false;\n }\n return !relative.startsWith('..') && !sp.isAbsolute(relative);\n }\n return false;\n };\n }\n return () => false;\n}\nfunction normalizePath(path) {\n if (typeof path !== 'string')\n throw new Error('string expected');\n path = sp.normalize(path);\n path = path.replace(/\\\\/g, '/');\n let prepend = false;\n if (path.startsWith('//'))\n prepend = true;\n path = path.replace(DOUBLE_SLASH_RE, '/');\n if (prepend)\n path = '/' + path;\n return path;\n}\nfunction matchPatterns(patterns, testString, stats) {\n const path = normalizePath(testString);\n for (let index = 0; index < patterns.length; index++) {\n const pattern = patterns[index];\n if (pattern(path, stats)) {\n return true;\n }\n }\n return false;\n}\nfunction anymatch(matchers, testString) {\n if (matchers == null) {\n throw new TypeError('anymatch: specify first argument');\n }\n // Early cache for matchers.\n const matchersArray = arrify(matchers);\n const patterns = matchersArray.map((matcher) => createPattern(matcher));\n if (testString == null) {\n return (testString, stats) => {\n return matchPatterns(patterns, testString, stats);\n };\n }\n return matchPatterns(patterns, testString);\n}\nconst unifyPaths = (paths_) => {\n const paths = arrify(paths_).flat();\n if (!paths.every((p) => typeof p === STRING_TYPE)) {\n throw new TypeError(`Non-string provided as watch path: ${paths}`);\n }\n return paths.map(normalizePathToUnix);\n};\n// If SLASH_SLASH occurs at the beginning of path, it is not replaced\n// because \"//StoragePC/DrivePool/Movies\" is a valid network path\nconst toUnix = (string) => {\n let str = string.replace(BACK_SLASH_RE, SLASH);\n let prepend = false;\n if (str.startsWith(SLASH_SLASH)) {\n prepend = true;\n }\n str = str.replace(DOUBLE_SLASH_RE, SLASH);\n if (prepend) {\n str = SLASH + str;\n }\n return str;\n};\n// Our version of upath.normalize\n// TODO: this is not equal to path-normalize module - investigate why\nconst normalizePathToUnix = (path) => toUnix(sp.normalize(toUnix(path)));\n// TODO: refactor\nconst normalizeIgnored = (cwd = '') => (path) => {\n if (typeof path === 'string') {\n return normalizePathToUnix(sp.isAbsolute(path) ? path : sp.join(cwd, path));\n }\n else {\n return path;\n }\n};\nconst getAbsolutePath = (path, cwd) => {\n if (sp.isAbsolute(path)) {\n return path;\n }\n return sp.join(cwd, path);\n};\nconst EMPTY_SET = Object.freeze(new Set());\n/**\n * Directory entry.\n */\nclass DirEntry {\n path;\n _removeWatcher;\n items;\n constructor(dir, removeWatcher) {\n this.path = dir;\n this._removeWatcher = removeWatcher;\n this.items = new Set();\n }\n add(item) {\n const { items } = this;\n if (!items)\n return;\n if (item !== ONE_DOT && item !== TWO_DOTS)\n items.add(item);\n }\n async remove(item) {\n const { items } = this;\n if (!items)\n return;\n items.delete(item);\n if (items.size > 0)\n return;\n const dir = this.path;\n try {\n await readdir(dir);\n }\n catch (err) {\n if (this._removeWatcher) {\n this._removeWatcher(sp.dirname(dir), sp.basename(dir));\n }\n }\n }\n has(item) {\n const { items } = this;\n if (!items)\n return;\n return items.has(item);\n }\n getChildren() {\n const { items } = this;\n if (!items)\n return [];\n return [...items.values()];\n }\n dispose() {\n this.items.clear();\n this.path = '';\n this._removeWatcher = EMPTY_FN;\n this.items = EMPTY_SET;\n Object.freeze(this);\n }\n}\nconst STAT_METHOD_F = 'stat';\nconst STAT_METHOD_L = 'lstat';\nexport class WatchHelper {\n fsw;\n path;\n watchPath;\n fullWatchPath;\n dirParts;\n followSymlinks;\n statMethod;\n constructor(path, follow, fsw) {\n this.fsw = fsw;\n const watchPath = path;\n this.path = path = path.replace(REPLACER_RE, '');\n this.watchPath = watchPath;\n this.fullWatchPath = sp.resolve(watchPath);\n this.dirParts = [];\n this.dirParts.forEach((parts) => {\n if (parts.length > 1)\n parts.pop();\n });\n this.followSymlinks = follow;\n this.statMethod = follow ? STAT_METHOD_F : STAT_METHOD_L;\n }\n entryPath(entry) {\n return sp.join(this.watchPath, sp.relative(this.watchPath, entry.fullPath));\n }\n filterPath(entry) {\n const { stats } = entry;\n if (stats && stats.isSymbolicLink())\n return this.filterDir(entry);\n const resolvedPath = this.entryPath(entry);\n // TODO: what if stats is undefined? remove !\n return this.fsw._isntIgnored(resolvedPath, stats) && this.fsw._hasReadPermissions(stats);\n }\n filterDir(entry) {\n return this.fsw._isntIgnored(this.entryPath(entry), entry.stats);\n }\n}\n/**\n * Watches files & directories for changes. Emitted events:\n * `add`, `addDir`, `change`, `unlink`, `unlinkDir`, `all`, `error`\n *\n * new FSWatcher()\n * .add(directories)\n * .on('add', path => log('File', path, 'was added'))\n */\nexport class FSWatcher extends EventEmitter {\n closed;\n options;\n _closers;\n _ignoredPaths;\n _throttled;\n _streams;\n _symlinkPaths;\n _watched;\n _pendingWrites;\n _pendingUnlinks;\n _readyCount;\n _emitReady;\n _closePromise;\n _userIgnored;\n _readyEmitted;\n _emitRaw;\n _boundRemove;\n _nodeFsHandler;\n // Not indenting methods for history sake; for now.\n constructor(_opts = {}) {\n super();\n this.closed = false;\n this._closers = new Map();\n this._ignoredPaths = new Set();\n this._throttled = new Map();\n this._streams = new Set();\n this._symlinkPaths = new Map();\n this._watched = new Map();\n this._pendingWrites = new Map();\n this._pendingUnlinks = new Map();\n this._readyCount = 0;\n this._readyEmitted = false;\n const awf = _opts.awaitWriteFinish;\n const DEF_AWF = { stabilityThreshold: 2000, pollInterval: 100 };\n const opts = {\n // Defaults\n persistent: true,\n ignoreInitial: false,\n ignorePermissionErrors: false,\n interval: 100,\n binaryInterval: 300,\n followSymlinks: true,\n usePolling: false,\n // useAsync: false,\n atomic: true, // NOTE: overwritten later (depends on usePolling)\n ..._opts,\n // Change format\n ignored: _opts.ignored ? arrify(_opts.ignored) : arrify([]),\n awaitWriteFinish: awf === true ? DEF_AWF : typeof awf === 'object' ? { ...DEF_AWF, ...awf } : false,\n };\n // Always default to polling on IBM i because fs.watch() is not available on IBM i.\n if (isIBMi)\n opts.usePolling = true;\n // Editor atomic write normalization enabled by default with fs.watch\n if (opts.atomic === undefined)\n opts.atomic = !opts.usePolling;\n // opts.atomic = typeof _opts.atomic === 'number' ? _opts.atomic : 100;\n // Global override. Useful for developers, who need to force polling for all\n // instances of chokidar, regardless of usage / dependency depth\n const envPoll = process.env.CHOKIDAR_USEPOLLING;\n if (envPoll !== undefined) {\n const envLower = envPoll.toLowerCase();\n if (envLower === 'false' || envLower === '0')\n opts.usePolling = false;\n else if (envLower === 'true' || envLower === '1')\n opts.usePolling = true;\n else\n opts.usePolling = !!envLower;\n }\n const envInterval = process.env.CHOKIDAR_INTERVAL;\n if (envInterval)\n opts.interval = Number.parseInt(envInterval, 10);\n // This is done to emit ready only once, but each 'add' will increase that?\n let readyCalls = 0;\n this._emitReady = () => {\n readyCalls++;\n if (readyCalls >= this._readyCount) {\n this._emitReady = EMPTY_FN;\n this._readyEmitted = true;\n // use process.nextTick to allow time for listener to be bound\n process.nextTick(() => this.emit(EV.READY));\n }\n };\n this._emitRaw = (...args) => this.emit(EV.RAW, ...args);\n this._boundRemove = this._remove.bind(this);\n this.options = opts;\n this._nodeFsHandler = new NodeFsHandler(this);\n // You’re frozen when your heart’s not open.\n Object.freeze(opts);\n }\n _addIgnoredPath(matcher) {\n if (isMatcherObject(matcher)) {\n // return early if we already have a deeply equal matcher object\n for (const ignored of this._ignoredPaths) {\n if (isMatcherObject(ignored) &&\n ignored.path === matcher.path &&\n ignored.recursive === matcher.recursive) {\n return;\n }\n }\n }\n this._ignoredPaths.add(matcher);\n }\n _removeIgnoredPath(matcher) {\n this._ignoredPaths.delete(matcher);\n // now find any matcher objects with the matcher as path\n if (typeof matcher === 'string') {\n for (const ignored of this._ignoredPaths) {\n // TODO (43081j): make this more efficient.\n // probably just make a `this._ignoredDirectories` or some\n // such thing.\n if (isMatcherObject(ignored) && ignored.path === matcher) {\n this._ignoredPaths.delete(ignored);\n }\n }\n }\n }\n // Public methods\n /**\n * Adds paths to be watched on an existing FSWatcher instance.\n * @param paths_ file or file list. Other arguments are unused\n */\n add(paths_, _origAdd, _internal) {\n const { cwd } = this.options;\n this.closed = false;\n this._closePromise = undefined;\n let paths = unifyPaths(paths_);\n if (cwd) {\n paths = paths.map((path) => {\n const absPath = getAbsolutePath(path, cwd);\n // Check `path` instead of `absPath` because the cwd portion can't be a glob\n return absPath;\n });\n }\n paths.forEach((path) => {\n this._removeIgnoredPath(path);\n });\n this._userIgnored = undefined;\n if (!this._readyCount)\n this._readyCount = 0;\n this._readyCount += paths.length;\n Promise.all(paths.map(async (path) => {\n const res = await this._nodeFsHandler._addToNodeFs(path, !_internal, undefined, 0, _origAdd);\n if (res)\n this._emitReady();\n return res;\n })).then((results) => {\n if (this.closed)\n return;\n results.forEach((item) => {\n if (item)\n this.add(sp.dirname(item), sp.basename(_origAdd || item));\n });\n });\n return this;\n }\n /**\n * Close watchers or start ignoring events from specified paths.\n */\n unwatch(paths_) {\n if (this.closed)\n return this;\n const paths = unifyPaths(paths_);\n const { cwd } = this.options;\n paths.forEach((path) => {\n // convert to absolute path unless relative path already matches\n if (!sp.isAbsolute(path) && !this._closers.has(path)) {\n if (cwd)\n path = sp.join(cwd, path);\n path = sp.resolve(path);\n }\n this._closePath(path);\n this._addIgnoredPath(path);\n if (this._watched.has(path)) {\n this._addIgnoredPath({\n path,\n recursive: true,\n });\n }\n // reset the cached userIgnored anymatch fn\n // to make ignoredPaths changes effective\n this._userIgnored = undefined;\n });\n return this;\n }\n /**\n * Close watchers and remove all listeners from watched paths.\n */\n close() {\n if (this._closePromise) {\n return this._closePromise;\n }\n this.closed = true;\n // Memory management.\n this.removeAllListeners();\n const closers = [];\n this._closers.forEach((closerList) => closerList.forEach((closer) => {\n const promise = closer();\n if (promise instanceof Promise)\n closers.push(promise);\n }));\n this._streams.forEach((stream) => stream.destroy());\n this._userIgnored = undefined;\n this._readyCount = 0;\n this._readyEmitted = false;\n this._watched.forEach((dirent) => dirent.dispose());\n this._closers.clear();\n this._watched.clear();\n this._streams.clear();\n this._symlinkPaths.clear();\n this._throttled.clear();\n this._closePromise = closers.length\n ? Promise.all(closers).then(() => undefined)\n : Promise.resolve();\n return this._closePromise;\n }\n /**\n * Expose list of watched paths\n * @returns for chaining\n */\n getWatched() {\n const watchList = {};\n this._watched.forEach((entry, dir) => {\n const key = this.options.cwd ? sp.relative(this.options.cwd, dir) : dir;\n const index = key || ONE_DOT;\n watchList[index] = entry.getChildren().sort();\n });\n return watchList;\n }\n emitWithAll(event, args) {\n this.emit(event, ...args);\n if (event !== EV.ERROR)\n this.emit(EV.ALL, event, ...args);\n }\n // Common helpers\n // --------------\n /**\n * Normalize and emit events.\n * Calling _emit DOES NOT MEAN emit() would be called!\n * @param event Type of event\n * @param path File or directory path\n * @param stats arguments to be passed with event\n * @returns the error if defined, otherwise the value of the FSWatcher instance's `closed` flag\n */\n async _emit(event, path, stats) {\n if (this.closed)\n return;\n const opts = this.options;\n if (isWindows)\n path = sp.normalize(path);\n if (opts.cwd)\n path = sp.relative(opts.cwd, path);\n const args = [path];\n if (stats != null)\n args.push(stats);\n const awf = opts.awaitWriteFinish;\n let pw;\n if (awf && (pw = this._pendingWrites.get(path))) {\n pw.lastChange = new Date();\n return this;\n }\n if (opts.atomic) {\n if (event === EV.UNLINK) {\n this._pendingUnlinks.set(path, [event, ...args]);\n setTimeout(() => {\n this._pendingUnlinks.forEach((entry, path) => {\n this.emit(...entry);\n this.emit(EV.ALL, ...entry);\n this._pendingUnlinks.delete(path);\n });\n }, typeof opts.atomic === 'number' ? opts.atomic : 100);\n return this;\n }\n if (event === EV.ADD && this._pendingUnlinks.has(path)) {\n event = EV.CHANGE;\n this._pendingUnlinks.delete(path);\n }\n }\n if (awf && (event === EV.ADD || event === EV.CHANGE) && this._readyEmitted) {\n const awfEmit = (err, stats) => {\n if (err) {\n event = EV.ERROR;\n args[0] = err;\n this.emitWithAll(event, args);\n }\n else if (stats) {\n // if stats doesn't exist the file must have been deleted\n if (args.length > 1) {\n args[1] = stats;\n }\n else {\n args.push(stats);\n }\n this.emitWithAll(event, args);\n }\n };\n this._awaitWriteFinish(path, awf.stabilityThreshold, event, awfEmit);\n return this;\n }\n if (event === EV.CHANGE) {\n const isThrottled = !this._throttle(EV.CHANGE, path, 50);\n if (isThrottled)\n return this;\n }\n if (opts.alwaysStat &&\n stats === undefined &&\n (event === EV.ADD || event === EV.ADD_DIR || event === EV.CHANGE)) {\n const fullPath = opts.cwd ? sp.join(opts.cwd, path) : path;\n let stats;\n try {\n stats = await stat(fullPath);\n }\n catch (err) {\n // do nothing\n }\n // Suppress event when fs_stat fails, to avoid sending undefined 'stat'\n if (!stats || this.closed)\n return;\n args.push(stats);\n }\n this.emitWithAll(event, args);\n return this;\n }\n /**\n * Common handler for errors\n * @returns The error if defined, otherwise the value of the FSWatcher instance's `closed` flag\n */\n _handleError(error) {\n const code = error && error.code;\n if (error &&\n code !== 'ENOENT' &&\n code !== 'ENOTDIR' &&\n (!this.options.ignorePermissionErrors || (code !== 'EPERM' && code !== 'EACCES'))) {\n this.emit(EV.ERROR, error);\n }\n return error || this.closed;\n }\n /**\n * Helper utility for throttling\n * @param actionType type being throttled\n * @param path being acted upon\n * @param timeout duration of time to suppress duplicate actions\n * @returns tracking object or false if action should be suppressed\n */\n _throttle(actionType, path, timeout) {\n if (!this._throttled.has(actionType)) {\n this._throttled.set(actionType, new Map());\n }\n const action = this._throttled.get(actionType);\n if (!action)\n throw new Error('invalid throttle');\n const actionPath = action.get(path);\n if (actionPath) {\n actionPath.count++;\n return false;\n }\n // eslint-disable-next-line prefer-const\n let timeoutObject;\n const clear = () => {\n const item = action.get(path);\n const count = item ? item.count : 0;\n action.delete(path);\n clearTimeout(timeoutObject);\n if (item)\n clearTimeout(item.timeoutObject);\n return count;\n };\n timeoutObject = setTimeout(clear, timeout);\n const thr = { timeoutObject, clear, count: 0 };\n action.set(path, thr);\n return thr;\n }\n _incrReadyCount() {\n return this._readyCount++;\n }\n /**\n * Awaits write operation to finish.\n * Polls a newly created file for size variations. When files size does not change for 'threshold' milliseconds calls callback.\n * @param path being acted upon\n * @param threshold Time in milliseconds a file size must be fixed before acknowledging write OP is finished\n * @param event\n * @param awfEmit Callback to be called when ready for event to be emitted.\n */\n _awaitWriteFinish(path, threshold, event, awfEmit) {\n const awf = this.options.awaitWriteFinish;\n if (typeof awf !== 'object')\n return;\n const pollInterval = awf.pollInterval;\n let timeoutHandler;\n let fullPath = path;\n if (this.options.cwd && !sp.isAbsolute(path)) {\n fullPath = sp.join(this.options.cwd, path);\n }\n const now = new Date();\n const writes = this._pendingWrites;\n function awaitWriteFinishFn(prevStat) {\n statcb(fullPath, (err, curStat) => {\n if (err || !writes.has(path)) {\n if (err && err.code !== 'ENOENT')\n awfEmit(err);\n return;\n }\n const now = Number(new Date());\n if (prevStat && curStat.size !== prevStat.size) {\n writes.get(path).lastChange = now;\n }\n const pw = writes.get(path);\n const df = now - pw.lastChange;\n if (df >= threshold) {\n writes.delete(path);\n awfEmit(undefined, curStat);\n }\n else {\n timeoutHandler = setTimeout(awaitWriteFinishFn, pollInterval, curStat);\n }\n });\n }\n if (!writes.has(path)) {\n writes.set(path, {\n lastChange: now,\n cancelWait: () => {\n writes.delete(path);\n clearTimeout(timeoutHandler);\n return event;\n },\n });\n timeoutHandler = setTimeout(awaitWriteFinishFn, pollInterval);\n }\n }\n /**\n * Determines whether user has asked to ignore this path.\n */\n _isIgnored(path, stats) {\n if (this.options.atomic && DOT_RE.test(path))\n return true;\n if (!this._userIgnored) {\n const { cwd } = this.options;\n const ign = this.options.ignored;\n const ignored = (ign || []).map(normalizeIgnored(cwd));\n const ignoredPaths = [...this._ignoredPaths];\n const list = [...ignoredPaths.map(normalizeIgnored(cwd)), ...ignored];\n this._userIgnored = anymatch(list, undefined);\n }\n return this._userIgnored(path, stats);\n }\n _isntIgnored(path, stat) {\n return !this._isIgnored(path, stat);\n }\n /**\n * Provides a set of common helpers and properties relating to symlink handling.\n * @param path file or directory pattern being watched\n */\n _getWatchHelpers(path) {\n return new WatchHelper(path, this.options.followSymlinks, this);\n }\n // Directory helpers\n // -----------------\n /**\n * Provides directory tracking objects\n * @param directory path of the directory\n */\n _getWatchedDir(directory) {\n const dir = sp.resolve(directory);\n if (!this._watched.has(dir))\n this._watched.set(dir, new DirEntry(dir, this._boundRemove));\n return this._watched.get(dir);\n }\n // File helpers\n // ------------\n /**\n * Check for read permissions: https://stackoverflow.com/a/11781404/1358405\n */\n _hasReadPermissions(stats) {\n if (this.options.ignorePermissionErrors)\n return true;\n return Boolean(Number(stats.mode) & 0o400);\n }\n /**\n * Handles emitting unlink events for\n * files and directories, and via recursion, for\n * files and directories within directories that are unlinked\n * @param directory within which the following item is located\n * @param item base path of item/directory\n */\n _remove(directory, item, isDirectory) {\n // if what is being deleted is a directory, get that directory's paths\n // for recursive deleting and cleaning of watched object\n // if it is not a directory, nestedDirectoryChildren will be empty array\n const path = sp.join(directory, item);\n const fullPath = sp.resolve(path);\n isDirectory =\n isDirectory != null ? isDirectory : this._watched.has(path) || this._watched.has(fullPath);\n // prevent duplicate handling in case of arriving here nearly simultaneously\n // via multiple paths (such as _handleFile and _handleDir)\n if (!this._throttle('remove', path, 100))\n return;\n // if the only watched file is removed, watch for its return\n if (!isDirectory && this._watched.size === 1) {\n this.add(directory, item, true);\n }\n // This will create a new entry in the watched object in either case\n // so we got to do the directory check beforehand\n const wp = this._getWatchedDir(path);\n const nestedDirectoryChildren = wp.getChildren();\n // Recursively remove children directories / files.\n nestedDirectoryChildren.forEach((nested) => this._remove(path, nested));\n // Check if item was on the watched list and remove it\n const parent = this._getWatchedDir(directory);\n const wasTracked = parent.has(item);\n parent.remove(item);\n // Fixes issue #1042 -> Relative paths were detected and added as symlinks\n // (https://github.com/paulmillr/chokidar/blob/e1753ddbc9571bdc33b4a4af172d52cb6e611c10/lib/nodefs-handler.js#L612),\n // but never removed from the map in case the path was deleted.\n // This leads to an incorrect state if the path was recreated:\n // https://github.com/paulmillr/chokidar/blob/e1753ddbc9571bdc33b4a4af172d52cb6e611c10/lib/nodefs-handler.js#L553\n if (this._symlinkPaths.has(fullPath)) {\n this._symlinkPaths.delete(fullPath);\n }\n // If we wait for this file to be fully written, cancel the wait.\n let relPath = path;\n if (this.options.cwd)\n relPath = sp.relative(this.options.cwd, path);\n if (this.options.awaitWriteFinish && this._pendingWrites.has(relPath)) {\n const event = this._pendingWrites.get(relPath).cancelWait();\n if (event === EV.ADD)\n return;\n }\n // The Entry will either be a directory that just got removed\n // or a bogus entry to a file, in either case we have to remove it\n this._watched.delete(path);\n this._watched.delete(fullPath);\n const eventName = isDirectory ? EV.UNLINK_DIR : EV.UNLINK;\n if (wasTracked && !this._isIgnored(path))\n this._emit(eventName, path);\n // Avoid conflicts if we later create another file with the same name\n this._closePath(path);\n }\n /**\n * Closes all watchers for a path\n */\n _closePath(path) {\n this._closeFile(path);\n const dir = sp.dirname(path);\n this._getWatchedDir(dir).remove(sp.basename(path));\n }\n /**\n * Closes only file-specific watchers\n */\n _closeFile(path) {\n const closers = this._closers.get(path);\n if (!closers)\n return;\n closers.forEach((closer) => closer());\n this._closers.delete(path);\n }\n _addPathCloser(path, closer) {\n if (!closer)\n return;\n let list = this._closers.get(path);\n if (!list) {\n list = [];\n this._closers.set(path, list);\n }\n list.push(closer);\n }\n _readdirp(root, opts) {\n if (this.closed)\n return;\n const options = { type: EV.ALL, alwaysStat: true, lstat: true, ...opts, depth: 0 };\n let stream = readdirp(root, options);\n this._streams.add(stream);\n stream.once(STR_CLOSE, () => {\n stream = undefined;\n });\n stream.once(STR_END, () => {\n if (stream) {\n this._streams.delete(stream);\n stream = undefined;\n }\n });\n return stream;\n }\n}\n/**\n * Instantiates watcher with paths to be tracked.\n * @param paths file / directory paths\n * @param options opts, such as `atomic`, `awaitWriteFinish`, `ignored`, and others\n * @returns an instance of FSWatcher for chaining.\n * @example\n * const watcher = watch('.').on('all', (event, path) => { console.log(event, path); });\n * watch('.', { atomic: true, awaitWriteFinish: true, ignored: (f, stats) => stats?.isFile() && !f.endsWith('.js') })\n */\nexport function watch(paths, options = {}) {\n const watcher = new FSWatcher(options);\n watcher.add(paths);\n return watcher;\n}\nexport default { watch: watch, FSWatcher: FSWatcher };\n","import { lstat, readdir, realpath, stat } from 'node:fs/promises';\nimport { join as pjoin, relative as prelative, resolve as presolve, sep as psep } from 'node:path';\nimport { Readable } from 'node:stream';\nexport const EntryTypes = {\n FILE_TYPE: 'files',\n DIR_TYPE: 'directories',\n FILE_DIR_TYPE: 'files_directories',\n EVERYTHING_TYPE: 'all',\n};\nconst defaultOptions = {\n root: '.',\n fileFilter: (_entryInfo) => true,\n directoryFilter: (_entryInfo) => true,\n type: EntryTypes.FILE_TYPE,\n lstat: false,\n depth: 2147483648,\n alwaysStat: false,\n highWaterMark: 4096,\n};\nObject.freeze(defaultOptions);\nconst RECURSIVE_ERROR_CODE = 'READDIRP_RECURSIVE_ERROR';\nconst NORMAL_FLOW_ERRORS = new Set(['ENOENT', 'EPERM', 'EACCES', 'ELOOP', RECURSIVE_ERROR_CODE]);\nconst ALL_TYPES = [\n EntryTypes.DIR_TYPE,\n EntryTypes.EVERYTHING_TYPE,\n EntryTypes.FILE_DIR_TYPE,\n EntryTypes.FILE_TYPE,\n];\nconst DIR_TYPES = new Set([\n EntryTypes.DIR_TYPE,\n EntryTypes.EVERYTHING_TYPE,\n EntryTypes.FILE_DIR_TYPE,\n]);\nconst FILE_TYPES = new Set([\n EntryTypes.EVERYTHING_TYPE,\n EntryTypes.FILE_DIR_TYPE,\n EntryTypes.FILE_TYPE,\n]);\nconst isNormalFlowError = (error) => NORMAL_FLOW_ERRORS.has(error.code);\nconst wantBigintFsStats = process.platform === 'win32';\nconst emptyFn = (_entryInfo) => true;\nconst normalizeFilter = (filter) => {\n if (filter === undefined)\n return emptyFn;\n if (typeof filter === 'function')\n return filter;\n if (typeof filter === 'string') {\n const fl = filter.trim();\n return (entry) => entry.basename === fl;\n }\n if (Array.isArray(filter)) {\n const trItems = filter.map((item) => item.trim());\n return (entry) => trItems.some((f) => entry.basename === f);\n }\n return emptyFn;\n};\n/** Readable readdir stream, emitting new files as they're being listed. */\nexport class ReaddirpStream extends Readable {\n parents;\n reading;\n parent;\n _stat;\n _maxDepth;\n _wantsDir;\n _wantsFile;\n _wantsEverything;\n _root;\n _isDirent;\n _statsProp;\n _rdOptions;\n _fileFilter;\n _directoryFilter;\n constructor(options = {}) {\n super({\n objectMode: true,\n autoDestroy: true,\n highWaterMark: options.highWaterMark,\n });\n const opts = { ...defaultOptions, ...options };\n const { root, type } = opts;\n this._fileFilter = normalizeFilter(opts.fileFilter);\n this._directoryFilter = normalizeFilter(opts.directoryFilter);\n const statMethod = opts.lstat ? lstat : stat;\n // Use bigint stats if it's windows and stat() supports options (node 10+).\n if (wantBigintFsStats) {\n this._stat = (path) => statMethod(path, { bigint: true });\n }\n else {\n this._stat = statMethod;\n }\n this._maxDepth =\n opts.depth != null && Number.isSafeInteger(opts.depth) ? opts.depth : defaultOptions.depth;\n this._wantsDir = type ? DIR_TYPES.has(type) : false;\n this._wantsFile = type ? FILE_TYPES.has(type) : false;\n this._wantsEverything = type === EntryTypes.EVERYTHING_TYPE;\n this._root = presolve(root);\n this._isDirent = !opts.alwaysStat;\n this._statsProp = this._isDirent ? 'dirent' : 'stats';\n this._rdOptions = { encoding: 'utf8', withFileTypes: this._isDirent };\n // Launch stream with one parent, the root dir.\n this.parents = [this._exploreDir(root, 1)];\n this.reading = false;\n this.parent = undefined;\n }\n async _read(batch) {\n if (this.reading)\n return;\n this.reading = true;\n try {\n while (!this.destroyed && batch > 0) {\n const par = this.parent;\n const fil = par && par.files;\n if (fil && fil.length > 0) {\n const { path, depth } = par;\n const slice = fil.splice(0, batch).map((dirent) => this._formatEntry(dirent, path));\n const awaited = await Promise.all(slice);\n for (const entry of awaited) {\n if (!entry)\n continue;\n if (this.destroyed)\n return;\n const entryType = await this._getEntryType(entry);\n if (entryType === 'directory' && this._directoryFilter(entry)) {\n if (depth <= this._maxDepth) {\n this.parents.push(this._exploreDir(entry.fullPath, depth + 1));\n }\n if (this._wantsDir) {\n this.push(entry);\n batch--;\n }\n }\n else if ((entryType === 'file' || this._includeAsFile(entry)) &&\n this._fileFilter(entry)) {\n if (this._wantsFile) {\n this.push(entry);\n batch--;\n }\n }\n }\n }\n else {\n const parent = this.parents.pop();\n if (!parent) {\n this.push(null);\n break;\n }\n this.parent = await parent;\n if (this.destroyed)\n return;\n }\n }\n }\n catch (error) {\n this.destroy(error);\n }\n finally {\n this.reading = false;\n }\n }\n async _exploreDir(path, depth) {\n let files;\n try {\n files = await readdir(path, this._rdOptions);\n }\n catch (error) {\n this._onError(error);\n }\n return { files, depth, path };\n }\n async _formatEntry(dirent, path) {\n let entry;\n const basename = this._isDirent ? dirent.name : dirent;\n try {\n const fullPath = presolve(pjoin(path, basename));\n entry = { path: prelative(this._root, fullPath), fullPath, basename };\n entry[this._statsProp] = this._isDirent ? dirent : await this._stat(fullPath);\n }\n catch (err) {\n this._onError(err);\n return;\n }\n return entry;\n }\n _onError(err) {\n if (isNormalFlowError(err) && !this.destroyed) {\n this.emit('warn', err);\n }\n else {\n this.destroy(err);\n }\n }\n async _getEntryType(entry) {\n // entry may be undefined, because a warning or an error were emitted\n // and the statsProp is undefined\n if (!entry && this._statsProp in entry) {\n return '';\n }\n const stats = entry[this._statsProp];\n if (stats.isFile())\n return 'file';\n if (stats.isDirectory())\n return 'directory';\n if (stats && stats.isSymbolicLink()) {\n const full = entry.fullPath;\n try {\n const entryRealPath = await realpath(full);\n const entryRealPathStats = await lstat(entryRealPath);\n if (entryRealPathStats.isFile()) {\n return 'file';\n }\n if (entryRealPathStats.isDirectory()) {\n const len = entryRealPath.length;\n if (full.startsWith(entryRealPath) && full.substr(len, 1) === psep) {\n const recursiveError = new Error(`Circular symlink detected: \"${full}\" points to \"${entryRealPath}\"`);\n // @ts-ignore\n recursiveError.code = RECURSIVE_ERROR_CODE;\n return this._onError(recursiveError);\n }\n return 'directory';\n }\n }\n catch (error) {\n this._onError(error);\n return '';\n }\n }\n }\n _includeAsFile(entry) {\n const stats = entry && entry[this._statsProp];\n return stats && this._wantsEverything && !stats.isDirectory();\n }\n}\n/**\n * Streaming version: Reads all files and directories in given root recursively.\n * Consumes ~constant small amount of RAM.\n * @param root Root directory\n * @param options Options to specify root (start directory), filters and recursion depth\n */\nexport function readdirp(root, options = {}) {\n // @ts-ignore\n let type = options.entryType || options.type;\n if (type === 'both')\n type = EntryTypes.FILE_DIR_TYPE; // backwards-compatibility\n if (type)\n options.type = type;\n if (!root) {\n throw new Error('readdirp: root argument is required. Usage: readdirp(root, options)');\n }\n else if (typeof root !== 'string') {\n throw new TypeError('readdirp: root argument must be a string. Usage: readdirp(root, options)');\n }\n else if (type && !ALL_TYPES.includes(type)) {\n throw new Error(`readdirp: Invalid type passed. Use one of ${ALL_TYPES.join(', ')}`);\n }\n options.root = root;\n return new ReaddirpStream(options);\n}\n/**\n * Promise version: Reads all files and directories in given root recursively.\n * Compared to streaming version, will consume a lot of RAM e.g. when 1 million files are listed.\n * @returns array of paths and their entry infos\n */\nexport function readdirpPromise(root, options = {}) {\n return new Promise((resolve, reject) => {\n const files = [];\n readdirp(root, options)\n .on('data', (entry) => files.push(entry))\n .on('end', () => resolve(files))\n .on('error', (error) => reject(error));\n });\n}\nexport default readdirp;\n","import { watch as fs_watch, unwatchFile, watchFile } from 'node:fs';\nimport { realpath as fsrealpath, lstat, open, stat } from 'node:fs/promises';\nimport { type as osType } from 'node:os';\nimport * as sp from 'node:path';\nexport const STR_DATA = 'data';\nexport const STR_END = 'end';\nexport const STR_CLOSE = 'close';\nexport const EMPTY_FN = () => { };\nexport const IDENTITY_FN = (val) => val;\nconst pl = process.platform;\nexport const isWindows = pl === 'win32';\nexport const isMacos = pl === 'darwin';\nexport const isLinux = pl === 'linux';\nexport const isFreeBSD = pl === 'freebsd';\nexport const isIBMi = osType() === 'OS400';\nexport const EVENTS = {\n ALL: 'all',\n READY: 'ready',\n ADD: 'add',\n CHANGE: 'change',\n ADD_DIR: 'addDir',\n UNLINK: 'unlink',\n UNLINK_DIR: 'unlinkDir',\n RAW: 'raw',\n ERROR: 'error',\n};\nconst EV = EVENTS;\nconst THROTTLE_MODE_WATCH = 'watch';\nconst statMethods = { lstat, stat };\nconst KEY_LISTENERS = 'listeners';\nconst KEY_ERR = 'errHandlers';\nconst KEY_RAW = 'rawEmitters';\nconst HANDLER_KEYS = [KEY_LISTENERS, KEY_ERR, KEY_RAW];\n// prettier-ignore\nconst binaryExtensions = new Set([\n '3dm', '3ds', '3g2', '3gp', '7z', 'a', 'aac', 'adp', 'afdesign', 'afphoto', 'afpub', 'ai',\n 'aif', 'aiff', 'alz', 'ape', 'apk', 'appimage', 'ar', 'arj', 'asf', 'au', 'avi',\n 'bak', 'baml', 'bh', 'bin', 'bk', 'bmp', 'btif', 'bz2', 'bzip2',\n 'cab', 'caf', 'cgm', 'class', 'cmx', 'cpio', 'cr2', 'cur', 'dat', 'dcm', 'deb', 'dex', 'djvu',\n 'dll', 'dmg', 'dng', 'doc', 'docm', 'docx', 'dot', 'dotm', 'dra', 'DS_Store', 'dsk', 'dts',\n 'dtshd', 'dvb', 'dwg', 'dxf',\n 'ecelp4800', 'ecelp7470', 'ecelp9600', 'egg', 'eol', 'eot', 'epub', 'exe',\n 'f4v', 'fbs', 'fh', 'fla', 'flac', 'flatpak', 'fli', 'flv', 'fpx', 'fst', 'fvt',\n 'g3', 'gh', 'gif', 'graffle', 'gz', 'gzip',\n 'h261', 'h263', 'h264', 'icns', 'ico', 'ief', 'img', 'ipa', 'iso',\n 'jar', 'jpeg', 'jpg', 'jpgv', 'jpm', 'jxr', 'key', 'ktx',\n 'lha', 'lib', 'lvp', 'lz', 'lzh', 'lzma', 'lzo',\n 'm3u', 'm4a', 'm4v', 'mar', 'mdi', 'mht', 'mid', 'midi', 'mj2', 'mka', 'mkv', 'mmr', 'mng',\n 'mobi', 'mov', 'movie', 'mp3',\n 'mp4', 'mp4a', 'mpeg', 'mpg', 'mpga', 'mxu',\n 'nef', 'npx', 'numbers', 'nupkg',\n 'o', 'odp', 'ods', 'odt', 'oga', 'ogg', 'ogv', 'otf', 'ott',\n 'pages', 'pbm', 'pcx', 'pdb', 'pdf', 'pea', 'pgm', 'pic', 'png', 'pnm', 'pot', 'potm',\n 'potx', 'ppa', 'ppam',\n 'ppm', 'pps', 'ppsm', 'ppsx', 'ppt', 'pptm', 'pptx', 'psd', 'pya', 'pyc', 'pyo', 'pyv',\n 'qt',\n 'rar', 'ras', 'raw', 'resources', 'rgb', 'rip', 'rlc', 'rmf', 'rmvb', 'rpm', 'rtf', 'rz',\n 's3m', 's7z', 'scpt', 'sgi', 'shar', 'snap', 'sil', 'sketch', 'slk', 'smv', 'snk', 'so',\n 'stl', 'suo', 'sub', 'swf',\n 'tar', 'tbz', 'tbz2', 'tga', 'tgz', 'thmx', 'tif', 'tiff', 'tlz', 'ttc', 'ttf', 'txz',\n 'udf', 'uvh', 'uvi', 'uvm', 'uvp', 'uvs', 'uvu',\n 'viv', 'vob',\n 'war', 'wav', 'wax', 'wbmp', 'wdp', 'weba', 'webm', 'webp', 'whl', 'wim', 'wm', 'wma',\n 'wmv', 'wmx', 'woff', 'woff2', 'wrm', 'wvx',\n 'xbm', 'xif', 'xla', 'xlam', 'xls', 'xlsb', 'xlsm', 'xlsx', 'xlt', 'xltm', 'xltx', 'xm',\n 'xmind', 'xpi', 'xpm', 'xwd', 'xz',\n 'z', 'zip', 'zipx',\n]);\nconst isBinaryPath = (filePath) => binaryExtensions.has(sp.extname(filePath).slice(1).toLowerCase());\n// TODO: emit errors properly. Example: EMFILE on Macos.\nconst foreach = (val, fn) => {\n if (val instanceof Set) {\n val.forEach(fn);\n }\n else {\n fn(val);\n }\n};\nconst addAndConvert = (main, prop, item) => {\n let container = main[prop];\n if (!(container instanceof Set)) {\n main[prop] = container = new Set([container]);\n }\n container.add(item);\n};\nconst clearItem = (cont) => (key) => {\n const set = cont[key];\n if (set instanceof Set) {\n set.clear();\n }\n else {\n delete cont[key];\n }\n};\nconst delFromSet = (main, prop, item) => {\n const container = main[prop];\n if (container instanceof Set) {\n container.delete(item);\n }\n else if (container === item) {\n delete main[prop];\n }\n};\nconst isEmptySet = (val) => (val instanceof Set ? val.size === 0 : !val);\nconst FsWatchInstances = new Map();\n/**\n * Instantiates the fs_watch interface\n * @param path to be watched\n * @param options to be passed to fs_watch\n * @param listener main event handler\n * @param errHandler emits info about errors\n * @param emitRaw emits raw event data\n * @returns {NativeFsWatcher}\n */\nfunction createFsWatchInstance(path, options, listener, errHandler, emitRaw) {\n const handleEvent = (rawEvent, evPath) => {\n listener(path);\n emitRaw(rawEvent, evPath, { watchedPath: path });\n // emit based on events occurring for files from a directory's watcher in\n // case the file's watcher misses it (and rely on throttling to de-dupe)\n if (evPath && path !== evPath) {\n fsWatchBroadcast(sp.resolve(path, evPath), KEY_LISTENERS, sp.join(path, evPath));\n }\n };\n try {\n return fs_watch(path, {\n persistent: options.persistent,\n }, handleEvent);\n }\n catch (error) {\n errHandler(error);\n return undefined;\n }\n}\n/**\n * Helper for passing fs_watch event data to a collection of listeners\n * @param fullPath absolute path bound to fs_watch instance\n */\nconst fsWatchBroadcast = (fullPath, listenerType, val1, val2, val3) => {\n const cont = FsWatchInstances.get(fullPath);\n if (!cont)\n return;\n foreach(cont[listenerType], (listener) => {\n listener(val1, val2, val3);\n });\n};\n/**\n * Instantiates the fs_watch interface or binds listeners\n * to an existing one covering the same file system entry\n * @param path\n * @param fullPath absolute path\n * @param options to be passed to fs_watch\n * @param handlers container for event listener functions\n */\nconst setFsWatchListener = (path, fullPath, options, handlers) => {\n const { listener, errHandler, rawEmitter } = handlers;\n let cont = FsWatchInstances.get(fullPath);\n let watcher;\n if (!options.persistent) {\n watcher = createFsWatchInstance(path, options, listener, errHandler, rawEmitter);\n if (!watcher)\n return;\n return watcher.close.bind(watcher);\n }\n if (cont) {\n addAndConvert(cont, KEY_LISTENERS, listener);\n addAndConvert(cont, KEY_ERR, errHandler);\n addAndConvert(cont, KEY_RAW, rawEmitter);\n }\n else {\n watcher = createFsWatchInstance(path, options, fsWatchBroadcast.bind(null, fullPath, KEY_LISTENERS), errHandler, // no need to use broadcast here\n fsWatchBroadcast.bind(null, fullPath, KEY_RAW));\n if (!watcher)\n return;\n watcher.on(EV.ERROR, async (error) => {\n const broadcastErr = fsWatchBroadcast.bind(null, fullPath, KEY_ERR);\n if (cont)\n cont.watcherUnusable = true; // documented since Node 10.4.1\n // Workaround for https://github.com/joyent/node/issues/4337\n if (isWindows && error.code === 'EPERM') {\n try {\n const fd = await open(path, 'r');\n await fd.close();\n broadcastErr(error);\n }\n catch (err) {\n // do nothing\n }\n }\n else {\n broadcastErr(error);\n }\n });\n cont = {\n listeners: listener,\n errHandlers: errHandler,\n rawEmitters: rawEmitter,\n watcher,\n };\n FsWatchInstances.set(fullPath, cont);\n }\n // const index = cont.listeners.indexOf(listener);\n // removes this instance's listeners and closes the underlying fs_watch\n // instance if there are no more listeners left\n return () => {\n delFromSet(cont, KEY_LISTENERS, listener);\n delFromSet(cont, KEY_ERR, errHandler);\n delFromSet(cont, KEY_RAW, rawEmitter);\n if (isEmptySet(cont.listeners)) {\n // Check to protect against issue gh-730.\n // if (cont.watcherUnusable) {\n cont.watcher.close();\n // }\n FsWatchInstances.delete(fullPath);\n HANDLER_KEYS.forEach(clearItem(cont));\n // @ts-ignore\n cont.watcher = undefined;\n Object.freeze(cont);\n }\n };\n};\n// fs_watchFile helpers\n// object to hold per-process fs_watchFile instances\n// (may be shared across chokidar FSWatcher instances)\nconst FsWatchFileInstances = new Map();\n/**\n * Instantiates the fs_watchFile interface or binds listeners\n * to an existing one covering the same file system entry\n * @param path to be watched\n * @param fullPath absolute path\n * @param options options to be passed to fs_watchFile\n * @param handlers container for event listener functions\n * @returns closer\n */\nconst setFsWatchFileListener = (path, fullPath, options, handlers) => {\n const { listener, rawEmitter } = handlers;\n let cont = FsWatchFileInstances.get(fullPath);\n // let listeners = new Set();\n // let rawEmitters = new Set();\n const copts = cont && cont.options;\n if (copts && (copts.persistent < options.persistent || copts.interval > options.interval)) {\n // \"Upgrade\" the watcher to persistence or a quicker interval.\n // This creates some unlikely edge case issues if the user mixes\n // settings in a very weird way, but solving for those cases\n // doesn't seem worthwhile for the added complexity.\n // listeners = cont.listeners;\n // rawEmitters = cont.rawEmitters;\n unwatchFile(fullPath);\n cont = undefined;\n }\n if (cont) {\n addAndConvert(cont, KEY_LISTENERS, listener);\n addAndConvert(cont, KEY_RAW, rawEmitter);\n }\n else {\n // TODO\n // listeners.add(listener);\n // rawEmitters.add(rawEmitter);\n cont = {\n listeners: listener,\n rawEmitters: rawEmitter,\n options,\n watcher: watchFile(fullPath, options, (curr, prev) => {\n foreach(cont.rawEmitters, (rawEmitter) => {\n rawEmitter(EV.CHANGE, fullPath, { curr, prev });\n });\n const currmtime = curr.mtimeMs;\n if (curr.size !== prev.size || currmtime > prev.mtimeMs || currmtime === 0) {\n foreach(cont.listeners, (listener) => listener(path, curr));\n }\n }),\n };\n FsWatchFileInstances.set(fullPath, cont);\n }\n // const index = cont.listeners.indexOf(listener);\n // Removes this instance's listeners and closes the underlying fs_watchFile\n // instance if there are no more listeners left.\n return () => {\n delFromSet(cont, KEY_LISTENERS, listener);\n delFromSet(cont, KEY_RAW, rawEmitter);\n if (isEmptySet(cont.listeners)) {\n FsWatchFileInstances.delete(fullPath);\n unwatchFile(fullPath);\n cont.options = cont.watcher = undefined;\n Object.freeze(cont);\n }\n };\n};\n/**\n * @mixin\n */\nexport class NodeFsHandler {\n fsw;\n _boundHandleError;\n constructor(fsW) {\n this.fsw = fsW;\n this._boundHandleError = (error) => fsW._handleError(error);\n }\n /**\n * Watch file for changes with fs_watchFile or fs_watch.\n * @param path to file or dir\n * @param listener on fs change\n * @returns closer for the watcher instance\n */\n _watchWithNodeFs(path, listener) {\n const opts = this.fsw.options;\n const directory = sp.dirname(path);\n const basename = sp.basename(path);\n const parent = this.fsw._getWatchedDir(directory);\n parent.add(basename);\n const absolutePath = sp.resolve(path);\n const options = {\n persistent: opts.persistent,\n };\n if (!listener)\n listener = EMPTY_FN;\n let closer;\n if (opts.usePolling) {\n const enableBin = opts.interval !== opts.binaryInterval;\n options.interval = enableBin && isBinaryPath(basename) ? opts.binaryInterval : opts.interval;\n closer = setFsWatchFileListener(path, absolutePath, options, {\n listener,\n rawEmitter: this.fsw._emitRaw,\n });\n }\n else {\n closer = setFsWatchListener(path, absolutePath, options, {\n listener,\n errHandler: this._boundHandleError,\n rawEmitter: this.fsw._emitRaw,\n });\n }\n return closer;\n }\n /**\n * Watch a file and emit add event if warranted.\n * @returns closer for the watcher instance\n */\n _handleFile(file, stats, initialAdd) {\n if (this.fsw.closed) {\n return;\n }\n const dirname = sp.dirname(file);\n const basename = sp.basename(file);\n const parent = this.fsw._getWatchedDir(dirname);\n // stats is always present\n let prevStats = stats;\n // if the file is already being watched, do nothing\n if (parent.has(basename))\n return;\n const listener = async (path, newStats) => {\n if (!this.fsw._throttle(THROTTLE_MODE_WATCH, file, 5))\n return;\n if (!newStats || newStats.mtimeMs === 0) {\n try {\n const newStats = await stat(file);\n if (this.fsw.closed)\n return;\n // Check that change event was not fired because of changed only accessTime.\n const at = newStats.atimeMs;\n const mt = newStats.mtimeMs;\n if (!at || at <= mt || mt !== prevStats.mtimeMs) {\n this.fsw._emit(EV.CHANGE, file, newStats);\n }\n if ((isMacos || isLinux || isFreeBSD) && prevStats.ino !== newStats.ino) {\n this.fsw._closeFile(path);\n prevStats = newStats;\n const closer = this._watchWithNodeFs(file, listener);\n if (closer)\n this.fsw._addPathCloser(path, closer);\n }\n else {\n prevStats = newStats;\n }\n }\n catch (error) {\n // Fix issues where mtime is null but file is still present\n this.fsw._remove(dirname, basename);\n }\n // add is about to be emitted if file not already tracked in parent\n }\n else if (parent.has(basename)) {\n // Check that change event was not fired because of changed only accessTime.\n const at = newStats.atimeMs;\n const mt = newStats.mtimeMs;\n if (!at || at <= mt || mt !== prevStats.mtimeMs) {\n this.fsw._emit(EV.CHANGE, file, newStats);\n }\n prevStats = newStats;\n }\n };\n // kick off the watcher\n const closer = this._watchWithNodeFs(file, listener);\n // emit an add event if we're supposed to\n if (!(initialAdd && this.fsw.options.ignoreInitial) && this.fsw._isntIgnored(file)) {\n if (!this.fsw._throttle(EV.ADD, file, 0))\n return;\n this.fsw._emit(EV.ADD, file, stats);\n }\n return closer;\n }\n /**\n * Handle symlinks encountered while reading a dir.\n * @param entry returned by readdirp\n * @param directory path of dir being read\n * @param path of this item\n * @param item basename of this item\n * @returns true if no more processing is needed for this entry.\n */\n async _handleSymlink(entry, directory, path, item) {\n if (this.fsw.closed) {\n return;\n }\n const full = entry.fullPath;\n const dir = this.fsw._getWatchedDir(directory);\n if (!this.fsw.options.followSymlinks) {\n // watch symlink directly (don't follow) and detect changes\n this.fsw._incrReadyCount();\n let linkPath;\n try {\n linkPath = await fsrealpath(path);\n }\n catch (e) {\n this.fsw._emitReady();\n return true;\n }\n if (this.fsw.closed)\n return;\n if (dir.has(item)) {\n if (this.fsw._symlinkPaths.get(full) !== linkPath) {\n this.fsw._symlinkPaths.set(full, linkPath);\n this.fsw._emit(EV.CHANGE, path, entry.stats);\n }\n }\n else {\n dir.add(item);\n this.fsw._symlinkPaths.set(full, linkPath);\n this.fsw._emit(EV.ADD, path, entry.stats);\n }\n this.fsw._emitReady();\n return true;\n }\n // don't follow the same symlink more than once\n if (this.fsw._symlinkPaths.has(full)) {\n return true;\n }\n this.fsw._symlinkPaths.set(full, true);\n }\n _handleRead(directory, initialAdd, wh, target, dir, depth, throttler) {\n // Normalize the directory name on Windows\n directory = sp.join(directory, '');\n const throttleKey = target ? `${directory}:${target}` : directory;\n throttler = this.fsw._throttle('readdir', throttleKey, 1000);\n if (!throttler)\n return;\n const previous = this.fsw._getWatchedDir(wh.path);\n const current = new Set();\n let stream = this.fsw._readdirp(directory, {\n fileFilter: (entry) => wh.filterPath(entry),\n directoryFilter: (entry) => wh.filterDir(entry),\n });\n if (!stream)\n return;\n stream\n .on(STR_DATA, async (entry) => {\n if (this.fsw.closed) {\n stream = undefined;\n return;\n }\n const item = entry.path;\n let path = sp.join(directory, item);\n current.add(item);\n if (entry.stats.isSymbolicLink() &&\n (await this._handleSymlink(entry, directory, path, item))) {\n return;\n }\n if (this.fsw.closed) {\n stream = undefined;\n return;\n }\n // Files that present in current directory snapshot\n // but absent in previous are added to watch list and\n // emit `add` event.\n if (item === target || (!target && !previous.has(item))) {\n this.fsw._incrReadyCount();\n // ensure relativeness of path is preserved in case of watcher reuse\n path = sp.join(dir, sp.relative(dir, path));\n this._addToNodeFs(path, initialAdd, wh, depth + 1);\n }\n })\n .on(EV.ERROR, this._boundHandleError);\n return new Promise((resolve, reject) => {\n if (!stream)\n return reject();\n stream.once(STR_END, () => {\n if (this.fsw.closed) {\n stream = undefined;\n return;\n }\n const wasThrottled = throttler ? throttler.clear() : false;\n resolve(undefined);\n // Files that absent in current directory snapshot\n // but present in previous emit `remove` event\n // and are removed from @watched[directory].\n previous\n .getChildren()\n .filter((item) => {\n return item !== directory && !current.has(item);\n })\n .forEach((item) => {\n this.fsw._remove(directory, item);\n });\n stream = undefined;\n // one more time for any missed in case changes came in extremely quickly\n if (wasThrottled)\n this._handleRead(directory, false, wh, target, dir, depth, throttler);\n });\n });\n }\n /**\n * Read directory to add / remove files from `@watched` list and re-read it on change.\n * @param dir fs path\n * @param stats\n * @param initialAdd\n * @param depth relative to user-supplied path\n * @param target child path targeted for watch\n * @param wh Common watch helpers for this path\n * @param realpath\n * @returns closer for the watcher instance.\n */\n async _handleDir(dir, stats, initialAdd, depth, target, wh, realpath) {\n const parentDir = this.fsw._getWatchedDir(sp.dirname(dir));\n const tracked = parentDir.has(sp.basename(dir));\n if (!(initialAdd && this.fsw.options.ignoreInitial) && !target && !tracked) {\n this.fsw._emit(EV.ADD_DIR, dir, stats);\n }\n // ensure dir is tracked (harmless if redundant)\n parentDir.add(sp.basename(dir));\n this.fsw._getWatchedDir(dir);\n let throttler;\n let closer;\n const oDepth = this.fsw.options.depth;\n if ((oDepth == null || depth <= oDepth) && !this.fsw._symlinkPaths.has(realpath)) {\n if (!target) {\n await this._handleRead(dir, initialAdd, wh, target, dir, depth, throttler);\n if (this.fsw.closed)\n return;\n }\n closer = this._watchWithNodeFs(dir, (dirPath, stats) => {\n // if current directory is removed, do nothing\n if (stats && stats.mtimeMs === 0)\n return;\n this._handleRead(dirPath, false, wh, target, dir, depth, throttler);\n });\n }\n return closer;\n }\n /**\n * Handle added file, directory, or glob pattern.\n * Delegates call to _handleFile / _handleDir after checks.\n * @param path to file or ir\n * @param initialAdd was the file added at watch instantiation?\n * @param priorWh depth relative to user-supplied path\n * @param depth Child path actually targeted for watch\n * @param target Child path actually targeted for watch\n */\n async _addToNodeFs(path, initialAdd, priorWh, depth, target) {\n const ready = this.fsw._emitReady;\n if (this.fsw._isIgnored(path) || this.fsw.closed) {\n ready();\n return false;\n }\n const wh = this.fsw._getWatchHelpers(path);\n if (priorWh) {\n wh.filterPath = (entry) => priorWh.filterPath(entry);\n wh.filterDir = (entry) => priorWh.filterDir(entry);\n }\n // evaluate what is at the path we're being asked to watch\n try {\n const stats = await statMethods[wh.statMethod](wh.watchPath);\n if (this.fsw.closed)\n return;\n if (this.fsw._isIgnored(wh.watchPath, stats)) {\n ready();\n return false;\n }\n const follow = this.fsw.options.followSymlinks;\n let closer;\n if (stats.isDirectory()) {\n const absPath = sp.resolve(path);\n const targetPath = follow ? await fsrealpath(path) : path;\n if (this.fsw.closed)\n return;\n closer = await this._handleDir(wh.watchPath, stats, initialAdd, depth, target, wh, targetPath);\n if (this.fsw.closed)\n return;\n // preserve this symlink's target path\n if (absPath !== targetPath && targetPath !== undefined) {\n this.fsw._symlinkPaths.set(absPath, targetPath);\n }\n }\n else if (stats.isSymbolicLink()) {\n const targetPath = follow ? await fsrealpath(path) : path;\n if (this.fsw.closed)\n return;\n const parent = sp.dirname(wh.watchPath);\n this.fsw._getWatchedDir(parent).add(wh.watchPath);\n this.fsw._emit(EV.ADD, wh.watchPath, stats);\n closer = await this._handleDir(parent, stats, initialAdd, depth, path, wh, targetPath);\n if (this.fsw.closed)\n return;\n // preserve this symlink's target path\n if (targetPath !== undefined) {\n this.fsw._symlinkPaths.set(sp.resolve(path), targetPath);\n }\n }\n else {\n closer = this._handleFile(wh.watchPath, stats, initialAdd);\n }\n ready();\n if (closer)\n this.fsw._addPathCloser(path, closer);\n return false;\n }\n catch (error) {\n if (this.fsw._handleError(error)) {\n ready();\n return path;\n }\n }\n }\n}\n","import chokidar, { FSWatcher } from \"chokidar\";\nimport * as path from \"path\";\n\nimport { CodebaseIndexConfig } from \"../config/schema.js\";\nimport { createIgnoreFilter, shouldIncludeFile } from \"../utils/files.js\";\nimport { Indexer } from \"../indexer/index.js\";\n\nexport type FileChangeType = \"add\" | \"change\" | \"unlink\";\n\nexport interface FileChange {\n type: FileChangeType;\n path: string;\n}\n\nexport type ChangeHandler = (changes: FileChange[]) => Promise<void>;\n\nexport class FileWatcher {\n private watcher: FSWatcher | null = null;\n private projectRoot: string;\n private config: CodebaseIndexConfig;\n private pendingChanges: Map<string, FileChangeType> = new Map();\n private debounceTimer: NodeJS.Timeout | null = null;\n private debounceMs = 1000;\n private onChanges: ChangeHandler | null = null;\n\n constructor(projectRoot: string, config: CodebaseIndexConfig) {\n this.projectRoot = projectRoot;\n this.config = config;\n }\n\n start(handler: ChangeHandler): void {\n if (this.watcher) {\n return;\n }\n\n this.onChanges = handler;\n const ignoreFilter = createIgnoreFilter(this.projectRoot);\n\n this.watcher = chokidar.watch(this.projectRoot, {\n ignored: (filePath: string) => {\n const relativePath = path.relative(this.projectRoot, filePath);\n if (!relativePath) return false;\n\n if (ignoreFilter.ignores(relativePath)) {\n return true;\n }\n\n return false;\n },\n persistent: true,\n ignoreInitial: true,\n awaitWriteFinish: {\n stabilityThreshold: 300,\n pollInterval: 100,\n },\n });\n\n this.watcher.on(\"add\", (filePath) => this.handleChange(\"add\", filePath));\n this.watcher.on(\"change\", (filePath) => this.handleChange(\"change\", filePath));\n this.watcher.on(\"unlink\", (filePath) => this.handleChange(\"unlink\", filePath));\n }\n\n private handleChange(type: FileChangeType, filePath: string): void {\n if (\n !shouldIncludeFile(\n filePath,\n this.projectRoot,\n this.config.include,\n this.config.exclude,\n createIgnoreFilter(this.projectRoot)\n )\n ) {\n return;\n }\n\n this.pendingChanges.set(filePath, type);\n this.scheduleFlush();\n }\n\n private scheduleFlush(): void {\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n }\n\n this.debounceTimer = setTimeout(() => {\n this.flush();\n }, this.debounceMs);\n }\n\n private async flush(): Promise<void> {\n if (this.pendingChanges.size === 0 || !this.onChanges) {\n return;\n }\n\n const changes: FileChange[] = Array.from(this.pendingChanges.entries()).map(\n ([path, type]) => ({ path, type })\n );\n\n this.pendingChanges.clear();\n\n try {\n await this.onChanges(changes);\n } catch (error) {\n console.error(\"Error handling file changes:\", error);\n }\n }\n\n stop(): void {\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n this.debounceTimer = null;\n }\n\n if (this.watcher) {\n this.watcher.close();\n this.watcher = null;\n }\n\n this.pendingChanges.clear();\n this.onChanges = null;\n }\n\n isRunning(): boolean {\n return this.watcher !== null;\n }\n}\n\nexport function createWatcherWithIndexer(\n indexer: Indexer,\n projectRoot: string,\n config: CodebaseIndexConfig\n): FileWatcher {\n const watcher = new FileWatcher(projectRoot, config);\n\n watcher.start(async (changes) => {\n const hasAddOrChange = changes.some(\n (c) => c.type === \"add\" || c.type === \"change\"\n );\n const hasDelete = changes.some((c) => c.type === \"unlink\");\n\n if (hasAddOrChange || hasDelete) {\n await indexer.index();\n }\n });\n\n return watcher;\n}\n","import { tool, type ToolDefinition } from \"@opencode-ai/plugin\";\n\nimport { Indexer, IndexStats } from \"../indexer/index.js\";\nimport { ParsedCodebaseIndexConfig } from \"../config/schema.js\";\nimport { formatCostEstimate } from \"../utils/cost.js\";\n\n// Use Zod from plugin to ensure version compatibility\nconst z = tool.schema;\n\nlet sharedIndexer: Indexer | null = null;\n\nexport function initializeTools(projectRoot: string, config: ParsedCodebaseIndexConfig): void {\n sharedIndexer = new Indexer(projectRoot, config);\n}\n\nfunction getIndexer(): Indexer {\n if (!sharedIndexer) {\n throw new Error(\"Codebase index tools not initialized. Plugin may not be loaded correctly.\");\n }\n return sharedIndexer;\n}\n\nexport const codebase_search: ToolDefinition = tool({\n description:\n \"Search codebase by MEANING, not keywords. Use when you don't know exact function/class names. Returns focused results (5-10 files). For known identifiers like 'validateToken' or 'UserService', use grep instead - it's faster and finds all occurrences. Best for: 'find authentication logic', 'code that handles payments', 'error middleware'.\",\n args: {\n query: z\n .string()\n .describe(\"Natural language description of what code you're looking for. Describe behavior, not syntax.\"),\n limit: z\n .number()\n .optional()\n .default(10)\n .describe(\"Maximum number of results to return\"),\n fileType: z\n .string()\n .optional()\n .describe(\"Filter by file extension (e.g., 'ts', 'py', 'rs')\"),\n directory: z\n .string()\n .optional()\n .describe(\"Filter by directory path (e.g., 'src/utils', 'lib')\"),\n chunkType: z\n .enum([\"function\", \"class\", \"method\", \"interface\", \"type\", \"enum\", \"struct\", \"impl\", \"trait\", \"module\", \"other\"])\n .optional()\n .describe(\"Filter by code chunk type\"),\n contextLines: z\n .number()\n .optional()\n .describe(\"Number of extra lines to include before/after each match (default: 0)\"),\n },\n async execute(args) {\n const indexer = getIndexer();\n const results = await indexer.search(args.query, args.limit, {\n fileType: args.fileType,\n directory: args.directory,\n chunkType: args.chunkType,\n contextLines: args.contextLines,\n });\n\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 header = r.name\n ? `[${idx + 1}] ${r.chunkType} \"${r.name}\" in ${r.filePath}:${r.startLine}-${r.endLine}`\n : `[${idx + 1}] ${r.chunkType} in ${r.filePath}:${r.startLine}-${r.endLine}`;\n\n return `${header} (score: ${r.score.toFixed(2)})\\n\\`\\`\\`\\n${r.content}\\n\\`\\`\\``;\n });\n\n return `Found ${results.length} results for \"${args.query}\":\\n\\n${formatted.join(\"\\n\\n\")}`;\n },\n});\n\nexport const index_codebase: ToolDefinition = tool({\n description:\n \"Index the codebase for semantic search. Creates vector embeddings of code chunks. Incremental - only re-indexes changed files (~50ms when nothing changed). Run before first codebase_search.\",\n args: {\n force: z\n .boolean()\n .optional()\n .default(false)\n .describe(\"Force reindex even if already indexed\"),\n estimateOnly: z\n .boolean()\n .optional()\n .default(false)\n .describe(\"Only show cost estimate without indexing\"),\n verbose: z\n .boolean()\n .optional()\n .default(false)\n .describe(\"Show detailed info about skipped files and parsing failures\"),\n },\n async execute(args) {\n const indexer = getIndexer();\n\n if (args.estimateOnly) {\n const estimate = await indexer.estimateCost();\n return formatCostEstimate(estimate);\n }\n\n if (args.force) {\n await indexer.clearIndex();\n }\n\n const stats = await indexer.index();\n return formatIndexStats(stats, args.verbose);\n },\n});\n\nexport const index_status: ToolDefinition = tool({\n description:\n \"Check the status of the codebase index. Shows whether the codebase is indexed, how many chunks are stored, and the embedding provider being used.\",\n args: {},\n async execute() {\n const indexer = getIndexer();\n const status = await indexer.getStatus();\n return formatStatus(status);\n },\n});\n\nexport const index_health_check: ToolDefinition = tool({\n description:\n \"Check index health and remove stale entries from deleted files. Run this to clean up the index after files have been deleted.\",\n args: {},\n async execute() {\n const indexer = getIndexer();\n const result = await indexer.healthCheck();\n\n if (result.removed === 0) {\n return \"Index is healthy. No stale entries found.\";\n }\n\n const lines = [\n `Health check complete:`,\n ` Removed stale entries: ${result.removed}`,\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});\n\nfunction formatIndexStats(stats: IndexStats, verbose: boolean = false): string {\n const lines: string[] = [];\n \n if (stats.indexedChunks === 0 && stats.removedChunks === 0) {\n lines.push(`Indexed. ${stats.totalFiles} files processed, ${stats.existingChunks} code chunks already up to date.`);\n } else if (stats.indexedChunks === 0) {\n lines.push(`Indexed. ${stats.totalFiles} files, removed ${stats.removedChunks} stale chunks, ${stats.existingChunks} chunks remain.`);\n } else {\n let main = `Indexed. ${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\nfunction formatStatus(status: {\n indexed: boolean;\n vectorCount: number;\n provider: string;\n model: string;\n indexPath: string;\n}): string {\n if (!status.indexed) {\n return \"Codebase is not indexed. Run index_codebase to create an index.\";\n }\n\n return [\n `Index status:`,\n ` Indexed chunks: ${status.vectorCount.toLocaleString()}`,\n ` Provider: ${status.provider}`,\n ` Model: ${status.model}`,\n ` Location: ${status.indexPath}`,\n ].join(\"\\n\");\n}\n"],"mappings":"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","names":["exports","module","EventEmitter","exports","module","SLASH","path","Ignore","import_fs","path","import_fs","path","resolve","EventEmitter","resolve","reject","resolve","import_fs","path","os","import_fs","path","ignore","fsPromises","stat","path","os","platform","arch","estimateTokens","import_fs","path","b","fsPromises","import_node_fs","import_promises","sp","path","presolve","basename","pjoin","prelative","psep","import_promises","osType","path","fs_watch","rawEmitter","listener","basename","dirname","newStats","closer","fsrealpath","resolve","realpath","stats","relative","path","testString","stats","statcb","now","stat","path","path","z"]}
|