reasonix 0.43.0 → 0.44.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.
Files changed (169) hide show
  1. package/README.md +49 -11
  2. package/README.zh-CN.md +35 -7
  3. package/dashboard/app.css +225 -4
  4. package/dashboard/dist/app.js +6441 -6080
  5. package/dashboard/dist/app.js.map +1 -1
  6. package/data/deepseek-tokenizer.json.gz +0 -0
  7. package/dist/cli/{acp-DAGPCVFZ.js → acp-TYZ2CTDL.js} +28 -30
  8. package/dist/cli/acp-TYZ2CTDL.js.map +1 -0
  9. package/dist/cli/chat-TH7VNNCJ.js +51 -0
  10. package/dist/cli/chunk-2425HK6U.js +0 -0
  11. package/dist/cli/chunk-25T6CVUP.js +0 -0
  12. package/dist/cli/chunk-2UQP6H6T.js +0 -0
  13. package/dist/cli/{chunk-3Z6IBU3D.js → chunk-2V6EAEUW.js} +95 -31
  14. package/dist/cli/chunk-2V6EAEUW.js.map +1 -0
  15. package/dist/cli/{chunk-XCGGEJTI.js → chunk-4CTDEJUF.js} +2 -2
  16. package/dist/cli/chunk-4QUNBQQ2.js +0 -0
  17. package/dist/cli/{chunk-74EX7SUH.js → chunk-5QCB62C4.js} +33 -7
  18. package/dist/cli/{chunk-74EX7SUH.js.map → chunk-5QCB62C4.js.map} +1 -1
  19. package/dist/cli/chunk-6OWJV3YW.js +390 -0
  20. package/dist/cli/chunk-6OWJV3YW.js.map +1 -0
  21. package/dist/cli/chunk-6PBZN4VI.js +0 -0
  22. package/dist/cli/{chunk-7O5ALB4C.js → chunk-7CIGMZT3.js} +2 -2
  23. package/dist/cli/{chunk-H6PS7IUE.js → chunk-7UCMM425.js} +7 -3
  24. package/dist/cli/chunk-7UCMM425.js.map +1 -0
  25. package/dist/cli/{chunk-TJX6BFZZ.js → chunk-AB2RED3C.js} +3 -3
  26. package/dist/cli/{chunk-XPDVG52A.js → chunk-AVFXO2EZ.js} +361 -13
  27. package/dist/cli/chunk-AVFXO2EZ.js.map +1 -0
  28. package/dist/cli/{chunk-FHOGSSCH.js → chunk-C53JQES5.js} +3 -3
  29. package/dist/cli/{chunk-RE4RAVFF.js → chunk-CGDR2ELH.js} +92 -30
  30. package/dist/cli/chunk-CGDR2ELH.js.map +1 -0
  31. package/dist/cli/{chunk-OSZC7C6F.js → chunk-CWZKQ5FE.js} +7 -4
  32. package/dist/cli/chunk-CWZKQ5FE.js.map +1 -0
  33. package/dist/cli/{devtools-YECO25QO.js → chunk-FEZK652I.js} +10 -85
  34. package/dist/cli/chunk-FEZK652I.js.map +1 -0
  35. package/dist/cli/{chunk-45U62RI3.js → chunk-HNXDZGC6.js} +104 -2
  36. package/dist/cli/chunk-HNXDZGC6.js.map +1 -0
  37. package/dist/cli/chunk-J5XJHLWM.js +0 -0
  38. package/dist/cli/chunk-JMBMLOBP.js +0 -0
  39. package/dist/cli/{chunk-5JJRUIPA.js → chunk-JNAQYELD.js} +16 -8
  40. package/dist/cli/{chunk-5JJRUIPA.js.map → chunk-JNAQYELD.js.map} +1 -1
  41. package/dist/cli/{chunk-YFGF5NKA.js → chunk-KGBG6M2X.js} +19 -15
  42. package/dist/cli/chunk-KGBG6M2X.js.map +1 -0
  43. package/dist/cli/{chunk-3BXRZFWS.js → chunk-KLQTAZIY.js} +12 -4
  44. package/dist/cli/chunk-KLQTAZIY.js.map +1 -0
  45. package/dist/cli/{chunk-VK5HG73G.js → chunk-KM465GST.js} +9 -9
  46. package/dist/cli/{chunk-DOYHN4KB.js → chunk-LIR2HBQH.js} +2 -2
  47. package/dist/cli/{chunk-YYQAUTTN.js → chunk-MJ6W5UN3.js} +2 -2
  48. package/dist/cli/{chunk-6PZ3CXBP.js → chunk-MRHHQJAQ.js} +5 -4
  49. package/dist/cli/chunk-MRHHQJAQ.js.map +1 -0
  50. package/dist/cli/{chunk-PQXPXJBJ.js → chunk-NVURFF27.js} +16 -5
  51. package/dist/cli/chunk-NVURFF27.js.map +1 -0
  52. package/dist/cli/{chunk-2R4QCDOZ.js → chunk-OPFUUYHL.js} +540 -287
  53. package/dist/cli/chunk-OPFUUYHL.js.map +1 -0
  54. package/dist/cli/chunk-PLHAZOLZ.js +0 -0
  55. package/dist/cli/{chunk-HFEAY5DT.js → chunk-R3CTO2HM.js} +2 -2
  56. package/dist/cli/{chunk-O52OLQL3.js → chunk-RDRC3XDT.js} +136 -38
  57. package/dist/cli/chunk-RDRC3XDT.js.map +1 -0
  58. package/dist/cli/chunk-S4XVGLRW.js +0 -0
  59. package/dist/cli/chunk-SZ5XES2N.js +0 -0
  60. package/dist/cli/{chunk-2K65GZBT.js → chunk-TEUDEGX2.js} +64 -19
  61. package/dist/cli/chunk-TEUDEGX2.js.map +1 -0
  62. package/dist/cli/{chunk-2Z35JOA4.js → chunk-TKVXTQ3T.js} +4 -4
  63. package/dist/cli/{chunk-2Z35JOA4.js.map → chunk-TKVXTQ3T.js.map} +1 -1
  64. package/dist/cli/chunk-TUK7OWJA.js +0 -0
  65. package/dist/cli/{chunk-32TIKD5U.js → chunk-TXJMRPIL.js} +3 -3
  66. package/dist/cli/{chunk-2KDUS647.js → chunk-V26WPN3J.js} +7 -4
  67. package/dist/cli/chunk-V26WPN3J.js.map +1 -0
  68. package/dist/cli/{chunk-F3PXYSNN.js → chunk-WK3UFQY3.js} +2 -2
  69. package/dist/cli/{chunk-6G3CUUFG.js → chunk-X53B3JIX.js} +3 -3
  70. package/dist/cli/{chunk-6G3CUUFG.js.map → chunk-X53B3JIX.js.map} +1 -1
  71. package/dist/cli/chunk-XJXDHAES.js +0 -0
  72. package/dist/cli/{chunk-6AK4EY3D.js → chunk-XSU4QVFW.js} +1 -81
  73. package/dist/cli/chunk-XSU4QVFW.js.map +1 -0
  74. package/dist/cli/chunk-XXC2BYTV.js +0 -0
  75. package/dist/cli/{chunk-P7EKE5ZQ.js → chunk-Z4S7EYXG.js} +4482 -1310
  76. package/dist/cli/chunk-Z4S7EYXG.js.map +1 -0
  77. package/dist/cli/chunk-ZZM6QJ4W.js +0 -0
  78. package/dist/cli/{chunk-YQ6NTIIE.js → chunk-ZZYBBX5N.js} +13 -5
  79. package/dist/cli/chunk-ZZYBBX5N.js.map +1 -0
  80. package/dist/cli/{code-SMKEW6CD.js → code-PSVJ3KEN.js} +48 -36
  81. package/dist/cli/code-PSVJ3KEN.js.map +1 -0
  82. package/dist/cli/{commands-FVVB5FZF.js → commands-OCU42XG4.js} +4 -4
  83. package/dist/cli/{commit-HE4VSPZ7.js → commit-XCQIQCYG.js} +3 -3
  84. package/dist/cli/{desktop-Q7NDXCON.js → desktop-KWGR4BNE.js} +210 -69
  85. package/dist/cli/desktop-KWGR4BNE.js.map +1 -0
  86. package/dist/cli/devtools-HW3WDT3Q.js +91 -0
  87. package/dist/cli/devtools-HW3WDT3Q.js.map +1 -0
  88. package/dist/cli/{diff-435UTPC5.js → diff-NHANTNC3.js} +9 -9
  89. package/dist/cli/{doctor-OT7KH75K.js → doctor-CC5CLOGG.js} +10 -10
  90. package/dist/cli/events-XEFAD5VX.js +0 -0
  91. package/dist/cli/index.js +132 -94
  92. package/dist/cli/index.js.map +1 -1
  93. package/dist/cli/{mcp-WUL2WO75.js → mcp-MPVGBBJF.js} +2 -2
  94. package/dist/cli/{mcp-browse-RR7R4XET.js → mcp-browse-4XOTC3FJ.js} +3 -3
  95. package/dist/cli/{mcp-inspect-REGLYBWT.js → mcp-inspect-CEMGKKAH.js} +14 -9
  96. package/dist/cli/mcp-inspect-CEMGKKAH.js.map +1 -0
  97. package/dist/cli/{prompt-UW6EFLVR.js → prompt-2D7ID24X.js} +4 -4
  98. package/dist/cli/prune-sessions-3RWUBYRS.js +0 -0
  99. package/dist/cli/{replay-YOURXV4C.js → replay-SR44E6RS.js} +10 -10
  100. package/dist/cli/{run-Q6BUXV66.js → run-MDGL27WL.js} +35 -36
  101. package/dist/cli/run-MDGL27WL.js.map +1 -0
  102. package/dist/cli/{server-XGDBRWMB.js → server-27ARQXIZ.js} +67 -24
  103. package/dist/cli/server-27ARQXIZ.js.map +1 -0
  104. package/dist/cli/{sessions-FH7QVYSY.js → sessions-CKQXCYGP.js} +18 -18
  105. package/dist/cli/sessions-CKQXCYGP.js.map +1 -0
  106. package/dist/cli/{setup-VDS6SVEP.js → setup-TPAGSVXO.js} +6 -6
  107. package/dist/cli/{stats-MQVI2XQH.js → stats-DPUBZNVX.js} +6 -4
  108. package/dist/cli/update-6ITLPRDV.js +0 -0
  109. package/dist/cli/{version-DAHGZY5N.js → version-2X3BHVVK.js} +15 -15
  110. package/dist/index.d.ts +181 -53
  111. package/dist/index.js +1322 -533
  112. package/dist/index.js.map +1 -1
  113. package/package.json +21 -8
  114. package/dist/cli/.-3G6VX5S7.js +0 -327
  115. package/dist/cli/.-6YRPB2C7.js +0 -329
  116. package/dist/cli/.-EYSVINK3.js +0 -317
  117. package/dist/cli/acp-DAGPCVFZ.js.map +0 -1
  118. package/dist/cli/chat-7ES4IBNH.js +0 -50
  119. package/dist/cli/chunk-2K65GZBT.js.map +0 -1
  120. package/dist/cli/chunk-2KDUS647.js.map +0 -1
  121. package/dist/cli/chunk-2R4QCDOZ.js.map +0 -1
  122. package/dist/cli/chunk-3BXRZFWS.js.map +0 -1
  123. package/dist/cli/chunk-3Z6IBU3D.js.map +0 -1
  124. package/dist/cli/chunk-45U62RI3.js.map +0 -1
  125. package/dist/cli/chunk-6AK4EY3D.js.map +0 -1
  126. package/dist/cli/chunk-6PZ3CXBP.js.map +0 -1
  127. package/dist/cli/chunk-H6PS7IUE.js.map +0 -1
  128. package/dist/cli/chunk-O52OLQL3.js.map +0 -1
  129. package/dist/cli/chunk-OSZC7C6F.js.map +0 -1
  130. package/dist/cli/chunk-P7EKE5ZQ.js.map +0 -1
  131. package/dist/cli/chunk-PQXPXJBJ.js.map +0 -1
  132. package/dist/cli/chunk-PV55UMTO.js +0 -200
  133. package/dist/cli/chunk-PV55UMTO.js.map +0 -1
  134. package/dist/cli/chunk-RE4RAVFF.js.map +0 -1
  135. package/dist/cli/chunk-XPDVG52A.js.map +0 -1
  136. package/dist/cli/chunk-YFGF5NKA.js.map +0 -1
  137. package/dist/cli/chunk-YQ6NTIIE.js.map +0 -1
  138. package/dist/cli/code-SMKEW6CD.js.map +0 -1
  139. package/dist/cli/desktop-Q7NDXCON.js.map +0 -1
  140. package/dist/cli/devtools-YECO25QO.js.map +0 -1
  141. package/dist/cli/doctor-OT7KH75K.js.map +0 -1
  142. package/dist/cli/mcp-inspect-REGLYBWT.js.map +0 -1
  143. package/dist/cli/prompt-UW6EFLVR.js.map +0 -1
  144. package/dist/cli/run-Q6BUXV66.js.map +0 -1
  145. package/dist/cli/server-XGDBRWMB.js.map +0 -1
  146. package/dist/cli/sessions-FH7QVYSY.js.map +0 -1
  147. package/dist/cli/stats-MQVI2XQH.js.map +0 -1
  148. /package/dist/cli/{.-3G6VX5S7.js.map → chat-TH7VNNCJ.js.map} +0 -0
  149. /package/dist/cli/{chunk-XCGGEJTI.js.map → chunk-4CTDEJUF.js.map} +0 -0
  150. /package/dist/cli/{chunk-7O5ALB4C.js.map → chunk-7CIGMZT3.js.map} +0 -0
  151. /package/dist/cli/{chunk-TJX6BFZZ.js.map → chunk-AB2RED3C.js.map} +0 -0
  152. /package/dist/cli/{chunk-FHOGSSCH.js.map → chunk-C53JQES5.js.map} +0 -0
  153. /package/dist/cli/{chunk-VK5HG73G.js.map → chunk-KM465GST.js.map} +0 -0
  154. /package/dist/cli/{chunk-DOYHN4KB.js.map → chunk-LIR2HBQH.js.map} +0 -0
  155. /package/dist/cli/{chunk-YYQAUTTN.js.map → chunk-MJ6W5UN3.js.map} +0 -0
  156. /package/dist/cli/{chunk-HFEAY5DT.js.map → chunk-R3CTO2HM.js.map} +0 -0
  157. /package/dist/cli/{chunk-32TIKD5U.js.map → chunk-TXJMRPIL.js.map} +0 -0
  158. /package/dist/cli/{chunk-F3PXYSNN.js.map → chunk-WK3UFQY3.js.map} +0 -0
  159. /package/dist/cli/{commands-FVVB5FZF.js.map → commands-OCU42XG4.js.map} +0 -0
  160. /package/dist/cli/{commit-HE4VSPZ7.js.map → commit-XCQIQCYG.js.map} +0 -0
  161. /package/dist/cli/{diff-435UTPC5.js.map → diff-NHANTNC3.js.map} +0 -0
  162. /package/dist/cli/{.-6YRPB2C7.js.map → doctor-CC5CLOGG.js.map} +0 -0
  163. /package/dist/cli/{mcp-WUL2WO75.js.map → mcp-MPVGBBJF.js.map} +0 -0
  164. /package/dist/cli/{mcp-browse-RR7R4XET.js.map → mcp-browse-4XOTC3FJ.js.map} +0 -0
  165. /package/dist/cli/{.-EYSVINK3.js.map → prompt-2D7ID24X.js.map} +0 -0
  166. /package/dist/cli/{replay-YOURXV4C.js.map → replay-SR44E6RS.js.map} +0 -0
  167. /package/dist/cli/{setup-VDS6SVEP.js.map → setup-TPAGSVXO.js.map} +0 -0
  168. /package/dist/cli/{chat-7ES4IBNH.js.map → stats-DPUBZNVX.js.map} +0 -0
  169. /package/dist/cli/{version-DAHGZY5N.js.map → version-2X3BHVVK.js.map} +0 -0
