reasonix 0.50.0 → 0.51.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dashboard/dist/app.css +1 -1
- package/dashboard/dist/app.js +24 -22
- package/dashboard/dist/app.js.map +1 -1
- package/dist/cli/{acp-6B25WIFF.js → acp-XEUHGG7X.js} +34 -31
- package/dist/cli/acp-XEUHGG7X.js.map +1 -0
- package/dist/cli/chat-NJ2Q5KHG.js +50 -0
- package/dist/cli/{chunk-OPGWCKKU.js → chunk-2HVTBFCI.js} +3 -3
- package/dist/cli/{chunk-AJIZ5KFK.js → chunk-2WUEAI2I.js} +3 -3
- package/dist/cli/{chunk-I4Q3QT4W.js → chunk-36BM7INR.js} +2 -2
- package/dist/cli/{chunk-3RNFYDDM.js → chunk-3BTK5BHI.js} +11 -7
- package/dist/cli/chunk-3BTK5BHI.js.map +1 -0
- package/dist/cli/{chunk-GMSAB2TC.js → chunk-3YRTIWFX.js} +2 -2
- package/dist/cli/{chunk-NLRC3DWQ.js → chunk-544J4PXD.js} +5 -5
- package/dist/cli/{chunk-7WITYWKN.js → chunk-5AIDYVH2.js} +2 -2
- package/dist/cli/{chunk-ALCOQP6R.js → chunk-5BBC6YMV.js} +5 -5
- package/dist/cli/{chunk-S4XVGLRW.js → chunk-6UNHNVJR.js} +72 -5
- package/dist/cli/chunk-6UNHNVJR.js.map +1 -0
- package/dist/cli/{chunk-IK6WWRIX.js → chunk-6XWXIVQ3.js} +38 -22
- package/dist/cli/chunk-6XWXIVQ3.js.map +1 -0
- package/dist/cli/{chunk-AAHB2PFX.js → chunk-7YB26OQO.js} +4 -4
- package/dist/cli/chunk-7YB26OQO.js.map +1 -0
- package/dist/cli/{chunk-MXWPAPZW.js → chunk-A5PBEIJ7.js} +53 -10
- package/dist/cli/chunk-A5PBEIJ7.js.map +1 -0
- package/dist/cli/{chunk-FQSQFCBI.js → chunk-BA5R6BAE.js} +2 -2
- package/dist/cli/{chunk-XWPZHWC2.js → chunk-BM6BBFAV.js} +2 -2
- package/dist/cli/{chunk-CAGKEGNE.js → chunk-BOWSNGQC.js} +52 -140
- package/dist/cli/chunk-BOWSNGQC.js.map +1 -0
- package/dist/cli/{chunk-EZ57UEZQ.js → chunk-C2MRSJTV.js} +2 -2
- package/dist/cli/{chunk-PYIZZAVQ.js → chunk-DVD67FXQ.js} +1716 -4
- package/dist/cli/chunk-DVD67FXQ.js.map +1 -0
- package/dist/cli/{chunk-ZAXMJANP.js → chunk-EAMXOWUW.js} +3 -3
- package/dist/cli/{chunk-TX652NBA.js → chunk-EWVFGYT6.js} +2 -2
- package/dist/cli/{chunk-IBRTU5WO.js → chunk-FP7IOWBQ.js} +18 -1182
- package/dist/cli/chunk-FP7IOWBQ.js.map +1 -0
- package/dist/cli/{chunk-I6FBSTTR.js → chunk-HGK57NBN.js} +9 -353
- package/dist/cli/chunk-HGK57NBN.js.map +1 -0
- package/dist/cli/chunk-JHWQDJZA.js +80 -0
- package/dist/cli/chunk-JHWQDJZA.js.map +1 -0
- package/dist/cli/{chunk-X2BQZQEE.js → chunk-K3QJ3GKI.js} +3 -3
- package/dist/cli/{chunk-GPUH2BNM.js → chunk-K4YQFULP.js} +612 -254
- package/dist/cli/chunk-K4YQFULP.js.map +1 -0
- package/dist/cli/chunk-L3VPEESB.js +31 -0
- package/dist/cli/chunk-L3VPEESB.js.map +1 -0
- package/dist/cli/{chunk-ENFBF6HI.js → chunk-N4SEBLU4.js} +383 -5
- package/dist/cli/chunk-N4SEBLU4.js.map +1 -0
- package/dist/cli/chunk-NRROJXXT.js +879 -0
- package/dist/cli/chunk-NRROJXXT.js.map +1 -0
- package/dist/cli/{chunk-3KRRTLC5.js → chunk-R6KIHEF3.js} +1619 -1036
- package/dist/cli/chunk-R6KIHEF3.js.map +1 -0
- package/dist/cli/{chunk-VVMY4M7J.js → chunk-SBHF5NWD.js} +27 -4
- package/dist/cli/chunk-SBHF5NWD.js.map +1 -0
- package/dist/cli/{chunk-OWA42BKS.js → chunk-SXSAWOB7.js} +14 -14
- package/dist/cli/{chunk-6IUMTRFP.js → chunk-UMZ6KHTS.js} +2 -2
- package/dist/cli/{chunk-7X4JJOO7.js → chunk-UO6E7FN3.js} +69 -5
- package/dist/cli/{chunk-7X4JJOO7.js.map → chunk-UO6E7FN3.js.map} +1 -1
- package/dist/cli/{chunk-3ZZXQ3CZ.js → chunk-UPW544V3.js} +2 -2
- package/dist/cli/{chunk-XJZWMU5P.js → chunk-WPOKBW5E.js} +2 -2
- package/dist/cli/{chunk-WSBFVOCO.js → chunk-Z3MKG7MQ.js} +2 -2
- package/dist/cli/{code-TBK2TASK.js → code-BMXLBC7D.js} +37 -36
- package/dist/cli/{code-TBK2TASK.js.map → code-BMXLBC7D.js.map} +1 -1
- package/dist/cli/{commands-NXTKSQTN.js → commands-E4RZXMF6.js} +5 -5
- package/dist/cli/{commit-IR5SPP7A.js → commit-KSRQ64IL.js} +3 -3
- package/dist/cli/{config-XK5WQGTS.js → config-QNDONOTU.js} +4 -2
- package/dist/cli/{desktop-5NTQBADL.js → desktop-H3ZHIMDA.js} +83 -37
- package/dist/cli/desktop-H3ZHIMDA.js.map +1 -0
- package/dist/cli/{diff-JNYX5BSZ.js → diff-I4PYI43W.js} +9 -9
- package/dist/cli/{doctor-IKYLUFXX.js → doctor-Y2E4MY2F.js} +12 -12
- package/dist/cli/{events-HSC57ONU.js → events-47HOT7ZA.js} +5 -5
- package/dist/cli/find-in-code-YLEIK5FK.js +145 -0
- package/dist/cli/find-in-code-YLEIK5FK.js.map +1 -0
- package/dist/cli/index.js +95 -44
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/{mcp-BDJJWOCD.js → mcp-76DK63ZB.js} +3 -3
- package/dist/cli/{mcp-browse-NJRZDI6V.js → mcp-browse-SDNUGO74.js} +3 -3
- package/dist/cli/{mcp-inspect-Y62NWZQL.js → mcp-inspect-BL5DEO5M.js} +3 -3
- package/dist/cli/{prompt-UTOIFUQC.js → prompt-JLATI3P7.js} +5 -5
- package/dist/cli/{prune-sessions-UCUD4XAP.js → prune-sessions-WHZDFUKD.js} +4 -4
- package/dist/cli/{replay-VVIN64MN.js → replay-MHXS7C7Z.js} +10 -10
- package/dist/cli/{run-76OBDZFB.js → run-SXNCPRJE.js} +22 -22
- package/dist/cli/{server-SZZDKTH2.js → server-GEHOE6CO.js} +61 -35
- package/dist/cli/server-GEHOE6CO.js.map +1 -0
- package/dist/cli/{sessions-FZTGRCM5.js → sessions-EPBFYISL.js} +18 -18
- package/dist/cli/{setup-4UNENGOE.js → setup-IW2XR5XI.js} +8 -7
- package/dist/cli/setup-IW2XR5XI.js.map +1 -0
- package/dist/cli/{stats-F4NDOD7D.js → stats-4WB4XHBP.js} +6 -6
- package/dist/cli/symbols-UQ274IOB.js +167 -0
- package/dist/cli/symbols-UQ274IOB.js.map +1 -0
- package/dist/cli/version-4SP3DLLH.js +33 -0
- package/dist/index.d.ts +25 -6
- package/dist/index.js +2700 -578
- package/dist/index.js.map +1 -1
- package/package.json +6 -3
- package/scripts/postinstall.mjs +10 -0
- package/dist/cli/acp-6B25WIFF.js.map +0 -1
- package/dist/cli/chat-7WASPB4O.js +0 -50
- package/dist/cli/chunk-3KRRTLC5.js.map +0 -1
- package/dist/cli/chunk-3RNFYDDM.js.map +0 -1
- package/dist/cli/chunk-AAHB2PFX.js.map +0 -1
- package/dist/cli/chunk-CAGKEGNE.js.map +0 -1
- package/dist/cli/chunk-ENFBF6HI.js.map +0 -1
- package/dist/cli/chunk-GPUH2BNM.js.map +0 -1
- package/dist/cli/chunk-I6FBSTTR.js.map +0 -1
- package/dist/cli/chunk-IBRTU5WO.js.map +0 -1
- package/dist/cli/chunk-IK6WWRIX.js.map +0 -1
- package/dist/cli/chunk-MXWPAPZW.js.map +0 -1
- package/dist/cli/chunk-PYIZZAVQ.js.map +0 -1
- package/dist/cli/chunk-S4XVGLRW.js.map +0 -1
- package/dist/cli/chunk-VVMY4M7J.js.map +0 -1
- package/dist/cli/desktop-5NTQBADL.js.map +0 -1
- package/dist/cli/server-SZZDKTH2.js.map +0 -1
- package/dist/cli/setup-4UNENGOE.js.map +0 -1
- package/dist/cli/version-LUVTWHLL.js +0 -33
- /package/dist/cli/{chat-7WASPB4O.js.map → chat-NJ2Q5KHG.js.map} +0 -0
- /package/dist/cli/{chunk-OPGWCKKU.js.map → chunk-2HVTBFCI.js.map} +0 -0
- /package/dist/cli/{chunk-AJIZ5KFK.js.map → chunk-2WUEAI2I.js.map} +0 -0
- /package/dist/cli/{chunk-I4Q3QT4W.js.map → chunk-36BM7INR.js.map} +0 -0
- /package/dist/cli/{chunk-GMSAB2TC.js.map → chunk-3YRTIWFX.js.map} +0 -0
- /package/dist/cli/{chunk-NLRC3DWQ.js.map → chunk-544J4PXD.js.map} +0 -0
- /package/dist/cli/{chunk-7WITYWKN.js.map → chunk-5AIDYVH2.js.map} +0 -0
- /package/dist/cli/{chunk-ALCOQP6R.js.map → chunk-5BBC6YMV.js.map} +0 -0
- /package/dist/cli/{chunk-FQSQFCBI.js.map → chunk-BA5R6BAE.js.map} +0 -0
- /package/dist/cli/{chunk-XWPZHWC2.js.map → chunk-BM6BBFAV.js.map} +0 -0
- /package/dist/cli/{chunk-EZ57UEZQ.js.map → chunk-C2MRSJTV.js.map} +0 -0
- /package/dist/cli/{chunk-ZAXMJANP.js.map → chunk-EAMXOWUW.js.map} +0 -0
- /package/dist/cli/{chunk-TX652NBA.js.map → chunk-EWVFGYT6.js.map} +0 -0
- /package/dist/cli/{chunk-X2BQZQEE.js.map → chunk-K3QJ3GKI.js.map} +0 -0
- /package/dist/cli/{chunk-OWA42BKS.js.map → chunk-SXSAWOB7.js.map} +0 -0
- /package/dist/cli/{chunk-6IUMTRFP.js.map → chunk-UMZ6KHTS.js.map} +0 -0
- /package/dist/cli/{chunk-3ZZXQ3CZ.js.map → chunk-UPW544V3.js.map} +0 -0
- /package/dist/cli/{chunk-XJZWMU5P.js.map → chunk-WPOKBW5E.js.map} +0 -0
- /package/dist/cli/{chunk-WSBFVOCO.js.map → chunk-Z3MKG7MQ.js.map} +0 -0
- /package/dist/cli/{commands-NXTKSQTN.js.map → commands-E4RZXMF6.js.map} +0 -0
- /package/dist/cli/{commit-IR5SPP7A.js.map → commit-KSRQ64IL.js.map} +0 -0
- /package/dist/cli/{config-XK5WQGTS.js.map → config-QNDONOTU.js.map} +0 -0
- /package/dist/cli/{diff-JNYX5BSZ.js.map → diff-I4PYI43W.js.map} +0 -0
- /package/dist/cli/{doctor-IKYLUFXX.js.map → doctor-Y2E4MY2F.js.map} +0 -0
- /package/dist/cli/{events-HSC57ONU.js.map → events-47HOT7ZA.js.map} +0 -0
- /package/dist/cli/{mcp-BDJJWOCD.js.map → mcp-76DK63ZB.js.map} +0 -0
- /package/dist/cli/{mcp-browse-NJRZDI6V.js.map → mcp-browse-SDNUGO74.js.map} +0 -0
- /package/dist/cli/{mcp-inspect-Y62NWZQL.js.map → mcp-inspect-BL5DEO5M.js.map} +0 -0
- /package/dist/cli/{prompt-UTOIFUQC.js.map → prompt-JLATI3P7.js.map} +0 -0
- /package/dist/cli/{prune-sessions-UCUD4XAP.js.map → prune-sessions-WHZDFUKD.js.map} +0 -0
- /package/dist/cli/{replay-VVIN64MN.js.map → replay-MHXS7C7Z.js.map} +0 -0
- /package/dist/cli/{run-76OBDZFB.js.map → run-SXNCPRJE.js.map} +0 -0
- /package/dist/cli/{sessions-FZTGRCM5.js.map → sessions-EPBFYISL.js.map} +0 -0
- /package/dist/cli/{stats-F4NDOD7D.js.map → stats-4WB4XHBP.js.map} +0 -0
- /package/dist/cli/{version-LUVTWHLL.js.map → version-4SP3DLLH.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../node_modules/ignore/index.js","../../src/gitignore.ts"],"sourcesContent":["// 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","/** Nested .gitignore evaluation — shared by the at-mention picker walker and the semantic chunker. */\n\nimport { readFileSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport ignore, { type Ignore } from \"ignore\";\n\nexport interface GitignoreLayer {\n /** Absolute dir the .gitignore lives in. Patterns evaluate relative to this. */\n dirAbs: string;\n ig: Ignore;\n}\n\nexport async function loadGitignoreAt(dirAbs: string): Promise<Ignore | null> {\n try {\n return ignore().add(await readFile(path.join(dirAbs, \".gitignore\"), \"utf8\"));\n } catch {\n return null;\n }\n}\n\nexport function loadGitignoreAtSync(dirAbs: string): Ignore | null {\n try {\n return ignore().add(readFileSync(path.join(dirAbs, \".gitignore\"), \"utf8\"));\n } catch {\n return null;\n }\n}\n\n/** True if any layer — outermost to innermost — ignores this path. */\nexport function ignoredByLayers(\n layers: readonly GitignoreLayer[],\n abs: string,\n isDir: boolean,\n): boolean {\n for (const layer of layers) {\n const rel = path.relative(layer.dirAbs, abs).split(path.sep).join(\"/\");\n if (!rel || rel.startsWith(\"..\")) continue;\n if (layer.ig.ignores(isDir ? `${rel}/` : rel)) return true;\n }\n return false;\n}\n"],"mappings":"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","names":["path","ignore"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli/ui/keystroke-context.tsx","../../src/cli/ui/stdin-reader.ts","../../src/cli/ui/Select.tsx"],"sourcesContent":["/**\n * KeystrokeContext — React surface in front of the raw stdin reader.\n *\n * Replaces Ink's `useInput` chain. Reasonix's components no longer\n * import `useInput` from \"ink\"; they call `useKeystroke(handler,\n * isActive)` from this module. The provider mounted once at App\n * level owns a `StdinReader`, subscribes a single fan-out function\n * to it, and dispatches each parsed `KeyEvent` to every active\n * consumer.\n *\n * Why a Context instead of a singleton import: the provider can be\n * disabled in tests / replay mode without touching the components,\n * and the lifecycle (start/stop on mount/unmount) is tied to the\n * React tree rather than a global side effect.\n *\n * Why not just keep Ink's useInput: Ink's parse-keypress uses a\n * 100 ms intra-CSI timeout that's too short for Windows ConPTY,\n * leaking arrow-key bytes / paste markers into the buffer. Our\n * reader uses 250 ms and recognises the ESC-stripped variants too\n * — see `stdin-reader.ts`.\n */\n\nimport { useInput } from \"ink\";\n// biome-ignore lint/style/useImportType: tsconfig jsx=react needs React as a runtime value\nimport React, { createContext, useContext, useEffect, useRef } from \"react\";\nimport { type KeyEvent, type StdinReader, getStdinReader } from \"./stdin-reader.js\";\n\ninterface KeystrokeBus {\n /** Subscribe — returns an unsubscribe function. */\n subscribe(handler: KeystrokeHandler): () => void;\n}\n\nexport type KeystrokeHandler = (ev: KeyEvent) => void;\n\n/** Minimum surface KeystrokeProvider needs from a key source. StdinReader implements this; the Rust input adapter does too. */\nexport interface KeystrokeReader {\n start(): void;\n subscribe(handler: KeystrokeHandler): () => void;\n}\n\nconst KeystrokeContext = createContext<KeystrokeBus | null>(null);\n\nexport interface KeystrokeProviderProps {\n children: React.ReactNode;\n /** Optional reader override. Tests inject a synthetic reader so they can `feed()` chunks instead of touching real stdin. Production callers leave this unset and get the singleton. */\n reader?: KeystrokeReader;\n}\n\nexport function KeystrokeProvider({\n children,\n reader: providedReader,\n}: KeystrokeProviderProps): React.ReactElement {\n const handlersRef = useRef<Set<KeystrokeHandler>>(new Set());\n // Ref so the bus value's identity is stable across re-renders —\n // consumers don't accidentally re-subscribe every render.\n const busRef = useRef<KeystrokeBus | null>(null);\n if (busRef.current === null) {\n busRef.current = {\n subscribe(handler) {\n handlersRef.current.add(handler);\n return () => {\n handlersRef.current.delete(handler);\n };\n },\n };\n }\n\n useEffect(() => {\n const reader = providedReader ?? getStdinReader();\n reader.start();\n const unsubscribe = reader.subscribe((ev) => {\n // Snapshot the handler set so handlers added/removed during\n // dispatch don't perturb iteration. Cheap — typical N=1-3.\n for (const fn of [...handlersRef.current]) fn(ev);\n });\n return () => {\n unsubscribe();\n // Don't `stop()` the singleton on every unmount — multiple\n // mounts (test reruns, hot-reload) must not tear down stdin.\n // The singleton's own start() is idempotent; stop() is the\n // process-exit handler's job.\n };\n }, [providedReader]);\n\n return <KeystrokeContext.Provider value={busRef.current}>{children}</KeystrokeContext.Provider>;\n}\n\n/** Subscribe to keystroke events; falls back to Ink's useInput when no KeystrokeProvider is mounted. */\nexport function useKeystroke(handler: KeystrokeHandler, isActive = true): void {\n const bus = useContext(KeystrokeContext);\n const handlerRef = useRef(handler);\n handlerRef.current = handler;\n\n useEffect(() => {\n if (!bus || !isActive) return undefined;\n return bus.subscribe((ev) => handlerRef.current(ev));\n }, [bus, isActive]);\n\n useInput(\n (input, key) => {\n if (bus) return;\n handlerRef.current({\n input,\n upArrow: key.upArrow,\n downArrow: key.downArrow,\n leftArrow: key.leftArrow,\n rightArrow: key.rightArrow,\n return: key.return,\n escape: key.escape,\n backspace: key.backspace,\n delete: key.delete,\n tab: key.tab,\n shift: key.shift,\n ctrl: key.ctrl,\n meta: key.meta,\n pageUp: key.pageUp,\n pageDown: key.pageDown,\n });\n },\n { isActive: !bus && isActive },\n );\n}\n\n/**\n * Lower-level hook for components that need a stable subscription\n * across the lifetime of the consumer (typically StdinReader-aware\n * unit tests).\n */\nexport function useKeystrokeBus(): KeystrokeBus | null {\n return useContext(KeystrokeContext);\n}\n\n/** Test helper — assemble a KeyEvent with sensible defaults. */\nexport function makeKeyEvent(overrides: Partial<KeyEvent> = {}): KeyEvent {\n return { input: \"\", ...overrides };\n}\n","/** Sole stdin owner; 250 ms ESC-ambiguity timer (ConPTY splits sequences past parse-keypress's 100 ms). */\n\nimport { stdin } from \"node:process\";\n\nexport interface KeyEvent {\n /** Empty for control keys (arrows / Enter / Esc); holds the letter for Ctrl+/Alt+. */\n input: string;\n upArrow?: boolean;\n downArrow?: boolean;\n leftArrow?: boolean;\n rightArrow?: boolean;\n pageUp?: boolean;\n pageDown?: boolean;\n home?: boolean;\n end?: boolean;\n delete?: boolean;\n backspace?: boolean;\n tab?: boolean;\n return?: boolean;\n escape?: boolean;\n shift?: boolean;\n ctrl?: boolean;\n meta?: boolean;\n /** Bracketed-paste content; consumers MUST NOT re-interpret as keystrokes (e.g. `\\n` ≠ submit). */\n paste?: boolean;\n /** xterm SGR mode 1006 wheel-up. */\n mouseScrollUp?: boolean;\n /** Mouse wheel down — symmetric to `mouseScrollUp`. */\n mouseScrollDown?: boolean;\n /** Left-button press; row/col are 1-based. */\n mouseClick?: boolean;\n /** Left-button motion (button held during drag). Mode 1002 only. */\n mouseDrag?: boolean;\n /** Any-button release. Mode 1002 only. */\n mouseRelease?: boolean;\n mouseRow?: number;\n mouseCol?: number;\n}\n\ntype Subscriber = (ev: KeyEvent) => void;\n\n/** ESC ambiguity timeout. Long enough for ConPTY-split sequences. */\nconst ESC_TIMEOUT_MS = 250;\n\n/** Bracketed-paste markers (DECSET 2004). */\nconst PASTE_START = \"\\x1b[200~\";\nconst PASTE_END = \"\\x1b[201~\";\n/** ESC-stripped variants — ConPTY occasionally eats the leading ESC. */\nconst PASTE_START_BARE = \"[200~\";\nconst PASTE_END_BARE = \"[201~\";\n\nconst CSI_TAIL_MAP: ReadonlyArray<{ tail: string; ev: KeyEvent }> = [\n { tail: \"A\", ev: { input: \"\", upArrow: true } },\n { tail: \"B\", ev: { input: \"\", downArrow: true } },\n { tail: \"C\", ev: { input: \"\", rightArrow: true } },\n { tail: \"D\", ev: { input: \"\", leftArrow: true } },\n { tail: \"H\", ev: { input: \"\", home: true } },\n { tail: \"F\", ev: { input: \"\", end: true } },\n { tail: \"1~\", ev: { input: \"\", home: true } },\n { tail: \"4~\", ev: { input: \"\", end: true } },\n { tail: \"5~\", ev: { input: \"\", pageUp: true } },\n { tail: \"6~\", ev: { input: \"\", pageDown: true } },\n { tail: \"3~\", ev: { input: \"\", delete: true } },\n { tail: \"Z\", ev: { input: \"\", shift: true, tab: true } },\n // Some Windows hosts (PowerShell 7.x conhost path) emit the\n // modifier-encoded back-tab `\\x1b[1;2Z` instead of bare `\\x1b[Z`.\n // Issue #373 — without this entry Shift+Tab is silently dropped.\n { tail: \"1;2Z\", ev: { input: \"\", shift: true, tab: true } },\n // modifyOtherKeys (xterm CSI > 4 ; 2 m) sequences for Enter / Tab\n // with modifiers. Only fired when App.tsx has enabled the mode at\n // startup; otherwise Shift+Enter stays indistinguishable from Enter.\n // Modifier encoding: 2=shift, 3=alt, 4=alt+shift, 5=ctrl,\n // 6=ctrl+shift, 7=ctrl+alt, 8=ctrl+alt+shift. Keycodes: 9=Tab, 13=Enter.\n { tail: \"27;2;9~\", ev: { input: \"\", tab: true, shift: true } },\n { tail: \"27;2;13~\", ev: { input: \"\", return: true, shift: true } },\n { tail: \"27;5;13~\", ev: { input: \"\", return: true, ctrl: true } },\n { tail: \"27;6;13~\", ev: { input: \"\", return: true, ctrl: true, shift: true } },\n // Kitty keyboard protocol — same idea, different envelope:\n // `\\x1b[<keycode>;<mod>u`. Some terminals (kitty, recent Windows\n // Terminal previews) prefer this shape. Harmless to map here too.\n { tail: \"9;2u\", ev: { input: \"\", tab: true, shift: true } },\n { tail: \"13;2u\", ev: { input: \"\", return: true, shift: true } },\n { tail: \"13;5u\", ev: { input: \"\", return: true, ctrl: true } },\n { tail: \"13;6u\", ev: { input: \"\", return: true, ctrl: true, shift: true } },\n];\n\n/** SS3 sequences (`\\x1bO<letter>`) — some terminals send these for arrows. */\nconst SS3_MAP: Record<string, KeyEvent> = {\n A: { input: \"\", upArrow: true },\n B: { input: \"\", downArrow: true },\n C: { input: \"\", rightArrow: true },\n D: { input: \"\", leftArrow: true },\n H: { input: \"\", home: true },\n F: { input: \"\", end: true },\n};\n\n/** ESC-stripped CSI lookahead — ConPTY occasionally drops the leading ESC. */\nfunction tryEscapelessCsi(chunk: string, i: number): { advance: number; ev: KeyEvent } | null {\n if (chunk[i] !== \"[\") return null;\n // Paste start as a special case (handled by caller).\n // Try each known tail.\n for (const entry of CSI_TAIL_MAP) {\n const candidate = `[${entry.tail}`;\n if (chunk.slice(i, i + candidate.length) === candidate) {\n return { advance: candidate.length, ev: entry.ev };\n }\n }\n return null;\n}\n\n/** `[<btn;col;row[Mm]` — SGR mouse report body (without leading ESC). */\nconst SGR_MOUSE_ESCAPELESS_RE = /^\\[<\\d+;\\d+;\\d+[Mm]/;\n\nfunction decodeSgrMouseBody(body: string): KeyEvent | null {\n const m = /^<(\\d+);(\\d+);(\\d+)([Mm])$/.exec(body);\n if (!m) return null;\n const btn = Number.parseInt(m[1]!, 10);\n const col = Number.parseInt(m[2]!, 10);\n const row = Number.parseInt(m[3]!, 10);\n if (!Number.isFinite(btn) || !Number.isFinite(col) || !Number.isFinite(row)) return null;\n const tail = m[4]!;\n if (tail === \"m\") return { input: \"\", mouseRelease: true, mouseRow: row, mouseCol: col };\n if (btn === 64) return { input: \"\", mouseScrollUp: true, mouseRow: row, mouseCol: col };\n if (btn === 65) return { input: \"\", mouseScrollDown: true, mouseRow: row, mouseCol: col };\n if (btn === 0) return { input: \"\", mouseClick: true, mouseRow: row, mouseCol: col };\n if (btn === 32) return { input: \"\", mouseDrag: true, mouseRow: row, mouseCol: col };\n return null;\n}\n\n/** ConPTY can strip the ESC off SGR mouse reports — match the bare shape and drop, issue #867. */\nfunction tryEscapelessSgrMouse(\n chunk: string,\n i: number,\n): { advance: number; ev: KeyEvent | null } | null {\n if (chunk[i] !== \"[\") return null;\n const m = SGR_MOUSE_ESCAPELESS_RE.exec(chunk.slice(i));\n if (!m) return null;\n const body = m[0].slice(1);\n return { advance: m[0].length, ev: decodeSgrMouseBody(body) };\n}\n\nfunction isCsiFinal(ch: string): boolean {\n const code = ch.charCodeAt(0);\n return code >= 0x40 && code <= 0x7e;\n}\n\n/** Unknown sequence → null → caller drops bytes silently (don't insert as text). */\nfunction lookupCsi(tail: string): KeyEvent | null {\n for (const entry of CSI_TAIL_MAP) {\n if (entry.tail === tail) return entry.ev;\n }\n return null;\n}\n\n/** modifyOtherKeys / Kitty: reconstruct the keystroke from `<codepoint>` + `<mod>`. */\nfunction decodeModifiedKey(cp: number, mod: number): KeyEvent | null {\n if (mod < 1 || mod > 8) return null;\n const bits = mod - 1;\n const shift = (bits & 1) !== 0;\n const alt = (bits & 2) !== 0;\n const ctrl = (bits & 4) !== 0;\n if (cp >= 0x20 && cp <= 0x7e && !ctrl && !alt) {\n const ev: KeyEvent = { input: String.fromCharCode(cp) };\n if (shift) ev.shift = true;\n return ev;\n }\n if (cp >= 0x20 && cp <= 0x7e && alt && !ctrl) {\n const ev: KeyEvent = { input: String.fromCharCode(cp), meta: true };\n if (shift) ev.shift = true;\n return ev;\n }\n if (cp >= 0x41 && cp <= 0x7a && ctrl && !alt) {\n const ev: KeyEvent = { input: String.fromCharCode(cp).toLowerCase(), ctrl: true };\n if (shift) ev.shift = true;\n return ev;\n }\n return null;\n}\n\n/** Generic modifyOtherKeys / Kitty envelope — picks up the keys lookupCsi misses (`@`, `_`, `[`, `\\`, `]`, `^` under `>4;2m`). */\nfunction tryDecodeGenericCsi(seq: string): KeyEvent | null {\n let m = /^27;(\\d+);(\\d+)~$/.exec(seq);\n if (m) return decodeModifiedKey(Number.parseInt(m[2]!, 10), Number.parseInt(m[1]!, 10));\n m = /^(\\d+);(\\d+)u$/.exec(seq);\n if (m) return decodeModifiedKey(Number.parseInt(m[1]!, 10), Number.parseInt(m[2]!, 10));\n m = /^(\\d+)u$/.exec(seq);\n if (m) return decodeModifiedKey(Number.parseInt(m[1]!, 10), 1);\n return null;\n}\n\n// Bidi controls + zero-width invisibles that browsers smuggle into the clipboard (e.g. a B-site tab title with RLE/PDF wrappers). They render as 0 cells but still occupy buffer offsets, so cursor + line-split math drifts. ZWJ / ZWNJ / variation selectors / combining marks are NOT in the class — emoji sequences and accented letters keep their semantics. Issue #849.\nconst PASTE_INVISIBLE_RE = /[\\u200B\\u200E\\u200F\\u202A-\\u202E\\u2060\\u2066-\\u2069\\u00AD\\uFEFF]/g;\n\nexport function sanitizePasteText(s: string): string {\n // `ev.paste` bypasses the multiline reducer, so normalize Windows\n // clipboard line endings here before raw CR can reach Ink's <Text>.\n return s.replace(PASTE_INVISIBLE_RE, \"\").replace(/\\r\\n?/g, \"\\n\");\n}\n\n/** Heuristic paste-burst detector — wraps raw multi-line chunks when the terminal didn't (#522). */\nexport function looksLikeUnbracketedPaste(chunk: string): boolean {\n if (chunk.length < 2) return false;\n if (chunk.includes(PASTE_START) || chunk.includes(PASTE_START_BARE)) return false;\n if (chunk.includes(PASTE_END) || chunk.includes(PASTE_END_BARE)) return false;\n // ESC anywhere = real keypress / control sequence, not a paste burst.\n if (chunk.includes(\"\\x1b\")) return false;\n // \\r\\n is one terminal-converted Enter, not two breaks — fold first.\n const norm = chunk.replace(/\\r\\n/g, \"\\n\");\n if (norm === \"\\r\" || norm === \"\\n\") return false;\n let breaks = 0;\n let firstBreakIdx = -1;\n for (let i = 0; i < norm.length; i++) {\n const c = norm[i];\n if (c === \"\\r\" || c === \"\\n\") {\n if (firstBreakIdx < 0) firstBreakIdx = i;\n breaks++;\n }\n }\n if (breaks >= 2) return true;\n // 1 break with non-empty text on BOTH sides — paste burst. (\"abc\\r\"\n // alone stays as type-then-Enter so a fast typist still submits.)\n if (breaks === 1) return firstBreakIdx > 0 && firstBreakIdx < norm.length - 1;\n return false;\n}\n\nexport class StdinReader {\n private subscribers = new Set<Subscriber>();\n private state: \"idle\" | \"esc\" | \"csi\" | \"ss3\" | \"paste\" | \"legacyMouse\" = \"idle\";\n /** Buffer for partial sequences across chunks. */\n private csiBuf = \"\";\n private legacyMouseBuf = \"\";\n /** Buffer for paste content. */\n private pasteBuf = \"\";\n private escTimer: NodeJS.Timeout | null = null;\n // Deferred-dispatch handle paired with `escTimer`. The timer\n // queues an Immediate that runs in the event loop's CHECK phase —\n // i.e. AFTER the POLL phase where stdin 'data' events fire — so\n // a multi-byte sequence whose chunks queued up while the loop was\n // blocked (heavy render, etc.) gets a chance to be processed\n // BEFORE we emit a bogus standalone-Esc. Fixes the \"I didn't press\n // Esc but it aborted the turn\" class of bug: previously the timer's\n // setTimeout callback ran in the timers phase ahead of poll, so a\n // split sequence like `\\x1b` + `[A` would dispatch escape+upArrow\n // even though the user only pressed Up.\n private escImmediate: NodeJS.Immediate | null = null;\n private started = false;\n /** The actual `data` listener — kept as a field so `stop()` can detach it. */\n private listener: ((chunk: Buffer | string) => void) | null = null;\n\n start(): void {\n if (this.started) return;\n // bun leaves `isTTY` undefined in a real terminal, so probe setRawMode directly.\n try {\n stdin.setRawMode(true);\n } catch {\n return;\n }\n stdin.setEncoding(\"utf8\");\n stdin.resume();\n this.listener = (chunk) =>\n this.handleChunk(typeof chunk === \"string\" ? chunk : chunk.toString(\"utf8\"));\n stdin.on(\"data\", this.listener);\n this.started = true;\n }\n\n stop(): void {\n if (!this.started) return;\n if (this.listener) {\n stdin.off(\"data\", this.listener);\n this.listener = null;\n }\n try {\n stdin.setRawMode(false);\n } catch {\n // setRawMode may throw if stdin is already closed; ignore.\n }\n stdin.pause();\n this.cancelEscTimer();\n this.state = \"idle\";\n this.csiBuf = \"\";\n this.legacyMouseBuf = \"\";\n this.pasteBuf = \"\";\n this.started = false;\n }\n\n subscribe(fn: Subscriber): () => void {\n this.subscribers.add(fn);\n return () => {\n this.subscribers.delete(fn);\n };\n }\n\n /** Test seam — drives the parser without a real TTY. */\n feed(chunk: string): void {\n this.handleChunk(chunk);\n }\n\n private dispatch(ev: KeyEvent): void {\n for (const sub of this.subscribers) sub(ev);\n }\n\n private cancelEscTimer(): void {\n if (this.escTimer) {\n clearTimeout(this.escTimer);\n this.escTimer = null;\n }\n if (this.escImmediate) {\n clearImmediate(this.escImmediate);\n this.escImmediate = null;\n }\n }\n\n private scheduleEscTimer(): void {\n this.cancelEscTimer();\n this.escTimer = setTimeout(() => {\n this.escTimer = null;\n // Defer the actual dispatch to the CHECK phase so any pending\n // stdin 'data' events that queued up during a long render still\n // get a chance to consume the rest of a split sequence. The\n // chunk handler cancels this Immediate at its start, so a\n // sequence completing first wins; only a truly-orphaned `\\x1b`\n // reaches the dispatch below.\n this.escImmediate = setImmediate(() => {\n this.escImmediate = null;\n if (this.state === \"esc\") {\n this.state = \"idle\";\n this.dispatch({ input: \"\", escape: true });\n }\n });\n }, ESC_TIMEOUT_MS);\n }\n\n private handleChunk(rawChunk: string): void {\n this.cancelEscTimer();\n // Paste rescue when DECSET 2004 markers don't arrive (multiplexers\n // strip them, some Windows pipes too) — otherwise each \\r in a\n // multi-line paste fires Enter and the loop submits N prompts (#522).\n const chunk =\n this.state === \"idle\" && looksLikeUnbracketedPaste(rawChunk)\n ? PASTE_START + rawChunk + PASTE_END\n : rawChunk;\n let i = 0;\n while (i < chunk.length) {\n // ── paste accumulator ──\n if (this.state === \"paste\") {\n // Look for end marker (with or without ESC).\n const endA = chunk.indexOf(PASTE_END, i);\n const endB = chunk.indexOf(PASTE_END_BARE, i);\n let endIdx = -1;\n let endLen = 0;\n if (endA !== -1 && (endB === -1 || endA <= endB)) {\n endIdx = endA;\n endLen = PASTE_END.length;\n } else if (endB !== -1) {\n endIdx = endB;\n endLen = PASTE_END_BARE.length;\n }\n if (endIdx === -1) {\n this.pasteBuf += chunk.slice(i);\n i = chunk.length;\n break;\n }\n this.pasteBuf += chunk.slice(i, endIdx);\n this.dispatch({ input: sanitizePasteText(this.pasteBuf), paste: true });\n this.pasteBuf = \"\";\n this.state = \"idle\";\n i = endIdx + endLen;\n continue;\n }\n\n // ── CSI accumulator ──\n if (this.state === \"csi\") {\n const ch = chunk[i]!;\n if (this.csiBuf.length === 0 && ch === \"M\") {\n this.state = \"legacyMouse\";\n this.legacyMouseBuf = \"\";\n i++;\n continue;\n }\n this.csiBuf += ch;\n if (isCsiFinal(ch)) {\n this.dispatchCsi(this.csiBuf);\n this.csiBuf = \"\";\n // Only reset state if `dispatchCsi` didn't already mutate it\n // (it transitions to `paste` for the `200~` start marker —\n // resetting here would clobber that and the paste content\n // would be parsed as keystrokes).\n if (this.state === \"csi\") this.state = \"idle\";\n }\n i++;\n continue;\n }\n\n if (this.state === \"legacyMouse\") {\n const need = 3 - this.legacyMouseBuf.length;\n const take = Math.min(need, chunk.length - i);\n this.legacyMouseBuf += chunk.slice(i, i + take);\n i += take;\n if (this.legacyMouseBuf.length === 3) {\n this.legacyMouseBuf = \"\";\n this.state = \"idle\";\n }\n continue;\n }\n\n // ── SS3 single-byte tail ──\n if (this.state === \"ss3\") {\n const ev = SS3_MAP[chunk[i]!];\n if (ev) this.dispatch(ev);\n this.state = \"idle\";\n i++;\n continue;\n }\n\n // ── ESC pending ──\n if (this.state === \"esc\") {\n const ch = chunk[i]!;\n if (ch === \"[\") {\n this.state = \"csi\";\n this.csiBuf = \"\";\n i++;\n continue;\n }\n if (ch === \"O\") {\n this.state = \"ss3\";\n i++;\n continue;\n }\n // Alt+Enter: ESC + CR (or ESC + LF). Universal newline shortcut on terminals\n // that don't support modifyOtherKeys (Shift+Enter falls through to plain Enter there).\n if (ch === \"\\r\" || ch === \"\\n\") {\n this.dispatch({ input: \"\", return: true, meta: true });\n this.state = \"idle\";\n i++;\n continue;\n }\n // ESC + any other char = Alt+key (rare; we still dispatch).\n this.dispatch({ input: ch, meta: true });\n this.state = \"idle\";\n i++;\n continue;\n }\n\n // ── idle ──\n const ch = chunk[i]!;\n\n if (ch === \"\\x1b\") {\n this.state = \"esc\";\n i++;\n continue;\n }\n\n // ESC-stripped paste-start (ConPTY): bare `[200~` at idle.\n if (chunk.slice(i, i + PASTE_START_BARE.length) === PASTE_START_BARE) {\n this.state = \"paste\";\n this.pasteBuf = \"\";\n i += PASTE_START_BARE.length;\n continue;\n }\n // ESC-stripped CSI tails — recover before treating `[` as text.\n const escapeless = tryEscapelessCsi(chunk, i);\n if (escapeless) {\n this.dispatch(escapeless.ev);\n i += escapeless.advance;\n continue;\n }\n const mouseEscapeless = tryEscapelessSgrMouse(chunk, i);\n if (mouseEscapeless) {\n if (mouseEscapeless.ev) this.dispatch(mouseEscapeless.ev);\n i += mouseEscapeless.advance;\n continue;\n }\n\n // Single-byte control keys.\n // \\r (CR, 0x0D) is Enter on every terminal in raw mode.\n // \\n (LF, 0x0A) is what Ctrl+J emits — keep it distinct so the\n // multiline reducer can map it to \"insert newline\" instead of\n // \"submit\". Pastes containing \\n still arrive via either the\n // bracketed-paste accumulator or a multi-byte printable chunk\n // that includes the newline; neither hits this single-byte\n // branch, so this split is safe.\n if (ch === \"\\r\") {\n this.dispatch({ input: \"\", return: true });\n i++;\n continue;\n }\n if (ch === \"\\n\") {\n this.dispatch({ input: \"j\", ctrl: true });\n i++;\n continue;\n }\n if (ch === \"\\t\") {\n this.dispatch({ input: \"\", tab: true });\n i++;\n continue;\n }\n if (ch === \"\\x7f\" || ch === \"\\b\") {\n this.dispatch({ input: \"\", backspace: true });\n i++;\n continue;\n }\n if (ch === \"\\x03\") {\n // Ctrl+C — terminate the process. Raw mode disables the\n // default SIGINT, so we have to handle it ourselves.\n this.dispatch({ input: \"c\", ctrl: true });\n i++;\n continue;\n }\n\n const code = ch.charCodeAt(0);\n // Other Ctrl+letter (0x01-0x1A → A-Z, except already-handled).\n if (code >= 1 && code <= 26) {\n const letter = String.fromCharCode(0x60 + code); // a..z\n this.dispatch({ input: letter, ctrl: true });\n i++;\n continue;\n }\n\n // Regular printable input. Coalesce a run of printable chars\n // into one event so a multi-byte UTF-8 paste-burst arrives as\n // one `input` rather than N adjacent events.\n let end = i + 1;\n while (end < chunk.length) {\n const c = chunk[end]!;\n if (c === \"\\x1b\" || c === \"\\r\" || c === \"\\n\" || c === \"\\t\") break;\n if (c === \"\\x7f\" || c === \"\\b\" || c === \"\\x03\") break;\n const cc = c.charCodeAt(0);\n if (cc >= 1 && cc <= 26) break;\n // Don't swallow into a printable run if a CSI / paste prefix\n // starts at this position.\n if (c === \"[\" && (tryEscapelessCsi(chunk, end) || tryEscapelessSgrMouse(chunk, end))) break;\n if (chunk.slice(end, end + PASTE_START_BARE.length) === PASTE_START_BARE) break;\n end++;\n }\n this.dispatch({ input: chunk.slice(i, end) });\n i = end;\n }\n\n // After processing, if we're still in `esc` state, schedule the\n // ambiguity timer. The next chunk may carry the rest of the CSI;\n // if not, the timer fires and dispatches a standalone Esc.\n if (this.state === \"esc\") {\n this.scheduleEscTimer();\n }\n }\n\n private dispatchCsi(seq: string): void {\n // seq is the bytes after `\\x1b[`, e.g. \"A\", \"5~\", \"200~\", \"Z\".\n if (seq === \"200~\") {\n this.state = \"paste\";\n this.pasteBuf = \"\";\n return;\n }\n if (seq === \"201~\") {\n // Stray paste-end — we shouldn't reach here outside paste mode,\n // but if we do, drop it silently.\n return;\n }\n // SGR mouse report — surface wheel/click/drag/release, drop the rest. Always consumes the bytes even when the button isn't one we map (issue #867).\n if (seq.length > 1 && seq.charCodeAt(0) === 60 /* '<' */) {\n const ev = decodeSgrMouseBody(seq);\n if (ev) this.dispatch(ev);\n return;\n }\n const ev = lookupCsi(seq);\n if (ev) {\n this.dispatch(ev);\n return;\n }\n const generic = tryDecodeGenericCsi(seq);\n if (generic) {\n this.dispatch(generic);\n return;\n }\n // Unknown CSI → drop. Do NOT insert raw bytes as text.\n }\n}\n\n/** Singleton — one reader per process. */\nlet singleton: StdinReader | null = null;\n\nexport function getStdinReader(): StdinReader {\n if (!singleton) singleton = new StdinReader();\n return singleton;\n}\n","/** Arrow-key list components for Ink — single-select and multi-select. */\n\nimport { Box, Text } from \"ink\";\nimport React, { useState } from \"react\";\nimport { useKeystroke } from \"./keystroke-context.js\";\nimport type { KeyEvent } from \"./stdin-reader.js\";\nimport { type UiColor, useColor } from \"./theme.js\";\n\nexport interface SelectItem<V extends string = string> {\n value: V;\n label: string;\n /** Optional descriptive text rendered dimmed. */\n hint?: string;\n /** Disabled rows render dimmed and are skipped on nav. */\n disabled?: boolean;\n}\n\nexport interface SingleSelectProps<V extends string> {\n items: SelectItem<V>[];\n initialValue?: V;\n onSubmit: (value: V) => void;\n onCancel?: () => void;\n /** Fired when Tab is pressed on the currently highlighted item. */\n onTab?: (value: V) => void;\n /** Optional dim footer beneath the list. */\n footer?: string;\n /** Render item hints on the same row as the label instead of a second row. */\n inlineHints?: boolean;\n /** Ignore matching keystrokes so an enclosing component can own them. */\n ignoreKey?: (ev: KeyEvent) => boolean;\n}\n\nexport function SingleSelect<V extends string>({\n items,\n initialValue,\n onSubmit,\n onTab,\n onCancel,\n footer,\n inlineHints = false,\n ignoreKey,\n}: SingleSelectProps<V>) {\n const color = useColor();\n const initialIndex = Math.max(\n 0,\n items.findIndex((i) => i.value === initialValue && !i.disabled),\n );\n const [index, setIndex] = useState(initialIndex === -1 ? 0 : initialIndex);\n\n useKeystroke((ev) => {\n if (ev.paste || ignoreKey?.(ev)) return;\n if (ev.upArrow) {\n setIndex((i) => findNextEnabled(items, i, -1));\n } else if (ev.downArrow) {\n setIndex((i) => findNextEnabled(items, i, +1));\n } else if (ev.return) {\n const chosen = items[index];\n if (chosen && !chosen.disabled) onSubmit(chosen.value);\n } else if (ev.tab) {\n const chosen = items[index];\n if (chosen && !chosen.disabled) onTab?.(chosen.value);\n } else if (ev.escape && onCancel) {\n onCancel();\n }\n });\n\n return (\n <Box flexDirection=\"column\">\n {items.map((item, i) => (\n <SelectRow\n key={item.value}\n item={item}\n active={i === index}\n marker={i === index ? \"▸\" : \" \"}\n color={color}\n inlineHint={inlineHints}\n />\n ))}\n {footer ? (\n <Box marginTop={1}>\n <Text dimColor>{footer}</Text>\n </Box>\n ) : null}\n </Box>\n );\n}\n\nexport interface MultiSelectProps<V extends string> {\n items: SelectItem<V>[];\n initialSelected?: V[];\n onSubmit: (values: V[]) => void;\n onCancel?: () => void;\n /** Footer hint under the list — e.g. \"[Space] toggle · [Enter] confirm\". */\n footer?: string;\n /** Render item hints on the same row as the label instead of a second row. */\n inlineHints?: boolean;\n /** Ignore matching keystrokes so an enclosing component can own them. */\n ignoreKey?: (ev: KeyEvent) => boolean;\n}\n\nexport function MultiSelect<V extends string>({\n items,\n initialSelected = [],\n onSubmit,\n onCancel,\n footer,\n inlineHints = false,\n ignoreKey,\n}: MultiSelectProps<V>) {\n const color = useColor();\n const [index, setIndex] = useState(() => {\n const first = items.findIndex((i) => !i.disabled);\n return first === -1 ? 0 : first;\n });\n const [selected, setSelected] = useState<Set<V>>(new Set(initialSelected));\n\n useKeystroke((ev) => {\n if (ev.paste || ignoreKey?.(ev)) return;\n if (ev.upArrow) {\n setIndex((i) => findNextEnabled(items, i, -1));\n } else if (ev.downArrow) {\n setIndex((i) => findNextEnabled(items, i, +1));\n } else if (ev.input === \" \") {\n const item = items[index];\n if (!item || item.disabled) return;\n setSelected((prev) => {\n const next = new Set(prev);\n if (next.has(item.value)) next.delete(item.value);\n else next.add(item.value);\n return next;\n });\n } else if (ev.return) {\n const ordered = items.filter((i) => selected.has(i.value)).map((i) => i.value);\n onSubmit(ordered);\n } else if (ev.escape && onCancel) {\n onCancel();\n }\n });\n\n return (\n <Box flexDirection=\"column\">\n {items.map((item, i) => {\n const checked = selected.has(item.value);\n const marker = checked ? \"[x]\" : \"[ ]\";\n return (\n <SelectRow\n key={item.value}\n item={item}\n active={i === index}\n marker={`${i === index ? \"▸\" : \" \"} ${marker}`}\n color={color}\n inlineHint={inlineHints}\n />\n );\n })}\n {footer ? (\n <Box marginTop={1}>\n <Text dimColor>{footer}</Text>\n </Box>\n ) : null}\n </Box>\n );\n}\n\nfunction SelectRow<V extends string>({\n item,\n active,\n marker,\n color,\n inlineHint = false,\n}: {\n item: SelectItem<V>;\n active: boolean;\n marker: string;\n color: UiColor;\n inlineHint?: boolean;\n}) {\n const rowColor = item.disabled ? color.info : active ? color.primary : undefined;\n const labelText = `${marker} ${item.label}`;\n if (inlineHint) {\n return (\n <Box flexDirection=\"row\" flexWrap=\"nowrap\" minHeight={1}>\n <Text color={rowColor} bold={active} dimColor={item.disabled} wrap=\"truncate\">\n {labelText}\n </Text>\n {item.hint ? <Text dimColor wrap=\"truncate\">{` ${item.hint}`}</Text> : null}\n </Box>\n );\n }\n return (\n <Box flexDirection=\"column\">\n <Box>\n <Text color={rowColor} bold={active} dimColor={item.disabled}>\n {labelText}\n </Text>\n </Box>\n {item.hint ? (\n <Box paddingLeft={marker.length + 1}>\n <Text dimColor>{item.hint}</Text>\n </Box>\n ) : null}\n </Box>\n );\n}\n\nfunction findNextEnabled<V extends string>(\n items: SelectItem<V>[],\n from: number,\n step: -1 | 1,\n): number {\n if (items.length === 0) return 0;\n let i = from;\n for (let tries = 0; tries < items.length; tries++) {\n i = (i + step + items.length) % items.length;\n if (!items[i]?.disabled) return i;\n }\n return from;\n}\n"],"mappings":"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","names":["ch","ev","React","import_react","React"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli/commands/desktop.ts","../../src/desktop/login-shell-path.ts","../../src/desktop/qq-settings.ts","../../src/desktop/qq-turn-routing.ts"],"sourcesContent":["import { AsyncLocalStorage } from \"node:async_hooks\";\nimport { existsSync, statSync, writeSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport { isAbsolute, join, resolve } from \"node:path\";\nimport { stdin } from \"node:process\";\nimport { createInterface } from \"node:readline\";\nimport { toApprovalPrompt } from \"@reasonix/core-utils\";\nimport {\n type FileWithStats,\n listDirectory,\n listFilesWithStatsAsync,\n parseAtQuery,\n rankPickerCandidates,\n} from \"../../at-mentions.js\";\nimport { pickPrimaryBalance } from \"../../client.js\";\nimport { codeSystemPrompt } from \"../../code/prompt.js\";\nimport { applyPlanMode, buildCodeToolset } from \"../../code/setup.js\";\nimport {\n DEFAULT_MODEL,\n type DesktopOpenTab,\n type EditMode,\n bridgeEndpointEnv,\n isPlausibleKey,\n isReasoningEffort,\n loadApiKey,\n loadDesktopOpenTabs,\n loadEditMode,\n loadEditor,\n loadEndpoint,\n loadModel,\n loadQQConfig,\n loadReasoningEffort,\n loadRecentWorkspaces,\n loadResolvedSkillPaths,\n loadShowSystemEvents,\n loadSubagentModels,\n loadWorkspaceDir,\n pushRecentWorkspace,\n readConfig,\n webSearchEngine as readWebSearchEngine,\n saveApiKey,\n saveBaseUrl,\n saveDesktopOpenTabs,\n saveEditMode,\n saveEditor,\n saveModel,\n saveReasoningEffort,\n saveShowSystemEvents,\n saveSubagentModels,\n saveWorkspaceDir,\n writeConfig,\n} from \"../../config.js\";\nimport { Eventizer } from \"../../core/eventize.js\";\nimport type { Event as KernelEvent } from \"../../core/events.js\";\nimport {\n type CheckpointVerdict,\n type ChoiceVerdict,\n type ConfirmationChoice,\n type PlanVerdict,\n type RevisionVerdict,\n pauseGate,\n} from \"../../core/pause-gate.js\";\nimport { autoResolveVerdict } from \"../../core/pause-policy.js\";\nimport { augmentProcessPath } from \"../../desktop/login-shell-path.js\";\nimport {\n loadDesktopQQState,\n saveDesktopQQSettings,\n setDesktopQQEnabled,\n} from \"../../desktop/qq-settings.js\";\nimport {\n clearQQTurnRouting,\n createQQTurnRoutingState,\n markQQTurnFinished,\n markQQTurnStarted,\n setQQPendingInteraction,\n shouldRouteQQForTab,\n takeQQPendingInteraction,\n} from \"../../desktop/qq-turn-routing.js\";\nimport { loadDotenv } from \"../../env.js\";\nimport { CacheFirstLoop, DeepSeekClient, ImmutablePrefix } from \"../../index.js\";\nimport { parseMcpSpec } from \"../../mcp/spec.js\";\nimport {\n deleteSession,\n listSessionsForWorkspace,\n loadSessionMessages,\n loadSessionMeta,\n patchSessionMeta,\n sessionPath,\n timestampSuffix,\n} from \"../../memory/session.js\";\nimport { MemoryStore } from \"../../memory/user.js\";\nimport { QQChannel } from \"../../qq/channel.js\";\nimport { SkillStore } from \"../../skills.js\";\nimport { countTokensBounded } from \"../../tokenizer.js\";\nimport type { ChoiceOption } from \"../../tools/choice.js\";\nimport type { ChatMessage } from \"../../types.js\";\nimport { VERSION } from \"../../version.js\";\nimport { type McpRuntime, createMcpRuntime } from \"./mcp-runtime.js\";\n\nexport interface DesktopOptions {\n model: string;\n budgetUsd?: number;\n /** Root directory the agent's filesystem tools operate inside. Defaults to cwd. */\n dir?: string;\n}\n\ntype InMessage = { tabId?: string } & (\n | { cmd: \"user_input\"; text: string }\n | { cmd: \"abort\" }\n | { cmd: \"confirm_response\"; id: number; response: ConfirmationChoice }\n | { cmd: \"choice_response\"; id: number; response: ChoiceVerdict }\n | { cmd: \"plan_response\"; id: number; response: PlanVerdict }\n | { cmd: \"checkpoint_response\"; id: number; response: CheckpointVerdict }\n | { cmd: \"revision_response\"; id: number; response: RevisionVerdict }\n | { cmd: \"session_list\" }\n | { cmd: \"session_delete\"; name: string }\n | { cmd: \"session_load\"; name: string }\n | { cmd: \"session_rename\"; name: string; title: string }\n | { cmd: \"new_chat\" }\n | { cmd: \"setup_save_key\"; key: string }\n | { cmd: \"settings_get\" }\n | {\n cmd: \"settings_save\";\n reasoningEffort?: import(\"../../config.js\").ReasoningEffort;\n editMode?: EditMode;\n budgetUsd?: number | null;\n baseUrl?: string;\n workspaceDir?: string;\n model?: string;\n editor?: string;\n webSearchEngine?: \"bing\" | \"searxng\" | \"metaso\" | \"tavily\" | \"perplexity\" | \"exa\";\n subagentModels?: Record<string, \"flash\" | \"pro\">;\n showSystemEvents?: boolean;\n }\n | { cmd: \"qq_status_get\" }\n | { cmd: \"qq_connect\" }\n | { cmd: \"qq_disconnect\" }\n | {\n cmd: \"qq_config_save\";\n appId?: string;\n appSecret?: string;\n sandbox: boolean;\n }\n | { cmd: \"mention_query\"; query: string; nonce: number }\n | { cmd: \"mention_preview\"; path: string; nonce: number }\n | { cmd: \"mention_picked\"; path: string }\n | { cmd: \"tab_open\"; workspaceDir?: string }\n | { cmd: \"tab_close\" }\n | { cmd: \"tab_activate\"; tabId: string }\n | { cmd: \"mcp_specs_get\" }\n | { cmd: \"mcp_specs_add\"; spec: string }\n | { cmd: \"mcp_specs_remove\"; spec: string }\n | { cmd: \"skills_get\" }\n | { cmd: \"skill_run\"; name: string; args?: string }\n | { cmd: \"jobs_list\" }\n | { cmd: \"jobs_stop\"; jobId: number }\n | { cmd: \"jobs_stop_all\" }\n | { cmd: \"compact_history\" }\n | { cmd: \"retry\" }\n | { cmd: \"btw\"; text: string }\n | { cmd: \"desktop_resync\" }\n);\n\ninterface NeedsSetupEvent {\n type: \"$needs_setup\";\n reason: \"no_api_key\";\n}\n\ninterface SettingsEvent {\n type: \"$settings\";\n reasoningEffort: import(\"../../config.js\").ReasoningEffort;\n editMode: EditMode;\n budgetUsd: number | null;\n baseUrl?: string;\n apiKeyPrefix?: string;\n workspaceDir: string;\n recentWorkspaces: string[];\n model: string;\n editor?: string;\n webSearchEngine?: \"bing\" | \"searxng\" | \"metaso\" | \"tavily\" | \"perplexity\" | \"exa\";\n subagentModels?: Record<string, \"flash\" | \"pro\">;\n showSystemEvents?: boolean;\n version: string;\n}\n\ninterface QQSettingsEvent {\n type: \"$qq_settings\";\n appId?: string;\n appSecret?: string;\n sandbox: boolean;\n enabled: boolean;\n configured: boolean;\n runtimeState: \"disconnected\" | \"connecting\" | \"connected\" | \"failed\";\n lastError?: string;\n appIdPreview?: string;\n access: string;\n}\n\ninterface BalanceEvent {\n type: \"$balance\";\n currency: string;\n total: number;\n isAvailable: boolean;\n}\n\ninterface PlanRequiredEvent {\n type: \"$plan_required\";\n id: number;\n plan: string;\n steps?: unknown[];\n summary?: string;\n}\n\ninterface SessionsEvent {\n type: \"$sessions\";\n items: { name: string; messageCount: number; mtime: string }[];\n}\n\ninterface MentionResultsEvent {\n type: \"$mention_results\";\n nonce: number;\n query: string;\n results: string[];\n}\n\ninterface MentionPreviewEvent {\n type: \"$mention_preview\";\n nonce: number;\n path: string;\n head: string;\n totalLines: number;\n}\n\ninterface TabOpenedEvent {\n type: \"$tab_opened\";\n workspaceDir: string;\n /** True when the frontend should focus this tab (user-opened, or the restored focused tab). */\n active?: boolean;\n}\n\ninterface TabClosedEvent {\n type: \"$tab_closed\";\n}\n\ntype LoadedSegment =\n | { kind: \"text\"; text: string }\n | { kind: \"reasoning\"; text: string }\n | {\n kind: \"tool\";\n callId: string;\n name: string;\n args: string;\n result?: string;\n ok?: boolean;\n };\n\ntype LoadedMessage =\n | { kind: \"user\"; text: string }\n | {\n kind: \"assistant\";\n turn: number;\n segments: LoadedSegment[];\n pending: false;\n };\n\ninterface SessionLoadedEvent {\n type: \"$session_loaded\";\n name: string;\n messages: LoadedMessage[];\n carryover: {\n totalCostUsd: number;\n cacheHitTokens: number;\n cacheMissTokens: number;\n totalCompletionTokens: number;\n };\n}\n\ninterface SessionEmptyEvent {\n type: \"$session_empty\";\n name: string;\n sizeBytes: number;\n}\n\ninterface ConfirmRequiredEvent {\n type: \"$confirm_required\";\n id: number;\n kind: \"run_command\" | \"run_background\";\n command: string;\n prompt?: import(\"@reasonix/core-utils\").ApprovalPrompt;\n}\n\ninterface PathAccessRequiredEvent {\n type: \"$path_access_required\";\n id: number;\n path: string;\n intent: \"read\" | \"write\";\n toolName: string;\n sandboxRoot: string;\n allowPrefix: string;\n prompt?: import(\"@reasonix/core-utils\").ApprovalPrompt;\n}\n\ninterface ChoiceRequiredEvent {\n type: \"$choice_required\";\n id: number;\n question: string;\n options: ChoiceOption[];\n allowCustom: boolean;\n}\n\ninterface PlanStepLite {\n id: string;\n title: string;\n action: string;\n risk?: \"low\" | \"med\" | \"high\";\n}\n\ninterface CheckpointRequiredEvent {\n type: \"$checkpoint_required\";\n id: number;\n stepId: string;\n title?: string;\n result: string;\n notes?: string;\n completed: number;\n total: number;\n}\n\ninterface RevisionRequiredEvent {\n type: \"$revision_required\";\n id: number;\n reason: string;\n remainingSteps: PlanStepLite[];\n summary?: string;\n}\n\ninterface StepCompletedEvent {\n type: \"$step_completed\";\n stepId: string;\n title?: string;\n result: string;\n notes?: string;\n}\n\ninterface PlanClearedEvent {\n type: \"$plan_cleared\";\n}\n\ntype McpSpecStatus = \"configured\" | \"handshake\" | \"connected\" | \"failed\" | \"disabled\";\n\ninterface McpSpecInfo {\n raw: string;\n name: string | null;\n transport: \"stdio\" | \"sse\" | \"streamable-http\";\n summary: string;\n parseError?: string;\n status: McpSpecStatus;\n statusReason?: string;\n toolCount?: number;\n}\n\ninterface McpSpecsEvent {\n type: \"$mcp_specs\";\n specs: McpSpecInfo[];\n bridged: boolean;\n}\n\ninterface CtxBreakdownEvent {\n type: \"$ctx_breakdown\";\n reservedTokens: number;\n /** Current log token count (real-time) — sent after /compact to refresh the meter. */\n logTokens?: number;\n}\n\ninterface MemoryEntryInfo {\n name: string;\n scope: \"project\" | \"global\";\n description: string;\n}\n\ninterface MemoryEvent {\n type: \"$memory\";\n entries: MemoryEntryInfo[];\n}\n\ninterface SkillInfo {\n name: string;\n description: string;\n scope: \"project\" | \"custom\" | \"global\" | \"builtin\";\n path: string;\n runAs: \"inline\" | \"subagent\";\n model?: string;\n}\n\ninterface SkillsEvent {\n type: \"$skills\";\n items: SkillInfo[];\n}\n\ninterface JobInfoPayload {\n id: number;\n tabId: string;\n sessionLabel: string;\n command: string;\n pid: number | null;\n running: boolean;\n exitCode: number | null;\n startedAt: number;\n outputTail: string;\n spawnError?: string;\n}\n\ninterface JobsEvent {\n type: \"$jobs\";\n items: JobInfoPayload[];\n}\n\nconst desktopQqRuntimeSnapshot: {\n runtimeState: \"disconnected\" | \"connecting\" | \"connected\" | \"failed\";\n lastError?: string;\n} = {\n runtimeState: \"disconnected\",\n};\n\ninterface RetryResultEvent {\n type: \"$retry_result\";\n text: string;\n}\n\ninterface BtwResultEvent {\n type: \"$btw_result\";\n question: string;\n answer: string;\n}\n\n/** Direct fd write — bypasses Node's stream layer (and its piped-output\n * block buffering) so every JSON line reaches Rust the moment it's\n * produced, not whenever the next 8 KB flushes. */\ntype EmittableEvent =\n | KernelEvent\n | { type: \"$ready\" }\n | { type: \"$error\"; message: string }\n | { type: \"$turn_complete\" }\n | ConfirmRequiredEvent\n | PathAccessRequiredEvent\n | ChoiceRequiredEvent\n | PlanRequiredEvent\n | CheckpointRequiredEvent\n | RevisionRequiredEvent\n | StepCompletedEvent\n | PlanClearedEvent\n | SessionsEvent\n | SessionLoadedEvent\n | SessionEmptyEvent\n | NeedsSetupEvent\n | SettingsEvent\n | QQSettingsEvent\n | BalanceEvent\n | MentionResultsEvent\n | MentionPreviewEvent\n | RetryResultEvent\n | BtwResultEvent\n | TabOpenedEvent\n | TabClosedEvent\n | McpSpecsEvent\n | SkillsEvent\n | CtxBreakdownEvent\n | MemoryEvent\n | JobsEvent;\n\nconst STDOUT_BACKPRESSURE_WAIT = new Int32Array(new SharedArrayBuffer(4));\n\ntype SyncWriter = (fd: number, buffer: Buffer, offset: number, length: number) => number;\n\nconst SESSION_TITLE_MAX_CHARS = 200;\n\n/** Trim + cap a user-provided session title; empty string means \"clear summary\". Exported for tests. */\nexport function normalizeSessionTitle(raw: string): string {\n return raw.replace(/\\s+/g, \" \").trim().slice(0, SESSION_TITLE_MAX_CHARS);\n}\n\n/** Drain `buffer` to `fd` across partial writes; retry EAGAIN after a 5 ms park. Exported for tests. */\nexport function writeAllSync(\n fd: number,\n buffer: Buffer,\n opts: {\n write?: SyncWriter;\n wait?: () => void;\n } = {},\n): void {\n const write = opts.write ?? writeSync;\n const wait = opts.wait ?? (() => Atomics.wait(STDOUT_BACKPRESSURE_WAIT, 0, 0, 5));\n let offset = 0;\n while (offset < buffer.length) {\n let written: number;\n try {\n written = write(fd, buffer, offset, buffer.length - offset);\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"EAGAIN\") {\n wait();\n continue;\n }\n throw err;\n }\n if (written <= 0) throw new Error(\"stdout write returned 0 bytes\");\n offset += written;\n }\n}\n\nfunction emit(ev: EmittableEvent, tabId?: string): void {\n const payload = tabId ? { ...ev, tabId } : ev;\n writeAllSync(1, Buffer.from(`${JSON.stringify(payload)}\\n`, \"utf8\"));\n}\n\nfunction tailLines(s: string, n: number): string {\n if (!s) return \"\";\n const lines = s.split(/\\r?\\n/);\n return lines.slice(-n).join(\"\\n\");\n}\n\nfunction buildLoadedMessages(records: ChatMessage[]): LoadedMessage[] {\n const out: LoadedMessage[] = [];\n let turn = 0;\n let pendingAssistantIdx = -1;\n for (const rec of records) {\n if (rec.role === \"system\") continue;\n if (rec.role === \"user\") {\n out.push({ kind: \"user\", text: rec.content ?? \"\" });\n pendingAssistantIdx = -1;\n continue;\n }\n if (rec.role === \"assistant\") {\n turn++;\n const segments: LoadedSegment[] = [];\n if (rec.reasoning_content) segments.push({ kind: \"reasoning\", text: rec.reasoning_content });\n if (rec.content) segments.push({ kind: \"text\", text: rec.content });\n if (rec.tool_calls) {\n for (let i = 0; i < rec.tool_calls.length; i++) {\n const tc = rec.tool_calls[i];\n if (!tc) continue;\n segments.push({\n kind: \"tool\",\n callId: tc.id ?? `tc-r-${turn}-${i}`,\n name: tc.function?.name ?? \"\",\n args: tc.function?.arguments ?? \"\",\n });\n }\n }\n out.push({ kind: \"assistant\", turn, segments, pending: false });\n pendingAssistantIdx = out.length - 1;\n continue;\n }\n if (rec.role === \"tool\") {\n if (pendingAssistantIdx < 0) continue;\n const host = out[pendingAssistantIdx];\n if (host?.kind !== \"assistant\") continue;\n const callId = rec.tool_call_id;\n if (!callId) continue;\n const seg = host.segments.find((s) => s.kind === \"tool\" && s.callId === callId);\n if (seg && seg.kind === \"tool\") {\n seg.result = rec.content ?? \"\";\n seg.ok = !/error|failed/i.test(seg.result.slice(0, 200));\n }\n }\n }\n return out;\n}\n\nfunction emitSettings(tab: Tab): void {\n const ep = loadEndpoint();\n const editMode = loadEditMode();\n if (tab.toolset) applyPlanMode(tab.toolset.tools, editMode);\n const recent = loadRecentWorkspaces().filter((p) => p !== tab.rootDir);\n emit(\n {\n type: \"$settings\",\n reasoningEffort: loadReasoningEffort(),\n editMode,\n budgetUsd: tab.runtime?.loop.budgetUsd ?? null,\n baseUrl: ep.baseUrl,\n apiKeyPrefix: ep.apiKey ? `${ep.apiKey.slice(0, 6)}…${ep.apiKey.slice(-3)}` : undefined,\n workspaceDir: tab.rootDir,\n recentWorkspaces: recent,\n model: tab.currentModel,\n editor: loadEditor(),\n webSearchEngine: readWebSearchEngine(),\n subagentModels: loadSubagentModels(),\n showSystemEvents: loadShowSystemEvents(),\n version: VERSION,\n },\n tab.id,\n );\n}\n\nfunction emitQQSettings(tab: Tab): void {\n const base = loadDesktopQQState();\n emit(\n {\n type: \"$qq_settings\",\n ...base,\n runtimeState: desktopQqRuntimeSnapshot.runtimeState,\n lastError: desktopQqRuntimeSnapshot.lastError,\n },\n tab.id,\n );\n}\n\nasync function emitBalance(tab: Tab): Promise<void> {\n if (!tab.runtime) return;\n const bal = await tab.runtime.loop.client.getBalance().catch(() => null);\n if (!bal) return;\n const primary = pickPrimaryBalance(bal.balance_infos);\n if (!primary) return;\n emit(\n {\n type: \"$balance\",\n currency: primary.currency,\n total: Number(primary.total_balance),\n isAvailable: bal.is_available,\n },\n tab.id,\n );\n}\n\nfunction emitSessions(tab: Tab): void {\n try {\n const items = listSessionsForWorkspace(tab.rootDir).map((s) => ({\n name: s.name,\n messageCount: s.messageCount,\n mtime: s.mtime.toISOString(),\n summary: s.meta.summary,\n }));\n emit({ type: \"$sessions\", items }, tab.id);\n } catch (err) {\n emit({ type: \"$error\", message: `session_list failed: ${(err as Error).message}` }, tab.id);\n }\n}\n\nfunction summarizeMcpSpec(raw: string): McpSpecInfo {\n try {\n const parsed = parseMcpSpec(raw);\n if (parsed.transport === \"stdio\") {\n const argv = [parsed.command, ...parsed.args].join(\" \");\n return {\n raw,\n name: parsed.name,\n transport: \"stdio\",\n summary: `stdio · ${argv}`,\n status: \"configured\",\n };\n }\n return {\n raw,\n name: parsed.name,\n transport: parsed.transport,\n summary: `${parsed.transport} · ${parsed.url}`,\n status: \"configured\",\n };\n } catch (err) {\n return {\n raw,\n name: null,\n transport: \"stdio\",\n summary: raw,\n parseError: (err as Error).message,\n status: \"failed\",\n statusReason: (err as Error).message,\n };\n }\n}\n\nfunction emitMcpSpecs(tab: Tab): void {\n const cfg = readConfig();\n const specs = (cfg.mcp ?? []).map((raw) => {\n const base = summarizeMcpSpec(raw);\n const live = tab.mcpStatuses.get(raw);\n if (!live) return base;\n return { ...base, status: live.kind, statusReason: live.reason, toolCount: live.toolCount };\n });\n const bridged = specs.length > 0 && specs.every((s) => s.status === \"connected\");\n emit({ type: \"$mcp_specs\", specs, bridged }, tab.id);\n}\n\nfunction emitMemory(tab: Tab): void {\n try {\n const store = new MemoryStore({ projectRoot: tab.rootDir });\n const entries: MemoryEntryInfo[] = store.list().map((e) => ({\n name: e.name,\n scope: e.scope,\n description: e.description,\n }));\n emit({ type: \"$memory\", entries }, tab.id);\n } catch (err) {\n emit({ type: \"$error\", message: `memory_get failed: ${(err as Error).message}` }, tab.id);\n }\n}\n\n// reserved = system prompt + tool specs, constant for the tab's lifetime once\n// the loop is built. The growing log portion is already covered by the\n// per-turn cache hit/miss numbers in `model.final`.\nfunction emitCtxBreakdown(tab: Tab): void {\n if (!tab.runtime) return;\n try {\n const sys = countTokensBounded(tab.runtime.loop.prefix.system);\n const tools = countTokensBounded(JSON.stringify(tab.runtime.loop.prefix.toolSpecs));\n const logTokens = tab.runtime.loop.getCurrentLogTokens();\n emit({ type: \"$ctx_breakdown\", reservedTokens: sys + tools, logTokens }, tab.id);\n } catch {\n // tokenizer warmup can throw on first call before the data file loads\n }\n}\n\nfunction emitSkills(tab: Tab): void {\n try {\n const store = new SkillStore({\n projectRoot: tab.rootDir,\n customSkillPaths: loadResolvedSkillPaths(tab.rootDir),\n subagentModels: loadSubagentModels(),\n });\n const items = store.list().map((s) => ({\n name: s.name,\n description: s.description,\n scope: s.scope,\n path: s.path,\n runAs: s.runAs,\n model: s.model,\n }));\n emit({ type: \"$skills\", items }, tab.id);\n } catch (err) {\n emit({ type: \"$error\", message: `skills_get failed: ${(err as Error).message}` }, tab.id);\n }\n}\n\ninterface RuntimeState {\n loop: CacheFirstLoop;\n eventizer: Eventizer;\n ctx: {\n model: string;\n prefixHash: string;\n reasoningEffort: import(\"../../config.js\").ReasoningEffort;\n };\n}\n\ntype SymbolEntry = { name: string; path: string; line: number; kind: string };\n\ninterface Tab {\n readonly id: string;\n rootDir: string;\n currentSession: string;\n currentModel: string;\n budgetUsd: number | undefined;\n /** null while the tab is bootstrapping — see `initTabToolset`. UI gates input on `$ready`, which only fires once this is set. */\n toolset: Awaited<ReturnType<typeof buildCodeToolset>> | null;\n /** Empty while bootstrapping; populated together with `toolset`. */\n system: string;\n runtime: RuntimeState | null;\n aborter: AbortController | null;\n fileIndex: FileWithStats[] | null;\n fileIndexBuilding: Promise<FileWithStats[]> | null;\n fileIndexBuiltAt: number;\n symbolIndex: SymbolEntry[] | null;\n symbolBuilding: Promise<SymbolEntry[]> | null;\n recentMentions: string[];\n /** Pause-gate ids waiting on this tab — abort uses these to free stranded plan_checkpoint / plan_revision / shell-confirm callers. */\n pendingGateIds: Set<number>;\n /** Step ids already marked complete in the in-flight plan — also tells UI when a plan is \"active\". */\n completedStepIds: Set<string>;\n /** Total steps in the in-flight plan (0 = no active plan / steps not provided). */\n planTotalSteps: number;\n mcpRuntime: McpRuntime | null;\n mcpStatuses: Map<string, { kind: McpSpecStatus; reason?: string; toolCount?: number }>;\n /** True while a session switch is in progress — prevents stale events from the old turn. */\n switching: boolean;\n}\n\nlet tabCounter = 0;\nfunction nextTabId(): string {\n tabCounter++;\n return `t${tabCounter}`;\n}\n\nfunction mintSessionFor(rootDir: string): string {\n const name = `desktop-${timestampSuffix()}-${tabCounter}`;\n try {\n patchSessionMeta(name, { workspace: rootDir });\n } catch {\n // session meta is for filtering only — failure shouldn't block chat\n }\n return name;\n}\n\nfunction buildRuntimeFor(tab: Tab): RuntimeState {\n if (!tab.toolset) throw new Error(\"buildRuntimeFor called before initTabToolset finished\");\n const toolset = tab.toolset;\n applyPlanMode(toolset.tools, loadEditMode());\n const ep = loadEndpoint();\n const client = new DeepSeekClient({ apiKey: ep.apiKey, baseUrl: ep.baseUrl });\n const prefix = new ImmutablePrefix({ system: tab.system, toolSpecs: toolset.tools.specs() });\n const reasoningEffort = loadReasoningEffort();\n const loop = new CacheFirstLoop({\n client,\n prefix,\n tools: toolset.tools,\n model: tab.currentModel,\n budgetUsd: tab.budgetUsd,\n session: tab.currentSession,\n reasoningEffort,\n });\n const eventizer = new Eventizer();\n const ctx = { model: tab.currentModel, prefixHash: prefix.fingerprint, reasoningEffort };\n return { loop, eventizer, ctx };\n}\n\nconst TS_EXPORT_RE =\n /^export\\s+(?:default\\s+)?(?:async\\s+)?(function|class|const|let|var|interface|type|enum)\\s+\\*?\\s*(\\w+)/;\n\n/** TTL on the in-memory file index — without this, files deleted / renamed since the last @ popup still show up as candidates. 10s balances \"fresh enough for typical edit-then-mention flows\" against \"don't re-scan 5000 files on every keystroke\". */\nconst FILE_INDEX_TTL_MS = 10_000;\n\nasync function getFileIndexFor(tab: Tab): Promise<FileWithStats[]> {\n const fresh = tab.fileIndex && Date.now() - tab.fileIndexBuiltAt < FILE_INDEX_TTL_MS;\n if (fresh) return tab.fileIndex as FileWithStats[];\n if (tab.fileIndexBuilding) return tab.fileIndexBuilding;\n tab.fileIndexBuilding = listFilesWithStatsAsync(tab.rootDir, { maxResults: 5000 })\n .then((res) => {\n tab.fileIndex = res;\n tab.fileIndexBuiltAt = Date.now();\n tab.fileIndexBuilding = null;\n return res;\n })\n .catch((err) => {\n tab.fileIndexBuilding = null;\n throw err;\n });\n return tab.fileIndexBuilding;\n}\n\nasync function getSymbolIndexFor(tab: Tab): Promise<SymbolEntry[]> {\n if (tab.symbolIndex) return tab.symbolIndex;\n if (tab.symbolBuilding) return tab.symbolBuilding;\n tab.symbolBuilding = (async () => {\n const files = await getFileIndexFor(tab);\n const sourceExts = /\\.(?:ts|tsx|js|jsx|mts|cts)$/;\n const candidates = files.filter((f) => sourceExts.test(f.path)).slice(0, 1500);\n const out: SymbolEntry[] = [];\n const PARALLEL = 16;\n for (let i = 0; i < candidates.length; i += PARALLEL) {\n const batch = candidates.slice(i, i + PARALLEL);\n await Promise.all(\n batch.map(async (entry) => {\n const abs = isAbsolute(entry.path) ? entry.path : join(tab.rootDir, entry.path);\n try {\n const text = await readFile(abs, \"utf8\");\n const lines = text.split(/\\r?\\n/);\n for (let li = 0; li < lines.length; li++) {\n const line = lines[li]!;\n if (!line.startsWith(\"export \")) continue;\n const m = TS_EXPORT_RE.exec(line);\n if (m) out.push({ kind: m[1]!, name: m[2]!, path: entry.path, line: li + 1 });\n }\n } catch {\n // unreadable / binary — skip\n }\n }),\n );\n }\n tab.symbolIndex = out;\n tab.symbolBuilding = null;\n return out;\n })().catch((err) => {\n tab.symbolBuilding = null;\n throw err;\n });\n return tab.symbolBuilding;\n}\n\nfunction rankSymbols(syms: readonly SymbolEntry[], q: string, limit: number): string[] {\n const needle = q.toLowerCase();\n const scored: { entry: SymbolEntry; score: number }[] = [];\n for (const s of syms) {\n const lower = s.name.toLowerCase();\n let score: number;\n if (lower === needle) score = 0;\n else if (lower.startsWith(needle)) score = 100;\n else if (lower.includes(needle)) score = 500 + lower.indexOf(needle);\n else continue;\n scored.push({ entry: s, score });\n }\n scored.sort((a, b) => a.score - b.score || a.entry.name.localeCompare(b.entry.name));\n return scored.slice(0, limit).map((s) => `${s.entry.path}:${s.entry.line}`);\n}\n\nfunction pushMentionRecent(tab: Tab, path: string): void {\n const MAX = 20;\n const idx = tab.recentMentions.indexOf(path);\n if (idx >= 0) tab.recentMentions.splice(idx, 1);\n tab.recentMentions.unshift(path);\n if (tab.recentMentions.length > MAX) tab.recentMentions.length = MAX;\n}\n\n/** The desktop sidecar is a long-running daemon — Tauri spawns this Node process once per app launch and pipes JSON over stdin/stdout. Without these handlers, any orphaned promise rejection (e.g. from an aborted turn whose cleanup races a session-switch — #1074) crashes the process with exit code 1, which the Tauri host surfaces as \"reasonix exited (code 1)\" and a full reconnect cycle. Log loudly so we can find the underlying bug, but don't take the daemon down. */\nexport function installDesktopCrashGuards(\n stderr: { write: (s: string) => unknown } = process.stderr,\n): void {\n process.on(\"unhandledRejection\", (reason) => {\n const err = reason instanceof Error ? reason : new Error(String(reason));\n stderr.write(`[desktop] unhandledRejection: ${err.stack ?? err.message}\\n`);\n });\n process.on(\"uncaughtException\", (err) => {\n stderr.write(`[desktop] uncaughtException: ${err.stack ?? err.message}\\n`);\n });\n}\n\nexport async function desktopCommand(opts: DesktopOptions): Promise<void> {\n loadDotenv();\n // Tauri spawns the bundled Node from the GUI process, which never runs the\n // user's shell init (`.bashrc` / `.zshrc` / profile). Probe the login shell\n // once so nvm / asdf / fnm / volta / mise PATH entries reach `run_command`\n // children too (#1252). No-op on Windows — system PATH already covers GUI apps.\n const augmented = augmentProcessPath();\n if (augmented.added.length > 0) {\n process.stderr.write(\n `[desktop] augmented PATH with ${augmented.added.length} login-shell entries\\n`,\n );\n }\n installDesktopCrashGuards();\n\n const tabs = new Map<string, Tab>();\n const tabContext = new AsyncLocalStorage<string>();\n // Frontend-reported focused tab — persisted so a restart reopens on it (#1244).\n let lastActiveTabId = \"\";\n\n function activeRunningTab(): Tab | undefined {\n const id = tabContext.getStore();\n return id ? tabs.get(id) : undefined;\n }\n\n let first: Tab;\n\n const qqRuntime = {\n channel: null as QQChannel | null,\n runtimeState: \"disconnected\" as \"disconnected\" | \"connecting\" | \"connected\" | \"failed\",\n lastError: undefined as string | undefined,\n routing: createQQTurnRoutingState(),\n };\n\n function currentQqSettings(): QQSettingsEvent {\n const base = loadDesktopQQState();\n return {\n type: \"$qq_settings\",\n ...base,\n runtimeState: qqRuntime.runtimeState,\n lastError: qqRuntime.lastError,\n };\n }\n\n function activeDesktopTab(): Tab | undefined {\n return (lastActiveTabId ? tabs.get(lastActiveTabId) : undefined) ?? first;\n }\n\n function broadcastQQSettings(): void {\n for (const tab of tabs.values()) emit(currentQqSettings(), tab.id);\n }\n\n function setQQRuntimeState(\n runtimeState: \"disconnected\" | \"connecting\" | \"connected\" | \"failed\",\n lastError?: string,\n ): void {\n qqRuntime.runtimeState = runtimeState;\n qqRuntime.lastError = lastError;\n desktopQqRuntimeSnapshot.runtimeState = runtimeState;\n desktopQqRuntimeSnapshot.lastError = lastError;\n broadcastQQSettings();\n }\n\n function sendQQInfo(message: string): void {\n const tab = activeDesktopTab();\n if (tab) {\n emit(\n {\n type: \"status\",\n id: Date.now(),\n ts: new Date().toISOString(),\n turn: 0,\n text: message,\n },\n tab.id,\n );\n }\n void qqRuntime.channel?.sendResponse(message).catch((err) => {\n const active = activeDesktopTab();\n if (active) {\n emit({ type: \"$error\", message: `qq send failed: ${(err as Error).message}` }, active.id);\n }\n });\n }\n\n function parseIndexedChoice(text: string): number {\n const rawIndex = text.match(/^(\\d+)/)?.[1];\n return rawIndex ? Number.parseInt(rawIndex, 10) - 1 : -1;\n }\n\n function parseRunPermissionChoice(text: string): \"run_once\" | \"always_allow\" | \"deny\" {\n const lower = text.toLowerCase();\n if (lower.includes(\"1\") || lower.includes(\"run\")) return \"run_once\";\n if (lower.includes(\"2\") || lower.includes(\"always\")) return \"always_allow\";\n return \"deny\";\n }\n\n function parsePlanChoice(text: string): \"approve\" | \"refine\" | \"cancel\" {\n const lower = text.toLowerCase();\n if (lower.includes(\"1\") || lower.includes(\"approve\")) return \"approve\";\n if (lower.includes(\"2\") || lower.includes(\"refine\")) return \"refine\";\n return \"cancel\";\n }\n\n function parseCheckpointChoice(text: string): \"continue\" | \"revise\" | \"stop\" {\n const lower = text.toLowerCase();\n if (lower.includes(\"1\") || lower.includes(\"continue\")) return \"continue\";\n if (lower.includes(\"2\") || lower.includes(\"revise\")) return \"revise\";\n return \"stop\";\n }\n\n function parseRevisionChoice(text: string): \"accept\" | \"reject\" | \"cancel\" {\n const lower = text.toLowerCase();\n if (lower.includes(\"1\") || lower.includes(\"accept\")) return \"accept\";\n if (lower.includes(\"2\") || lower.includes(\"reject\")) return \"reject\";\n return \"cancel\";\n }\n\n function stripFollowupPrefix(text: string): string {\n return text\n .replace(\n /^(?:\\d+\\s*|approve\\s*|refine\\s*|cancel\\s*|continue\\s*|revise\\s*|stop\\s*|accept\\s*|reject\\s*|run\\s*|always\\s*|deny\\s*)/iu,\n \"\",\n )\n .trim();\n }\n\n function handleQQPauseReply(tab: Tab, text: string): boolean {\n const pending = takeQQPendingInteraction(qqRuntime.routing, tab.id);\n if (!pending) return false;\n const followup = stripFollowupPrefix(text);\n const interaction = pending;\n const gateId = pending.gateId;\n\n switch (interaction.kind) {\n case \"run_command\":\n case \"run_background\":\n case \"path_access\":\n pauseGate.resolve(gateId, parseRunPermissionChoice(text));\n return true;\n case \"plan_proposed\": {\n const payload = (interaction.payload as { plan?: string }) ?? {};\n const choice = parsePlanChoice(text);\n if (choice === \"cancel\") {\n pauseGate.cancel(gateId);\n } else {\n pauseGate.resolve(gateId, {\n type: choice === \"approve\" ? \"approve\" : \"refine\",\n feedback: followup,\n override: {\n plan: payload.plan ?? \"\",\n mode: choice === \"approve\" ? \"approve\" : \"refine\",\n },\n });\n }\n return true;\n }\n case \"plan_checkpoint\": {\n const payload = (interaction.payload as { stepId?: string; title?: string }) ?? {};\n const choice = parseCheckpointChoice(text);\n if (choice === \"revise\") {\n pauseGate.resolve(gateId, {\n type: \"revise\",\n feedback: followup,\n checkpoint: { stepId: payload.stepId ?? \"\", title: payload.title },\n });\n } else {\n pauseGate.resolve(gateId, { type: choice });\n }\n return true;\n }\n case \"plan_revision\":\n pauseGate.resolve(gateId, parseRevisionChoice(text));\n return true;\n case \"choice\": {\n const payload =\n (interaction.payload as { options?: ChoiceOption[]; allowCustom?: boolean }) ?? {};\n const options = payload.options ?? [];\n const pickedIndex = parseIndexedChoice(text);\n if (pickedIndex >= 0 && pickedIndex < options.length) {\n const selected = options[pickedIndex];\n if (selected) pauseGate.resolve(gateId, { type: \"pick\", optionId: selected.id });\n return true;\n }\n for (const option of options) {\n if (text.toLowerCase().includes(option.title.toLowerCase())) {\n pauseGate.resolve(gateId, { type: \"pick\", optionId: option.id });\n return true;\n }\n }\n pauseGate.resolve(\n gateId,\n payload.allowCustom ? { type: \"text\", text } : { type: \"cancel\" },\n );\n return true;\n }\n default:\n return false;\n }\n }\n\n function handleQQPauseRequest(tab: Tab, kind: string, payload: Record<string, unknown>): void {\n if (!qqRuntime.channel || !shouldRouteQQForTab(qqRuntime.routing, tab.id)) return;\n let qqMessage = \"\";\n switch (kind) {\n case \"run_command\":\n case \"run_background\": {\n const p = payload as { command: string };\n qqMessage = `Need confirmation\\n\\nCommand: \\`${p.command}\\`\\n\\nReply with:\\n1. Run once\\n2. Always allow\\n3. Deny`;\n break;\n }\n case \"path_access\": {\n const p = payload as { path: string; intent: \"read\" | \"write\"; toolName: string };\n const intentText = p.intent === \"read\" ? \"Read\" : \"Write\";\n qqMessage = `Need file access confirmation\\n\\nAction: ${intentText}\\nPath: ${p.path}\\nTool: ${p.toolName}\\n\\nReply with:\\n1. Run once\\n2. Always allow\\n3. Deny`;\n break;\n }\n case \"plan_proposed\": {\n const p = payload as { plan: string };\n qqMessage = `Plan confirmation\\n\\n${p.plan}\\n\\nReply with:\\n1. Approve\\n2. Refine\\n3. Cancel`;\n break;\n }\n case \"plan_checkpoint\": {\n const p = payload as { title?: string; result: string };\n qqMessage = `Step complete (${tab.completedStepIds.size}/${tab.planTotalSteps})\\n\\n${\n p.title ? `Step: ${p.title}\\n` : \"\"\n }Result: ${p.result}\\n\\nReply with:\\n1. Continue\\n2. Revise\\n3. Stop`;\n break;\n }\n case \"plan_revision\": {\n const p = payload as { reason: string };\n qqMessage = `Plan revision proposed\\n\\n${p.reason}\\n\\nReply with:\\n1. Accept\\n2. Reject\\n3. Cancel`;\n break;\n }\n case \"choice\": {\n const p = payload as { question: string; options: ChoiceOption[]; allowCustom: boolean };\n const optionsList = p.options.map((opt, idx) => `${idx + 1}. ${opt.title}`).join(\"\\n\");\n qqMessage = `Please choose\\n\\n${p.question}\\n\\nOptions:\\n${optionsList}${\n p.allowCustom ? \"\\n\\n(You can also reply with custom text.)\" : \"\"\n }`;\n break;\n }\n }\n if (qqMessage) {\n void qqRuntime.channel.sendResponse(qqMessage).catch((err) => {\n emit({ type: \"$error\", message: `qq send failed: ${(err as Error).message}` }, tab.id);\n });\n }\n }\n\n async function startDesktopQQ(shouldPersistEnabled = true): Promise<void> {\n const current = loadQQConfig();\n if (!(current.appId && current.appSecret)) {\n throw new Error(\"QQ App ID and App Secret are required.\");\n }\n if (qqRuntime.channel) {\n qqRuntime.channel.refreshAccessConfig();\n setQQRuntimeState(\"connected\");\n return;\n }\n setQQRuntimeState(\"connecting\");\n const channel = new QQChannel({\n onSubmitMessage: (text) => {\n const tab = activeDesktopTab();\n if (!tab) return;\n const trimmed = text.trim();\n if (!trimmed) return;\n emit(\n {\n type: \"user.message\",\n id: Date.now(),\n ts: new Date().toISOString(),\n turn: 0,\n text: trimmed,\n },\n tab.id,\n );\n if (handleQQPauseReply(tab, trimmed)) return;\n if (tab.aborter) {\n void channel\n .sendResponse(\n \"Session is busy. Wait for the current turn or reply to the pending prompt.\",\n )\n .catch(() => undefined);\n return;\n }\n void runTurn(tab, trimmed, true);\n },\n onError: (message) => {\n const tab = activeDesktopTab();\n setQQRuntimeState(\"failed\", message);\n if (tab) emit({ type: \"$error\", message: `QQ: ${message}` }, tab.id);\n },\n });\n try {\n await channel.start();\n qqRuntime.channel = channel;\n if (shouldPersistEnabled) setDesktopQQEnabled(true);\n setQQRuntimeState(\"connected\");\n } catch (err) {\n await channel.stop().catch(() => undefined);\n qqRuntime.channel = null;\n if (shouldPersistEnabled) setDesktopQQEnabled(false);\n setQQRuntimeState(\"failed\", (err as Error).message);\n throw err;\n }\n }\n\n async function stopDesktopQQ(shouldDisable = true): Promise<void> {\n const channel = qqRuntime.channel;\n qqRuntime.channel = null;\n clearQQTurnRouting(qqRuntime.routing);\n if (channel) await channel.stop();\n if (shouldDisable) setDesktopQQEnabled(false);\n setQQRuntimeState(\"disconnected\");\n }\n\n /** Synchronous tab construction — no I/O. All cheap, disk-only events (`$settings`, `$sessions`, `$memory`, `$skills`, `$mcp_specs`) can fire against this immediately. The heavy bits (`buildCodeToolset`, MCP probes, runtime construction) happen in `initTabToolset` so the UI shell paints without waiting for them. */\n function createTabSkeleton(initialDir?: string): Tab {\n const dir = resolve(initialDir ?? opts.dir ?? loadWorkspaceDir() ?? process.cwd());\n pushRecentWorkspace(dir);\n const model = opts.model || loadModel() || DEFAULT_MODEL;\n const tab: Tab = {\n id: nextTabId(),\n rootDir: dir,\n currentSession: \"\",\n currentModel: model,\n budgetUsd: opts.budgetUsd,\n toolset: null,\n system: \"\",\n runtime: null,\n aborter: null,\n fileIndex: null,\n fileIndexBuilding: null,\n fileIndexBuiltAt: 0,\n symbolIndex: null,\n symbolBuilding: null,\n recentMentions: [],\n pendingGateIds: new Set<number>(),\n completedStepIds: new Set<string>(),\n planTotalSteps: 0,\n mcpRuntime: null,\n mcpStatuses: new Map(),\n switching: false,\n };\n tab.currentSession = mintSessionFor(dir);\n tabs.set(tab.id, tab);\n return tab;\n }\n\n /** Builds the toolset / system prompt / runtime / MCP bridge for a freshly-created skeleton. Reads `tab.currentModel` at call time so model changes during the wait are honored. */\n async function initTabToolset(tab: Tab): Promise<void> {\n const toolset = await buildCodeToolset({\n rootDir: tab.rootDir,\n onSkillInstalled: () => emitSkills(tab),\n onJobsChanged: () => emitJobs(),\n });\n tab.toolset = toolset;\n tab.system = codeSystemPrompt(tab.rootDir, {\n hasSemanticSearch: toolset.semantic.enabled,\n modelId: tab.currentModel,\n });\n if (loadApiKey()) {\n bridgeEndpointEnv();\n tab.runtime = buildRuntimeFor(tab);\n void bridgeTabMcp(tab);\n }\n }\n\n function bridgeTabMcp(tab: Tab): Promise<void> {\n if (!tab.runtime || !tab.toolset) return Promise.resolve();\n if (tab.mcpRuntime) {\n // Already constructed — reload so new/removed specs settle without restart.\n return tab.mcpRuntime\n .reloadFromConfig(tab.runtime.loop)\n .then(() => emitMcpSpecs(tab))\n .catch((err) => {\n emit({ type: \"$error\", message: `mcp reload failed: ${(err as Error).message}` }, tab.id);\n });\n }\n const requested = (readConfig().mcp ?? []).length;\n if (requested === 0) return Promise.resolve();\n const runtime = createMcpRuntime({\n getTools: () => {\n if (!tab.toolset) throw new Error(\"toolset gone\");\n return tab.toolset.tools;\n },\n getMcpPrefix: () => undefined,\n getRequestedCount: () => requested,\n getWorkspaceDir: () => tab.rootDir,\n progressSink: { current: null },\n });\n tab.mcpRuntime = runtime;\n runtime.setLifecycleSink((notice) => {\n if (notice.kind === \"slow\") return; // not surfaced in the desktop panel\n const cfg = readConfig().mcp ?? [];\n const target = cfg.find((raw) => {\n try {\n return parseMcpSpec(raw).name === notice.name;\n } catch {\n return false;\n }\n });\n if (!target) return;\n if (notice.kind === \"handshake\") {\n tab.mcpStatuses.set(target, { kind: \"handshake\" });\n } else if (notice.kind === \"connected\") {\n tab.mcpStatuses.set(target, { kind: \"connected\", toolCount: notice.tools });\n } else if (notice.kind === \"failed\") {\n tab.mcpStatuses.set(target, { kind: \"failed\", reason: notice.reason });\n } else if (notice.kind === \"disabled\") {\n tab.mcpStatuses.set(target, { kind: \"disabled\" });\n }\n emitMcpSpecs(tab);\n });\n return runtime\n .reloadFromConfig(tab.runtime.loop)\n .then(() => undefined)\n .catch((err) => {\n emit({ type: \"$error\", message: `mcp bridge failed: ${(err as Error).message}` }, tab.id);\n });\n }\n\n /** Snapshot of every open tab — workspace dir, loaded session and focus, in tab order. Persisted after open/close/switch so a restart restores the full tab set and each conversation (issues #933, #1244). */\n function persistOpenTabs(): void {\n try {\n saveDesktopOpenTabs(\n Array.from(tabs.values()).map((t) => ({\n dir: t.rootDir,\n session: t.currentSession || undefined,\n active: t.id === lastActiveTabId,\n })),\n );\n } catch {\n // best-effort — disk / perms shouldn't break tab management\n }\n }\n\n async function closeTab(tab: Tab): Promise<void> {\n abortTurn(tab);\n try {\n await tab.toolset?.jobs.shutdown();\n } catch {\n // shutdown errors aren't actionable here\n }\n if (tab.mcpRuntime) {\n try {\n await tab.mcpRuntime.closeAll();\n } catch {\n // MCP shutdown errors aren't actionable here either\n }\n }\n tabs.delete(tab.id);\n if (first && first.id === tab.id) {\n const next = tabs.values().next().value;\n if (next) first = next;\n }\n persistOpenTabs();\n emit({ type: \"$tab_closed\" }, tab.id);\n }\n\n async function runTurn(tab: Tab, text: string, fromQQ = false): Promise<void> {\n if (!tab.runtime) return;\n const rt = tab.runtime;\n tab.aborter = new AbortController();\n if (fromQQ) markQQTurnStarted(qqRuntime.routing, tab.id);\n let lastAssistantText = \"\";\n if (tab.currentSession) {\n const existing = loadSessionMeta(tab.currentSession).summary;\n if (!existing || !existing.trim()) {\n const summary = text.replace(/\\s+/g, \" \").trim().slice(0, 60);\n if (summary) {\n try {\n patchSessionMeta(tab.currentSession, { summary });\n } catch {\n // meta is for display only — failure shouldn't block the turn\n }\n }\n }\n }\n await tabContext.run(tab.id, async () => {\n try {\n for await (const ev of rt.loop.step(text)) {\n if (ev.role === \"assistant_final\" && ev.content) {\n lastAssistantText = ev.content;\n }\n for (const kev of rt.eventizer.consume(ev, rt.ctx)) emit(kev, tab.id);\n // Memory tools mutate disk state behind the loop's back — the UI\n // panel won't know until we re-emit. Without this the right-hand\n // panel only updates on tab reopen.\n if (ev.role === \"tool\" && (ev.toolName === \"remember\" || ev.toolName === \"forget\")) {\n emitMemory(tab);\n }\n if (tab.aborter?.signal.aborted) break;\n }\n } catch (err) {\n emit({ type: \"$error\", message: (err as Error).message }, tab.id);\n } finally {\n tab.aborter = null;\n // If a session switch happened while this turn was running,\n // suppress stale events to avoid UI state corruption (#1217).\n if (!tab.switching) {\n if (\n fromQQ &&\n lastAssistantText &&\n qqRuntime.channel &&\n shouldRouteQQForTab(qqRuntime.routing, tab.id)\n ) {\n await qqRuntime.channel.sendResponse(lastAssistantText).catch((err) => {\n emit(\n { type: \"$error\", message: `qq send failed: ${(err as Error).message}` },\n tab.id,\n );\n });\n }\n emit({ type: \"$turn_complete\" }, tab.id);\n if (tab.planTotalSteps > 0 && tab.completedStepIds.size >= tab.planTotalSteps) {\n tab.completedStepIds.clear();\n tab.planTotalSteps = 0;\n emit({ type: \"$plan_cleared\" }, tab.id);\n }\n emitSessions(tab);\n void emitBalance(tab);\n }\n if (fromQQ) markQQTurnFinished(qqRuntime.routing, tab.id);\n tab.switching = false;\n }\n });\n }\n\n async function switchWorkspace(tab: Tab, nextDir: string): Promise<void> {\n const target = resolve(nextDir);\n if (target === tab.rootDir) {\n emitSettings(tab);\n return;\n }\n if (!existsSync(target) || !statSync(target).isDirectory()) {\n emit({ type: \"$error\", message: `Workspace not found: ${target}` }, tab.id);\n emitSettings(tab);\n return;\n }\n abortTurn(tab);\n try {\n await tab.toolset?.jobs.shutdown();\n } catch {\n // shutdown errors aren't actionable here\n }\n tab.rootDir = target;\n saveWorkspaceDir(target);\n pushRecentWorkspace(target);\n tab.fileIndex = null;\n tab.fileIndexBuilding = null;\n tab.fileIndexBuiltAt = 0;\n tab.symbolIndex = null;\n tab.symbolBuilding = null;\n tab.recentMentions.length = 0;\n tab.currentSession = mintSessionFor(target);\n tab.toolset = await buildCodeToolset({\n rootDir: target,\n onSkillInstalled: () => emitSkills(tab),\n onJobsChanged: () => emitJobs(),\n });\n tab.system = codeSystemPrompt(target, {\n hasSemanticSearch: tab.toolset.semantic.enabled,\n modelId: tab.currentModel,\n });\n if (tab.runtime) tab.runtime = buildRuntimeFor(tab);\n emitSessions(tab);\n emitSettings(tab);\n emitSkills(tab);\n persistOpenTabs();\n }\n\n function forgetGate(id: number): Tab | undefined {\n for (const t of tabs.values()) {\n if (t.pendingGateIds.delete(id)) return t;\n }\n return undefined;\n }\n\n function abortTurn(tab: Tab, opts: { discardCurrentTurn?: boolean } = {}): void {\n tab.aborter?.abort();\n tab.runtime?.loop.abort(opts.discardCurrentTurn ? { discardCurrentTurn: true } : undefined);\n }\n\n function tabSessionLabel(tab: Tab): string {\n if (tab.currentSession) {\n try {\n const summary = loadSessionMeta(tab.currentSession).summary?.trim();\n if (summary) return summary;\n } catch {\n // session file unreadable — fall through to workspace basename\n }\n }\n return tab.rootDir.split(/[\\\\/]/).filter(Boolean).pop() ?? tab.rootDir;\n }\n\n function emitJobs(): void {\n const items: JobInfoPayload[] = [];\n for (const t of tabs.values()) {\n const reg = t.toolset?.jobs;\n if (!reg) continue;\n const label = tabSessionLabel(t);\n for (const j of reg.list()) {\n items.push({\n id: j.id,\n tabId: t.id,\n sessionLabel: label,\n command: j.command,\n pid: j.pid,\n running: j.running,\n exitCode: j.exitCode,\n startedAt: j.startedAt,\n outputTail: tailLines(j.output, 8),\n spawnError: j.spawnError,\n });\n }\n }\n items.sort((a, b) => {\n if (a.running !== b.running) return a.running ? -1 : 1;\n return b.startedAt - a.startedAt;\n });\n emit({ type: \"$jobs\", items });\n }\n\n async function stopJob(jobId: number): Promise<boolean> {\n for (const t of tabs.values()) {\n const reg = t.toolset?.jobs;\n if (!reg) continue;\n const hit = reg.list().find((j) => j.id === jobId);\n if (!hit) continue;\n await reg.stop(jobId);\n return true;\n }\n return false;\n }\n\n async function stopAllJobs(): Promise<void> {\n const ops: Promise<unknown>[] = [];\n for (const t of tabs.values()) {\n const reg = t.toolset?.jobs;\n if (!reg) continue;\n for (const j of reg.list()) {\n if (j.running) ops.push(reg.stop(j.id));\n }\n }\n await Promise.allSettled(ops);\n }\n\n function cancelPendingGates(tab: Tab): void {\n const hadActivePlan = tab.planTotalSteps > 0 || tab.completedStepIds.size > 0;\n const ids = [...tab.pendingGateIds];\n tab.pendingGateIds.clear();\n for (const id of ids) pauseGate.cancel(id);\n if (hadActivePlan) {\n tab.completedStepIds.clear();\n tab.planTotalSteps = 0;\n emit({ type: \"$plan_cleared\" }, tab.id);\n }\n }\n\n // `first` is the fallback tab for legacy tabId-less RPC messages. We\n // assign it lazily below so saved-tabs restore (issue #933) can choose\n // the boot dir before construction, and rotate `first` to the next\n // surviving tab when its source closes.\n let shuttingDown = false;\n async function gracefulShutdown(): Promise<void> {\n if (shuttingDown) return;\n shuttingDown = true;\n await stopDesktopQQ(false).catch(() => undefined);\n await Promise.allSettled(\n [...tabs.values()].map((t) => t.toolset?.jobs.shutdown(1500) ?? Promise.resolve()),\n );\n process.exit(0);\n }\n process.on(\"SIGTERM\", () => {\n void gracefulShutdown();\n });\n process.on(\"SIGINT\", () => {\n void gracefulShutdown();\n });\n\n pauseGate.on((req) => {\n const tab = activeRunningTab();\n const tabId = tab?.id;\n if (tab) tab.pendingGateIds.add(req.id);\n // Shared auto-resolve policy (e.g. plan_checkpoint in auto/yolo) — must\n // still run BEFORE we emit any UI event, otherwise the surface flickers\n // a card that we'd immediately tear down.\n const auto = autoResolveVerdict(req, loadEditMode());\n if (auto !== null) {\n // plan_checkpoint specifically needs the step-completed signal to flow\n // through so the rail progress ticks. Emit it before resolving.\n if (req.kind === \"plan_checkpoint\") {\n const payload = req.payload as {\n stepId: string;\n title?: string;\n result: string;\n notes?: string;\n };\n if (tab) tab.completedStepIds.add(payload.stepId);\n emit(\n {\n type: \"$step_completed\",\n stepId: payload.stepId,\n title: payload.title,\n result: payload.result,\n notes: payload.notes,\n },\n tabId,\n );\n }\n if (tab) tab.pendingGateIds.delete(req.id);\n pauseGate.resolve(req.id, auto);\n return;\n }\n if (req.kind === \"run_command\" || req.kind === \"run_background\") {\n const payload = req.payload as {\n command?: string;\n cwd?: string;\n timeoutSec?: number;\n waitSec?: number;\n };\n if (tab) setQQPendingInteraction(qqRuntime.routing, tab.id, req.id, req.kind, payload);\n emit(\n {\n type: \"$confirm_required\",\n id: req.id,\n kind: req.kind,\n command: payload.command ?? \"\",\n prompt: toApprovalPrompt({\n id: req.id,\n kind: req.kind,\n payload,\n }),\n },\n tabId,\n );\n if (tab) handleQQPauseRequest(tab, req.kind, payload as Record<string, unknown>);\n return;\n }\n if (req.kind === \"path_access\") {\n const payload = req.payload as {\n path: string;\n intent: \"read\" | \"write\";\n toolName: string;\n sandboxRoot: string;\n allowPrefix: string;\n };\n if (tab) setQQPendingInteraction(qqRuntime.routing, tab.id, req.id, req.kind, payload);\n emit(\n {\n type: \"$path_access_required\",\n id: req.id,\n path: payload.path,\n intent: payload.intent,\n toolName: payload.toolName,\n sandboxRoot: payload.sandboxRoot,\n allowPrefix: payload.allowPrefix,\n prompt: toApprovalPrompt({\n id: req.id,\n kind: req.kind,\n payload,\n }),\n },\n tabId,\n );\n if (tab) handleQQPauseRequest(tab, req.kind, payload as Record<string, unknown>);\n return;\n }\n if (req.kind === \"choice\") {\n const payload = req.payload as {\n question: string;\n options: ChoiceOption[];\n allowCustom: boolean;\n };\n if (tab) setQQPendingInteraction(qqRuntime.routing, tab.id, req.id, req.kind, payload);\n emit(\n {\n type: \"$choice_required\",\n id: req.id,\n question: payload.question,\n options: payload.options,\n allowCustom: payload.allowCustom,\n },\n tabId,\n );\n if (tab) handleQQPauseRequest(tab, req.kind, payload as Record<string, unknown>);\n return;\n }\n if (req.kind === \"plan_proposed\") {\n const payload = req.payload as { plan: string; steps?: PlanStepLite[]; summary?: string };\n if (tab) {\n tab.completedStepIds.clear();\n tab.planTotalSteps = payload.steps?.length ?? 0;\n setQQPendingInteraction(qqRuntime.routing, tab.id, req.id, req.kind, payload);\n }\n emit(\n {\n type: \"$plan_required\",\n id: req.id,\n plan: payload.plan,\n steps: payload.steps,\n summary: payload.summary,\n },\n tabId,\n );\n if (tab) handleQQPauseRequest(tab, req.kind, payload as Record<string, unknown>);\n return;\n }\n if (req.kind === \"plan_checkpoint\") {\n const payload = req.payload as {\n stepId: string;\n title?: string;\n result: string;\n notes?: string;\n };\n if (tab) {\n tab.completedStepIds.add(payload.stepId);\n setQQPendingInteraction(qqRuntime.routing, tab.id, req.id, req.kind, payload);\n }\n emit(\n {\n type: \"$step_completed\",\n stepId: payload.stepId,\n title: payload.title,\n result: payload.result,\n notes: payload.notes,\n },\n tabId,\n );\n emit(\n {\n type: \"$checkpoint_required\",\n id: req.id,\n stepId: payload.stepId,\n title: payload.title,\n result: payload.result,\n notes: payload.notes,\n completed: tab?.completedStepIds.size ?? 0,\n total: tab?.planTotalSteps ?? 0,\n },\n tabId,\n );\n if (tab) handleQQPauseRequest(tab, req.kind, payload as Record<string, unknown>);\n return;\n }\n if (req.kind === \"plan_revision\") {\n const payload = req.payload as {\n reason: string;\n remainingSteps: PlanStepLite[];\n summary?: string;\n };\n if (tab) setQQPendingInteraction(qqRuntime.routing, tab.id, req.id, req.kind, payload);\n emit(\n {\n type: \"$revision_required\",\n id: req.id,\n reason: payload.reason,\n remainingSteps: payload.remainingSteps,\n summary: payload.summary,\n },\n tabId,\n );\n if (tab) handleQQPauseRequest(tab, req.kind, payload as Record<string, unknown>);\n return;\n }\n // Unknown PauseKind — `never` makes a new kind without a handler a compile\n // error; the runtime cancel is the last-mile defense so the agent loop\n // doesn't hang waiting on a request no one will resolve.\n const exhaustive: never = req.kind;\n process.stderr.write(\n `[desktop] no handler for pause kind \"${String(exhaustive)}\" — auto-cancelling gate id=${req.id}\\n`,\n );\n if (tab) tab.pendingGateIds.delete(req.id);\n pauseGate.cancel(req.id);\n });\n\n // Fast-path: emit disk-only events immediately so the UI shell renders\n // before the toolset finishes building. Heavy work (semantic bootstrap,\n // MCP probes, runtime construction) runs in initTabToolset which fires\n // `$ready` when it completes — until then `state.ready` keeps the\n // composer disabled, so users can't send a message before the runtime\n // exists. emitBalance was already fire-and-forget.\n function bootstrapTab(\n initialDir?: string,\n restore?: { session?: string; active?: boolean },\n ): Tab {\n const tab = createTabSkeleton(initialDir);\n // Reopen the conversation the tab had, if its jsonl is still readable.\n let restoredMessages: LoadedMessage[] | undefined;\n if (restore?.session) {\n try {\n if (existsSync(sessionPath(restore.session))) {\n const msgs = buildLoadedMessages(loadSessionMessages(restore.session));\n if (msgs.length > 0) {\n tab.currentSession = restore.session;\n restoredMessages = msgs;\n }\n }\n } catch {\n // unreadable jsonl — fall back to the freshly minted session\n }\n }\n emit({ type: \"$tab_opened\", workspaceDir: tab.rootDir, active: restore?.active }, tab.id);\n emitSessions(tab);\n emitSettings(tab);\n emitMcpSpecs(tab);\n emitSkills(tab);\n emitMemory(tab);\n emitQQSettings(tab);\n if (restoredMessages) {\n const meta = loadSessionMeta(tab.currentSession);\n emit(\n {\n type: \"$session_loaded\",\n name: tab.currentSession,\n messages: restoredMessages,\n carryover: {\n totalCostUsd: meta.totalCostUsd ?? 0,\n cacheHitTokens: meta.cacheHitTokens ?? 0,\n cacheMissTokens: meta.cacheMissTokens ?? 0,\n totalCompletionTokens: meta.totalCompletionTokens ?? 0,\n },\n },\n tab.id,\n );\n }\n if (!loadApiKey()) emit({ type: \"$needs_setup\", reason: \"no_api_key\" }, tab.id);\n void emitBalance(tab);\n void initTabToolset(tab)\n .then(() => {\n if (loadApiKey()) emit({ type: \"$ready\" }, tab.id);\n emitCtxBreakdown(tab);\n })\n .catch((err) => {\n emit({ type: \"$error\", message: `init failed: ${(err as Error).message}` }, tab.id);\n });\n return tab;\n }\n\n // Restore the full tab set from the previous session — workspace dir,\n // loaded session and focused tab (issues #933, #1244). Missing dirs\n // are silently skipped — a deleted workspace shouldn't break boot.\n const savedTabs = loadDesktopOpenTabs().filter((t) => {\n try {\n return existsSync(t.dir) && statSync(t.dir).isDirectory();\n } catch {\n return false;\n }\n });\n // When launched with --dir, find the matching saved tab so the user's\n // previous session is restored automatically.\n const startupDir = opts.dir;\n const startupTab = startupDir\n ? savedTabs.find((t) => resolve(t.dir) === resolve(startupDir))\n : savedTabs[0];\n first = bootstrapTab(opts.dir ?? savedTabs[0]?.dir, startupTab);\n const restored: Tab[] = [first];\n for (const t of savedTabs.slice(1)) restored.push(bootstrapTab(t.dir, t));\n // Mirror the persisted focus so the next persist round-trips it.\n const activeIdx = savedTabs.findIndex((t) => t.active);\n lastActiveTabId = ((activeIdx >= 0 ? restored[activeIdx] : first) ?? first).id;\n persistOpenTabs();\n const qqConfig = loadQQConfig();\n if (qqConfig.enabled && qqConfig.appId && qqConfig.appSecret) {\n void startDesktopQQ(false).catch(() => undefined);\n } else {\n broadcastQQSettings();\n }\n\n const rl = createInterface({ input: stdin });\n rl.on(\"line\", (line) => {\n const trimmed = line.trim();\n if (!trimmed) return;\n let msg: InMessage;\n try {\n msg = JSON.parse(trimmed) as InMessage;\n } catch {\n emit({ type: \"$error\", message: `bad json on stdin: ${trimmed.slice(0, 80)}` });\n return;\n }\n\n if (msg.cmd === \"tab_open\") {\n try {\n // A user-opened tab takes focus.\n const opened = bootstrapTab(msg.workspaceDir, { active: true });\n lastActiveTabId = opened.id;\n persistOpenTabs();\n } catch (err) {\n emit({ type: \"$error\", message: `tab_open failed: ${(err as Error).message}` });\n }\n return;\n }\n if (msg.cmd === \"tab_activate\") {\n if (tabs.has(msg.tabId)) {\n lastActiveTabId = msg.tabId;\n persistOpenTabs();\n }\n return;\n }\n if (msg.cmd === \"confirm_response\") {\n forgetGate(msg.id);\n pauseGate.resolve(msg.id, msg.response);\n return;\n }\n if (msg.cmd === \"choice_response\") {\n forgetGate(msg.id);\n pauseGate.resolve(msg.id, msg.response);\n return;\n }\n if (msg.cmd === \"plan_response\") {\n const tab = forgetGate(msg.id);\n if (tab && msg.response.type === \"cancel\") {\n tab.completedStepIds.clear();\n tab.planTotalSteps = 0;\n emit({ type: \"$plan_cleared\" }, tab.id);\n }\n pauseGate.resolve(msg.id, msg.response);\n return;\n }\n if (msg.cmd === \"checkpoint_response\") {\n const tab = forgetGate(msg.id);\n if (tab && msg.response.type === \"stop\") {\n tab.completedStepIds.clear();\n tab.planTotalSteps = 0;\n emit({ type: \"$plan_cleared\" }, tab.id);\n }\n pauseGate.resolve(msg.id, msg.response);\n return;\n }\n if (msg.cmd === \"revision_response\") {\n forgetGate(msg.id);\n pauseGate.resolve(msg.id, msg.response);\n return;\n }\n if (msg.cmd === \"setup_save_key\") {\n const key = msg.key.trim();\n if (!isPlausibleKey(key)) {\n emit({\n type: \"$error\",\n message: \"Key looks too short — paste the full token (16+ chars, no spaces).\",\n });\n return;\n }\n try {\n saveApiKey(key);\n bridgeEndpointEnv();\n for (const tab of tabs.values()) {\n // Skeleton tabs still mid-bootstrap pick up the new key inside\n // initTabToolset's tail when buildCodeToolset settles — don't\n // try to construct a runtime against a null toolset here.\n if (!tab.toolset) {\n emitSettings(tab);\n void emitBalance(tab);\n continue;\n }\n tab.runtime = buildRuntimeFor(tab);\n emit({ type: \"$ready\" }, tab.id);\n emitSettings(tab);\n void emitBalance(tab);\n }\n } catch (err) {\n emit({ type: \"$error\", message: `saveApiKey failed: ${(err as Error).message}` });\n }\n return;\n }\n\n if (msg.cmd === \"desktop_resync\") {\n // WebView reloads (DevTools F5, host-side respawn) leave the Node child\n // alive but the React app starts blank. Re-fire the bootstrap events\n // so it can rehydrate without restarting the agent.\n const hasKey = !!loadApiKey();\n for (const t of tabs.values()) {\n emit(\n { type: \"$tab_opened\", workspaceDir: t.rootDir, active: t.id === lastActiveTabId },\n t.id,\n );\n emitSessions(t);\n emitSettings(t);\n emitMcpSpecs(t);\n emitSkills(t);\n emitMemory(t);\n emitQQSettings(t);\n if (!hasKey) emit({ type: \"$needs_setup\", reason: \"no_api_key\" }, t.id);\n else if (t.toolset) emit({ type: \"$ready\" }, t.id);\n void emitBalance(t);\n // Re-emit session_loaded so the resumed session's messages and\n // usage stats (cost, tokens, cache%) are restored on the frontend.\n if (t.currentSession) {\n try {\n const msgs = buildLoadedMessages(loadSessionMessages(t.currentSession));\n const meta = loadSessionMeta(t.currentSession);\n emit(\n {\n type: \"$session_loaded\",\n name: t.currentSession,\n messages: msgs,\n carryover: {\n totalCostUsd: meta.totalCostUsd ?? 0,\n cacheHitTokens: meta.cacheHitTokens ?? 0,\n cacheMissTokens: meta.cacheMissTokens ?? 0,\n totalCompletionTokens: meta.totalCompletionTokens ?? 0,\n },\n },\n t.id,\n );\n } catch {\n // unreadable jsonl — skip re-emit\n }\n }\n }\n return;\n }\n if (msg.cmd === \"jobs_list\") {\n emitJobs();\n return;\n }\n if (msg.cmd === \"jobs_stop\") {\n void stopJob(msg.jobId).finally(() => emitJobs());\n return;\n }\n if (msg.cmd === \"jobs_stop_all\") {\n void stopAllJobs().finally(() => emitJobs());\n return;\n }\n\n const tab = msg.tabId ? tabs.get(msg.tabId) : first;\n if (!tab) {\n // No tabId on the emit ⇒ the renderer's per-tab router drops it\n // silently. Surface to stderr instead so it's at least visible\n // when the desktop is launched from a terminal.\n process.stderr.write(\n `rpc dispatch: unknown tabId=${msg.tabId} for cmd=${msg.cmd} — dropping\\n`,\n );\n return;\n }\n\n if (msg.cmd === \"abort\") {\n abortTurn(tab, { discardCurrentTurn: true });\n cancelPendingGates(tab);\n return;\n }\n if (msg.cmd === \"tab_close\") {\n void closeTab(tab);\n return;\n }\n if (msg.cmd === \"mcp_specs_get\") {\n emitMcpSpecs(tab);\n return;\n }\n if (msg.cmd === \"mcp_specs_add\") {\n const spec = msg.spec.trim();\n if (!spec) {\n emit({ type: \"$error\", message: \"mcp_specs_add: spec is empty\" }, tab.id);\n return;\n }\n try {\n parseMcpSpec(spec);\n } catch (err) {\n emit({ type: \"$error\", message: `mcp_specs_add: ${(err as Error).message}` }, tab.id);\n return;\n }\n try {\n const cfg = readConfig();\n const list = cfg.mcp ?? [];\n if (!list.includes(spec)) {\n cfg.mcp = [...list, spec];\n writeConfig(cfg);\n }\n emitMcpSpecs(tab);\n void bridgeTabMcp(tab);\n } catch (err) {\n emit({ type: \"$error\", message: `mcp_specs_add: ${(err as Error).message}` }, tab.id);\n }\n return;\n }\n if (msg.cmd === \"mcp_specs_remove\") {\n try {\n const cfg = readConfig();\n const list = cfg.mcp ?? [];\n if (list.includes(msg.spec)) {\n cfg.mcp = list.filter((s) => s !== msg.spec);\n writeConfig(cfg);\n }\n tab.mcpStatuses.delete(msg.spec);\n emitMcpSpecs(tab);\n void bridgeTabMcp(tab);\n } catch (err) {\n emit({ type: \"$error\", message: `mcp_specs_remove: ${(err as Error).message}` }, tab.id);\n }\n return;\n }\n if (msg.cmd === \"skills_get\") {\n emitSkills(tab);\n return;\n }\n if (msg.cmd === \"skill_run\") {\n if (!tab.runtime) {\n emit(\n { type: \"$error\", message: \"Not configured yet — paste your DeepSeek API key first.\" },\n tab.id,\n );\n return;\n }\n try {\n const store = new SkillStore({\n projectRoot: tab.rootDir,\n customSkillPaths: loadResolvedSkillPaths(tab.rootDir),\n });\n const found = store.read(msg.name);\n if (!found) {\n emit({ type: \"$error\", message: `skill not found: ${msg.name}` }, tab.id);\n return;\n }\n const extra = msg.args?.trim() ?? \"\";\n const header = `# Skill: ${found.name}${found.description ? `\\n> ${found.description}` : \"\"}`;\n const argsLine = extra ? `\\n\\nArguments: ${extra}` : \"\";\n const payload = `${header}\\n\\n${found.body}${argsLine}`;\n void runTurn(tab, payload);\n } catch (err) {\n emit({ type: \"$error\", message: `skill_run: ${(err as Error).message}` }, tab.id);\n }\n return;\n }\n if (msg.cmd === \"session_list\") {\n emitSessions(tab);\n return;\n }\n if (msg.cmd === \"session_delete\") {\n deleteSession(msg.name);\n emitSessions(tab);\n return;\n }\n if (msg.cmd === \"session_rename\") {\n try {\n const trimmed = normalizeSessionTitle(msg.title);\n patchSessionMeta(msg.name, { summary: trimmed || undefined });\n emitSessions(tab);\n } catch (err) {\n emit(\n { type: \"$error\", message: `session_rename failed: ${(err as Error).message}` },\n tab.id,\n );\n }\n return;\n }\n if (msg.cmd === \"session_load\") {\n try {\n const records = loadSessionMessages(msg.name);\n const meta = loadSessionMeta(msg.name);\n // Only set switching flag when there's a live turn to abort —\n // otherwise the flag stays true and suppresses the first turn's events (#1217).\n if (tab.aborter) tab.switching = true;\n abortTurn(tab);\n cancelPendingGates(tab);\n tab.currentSession = msg.name;\n persistOpenTabs();\n if (tab.runtime) tab.runtime = buildRuntimeFor(tab);\n const loadedMessages = buildLoadedMessages(records);\n // Empty load is a known silent-failure path (file 0 bytes, all\n // lines malformed, etc.). Log to stderr so a terminal-launched\n // desktop reports something diagnostic, and emit a $session_empty\n // event so the UI can surface \"loaded but empty\" instead of\n // looking like the click did nothing. Issue #1179.\n if (loadedMessages.length === 0) {\n let sizeBytes = 0;\n try {\n sizeBytes = statSync(sessionPath(msg.name)).size;\n } catch {\n /* file may not exist */\n }\n process.stderr.write(\n `session_load: \"${msg.name}\" returned 0 messages (file size=${sizeBytes}B) — empty or unreadable jsonl\\n`,\n );\n emit({ type: \"$session_empty\", name: msg.name, sizeBytes }, tab.id);\n }\n emit(\n {\n type: \"$session_loaded\",\n name: msg.name,\n messages: loadedMessages,\n carryover: {\n totalCostUsd: meta.totalCostUsd ?? 0,\n cacheHitTokens: meta.cacheHitTokens ?? 0,\n cacheMissTokens: meta.cacheMissTokens ?? 0,\n totalCompletionTokens: meta.totalCompletionTokens ?? 0,\n },\n },\n tab.id,\n );\n } catch (err) {\n process.stderr.write(`session_load: \"${msg.name}\" threw — ${(err as Error).message}\\n`);\n emit({ type: \"$error\", message: `session_load failed: ${(err as Error).message}` }, tab.id);\n }\n return;\n }\n if (msg.cmd === \"new_chat\") {\n // Only set switching flag when there's a live turn to abort —\n // otherwise the flag stays true and suppresses the first turn's events (#1217).\n if (tab.aborter) tab.switching = true;\n abortTurn(tab);\n cancelPendingGates(tab);\n tab.currentSession = mintSessionFor(tab.rootDir);\n persistOpenTabs();\n if (tab.runtime) tab.runtime = buildRuntimeFor(tab);\n emitSessions(tab);\n return;\n }\n if (msg.cmd === \"settings_get\") {\n emitSettings(tab);\n return;\n }\n if (msg.cmd === \"qq_status_get\") {\n emitQQSettings(tab);\n return;\n }\n if (msg.cmd === \"settings_save\") {\n try {\n if (msg.reasoningEffort !== undefined && isReasoningEffort(msg.reasoningEffort)) {\n saveReasoningEffort(msg.reasoningEffort);\n tab.runtime?.loop.configure({ reasoningEffort: msg.reasoningEffort });\n }\n if (msg.editMode !== undefined) {\n saveEditMode(msg.editMode);\n if (tab.toolset) applyPlanMode(tab.toolset.tools, msg.editMode);\n }\n if (msg.budgetUsd !== undefined) {\n tab.budgetUsd = msg.budgetUsd ?? undefined;\n tab.runtime?.loop.setBudget(msg.budgetUsd);\n }\n if (msg.baseUrl !== undefined) saveBaseUrl(msg.baseUrl);\n if (msg.workspaceDir !== undefined) {\n void switchWorkspace(tab, msg.workspaceDir);\n return;\n }\n if (msg.editor !== undefined) saveEditor(msg.editor);\n if (msg.showSystemEvents !== undefined) saveShowSystemEvents(msg.showSystemEvents);\n if (msg.webSearchEngine !== undefined) {\n const cfg = readConfig();\n cfg.webSearchEngine = msg.webSearchEngine;\n writeConfig(cfg);\n }\n if (msg.subagentModels !== undefined) {\n saveSubagentModels(msg.subagentModels);\n emitSkills(tab);\n }\n if (msg.model !== undefined) {\n const next = msg.model.trim();\n if (next) {\n tab.currentModel = next;\n saveModel(next);\n if (tab.toolset) {\n tab.system = codeSystemPrompt(tab.rootDir, {\n hasSemanticSearch: tab.toolset.semantic.enabled,\n modelId: tab.currentModel,\n });\n if (tab.runtime) tab.runtime = buildRuntimeFor(tab);\n }\n }\n }\n emitSettings(tab);\n } catch (err) {\n emit(\n { type: \"$error\", message: `settings_save failed: ${(err as Error).message}` },\n tab.id,\n );\n }\n return;\n }\n if (msg.cmd === \"qq_config_save\") {\n try {\n saveDesktopQQSettings(\n {\n appId: msg.appId,\n appSecret: msg.appSecret,\n sandbox: msg.sandbox,\n },\n undefined,\n );\n emitQQSettings(tab);\n } catch (err) {\n emit(\n { type: \"$error\", message: `qq_config_save failed: ${(err as Error).message}` },\n tab.id,\n );\n }\n return;\n }\n if (msg.cmd === \"qq_connect\") {\n try {\n const current = loadQQConfig();\n emit(\n {\n type: \"status\",\n id: Date.now(),\n ts: new Date().toISOString(),\n turn: 0,\n text: `QQ connecting (${current.sandbox ? \"sandbox\" : \"production\"})`,\n },\n tab.id,\n );\n void startDesktopQQ(true).then(\n () => {\n emit(\n {\n type: \"status\",\n id: Date.now(),\n ts: new Date().toISOString(),\n turn: 0,\n text: `QQ connected (${current.sandbox ? \"sandbox\" : \"production\"})`,\n },\n tab.id,\n );\n emitQQSettings(tab);\n },\n (err) => {\n emit(\n { type: \"$error\", message: `qq_connect failed: ${(err as Error).message}` },\n tab.id,\n );\n emitQQSettings(tab);\n },\n );\n } catch (err) {\n emit({ type: \"$error\", message: `qq_connect failed: ${(err as Error).message}` }, tab.id);\n emitQQSettings(tab);\n }\n return;\n }\n if (msg.cmd === \"qq_disconnect\") {\n try {\n void stopDesktopQQ(true).then(\n () => {\n emit(\n {\n type: \"status\",\n id: Date.now(),\n ts: new Date().toISOString(),\n turn: 0,\n text: \"QQ disabled\",\n },\n tab.id,\n );\n emitQQSettings(tab);\n },\n (err) => {\n emit(\n { type: \"$error\", message: `qq_disconnect failed: ${(err as Error).message}` },\n tab.id,\n );\n },\n );\n } catch (err) {\n emit(\n { type: \"$error\", message: `qq_disconnect failed: ${(err as Error).message}` },\n tab.id,\n );\n }\n return;\n }\n if (msg.cmd === \"mention_query\") {\n const nonce = msg.nonce;\n const query = msg.query;\n const parsed = parseAtQuery(query);\n // Empty query → list workspace root's top-level entries (tree\n // style). Without this, bare `@` floods with all 5000 files; the\n // TUI's @+Tab pattern already shows the tree top.\n const treeWalk = parsed.trailingSlash || query.length === 0;\n if (treeWalk) {\n void listDirectory(tab.rootDir, parsed.dir)\n .then((entries) => {\n const results = entries.map((e) => (e.isDir ? `${e.path}/` : e.path));\n emit({ type: \"$mention_results\", nonce, query, results }, tab.id);\n })\n .catch((err) => {\n emit(\n { type: \"$error\", message: `mention_query (dir) failed: ${(err as Error).message}` },\n tab.id,\n );\n emit({ type: \"$mention_results\", nonce, query, results: [] }, tab.id);\n });\n return;\n }\n const wantSymbols = query.length >= 2 && !query.includes(\"/\");\n void (async () => {\n try {\n const files = await getFileIndexFor(tab);\n const fileResults = rankPickerCandidates(files, query, {\n limit: wantSymbols ? 19 : 25,\n recentlyUsed: tab.recentMentions,\n });\n let symResults: string[] = [];\n if (wantSymbols) {\n const syms = await getSymbolIndexFor(tab);\n symResults = rankSymbols(syms, query, 6);\n }\n emit(\n { type: \"$mention_results\", nonce, query, results: [...symResults, ...fileResults] },\n tab.id,\n );\n } catch (err) {\n emit(\n { type: \"$error\", message: `mention_query failed: ${(err as Error).message}` },\n tab.id,\n );\n emit({ type: \"$mention_results\", nonce, query, results: [] }, tab.id);\n }\n })();\n return;\n }\n if (msg.cmd === \"mention_picked\") {\n pushMentionRecent(tab, msg.path);\n return;\n }\n if (msg.cmd === \"mention_preview\") {\n const nonce = msg.nonce;\n const rel = msg.path;\n const abs = isAbsolute(rel) ? rel : join(tab.rootDir, rel);\n const safeAbs = resolve(abs);\n const safeRoot = resolve(tab.rootDir);\n if (!safeAbs.startsWith(safeRoot)) {\n emit({ type: \"$mention_preview\", nonce, path: rel, head: \"\", totalLines: 0 }, tab.id);\n return;\n }\n void readFile(safeAbs, \"utf8\")\n .then((text) => {\n const lines = text.split(/\\r?\\n/);\n if (lines.length > 0 && lines[lines.length - 1] === \"\") lines.pop();\n const head = lines.slice(0, 12).join(\"\\n\");\n emit(\n { type: \"$mention_preview\", nonce, path: rel, head, totalLines: lines.length },\n tab.id,\n );\n })\n .catch(() => {\n emit({ type: \"$mention_preview\", nonce, path: rel, head: \"\", totalLines: 0 }, tab.id);\n });\n return;\n }\n if (msg.cmd === \"compact_history\") {\n if (!tab.runtime) return;\n void tab.runtime.loop\n .compactHistory()\n .then(() => emitCtxBreakdown(tab))\n .catch((err: Error) => {\n emit({ type: \"$error\", message: `/compact failed: ${err.message}` }, tab.id);\n });\n return;\n }\n if (msg.cmd === \"retry\") {\n if (!tab.runtime) return;\n const prev = tab.runtime.loop.retryLastUser();\n if (prev) {\n emit({ type: \"$retry_result\", text: prev }, tab.id);\n }\n return;\n }\n if (msg.cmd === \"btw\") {\n if (!tab.runtime) return;\n const question = msg.text.trim();\n if (!question) return;\n void (async () => {\n try {\n const reply = await tab.runtime!.loop.client.chat({\n model: tab.currentModel,\n messages: [\n {\n role: \"system\",\n content:\n \"You are answering a side question that is unrelated to the current coding conversation. Answer concisely (1-3 sentences) in plain prose. Do not call tools, do not ask clarifying questions, and do not reference any prior turns.\",\n },\n { role: \"user\", content: question },\n ],\n });\n const answer =\n (typeof reply.content === \"string\" ? reply.content.trim() : \"\") || \"(no answer)\";\n emit({ type: \"$btw_result\", question, answer }, tab.id);\n } catch (err) {\n emit({ type: \"$error\", message: `/btw failed: ${(err as Error).message}` }, tab.id);\n }\n })();\n return;\n }\n if (msg.cmd === \"user_input\") {\n if (!tab.runtime) {\n emit(\n { type: \"$error\", message: \"Not configured yet — paste your DeepSeek API key first.\" },\n tab.id,\n );\n return;\n }\n void runTurn(tab, msg.text);\n }\n });\n\n await new Promise<void>((resolve) => {\n rl.on(\"close\", () => {\n void gracefulShutdown();\n resolve();\n });\n });\n}\n","/** GUI launches inherit OS-level env, not the user's interactive-shell env (#1252).\n * Probe `$SHELL -ilc` once at startup so nvm/asdf/fnm/volta/mise injected PATH entries survive. */\n\nimport { spawnSync } from \"node:child_process\";\n\nlet cached: { value: string | null } | undefined;\n\n/** Returns the user's interactive-shell PATH on macOS/Linux, null on Windows or on error. Cached. */\nexport function resolveLoginShellPath(opts: { timeoutMs?: number } = {}): string | null {\n if (cached !== undefined) return cached.value;\n cached = { value: null };\n if (process.platform === \"win32\") return null;\n\n const shell = process.env.SHELL || \"/bin/bash\";\n // -i forces zsh/bash to source rc files; -l also sources profile. The literal\n // `printf '__REASONIX_PATH__=%s\\\\n'` framing protects us from rc files that\n // print banners / completion notices on every interactive shell.\n const marker = \"__REASONIX_PATH__=\";\n try {\n const result = spawnSync(shell, [\"-ilc\", `printf '${marker}%s\\\\n' \"$PATH\"`], {\n encoding: \"utf8\",\n timeout: opts.timeoutMs ?? 2000,\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n });\n if (result.status !== 0 && result.signal === null) return null;\n const stdout = result.stdout ?? \"\";\n const idx = stdout.lastIndexOf(marker);\n if (idx < 0) return null;\n const tail = stdout.slice(idx + marker.length);\n const newline = tail.indexOf(\"\\n\");\n const path = (newline >= 0 ? tail.slice(0, newline) : tail).trim();\n if (!path || !path.includes(\"/\")) return null;\n cached.value = path;\n return path;\n } catch {\n return null;\n }\n}\n\n/** Prepend missing login-shell PATH entries onto `process.env.PATH`. Idempotent. */\nexport function augmentProcessPath(): { added: string[] } {\n const loginPath = resolveLoginShellPath();\n if (!loginPath) return { added: [] };\n const current = process.env.PATH ?? \"\";\n const seen = new Set(\n current\n .split(\":\")\n .map((s) => s.trim())\n .filter(Boolean),\n );\n const additions: string[] = [];\n for (const entry of loginPath.split(\":\")) {\n const t = entry.trim();\n if (!t || seen.has(t)) continue;\n seen.add(t);\n additions.push(t);\n }\n if (additions.length === 0) return { added: [] };\n process.env.PATH = additions.concat(current ? [current] : []).join(\":\");\n return { added: additions };\n}\n\n/** Test-only — clear the resolved-PATH cache so a fresh `resolveLoginShellPath()` re-probes. */\nexport function resetLoginShellPathCache(): void {\n cached = undefined;\n}\n","import { type LoadedQQConfig, type QQBotConfig, loadQQConfig, saveQQConfig } from \"../config.js\";\nimport { describeQQAccess } from \"../qq/access.js\";\n\nexport interface DesktopQQSettingsState extends Omit<LoadedQQConfig, \"sandbox\" | \"enabled\"> {\n sandbox: boolean;\n enabled: boolean;\n configured: boolean;\n runtimeState: \"disconnected\" | \"connecting\" | \"connected\" | \"failed\";\n lastError?: string;\n appIdPreview?: string;\n access: string;\n}\n\nexport interface DesktopQQSettingsPatch {\n appId?: string;\n appSecret?: string;\n sandbox: boolean;\n}\n\nfunction trimOptional(value: string | undefined): string | undefined {\n const trimmed = value?.trim();\n return trimmed ? trimmed : undefined;\n}\n\nfunction toPreview(appId: string | undefined): string | undefined {\n if (!appId) return undefined;\n return appId.length > 6 ? `${appId.slice(0, 6)}...` : appId;\n}\n\nfunction toAccess(config: QQBotConfig | LoadedQQConfig): string {\n return describeQQAccess({\n ownerOpenId: config.ownerOpenId,\n allowlist: config.allowlist,\n });\n}\n\nexport function loadDesktopQQState(path?: string): DesktopQQSettingsState {\n const config = loadQQConfig(path);\n const configured = Boolean(config.appId && config.appSecret);\n return {\n ...config,\n sandbox: config.sandbox ?? false,\n enabled: config.enabled === true,\n configured,\n runtimeState: \"disconnected\",\n appIdPreview: toPreview(config.appId),\n access: toAccess(config),\n };\n}\n\nexport function saveDesktopQQSettings(\n patch: DesktopQQSettingsPatch,\n path?: string,\n): DesktopQQSettingsState {\n const existing = loadQQConfig(path);\n saveQQConfig(\n {\n ...existing,\n appId: trimOptional(patch.appId),\n appSecret: trimOptional(patch.appSecret),\n sandbox: patch.sandbox,\n },\n path,\n );\n return loadDesktopQQState(path);\n}\n\nexport function setDesktopQQEnabled(enabled: boolean, path?: string): DesktopQQSettingsState {\n const existing = loadQQConfig(path);\n if (enabled && !(existing.appId && existing.appSecret)) {\n throw new Error(\"QQ App ID and App Secret are required.\");\n }\n saveQQConfig({ ...existing, enabled }, path);\n return loadDesktopQQState(path);\n}\n","export type QQPendingInteraction = {\n gateId: number;\n kind: string;\n payload: unknown;\n};\n\nexport type QQTurnRoutingState = {\n replyTabs: Set<string>;\n pendingByTab: Map<string, QQPendingInteraction>;\n};\n\nexport function createQQTurnRoutingState(): QQTurnRoutingState {\n return {\n replyTabs: new Set<string>(),\n pendingByTab: new Map<string, QQPendingInteraction>(),\n };\n}\n\nexport function markQQTurnStarted(state: QQTurnRoutingState, tabId: string): void {\n state.replyTabs.add(tabId);\n}\n\nexport function markQQTurnFinished(state: QQTurnRoutingState, tabId: string): void {\n state.replyTabs.delete(tabId);\n state.pendingByTab.delete(tabId);\n}\n\nexport function shouldRouteQQForTab(state: QQTurnRoutingState, tabId: string): boolean {\n return state.replyTabs.has(tabId);\n}\n\nexport function setQQPendingInteraction(\n state: QQTurnRoutingState,\n tabId: string,\n gateId: number,\n kind: string,\n payload: unknown,\n): void {\n if (!shouldRouteQQForTab(state, tabId)) return;\n state.pendingByTab.set(tabId, { gateId, kind, payload });\n}\n\nexport function takeQQPendingInteraction(\n state: QQTurnRoutingState,\n tabId: string,\n): QQPendingInteraction | null {\n const hit = state.pendingByTab.get(tabId);\n if (!hit) return null;\n state.pendingByTab.delete(tabId);\n return hit;\n}\n\nexport function clearQQTurnRouting(state: QQTurnRoutingState): void {\n state.replyTabs.clear();\n state.pendingByTab.clear();\n}\n"],"mappings":"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","names":["opts","tab","trimmed","resolve"]}
|