reasonix 0.41.0 → 0.44.0-rc.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (207) hide show
  1. package/README.md +73 -12
  2. package/README.zh-CN.md +35 -7
  3. package/dashboard/app.css +225 -4
  4. package/dashboard/dist/app.js +6538 -6082
  5. package/dashboard/dist/app.js.map +1 -1
  6. package/data/deepseek-tokenizer.json.gz +0 -0
  7. package/dist/cli/{acp-64VQZLDJ.js → acp-TYZ2CTDL.js} +40 -37
  8. package/dist/cli/acp-TYZ2CTDL.js.map +1 -0
  9. package/dist/cli/chat-TH7VNNCJ.js +51 -0
  10. package/dist/cli/{chunk-E46ECXJD.js → chunk-2425HK6U.js} +2 -1
  11. package/dist/cli/{chunk-E46ECXJD.js.map → chunk-2425HK6U.js.map} +1 -1
  12. package/dist/cli/chunk-25T6CVUP.js +172 -0
  13. package/dist/cli/chunk-25T6CVUP.js.map +1 -0
  14. package/dist/cli/{chunk-3Q3C4W66.js → chunk-2UQP6H6T.js} +2 -1
  15. package/dist/cli/{chunk-3Q3C4W66.js.map → chunk-2UQP6H6T.js.map} +1 -1
  16. package/dist/cli/{chunk-SXLJBFIV.js → chunk-2V6EAEUW.js} +99 -31
  17. package/dist/cli/chunk-2V6EAEUW.js.map +1 -0
  18. package/dist/cli/{chunk-4H3ZRJ2U.js → chunk-4CTDEJUF.js} +4 -3
  19. package/dist/cli/{chunk-4H3ZRJ2U.js.map → chunk-4CTDEJUF.js.map} +1 -1
  20. package/dist/cli/{chunk-7VFNPMKG.js → chunk-4QUNBQQ2.js} +3 -2
  21. package/dist/cli/{chunk-7VFNPMKG.js.map → chunk-4QUNBQQ2.js.map} +1 -1
  22. package/dist/cli/chunk-5QCB62C4.js +25319 -0
  23. package/dist/cli/chunk-5QCB62C4.js.map +1 -0
  24. package/dist/cli/chunk-6OWJV3YW.js +390 -0
  25. package/dist/cli/chunk-6OWJV3YW.js.map +1 -0
  26. package/dist/cli/{chunk-YJFKFTAL.js → chunk-6PBZN4VI.js} +15 -3
  27. package/dist/cli/chunk-6PBZN4VI.js.map +1 -0
  28. package/dist/cli/{chunk-WE3YZULK.js → chunk-7CIGMZT3.js} +3 -2
  29. package/dist/cli/{chunk-WE3YZULK.js.map → chunk-7CIGMZT3.js.map} +1 -1
  30. package/dist/cli/{chunk-LTXADNCO.js → chunk-7UCMM425.js} +8 -3
  31. package/dist/cli/chunk-7UCMM425.js.map +1 -0
  32. package/dist/cli/{chunk-UV7XJUJH.js → chunk-AB2RED3C.js} +16 -9
  33. package/dist/cli/{chunk-UV7XJUJH.js.map → chunk-AB2RED3C.js.map} +1 -1
  34. package/dist/cli/chunk-AVFXO2EZ.js +2996 -0
  35. package/dist/cli/chunk-AVFXO2EZ.js.map +1 -0
  36. package/dist/cli/{chunk-7SPOFTMT.js → chunk-C53JQES5.js} +4 -3
  37. package/dist/cli/{chunk-7SPOFTMT.js.map → chunk-C53JQES5.js.map} +1 -1
  38. package/dist/cli/{chunk-MHGPBJ2T.js → chunk-CGDR2ELH.js} +131 -34
  39. package/dist/cli/chunk-CGDR2ELH.js.map +1 -0
  40. package/dist/cli/{chunk-4DCHFFEY.js → chunk-CWZKQ5FE.js} +8 -4
  41. package/dist/cli/chunk-CWZKQ5FE.js.map +1 -0
  42. package/dist/cli/chunk-FEZK652I.js +3644 -0
  43. package/dist/cli/chunk-FEZK652I.js.map +1 -0
  44. package/dist/cli/{chunk-A7VHMMDE.js → chunk-HNXDZGC6.js} +114 -5
  45. package/dist/cli/chunk-HNXDZGC6.js.map +1 -0
  46. package/dist/cli/{chunk-FWGEHRB7.js → chunk-J5XJHLWM.js} +2 -1
  47. package/dist/cli/{chunk-FWGEHRB7.js.map → chunk-J5XJHLWM.js.map} +1 -1
  48. package/dist/cli/{chunk-Y5XNV3NX.js → chunk-JMBMLOBP.js} +2 -1
  49. package/dist/cli/{chunk-Y5XNV3NX.js.map → chunk-JMBMLOBP.js.map} +1 -1
  50. package/dist/cli/{chunk-ARF3N2SY.js → chunk-JNAQYELD.js} +17 -8
  51. package/dist/cli/{chunk-ARF3N2SY.js.map → chunk-JNAQYELD.js.map} +1 -1
  52. package/dist/cli/{chunk-AT6GGIBV.js → chunk-KGBG6M2X.js} +25 -18
  53. package/dist/cli/chunk-KGBG6M2X.js.map +1 -0
  54. package/dist/cli/{chunk-A3LL4XDV.js → chunk-KLQTAZIY.js} +69 -5
  55. package/dist/cli/chunk-KLQTAZIY.js.map +1 -0
  56. package/dist/cli/{chunk-KZYLMMU5.js → chunk-KM465GST.js} +13 -12
  57. package/dist/cli/{chunk-KZYLMMU5.js.map → chunk-KM465GST.js.map} +1 -1
  58. package/dist/cli/{chunk-2CXPDAWX.js → chunk-LIR2HBQH.js} +3 -2
  59. package/dist/cli/{chunk-2CXPDAWX.js.map → chunk-LIR2HBQH.js.map} +1 -1
  60. package/dist/cli/{chunk-RAUPWSYA.js → chunk-MJ6W5UN3.js} +3 -2
  61. package/dist/cli/{chunk-RAUPWSYA.js.map → chunk-MJ6W5UN3.js.map} +1 -1
  62. package/dist/cli/{chunk-4W2CICFQ.js → chunk-MRHHQJAQ.js} +72 -60
  63. package/dist/cli/chunk-MRHHQJAQ.js.map +1 -0
  64. package/dist/cli/{chunk-BOFL3T45.js → chunk-NVURFF27.js} +23 -11
  65. package/dist/cli/chunk-NVURFF27.js.map +1 -0
  66. package/dist/cli/chunk-OPFUUYHL.js +11645 -0
  67. package/dist/cli/chunk-OPFUUYHL.js.map +1 -0
  68. package/dist/cli/{chunk-FM57FNPJ.js → chunk-PLHAZOLZ.js} +2 -1
  69. package/dist/cli/{chunk-FM57FNPJ.js.map → chunk-PLHAZOLZ.js.map} +1 -1
  70. package/dist/cli/{chunk-ZTLZO42A.js → chunk-R3CTO2HM.js} +3 -2
  71. package/dist/cli/{chunk-ZTLZO42A.js.map → chunk-R3CTO2HM.js.map} +1 -1
  72. package/dist/cli/{chunk-BYZGO3BX.js → chunk-RDRC3XDT.js} +145 -39
  73. package/dist/cli/chunk-RDRC3XDT.js.map +1 -0
  74. package/dist/cli/chunk-S4XVGLRW.js +499 -0
  75. package/dist/cli/chunk-S4XVGLRW.js.map +1 -0
  76. package/dist/cli/{chunk-WJ3YX4PZ.js → chunk-SZ5XES2N.js} +3 -2
  77. package/dist/cli/{chunk-WJ3YX4PZ.js.map → chunk-SZ5XES2N.js.map} +1 -1
  78. package/dist/cli/{chunk-CD4SCQL4.js → chunk-TEUDEGX2.js} +64 -10
  79. package/dist/cli/chunk-TEUDEGX2.js.map +1 -0
  80. package/dist/cli/chunk-TKVXTQ3T.js +96 -0
  81. package/dist/cli/chunk-TKVXTQ3T.js.map +1 -0
  82. package/dist/cli/chunk-TUK7OWJA.js +51 -0
  83. package/dist/cli/chunk-TXJMRPIL.js +54 -0
  84. package/dist/cli/{chunk-L7W3HJZQ.js.map → chunk-TXJMRPIL.js.map} +1 -1
  85. package/dist/cli/{chunk-H4OLWRSX.js → chunk-V26WPN3J.js} +11 -7
  86. package/dist/cli/chunk-V26WPN3J.js.map +1 -0
  87. package/dist/cli/{chunk-VFG4GIT3.js → chunk-WK3UFQY3.js} +3 -2
  88. package/dist/cli/{chunk-VFG4GIT3.js.map → chunk-WK3UFQY3.js.map} +1 -1
  89. package/dist/cli/chunk-X53B3JIX.js +34320 -0
  90. package/dist/cli/chunk-X53B3JIX.js.map +1 -0
  91. package/dist/cli/{chunk-SOZE7V7V.js → chunk-XJXDHAES.js} +3 -2
  92. package/dist/cli/{chunk-SOZE7V7V.js.map → chunk-XJXDHAES.js.map} +1 -1
  93. package/dist/cli/{chunk-CFY2XLY6.js → chunk-XSU4QVFW.js} +7 -85
  94. package/dist/cli/chunk-XSU4QVFW.js.map +1 -0
  95. package/dist/cli/{chunk-CRPQUBP6.js → chunk-XXC2BYTV.js} +2 -1
  96. package/dist/cli/{chunk-CRPQUBP6.js.map → chunk-XXC2BYTV.js.map} +1 -1
  97. package/dist/cli/chunk-Z4S7EYXG.js +63813 -0
  98. package/dist/cli/chunk-Z4S7EYXG.js.map +1 -0
  99. package/dist/cli/chunk-ZZM6QJ4W.js +109 -0
  100. package/dist/cli/chunk-ZZM6QJ4W.js.map +1 -0
  101. package/dist/cli/{chunk-ORM6PK57.js → chunk-ZZYBBX5N.js} +14 -5
  102. package/dist/cli/chunk-ZZYBBX5N.js.map +1 -0
  103. package/dist/cli/code-PSVJ3KEN.js +166 -0
  104. package/dist/cli/code-PSVJ3KEN.js.map +1 -0
  105. package/dist/cli/{commands-QY7MSQG7.js → commands-OCU42XG4.js} +7 -5
  106. package/dist/cli/{commands-QY7MSQG7.js.map → commands-OCU42XG4.js.map} +1 -1
  107. package/dist/cli/{commit-BRCQ3OQO.js → commit-XCQIQCYG.js} +7 -4
  108. package/dist/cli/{commit-BRCQ3OQO.js.map → commit-XCQIQCYG.js.map} +1 -1
  109. package/dist/cli/{desktop-ZTMHQR2Y.js → desktop-KWGR4BNE.js} +327 -98
  110. package/dist/cli/desktop-KWGR4BNE.js.map +1 -0
  111. package/dist/cli/devtools-HW3WDT3Q.js +91 -0
  112. package/dist/cli/devtools-HW3WDT3Q.js.map +1 -0
  113. package/dist/cli/diff-NHANTNC3.js +165 -0
  114. package/dist/cli/{diff-YASCB7PU.js.map → diff-NHANTNC3.js.map} +1 -1
  115. package/dist/cli/doctor-CC5CLOGG.js +27 -0
  116. package/dist/cli/{events-2AJTXR7I.js → events-XEFAD5VX.js} +6 -4
  117. package/dist/cli/{events-2AJTXR7I.js.map → events-XEFAD5VX.js.map} +1 -1
  118. package/dist/cli/index.js +3266 -152
  119. package/dist/cli/index.js.map +1 -1
  120. package/dist/cli/{mcp-YMWBLRR7.js → mcp-MPVGBBJF.js} +6 -4
  121. package/dist/cli/{mcp-YMWBLRR7.js.map → mcp-MPVGBBJF.js.map} +1 -1
  122. package/dist/cli/{mcp-browse-XLDUE6SB.js → mcp-browse-4XOTC3FJ.js} +32 -21
  123. package/dist/cli/{mcp-browse-XLDUE6SB.js.map → mcp-browse-4XOTC3FJ.js.map} +1 -1
  124. package/dist/cli/{mcp-inspect-H4D2HSJP.js → mcp-inspect-CEMGKKAH.js} +18 -10
  125. package/dist/cli/mcp-inspect-CEMGKKAH.js.map +1 -0
  126. package/dist/cli/package.json +3 -0
  127. package/dist/cli/prompt-2D7ID24X.js +16 -0
  128. package/dist/cli/{prune-sessions-4N3BVST2.js → prune-sessions-3RWUBYRS.js} +4 -2
  129. package/dist/cli/{prune-sessions-4N3BVST2.js.map → prune-sessions-3RWUBYRS.js.map} +1 -1
  130. package/dist/cli/{replay-3GTWM75X.js → replay-SR44E6RS.js} +42 -30
  131. package/dist/cli/{replay-3GTWM75X.js.map → replay-SR44E6RS.js.map} +1 -1
  132. package/dist/cli/{run-BLZPTRDX.js → run-MDGL27WL.js} +42 -40
  133. package/dist/cli/run-MDGL27WL.js.map +1 -0
  134. package/dist/cli/{server-DRFPXXSH.js → server-27ARQXIZ.js} +95 -55
  135. package/dist/cli/server-27ARQXIZ.js.map +1 -0
  136. package/dist/cli/{sessions-BOWFPTXT.js → sessions-CKQXCYGP.js} +25 -22
  137. package/dist/cli/sessions-CKQXCYGP.js.map +1 -0
  138. package/dist/cli/setup-TPAGSVXO.js +618 -0
  139. package/dist/cli/setup-TPAGSVXO.js.map +1 -0
  140. package/dist/cli/stats-DPUBZNVX.js +16 -0
  141. package/dist/cli/update-6ITLPRDV.js +15 -0
  142. package/dist/cli/version-2X3BHVVK.js +33 -0
  143. package/dist/cli/{version-XQXYSJ5L.js.map → version-2X3BHVVK.js.map} +1 -1
  144. package/dist/index.d.ts +182 -45
  145. package/dist/index.js +1420 -546
  146. package/dist/index.js.map +1 -1
  147. package/package.json +21 -8
  148. package/dist/cli/.-3G6VX5S7.js +0 -327
  149. package/dist/cli/.-6YRPB2C7.js +0 -329
  150. package/dist/cli/.-EYSVINK3.js +0 -317
  151. package/dist/cli/acp-64VQZLDJ.js.map +0 -1
  152. package/dist/cli/chat-ZAGX52RV.js +0 -46
  153. package/dist/cli/chunk-4DCHFFEY.js.map +0 -1
  154. package/dist/cli/chunk-4W2CICFQ.js.map +0 -1
  155. package/dist/cli/chunk-5X7LZJDE.js +0 -36
  156. package/dist/cli/chunk-5X7LZJDE.js.map +0 -1
  157. package/dist/cli/chunk-65Q5HQ26.js +0 -892
  158. package/dist/cli/chunk-65Q5HQ26.js.map +0 -1
  159. package/dist/cli/chunk-A3LL4XDV.js.map +0 -1
  160. package/dist/cli/chunk-A7VHMMDE.js.map +0 -1
  161. package/dist/cli/chunk-AFFZF3MW.js +0 -36
  162. package/dist/cli/chunk-AFFZF3MW.js.map +0 -1
  163. package/dist/cli/chunk-AT6GGIBV.js.map +0 -1
  164. package/dist/cli/chunk-BOFL3T45.js.map +0 -1
  165. package/dist/cli/chunk-BYZGO3BX.js.map +0 -1
  166. package/dist/cli/chunk-CD4SCQL4.js.map +0 -1
  167. package/dist/cli/chunk-CFY2XLY6.js.map +0 -1
  168. package/dist/cli/chunk-CPOV2O73.js +0 -39
  169. package/dist/cli/chunk-CPOV2O73.js.map +0 -1
  170. package/dist/cli/chunk-DAEAAVDF.js +0 -199
  171. package/dist/cli/chunk-DAEAAVDF.js.map +0 -1
  172. package/dist/cli/chunk-F2AV2QDK.js +0 -16514
  173. package/dist/cli/chunk-F2AV2QDK.js.map +0 -1
  174. package/dist/cli/chunk-H4OLWRSX.js.map +0 -1
  175. package/dist/cli/chunk-IEA6JOIP.js +0 -5430
  176. package/dist/cli/chunk-IEA6JOIP.js.map +0 -1
  177. package/dist/cli/chunk-L7W3HJZQ.js +0 -46
  178. package/dist/cli/chunk-LN27AKV3.js +0 -26
  179. package/dist/cli/chunk-LN27AKV3.js.map +0 -1
  180. package/dist/cli/chunk-LTXADNCO.js.map +0 -1
  181. package/dist/cli/chunk-MHGPBJ2T.js.map +0 -1
  182. package/dist/cli/chunk-ORM6PK57.js.map +0 -1
  183. package/dist/cli/chunk-SXLJBFIV.js.map +0 -1
  184. package/dist/cli/chunk-YJFKFTAL.js.map +0 -1
  185. package/dist/cli/code-X3M6ENTQ.js +0 -150
  186. package/dist/cli/code-X3M6ENTQ.js.map +0 -1
  187. package/dist/cli/desktop-ZTMHQR2Y.js.map +0 -1
  188. package/dist/cli/diff-YASCB7PU.js +0 -153
  189. package/dist/cli/doctor-XCN5ETVP.js +0 -24
  190. package/dist/cli/mcp-inspect-H4D2HSJP.js.map +0 -1
  191. package/dist/cli/prompt-RSIHN62V.js +0 -14
  192. package/dist/cli/run-BLZPTRDX.js.map +0 -1
  193. package/dist/cli/server-DRFPXXSH.js.map +0 -1
  194. package/dist/cli/sessions-BOWFPTXT.js.map +0 -1
  195. package/dist/cli/setup-FQL2JJC2.js +0 -516
  196. package/dist/cli/setup-FQL2JJC2.js.map +0 -1
  197. package/dist/cli/stats-5RJCATCE.js +0 -12
  198. package/dist/cli/stats-5RJCATCE.js.map +0 -1
  199. package/dist/cli/update-GUCWB4UN.js +0 -13
  200. package/dist/cli/update-GUCWB4UN.js.map +0 -1
  201. package/dist/cli/version-XQXYSJ5L.js +0 -30
  202. /package/dist/cli/{.-3G6VX5S7.js.map → chat-TH7VNNCJ.js.map} +0 -0
  203. /package/dist/cli/{.-6YRPB2C7.js.map → chunk-TUK7OWJA.js.map} +0 -0
  204. /package/dist/cli/{.-EYSVINK3.js.map → doctor-CC5CLOGG.js.map} +0 -0
  205. /package/dist/cli/{chat-ZAGX52RV.js.map → prompt-2D7ID24X.js.map} +0 -0
  206. /package/dist/cli/{doctor-XCN5ETVP.js.map → stats-DPUBZNVX.js.map} +0 -0
  207. /package/dist/cli/{prompt-RSIHN62V.js.map → update-6ITLPRDV.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/cli/commands/setup.tsx","../../src/cli/ui/Wizard.tsx","../../node_modules/ink-text-input/source/index.tsx"],"sourcesContent":["/**\n * `reasonix setup` — re-mount the first-run wizard on demand so users\n * can reconfigure (add/remove MCP servers, switch preset) without\n * editing JSON by hand.\n *\n * Invoked both explicitly (`reasonix setup`) and implicitly (the no-args\n * entry point when `setupCompleted` is false).\n */\n\nimport { render } from \"ink\";\nimport React from \"react\";\nimport { loadApiKey, readConfig } from \"../../config.js\";\nimport { loadDotenv } from \"../../env.js\";\nimport { Wizard } from \"../ui/Wizard.js\";\n\nexport interface SetupOptions {\n /**\n * When true, bypass the API-key step even if no key is saved — useful\n * from test harnesses. Normal CLI use always pushes through the key\n * step when missing.\n */\n skipKeyStep?: boolean;\n /** Show the API-key step even when a saved/env key already exists. */\n forceKeyStep?: boolean;\n}\n\nexport async function setupCommand(opts: SetupOptions = {}): Promise<void> {\n loadDotenv();\n const existingKey = loadApiKey();\n const existing = readConfig();\n\n const { waitUntilExit, unmount } = render(\n <Wizard\n existingApiKey={existingKey}\n initial={{ preset: existing.preset, mcp: existing.mcp, theme: existing.theme }}\n forceApiKeyStep={opts.forceKeyStep}\n onComplete={() => {\n // Ink handles its own enter-to-exit inside the \"saved\" step; we\n // just wait for the app to exit naturally.\n }}\n onCancel={() => {\n unmount();\n }}\n />,\n { exitOnCtrlC: true, patchConsole: false },\n );\n await waitUntilExit();\n}\n","/**\n * First-run / re-configure wizard.\n *\n * Walks a new user through: language → theme → API key → preset pick → MCP\n * server pick → per-server args → save. Saved output lives in\n * `~/.reasonix/config.json` so the next `reasonix chat` starts with\n * everything already wired.\n */\n\nimport { mkdirSync, statSync } from \"node:fs\";\nimport { Box, Text, useApp, useInput } from \"ink\";\nimport TextInput from \"ink-text-input\";\n// biome-ignore lint/style/useImportType: JSX (jsx: \"react\") needs React as a value at runtime\nimport React, { useEffect, useState } from \"react\";\nimport {\n type PresetName,\n type ReasonixConfig,\n defaultConfigPath,\n isPlausibleKey,\n loadBaseUrl,\n loadTheme,\n readConfig,\n redactKey,\n resolveThemePreference,\n writeConfig,\n} from \"../../config.js\";\nimport {\n detectSystemLanguage,\n getLanguage,\n getSupportedLanguages,\n notifyLanguageChange,\n onLanguageChange,\n setLanguage,\n t,\n} from \"../../i18n/index.js\";\nimport type { LanguageCode } from \"../../i18n/types.js\";\nimport { type CatalogEntry, MCP_CATALOG } from \"../../mcp/catalog.js\";\nimport { MultiSelect, type SelectItem, SingleSelect } from \"./Select.js\";\nimport { PRESET_DESCRIPTIONS } from \"./presets.js\";\nimport { ThemeProvider, useTheme } from \"./theme/context.js\";\nimport { type ThemeName, listThemeNames } from \"./theme/tokens.js\";\n\nexport interface WizardProps {\n /** Called once the config has been saved. */\n onComplete: (cfg: ReasonixConfig) => void;\n /** Called if the user presses Esc to abort. */\n onCancel?: () => void;\n /** Skip the API-key step if a key already exists (env or config). */\n existingApiKey?: string;\n /** Force the API-key step so `reasonix setup` can replace a saved key. */\n forceApiKeyStep?: boolean;\n /** Verifies the submitted key before the wizard can continue. */\n validateApiKey?: (apiKey: string) => Promise<ApiKeyValidationResult>;\n /** Pre-fill selections when re-running (reconfigure flow). */\n initial?: {\n preset?: PresetName;\n mcp?: string[];\n theme?: ThemeName | \"auto\";\n };\n}\n\nexport type ApiKeyValidationResult =\n | { ok: true }\n | { ok: false; reason: \"rejected\" | \"failed\"; message?: string };\n\ntype Step = \"language\" | \"theme\" | \"apiKey\" | \"preset\" | \"mcp\" | \"mcpArgs\" | \"review\" | \"saved\";\n\ninterface WizardData {\n language: LanguageCode;\n theme: ThemeName;\n apiKey: string;\n preset: PresetName;\n selectedCatalog: string[];\n catalogArgs: Record<string, string>;\n}\n\nconst CATALOG_BY_NAME = new Map(MCP_CATALOG.map((e) => [e.name, e]));\n\nconst LANGUAGE_LABELS: Record<LanguageCode, string> = {\n EN: \"English\",\n \"zh-CN\": \"简体中文\",\n};\n\nexport function Wizard({\n onComplete,\n onCancel,\n existingApiKey,\n forceApiKeyStep = false,\n validateApiKey = validateDeepSeekApiKey,\n initial,\n}: WizardProps) {\n const { exit } = useApp();\n const [, setLanguageVersion] = useState(0);\n useEffect(() => onLanguageChange(() => setLanguageVersion((v) => v + 1)), []);\n\n const [previewTheme, setPreviewTheme] = useState<ThemeName>(() =>\n resolveThemePreference(initial?.theme ?? loadTheme(), process.env.REASONIX_THEME),\n );\n\n const [step, setStep] = useState<Step>(\"language\");\n const [data, setData] = useState<WizardData>(() => ({\n language: getLanguage(),\n theme: resolveThemePreference(initial?.theme ?? loadTheme(), process.env.REASONIX_THEME),\n apiKey: existingApiKey ?? \"\",\n preset: initial?.preset ?? \"auto\",\n selectedCatalog: deriveInitialCatalog(initial?.mcp ?? []),\n catalogArgs: {},\n }));\n const [error, setError] = useState<string | null>(null);\n\n useInput((_input, key) => {\n if (key.escape && step !== \"saved\" && onCancel) onCancel();\n });\n\n const content = (() => {\n if (step === \"language\") {\n return (\n <LanguageStep\n initialValue={data.language}\n onSubmit={(lang) => {\n setLanguage(lang);\n notifyLanguageChange();\n setData((d) => ({ ...d, language: lang }));\n setStep(\"theme\");\n }}\n />\n );\n }\n\n if (step === \"theme\") {\n return (\n <ThemeStep\n initialValue={data.theme}\n onPreview={setPreviewTheme}\n onSubmit={(theme) => {\n setData((d) => ({ ...d, theme }));\n setStep(existingApiKey && !forceApiKeyStep ? \"preset\" : \"apiKey\");\n }}\n />\n );\n }\n\n if (step === \"apiKey\") {\n return (\n <ApiKeyStep\n initialValue={data.apiKey}\n validateApiKey={validateApiKey}\n onSubmit={(key) => {\n setData((d) => ({ ...d, apiKey: key }));\n setError(null);\n setStep(\"preset\");\n }}\n error={error}\n onError={setError}\n />\n );\n }\n\n if (step === \"preset\") {\n return (\n <StepFrame title={t(\"wizard.presetTitle\")} step={1} total={3}>\n <SingleSelect<PresetName>\n items={presetItems()}\n initialValue={data.preset}\n onSubmit={(preset) => {\n setData((d) => ({ ...d, preset }));\n setStep(\"mcp\");\n }}\n />\n <Box marginTop={1}>\n <Text dimColor>{t(\"wizard.selectFooter\")}</Text>\n </Box>\n </StepFrame>\n );\n }\n\n if (step === \"mcp\") {\n return (\n <StepFrame title={t(\"wizard.mcpTitle\")} step={2} total={3}>\n <MultiSelect\n items={mcpItems()}\n initialSelected={data.selectedCatalog}\n onSubmit={(selected) => {\n setData((d) => ({ ...d, selectedCatalog: selected }));\n const needsArgs = selected.some((name) => CATALOG_BY_NAME.get(name)?.userArgs);\n setStep(needsArgs ? \"mcpArgs\" : \"review\");\n }}\n footer={t(\"wizard.mcpFooterMulti\")}\n />\n </StepFrame>\n );\n }\n\n if (step === \"mcpArgs\") {\n const pending = data.selectedCatalog.filter((name) => {\n const entry = CATALOG_BY_NAME.get(name);\n return entry?.userArgs && !data.catalogArgs[name];\n });\n if (pending.length === 0) {\n setStep(\"review\");\n return null;\n }\n const currentName = pending[0]!;\n const entry = CATALOG_BY_NAME.get(currentName)!;\n return (\n <McpArgsStep\n entry={entry}\n error={error}\n onSubmit={(value) => {\n setData((d) => ({\n ...d,\n catalogArgs: { ...d.catalogArgs, [currentName]: value },\n }));\n setError(null);\n }}\n onError={setError}\n />\n );\n }\n\n if (step === \"review\") {\n const specs = data.selectedCatalog.map((name) => buildSpec(name, data.catalogArgs));\n return (\n <StepFrame title={t(\"wizard.reviewTitle\")} step={3} total={3}>\n <Box flexDirection=\"column\">\n <SummaryLine\n label={t(\"wizard.reviewLabelLanguage\")}\n value={LANGUAGE_LABELS[data.language]}\n />\n <SummaryLine label={t(\"wizard.reviewLabelApiKey\")} value={redactKey(data.apiKey)} />\n <SummaryLine label={t(\"wizard.reviewLabelTheme\")} value={data.theme} />\n <SummaryLine label={t(\"wizard.reviewLabelPreset\")} value={data.preset} />\n <SummaryLine\n label={t(\"wizard.reviewLabelMcp\")}\n value={\n specs.length === 0\n ? t(\"wizard.reviewMcpNone\")\n : t(\"wizard.reviewMcpServers\", { count: specs.length })\n }\n />\n {specs.map((spec, i) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: review-only render, order fixed\n <Box key={i} paddingLeft={14}>\n <Text dimColor>· {spec}</Text>\n </Box>\n ))}\n <Box marginTop={1}>\n <Text>{t(\"wizard.reviewSavesTo\", { path: defaultConfigPath() })}</Text>\n </Box>\n {error ? (\n <Box marginTop={1}>\n <Text color=\"red\">{error}</Text>\n </Box>\n ) : null}\n <Box marginTop={1}>\n <Text dimColor>{t(\"wizard.reviewFooter\")}</Text>\n </Box>\n </Box>\n <ReviewConfirm\n onConfirm={() => {\n try {\n const specsNow = data.selectedCatalog.map((name) =>\n buildSpec(name, data.catalogArgs),\n );\n const prev = readConfig();\n const next: ReasonixConfig = {\n ...prev,\n apiKey: data.apiKey,\n preset: data.preset,\n theme: data.theme,\n mcp: specsNow,\n setupCompleted: true,\n };\n writeConfig(next);\n setStep(\"saved\");\n onComplete(next);\n } catch (e) {\n setError(t(\"wizard.reviewSaveError\", { message: (e as Error).message }));\n }\n }}\n />\n </StepFrame>\n );\n }\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"green\" paddingX={1}>\n <Text bold color=\"green\">\n {t(\"wizard.savedTitle\")}\n </Text>\n <Box marginTop={1}>\n <Text>{t(\"ui.welcome\")}</Text>\n </Box>\n <Box marginTop={1}>\n <Text dimColor>{t(\"wizard.savedFooter\")}</Text>\n </Box>\n <ExitOnEnter onExit={exit} />\n </Box>\n );\n })();\n\n return <ThemeProvider name={previewTheme}>{content}</ThemeProvider>;\n}\n\nconst THEME_NAMES = listThemeNames();\n\nfunction ThemeStep({\n initialValue,\n onPreview,\n onSubmit,\n}: {\n initialValue: ThemeName;\n onPreview: (theme: ThemeName) => void;\n onSubmit: (theme: ThemeName) => void;\n}) {\n const initialIndex = Math.max(0, THEME_NAMES.indexOf(initialValue));\n const [index, setIndex] = useState(initialIndex);\n const theme = useTheme();\n\n useInput((_input, key) => {\n if (key.upArrow) {\n const next = (index - 1 + THEME_NAMES.length) % THEME_NAMES.length;\n setIndex(next);\n onPreview(THEME_NAMES[next]!);\n } else if (key.downArrow) {\n const next = (index + 1) % THEME_NAMES.length;\n setIndex(next);\n onPreview(THEME_NAMES[next]!);\n } else if (key.return) {\n onSubmit(THEME_NAMES[index]!);\n }\n });\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={theme.tone.brand} paddingX={1}>\n <Text bold color={theme.tone.brand}>\n {t(\"wizard.themeTitle\")}\n </Text>\n <Box marginTop={1}>\n <Text dimColor>{t(\"wizard.themeSubtitle\")}</Text>\n </Box>\n <Box marginTop={1} flexDirection=\"column\">\n {THEME_NAMES.map((name, i) => (\n <Box key={name}>\n <Text color={i === index ? theme.tone.brand : undefined}>\n {i === index ? \"▸ \" : \" \"}\n </Text>\n <Text bold={i === index} color={i === index ? theme.fg.strong : theme.fg.body}>\n {name}\n </Text>\n <Text color={theme.fg.meta}>{\" — \"}</Text>\n <Text color={theme.fg.meta}>{t(`wizard.themeCaption.${name}`)}</Text>\n </Box>\n ))}\n </Box>\n <Box\n marginTop={1}\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.fg.faint}\n paddingX={1}\n >\n <Text color={theme.fg.meta}>{t(\"wizard.themeSampleHeading\")}</Text>\n <Box marginTop={1}>\n <Text color={theme.tone.accent}>{\"◆ \"}</Text>\n <Text color={theme.tone.accent}>{t(\"wizard.themeSampleReasoning\")}</Text>\n </Box>\n <Box>\n <Text color={theme.tone.info}>{\"▣ \"}</Text>\n <Text color={theme.fg.body}>{\"fs.readFile(\"}</Text>\n <Text color={theme.tone.ok}>{'\"main.ts\"'}</Text>\n <Text color={theme.fg.body}>{\")\"}</Text>\n </Box>\n <Box>\n <Text color={theme.fg.meta}>~/project/main.ts:42</Text>\n </Box>\n <Box marginTop={1}>\n <Text color={theme.tone.ok}>ok</Text>\n <Text color={theme.fg.faint}>{\" · \"}</Text>\n <Text color={theme.tone.warn}>warn</Text>\n <Text color={theme.fg.faint}>{\" · \"}</Text>\n <Text color={theme.tone.err}>err</Text>\n </Box>\n </Box>\n <Box marginTop={1}>\n <Text dimColor>{t(\"wizard.themeFooter\")}</Text>\n </Box>\n </Box>\n );\n}\n\n// ---------- step components ----------\n\nfunction LanguageStep({\n initialValue,\n onSubmit,\n}: {\n initialValue: LanguageCode;\n onSubmit: (lang: LanguageCode) => void;\n}) {\n const items: SelectItem<LanguageCode>[] = getSupportedLanguages().map((code) => ({\n value: code,\n label: LANGUAGE_LABELS[code],\n hint: code === detectSystemLanguage() ? \"(detected)\" : undefined,\n }));\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"cyan\" paddingX={1}>\n <Text bold color=\"cyan\">\n {t(\"wizard.languageTitle\")}\n </Text>\n <Box marginTop={1}>\n <Text dimColor>{t(\"wizard.languageSubtitle\")}</Text>\n </Box>\n <Box marginTop={1}>\n <SingleSelect<LanguageCode>\n items={items}\n initialValue={initialValue}\n onSubmit={onSubmit}\n footer={t(\"wizard.selectFooter\")}\n />\n </Box>\n </Box>\n );\n}\n\nfunction ApiKeyStep({\n initialValue,\n validateApiKey,\n onSubmit,\n error,\n onError,\n}: {\n initialValue?: string;\n validateApiKey: (apiKey: string) => Promise<ApiKeyValidationResult>;\n onSubmit: (key: string) => void;\n error: string | null;\n onError: (e: string | null) => void;\n}) {\n const [value, setValue] = useState(\"\");\n const [checking, setChecking] = useState(false);\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"cyan\" paddingX={1}>\n <Text bold color=\"cyan\">\n {t(\"wizard.welcomeTitle\")}\n </Text>\n <Box marginTop={1}>\n <Text>{t(\"wizard.apiKeyPrompt\")}</Text>\n </Box>\n <Text dimColor>{t(\"wizard.apiKeyGetOne\")}</Text>\n <Text dimColor>{t(\"wizard.apiKeySavedLocally\", { path: defaultConfigPath() })}</Text>\n {initialValue ? (\n <Text dimColor>{t(\"wizard.apiKeyPreview\", { redacted: redactKey(initialValue) })}</Text>\n ) : null}\n <Box marginTop={1}>\n <Text bold color=\"cyan\">\n {t(\"wizard.apiKeyInputLabel\")}\n </Text>\n <TextInput\n value={value}\n onChange={setValue}\n onSubmit={(raw) => {\n const trimmed = raw.trim() || initialValue?.trim() || \"\";\n if (!isPlausibleKey(trimmed)) {\n onError(t(\"wizard.apiKeyInvalid\"));\n setValue(\"\");\n return;\n }\n setChecking(true);\n onError(null);\n void validateApiKey(trimmed).then((result) => {\n setChecking(false);\n if (!result.ok) {\n onError(\n result.reason === \"rejected\"\n ? t(\"wizard.apiKeyRejected\")\n : t(\"wizard.apiKeyCheckFailed\", { message: result.message ?? \"unknown\" }),\n );\n setValue(\"\");\n return;\n }\n onSubmit(trimmed);\n });\n }}\n mask=\"•\"\n placeholder=\"sk-...\"\n />\n </Box>\n {checking ? (\n <Box marginTop={1}>\n <Text color=\"yellow\">{t(\"wizard.apiKeyChecking\")}</Text>\n </Box>\n ) : error ? (\n <Box marginTop={1}>\n <Text color=\"red\">{error}</Text>\n </Box>\n ) : value ? (\n <Box marginTop={1}>\n <Text dimColor>{t(\"wizard.apiKeyPreview\", { redacted: redactKey(value) })}</Text>\n </Box>\n ) : null}\n </Box>\n );\n}\n\nexport async function validateDeepSeekApiKey(\n apiKey: string,\n opts: {\n baseUrl?: string;\n timeoutMs?: number;\n fetch?: typeof fetch;\n } = {},\n): Promise<ApiKeyValidationResult> {\n const fetchImpl = opts.fetch ?? globalThis.fetch.bind(globalThis);\n let baseUrl = opts.baseUrl ?? loadBaseUrl() ?? \"https://api.deepseek.com\";\n while (baseUrl.endsWith(\"/\")) baseUrl = baseUrl.slice(0, -1);\n\n const ctrl = new AbortController();\n const timer = setTimeout(() => ctrl.abort(), opts.timeoutMs ?? 10_000);\n try {\n const resp = await fetchImpl(`${baseUrl}/user/balance`, {\n method: \"GET\",\n headers: { Authorization: `Bearer ${apiKey}` },\n signal: ctrl.signal,\n });\n if (resp.ok) return { ok: true };\n if (resp.status === 401 || resp.status === 403) return { ok: false, reason: \"rejected\" };\n return { ok: false, reason: \"failed\", message: `DeepSeek ${resp.status}` };\n } catch (e) {\n return { ok: false, reason: \"failed\", message: (e as Error).message };\n } finally {\n clearTimeout(timer);\n }\n}\n\nfunction McpArgsStep({\n entry,\n error,\n onSubmit,\n onError,\n}: {\n entry: CatalogEntry;\n error: string | null;\n onSubmit: (value: string) => void;\n onError: (e: string | null) => void;\n}) {\n const [value, setValue] = useState(\"\");\n const [pendingCreate, setPendingCreate] = useState<string | null>(null);\n\n useInput((input, key) => {\n if (!pendingCreate) return;\n const ch = input.toLowerCase();\n if (ch === \"y\" || key.return) {\n try {\n mkdirSync(pendingCreate, { recursive: true });\n const created = pendingCreate;\n setPendingCreate(null);\n setValue(\"\");\n onError(null);\n onSubmit(created);\n } catch (e) {\n onError(\n t(\"wizard.mcpArgsDirCreateFailed\", {\n path: pendingCreate,\n message: (e as Error).message,\n }),\n );\n setPendingCreate(null);\n }\n } else if (ch === \"n\" || key.escape) {\n setPendingCreate(null);\n onError(null);\n }\n });\n\n if (pendingCreate) {\n return (\n <StepFrame title={t(\"wizard.mcpArgsTitle\", { name: entry.name })} step={2} total={3}>\n <Box flexDirection=\"column\">\n <Text>{t(\"wizard.mcpArgsDirMissing\", { path: pendingCreate })}</Text>\n <Box marginTop={1}>\n <Text dimColor>{t(\"wizard.mcpArgsDirCreateHint\")}</Text>\n </Box>\n {error ? (\n <Box marginTop={1}>\n <Text color=\"red\">{error}</Text>\n </Box>\n ) : null}\n </Box>\n </StepFrame>\n );\n }\n\n return (\n <StepFrame title={t(\"wizard.mcpArgsTitle\", { name: entry.name })} step={2} total={3}>\n <Box flexDirection=\"column\">\n <Text>{entry.summary}</Text>\n {entry.note ? (\n <Box marginTop={1}>\n <Text dimColor>{entry.note}</Text>\n </Box>\n ) : null}\n <Box marginTop={1}>\n <Text>{t(\"wizard.mcpArgsRequiredParam\")}</Text>\n <Text bold>{entry.userArgs}</Text>\n </Box>\n <Box marginTop={1}>\n <Text bold color=\"cyan\">\n {entry.userArgs}\n {\" › \"}\n </Text>\n <TextInput\n value={value}\n onChange={setValue}\n onSubmit={(raw) => {\n const trimmed = raw.trim();\n if (!trimmed) {\n onError(t(\"wizard.mcpArgsEmpty\", { name: entry.name }));\n return;\n }\n if (entry.name === \"filesystem\") {\n const check = checkFilesystemPath(trimmed);\n if (check.kind === \"missing\") {\n setPendingCreate(trimmed);\n return;\n }\n if (check.kind === \"not-a-dir\") {\n onError(t(\"wizard.mcpArgsNotADir\", { path: trimmed }));\n return;\n }\n }\n onSubmit(trimmed);\n setValue(\"\");\n }}\n placeholder={placeholderFor(entry)}\n />\n </Box>\n {error ? (\n <Box marginTop={1}>\n <Text color=\"red\">{error}</Text>\n </Box>\n ) : null}\n </Box>\n </StepFrame>\n );\n}\n\nfunction checkFilesystemPath(p: string): { kind: \"ok\" | \"missing\" | \"not-a-dir\" } {\n try {\n return { kind: statSync(p).isDirectory() ? \"ok\" : \"not-a-dir\" };\n } catch {\n return { kind: \"missing\" };\n }\n}\n\nfunction ReviewConfirm({ onConfirm }: { onConfirm: () => void }) {\n useInput((_i, key) => {\n if (key.return) onConfirm();\n });\n return null;\n}\n\nfunction ExitOnEnter({ onExit }: { onExit: () => void }) {\n useInput((_i, key) => {\n if (key.return) onExit();\n });\n return null;\n}\n\nfunction StepFrame({\n title,\n step,\n total,\n children,\n}: {\n title: string;\n step: number;\n total: number;\n children: React.ReactNode;\n}) {\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor=\"cyan\" paddingX={1}>\n <Box>\n <Text dimColor>{t(\"wizard.stepCounter\", { step, total })}</Text>\n <Text bold color=\"cyan\">\n {title}\n </Text>\n </Box>\n <Box marginTop={1} flexDirection=\"column\">\n {children}\n </Box>\n </Box>\n );\n}\n\nfunction SummaryLine({ label, value }: { label: string; value: string }) {\n return (\n <Box>\n <Text>{label.padEnd(12)}</Text>\n <Text bold>{value}</Text>\n </Box>\n );\n}\n\nfunction presetItems(): SelectItem<PresetName>[] {\n return ([\"auto\", \"flash\", \"pro\"] as const).map((name) => ({\n value: name as PresetName,\n label: `${name} — ${PRESET_DESCRIPTIONS[name].headline}`,\n hint: PRESET_DESCRIPTIONS[name].cost,\n }));\n}\n\nfunction mcpItems(): SelectItem<string>[] {\n return MCP_CATALOG.map((entry) => {\n const hintParts: string[] = [entry.summary];\n if (entry.userArgs) hintParts.push(t(\"wizard.mcpUserArgsHint\", { arg: entry.userArgs }));\n if (entry.note) hintParts.push(entry.note);\n return {\n value: entry.name,\n label: entry.name,\n hint: hintParts.join(\" · \"),\n };\n });\n}\n\nfunction placeholderFor(entry: CatalogEntry): string {\n if (entry.name === \"filesystem\") return \"e.g. /tmp/reasonix-sandbox\";\n if (entry.name === \"sqlite\") return \"e.g. ./notes.sqlite\";\n return entry.userArgs ?? \"\";\n}\n\nfunction deriveInitialCatalog(existingSpecs: string[]): string[] {\n const packageToName = new Map(MCP_CATALOG.map((e) => [e.package, e.name]));\n const out: string[] = [];\n for (const spec of existingSpecs) {\n for (const [pkg, name] of packageToName) {\n if (spec.includes(pkg)) {\n out.push(name);\n break;\n }\n }\n }\n return out;\n}\n\n/**\n * Build the `--mcp` spec string for a catalog entry. Same format\n * `mcpCommandFor` produces for `reasonix mcp list`, minus the leading\n * `--mcp \"...\"` wrapper — we store the inner spec directly.\n */\nexport function buildSpec(name: string, argsByName: Record<string, string>): string {\n const entry = CATALOG_BY_NAME.get(name);\n if (!entry) return name;\n const userArg = entry.userArgs ? argsByName[name] : undefined;\n const tail = userArg ? ` ${quoteIfNeeded(userArg)}` : \"\";\n return `${entry.name}=npx -y ${entry.package}${tail}`;\n}\n\nfunction quoteIfNeeded(s: string): string {\n // Escape backslashes BEFORE quotes — otherwise a trailing `\\` in the\n // input would consume the closing quote when a downstream parser\n // un-escapes the output (CodeQL js/incomplete-sanitization).\n return /\\s|\"/.test(s) ? `\"${s.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"')}\"` : s;\n}\n",null],"mappings":"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","names":["import_react","React","import_react","React","entry","React"]}
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire as __cr } from 'node:module'; if (typeof globalThis.require === 'undefined') { globalThis.require = __cr(import.meta.url); }
3
+ import {
4
+ renderDashboard,
5
+ statsCommand
6
+ } from "./chunk-CWZKQ5FE.js";
7
+ import "./chunk-R3CTO2HM.js";
8
+ import "./chunk-ZZYBBX5N.js";
9
+ import "./chunk-CGDR2ELH.js";
10
+ import "./chunk-AVFXO2EZ.js";
11
+ import "./chunk-TUK7OWJA.js";
12
+ export {
13
+ renderDashboard,
14
+ statsCommand
15
+ };
16
+ //# sourceMappingURL=stats-DPUBZNVX.js.map
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire as __cr } from 'node:module'; if (typeof globalThis.require === 'undefined') { globalThis.require = __cr(import.meta.url); }
3
+ import {
4
+ MANUAL_UPDATE_COMMANDS,
5
+ planUpdate,
6
+ updateCommand
7
+ } from "./chunk-SZ5XES2N.js";
8
+ import "./chunk-XXC2BYTV.js";
9
+ import "./chunk-TUK7OWJA.js";
10
+ export {
11
+ MANUAL_UPDATE_COMMANDS,
12
+ planUpdate,
13
+ updateCommand
14
+ };
15
+ //# sourceMappingURL=update-6ITLPRDV.js.map
@@ -0,0 +1,33 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire as __cr } from 'node:module'; if (typeof globalThis.require === 'undefined') { globalThis.require = __cr(import.meta.url); }
3
+ import "./chunk-OPFUUYHL.js";
4
+ import "./chunk-WK3UFQY3.js";
5
+ import "./chunk-C53JQES5.js";
6
+ import "./chunk-XSU4QVFW.js";
7
+ import "./chunk-JNAQYELD.js";
8
+ import "./chunk-6OWJV3YW.js";
9
+ import "./chunk-V26WPN3J.js";
10
+ import "./chunk-25T6CVUP.js";
11
+ import "./chunk-2UQP6H6T.js";
12
+ import "./chunk-RDRC3XDT.js";
13
+ import "./chunk-TEUDEGX2.js";
14
+ import "./chunk-7CIGMZT3.js";
15
+ import "./chunk-S4XVGLRW.js";
16
+ import "./chunk-6PBZN4VI.js";
17
+ import "./chunk-R3CTO2HM.js";
18
+ import "./chunk-ZZYBBX5N.js";
19
+ import "./chunk-CGDR2ELH.js";
20
+ import "./chunk-AVFXO2EZ.js";
21
+ import {
22
+ VERSION
23
+ } from "./chunk-XXC2BYTV.js";
24
+ import "./chunk-TUK7OWJA.js";
25
+
26
+ // src/cli/commands/version.ts
27
+ function versionCommand() {
28
+ console.log(`reasonix ${VERSION}`);
29
+ }
30
+ export {
31
+ versionCommand
32
+ };
33
+ //# sourceMappingURL=version-2X3BHVVK.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/commands/version.ts"],"sourcesContent":["import { VERSION } from \"../../index.js\";\n\nexport function versionCommand(): void {\n console.log(`reasonix ${VERSION}`);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAEO,SAAS,iBAAuB;AACrC,UAAQ,IAAI,YAAY,OAAO,EAAE;AACnC;","names":[]}
1
+ {"version":3,"sources":["../../src/cli/commands/version.ts"],"sourcesContent":["import { VERSION } from \"../../index.js\";\n\nexport function versionCommand(): void {\n console.log(`reasonix ${VERSION}`);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAEO,SAAS,iBAAuB;AACrC,UAAQ,IAAI,YAAY,OAAO,EAAE;AACnC;","names":[]}
package/dist/index.d.ts CHANGED
@@ -497,6 +497,8 @@ interface TruncationRepairResult {
497
497
  repaired: string;
498
498
  changed: boolean;
499
499
  notes: string[];
500
+ /** True when all repair attempts failed and the result falls back to "{}" — the original args are unrecoverable. */
501
+ fallback: boolean;
500
502
  }
501
503
  declare function repairTruncatedJson(input: string): TruncationRepairResult;
502
504
 
@@ -590,6 +592,7 @@ declare class SessionStats {
590
592
  cacheMissTokens?: number;
591
593
  lastPromptTokens?: number;
592
594
  }): void;