@@ -15,7 +15,7 @@ import {
15
15
  defaultConfigPath,
16
16
  readConfig,
17
17
  writeConfig
18
- } from "./chunk-XPDVG52A.js";
18
+ } from "./chunk-AVFXO2EZ.js";
19
19
  import "./chunk-TUK7OWJA.js";
20
20
 
21
21
  // src/cli/commands/mcp.ts
@@ -274,4 +274,4 @@ export {
274
274
  mcpListCommand,
275
275
  mcpSearchCommand
276
276
  };
277
- //# sourceMappingURL=mcp-WUL2WO75.js.map
277
+ //# sourceMappingURL=mcp-MPVGBBJF.js.map
@@ -10,7 +10,7 @@ import {
10
10
  require_react,
11
11
  use_app_default,
12
12
  use_input_default
13
- } from "./chunk-6G3CUUFG.js";
13
+ } from "./chunk-X53B3JIX.js";
14
14
  import {
15
15
  loadDotenv
16
16
  } from "./chunk-2UQP6H6T.js";
@@ -23,7 +23,7 @@ import "./chunk-PLHAZOLZ.js";
23
23
  import {
24
24
  readConfig,
25
25
  writeConfig
26
- } from "./chunk-XPDVG52A.js";
26
+ } from "./chunk-AVFXO2EZ.js";
27
27
  import {
28
28
  __toESM
29
29
  } from "./chunk-TUK7OWJA.js";
