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,30 +1,30 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { createRequire as __cr } from 'node:module'; if (typeof globalThis.require === 'undefined') { globalThis.require = __cr(import.meta.url); }
|
|
3
|
-
import "./chunk-
|
|
4
|
-
import "./chunk-I4Q3QT4W.js";
|
|
5
|
-
import "./chunk-NLRC3DWQ.js";
|
|
3
|
+
import "./chunk-K4YQFULP.js";
|
|
6
4
|
import "./chunk-7YPMTE3U.js";
|
|
7
|
-
import "./chunk-
|
|
8
|
-
import "./chunk-
|
|
9
|
-
import "./chunk-
|
|
10
|
-
import "./chunk-
|
|
11
|
-
import "./chunk-
|
|
12
|
-
import "./chunk-
|
|
5
|
+
import "./chunk-36BM7INR.js";
|
|
6
|
+
import "./chunk-544J4PXD.js";
|
|
7
|
+
import "./chunk-UMZ6KHTS.js";
|
|
8
|
+
import "./chunk-3YRTIWFX.js";
|
|
9
|
+
import "./chunk-BA5R6BAE.js";
|
|
10
|
+
import "./chunk-HGK57NBN.js";
|
|
11
|
+
import "./chunk-N4SEBLU4.js";
|
|
12
|
+
import "./chunk-BOWSNGQC.js";
|
|
13
|
+
import "./chunk-C2MRSJTV.js";
|
|
14
|
+
import "./chunk-25T6CVUP.js";
|
|
15
|
+
import "./chunk-2WUEAI2I.js";
|
|
16
|
+
import "./chunk-6UNHNVJR.js";
|
|
13
17
|
import {
|
|
14
18
|
listSessions,
|
|
15
19
|
loadSessionMessages,
|
|
16
20
|
sessionPath
|
|
17
|
-
} from "./chunk-
|
|
18
|
-
import "./chunk-
|
|
19
|
-
import "./chunk-25T6CVUP.js";
|
|
21
|
+
} from "./chunk-6XWXIVQ3.js";
|
|
22
|
+
import "./chunk-XXC2BYTV.js";
|
|
20
23
|
import "./chunk-2UQP6H6T.js";
|
|
21
|
-
import "./chunk-GMSAB2TC.js";
|
|
22
|
-
import "./chunk-FQSQFCBI.js";
|
|
23
24
|
import {
|
|
24
25
|
t
|
|
25
|
-
} from "./chunk-
|
|
26
|
-
import "./chunk-
|
|
27
|
-
import "./chunk-XXC2BYTV.js";
|
|
26
|
+
} from "./chunk-DVD67FXQ.js";
|
|
27
|
+
import "./chunk-A5PBEIJ7.js";
|
|
28
28
|
import "./chunk-TUK7OWJA.js";
|
|
29
29
|
|
|
30
30
|
// src/cli/commands/sessions.ts
|
|
@@ -117,4 +117,4 @@ function truncate(s, max) {
|
|
|
117
117
|
export {
|
|
118
118
|
sessionsCommand
|
|
119
119
|
};
|
|
120
|
-
//# sourceMappingURL=sessions-
|
|
120
|
+
//# sourceMappingURL=sessions-EPBFYISL.js.map
|
|
@@ -3,11 +3,11 @@ import { createRequire as __cr } from 'node:module'; if (typeof globalThis.requi
|
|
|
3
3
|
import {
|
|
4
4
|
MultiSelect,
|
|
5
5
|
SingleSelect
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-SBHF5NWD.js";
|
|
7
7
|
import {
|
|
8
8
|
ThemeProvider,
|
|
9
9
|
useTheme
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-2HVTBFCI.js";
|
|
11
11
|
import {
|
|
12
12
|
Box_default,
|
|
13
13
|
Text,
|
|
@@ -16,7 +16,7 @@ import {
|
|
|
16
16
|
source_default,
|
|
17
17
|
use_app_default,
|
|
18
18
|
use_input_default
|
|
19
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-UO6E7FN3.js";
|
|
20
20
|
import {
|
|
21
21
|
MCP_CATALOG
|
|
22
22
|
} from "./chunk-PLHAZOLZ.js";
|
|
@@ -31,7 +31,7 @@ import {
|
|
|
31
31
|
onLanguageChange,
|
|
32
32
|
setLanguage,
|
|
33
33
|
t
|
|
34
|
-
} from "./chunk-
|
|
34
|
+
} from "./chunk-DVD67FXQ.js";
|
|
35
35
|
import {
|
|
36
36
|
defaultConfigPath,
|
|
37
37
|
isPlausibleKey,
|
|
@@ -43,7 +43,7 @@ import {
|
|
|
43
43
|
redactKey,
|
|
44
44
|
resolveThemePreference,
|
|
45
45
|
writeConfig
|
|
46
|
-
} from "./chunk-
|
|
46
|
+
} from "./chunk-A5PBEIJ7.js";
|
|
47
47
|
import {
|
|
48
48
|
__toESM
|
|
49
49
|
} from "./chunk-TUK7OWJA.js";
|
|
@@ -149,7 +149,8 @@ var import_react2 = __toESM(require_react(), 1);
|
|
|
149
149
|
var CATALOG_BY_NAME = new Map(MCP_CATALOG.map((e) => [e.name, e]));
|
|
150
150
|
var LANGUAGE_LABELS = {
|
|
151
151
|
EN: "English",
|
|
152
|
-
"zh-CN": "\u7B80\u4F53\u4E2D\u6587"
|
|
152
|
+
"zh-CN": "\u7B80\u4F53\u4E2D\u6587",
|
|
153
|
+
de: "Deutsch"
|
|
153
154
|
};
|
|
154
155
|
function Wizard({
|
|
155
156
|
onComplete,
|
|
@@ -589,4 +590,4 @@ async function setupCommand(opts = {}) {
|
|
|
589
590
|
export {
|
|
590
591
|
setupCommand
|
|
591
592
|
};
|
|
592
|
-
//# sourceMappingURL=setup-
|
|
593
|
+
//# sourceMappingURL=setup-IW2XR5XI.js.map
|
|
@@ -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":["/** `reasonix setup` — re-mount the first-run wizard. */\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 /** Test-only — skip the API-key step. */\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={{ mcp: existing.mcp, theme: existing.theme }}\n forceApiKeyStep={opts.forceKeyStep}\n onComplete={() => undefined}\n onCancel={() => {\n unmount();\n }}\n />,\n { exitOnCtrlC: true, patchConsole: false },\n );\n await waitUntilExit();\n}\n","/** First-run / re-configure wizard — saves to `~/.reasonix/config.json`. */\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 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 { 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 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\" | \"mcp\" | \"mcpArgs\" | \"review\" | \"saved\";\n\ninterface WizardData {\n language: LanguageCode;\n theme: ThemeName;\n apiKey: string;\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 de: \"Deutsch\",\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 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 ? \"mcp\" : \"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(\"mcp\");\n }}\n error={error}\n onError={setError}\n />\n );\n }\n\n if (step === \"mcp\") {\n return (\n <StepFrame title={t(\"wizard.mcpTitle\")} step={1} total={2}>\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={2} total={2}>\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\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 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.savedShellHint\")}</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\n// Hit `/models` instead of DeepSeek's `/user/balance`: the OpenAI-compat\n// listing endpoint exists on every provider that pretends to be OpenAI\n// (DeepSeek, DashScope/Tongyi, Moonshot, Zhipu, …), and 401/403 there\n// still means \"key bad\" the same way.\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}/models`, {\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: `HTTP ${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 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"]}
|
|
@@ -3,14 +3,14 @@ import { createRequire as __cr } from 'node:module'; if (typeof globalThis.requi
|
|
|
3
3
|
import {
|
|
4
4
|
renderDashboard,
|
|
5
5
|
statsCommand
|
|
6
|
-
} from "./chunk-
|
|
7
|
-
import "./chunk-
|
|
8
|
-
import "./chunk-
|
|
9
|
-
import "./chunk-
|
|
10
|
-
import "./chunk-
|
|
6
|
+
} from "./chunk-K3QJ3GKI.js";
|
|
7
|
+
import "./chunk-3YRTIWFX.js";
|
|
8
|
+
import "./chunk-BA5R6BAE.js";
|
|
9
|
+
import "./chunk-DVD67FXQ.js";
|
|
10
|
+
import "./chunk-A5PBEIJ7.js";
|
|
11
11
|
import "./chunk-TUK7OWJA.js";
|
|
12
12
|
export {
|
|
13
13
|
renderDashboard,
|
|
14
14
|
statsCommand
|
|
15
15
|
};
|
|
16
|
-
//# sourceMappingURL=stats-
|
|
16
|
+
//# sourceMappingURL=stats-4WB4XHBP.js.map
|
|
@@ -0,0 +1,167 @@
|
|
|
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
|
+
Query,
|
|
5
|
+
getParser
|
|
6
|
+
} from "./chunk-FP7IOWBQ.js";
|
|
7
|
+
import {
|
|
8
|
+
grammarForPath
|
|
9
|
+
} from "./chunk-L3VPEESB.js";
|
|
10
|
+
import "./chunk-TUK7OWJA.js";
|
|
11
|
+
|
|
12
|
+
// src/code-query/symbols.ts
|
|
13
|
+
var TS_QUERY = `
|
|
14
|
+
(function_declaration name: (identifier) @name) @function
|
|
15
|
+
(class_declaration name: (type_identifier) @name) @class
|
|
16
|
+
(interface_declaration name: (type_identifier) @name) @interface
|
|
17
|
+
(type_alias_declaration name: (type_identifier) @name) @type
|
|
18
|
+
(enum_declaration name: (identifier) @name) @enum
|
|
19
|
+
(method_definition name: (property_identifier) @name) @method
|
|
20
|
+
(public_field_definition name: (property_identifier) @name) @property
|
|
21
|
+
(variable_declarator name: (identifier) @name value: [(arrow_function) (function_expression)]) @function
|
|
22
|
+
(internal_module name: (identifier) @name) @namespace
|
|
23
|
+
`;
|
|
24
|
+
var JS_QUERY = `
|
|
25
|
+
(function_declaration name: (identifier) @name) @function
|
|
26
|
+
(class_declaration name: (identifier) @name) @class
|
|
27
|
+
(method_definition name: (property_identifier) @name) @method
|
|
28
|
+
(field_definition property: (property_identifier) @name) @property
|
|
29
|
+
(variable_declarator name: (identifier) @name value: [(arrow_function) (function_expression)]) @function
|
|
30
|
+
`;
|
|
31
|
+
var PYTHON_QUERY = `
|
|
32
|
+
(function_definition name: (identifier) @name) @function
|
|
33
|
+
(class_definition name: (identifier) @name) @class
|
|
34
|
+
`;
|
|
35
|
+
var GO_QUERY = `
|
|
36
|
+
(function_declaration name: (identifier) @name) @function
|
|
37
|
+
(method_declaration name: (field_identifier) @name) @method
|
|
38
|
+
(type_spec name: (type_identifier) @name type: (struct_type)) @class
|
|
39
|
+
(type_spec name: (type_identifier) @name type: (interface_type)) @interface
|
|
40
|
+
(type_spec name: (type_identifier) @name) @type
|
|
41
|
+
`;
|
|
42
|
+
var RUST_QUERY = `
|
|
43
|
+
(function_item name: (identifier) @name) @function
|
|
44
|
+
(struct_item name: (type_identifier) @name) @class
|
|
45
|
+
(enum_item name: (type_identifier) @name) @enum
|
|
46
|
+
(trait_item name: (type_identifier) @name) @interface
|
|
47
|
+
(type_item name: (type_identifier) @name) @type
|
|
48
|
+
(mod_item name: (identifier) @name) @namespace
|
|
49
|
+
(const_item name: (identifier) @name) @property
|
|
50
|
+
(static_item name: (identifier) @name) @property
|
|
51
|
+
`;
|
|
52
|
+
var JAVA_QUERY = `
|
|
53
|
+
(class_declaration name: (identifier) @name) @class
|
|
54
|
+
(interface_declaration name: (identifier) @name) @interface
|
|
55
|
+
(enum_declaration name: (identifier) @name) @enum
|
|
56
|
+
(method_declaration name: (identifier) @name) @method
|
|
57
|
+
(constructor_declaration name: (identifier) @name) @method
|
|
58
|
+
(field_declaration declarator: (variable_declarator name: (identifier) @name)) @property
|
|
59
|
+
`;
|
|
60
|
+
var QUERIES = {
|
|
61
|
+
typescript: TS_QUERY,
|
|
62
|
+
tsx: TS_QUERY,
|
|
63
|
+
javascript: JS_QUERY,
|
|
64
|
+
python: PYTHON_QUERY,
|
|
65
|
+
go: GO_QUERY,
|
|
66
|
+
rust: RUST_QUERY,
|
|
67
|
+
java: JAVA_QUERY
|
|
68
|
+
};
|
|
69
|
+
var KIND_CAPTURE_NAMES = /* @__PURE__ */ new Set([
|
|
70
|
+
"function",
|
|
71
|
+
"class",
|
|
72
|
+
"interface",
|
|
73
|
+
"type",
|
|
74
|
+
"enum",
|
|
75
|
+
"method",
|
|
76
|
+
"property",
|
|
77
|
+
"namespace"
|
|
78
|
+
]);
|
|
79
|
+
var PARENT_CONTAINER_TYPES = /* @__PURE__ */ new Set([
|
|
80
|
+
"class_declaration",
|
|
81
|
+
"interface_declaration",
|
|
82
|
+
"internal_module",
|
|
83
|
+
"class_definition",
|
|
84
|
+
"impl_item",
|
|
85
|
+
"trait_item",
|
|
86
|
+
"mod_item"
|
|
87
|
+
]);
|
|
88
|
+
var METHOD_PROMOTING_CONTAINER_TYPES = /* @__PURE__ */ new Set([
|
|
89
|
+
"class_declaration",
|
|
90
|
+
"class_definition",
|
|
91
|
+
"interface_declaration",
|
|
92
|
+
"impl_item",
|
|
93
|
+
"trait_item"
|
|
94
|
+
]);
|
|
95
|
+
async function extractSymbols(filePath, source) {
|
|
96
|
+
const grammar = grammarForPath(filePath);
|
|
97
|
+
if (!grammar) return [];
|
|
98
|
+
const parser = await getParser(grammar);
|
|
99
|
+
try {
|
|
100
|
+
const tree = parser.parse(source);
|
|
101
|
+
if (!tree) return [];
|
|
102
|
+
const language = parser.language;
|
|
103
|
+
if (!language) return [];
|
|
104
|
+
const query = new Query(language, QUERIES[grammar]);
|
|
105
|
+
try {
|
|
106
|
+
const matches = query.matches(tree.rootNode);
|
|
107
|
+
return matchesToSymbols(matches);
|
|
108
|
+
} finally {
|
|
109
|
+
query.delete();
|
|
110
|
+
tree.delete();
|
|
111
|
+
}
|
|
112
|
+
} finally {
|
|
113
|
+
parser.delete();
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
function matchesToSymbols(matches) {
|
|
117
|
+
const out = [];
|
|
118
|
+
for (const match of matches) {
|
|
119
|
+
let nameNode = null;
|
|
120
|
+
let containerNode = null;
|
|
121
|
+
let kind = null;
|
|
122
|
+
for (const cap of match.captures) {
|
|
123
|
+
if (cap.name === "name") {
|
|
124
|
+
nameNode = cap.node;
|
|
125
|
+
} else if (KIND_CAPTURE_NAMES.has(cap.name)) {
|
|
126
|
+
containerNode = cap.node;
|
|
127
|
+
kind = cap.name;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
if (!nameNode || !containerNode || !kind) continue;
|
|
131
|
+
const enclosing = findEnclosingContainer(containerNode);
|
|
132
|
+
if (kind === "function" && enclosing && METHOD_PROMOTING_CONTAINER_TYPES.has(enclosing.type)) {
|
|
133
|
+
kind = "method";
|
|
134
|
+
}
|
|
135
|
+
out.push({
|
|
136
|
+
name: nameNode.text,
|
|
137
|
+
kind,
|
|
138
|
+
line: containerNode.startPosition.row + 1,
|
|
139
|
+
column: containerNode.startPosition.column + 1,
|
|
140
|
+
endLine: containerNode.endPosition.row + 1,
|
|
141
|
+
endColumn: containerNode.endPosition.column + 1,
|
|
142
|
+
parent: enclosing ? containerNameOf(enclosing) : void 0
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
out.sort((a, b) => a.line - b.line || a.column - b.column);
|
|
146
|
+
return out;
|
|
147
|
+
}
|
|
148
|
+
function findEnclosingContainer(node) {
|
|
149
|
+
let current = node.parent;
|
|
150
|
+
while (current) {
|
|
151
|
+
if (PARENT_CONTAINER_TYPES.has(current.type)) return current;
|
|
152
|
+
current = current.parent;
|
|
153
|
+
}
|
|
154
|
+
return null;
|
|
155
|
+
}
|
|
156
|
+
function containerNameOf(container) {
|
|
157
|
+
if (container.type === "impl_item") {
|
|
158
|
+
const typeField = container.childForFieldName("type");
|
|
159
|
+
if (typeField) return typeField.text;
|
|
160
|
+
}
|
|
161
|
+
const nameField = container.childForFieldName("name");
|
|
162
|
+
return nameField?.text;
|
|
163
|
+
}
|
|
164
|
+
export {
|
|
165
|
+
extractSymbols
|
|
166
|
+
};
|
|
167
|
+
//# sourceMappingURL=symbols-UQ274IOB.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/code-query/symbols.ts"],"sourcesContent":["import { type Node, Query } from \"web-tree-sitter\";\nimport { type GrammarName, getParser, grammarForPath } from \"./parser.js\";\n\nexport type SymbolKind =\n | \"function\"\n | \"class\"\n | \"interface\"\n | \"type\"\n | \"enum\"\n | \"method\"\n | \"property\"\n | \"namespace\";\n\nexport interface CodeSymbol {\n name: string;\n kind: SymbolKind;\n line: number;\n column: number;\n endLine: number;\n endColumn: number;\n parent?: string;\n}\n\nconst TS_QUERY = `\n(function_declaration name: (identifier) @name) @function\n(class_declaration name: (type_identifier) @name) @class\n(interface_declaration name: (type_identifier) @name) @interface\n(type_alias_declaration name: (type_identifier) @name) @type\n(enum_declaration name: (identifier) @name) @enum\n(method_definition name: (property_identifier) @name) @method\n(public_field_definition name: (property_identifier) @name) @property\n(variable_declarator name: (identifier) @name value: [(arrow_function) (function_expression)]) @function\n(internal_module name: (identifier) @name) @namespace\n`;\n\nconst JS_QUERY = `\n(function_declaration name: (identifier) @name) @function\n(class_declaration name: (identifier) @name) @class\n(method_definition name: (property_identifier) @name) @method\n(field_definition property: (property_identifier) @name) @property\n(variable_declarator name: (identifier) @name value: [(arrow_function) (function_expression)]) @function\n`;\n\nconst PYTHON_QUERY = `\n(function_definition name: (identifier) @name) @function\n(class_definition name: (identifier) @name) @class\n`;\n\nconst GO_QUERY = `\n(function_declaration name: (identifier) @name) @function\n(method_declaration name: (field_identifier) @name) @method\n(type_spec name: (type_identifier) @name type: (struct_type)) @class\n(type_spec name: (type_identifier) @name type: (interface_type)) @interface\n(type_spec name: (type_identifier) @name) @type\n`;\n\nconst RUST_QUERY = `\n(function_item name: (identifier) @name) @function\n(struct_item name: (type_identifier) @name) @class\n(enum_item name: (type_identifier) @name) @enum\n(trait_item name: (type_identifier) @name) @interface\n(type_item name: (type_identifier) @name) @type\n(mod_item name: (identifier) @name) @namespace\n(const_item name: (identifier) @name) @property\n(static_item name: (identifier) @name) @property\n`;\n\nconst JAVA_QUERY = `\n(class_declaration name: (identifier) @name) @class\n(interface_declaration name: (identifier) @name) @interface\n(enum_declaration name: (identifier) @name) @enum\n(method_declaration name: (identifier) @name) @method\n(constructor_declaration name: (identifier) @name) @method\n(field_declaration declarator: (variable_declarator name: (identifier) @name)) @property\n`;\n\nconst QUERIES: Record<GrammarName, string> = {\n typescript: TS_QUERY,\n tsx: TS_QUERY,\n javascript: JS_QUERY,\n python: PYTHON_QUERY,\n go: GO_QUERY,\n rust: RUST_QUERY,\n java: JAVA_QUERY,\n};\n\nconst KIND_CAPTURE_NAMES = new Set<SymbolKind>([\n \"function\",\n \"class\",\n \"interface\",\n \"type\",\n \"enum\",\n \"method\",\n \"property\",\n \"namespace\",\n]);\n\nconst PARENT_CONTAINER_TYPES = new Set([\n \"class_declaration\",\n \"interface_declaration\",\n \"internal_module\",\n \"class_definition\",\n \"impl_item\",\n \"trait_item\",\n \"mod_item\",\n]);\n\nconst METHOD_PROMOTING_CONTAINER_TYPES = new Set([\n \"class_declaration\",\n \"class_definition\",\n \"interface_declaration\",\n \"impl_item\",\n \"trait_item\",\n]);\n\nexport async function extractSymbols(filePath: string, source: string): Promise<CodeSymbol[]> {\n const grammar = grammarForPath(filePath);\n if (!grammar) return [];\n const parser = await getParser(grammar);\n try {\n const tree = parser.parse(source);\n if (!tree) return [];\n const language = parser.language;\n if (!language) return [];\n const query = new Query(language, QUERIES[grammar]);\n try {\n const matches = query.matches(tree.rootNode);\n return matchesToSymbols(matches);\n } finally {\n query.delete();\n tree.delete();\n }\n } finally {\n parser.delete();\n }\n}\n\nfunction matchesToSymbols(\n matches: Array<{ captures: Array<{ name: string; node: Node }> }>,\n): CodeSymbol[] {\n const out: CodeSymbol[] = [];\n for (const match of matches) {\n let nameNode: Node | null = null;\n let containerNode: Node | null = null;\n let kind: SymbolKind | null = null;\n for (const cap of match.captures) {\n if (cap.name === \"name\") {\n nameNode = cap.node;\n } else if (KIND_CAPTURE_NAMES.has(cap.name as SymbolKind)) {\n containerNode = cap.node;\n kind = cap.name as SymbolKind;\n }\n }\n if (!nameNode || !containerNode || !kind) continue;\n const enclosing = findEnclosingContainer(containerNode);\n if (kind === \"function\" && enclosing && METHOD_PROMOTING_CONTAINER_TYPES.has(enclosing.type)) {\n kind = \"method\";\n }\n out.push({\n name: nameNode.text,\n kind,\n line: containerNode.startPosition.row + 1,\n column: containerNode.startPosition.column + 1,\n endLine: containerNode.endPosition.row + 1,\n endColumn: containerNode.endPosition.column + 1,\n parent: enclosing ? containerNameOf(enclosing) : undefined,\n });\n }\n out.sort((a, b) => a.line - b.line || a.column - b.column);\n return out;\n}\n\nfunction findEnclosingContainer(node: Node): Node | null {\n let current = node.parent;\n while (current) {\n if (PARENT_CONTAINER_TYPES.has(current.type)) return current;\n current = current.parent;\n }\n return null;\n}\n\nfunction containerNameOf(container: Node): string | undefined {\n if (container.type === \"impl_item\") {\n const typeField = container.childForFieldName(\"type\");\n if (typeField) return typeField.text;\n }\n const nameField = container.childForFieldName(\"name\");\n return nameField?.text;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -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-K4YQFULP.js";
|
|
4
|
+
import "./chunk-7YPMTE3U.js";
|
|
5
|
+
import "./chunk-36BM7INR.js";
|
|
6
|
+
import "./chunk-544J4PXD.js";
|
|
7
|
+
import "./chunk-UMZ6KHTS.js";
|
|
8
|
+
import "./chunk-3YRTIWFX.js";
|
|
9
|
+
import "./chunk-BA5R6BAE.js";
|
|
10
|
+
import "./chunk-HGK57NBN.js";
|
|
11
|
+
import "./chunk-N4SEBLU4.js";
|
|
12
|
+
import "./chunk-BOWSNGQC.js";
|
|
13
|
+
import "./chunk-C2MRSJTV.js";
|
|
14
|
+
import "./chunk-25T6CVUP.js";
|
|
15
|
+
import "./chunk-2WUEAI2I.js";
|
|
16
|
+
import "./chunk-6UNHNVJR.js";
|
|
17
|
+
import "./chunk-6XWXIVQ3.js";
|
|
18
|
+
import {
|
|
19
|
+
VERSION
|
|
20
|
+
} from "./chunk-XXC2BYTV.js";
|
|
21
|
+
import "./chunk-2UQP6H6T.js";
|
|
22
|
+
import "./chunk-DVD67FXQ.js";
|
|
23
|
+
import "./chunk-A5PBEIJ7.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-4SP3DLLH.js.map
|
package/dist/index.d.ts
CHANGED
|
@@ -26,7 +26,7 @@ declare function fetchWithRetry(fetchFn: typeof fetch, url: string, init: Reques
|
|
|
26
26
|
|
|
27
27
|
type ThemeName = "dark" | "light" | "midnight" | "deep-blue" | "high-contrast";
|
|
28
28
|
|
|
29
|
-
type LanguageCode = "EN" | "zh-CN";
|
|
29
|
+
type LanguageCode = "EN" | "zh-CN" | "de";
|
|
30
30
|
|
|
31
31
|
/** Shared exclude defaults + resolver — chunker, directory_tree, and dashboard read from here. */
|
|
32
32
|
interface IndexUserConfig {
|
|
@@ -89,6 +89,7 @@ type ToolRateLimitOption = false | ToolRateLimitConfig;
|
|
|
89
89
|
type EditMode = "review" | "auto" | "yolo" | "plan";
|
|
90
90
|
type ReasoningEffort = "low" | "medium" | "high" | "max";
|
|
91
91
|
type EngineeringLifecycleMode = "off" | "strict";
|
|
92
|
+
type HistoryScrollMode = "auto" | "native" | "app";
|
|
92
93
|
type EmbeddingProvider = "ollama" | "openai-compat";
|
|
93
94
|
interface OllamaEmbeddingUserConfig {
|
|
94
95
|
baseUrl?: string;
|
|
@@ -100,6 +101,7 @@ interface OpenAICompatEmbeddingUserConfig {
|
|
|
100
101
|
model?: string;
|
|
101
102
|
extraBody?: Record<string, unknown>;
|
|
102
103
|
batchSize?: number;
|
|
104
|
+
timeoutMs?: number;
|
|
103
105
|
}
|
|
104
106
|
interface SemanticEmbeddingUserConfig {
|
|
105
107
|
provider?: EmbeddingProvider;
|
|
@@ -190,6 +192,8 @@ interface ReasonixConfig {
|
|
|
190
192
|
mouseTracking?: boolean;
|
|
191
193
|
/** Rows scrolled per single SGR mouse-wheel report. Default 1 — most terminals emit 2-5 reports per physical notch, so 1 already produces 2-5 rows per notch (#1419). Bump to 3-5 only if your terminal emits one report per notch and scrolling feels slow (#1494). Clamped to [1, 10]. */
|
|
192
194
|
mouseWheelRows?: number;
|
|
195
|
+
/** Chat-history scrolling: "native" leaves terminal scrollback in charge; "app" captures wheel/PgUp/PgDn/End inside the TUI; "auto" enables app mode for terminals with known jumpy native scrollback. */
|
|
196
|
+
historyScrollMode?: HistoryScrollMode;
|
|
193
197
|
dashboard?: {
|
|
194
198
|
/** Whether the embedded dashboard auto-starts on launch. Default true. Set false to disable without passing --no-dashboard each time. */
|
|
195
199
|
enabled?: boolean;
|
|
@@ -216,6 +220,9 @@ interface ReasonixConfig {
|
|
|
216
220
|
showVersion?: boolean;
|
|
217
221
|
showFeedbackHint?: boolean;
|
|
218
222
|
};
|
|
223
|
+
/** Preferred display currency for costs (e.g. "USD" or "CNY"). When unset, falls back
|
|
224
|
+
* to the wallet currency if available, then defaults to CNY. */
|
|
225
|
+
costCurrency?: string;
|
|
219
226
|
projects?: {
|
|
220
227
|
[absoluteRootDir: string]: {
|
|
221
228
|
shellAllowed?: string[];
|
|
@@ -682,7 +689,11 @@ declare class InflightSet {
|
|
|
682
689
|
interface DeepSeekProbeResult {
|
|
683
690
|
reachable: boolean;
|
|
684
691
|
}
|
|
685
|
-
|
|
692
|
+
interface FormatLoopErrorOptions {
|
|
693
|
+
/** baseUrl of the upstream that just failed — picks DS vs generic wording. */
|
|
694
|
+
upstreamHost?: string;
|
|
695
|
+
}
|
|
696
|
+
declare function formatLoopError(err: Error, probe?: DeepSeekProbeResult, opts?: FormatLoopErrorOptions): string;
|
|
686
697
|
|
|
687
698
|
/** Drops both unpaired assistant.tool_calls and stray tool messages — DeepSeek 400s on either. */
|
|
688
699
|
declare function fixToolCallPairing(messages: ChatMessage[]): {
|
|
@@ -967,6 +978,8 @@ interface ToolDefinition<A = any, R = any> {
|
|
|
967
978
|
parallelSafe?: boolean;
|
|
968
979
|
/** Excluded from repeat-loop storm accounting; use only for cheap, state-inspection tools. */
|
|
969
980
|
stormExempt?: boolean;
|
|
981
|
+
/** When true, skip saving full result to disk on truncation. Use for tools that might leak secrets (get_env) or return trivial data. */
|
|
982
|
+
skipTruncationSave?: boolean;
|
|
970
983
|
fn: (args: A, ctx?: ToolCallContext) => R | Promise<R>;
|
|
971
984
|
}
|
|
972
985
|
interface ToolRegistryOptions {
|
|
@@ -1030,6 +1043,8 @@ declare class ToolRegistry {
|
|
|
1030
1043
|
confirmationGate?: PauseGate;
|
|
1031
1044
|
/** Session-scoped read tracker; filesystem tools mark on read/write, edit_file/multi_edit gate on it. */
|
|
1032
1045
|
readTracker?: ReadTracker;
|
|
1046
|
+
/** Project root directory for saving truncated results. Defaults to process.cwd(). */
|
|
1047
|
+
rootDir?: string;
|
|
1033
1048
|
}): Promise<string>;
|
|
1034
1049
|
private _augmentResult;
|
|
1035
1050
|
/** Records the failed call's fingerprint; on the 2nd consecutive identical malformed call to the same tool, returns a sharper error that tells the model to stop retrying. */
|
|
@@ -1293,8 +1308,9 @@ declare function expandAtMentions(text: string, rootDir: string, opts?: AtMentio
|
|
|
1293
1308
|
/** Reads REASONIX.md → AGENTS.md → AGENT.md (first that exists); writes prefer the file already on disk. */
|
|
1294
1309
|
/** Default WRITE target — created when no candidate exists yet. */
|
|
1295
1310
|
declare const PROJECT_MEMORY_FILE = "REASONIX.md";
|
|
1296
|
-
/** READ candidates, in priority order. AGENTS.md is the open spec at agents.md (Linux Foundation).
|
|
1297
|
-
|
|
1311
|
+
/** READ candidates, in priority order. AGENTS.md is the open spec at agents.md (Linux Foundation).
|
|
1312
|
+
* CLAUDE.md candidates support migration from Claude Code (project-root or .claude/ subdirectory). */
|
|
1313
|
+
declare const PROJECT_MEMORY_FILES: readonly ["REASONIX.md", ".claude/CLAUDE.md", "CLAUDE.md", "AGENTS.md", "AGENT.md"];
|
|
1298
1314
|
declare const PROJECT_MEMORY_MAX_CHARS = 8000;
|
|
1299
1315
|
/** Absolute path of the first PROJECT_MEMORY_FILES candidate that exists at rootDir, or null. */
|
|
1300
1316
|
declare function findProjectMemoryPath(rootDir: string): string | null;
|
|
@@ -1841,6 +1857,8 @@ interface SessionInfo {
|
|
|
1841
1857
|
messageCount: number;
|
|
1842
1858
|
mtime: Date;
|
|
1843
1859
|
meta: SessionMeta;
|
|
1860
|
+
/** How this item matched a workspace-scoped list. */
|
|
1861
|
+
workspaceStatus?: "matched" | "legacy_missing_meta";
|
|
1844
1862
|
}
|
|
1845
1863
|
interface SessionMeta {
|
|
1846
1864
|
branch?: string;
|
|
@@ -1868,6 +1886,7 @@ declare function loadSessionMessages(name: string): ChatMessage[];
|
|
|
1868
1886
|
declare function appendSessionMessage(name: string, message: ChatMessage): void;
|
|
1869
1887
|
declare function listSessions(opts?: {
|
|
1870
1888
|
workspaceFilter?: string;
|
|
1889
|
+
includeLegacyWorkspaceMatches?: boolean;
|
|
1871
1890
|
}): SessionInfo[];
|
|
1872
1891
|
declare function deleteSession(name: string): boolean;
|
|
1873
1892
|
|
|
@@ -2395,9 +2414,9 @@ interface FlattenOptions {
|
|
|
2395
2414
|
}
|
|
2396
2415
|
declare function flattenMcpResult(result: CallToolResult, opts?: FlattenOptions): string;
|
|
2397
2416
|
/** Head + 1KB tail so error messages at end of stack traces aren't lost. */
|
|
2398
|
-
declare function truncateForModel(s: string, maxChars: number): string;
|
|
2417
|
+
declare function truncateForModel(s: string, maxChars: number, extraNote?: string): string;
|
|
2399
2418
|
/** Never tokenizes full input — pathological repetitive text (`AAAA…`) costs 30s+ on the pure-TS BPE port. */
|
|
2400
|
-
declare function truncateForModelByTokens(s: string, maxTokens: number): string;
|
|
2419
|
+
declare function truncateForModelByTokens(s: string, maxTokens: number, extraNote?: string): string;
|
|
2401
2420
|
|
|
2402
2421
|
/** Unsupported list methods surface as `{supported:false}` instead of throwing — minimal servers still get a clean report. */
|
|
2403
2422
|
|