595
+ reset(): void;
593
596
  record(turn: number, model: string, usage: Usage): TurnStats;
594
597
  get totalCost(): number;
595
598
  get totalClaudeEquivalent(): number;
@@ -606,7 +609,9 @@ type EventRole = "assistant_delta" | "assistant_final"
606
609
  /** Pre-dispatch ping so the TUI can show a spinner during long tool awaits. */
607
610
  | "tool_start" | "tool" | "done" | "error" | "warning"
608
611
  /** Transient indicator for silent phases; UI clears on next primary event. */
609
- | "status";
612
+ | "status"
613
+ /** Mid-turn steer injected as a user utterance without aborting the current turn. */
614
+ | "steer";
610
615
  interface LoopEvent {
611
616
  turn: number;
612
617
  role: EventRole;
@@ -754,7 +759,6 @@ interface CacheFirstLoopOptions {
754
759
  prefix: ImmutablePrefix;
755
760
  tools?: ToolRegistry;
756
761
  model?: string;
757
- maxToolIters?: number;
758
762
  stream?: boolean;
759
763
  reasoningEffort?: "high" | "max";
760
764
  autoEscalate?: boolean;
@@ -784,7 +788,6 @@ declare class CacheFirstLoop {
784
788
  readonly client: DeepSeekClient;
785
789
  readonly prefix: ImmutablePrefix;
786
790
  readonly tools: ToolRegistry;
787
- readonly maxToolIters: number;
788
791
  readonly log: AppendOnlyLog;
789
792
  readonly scratch: VolatileScratch;
790
793
  readonly stats: SessionStats;
@@ -810,13 +813,20 @@ declare class CacheFirstLoop {
810
813
  private _turnAbort;
811
814
  /** Authoritative running-id set — UI cards consult this instead of trusting end-event delivery. Insert at dispatch entry, delete in finally. */
812
815
  private readonly _inflight;
816
+ /** Typeahead steer message set by the UI; step() consumes it at the next iter boundary. */
817
+ private _steer;
818
+ /** Set true when a steer was consumed this turn; cleared on next step() entry. */
819
+ private _steerConsumed;
820
+ /** UI calls this to inject a mid-turn steer message without aborting the current turn.
821
+ * New text resets steerConsumed — a fresh steer hasn't been consumed yet. */
822
+ steer(text: string | null): void;
823
+ /** True when a steer was consumed this turn (UI gate to avoid double-submit). */
824
+ get steerConsumed(): boolean;
813
825
  private _proArmedForNextTurn;
814
826
  private _escalateThisTurn;
815
827
  private readonly _turnFailures;
816
- private readonly _readOnlyLoop;
817
828
  private _turnSelfCorrected;
818
829
  private _foldedThisTurn;
819
- private _toolDispatchesThisStep;
820
830
  private context;
821
831
  /** Subscribe API so UI hooks can derive `running` from finally-guaranteed insertions. */
822
832
  get inflight(): InflightSet;
@@ -840,6 +850,13 @@ declare class CacheFirstLoop {
840
850
  archived: string | null;
841
851
  systemRebuilt: boolean;
842
852
  };
853
+ /** `/cwd` follow-through — archives the previous session, drops in-memory state, repoints sessionName, and rebuilds the system prompt against whatever the rebuilder closure now resolves (the caller is expected to have already updated the root the closure reads). */
854
+ switchWorkspace(opts: {
855
+ sessionName: string;
856
+ }): {
857
+ dropped: number;
858
+ archived: string | null;
859
+ };
843
860
  configure(opts: ReconfigurableOptions): void;
844
861
  /** `null` disables the cap; any change re-arms the 80% warning. */
845
862
  setBudget(usd: number | null): void;
@@ -856,8 +873,6 @@ declare class CacheFirstLoop {
856
873
  private modelForCurrentCall;
857
874
  /** Returns true ONLY on the tipping call — caller surfaces a one-shot warning. */
858
875
  private noteToolFailureSignal;
859
- /** Returns true ONLY on the call where the read-only streak crosses the threshold (#681). */
860
- private noteReadOnlyToolCall;
861
876
  /** A call counts as mutating when its definition reports `readOnly !== true` and any dynamic `readOnlyCheck` doesn't override that for these args. */
862
877
  private isMutating;
863
878
  private runOneToolCall;
@@ -1038,6 +1053,31 @@ interface IndexUserConfig {
1038
1053
  maxFileBytes?: number;
1039
1054
  }
1040
1055
 
1056
+ /** Plain http:// stays HTTP+SSE for back-compat; Streamable HTTP is opt-in via the `streamable+` URL prefix. */
1057
+ interface StdioMcpSpec {
1058
+ transport: "stdio";
1059
+ /** Namespace prefix applied to each registered tool, or null if anonymous. */
1060
+ name: string | null;
1061
+ /** Argv[0]. */
1062
+ command: string;
1063
+ /** Remaining argv. */
1064
+ args: string[];
1065
+ }
1066
+ interface SseMcpSpec {
1067
+ transport: "sse";
1068
+ name: string | null;
1069
+ /** Fully qualified SSE endpoint URL. */
1070
+ url: string;
1071
+ }
1072
+ interface StreamableHttpMcpSpec {
1073
+ transport: "streamable-http";
1074
+ name: string | null;
1075
+ /** Fully qualified Streamable HTTP endpoint URL (no `streamable+` prefix). */
1076
+ url: string;
1077
+ }
1078
+ type McpSpec = StdioMcpSpec | SseMcpSpec | StreamableHttpMcpSpec;
1079
+ declare function parseMcpSpec(input: string): McpSpec;
1080
+
1041
1081
  /** Library reads only DEEPSEEK_API_KEY from env; the CLI bridges config.json → env var. */
1042
1082
 
1043
1083
  /** Legacy `fast|smart|max` kept for back-compat with existing config.json files. */
@@ -1061,6 +1101,21 @@ interface SemanticEmbeddingUserConfig {
1061
1101
  ollama?: OllamaEmbeddingUserConfig;
1062
1102
  openaiCompat?: OpenAICompatEmbeddingUserConfig;
1063
1103
  }
1104
+ interface McpServerConfig {
1105
+ command?: string;
1106
+ args?: string[];
1107
+ env?: Record<string, string>;
1108
+ transport?: "stdio" | "sse" | "streamable-http";
1109
+ url?: string;
1110
+ headers?: Record<string, string>;
1111
+ disabled?: boolean;
1112
+ }
1113
+ interface QQBotConfig {
1114
+ appId?: string;
1115
+ appSecret?: string;
1116
+ sandbox?: boolean;
1117
+ enabled?: boolean;
1118
+ }
1064
1119
  interface ReasonixConfig {
1065
1120
  apiKey?: string;
1066
1121
  baseUrl?: string;
@@ -1069,11 +1124,15 @@ interface ReasonixConfig {
1069
1124
  editMode?: EditMode;
1070
1125
  editModeHintShown?: boolean;
1071
1126
  mouseClipboardHintShown?: boolean;
1127
+ /** When false, skip the boot splash animation and show the main UI immediately. Default true. */
1128
+ banner?: boolean;
1072
1129
  reasoningEffort?: ReasoningEffort;
1073
1130
  /** Default workspace root for the desktop client. CLI uses cwd. */
1074
1131
  workspaceDir?: string;
1075
1132
  /** Last N workspace paths the desktop client has opened, most recent first. */
1076
1133
  recentWorkspaces?: string[];
1134
+ /** Desktop only — workspace dir per open tab in tab order, persisted so restart restores every tab (issue #933). Empty/absent → boot with a single default tab. */
1135
+ desktopOpenTabs?: string[];
1077
1136
  /** Desktop only — `openWith` value for clicking file links. Empty/undefined = OS default app. Examples: "code", "cursor", "C:\\path\\to\\editor.exe". */
1078
1137
  editor?: string;
1079
1138
  theme?: ThemeName | "auto";
@@ -1083,16 +1142,24 @@ interface ReasonixConfig {
1083
1142
  mcpDisabled?: string[];
1084
1143
  /** Env overlay per MCP server name (matches the `name=` prefix of the spec). Stdio transports merge this over process.env; SSE/HTTP ignore it. */
1085
1144
  mcpEnv?: Record<string, Record<string, string>>;
1145
+ /** Canonical MCP server configuration — merges with and overrides legacy `mcp`/`mcpEnv`/`mcpDisabled`. */
1146
+ mcpServers?: Record<string, McpServerConfig>;
1086
1147
  session?: string | null;
1087
1148
  setupCompleted?: boolean;
1088
1149
  search?: boolean;
1089
- /** Web search engine backend: "mojeek" (default, scrapes Mojeek) or "searxng" (self-hosted SearXNG). */
1090
- webSearchEngine?: "mojeek" | "searxng";
1150
+ /** Web search engine backend: "mojeek" (default, scrapes Mojeek), "searxng" (self-hosted SearXNG), or "metaso" (Metaso API). */
1151
+ webSearchEngine?: "mojeek" | "searxng" | "metaso";
1091
1152
  /** Base URL for SearXNG instance (default http://localhost:8080). */
1092
1153
  webSearchEndpoint?: string;
1154
+ /** Metaso API key. Falls back to METASO_API_KEY env var, then a built-in default. */
1155
+ metasoApiKey?: string;
1093
1156
  dashboard?: {
1094
1157
  /** Pin the embedded dashboard to a fixed port — required for stable SSH tunnels. 0/absent → ephemeral. */
1095
1158
  port?: number;
1159
+ /** Bind address (#968). Defaults to 127.0.0.1 (loopback only). Set to 0.0.0.0 / :: / a LAN IP to expose to other devices; the URL token is then the only auth, so keep it secret. */
1160
+ host?: string;
1161
+ /** Stable URL token (#968). If unset, a fresh token is minted each boot. Min 16 chars enforced at load time. */
1162
+ token?: string;
1096
1163
  };
1097
1164
  escalation?: {
1098
1165
  /** Per-turn repair/error signal count required to escalate flash→pro. Defaults to 3. Out-of-range → default. */
@@ -1104,6 +1171,7 @@ interface ReasonixConfig {
1104
1171
  showSessionCost?: boolean;
1105
1172
  showTurnCost?: boolean;
1106
1173
  showCacheHit?: boolean;
1174
+ showCtxUsage?: boolean;
1107
1175
  showVersion?: boolean;
1108
1176
  showFeedbackHint?: boolean;
1109
1177
  };
@@ -1114,12 +1182,25 @@ interface ReasonixConfig {
1114
1182
  pathAllowed?: string[];
1115
1183
  };
1116
1184
  };
1185
+ /** Issue #259 — user-configurable sensitive-path prefixes and filename patterns.
1186
+ * Commands touching these paths are demoted to the confirm gate even when allowlisted. */
1187
+ sensitivePaths?: {
1188
+ /** Path prefixes (tilde-relative or absolute) that trigger confirmation. */
1189
+ prefixes?: string[];
1190
+ /** Glob-style filename patterns (matched against basename, case-insensitive). */
1191
+ patterns?: string[];
1192
+ };
1117
1193
  index?: IndexUserConfig;
1118
1194
  semantic?: SemanticEmbeddingUserConfig;
1195
+ skills?: {
1196
+ paths?: string[];
1197
+ };
1119
1198
  /** User-declared extensions to the built-in memory types (#709). Unknown types round-trip even without a declaration; declaring one lets you attach a default priority + lifecycle. */
1120
1199
  memory?: {
1121
1200
  customTypes?: CustomMemoryTypeConfig[];
1122
1201
  };
1202
+ /** QQ Bot configuration */
1203
+ qq?: QQBotConfig;
1123
1204
  }
1124
1205
  interface CustomMemoryTypeConfig {
1125
1206
  name: string;
@@ -1127,6 +1208,7 @@ interface CustomMemoryTypeConfig {
1127
1208
  priority?: "low" | "medium" | "high";
1128
1209
  expires?: "project_end";
1129
1210
  }
1211
+ declare function loadMetasoApiKey(path?: string): string;
1130
1212
  declare function defaultConfigPath(): string;
1131
1213
  declare function readConfig(path?: string): ReasonixConfig;
1132
1214
  declare function writeConfig(cfg: ReasonixConfig, path?: string): void;
@@ -1217,7 +1299,10 @@ declare function applyUserMemory(basePrompt: string, opts?: {
1217
1299
  projectRoot?: string;
1218
1300
  cfg?: ReasonixConfig;
1219
1301
  }): string;
1220
- declare function applyMemoryStack(basePrompt: string, rootDir: string): string;
1302
+ declare function applyMemoryStack(basePrompt: string, rootDir: string, opts?: {
1303
+ homeDir?: string;
1304
+ cfg?: ReasonixConfig;
1305
+ }): string;
1221
1306
 
1222
1307
  /** Native FS tools — sandbox enforced here, not delegated. `edit_file` takes a single SEARCH/REPLACE string. */
1223
1308
 
@@ -1226,8 +1311,8 @@ interface FilesystemToolsOptions {
1226
1311
  rootDir: string;
1227
1312
  /** false → register only read-side tools. Default true. */
1228
1313
  allowWriting?: boolean;
1229
- /** Per-read byte cap; floor against OOM on a multi-GB blob. */
1230
- maxReadBytes?: number;
1314
+ /** Files at or under this size get full content; larger go to outline mode. Default 512 KiB. */
1315
+ outlineThresholdBytes?: number;
1231
1316
  /** Cap on total bytes from listing/grep tools — bounds tree-as-one-string accidents. */
1232
1317
  maxListBytes?: number;
1233
1318
  }
@@ -1351,20 +1436,87 @@ interface SubagentEvent {
1351
1436
  interface SubagentSink {
1352
1437
  current: ((ev: SubagentEvent) => void) | null;
1353
1438
  }
1439
+ interface SubagentResult {
1440
+ success: boolean;
1441
+ output: string;
1442
+ error?: string;
1443
+ turns: number;
1444
+ toolIters: number;
1445
+ elapsedMs: number;
1446
+ costUsd: number;
1447
+ model: string;
1448
+ skillName?: string;
1449
+ /** Zero-filled when no API calls landed so consumers always see a valid shape. */
1450
+ usage: Usage;
1451
+ /** True when the child terminated via forceSummaryAfterIterLimit (storm-breaker / context-guard) — `output` carries the partial synthesis the model managed to produce; not a full answer. User-abort forced summaries do NOT set this (their content is a UX placeholder, routed to `error`). */
1452
+ forcedSummary?: boolean;
1453
+ }
1354
1454
  interface SubagentToolOptions {
1355
1455
  client: DeepSeekClient;
1356
1456
  defaultSystem?: string;
1357
1457
  projectRoot?: string;
1358
1458
  defaultModel?: string;
1359
- maxToolIters?: number;
1360
1459
  maxResultChars?: number;
1361
1460
  sink?: SubagentSink;
1461
+ /** Fires once per spawn, after `spawnSubagent` returns and before its result is formatted for the parent. Bind a `SubagentTelemetry.record` here for automatic distillation capture. */
1462
+ onSpawnComplete?: (result: SubagentResult) => void;
1362
1463
  }
1363
1464
  /** Library surface only — `reasonix code` uses Skills `runAs: subagent` as the user-facing path. */
1364
1465
  declare function registerSubagentTool(parentRegistry: ToolRegistry, opts: SubagentToolOptions): ToolRegistry;
1365
1466
  /** Plan-mode state propagates — a subagent spawned under `/plan` MUST NOT escape it. */
1366
1467
  declare function forkRegistryExcluding(parent: ToolRegistry, exclude: ReadonlySet<string>): ToolRegistry;
1367
1468
 
1469
+ /** Distillation telemetry — measures parent-log growth avoided per spawn. */
1470
+ /** Minimum shape `computeSpawnDistillation` needs. `SubagentResult` matches structurally; declaring a local interface avoids a stats ↔ subagent ↔ loop import cycle. */
1471
+ interface SubagentResultLike {
1472
+ output: string;
1473
+ costUsd: number;
1474
+ usage: {
1475
+ completionTokens: number;
1476
+ };
1477
+ }
1478
+ interface SpawnDistillation {
1479
+ completionTokens: number;
1480
+ outputTokens: number;
1481
+ /** `completionTokens − outputTokens`, clamped to 0. Lower bound — ignores tool-result tokens that would also have landed in the parent log inline. */
1482
+ savingsTokens: number;
1483
+ /** `outputTokens / completionTokens`; 1 when completion is 0. Lower is more distilled; ≥1 means writes / passthrough. */
1484
+ compressionRatio: number;
1485
+ /** True iff `output.trim().length > 0`. */
1486
+ hasOutput: boolean;
1487
+ costUsd: number;
1488
+ }
1489
+ declare function computeSpawnDistillation(result: SubagentResultLike): SpawnDistillation;
1490
+ interface SubagentSessionSummary {
1491
+ spawnCount: number;
1492
+ usefulSpawnCount: number;
1493
+ /** `usefulSpawnCount / spawnCount`; 0 when no spawns. */
1494
+ successRate: number;
1495
+ totalCompletionTokens: number;
1496
+ totalOutputTokens: number;
1497
+ totalSavingsTokens: number;
1498
+ /** Weighted by completion tokens — fair vs. naive mean of ratios. */
1499
+ aggregateCompressionRatio: number;
1500
+ totalCostUsd: number;
1501
+ }
1502
+ declare function summarizeSubagentSession(spawns: SpawnDistillation[]): SubagentSessionSummary;
1503
+ declare const DEFAULT_SPAWN_STORM_THRESHOLD = 3;
1504
+ declare function countSpawnStorms(spawnsByTurn: ReadonlyArray<ReadonlyArray<SpawnDistillation>>, threshold?: number): number;
1505
+ /** Live collector — append every spawn result, query aggregates whenever. Bind `record` and pass as `onSpawnComplete` to `registerSubagentTool` for automatic capture. */
1506
+ declare class SubagentTelemetry {
1507
+ private readonly _spawns;
1508
+ private readonly _byTurn;
1509
+ private _currentTurn;
1510
+ /** Bound for ergonomic use as a callback. */
1511
+ readonly record: (result: SubagentResultLike) => SpawnDistillation;
1512
+ /** Mark the start of a new parent turn so subsequent records group into a new bucket — call from the parent loop when its turn counter advances. */
1513
+ startTurn(turn: number): void;
1514
+ get spawns(): readonly SpawnDistillation[];
1515
+ get spawnsByTurn(): ReadonlyArray<ReadonlyArray<SpawnDistillation>>;
1516
+ get summary(): SubagentSessionSummary;
1517
+ stormCount(threshold?: number): number;
1518
+ }
1519
+
1368
1520
  /** Background process registry for never-exiting commands; ready-signal detection short-circuits the startup wait. */
1369
1521
  interface JobStartOptions {
1370
1522
  /** Absolute path to cwd for the spawned child. */
@@ -1483,8 +1635,12 @@ declare function quoteForCmdExe(arg: string): string;
1483
1635
  declare function tokenizeCommand(cmd: string): string[];
1484
1636
  /** Up-front detection — without it, `dir | findstr foo` quotes `|` literal and pipe silently fails. */
1485
1637
  declare function detectShellOperator(cmd: string): string | null;
1486
- /** Allowlist match on leading argv tokens; demoted by `RISKY_ARGS` when a destructive flag appears in the tail. */
1487
- declare function isAllowed(cmd: string, extra?: readonly string[]): boolean;
1638
+ /** Allowlist match on leading argv tokens; demoted by `RISKY_ARGS` when a destructive flag appears in the tail,
1639
+ * or by `SENSITIVE_PATHS` when a path argument targets a sensitive location (#259). */
1640
+ declare function isAllowed(cmd: string, extra?: readonly string[], projectRoot?: string, sensitivePathConfig?: {
1641
+ prefixes?: readonly string[];
1642
+ patterns?: readonly string[];
1643
+ }): boolean;
1488
1644
 
1489
1645
  /** cwd pinned to root; non-allowlisted commands throw to a UI confirm gate; spawn is `shell: false`, tokenized argv only. */
1490
1646
 
@@ -1499,6 +1655,12 @@ interface ShellToolsOptions {
1499
1655
  /** Getter form lets `editMode === "yolo"` flip mid-session without re-registering tools. */
1500
1656
  allowAll?: boolean | (() => boolean);
1501
1657
  jobs?: JobRegistry;
1658
+ /** Fired after `run_background` / `stop_job` mutate the registry — used by the desktop popover for near-real-time updates without polling. */
1659
+ onJobsChanged?: () => void;
1660
+ sensitivePaths?: {
1661
+ prefixes?: readonly string[];
1662
+ patterns?: readonly string[];
1663
+ };
1502
1664
  }
1503
1665
  /** Error thrown by `run_command` when the command isn't allowlisted. */
1504
1666
  declare class NeedsConfirmationError extends Error {
@@ -1532,8 +1694,8 @@ interface WebFetchOptions {
1532
1694
  interface WebSearchOptions {
1533
1695
  topK?: number;
1534
1696
  signal?: AbortSignal;
1535
- /** Backend engine: "mojeek" (scrapes Mojeek HTML) or "searxng" (self-hosted SearXNG JSON API). */
1536
- engine?: "mojeek" | "searxng";
1697
+ /** Backend engine: "mojeek" (scrapes Mojeek HTML), "searxng" (self-hosted SearXNG JSON API), or "metaso" (Metaso API). */
1698
+ engine?: "mojeek" | "searxng" | "metaso";
1537
1699
  /** Base URL for SearXNG. Default http://localhost:8080. */
1538
1700
  endpoint?: string;
1539
1701
  }
@@ -1550,8 +1712,8 @@ interface WebToolsOptions {
1550
1712
  defaultTopK?: number;
1551
1713
  /** Byte cap for `web_fetch` extracted text. */
1552
1714
  maxFetchChars?: number;
1553
- /** Backend engine: "mojeek" (default, scrapes Mojeek) or "searxng" (self-hosted SearXNG). */
1554
- webSearchEngine?: "mojeek" | "searxng";
1715
+ /** Backend engine: "mojeek" (default, scrapes Mojeek), "searxng" (self-hosted SearXNG), or "metaso" (Metaso API). */
1716
+ webSearchEngine?: "mojeek" | "searxng" | "metaso";
1555
1717
  /** Base URL for SearXNG (default http://localhost:8080). */
1556
1718
  webSearchEndpoint?: string;
1557
1719
  }
@@ -2111,31 +2273,6 @@ declare function truncateForModel(s: string, maxChars: number): string;
2111
2273
  /** Never tokenizes full input — pathological repetitive text (`AAAA…`) costs 30s+ on the pure-TS BPE port. */
2112
2274
  declare function truncateForModelByTokens(s: string, maxTokens: number): string;
2113
2275
 
2114
- /** Plain http:// stays HTTP+SSE for back-compat; Streamable HTTP is opt-in via the `streamable+` URL prefix. */
2115
- interface StdioMcpSpec {
2116
- transport: "stdio";
2117
- /** Namespace prefix applied to each registered tool, or null if anonymous. */
2118
- name: string | null;
2119
- /** Argv[0]. */
2120
- command: string;
2121
- /** Remaining argv. */
2122
- args: string[];
2123
- }
2124
- interface SseMcpSpec {
2125
- transport: "sse";
2126
- name: string | null;
2127
- /** Fully qualified SSE endpoint URL. */
2128
- url: string;
2129
- }
2130
- interface StreamableHttpMcpSpec {
2131
- transport: "streamable-http";
2132
- name: string | null;
2133
- /** Fully qualified Streamable HTTP endpoint URL (no `streamable+` prefix). */
2134
- url: string;
2135
- }
2136
- type McpSpec = StdioMcpSpec | SseMcpSpec | StreamableHttpMcpSpec;
2137
- declare function parseMcpSpec(input: string): McpSpec;
2138
-
2139
2276
  /** Unsupported list methods surface as `{supported:false}` instead of throwing — minimal servers still get a clean report. */
2140
2277
 
2141
2278
  interface InspectionReport {
@@ -2367,4 +2504,4 @@ declare function aggregateUsage(records: UsageRecord[], opts?: AggregateOptions)
2367
2504
  /** File-size helper for the stats header — "1.2 MB" etc. Returns "" if missing. */
2368
2505
  declare function formatLogSize(path?: string): string;
2369
2506
 
2370
- export { AT_MENTION_PATTERN, AT_PICKER_PREFIX, type AggregateOptions, AppendOnlyLog, type AppendUsageInput, type ApplyResult, type ApplyStatus, type AtMentionExpansion, type AtMentionOptions, type BridgeOptions, type BridgeResult, CODE_SYSTEM_PROMPT, CacheFirstLoop, type CacheFirstLoopOptions, type CallToolResult, type ChatMessage, type ChatResponse, type ChoiceOption, ChoiceRequestedError, type ChoiceToolOptions, type CodeSystemPromptOptions, DEFAULT_AT_DIR_MAX_ENTRIES, DEFAULT_AT_MENTION_MAX_BYTES, DEFAULT_MAX_RESULT_CHARS, DEFAULT_MAX_RESULT_TOKENS, DEFAULT_PICKER_IGNORE_DIRS, DeepSeekClient, type DeepSeekClientOptions, type RenderOptions as DiffRenderOptions, type DiffReport, type DiffSide, type DirEntry, type EditBlock, type EditSnapshot, type EventRole, type FileWithStats, type FilesystemToolsOptions, type FlattenDecision, type FlattenOptions, type GetLatestVersionOptions, type GetPromptResult, HOOK_EVENTS, HOOK_SETTINGS_DIRNAME, HOOK_SETTINGS_FILENAME, type HookConfig, type HookEvent, type HookOutcome, type HookPayload, type HookReport, type HookScope, type HookSettings, type HookSpawnInput, type HookSpawnResult, type HookSpawner, ImmutablePrefix, type ImmutablePrefixOptions, type InitializeResult, type InspectionReport, type InstallSource, type JSONSchema, type JsonRpcMessage, type JsonRpcRequest, type JsonRpcResponse, LATEST_CACHE_TTL_MS, LATEST_FETCH_TIMEOUT_MS, type ListDirectoryOptions, type ListFilesOptions, type ListPromptsResult, type ListResourcesResult, type ListToolsResult, type LoadHookSettingsOptions, type LoopEvent, MCP_PROTOCOL_VERSION, MEMORY_INDEX_FILE, MEMORY_INDEX_MAX_CHARS, McpClient, type McpClientOptions, type McpContentBlock, type McpProgressHandler, type McpProgressInfo, type McpPrompt, type McpPromptArgument, type McpPromptMessage, type McpPromptResourceBlock, type McpResource, type McpResourceContents, type McpResourceContentsBlob, type McpResourceContentsText, type McpSpec, type McpTool, type McpToolSchema, type McpTransport, type MemoryEntry, type MemoryScope, MemoryStore, type MemoryStoreOptions, type MemoryToolsOptions, type MemoryType, type WriteInput as MemoryWriteInput, NeedsConfirmationError, PROJECT_MEMORY_FILE, PROJECT_MEMORY_FILES, PROJECT_MEMORY_MAX_CHARS, type PageContent, type ParsedAtQuery, type PickerCandidate, PlanProposedError, PlanRevisionProposedError, type PlanStep, type PlanStepRisk, type PlanToolOptions, type ProgressNotificationParams, type ProjectMemory, type RankPickerOptions, type ReadResourceResult, type ReadTranscriptResult, type ReasonixConfig, type ReconfigurableOptions, type RepairReport, type ReplayStats, type ResolvedHook, type RetryInfo, type RetryOptions, type Role, type RunCommandResult, type RunHooksOptions, type ScavengeOptions, type ScavengeResult, type SearchResult, type SectionResult, type SessionInfo, SessionStats, type SessionSummary, type ShellToolsOptions, type SseMcpSpec, SseTransport, type SseTransportOptions, type StdioMcpSpec, StdioTransport, type StdioTransportOptions, type StepCompletion, StormBreaker, type StreamChunk, type StreamWalkOptions, type StreamableHttpMcpSpec, StreamableHttpTransport, type StreamableHttpTransportOptions, type SubagentEvent, type SubagentSink, type SubagentToolOptions, type TodoItem, type TodoStatus, type TodoToolOptions, type ToolCall, type ToolCallContext, ToolCallRepair, type ToolCallRepairOptions, type ToolDefinition, type ToolFunctionSpec, ToolRegistry, type ToolSpec, type TranscriptMeta, type TranscriptRecord, type TruncationRepairResult, type TurnPair, type TurnStats, USER_MEMORY_DIR, Usage, type UsageAggregate, type UsageBucket, type UsageRecord, VERSION, VolatileScratch, type WebFetchOptions, type WebSearchOptions, type WebToolsOptions, aggregateUsage, analyzeSchema, appendSessionMessage, appendUsage, applyEditBlock, applyEditBlocks, applyMemoryStack, applyProjectMemory, applyUserMemory, bridgeMcpTools, bucketCacheHitRatio, bucketSavingsFraction, claudeEquivalentCost, codeSystemPrompt, compareVersions, computeReplayStats, costUsd, decideOutcome, defaultConfigPath, defaultUsageLogPath, deleteSession, detectAtPicker, detectInstallSource, detectNpmInstallPrefix, detectShellOperator, diffTranscripts, expandAtMentions, fetchWithRetry, findProjectMemoryPath, fixToolCallPairing, flattenMcpResult, flattenSchema, forkRegistryExcluding, formatCommandResult, formatHookOutcomeMessage, formatLogSize, formatLoopError, formatSearchResults, getLatestVersion, globalSettingsPath, healLoadedMessages, healLoadedMessagesByTokens, htmlToText, injectPowerShellUtf8, inputCostUsd, inspectMcpServer, isAllowed, isJsonRpcError, isNpxInstall, isPlausibleKey, listDirectory, listFilesSync, listFilesWithStatsAsync, listFilesWithStatsSync, listSessions, loadApiKey, loadBaseUrl, loadDotenv, loadHooks, loadSessionMessages, matchesTool, memoryEnabled, nestArguments, openTranscriptFile, outputCostUsd, parseAtQuery, parseEditBlocks, parseMcpSpec, parseMojeekResults, parseSearxngHtmlResults, parseTranscript, prepareSpawn, projectHash, projectSettingsPath, quoteForCmdExe, rankPickerCandidates, readConfig, readProjectMemory, readTranscript, readUsageLog, recordFromLoopEvent, redactKey, registerChoiceTool, registerFilesystemTools, registerMemoryTools, registerPlanTool, registerShellTools, registerSubagentTool, registerTodoTool, registerWebTools, renderMarkdown as renderDiffMarkdown, renderSummaryTable as renderDiffSummary, repairTruncatedJson, replayFromFile, resolveExecutable, resolveProjectMemoryWritePath, restoreSnapshots, runCommand, runHooks, sanitizeMemoryName, sanitizeName as sanitizeSessionName, saveApiKey, saveBaseUrl, scavengeToolCalls, sessionPath, sessionsDir, similarity, snapshotBeforeEdits, stripHallucinatedToolMarkup, tokenizeCommand, truncateForModel, truncateForModelByTokens, walkFilesStream, webFetch, webSearch, withUtf8Codepage, writeConfig, writeMeta, writeRecord };
2507
+ export { AT_MENTION_PATTERN, AT_PICKER_PREFIX, type AggregateOptions, AppendOnlyLog, type AppendUsageInput, type ApplyResult, type ApplyStatus, type AtMentionExpansion, type AtMentionOptions, type BridgeOptions, type BridgeResult, CODE_SYSTEM_PROMPT, CacheFirstLoop, type CacheFirstLoopOptions, type CallToolResult, type ChatMessage, type ChatResponse, type ChoiceOption, ChoiceRequestedError, type ChoiceToolOptions, type CodeSystemPromptOptions, DEFAULT_AT_DIR_MAX_ENTRIES, DEFAULT_AT_MENTION_MAX_BYTES, DEFAULT_MAX_RESULT_CHARS, DEFAULT_MAX_RESULT_TOKENS, DEFAULT_PICKER_IGNORE_DIRS, DEFAULT_SPAWN_STORM_THRESHOLD, DeepSeekClient, type DeepSeekClientOptions, type RenderOptions as DiffRenderOptions, type DiffReport, type DiffSide, type DirEntry, type EditBlock, type EditSnapshot, type EventRole, type FileWithStats, type FilesystemToolsOptions, type FlattenDecision, type FlattenOptions, type GetLatestVersionOptions, type GetPromptResult, HOOK_EVENTS, HOOK_SETTINGS_DIRNAME, HOOK_SETTINGS_FILENAME, type HookConfig, type HookEvent, type HookOutcome, type HookPayload, type HookReport, type HookScope, type HookSettings, type HookSpawnInput, type HookSpawnResult, type HookSpawner, ImmutablePrefix, type ImmutablePrefixOptions, type InitializeResult, type InspectionReport, type InstallSource, type JSONSchema, type JsonRpcMessage, type JsonRpcRequest, type JsonRpcResponse, LATEST_CACHE_TTL_MS, LATEST_FETCH_TIMEOUT_MS, type ListDirectoryOptions, type ListFilesOptions, type ListPromptsResult, type ListResourcesResult, type ListToolsResult, type LoadHookSettingsOptions, type LoopEvent, MCP_PROTOCOL_VERSION, MEMORY_INDEX_FILE, MEMORY_INDEX_MAX_CHARS, McpClient, type McpClientOptions, type McpContentBlock, type McpProgressHandler, type McpProgressInfo, type McpPrompt, type McpPromptArgument, type McpPromptMessage, type McpPromptResourceBlock, type McpResource, type McpResourceContents, type McpResourceContentsBlob, type McpResourceContentsText, type McpSpec, type McpTool, type McpToolSchema, type McpTransport, type MemoryEntry, type MemoryScope, MemoryStore, type MemoryStoreOptions, type MemoryToolsOptions, type MemoryType, type WriteInput as MemoryWriteInput, NeedsConfirmationError, PROJECT_MEMORY_FILE, PROJECT_MEMORY_FILES, PROJECT_MEMORY_MAX_CHARS, type PageContent, type ParsedAtQuery, type PickerCandidate, PlanProposedError, PlanRevisionProposedError, type PlanStep, type PlanStepRisk, type PlanToolOptions, type ProgressNotificationParams, type ProjectMemory, type RankPickerOptions, type ReadResourceResult, type ReadTranscriptResult, type ReasonixConfig, type ReconfigurableOptions, type RepairReport, type ReplayStats, type ResolvedHook, type RetryInfo, type RetryOptions, type Role, type RunCommandResult, type RunHooksOptions, type ScavengeOptions, type ScavengeResult, type SearchResult, type SectionResult, type SessionInfo, SessionStats, type SessionSummary, type ShellToolsOptions, type SpawnDistillation, type SseMcpSpec, SseTransport, type SseTransportOptions, type StdioMcpSpec, StdioTransport, type StdioTransportOptions, type StepCompletion, StormBreaker, type StreamChunk, type StreamWalkOptions, type StreamableHttpMcpSpec, StreamableHttpTransport, type StreamableHttpTransportOptions, type SubagentEvent, type SubagentResult, type SubagentResultLike, type SubagentSessionSummary, type SubagentSink, SubagentTelemetry, type SubagentToolOptions, type TodoItem, type TodoStatus, type TodoToolOptions, type ToolCall, type ToolCallContext, ToolCallRepair, type ToolCallRepairOptions, type ToolDefinition, type ToolFunctionSpec, ToolRegistry, type ToolSpec, type TranscriptMeta, type TranscriptRecord, type TruncationRepairResult, type TurnPair, type TurnStats, USER_MEMORY_DIR, Usage, type UsageAggregate, type UsageBucket, type UsageRecord, VERSION, VolatileScratch, type WebFetchOptions, type WebSearchOptions, type WebToolsOptions, aggregateUsage, analyzeSchema, appendSessionMessage, appendUsage, applyEditBlock, applyEditBlocks, applyMemoryStack, applyProjectMemory, applyUserMemory, bridgeMcpTools, bucketCacheHitRatio, bucketSavingsFraction, claudeEquivalentCost, codeSystemPrompt, compareVersions, computeReplayStats, computeSpawnDistillation, costUsd, countSpawnStorms, decideOutcome, defaultConfigPath, defaultUsageLogPath, deleteSession, detectAtPicker, detectInstallSource, detectNpmInstallPrefix, detectShellOperator, diffTranscripts, expandAtMentions, fetchWithRetry, findProjectMemoryPath, fixToolCallPairing, flattenMcpResult, flattenSchema, forkRegistryExcluding, formatCommandResult, formatHookOutcomeMessage, formatLogSize, formatLoopError, formatSearchResults, getLatestVersion, globalSettingsPath, healLoadedMessages, healLoadedMessagesByTokens, htmlToText, injectPowerShellUtf8, inputCostUsd, inspectMcpServer, isAllowed, isJsonRpcError, isNpxInstall, isPlausibleKey, listDirectory, listFilesSync, listFilesWithStatsAsync, listFilesWithStatsSync, listSessions, loadApiKey, loadBaseUrl, loadDotenv, loadHooks, loadMetasoApiKey, loadSessionMessages, matchesTool, memoryEnabled, nestArguments, openTranscriptFile, outputCostUsd, parseAtQuery, parseEditBlocks, parseMcpSpec, parseMojeekResults, parseSearxngHtmlResults, parseTranscript, prepareSpawn, projectHash, projectSettingsPath, quoteForCmdExe, rankPickerCandidates, readConfig, readProjectMemory, readTranscript, readUsageLog, recordFromLoopEvent, redactKey, registerChoiceTool, registerFilesystemTools, registerMemoryTools, registerPlanTool, registerShellTools, registerSubagentTool, registerTodoTool, registerWebTools, renderMarkdown as renderDiffMarkdown, renderSummaryTable as renderDiffSummary, repairTruncatedJson, replayFromFile, resolveExecutable, resolveProjectMemoryWritePath, restoreSnapshots, runCommand, runHooks, sanitizeMemoryName, sanitizeName as sanitizeSessionName, saveApiKey, saveBaseUrl, scavengeToolCalls, sessionPath, sessionsDir, similarity, snapshotBeforeEdits, stripHallucinatedToolMarkup, summarizeSubagentSession, tokenizeCommand, truncateForModel, truncateForModelByTokens, walkFilesStream, webFetch, webSearch, withUtf8Codepage, writeConfig, writeMeta, writeRecord };