@@ -175,4 +175,4 @@ async function mcpBrowseCommand(_opts = {}) {
175
175
  export {
176
176
  mcpBrowseCommand
177
177
  };
178
- //# sourceMappingURL=mcp-browse-RR7R4XET.js.map
178
+ //# sourceMappingURL=mcp-browse-4XOTC3FJ.js.map
@@ -3,25 +3,30 @@ import { createRequire as __cr } from 'node:module'; if (typeof globalThis.requi
3
3
  import {
4
4
  buildTransportFromSpec,
5
5
  preflightStdioSpec
6
- } from "./chunk-PQXPXJBJ.js";
6
+ } from "./chunk-NVURFF27.js";
7
7
  import {
8
8
  McpClient,
9
- inspectMcpServer,
10
- parseMcpSpec
11
- } from "./chunk-6AK4EY3D.js";
9
+ inspectMcpServer
10
+ } from "./chunk-XSU4QVFW.js";
12
11
  import "./chunk-25T6CVUP.js";
13
12
  import {
14
- mcpEnvFor,
13
+ normalizeMcpConfig,
14
+ overlayMatchedSpec,
15
+ parseMcpSpec,
15
16
  readConfig
16
- } from "./chunk-XPDVG52A.js";
17
+ } from "./chunk-AVFXO2EZ.js";
17
18
  import "./chunk-XXC2BYTV.js";
18
19
  import "./chunk-TUK7OWJA.js";
19
20
 
20
21
  // src/cli/commands/mcp-inspect.ts
