reasonix 0.40.0 → 0.43.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/README.md +47 -16
- package/README.zh-CN.md +19 -13
- package/dashboard/app.css +8 -4
- package/dashboard/dist/app.js +377 -227
- package/dashboard/dist/app.js.map +1 -1
- package/dist/cli/acp-DAGPCVFZ.js +713 -0
- package/dist/cli/acp-DAGPCVFZ.js.map +1 -0
- package/dist/cli/chat-7ES4IBNH.js +50 -0
- package/dist/cli/{chunk-E46ECXJD.js → chunk-2425HK6U.js} +2 -1
- package/dist/cli/{chunk-E46ECXJD.js.map → chunk-2425HK6U.js.map} +1 -1
- package/dist/cli/chunk-25T6CVUP.js +172 -0
- package/dist/cli/chunk-25T6CVUP.js.map +1 -0
- package/dist/cli/{chunk-7DLHHBGN.js → chunk-2K65GZBT.js} +16 -5
- package/dist/cli/chunk-2K65GZBT.js.map +1 -0
- package/dist/cli/{chunk-KMWKGPFZ.js → chunk-2KDUS647.js} +14 -4
- package/dist/cli/chunk-2KDUS647.js.map +1 -0
- package/dist/cli/chunk-2R4QCDOZ.js +11392 -0
- package/dist/cli/chunk-2R4QCDOZ.js.map +1 -0
- package/dist/cli/{chunk-3Q3C4W66.js → chunk-2UQP6H6T.js} +2 -1
- package/dist/cli/{chunk-3Q3C4W66.js.map → chunk-2UQP6H6T.js.map} +1 -1
- package/dist/cli/chunk-2Z35JOA4.js +96 -0
- package/dist/cli/chunk-2Z35JOA4.js.map +1 -0
- package/dist/cli/chunk-32TIKD5U.js +54 -0
- package/dist/cli/{chunk-JWCTX5S4.js.map → chunk-32TIKD5U.js.map} +1 -1
- package/dist/cli/{chunk-UVRXTSK3.js → chunk-3BXRZFWS.js} +65 -3
- package/dist/cli/chunk-3BXRZFWS.js.map +1 -0
- package/dist/cli/chunk-3Z6IBU3D.js +249 -0
- package/dist/cli/chunk-3Z6IBU3D.js.map +1 -0
- package/dist/cli/{chunk-VLNRQMCI.js → chunk-45U62RI3.js} +12 -5
- package/dist/cli/chunk-45U62RI3.js.map +1 -0
- package/dist/cli/{chunk-5GKJLNP2.js → chunk-4QUNBQQ2.js} +3 -2
- package/dist/cli/{chunk-5GKJLNP2.js.map → chunk-4QUNBQQ2.js.map} +1 -1
- package/dist/cli/{chunk-R4YTW7PR.js → chunk-5JJRUIPA.js} +57 -12
- package/dist/cli/chunk-5JJRUIPA.js.map +1 -0
- package/dist/cli/{chunk-HCC42PEI.js → chunk-6AK4EY3D.js} +12 -6
- package/dist/cli/chunk-6AK4EY3D.js.map +1 -0
- package/dist/cli/chunk-6G3CUUFG.js +34320 -0
- package/dist/cli/chunk-6G3CUUFG.js.map +1 -0
- package/dist/cli/{chunk-XST7BSZJ.js → chunk-6PBZN4VI.js} +21 -3
- package/dist/cli/chunk-6PBZN4VI.js.map +1 -0
- package/dist/cli/{chunk-A5LSGEEK.js → chunk-6PZ3CXBP.js} +88 -66
- package/dist/cli/chunk-6PZ3CXBP.js.map +1 -0
- package/dist/cli/chunk-74EX7SUH.js +25293 -0
- package/dist/cli/chunk-74EX7SUH.js.map +1 -0
- package/dist/cli/{chunk-FFNOMR32.js → chunk-7O5ALB4C.js} +3 -2
- package/dist/cli/{chunk-FFNOMR32.js.map → chunk-7O5ALB4C.js.map} +1 -1
- package/dist/cli/{chunk-UCMTWZKU.js → chunk-DOYHN4KB.js} +3 -2
- package/dist/cli/{chunk-UCMTWZKU.js.map → chunk-DOYHN4KB.js.map} +1 -1
- package/dist/cli/{chunk-XJLZ4HKU.js → chunk-F3PXYSNN.js} +3 -2
- package/dist/cli/{chunk-XJLZ4HKU.js.map → chunk-F3PXYSNN.js.map} +1 -1
- package/dist/cli/{chunk-XHQIK7B6.js → chunk-FHOGSSCH.js} +4 -3
- package/dist/cli/{chunk-XHQIK7B6.js.map → chunk-FHOGSSCH.js.map} +1 -1
- package/dist/cli/{chunk-IYF36OCJ.js → chunk-H6PS7IUE.js} +3 -2
- package/dist/cli/{chunk-IYF36OCJ.js.map → chunk-H6PS7IUE.js.map} +1 -1
- package/dist/cli/{chunk-ZTLZO42A.js → chunk-HFEAY5DT.js} +3 -2
- package/dist/cli/{chunk-ZTLZO42A.js.map → chunk-HFEAY5DT.js.map} +1 -1
- package/dist/cli/{chunk-FWGEHRB7.js → chunk-J5XJHLWM.js} +2 -1
- package/dist/cli/{chunk-FWGEHRB7.js.map → chunk-J5XJHLWM.js.map} +1 -1
- package/dist/cli/chunk-JMBMLOBP.js +26 -0
- package/dist/cli/chunk-JMBMLOBP.js.map +1 -0
- package/dist/cli/{chunk-SZH34P45.js → chunk-O52OLQL3.js} +52 -18
- package/dist/cli/chunk-O52OLQL3.js.map +1 -0
- package/dist/cli/{chunk-4DCHFFEY.js → chunk-OSZC7C6F.js} +3 -2
- package/dist/cli/{chunk-4DCHFFEY.js.map → chunk-OSZC7C6F.js.map} +1 -1
- package/dist/cli/chunk-P7EKE5ZQ.js +60641 -0
- package/dist/cli/chunk-P7EKE5ZQ.js.map +1 -0
- package/dist/cli/{chunk-FM57FNPJ.js → chunk-PLHAZOLZ.js} +2 -1
- package/dist/cli/{chunk-FM57FNPJ.js.map → chunk-PLHAZOLZ.js.map} +1 -1
- package/dist/cli/{chunk-RFX7TYVV.js → chunk-PQXPXJBJ.js} +16 -2
- package/dist/cli/chunk-PQXPXJBJ.js.map +1 -0
- package/dist/cli/{chunk-DAEAAVDF.js → chunk-PV55UMTO.js} +2 -1
- package/dist/cli/{chunk-DAEAAVDF.js.map → chunk-PV55UMTO.js.map} +1 -1
- package/dist/cli/{chunk-H7PHYVPM.js → chunk-RE4RAVFF.js} +85 -14
- package/dist/cli/chunk-RE4RAVFF.js.map +1 -0
- package/dist/cli/chunk-S4XVGLRW.js +499 -0
- package/dist/cli/chunk-S4XVGLRW.js.map +1 -0
- package/dist/cli/{chunk-WJ3YX4PZ.js → chunk-SZ5XES2N.js} +3 -2
- package/dist/cli/{chunk-WJ3YX4PZ.js.map → chunk-SZ5XES2N.js.map} +1 -1
- package/dist/cli/{chunk-4X3NY5ZM.js → chunk-TJX6BFZZ.js} +16 -9
- package/dist/cli/{chunk-4X3NY5ZM.js.map → chunk-TJX6BFZZ.js.map} +1 -1
- package/dist/cli/chunk-TUK7OWJA.js +51 -0
- package/dist/cli/{chunk-WKOMCPXP.js → chunk-VK5HG73G.js} +26 -17
- package/dist/cli/chunk-VK5HG73G.js.map +1 -0
- package/dist/cli/{chunk-CLAN6PVH.js → chunk-XCGGEJTI.js} +21 -8
- package/dist/cli/chunk-XCGGEJTI.js.map +1 -0
- package/dist/cli/{chunk-SOZE7V7V.js → chunk-XJXDHAES.js} +3 -2
- package/dist/cli/{chunk-SOZE7V7V.js.map → chunk-XJXDHAES.js.map} +1 -1
- package/dist/cli/chunk-XPDVG52A.js +2648 -0
- package/dist/cli/chunk-XPDVG52A.js.map +1 -0
- package/dist/cli/{chunk-CRPQUBP6.js → chunk-XXC2BYTV.js} +2 -1
- package/dist/cli/{chunk-CRPQUBP6.js.map → chunk-XXC2BYTV.js.map} +1 -1
- package/dist/cli/{chunk-AVB3WZWU.js → chunk-YFGF5NKA.js} +17 -14
- package/dist/cli/{chunk-AVB3WZWU.js.map → chunk-YFGF5NKA.js.map} +1 -1
- package/dist/cli/{chunk-ORM6PK57.js → chunk-YQ6NTIIE.js} +2 -1
- package/dist/cli/{chunk-ORM6PK57.js.map → chunk-YQ6NTIIE.js.map} +1 -1
- package/dist/cli/{chunk-ULBW7DYL.js → chunk-YYQAUTTN.js} +3 -2
- package/dist/cli/{chunk-ULBW7DYL.js.map → chunk-YYQAUTTN.js.map} +1 -1
- package/dist/cli/chunk-ZZM6QJ4W.js +109 -0
- package/dist/cli/chunk-ZZM6QJ4W.js.map +1 -0
- package/dist/cli/code-SMKEW6CD.js +154 -0
- package/dist/cli/code-SMKEW6CD.js.map +1 -0
- package/dist/cli/{commands-FQZOBLLZ.js → commands-FVVB5FZF.js} +7 -5
- package/dist/cli/{commands-FQZOBLLZ.js.map → commands-FVVB5FZF.js.map} +1 -1
- package/dist/cli/{commit-ZS24SHPG.js → commit-HE4VSPZ7.js} +7 -4
- package/dist/cli/{commit-ZS24SHPG.js.map → commit-HE4VSPZ7.js.map} +1 -1
- package/dist/cli/{desktop-6OLENOOO.js → desktop-Q7NDXCON.js} +379 -72
- package/dist/cli/desktop-Q7NDXCON.js.map +1 -0
- package/dist/cli/devtools-YECO25QO.js +3719 -0
- package/dist/cli/devtools-YECO25QO.js.map +1 -0
- package/dist/cli/diff-435UTPC5.js +165 -0
- package/dist/cli/{diff-2VUKNGEI.js.map → diff-435UTPC5.js.map} +1 -1
- package/dist/cli/doctor-OT7KH75K.js +27 -0
- package/dist/cli/{events-APSVNROZ.js → events-XEFAD5VX.js} +6 -4
- package/dist/cli/{events-APSVNROZ.js.map → events-XEFAD5VX.js.map} +1 -1
- package/dist/cli/index.js +3233 -123
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/{mcp-DCKOE5RF.js → mcp-WUL2WO75.js} +6 -4
- package/dist/cli/{mcp-DCKOE5RF.js.map → mcp-WUL2WO75.js.map} +1 -1
- package/dist/cli/{mcp-browse-D6GBP5RQ.js → mcp-browse-RR7R4XET.js} +34 -19
- package/dist/cli/mcp-browse-RR7R4XET.js.map +1 -0
- package/dist/cli/{mcp-inspect-KFGFPJ3E.js → mcp-inspect-REGLYBWT.js} +9 -8
- package/dist/cli/{mcp-inspect-KFGFPJ3E.js.map → mcp-inspect-REGLYBWT.js.map} +1 -1
- package/dist/cli/package.json +3 -0
- package/dist/cli/prompt-UW6EFLVR.js +16 -0
- package/dist/cli/{prune-sessions-LV33R47N.js → prune-sessions-3RWUBYRS.js} +4 -2
- package/dist/cli/{prune-sessions-LV33R47N.js.map → prune-sessions-3RWUBYRS.js.map} +1 -1
- package/dist/cli/{replay-WFCYX7XF.js → replay-YOURXV4C.js} +42 -30
- package/dist/cli/{replay-WFCYX7XF.js.map → replay-YOURXV4C.js.map} +1 -1
- package/dist/cli/{run-IUJYEPMT.js → run-Q6BUXV66.js} +28 -27
- package/dist/cli/{run-IUJYEPMT.js.map → run-Q6BUXV66.js.map} +1 -1
- package/dist/cli/{server-CN4QPPVJ.js → server-XGDBRWMB.js} +44 -43
- package/dist/cli/server-XGDBRWMB.js.map +1 -0
- package/dist/cli/{sessions-F5GPGTJN.js → sessions-FH7QVYSY.js} +22 -19
- package/dist/cli/{sessions-F5GPGTJN.js.map → sessions-FH7QVYSY.js.map} +1 -1
- package/dist/cli/setup-VDS6SVEP.js +618 -0
- package/dist/cli/setup-VDS6SVEP.js.map +1 -0
- package/dist/cli/stats-MQVI2XQH.js +14 -0
- package/dist/cli/update-6ITLPRDV.js +15 -0
- package/dist/cli/update-6ITLPRDV.js.map +1 -0
- package/dist/cli/version-DAHGZY5N.js +33 -0
- package/dist/cli/{version-KQUPV6T5.js.map → version-DAHGZY5N.js.map} +1 -1
- package/dist/index.d.ts +157 -103
- package/dist/index.js +597 -178
- package/dist/index.js.map +1 -1
- package/package.json +2 -1
- package/dist/cli/chat-G7CUW4ZI.js +0 -45
- package/dist/cli/chunk-26UDIXLD.js +0 -16481
- package/dist/cli/chunk-26UDIXLD.js.map +0 -1
- package/dist/cli/chunk-4YV2GBYG.js +0 -5237
- package/dist/cli/chunk-4YV2GBYG.js.map +0 -1
- package/dist/cli/chunk-5X7LZJDE.js +0 -36
- package/dist/cli/chunk-5X7LZJDE.js.map +0 -1
- package/dist/cli/chunk-7DLHHBGN.js.map +0 -1
- package/dist/cli/chunk-A5LSGEEK.js.map +0 -1
- package/dist/cli/chunk-AFFZF3MW.js +0 -36
- package/dist/cli/chunk-AFFZF3MW.js.map +0 -1
- package/dist/cli/chunk-CLAN6PVH.js.map +0 -1
- package/dist/cli/chunk-CPOV2O73.js +0 -39
- package/dist/cli/chunk-CPOV2O73.js.map +0 -1
- package/dist/cli/chunk-CPTZ5OHX.js +0 -18
- package/dist/cli/chunk-CPTZ5OHX.js.map +0 -1
- package/dist/cli/chunk-CZSJILQP.js +0 -854
- package/dist/cli/chunk-CZSJILQP.js.map +0 -1
- package/dist/cli/chunk-H7PHYVPM.js.map +0 -1
- package/dist/cli/chunk-HCC42PEI.js.map +0 -1
- package/dist/cli/chunk-JWCTX5S4.js +0 -46
- package/dist/cli/chunk-KMWKGPFZ.js.map +0 -1
- package/dist/cli/chunk-MRLXEMZ7.js +0 -26
- package/dist/cli/chunk-MRLXEMZ7.js.map +0 -1
- package/dist/cli/chunk-R4YTW7PR.js.map +0 -1
- package/dist/cli/chunk-RFX7TYVV.js.map +0 -1
- package/dist/cli/chunk-SZH34P45.js.map +0 -1
- package/dist/cli/chunk-UVRXTSK3.js.map +0 -1
- package/dist/cli/chunk-VLNRQMCI.js.map +0 -1
- package/dist/cli/chunk-WKOMCPXP.js.map +0 -1
- package/dist/cli/chunk-XST7BSZJ.js.map +0 -1
- package/dist/cli/code-YQGVLIT2.js +0 -147
- package/dist/cli/code-YQGVLIT2.js.map +0 -1
- package/dist/cli/desktop-6OLENOOO.js.map +0 -1
- package/dist/cli/diff-2VUKNGEI.js +0 -153
- package/dist/cli/doctor-JO2WNN6C.js +0 -24
- package/dist/cli/mcp-browse-D6GBP5RQ.js.map +0 -1
- package/dist/cli/prompt-PKCCLLAD.js +0 -13
- package/dist/cli/server-CN4QPPVJ.js.map +0 -1
- package/dist/cli/setup-WWMDBPSB.js +0 -516
- package/dist/cli/setup-WWMDBPSB.js.map +0 -1
- package/dist/cli/stats-5RJCATCE.js +0 -12
- package/dist/cli/update-GUCWB4UN.js +0 -13
- package/dist/cli/version-KQUPV6T5.js +0 -30
- /package/dist/cli/{chat-G7CUW4ZI.js.map → chat-7ES4IBNH.js.map} +0 -0
- /package/dist/cli/{doctor-JO2WNN6C.js.map → chunk-TUK7OWJA.js.map} +0 -0
- /package/dist/cli/{prompt-PKCCLLAD.js.map → doctor-OT7KH75K.js.map} +0 -0
- /package/dist/cli/{stats-5RJCATCE.js.map → prompt-UW6EFLVR.js.map} +0 -0
- /package/dist/cli/{update-GUCWB4UN.js.map → stats-MQVI2XQH.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,14 @@
|
|
|
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-OSZC7C6F.js";
|
|
7
|
+
import "./chunk-HFEAY5DT.js";
|
|
8
|
+
import "./chunk-YQ6NTIIE.js";
|
|
9
|
+
import "./chunk-TUK7OWJA.js";
|
|
10
|
+
export {
|
|
11
|
+
renderDashboard,
|
|
12
|
+
statsCommand
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=stats-MQVI2XQH.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 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","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-2R4QCDOZ.js";
|
|
4
|
+
import "./chunk-F3PXYSNN.js";
|
|
5
|
+
import "./chunk-FHOGSSCH.js";
|
|
6
|
+
import "./chunk-6AK4EY3D.js";
|
|
7
|
+
import "./chunk-5JJRUIPA.js";
|
|
8
|
+
import "./chunk-PV55UMTO.js";
|
|
9
|
+
import "./chunk-2KDUS647.js";
|
|
10
|
+
import "./chunk-25T6CVUP.js";
|
|
11
|
+
import "./chunk-2UQP6H6T.js";
|
|
12
|
+
import "./chunk-O52OLQL3.js";
|
|
13
|
+
import "./chunk-2K65GZBT.js";
|
|
14
|
+
import "./chunk-7O5ALB4C.js";
|
|
15
|
+
import "./chunk-S4XVGLRW.js";
|
|
16
|
+
import "./chunk-6PBZN4VI.js";
|
|
17
|
+
import "./chunk-RE4RAVFF.js";
|
|
18
|
+
import "./chunk-XPDVG52A.js";
|
|
19
|
+
import "./chunk-HFEAY5DT.js";
|
|
20
|
+
import "./chunk-YQ6NTIIE.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-DAHGZY5N.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":"
|
|
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
|
@@ -605,6 +605,8 @@ type EventRole = "assistant_delta" | "assistant_final"
|
|
|
605
605
|
| "tool_call_delta"
|
|
606
606
|
/** Pre-dispatch ping so the TUI can show a spinner during long tool awaits. */
|
|
607
607
|
| "tool_start" | "tool" | "done" | "error" | "warning"
|
|
608
|
+
/** Loop reached its pause interval; state is on disk under `sessionName`, caller may resume. */
|
|
609
|
+
| "paused"
|
|
608
610
|
/** Transient indicator for silent phases; UI clears on next primary event. */
|
|
609
611
|
| "status";
|
|
610
612
|
interface LoopEvent {
|
|
@@ -628,6 +630,12 @@ interface LoopEvent {
|
|
|
628
630
|
error?: string;
|
|
629
631
|
/** Display-only — code-mode applier MUST skip SEARCH/REPLACE in forced-summary text. */
|
|
630
632
|
forcedSummary?: boolean;
|
|
633
|
+
/** Set on `role === "paused"` — the session name caller passes back as `resume_session` to continue. */
|
|
634
|
+
sessionName?: string;
|
|
635
|
+
/** Set on `role === "paused"` — iter count consumed before pausing. */
|
|
636
|
+
pausedAtIter?: number;
|
|
637
|
+
/** Set on `role === "paused"` — one-shot no-tools summary of progress / remaining / blockers, for the parent's resume decision. */
|
|
638
|
+
partialSummary?: string;
|
|
631
639
|
}
|
|
632
640
|
|
|
633
641
|
interface ImmutablePrefixOptions {
|
|
@@ -636,13 +644,16 @@ interface ImmutablePrefixOptions {
|
|
|
636
644
|
fewShots?: readonly ChatMessage[];
|
|
637
645
|
}
|
|
638
646
|
declare class ImmutablePrefix {
|
|
639
|
-
|
|
647
|
+
/** Stable across turns; rebuilt only on /new when REASONIX.md changed on disk. */
|
|
648
|
+
system: string;
|
|
640
649
|
/** Each `addTool` costs one cache-miss turn — DeepSeek's prefix cache is keyed by full tool list. */
|
|
641
650
|
private _toolSpecs;
|
|
642
651
|
readonly fewShots: readonly ChatMessage[];
|
|
643
|
-
/** Invalidated
|
|
652
|
+
/** Invalidated by addTool / removeTool / replaceSystem; bypassing any of those leaves cache stale → fingerprint diverges from sent prefix. */
|
|
644
653
|
private _fingerprintCache;
|
|
645
654
|
constructor(opts: ImmutablePrefixOptions);
|
|
655
|
+
/** Replaces the system prompt; returns true iff the string actually changed. Caller must accept a cache miss on the next turn. */
|
|
656
|
+
replaceSystem(s: string): boolean;
|
|
646
657
|
get toolSpecs(): readonly ToolSpec[];
|
|
647
658
|
toMessages(): ChatMessage[];
|
|
648
659
|
tools(): ToolSpec[];
|
|
@@ -766,6 +777,10 @@ interface CacheFirstLoopOptions {
|
|
|
766
777
|
hookCwd?: string;
|
|
767
778
|
/** PauseGate bridge — defaults to singleton, injectable for tests. */
|
|
768
779
|
confirmationGate?: PauseGate;
|
|
780
|
+
/** Re-runs the prompt builder (applyMemoryStack / codeSystemPrompt) on /new so REASONIX.md edits take effect without a restart. Accepting a cache miss is the price. */
|
|
781
|
+
rebuildSystem?: () => string;
|
|
782
|
+
/** What to do when the per-step iter budget is exhausted. "summarize" (default) fires a no-tools call so the user sees an answer — right for top-level chat. "pause" yields a `paused` event leaving the session intact — right for subagents whose parent can decide to resume or accept partial state. */
|
|
783
|
+
onIterBudgetExhausted?: "summarize" | "pause";
|
|
769
784
|
}
|
|
770
785
|
interface ReconfigurableOptions {
|
|
771
786
|
model?: string;
|
|
@@ -792,12 +807,14 @@ declare class CacheFirstLoop {
|
|
|
792
807
|
/** One-shot 80% warning latch — cleared by setBudget so a bump re-arms at the new boundary. */
|
|
793
808
|
private _budgetWarned;
|
|
794
809
|
sessionName: string | null;
|
|
810
|
+
readonly onIterBudgetExhausted: "summarize" | "pause";
|
|
795
811
|
hooks: ResolvedHook[];
|
|
796
812
|
hookCwd: string;
|
|
797
813
|
/** PauseGate bridge — defaults to singleton, injectable for tests. */
|
|
798
814
|
readonly confirmationGate: PauseGate;
|
|
799
815
|
/** Number of messages that were pre-loaded from the session file. */
|
|
800
816
|
readonly resumedMessageCount: number;
|
|
817
|
+
private readonly _rebuildSystem;
|
|
801
818
|
private _turn;
|
|
802
819
|
private _streamPreference;
|
|
803
820
|
/** Threaded through HTTP + every tool dispatch so Esc cancels in-flight work, not after. */
|
|
@@ -827,10 +844,11 @@ declare class CacheFirstLoop {
|
|
|
827
844
|
appendAndPersist(message: ChatMessage): void;
|
|
828
845
|
/** Swap the just-appended assistant entry — used by self-correction to restore the original tool_calls without dropping reasoning_content. */
|
|
829
846
|
private replaceTailAssistantMessage;
|
|
830
|
-
/** "New chat" — drops in-memory messages, archives the on-disk transcript so it survives in Sessions, keeps sessionName so the prefix cache stays warm. */
|
|
847
|
+
/** "New chat" — drops in-memory messages, archives the on-disk transcript so it survives in Sessions, keeps sessionName so the prefix cache stays warm. Re-runs the system-prompt builder if one was wired (issue #778: REASONIX.md edits otherwise need a restart). */
|
|
831
848
|
clearLog(): {
|
|
832
849
|
dropped: number;
|
|
833
850
|
archived: string | null;
|
|
851
|
+
systemRebuilt: boolean;
|
|
834
852
|
};
|
|
835
853
|
configure(opts: ReconfigurableOptions): void;
|
|
836
854
|
/** `null` disables the cap; any change re-arms the 80% warning. */
|
|
@@ -848,6 +866,8 @@ declare class CacheFirstLoop {
|
|
|
848
866
|
private modelForCurrentCall;
|
|
849
867
|
/** Returns true ONLY on the tipping call — caller surfaces a one-shot warning. */
|
|
850
868
|
private noteToolFailureSignal;
|
|
869
|
+
/** A call counts as mutating when its definition reports `readOnly !== true` and any dynamic `readOnlyCheck` doesn't override that for these args. */
|
|
870
|
+
private isMutating;
|
|
851
871
|
private runOneToolCall;
|
|
852
872
|
/** Stable per-call id used as the inflight key AND threaded into tool_start / tool events so the UI matches them up. */
|
|
853
873
|
private inflightIdFor;
|
|
@@ -928,7 +948,7 @@ interface ParsedAtQuery {
|
|
|
928
948
|
}
|
|
929
949
|
/** Split `src/auth/log` → `{dir: "src/auth", filter: "log"}`; trailing slash sets `trailingSlash` and clears filter. */
|
|
930
950
|
declare function parseAtQuery(query: string): ParsedAtQuery;
|
|
931
|
-
/** Trailing-token only, anchored at end-of-input — distinct from `AT_MENTION_PATTERN` which scans all. */
|
|
951
|
+
/** Trailing-token only, anchored at end-of-input — distinct from `AT_MENTION_PATTERN` which scans all. `\p{L}\p{N}` for CJK and other non-ASCII filenames. */
|
|
932
952
|
declare const AT_PICKER_PREFIX: RegExp;
|
|
933
953
|
declare function detectAtPicker(input: string): {
|
|
934
954
|
query: string;
|
|
@@ -1012,13 +1032,137 @@ declare function memoryEnabled(): boolean;
|
|
|
1012
1032
|
/** Deterministic — same memory file always yields the same prefix hash. */
|
|
1013
1033
|
declare function applyProjectMemory(basePrompt: string, rootDir: string): string;
|
|
1014
1034
|
|
|
1035
|
+
type ThemeName = "default" | "dark" | "light" | "tokyo-night" | "github-dark" | "github-light" | "high-contrast";
|
|
1036
|
+
|
|
1037
|
+
type LanguageCode = "EN" | "zh-CN";
|
|
1038
|
+
|
|
1039
|
+
/** Shared exclude defaults + resolver — chunker, directory_tree, and dashboard read from here. */
|
|
1040
|
+
interface IndexUserConfig {
|
|
1041
|
+
excludeDirs?: string[];
|
|
1042
|
+
excludeFiles?: string[];
|
|
1043
|
+
excludeExts?: string[];
|
|
1044
|
+
excludePatterns?: string[];
|
|
1045
|
+
respectGitignore?: boolean;
|
|
1046
|
+
maxFileBytes?: number;
|
|
1047
|
+
}
|
|
1048
|
+
|
|
1049
|
+
/** Library reads only DEEPSEEK_API_KEY from env; the CLI bridges config.json → env var. */
|
|
1050
|
+
|
|
1051
|
+
/** Legacy `fast|smart|max` kept for back-compat with existing config.json files. */
|
|
1052
|
+
type PresetName = "auto" | "flash" | "pro" | "fast" | "smart" | "max";
|
|
1053
|
+
/** Single trust dial: review queues edits + gates shell; auto applies + gates shell; yolo skips both gates. */
|
|
1054
|
+
type EditMode = "review" | "auto" | "yolo";
|
|
1055
|
+
type ReasoningEffort = "high" | "max";
|
|
1056
|
+
type EmbeddingProvider = "ollama" | "openai-compat";
|
|
1057
|
+
interface OllamaEmbeddingUserConfig {
|
|
1058
|
+
baseUrl?: string;
|
|
1059
|
+
model?: string;
|
|
1060
|
+
}
|
|
1061
|
+
interface OpenAICompatEmbeddingUserConfig {
|
|
1062
|
+
baseUrl?: string;
|
|
1063
|
+
apiKey?: string;
|
|
1064
|
+
model?: string;
|
|
1065
|
+
extraBody?: Record<string, unknown>;
|
|
1066
|
+
}
|
|
1067
|
+
interface SemanticEmbeddingUserConfig {
|
|
1068
|
+
provider?: EmbeddingProvider;
|
|
1069
|
+
ollama?: OllamaEmbeddingUserConfig;
|
|
1070
|
+
openaiCompat?: OpenAICompatEmbeddingUserConfig;
|
|
1071
|
+
}
|
|
1072
|
+
interface ReasonixConfig {
|
|
1073
|
+
apiKey?: string;
|
|
1074
|
+
baseUrl?: string;
|
|
1075
|
+
lang?: LanguageCode;
|
|
1076
|
+
preset?: PresetName;
|
|
1077
|
+
editMode?: EditMode;
|
|
1078
|
+
editModeHintShown?: boolean;
|
|
1079
|
+
mouseClipboardHintShown?: boolean;
|
|
1080
|
+
reasoningEffort?: ReasoningEffort;
|
|
1081
|
+
/** Default workspace root for the desktop client. CLI uses cwd. */
|
|
1082
|
+
workspaceDir?: string;
|
|
1083
|
+
/** Last N workspace paths the desktop client has opened, most recent first. */
|
|
1084
|
+
recentWorkspaces?: string[];
|
|
1085
|
+
/** Desktop only — `openWith` value for clicking file links. Empty/undefined = OS default app. Examples: "code", "cursor", "C:\\path\\to\\editor.exe". */
|
|
1086
|
+
editor?: string;
|
|
1087
|
+
theme?: ThemeName | "auto";
|
|
1088
|
+
/** Stored as `--mcp`-format strings so one parser handles both flag and config. */
|
|
1089
|
+
mcp?: string[];
|
|
1090
|
+
/** Names of servers in `mcp` to skip on bridge — see `/mcp disable <name>`. */
|
|
1091
|
+
mcpDisabled?: string[];
|
|
1092
|
+
/** Env overlay per MCP server name (matches the `name=` prefix of the spec). Stdio transports merge this over process.env; SSE/HTTP ignore it. */
|
|
1093
|
+
mcpEnv?: Record<string, Record<string, string>>;
|
|
1094
|
+
session?: string | null;
|
|
1095
|
+
setupCompleted?: boolean;
|
|
1096
|
+
search?: boolean;
|
|
1097
|
+
/** Web search engine backend: "mojeek" (default, scrapes Mojeek) or "searxng" (self-hosted SearXNG). */
|
|
1098
|
+
webSearchEngine?: "mojeek" | "searxng";
|
|
1099
|
+
/** Base URL for SearXNG instance (default http://localhost:8080). */
|
|
1100
|
+
webSearchEndpoint?: string;
|
|
1101
|
+
dashboard?: {
|
|
1102
|
+
/** Pin the embedded dashboard to a fixed port — required for stable SSH tunnels. 0/absent → ephemeral. */
|
|
1103
|
+
port?: number;
|
|
1104
|
+
};
|
|
1105
|
+
escalation?: {
|
|
1106
|
+
/** Per-turn repair/error signal count required to escalate flash→pro. Defaults to 3. Out-of-range → default. */
|
|
1107
|
+
failureThreshold?: number;
|
|
1108
|
+
};
|
|
1109
|
+
/** Per-field visibility toggles for the bottom status row. All default to true (visible). */
|
|
1110
|
+
statusBar?: {
|
|
1111
|
+
showBalance?: boolean;
|
|
1112
|
+
showSessionCost?: boolean;
|
|
1113
|
+
showTurnCost?: boolean;
|
|
1114
|
+
showCacheHit?: boolean;
|
|
1115
|
+
showCtxUsage?: boolean;
|
|
1116
|
+
showVersion?: boolean;
|
|
1117
|
+
showFeedbackHint?: boolean;
|
|
1118
|
+
};
|
|
1119
|
+
projects?: {
|
|
1120
|
+
[absoluteRootDir: string]: {
|
|
1121
|
+
shellAllowed?: string[];
|
|
1122
|
+
/** Absolute directory prefixes the user pre-approved for outside-sandbox file access (#684). */
|
|
1123
|
+
pathAllowed?: string[];
|
|
1124
|
+
};
|
|
1125
|
+
};
|
|
1126
|
+
index?: IndexUserConfig;
|
|
1127
|
+
semantic?: SemanticEmbeddingUserConfig;
|
|
1128
|
+
/** 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. */
|
|
1129
|
+
memory?: {
|
|
1130
|
+
customTypes?: CustomMemoryTypeConfig[];
|
|
1131
|
+
};
|
|
1132
|
+
}
|
|
1133
|
+
interface CustomMemoryTypeConfig {
|
|
1134
|
+
name: string;
|
|
1135
|
+
description?: string;
|
|
1136
|
+
priority?: "low" | "medium" | "high";
|
|
1137
|
+
expires?: "project_end";
|
|
1138
|
+
}
|
|
1139
|
+
declare function defaultConfigPath(): string;
|
|
1140
|
+
declare function readConfig(path?: string): ReasonixConfig;
|
|
1141
|
+
declare function writeConfig(cfg: ReasonixConfig, path?: string): void;
|
|
1142
|
+
/** Resolve the API key from env var first, then the config file. */
|
|
1143
|
+
declare function loadApiKey(path?: string): string | undefined;
|
|
1144
|
+
/** env > config > undefined. Client falls back to api.deepseek.com when undefined. */
|
|
1145
|
+
declare function loadBaseUrl(path?: string): string | undefined;
|
|
1146
|
+
declare function saveBaseUrl(url: string, path?: string): void;
|
|
1147
|
+
declare function saveApiKey(key: string, path?: string): void;
|
|
1148
|
+
/** Self-hosted DeepSeek-compatible endpoints may issue any token shape, so we only typo-guard here — the real auth check is the first API call against `baseUrl`. */
|
|
1149
|
+
declare function isPlausibleKey(key: string): boolean;
|
|
1150
|
+
/** Mask a key for display: `sk-abcd...wxyz`. */
|
|
1151
|
+
declare function redactKey(key: string): string;
|
|
1152
|
+
|
|
1015
1153
|
/** User-private memory pinned into the immutable prefix; distinct from committable REASONIX.md. */
|
|
1154
|
+
|
|
1016
1155
|
declare const USER_MEMORY_DIR = "memory";
|
|
1017
1156
|
declare const MEMORY_INDEX_FILE = "MEMORY.md";
|
|
1018
1157
|
/** Cap on the index file content loaded into the prefix, per scope. */
|
|
1019
1158
|
declare const MEMORY_INDEX_MAX_CHARS = 4000;
|
|
1020
|
-
|
|
1159
|
+
declare const BUILTIN_MEMORY_TYPES: readonly ["user", "feedback", "project", "reference"];
|
|
1160
|
+
type BuiltinMemoryType = (typeof BUILTIN_MEMORY_TYPES)[number];
|
|
1161
|
+
/** Built-ins plus any string declared in `config.memory.customTypes`. Unknown values are accepted (round-tripped verbatim). */
|
|
1162
|
+
type MemoryType = BuiltinMemoryType | (string & {});
|
|
1021
1163
|
type MemoryScope = "global" | "project";
|
|
1164
|
+
type MemoryPriority = "low" | "medium" | "high";
|
|
1165
|
+
type MemoryExpires = "project_end";
|
|
1022
1166
|
interface MemoryEntry {
|
|
1023
1167
|
name: string;
|
|
1024
1168
|
type: MemoryType;
|
|
@@ -1027,6 +1171,10 @@ interface MemoryEntry {
|
|
|
1027
1171
|
body: string;
|
|
1028
1172
|
/** ISO date string (YYYY-MM-DD). */
|
|
1029
1173
|
createdAt: string;
|
|
1174
|
+
/** Explicit per-entry priority; absent → resolve from config default for `type`, else "medium". */
|
|
1175
|
+
priority?: MemoryPriority;
|
|
1176
|
+
/** Lifecycle hint. `project_end` → cleared by `/memory clear project`. */
|
|
1177
|
+
expires?: MemoryExpires;
|
|
1030
1178
|
}
|
|
1031
1179
|
interface MemoryStoreOptions {
|
|
1032
1180
|
/** Override `~/.reasonix` — tests set this to a tmpdir. */
|
|
@@ -1040,6 +1188,8 @@ interface WriteInput {
|
|
|
1040
1188
|
scope: MemoryScope;
|
|
1041
1189
|
description: string;
|
|
1042
1190
|
body: string;
|
|
1191
|
+
priority?: MemoryPriority;
|
|
1192
|
+
expires?: MemoryExpires;
|
|
1043
1193
|
}
|
|
1044
1194
|
/** Throws on path-injection (../, /, leading dot). Allowed: 3-40 chars, alnum/_/-, interior `.`. */
|
|
1045
1195
|
declare function sanitizeMemoryName(raw: string): string;
|
|
@@ -1074,6 +1224,7 @@ declare class MemoryStore {
|
|
|
1074
1224
|
declare function applyUserMemory(basePrompt: string, opts?: {
|
|
1075
1225
|
homeDir?: string;
|
|
1076
1226
|
projectRoot?: string;
|
|
1227
|
+
cfg?: ReasonixConfig;
|
|
1077
1228
|
}): string;
|
|
1078
1229
|
declare function applyMemoryStack(basePrompt: string, rootDir: string): string;
|
|
1079
1230
|
|
|
@@ -1273,6 +1424,7 @@ declare class JobRegistry {
|
|
|
1273
1424
|
}): JobReadResult | null;
|
|
1274
1425
|
waitForJob(id: number, opts?: {
|
|
1275
1426
|
timeoutMs?: number;
|
|
1427
|
+
waitFor?: "exit" | "output-or-exit";
|
|
1276
1428
|
}): Promise<JobWaitResult | null>;
|
|
1277
1429
|
/** SIGTERM, wait graceMs, then SIGKILL. Idempotent on already-exited jobs. */
|
|
1278
1430
|
stop(id: number, opts?: {
|
|
@@ -2080,104 +2232,6 @@ interface CodeSystemPromptOptions {
|
|
|
2080
2232
|
}
|
|
2081
2233
|
declare function codeSystemPrompt(rootDir: string, opts?: CodeSystemPromptOptions): string;
|
|
2082
2234
|
|
|
2083
|
-
type ThemeName = "default" | "dark" | "light" | "tokyo-night" | "github-dark" | "github-light" | "high-contrast";
|
|
2084
|
-
|
|
2085
|
-
type LanguageCode = "EN" | "zh-CN";
|
|
2086
|
-
|
|
2087
|
-
/** Shared exclude defaults + resolver — chunker, directory_tree, and dashboard read from here. */
|
|
2088
|
-
interface IndexUserConfig {
|
|
2089
|
-
excludeDirs?: string[];
|
|
2090
|
-
excludeFiles?: string[];
|
|
2091
|
-
excludeExts?: string[];
|
|
2092
|
-
excludePatterns?: string[];
|
|
2093
|
-
respectGitignore?: boolean;
|
|
2094
|
-
maxFileBytes?: number;
|
|
2095
|
-
}
|
|
2096
|
-
|
|
2097
|
-
/** Library reads only DEEPSEEK_API_KEY from env; the CLI bridges config.json → env var. */
|
|
2098
|
-
|
|
2099
|
-
/** Legacy `fast|smart|max` kept for back-compat with existing config.json files. */
|
|
2100
|
-
type PresetName = "auto" | "flash" | "pro" | "fast" | "smart" | "max";
|
|
2101
|
-
/** Single trust dial: review queues edits + gates shell; auto applies + gates shell; yolo skips both gates. */
|
|
2102
|
-
type EditMode = "review" | "auto" | "yolo";
|
|
2103
|
-
type ReasoningEffort = "high" | "max";
|
|
2104
|
-
type EmbeddingProvider = "ollama" | "openai-compat";
|
|
2105
|
-
interface OllamaEmbeddingUserConfig {
|
|
2106
|
-
baseUrl?: string;
|
|
2107
|
-
model?: string;
|
|
2108
|
-
}
|
|
2109
|
-
interface OpenAICompatEmbeddingUserConfig {
|
|
2110
|
-
baseUrl?: string;
|
|
2111
|
-
apiKey?: string;
|
|
2112
|
-
model?: string;
|
|
2113
|
-
extraBody?: Record<string, unknown>;
|
|
2114
|
-
}
|
|
2115
|
-
interface SemanticEmbeddingUserConfig {
|
|
2116
|
-
provider?: EmbeddingProvider;
|
|
2117
|
-
ollama?: OllamaEmbeddingUserConfig;
|
|
2118
|
-
openaiCompat?: OpenAICompatEmbeddingUserConfig;
|
|
2119
|
-
}
|
|
2120
|
-
interface ReasonixConfig {
|
|
2121
|
-
apiKey?: string;
|
|
2122
|
-
baseUrl?: string;
|
|
2123
|
-
lang?: LanguageCode;
|
|
2124
|
-
preset?: PresetName;
|
|
2125
|
-
editMode?: EditMode;
|
|
2126
|
-
editModeHintShown?: boolean;
|
|
2127
|
-
mouseClipboardHintShown?: boolean;
|
|
2128
|
-
reasoningEffort?: ReasoningEffort;
|
|
2129
|
-
/** Default workspace root for the desktop client. CLI uses cwd. */
|
|
2130
|
-
workspaceDir?: string;
|
|
2131
|
-
/** Last N workspace paths the desktop client has opened, most recent first. */
|
|
2132
|
-
recentWorkspaces?: string[];
|
|
2133
|
-
/** Desktop only — `openWith` value for clicking file links. Empty/undefined = OS default app. Examples: "code", "cursor", "C:\\path\\to\\editor.exe". */
|
|
2134
|
-
editor?: string;
|
|
2135
|
-
theme?: ThemeName | "auto";
|
|
2136
|
-
/** Stored as `--mcp`-format strings so one parser handles both flag and config. */
|
|
2137
|
-
mcp?: string[];
|
|
2138
|
-
/** Names of servers in `mcp` to skip on bridge — see `/mcp disable <name>`. */
|
|
2139
|
-
mcpDisabled?: string[];
|
|
2140
|
-
/** Env overlay per MCP server name (matches the `name=` prefix of the spec). Stdio transports merge this over process.env; SSE/HTTP ignore it. */
|
|
2141
|
-
mcpEnv?: Record<string, Record<string, string>>;
|
|
2142
|
-
session?: string | null;
|
|
2143
|
-
setupCompleted?: boolean;
|
|
2144
|
-
search?: boolean;
|
|
2145
|
-
/** Web search engine backend: "mojeek" (default, scrapes Mojeek) or "searxng" (self-hosted SearXNG). */
|
|
2146
|
-
webSearchEngine?: "mojeek" | "searxng";
|
|
2147
|
-
/** Base URL for SearXNG instance (default http://localhost:8080). */
|
|
2148
|
-
webSearchEndpoint?: string;
|
|
2149
|
-
dashboard?: {
|
|
2150
|
-
/** Pin the embedded dashboard to a fixed port — required for stable SSH tunnels. 0/absent → ephemeral. */
|
|
2151
|
-
port?: number;
|
|
2152
|
-
};
|
|
2153
|
-
escalation?: {
|
|
2154
|
-
/** Per-turn repair/error signal count required to escalate flash→pro. Defaults to 3. Out-of-range → default. */
|
|
2155
|
-
failureThreshold?: number;
|
|
2156
|
-
};
|
|
2157
|
-
projects?: {
|
|
2158
|
-
[absoluteRootDir: string]: {
|
|
2159
|
-
shellAllowed?: string[];
|
|
2160
|
-
/** Absolute directory prefixes the user pre-approved for outside-sandbox file access (#684). */
|
|
2161
|
-
pathAllowed?: string[];
|
|
2162
|
-
};
|
|
2163
|
-
};
|
|
2164
|
-
index?: IndexUserConfig;
|
|
2165
|
-
semantic?: SemanticEmbeddingUserConfig;
|
|
2166
|
-
}
|
|
2167
|
-
declare function defaultConfigPath(): string;
|
|
2168
|
-
declare function readConfig(path?: string): ReasonixConfig;
|
|
2169
|
-
declare function writeConfig(cfg: ReasonixConfig, path?: string): void;
|
|
2170
|
-
/** Resolve the API key from env var first, then the config file. */
|
|
2171
|
-
declare function loadApiKey(path?: string): string | undefined;
|
|
2172
|
-
/** env > config > undefined. Client falls back to api.deepseek.com when undefined. */
|
|
2173
|
-
declare function loadBaseUrl(path?: string): string | undefined;
|
|
2174
|
-
declare function saveBaseUrl(url: string, path?: string): void;
|
|
2175
|
-
declare function saveApiKey(key: string, path?: string): void;
|
|
2176
|
-
/** Self-hosted DeepSeek-compatible endpoints may issue any token shape, so we only typo-guard here — the real auth check is the first API call against `baseUrl`. */
|
|
2177
|
-
declare function isPlausibleKey(key: string): boolean;
|
|
2178
|
-
/** Mask a key for display: `sk-abcd...wxyz`. */
|
|
2179
|
-
declare function redactKey(key: string): string;
|
|
2180
|
-
|
|
2181
2235
|
/** VERSION sourced from package.json so it never drifts from npm; latest-check returns null on any failure. */
|
|
2182
2236
|
/** TTL for the on-disk cache entry. 24h keeps noise low; users who
|
|
2183
2237
|
* want a fresh check can run `reasonix update` which passes
|