21
22
  async function mcpInspectCommand(opts) {
22
- const spec = parseMcpSpec(opts.spec);
23
+ const parsed = parseMcpSpec(opts.spec);
24
+ const cfg = readConfig();
25
+ const normalized = normalizeMcpConfig(cfg);
26
+ const matched = parsed.name ? normalized.find((s) => s.name === parsed.name) : void 0;
27
+ const spec = overlayMatchedSpec(parsed, matched);
23
28
  if (spec.transport === "stdio") preflightStdioSpec(spec);
24
- const transport = buildTransportFromSpec(spec, { env: mcpEnvFor(spec.name, readConfig()) });
29
+ const transport = buildTransportFromSpec(spec);
25
30
  const client = new McpClient({ transport });
26
31
  try {
27
32
  await client.initialize();
@@ -140,4 +145,4 @@ export {
140
145
  formatMcpInspectFailure,
141
146
  mcpInspectCommand
142
147
  };
143
- //# sourceMappingURL=mcp-inspect-REGLYBWT.js.map
148
+ //# sourceMappingURL=mcp-inspect-CEMGKKAH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/cli/commands/mcp-inspect.ts"],"sourcesContent":["import { normalizeMcpConfig, readConfig } from \"../../config.js\";\nimport { McpClient } from \"../../mcp/client.js\";\nimport { inspectMcpServer } from \"../../mcp/inspect.js\";\nimport type { InspectionReport } from \"../../mcp/inspect.js\";\nimport { preflightStdioSpec } from \"../../mcp/preflight.js\";\nimport { overlayMatchedSpec, parseMcpSpec } from \"../../mcp/spec.js\";\nimport { buildTransportFromSpec } from \"../../mcp/transport-from-spec.js\";\n\nexport interface McpInspectOptions {\n /** The raw --mcp spec string (e.g. `fs=npx -y @modelcontextprotocol/server-filesystem .`). */\n spec: string;\n /** Emit JSON on stdout instead of the human-readable table. */\n json?: boolean;\n}\n\nexport async function mcpInspectCommand(opts: McpInspectOptions): Promise<void> {\n const parsed = parseMcpSpec(opts.spec);\n const cfg = readConfig();\n const normalized = normalizeMcpConfig(cfg);\n const matched = parsed.name ? normalized.find((s) => s.name === parsed.name) : undefined;\n const spec = overlayMatchedSpec(parsed, matched);\n if (spec.transport === \"stdio\") preflightStdioSpec(spec);\n const transport = buildTransportFromSpec(spec);\n const client = new McpClient({ transport });\n try {\n await client.initialize();\n const report = await inspectMcpServer(client);\n if (opts.json) {\n console.log(JSON.stringify(report, null, 2));\n } else {\n console.log(formatReport(spec.name ?? \"(anon)\", report));\n }\n } finally {\n await client.close();\n }\n}\n\nexport function formatMcpInspectFailure(err: unknown): string {\n const error = err instanceof Error ? err : new Error(String(err));\n const message = error.message;\n const code = (error as NodeJS.ErrnoException).code;\n\n if (code === \"ENOENT\") {\n const command = message.match(/^spawn\\s+([^\\s]+)\\s+ENOENT$/)?.[1] ?? \"the command\";\n return `${message} — try: install or verify \\`${command}\\`, then check the MCP spec's command spelling`;\n }\n\n if (code === \"ECONNREFUSED\") {\n const target = message.match(/\\b(https?:\\/\\/\\S+|\\d+\\.\\d+\\.\\d+\\.\\d+:\\d+|localhost:\\d+)\\b/i)?.[1];\n return `${message} — try: confirm ${target ?? \"the MCP server\"} is running and the host/port match the spec`;\n }\n\n if (code === \"ENOTFOUND\" || code === \"EAI_AGAIN\") {\n return `${message} — try: confirm the hostname is spelled correctly and DNS resolution is working (check your network/VPN)`;\n }\n\n if (code === \"ECONNRESET\") {\n return `${message} — try: retry the request; if it keeps happening, check the server's logs for crashes or rate limits`;\n }\n\n if (code === \"ETIMEDOUT\") {\n return `${message} — try: confirm the host is reachable and no firewall/proxy is blocking the port`;\n }\n\n if (\n code === \"CERT_HAS_EXPIRED\" ||\n code === \"DEPTH_ZERO_SELF_SIGNED_CERT\" ||\n code === \"UNABLE_TO_VERIFY_LEAF_SIGNATURE\" ||\n code === \"SELF_SIGNED_CERT_IN_CHAIN\"\n ) {\n return `${message} — try: renew or trust the server's TLS certificate, or point the spec at an endpoint with a valid cert`;\n }\n\n // HTTP non-2xx from SSE / Streamable HTTP transports. Match the three\n // exact shapes those transports emit and surface an auth/endpoint hint.\n const httpStatus = matchTransportHttpStatus(message);\n if (httpStatus !== null) {\n return `${message}${hintForHttpStatus(httpStatus)}`;\n }\n\n if (/^MCP request initialize \\(id=\\d+\\) timed out after \\d+ms$/.test(message)) {\n return `${message} — try: confirm the target speaks MCP and completes the handshake before the request timeout`;\n }\n\n if (/^(empty MCP spec|MCP spec \".*\" has name but no command)/.test(message)) {\n return `${message} — try: pass \\`name=command args\\` or an http(s):// URL`;\n }\n\n return message;\n}\n\nfunction matchTransportHttpStatus(message: string): number | null {\n // src/mcp/sse.ts: `SSE handshake <url> → <status> <statusText>`\n // src/mcp/sse.ts: `MCP SSE POST <url> failed: <status> <statusText>`\n // src/mcp/streamable-http.ts: `MCP Streamable HTTP POST <url> → <status> <statusText>...`\n const m =\n message.match(/^SSE handshake \\S+ → (\\d{3})\\b/) ??\n message.match(/^MCP SSE POST \\S+ failed: (\\d{3})\\b/) ??\n message.match(/^MCP Streamable HTTP POST \\S+ → (\\d{3})\\b/);\n return m ? Number(m[1]) : null;\n}\n\nfunction hintForHttpStatus(status: number): string {\n if (status === 401) {\n return \" — try: check the spec's auth header (e.g. `Authorization: Bearer …`) or confirm the token isn't expired\";\n }\n if (status === 403) {\n return \" — try: confirm the credentials have permission to reach this MCP endpoint\";\n }\n if (status === 404) {\n return \" — try: confirm the endpoint path in the spec matches what the server actually exposes\";\n }\n if (status >= 500 && status <= 599) {\n return \" — try: retry shortly; if the failure persists, check the MCP server's logs\";\n }\n return \"\";\n}\n\nfunction formatReport(nsName: string, r: InspectionReport): string {\n const lines: string[] = [];\n lines.push(`MCP server [${nsName}]`);\n lines.push(\n ` server ${r.serverInfo.name || \"(unknown)\"}${r.serverInfo.version ? ` v${r.serverInfo.version}` : \"\"}`,\n );\n lines.push(` protocol ${r.protocolVersion}`);\n const capKeys = Object.keys(r.capabilities);\n lines.push(` caps ${capKeys.length > 0 ? capKeys.join(\", \") : \"(none advertised)\"}`);\n if (r.instructions) {\n lines.push(` notes ${r.instructions.trim().slice(0, 200)}`);\n }\n lines.push(\"\");\n lines.push(formatSection(\"Tools\", r.tools, toolLine));\n lines.push(formatSection(\"Resources\", r.resources, resourceLine));\n lines.push(formatSection(\"Prompts\", r.prompts, promptLine));\n return lines.join(\"\\n\");\n}\n\nfunction formatSection<T>(\n title: string,\n section: { supported: true; items: T[] } | { supported: false; reason: string },\n render: (item: T) => string,\n): string {\n if (!section.supported) {\n return `${title}: (not supported — ${section.reason})`;\n }\n if (section.items.length === 0) {\n return `${title}: (none)`;\n }\n const lines = [`${title} (${section.items.length}):`];\n for (const item of section.items) lines.push(` ${render(item)}`);\n return lines.join(\"\\n\");\n}\n\nfunction toolLine(t: { name: string; description?: string }): string {\n const desc = t.description ? ` — ${oneLine(t.description, 80)}` : \"\";\n return `· ${t.name}${desc}`;\n}\n\nfunction resourceLine(r: { uri: string; name: string; mimeType?: string }): string {\n const mime = r.mimeType ? ` [${r.mimeType}]` : \"\";\n return `· ${r.name}${mime} ${r.uri}`;\n}\n\nfunction promptLine(p: {\n name: string;\n description?: string;\n arguments?: Array<{ name: string; required?: boolean }>;\n}): string {\n const argPart =\n p.arguments && p.arguments.length > 0\n ? ` (${p.arguments.map((a) => (a.required ? a.name : `${a.name}?`)).join(\", \")})`\n : \"\";\n const desc = p.description ? ` — ${oneLine(p.description, 80)}` : \"\";\n return `· ${p.name}${argPart}${desc}`;\n}\n\nfunction oneLine(s: string, max: number): string {\n const flat = s.replace(/\\s+/g, \" \").trim();\n return flat.length <= max ? flat : `${flat.slice(0, max - 1)}…`;\n}\n"],"mappings":"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","names":[]}
@@ -4,13 +4,13 @@ import {
4
4
  CODE_SYSTEM_PROMPT,
5
5
  codeSystemBase,
6
6
  codeSystemPrompt
7
- } from "./chunk-5JJRUIPA.js";
8
- import "./chunk-2K65GZBT.js";
9
- import "./chunk-XPDVG52A.js";
7
+ } from "./chunk-JNAQYELD.js";
8
+ import "./chunk-TEUDEGX2.js";
9
+ import "./chunk-AVFXO2EZ.js";
10
10
  import "./chunk-TUK7OWJA.js";
11
11
  export {
12
12
  CODE_SYSTEM_PROMPT,
13
13
  codeSystemBase,
14
14
  codeSystemPrompt
15
15
  };
16
- //# sourceMappingURL=prompt-UW6EFLVR.js.map
16
+ //# sourceMappingURL=prompt-2D7ID24X.js.map
File without changes
@@ -2,21 +2,21 @@
2
2
  import { createRequire as __cr } from 'node:module'; if (typeof globalThis.require === 'undefined') { globalThis.require = __cr(import.meta.url); }
3
3
  import {
4
4
  RecordView
5
- } from "./chunk-32TIKD5U.js";
5
+ } from "./chunk-TXJMRPIL.js";
6
6
  import {
7
7
  Bar,
8
8
  ChromeRule,
9
9
  stringWidth
10
- } from "./chunk-2Z35JOA4.js";
10
+ } from "./chunk-TKVXTQ3T.js";
11
11
  import {
12
12
  computeCumulativeStats,
13
13
  groupRecordsByTurn,
14
14
  replayFromFile
15
- } from "./chunk-FHOGSSCH.js";
15
+ } from "./chunk-C53JQES5.js";
16
16
  import {
17
17
  COLOR,
18
18
  GRADIENT
19
- } from "./chunk-TJX6BFZZ.js";
19
+ } from "./chunk-AB2RED3C.js";
20
20
  import {
21
21
  Box_default,
22
22
  Static,
@@ -26,17 +26,17 @@ import {
26
26
  use_app_default,
27
27
  use_input_default,
28
28
  use_stdout_default
29
- } from "./chunk-6G3CUUFG.js";
30
- import "./chunk-2KDUS647.js";
29
+ } from "./chunk-X53B3JIX.js";
30
+ import "./chunk-V26WPN3J.js";
31
31
  import "./chunk-25T6CVUP.js";
32
+ import "./chunk-ZZYBBX5N.js";
32
33
  import {
33
34
  t
34
- } from "./chunk-RE4RAVFF.js";
35
+ } from "./chunk-CGDR2ELH.js";
35
36
  import {
36
37
  formatBalance,
37
38
  formatCost
38
- } from "./chunk-XPDVG52A.js";
39
- import "./chunk-YQ6NTIIE.js";
39
+ } from "./chunk-AVFXO2EZ.js";
40
40
  import {
41
41
  __toESM
42
42
  } from "./chunk-TUK7OWJA.js";
@@ -288,4 +288,4 @@ function oneLine(s, max = 200) {
288
288
  export {
289
289
  replayCommand
290
290
  };
291
- //# sourceMappingURL=replay-YOURXV4C.js.map
291
+ //# sourceMappingURL=replay-SR44E6RS.js.map
@@ -3,55 +3,56 @@ import { createRequire as __cr } from 'node:module'; if (typeof globalThis.requi
3
3
  import {
4
4
  formatMcpLifecycleEvent,
5
5
  formatMcpSlowToast
6
- } from "./chunk-H6PS7IUE.js";
6
+ } from "./chunk-7UCMM425.js";
7
7
  import {
8
8
  buildTransportFromSpec,
9
9
  preflightStdioSpec
10
- } from "./chunk-PQXPXJBJ.js";
10
+ } from "./chunk-NVURFF27.js";
11
11
  import {
12
12
  CacheFirstLoop,
13
13
  ImmutablePrefix,
14
14
  ToolRegistry,
15
15
  bridgeMcpTools
16
- } from "./chunk-2R4QCDOZ.js";
17
- import "./chunk-F3PXYSNN.js";
16
+ } from "./chunk-OPFUUYHL.js";
17
+ import "./chunk-WK3UFQY3.js";
18
18
  import {
19
19
  openTranscriptFile,
20
20
  recordFromLoopEvent,
21
21
  writeRecord
22
- } from "./chunk-FHOGSSCH.js";
22
+ } from "./chunk-C53JQES5.js";
23
23
  import {
24
- McpClient,
25
- parseMcpSpec
26
- } from "./chunk-6AK4EY3D.js";
27
- import "./chunk-5JJRUIPA.js";
28
- import "./chunk-PV55UMTO.js";
24
+ McpClient
25
+ } from "./chunk-XSU4QVFW.js";
26
+ import "./chunk-JNAQYELD.js";
27
+ import "./chunk-6OWJV3YW.js";
29
28
  import {
30
29
  DeepSeekClient
31
- } from "./chunk-2KDUS647.js";
30
+ } from "./chunk-V26WPN3J.js";
32
31
  import "./chunk-25T6CVUP.js";
33
32
  import {
34
33
  loadDotenv
35
34
  } from "./chunk-2UQP6H6T.js";
36
- import "./chunk-O52OLQL3.js";
37
- import "./chunk-2K65GZBT.js";
38
- import "./chunk-7O5ALB4C.js";
35
+ import "./chunk-RDRC3XDT.js";
36
+ import "./chunk-TEUDEGX2.js";
37
+ import "./chunk-7CIGMZT3.js";
39
38
  import "./chunk-S4XVGLRW.js";
40
39
  import "./chunk-6PBZN4VI.js";
41
- import "./chunk-RE4RAVFF.js";
40
+ import {
41
+ appendUsage
42
+ } from "./chunk-R3CTO2HM.js";
43
+ import "./chunk-ZZYBBX5N.js";
44
+ import {
45
+ t
46
+ } from "./chunk-CGDR2ELH.js";
42
47
  import {
43
48
  defaultConfigPath,
44
49
  isPlausibleKey,
45
50
  loadApiKey,
46
51
  loadBaseUrl,
47
- mcpEnvFor,
52
+ normalizeMcpConfig,
48
53
  readConfig,
49
54
  saveApiKey
50
- } from "./chunk-XPDVG52A.js";
51
- import {
52
- appendUsage
53
- } from "./chunk-HFEAY5DT.js";
54
- import "./chunk-YQ6NTIIE.js";
55
+ } from "./chunk-AVFXO2EZ.js";
55
56
  import "./chunk-XXC2BYTV.js";
56
57
  import "./chunk-TUK7OWJA.js";
57
58
 
@@ -62,9 +63,7 @@ async function ensureApiKey() {
62
63
  const existing = loadApiKey();
63
64
  if (existing) return existing;
64
65
  if (!stdin.isTTY) {
65
- process.stderr.write(
66
- "DEEPSEEK_API_KEY is not set and stdin is not a TTY (cannot prompt).\nSet the env var, or run `reasonix chat` once interactively to save a key.\n"
67
- );
66
+ process.stderr.write(t("run.missingApiKey"));
68
67
  process.exit(1);
69
68
  }
70
69
  process.stdout.write(
@@ -93,20 +92,22 @@ async function runCommand(opts) {
93
92
  loadDotenv();
94
93
  const apiKey = await ensureApiKey();
95
94
  process.env.DEEPSEEK_API_KEY = apiKey;
96
- const requestedSpecs = opts.mcp ?? [];
95
+ const cfg = readConfig();
96
+ const normalizedSpecs = normalizeMcpConfig(
97
+ cfg,
98
+ opts.mcp && opts.mcp.length > 0 ? opts.mcp : void 0
99
+ );
97
100
  const clients = [];
98
101
  let tools;
99
102
  let successCount = 0;
100
- const disabledNames = new Set(readConfig().mcpDisabled ?? []);
101
- if (requestedSpecs.length > 0) {
103
+ if (normalizedSpecs.length > 0) {
102
104
  tools = new ToolRegistry();
103
- for (const raw of requestedSpecs) {
105
+ for (const spec of normalizedSpecs) {
104
106
  let label = "anon";
105
107
  let mcp;
106
108
  try {
107
- const spec = parseMcpSpec(raw);
108
109
  label = spec.name ?? "anon";
109
- if (spec.name && disabledNames.has(spec.name)) {
110
+ if (spec.disabled) {
110
111
  process.stderr.write(`${formatMcpLifecycleEvent({ state: "disabled", name: label })}
111
112
  `);
112
113
  continue;
@@ -114,11 +115,9 @@ async function runCommand(opts) {
114
115
  process.stderr.write(`${formatMcpLifecycleEvent({ state: "handshake", name: label })}
115
116
  `);
116
117
  const t0 = Date.now();
117
- const prefix2 = spec.name ? `${spec.name}_` : requestedSpecs.length === 1 && opts.mcpPrefix ? opts.mcpPrefix : "";
118
+ const prefix2 = spec.name ? `${spec.name}_` : normalizedSpecs.length === 1 && opts.mcpPrefix ? opts.mcpPrefix : "";
118
119
  if (spec.transport === "stdio") preflightStdioSpec(spec);
119
- const transport = buildTransportFromSpec(spec, {
120
- env: mcpEnvFor(spec.name, readConfig())
121
- });
120
+ const transport = buildTransportFromSpec(spec);
122
121
  mcp = new McpClient({ transport });
123
122
  await mcp.initialize();
124
123
  const bridge = await bridgeMcpTools(mcp, {
@@ -145,7 +144,7 @@ async function runCommand(opts) {
145
144
  await mcp?.close().catch(() => void 0);
146
145
  process.stderr.write(
147
146
  `${formatMcpLifecycleEvent({ state: "failed", name: label, reason: err.message })}
148
- \u2192 run \`reasonix setup\` to remove broken entries from your saved config.
147
+ ${t("mcpLifecycle.failedSetupConfigHint")}
149
148
  `
150
149
  );
151
150
  }
@@ -219,4 +218,4 @@ transcript: ${opts.transcript}
219
218
  export {
220
219
  runCommand
221
220
  };
222
- //# sourceMappingURL=run-Q6BUXV66.js.map
221
+ //# sourceMappingURL=run-MDGL27WL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/cli/commands/run.ts"],"sourcesContent":["import type { WriteStream } from \"node:fs\";\nimport { stdin, stdout } from \"node:process\";\nimport { createInterface } from \"node:readline/promises\";\nimport {\n defaultConfigPath,\n isPlausibleKey,\n loadApiKey,\n loadBaseUrl,\n normalizeMcpConfig,\n readConfig,\n saveApiKey,\n} from \"../../config.js\";\nimport { loadDotenv } from \"../../env.js\";\nimport { t } from \"../../i18n/index.js\";\nimport { CacheFirstLoop, DeepSeekClient, ImmutablePrefix } from \"../../index.js\";\nimport { McpClient } from \"../../mcp/client.js\";\nimport { preflightStdioSpec } from \"../../mcp/preflight.js\";\nimport { bridgeMcpTools } from \"../../mcp/registry.js\";\nimport { buildTransportFromSpec } from \"../../mcp/transport-from-spec.js\";\nimport { appendUsage } from \"../../telemetry/usage.js\";\nimport { ToolRegistry } from \"../../tools.js\";\nimport { openTranscriptFile, recordFromLoopEvent, writeRecord } from \"../../transcript/log.js\";\nimport { formatMcpLifecycleEvent } from \"../ui/mcp-lifecycle.js\";\nimport { formatMcpSlowToast } from \"../ui/mcp-toast.js\";\n\nexport interface RunOptions {\n task: string;\n model: string;\n system: string;\n budgetUsd?: number;\n /** Per-turn repair-signal count required to escalate flash→pro. Undefined → loop default (3). */\n failureThreshold?: number;\n /** JSONL transcript path — lets `reasonix replay` / `diff` audit this run. */\n transcript?: string;\n /** Zero or more MCP server specs. Each: `\"name=cmd args...\"` or `\"cmd args...\"`. */\n mcp?: string[];\n /** Global prefix — only honored when a single anonymous server is given. */\n mcpPrefix?: string;\n}\n\nasync function ensureApiKey(): Promise<string> {\n const existing = loadApiKey();\n if (existing) return existing;\n\n if (!stdin.isTTY) {\n process.stderr.write(t(\"run.missingApiKey\"));\n process.exit(1);\n }\n\n process.stdout.write(\n \"DeepSeek API key not configured.\\nGet one at https://platform.deepseek.com/api_keys\\n\",\n );\n const rl = createInterface({ input: stdin, output: stdout });\n try {\n while (true) {\n const answer = (await rl.question(\"API key › \")).trim();\n if (!answer) continue;\n if (!isPlausibleKey(answer)) {\n process.stdout.write(\"Key looks too short. Paste the full token (16+ chars, no spaces).\\n\");\n continue;\n }\n saveApiKey(answer);\n process.stdout.write(`Saved to ${defaultConfigPath()}\\n\\n`);\n return answer;\n }\n } finally {\n rl.close();\n }\n}\n\nexport async function runCommand(opts: RunOptions): Promise<void> {\n loadDotenv();\n const apiKey = await ensureApiKey();\n process.env.DEEPSEEK_API_KEY = apiKey;\n\n // Optional MCP setup — mirrors chat's flow. Must happen before loop\n // construction so the tools make it into the prefix.\n const cfg = readConfig();\n const normalizedSpecs = normalizeMcpConfig(\n cfg,\n opts.mcp && opts.mcp.length > 0 ? opts.mcp : undefined,\n );\n const clients: McpClient[] = [];\n let tools: ToolRegistry | undefined;\n let successCount = 0;\n if (normalizedSpecs.length > 0) {\n tools = new ToolRegistry();\n for (const spec of normalizedSpecs) {\n let label = \"anon\";\n let mcp: McpClient | undefined;\n try {\n label = spec.name ?? \"anon\";\n if (spec.disabled) {\n process.stderr.write(`${formatMcpLifecycleEvent({ state: \"disabled\", name: label })}\\n`);\n continue;\n }\n process.stderr.write(`${formatMcpLifecycleEvent({ state: \"handshake\", name: label })}\\n`);\n const t0 = Date.now();\n const prefix = spec.name\n ? `${spec.name}_`\n : normalizedSpecs.length === 1 && opts.mcpPrefix\n ? opts.mcpPrefix\n : \"\";\n if (spec.transport === \"stdio\") preflightStdioSpec(spec);\n const transport = buildTransportFromSpec(spec);\n mcp = new McpClient({ transport });\n await mcp.initialize();\n const bridge = await bridgeMcpTools(mcp, {\n registry: tools,\n namePrefix: prefix,\n serverName: label,\n onSlow: (info) =>\n process.stderr.write(\n `${formatMcpSlowToast({ name: info.serverName, p95Ms: info.p95Ms, sampleSize: info.sampleSize })}\\n`,\n ),\n });\n process.stderr.write(\n `${formatMcpLifecycleEvent({\n state: \"connected\",\n name: label,\n tools: bridge.registeredNames.length,\n ms: Date.now() - t0,\n })}\\n`,\n );\n clients.push(mcp);\n successCount++;\n } catch (err) {\n // Non-fatal — skip and continue, same as `reasonix chat`. A\n // one-shot `run` invocation with a broken MCP server otherwise\n // fails the whole run over a side-concern tool the task might\n // not even touch.\n await mcp?.close().catch(() => undefined);\n process.stderr.write(\n `${formatMcpLifecycleEvent({ state: \"failed\", name: label, reason: (err as Error).message })}\\n ${t(\"mcpLifecycle.failedSetupConfigHint\")}\\n`,\n );\n }\n }\n if (successCount === 0) tools = undefined;\n }\n\n const client = new DeepSeekClient({ baseUrl: loadBaseUrl() });\n const prefix = new ImmutablePrefix({\n system: opts.system,\n toolSpecs: tools?.specs(),\n });\n const loop = new CacheFirstLoop({\n client,\n prefix,\n tools,\n model: opts.model,\n budgetUsd: opts.budgetUsd,\n failureThreshold: opts.failureThreshold,\n });\n const prefixHash = prefix.fingerprint;\n\n let transcriptStream: WriteStream | null = null;\n if (opts.transcript) {\n transcriptStream = openTranscriptFile(opts.transcript, {\n version: 1,\n source: \"reasonix run\",\n model: opts.model,\n startedAt: new Date().toISOString(),\n });\n // Also persist the user turn itself (the loop's event stream starts with\n // assistant output, not the prompt we're about to send).\n writeRecord(transcriptStream, {\n ts: new Date().toISOString(),\n turn: 1,\n role: \"user\",\n content: opts.task,\n });\n }\n\n try {\n for await (const ev of loop.step(opts.task)) {\n if (ev.role === \"assistant_delta\" && ev.content) process.stdout.write(ev.content);\n if (ev.role === \"tool\") process.stdout.write(`\\n[tool ${ev.toolName}] ${ev.content}\\n`);\n if (ev.role === \"error\") process.stderr.write(`\\n[error] ${ev.error}\\n`);\n if (ev.role === \"done\") process.stdout.write(\"\\n\");\n if (ev.role === \"assistant_final\" && ev.stats?.usage) {\n // `reasonix run` is often used in CI / scripting — we want\n // those turns to show up in `reasonix stats` too so the\n // dashboard reflects all DeepSeek spend, not just TUI sessions.\n appendUsage({ session: null, model: ev.stats.model, usage: ev.stats.usage });\n }\n // Persist every non-streaming event — deltas would flood the file and\n // aren't useful for replay (replay renders final content, not keystrokes).\n if (transcriptStream && ev.role !== \"assistant_delta\") {\n writeRecord(transcriptStream, recordFromLoopEvent(ev, { model: opts.model, prefixHash }));\n }\n }\n } finally {\n transcriptStream?.end();\n }\n\n const s = loop.stats.summary();\n process.stdout.write(\n `\\n— turns:${s.turns} cache:${(s.cacheHitRatio * 100).toFixed(1)}% ` +\n `cost:$${s.totalCostUsd.toFixed(6)} save-vs-claude:${s.savingsVsClaudePct.toFixed(1)}%\\n`,\n );\n if (opts.transcript) {\n process.stdout.write(`\\ntranscript: ${opts.transcript}\\n`);\n process.stdout.write(` → npx reasonix replay ${opts.transcript}\\n`);\n }\n\n for (const c of clients) await c.close();\n}\n"],"mappings":"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","names":["prefix"]}
@@ -13,7 +13,7 @@ import {
13
13
  listCheckpoints,
14
14
  loadCheckpoint,
15
15
  restoreCheckpoint
16
- } from "./chunk-3BXRZFWS.js";
16
+ } from "./chunk-KLQTAZIY.js";
17
17
  import "./chunk-4QUNBQQ2.js";
18
18
  import {
19
19
  fetchSmitheryDetail,
@@ -24,26 +24,27 @@ import {
24
24
  } from "./chunk-XJXDHAES.js";
25
25
  import {
26
26
  registerSemanticSearchTool
27
- } from "./chunk-YYQAUTTN.js";
27
+ } from "./chunk-MJ6W5UN3.js";
28
28
  import {
29
29
  BUILTIN_ALLOWLIST,
30
30
  lineDiff
31
- } from "./chunk-O52OLQL3.js";
31
+ } from "./chunk-RDRC3XDT.js";
32
32
  import {
33
33
  PROJECT_MEMORY_FILE,
34
34
  SKILLS_DIRNAME,
35
35
  SKILL_FILE,
36
+ SkillStore,
36
37
  findProjectMemoryPath,
37
38
  parseFrontmatter,
38
39
  resolveProjectMemoryWritePath,
39
40
  validateSkillFrontmatter
40
- } from "./chunk-2K65GZBT.js";
41
+ } from "./chunk-TEUDEGX2.js";
41
42
  import "./chunk-PLHAZOLZ.js";
42
43
  import {
43
44
  checkOllamaStatus,
44
45
  pullOllamaModel,
45
46
  startOllamaDaemon
46
- } from "./chunk-DOYHN4KB.js";
47
+ } from "./chunk-LIR2HBQH.js";
47
48
  import {
48
49
  INDEX_DIR_NAME,
49
50
  buildIndex,
@@ -52,24 +53,34 @@ import {
52
53
  querySemantic,
53
54
  readIndexMeta,
54
55
  walkChunks
55
- } from "./chunk-XCGGEJTI.js";
56
+ } from "./chunk-4CTDEJUF.js";
56
57
  import {
57
58
  HOOK_EVENTS,
58
59
  globalSettingsPath,
59
60
  loadHooks,
60
61
  projectSettingsPath
61
- } from "./chunk-7O5ALB4C.js";
62
+ } from "./chunk-7CIGMZT3.js";
62
63
  import "./chunk-S4XVGLRW.js";
63
64
  import {
64
65
  listSessions,
65
66
  sessionPath,
66
67
  sessionsDir
67
68
  } from "./chunk-6PBZN4VI.js";
69
+ import {
70
+ aggregateUsage,
71
+ bucketCacheHitRatio,
72
+ formatLogSize,
73
+ readUsageLog
74
+ } from "./chunk-R3CTO2HM.js";
75
+ import {
76
+ DEEPSEEK_PRICING,
77
+ cacheSavingsUsd
78
+ } from "./chunk-ZZYBBX5N.js";
68
79
  import {
69
80
  getLanguage,
70
81
  getSupportedLanguages,
71
82
  setLanguage
72
- } from "./chunk-RE4RAVFF.js";
83
+ } from "./chunk-CGDR2ELH.js";
73
84
  import {
74
85
  DEFAULT_INDEX_EXCLUDES,
75
86
  DEFAULT_MAX_FILE_BYTES,
@@ -80,7 +91,10 @@ import {
80
91
  loadIndexConfig,
81
92
  loadIndexUserConfig,
82
93
  loadProjectShellAllowed,
94
+ loadResolvedSkillPaths,
83
95
  loadSemanticEmbeddingUserConfig,
96
+ normalizeSkillPathEntries,
97
+ normalizeSkillPaths,
84
98
  readConfig,
85
99
  redactKey,
86
100
  redactSemanticEmbeddingConfig,
@@ -89,17 +103,7 @@ import {
89
103
  resolveSemanticEmbeddingConfig,
90
104
  saveSemanticEmbeddingConfig,
91
105
  writeConfig
92
- } from "./chunk-XPDVG52A.js";
93
- import {
94
- aggregateUsage,
95
- bucketCacheHitRatio,
96
- formatLogSize,
97
- readUsageLog
98
- } from "./chunk-HFEAY5DT.js";
99
- import {
100
- DEEPSEEK_PRICING,
101
- cacheSavingsUsd
102
- } from "./chunk-YQ6NTIIE.js";
106
+ } from "./chunk-AVFXO2EZ.js";
103
107
  import {
104
108
  VERSION
105
109
  } from "./chunk-XXC2BYTV.js";
@@ -270,8 +274,13 @@ async function handleCheckpointCreate(method, _rest, body, ctx) {
270
274
  let paths;
271
275
  try {
272
276
  const { execSync: execSync2 } = await import("child_process");
277
+ const env = { ...process.env };
278
+ for (const k of Object.keys(env)) {
279
+ if (k.startsWith("GIT_")) delete env[k];
280
+ }
273
281
  const stdout = execSync2("git ls-files --cached --others --exclude-standard", {
274
282
  cwd: rootDir,
283
+ env,
275
284
  encoding: "utf8",
276
285
  maxBuffer: 10 * 1024 * 1024
277
286
  });
@@ -1164,7 +1173,7 @@ function findRegistryEntry(entries, name) {
1164
1173
  }
1165
1174
  async function handleMcp(method, rest, body, ctx, query = new URLSearchParams()) {
1166
1175
  if (method === "GET" && rest.length === 0) {
1167
- const servers = (ctx.mcpServers ?? []).map((s) => ({
1176
+ const servers = (ctx.getMcpServers?.() ?? []).map((s) => ({
1168
1177
  label: s.label,
1169
1178
  spec: s.spec,
1170
1179
  toolCount: s.toolCount,
@@ -1971,7 +1980,7 @@ async function handleOverview(method, _rest, _body, ctx) {
1971
1980
  editMode: ctx.getEditMode?.() ?? null,
1972
1981
  planMode: ctx.getPlanMode?.() ?? null,
1973
1982
  pendingEdits: ctx.getPendingEditCount?.() ?? null,
1974
- mcpServerCount: ctx.mcpServers?.length ?? null,
1983
+ mcpServerCount: ctx.getMcpServers?.().length ?? null,
1975
1984
  toolCount: ctx.tools ? ctx.tools.size : null,
1976
1985
  preset: cfg.preset ?? "auto",
1977
1986
  reasoningEffort: cfg.reasoningEffort ?? "max",
@@ -2737,6 +2746,14 @@ async function handleSettings(method, _rest, body, ctx) {
2737
2746
  proNext: live?.proArmed ?? false,
2738
2747
  budgetUsd: live?.budgetUsd ?? null,
2739
2748
  sessionSpendUsd: ctx.getStats?.()?.totalCostUsd ?? null,
2749
+ skillPaths: normalizeSkillPaths(
2750
+ cfg.skills?.paths ?? [],
2751
+ ctx.getCurrentCwd?.() ?? process.cwd()
2752
+ ),
2753
+ skillPathEntries: normalizeSkillPathEntries(
2754
+ cfg.skills?.paths ?? [],
2755
+ ctx.getCurrentCwd?.() ?? process.cwd()
2756
+ ),
2740
2757
  // Hint to the SPA which fields require restart.
2741
2758
  appliesAt: {
2742
2759
  apiKey: "next-session",
@@ -2746,7 +2763,8 @@ async function handleSettings(method, _rest, body, ctx) {
2746
2763
  search: "next-session",
2747
2764
  model: "next-turn",
2748
2765
  proNext: "next-turn",
2749
- budgetUsd: "live"
2766
+ budgetUsd: "live",
2767
+ skillPaths: "next-session"
2750
2768
  }
2751
2769
  }
2752
2770
  };
@@ -2836,6 +2854,17 @@ async function handleSettings(method, _rest, body, ctx) {
2836
2854
  }
2837
2855
  changed.push("budgetUsd");
2838
2856
  }
2857
+ if (fields.skillPaths !== void 0) {
2858
+ const raw = Array.isArray(fields.skillPaths) ? fields.skillPaths : typeof fields.skillPaths === "string" ? fields.skillPaths.split(",") : null;
2859
+ if (!raw) {
2860
+ return { status: 400, body: { error: "skillPaths must be a string or string[]" } };
2861
+ }
2862
+ cfg.skills = {
2863
+ ...cfg.skills ?? {},
2864
+ paths: normalizeSkillPaths(raw, ctx.getCurrentCwd?.() ?? process.cwd())
2865
+ };
2866
+ changed.push("skillPaths");
2867
+ }
2839
2868
  if (changed.length > 0) {
2840
2869
  writeConfig(cfg, ctx.configPath);
2841
2870
  if (langPending) setLanguage(langPending);
@@ -2977,10 +3006,16 @@ async function handleSkills(method, rest, body, ctx) {
2977
3006
  if (method === "GET" && rest.length === 0) {
2978
3007
  const runs7d = countSubagentRuns(ctx.usageLogPath);
2979
3008
  const tag = (rows) => rows.map((r) => ({ ...r, runs7d: runs7d.get(r.name) ?? 0 }));
3009
+ const store = new SkillStore({
3010
+ projectRoot: cwd,
3011
+ customSkillPaths: loadResolvedSkillPaths(cwd ?? process.cwd(), ctx.configPath)
3012
+ });
3013
+ const customRoots = store.customRoots();
2980
3014
  return {
2981
3015
  status: 200,
2982
3016
  body: {
2983
3017
  global: tag(listSkills(globalSkillsDir(), "global")),
3018
+ custom: tag(customRoots.flatMap((root) => listSkills(root.dir, "custom"))),
2984
3019
  project: cwd ? tag(listSkills(projectSkillsDir(cwd), "project")) : [],
2985
3020
  builtin: [
2986
3021
  {
@@ -2998,7 +3033,8 @@ async function handleSkills(method, rest, body, ctx) {
2998
3033
  ],
2999
3034
  paths: {
3000
3035
  global: globalSkillsDir(),
3001
- project: cwd ? projectSkillsDir(cwd) : null
3036
+ project: cwd ? projectSkillsDir(cwd) : null,
3037
+ custom: customRoots
3002
3038
  }
3003
3039
  }
3004
3040
  };
@@ -3300,6 +3336,7 @@ async function handleApi(pathTail, method, body, ctx, query = new URLSearchParam
3300
3336
  }
3301
3337
 
3302
3338
  // src/server/index.ts
3339
+ var LOOPBACK_HOSTS = /* @__PURE__ */ new Set(["127.0.0.1", "::1", "localhost"]);
3303
3340
  function mintToken() {
3304
3341
  return randomBytes(32).toString("hex");
3305
3342
  }
@@ -3439,6 +3476,12 @@ function startDashboardServer(ctx, opts = {}) {
3439
3476
  const addr = server.address();
3440
3477
  const finalPort = addr.port;
3441
3478
  const url = `http://${host}:${finalPort}/?token=${token}`;
3479
+ if (!LOOPBACK_HOSTS.has(host)) {
3480
+ process.stderr.write(
3481
+ `\u25B2 Dashboard bound to ${host}:${finalPort} (non-loopback). The URL token is the only auth \u2014 keep it secret.
3482
+ `
3483
+ );
3484
+ }
3442
3485
  let closed = false;
3443
3486
  const close = () => new Promise((doneResolve) => {
3444
3487
  if (closed) return doneResolve();
@@ -3457,4 +3500,4 @@ export {
3457
3500
  readBody,
3458
3501
  startDashboardServer
3459
3502
  };
3460
- //# sourceMappingURL=server-XGDBRWMB.js.map
3503
+ //# sourceMappingURL=server-27ARQXIZ.js.map