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
package/README.md CHANGED
@@ -60,32 +60,69 @@ Requires Node ≥ 22. Works on macOS · Linux · Windows (PowerShell · Git Bash
60
60
 
61
61
  Install Reasonix globally if you want the `reasonix` command available on your `PATH`:
62
62
 
63
- ```bash
63
+ ~~~bash
64
64
  npm install -g reasonix
65
65
  reasonix code my-project # paste a DeepSeek API key on first run; persists after
66
- ```
66
+ ~~~
67
67
 
68
68
  Or run it once without installing globally:
69
69
 
70
- ```bash
70
+ ~~~bash
71
71
  cd my-project
72
72
  npx reasonix code # always uses the latest package by default
73
- ```
73
+ ~~~
74
74
 
75
75
  Grab a [DeepSeek API key →](https://platform.deepseek.com/api_keys) · `reasonix code --help` for flags.
76
76
 
77
77
  If you use Reasonix daily, global install is the simplest path. If you just want to try it, use `npx`.
78
78
 
79
+ Bare `reasonix` (no subcommand) launches `code` in the current directory — typing `reasonix` and `reasonix code` are equivalent.
80
+
79
81
  | Command | When |
80
82
  |---|---|
81
- | `reasonix code [dir]` | The coding agent. **Start here.** |
83
+ | `reasonix` / `reasonix code [dir]` | The coding agent. **Start here.** |
82
84
  | `reasonix chat` | Plain chat — no filesystem or shell tools. |
83
85
  | `reasonix run "task"` | One-shot, streams to stdout. Good for pipes. |
84
86
  | `reasonix doctor` | Health check: Node, API key, MCP wiring. |
85
87
  | `reasonix update` | Upgrade Reasonix itself. |
86
88
 
89
+ ### Terminal renderer (Rust by default)
90
+
91
+ Since 0.44.0, Reasonix ships a native ratatui renderer (`reasonix-render`) as the default TUI. `npm install` resolves one of five pre-built `@reasonix/render-{platform}-{arch}` sub-packages via `optionalDependencies` so install is zero-config on **win32-x64 · linux-x64 · linux-arm64 · darwin-x64 · darwin-arm64**. No cargo, no toolchain, nothing extra to fetch.
92
+
93
+ - Want the old Ink/Node TUI back? Pass `--node` to any subcommand (`reasonix --node`, `reasonix code --node`, `reasonix chat --node`) or set `REASONIX_RENDERER=node` in your shell.
94
+ - Running on a platform without a published sub-package (Linux musl, FreeBSD, ARM v7, etc.)? Reasonix prints a one-line warning and auto-falls-back to the Ink renderer — nothing breaks.
95
+ - Building rust from source? `cargo build --release --bin reasonix-render` inside the repo; the dev flow (`npm run dev`) does this automatically. The resolver also accepts `REASONIX_RENDER_BIN=/path/to/binary` to pin a specific build for testing.
96
+
87
97
  Other subcommands (`replay` · `diff` · `events` · `stats` · `index` · `mcp` · `prune-sessions`) are in `reasonix --help` and the [CLI reference](https://esengine.github.io/DeepSeek-Reasonix/#cli).
88
98
 
99
+ ### QQ channel
100
+
101
+ Reasonix can attach QQ as a remote communication channel for existing `chat` and `code` sessions. It is not a separate runtime mode.
102
+
103
+ Start a session first:
104
+
105
+ ~~~bash
106
+ reasonix code
107
+ # or
108
+ reasonix chat
109
+ ~~~
110
+
111
+ Then connect QQ from inside the session:
112
+
113
+ ~~~text
114
+ /qq connect
115
+ ~~~
116
+
117
+ Available commands:
118
+
119
+ - `/qq connect`
120
+ - `/qq status`
121
+ - `/qq disconnect`
122
+
123
+ Once enabled, later `chat` / `code` sessions auto-start the QQ channel. Slash commands, confirmation prompts, and follow-up assistant replies can continue through QQ without terminal-side input.
124
+
125
+ See [QQ channel setup](./docs/qq-connect.md) for setup details and QQ Open Platform bot registration.
89
126
  ### Desktop client (prerelease)
90
127
 
91
128
  A native Tauri client for users who want a GUI over the same loop. Multi-tab, the right-panel shows files the agent has read or edited this session, the same cost / cache / token meters live at the bottom. Same DeepSeek API key, same `~/.reasonix` config — the desktop bundles its own Node runtime, no separate `npm install` step.
@@ -103,9 +140,9 @@ The CLI remains the canonical surface. Anything that lands in the CLI is also av
103
140
 
104
141
  **Working in a different folder.** Reasonix scopes filesystem tools to the launch directory; pass `--dir` to retarget. Mid-session switching isn't supported by design (memory paths would tangle with stale roots) — quit and relaunch.
105
142
 
106
- ```bash
143
+ ~~~bash
107
144
  npx reasonix code --dir /path/to/project
108
- ```
145
+ ~~~
109
146
 
110
147
  **Picking `chat` vs `code`.** `code` is the default and the only mode with filesystem / shell tools and SEARCH/REPLACE review. `chat` is the lighter, tools-off shell — reach for it when you want a thinking partner with MCP attached but no disk access.
111
148
 
@@ -122,10 +159,10 @@ npx reasonix code --dir /path/to/project
122
159
 
123
160
  **Author your first skill.** No remote registry — write them directly. Edit the file (`description:` frontmatter + body), then `/skill list`. Add `runAs: subagent` to spawn an isolated subagent loop instead of inlining the body.
124
161
 
125
- ```bash
162
+ ~~~bash
126
163
  /skill new my-skill # <project>/.reasonix/skills/my-skill.md
127
164
  /skill new my-skill --global # ~/.reasonix/skills for cross-project use
128
- ```
165
+ ~~~
129
166
 
130
167
  </details>
131
168
 
@@ -144,7 +181,7 @@ One JSON file at `~/.reasonix/config.json` plus per-project overrides under `<pr
144
181
  | [Memory](https://esengine.github.io/DeepSeek-Reasonix/configuration.html#memory) | User-private knowledge pinned into the prefix. `user` / `feedback` / `project` / `reference` types. |
145
182
  | [Hooks](https://esengine.github.io/DeepSeek-Reasonix/configuration.html#hooks) | Shell commands on lifecycle events. `PreToolUse` (gating) · `PostToolUse` · `UserPromptSubmit` · `Stop`. |
146
183
  | [Permissions](https://esengine.github.io/DeepSeek-Reasonix/configuration.html#permissions) | Per-workspace shell allowlist. Exact-prefix match. |
147
- | [Web search](https://esengine.github.io/DeepSeek-Reasonix/configuration.html#search) | Mojeek by default; switch to self-hosted SearXNG with `/search-engine`. |
184
+ | [Web search](https://esengine.github.io/DeepSeek-Reasonix/configuration.html#search) | Mojeek by default; switch to self-hosted SearXNG or Metaso with `/search-engine`. |
148
185
  | [Semantic index](https://esengine.github.io/DeepSeek-Reasonix/configuration.html#index) | `reasonix index` — local Ollama or any OpenAI-compatible embedding endpoint. |
149
186
 
150
187
  <br/>
@@ -181,7 +218,7 @@ Click through to the full architecture writeup → [Pillar 1 — Cache-first loo
181
218
  | Configurable web search engine | `/search-engine` | — | — | — |
182
219
  | Persistent per-workspace sessions | yes | partial | n/a | — |
183
220
  | Plan mode · MCP · hooks · skills | yes | yes | yes | partial |
184
- | Web search (Mojeek + SearXNG) | yes | yes | yes | yes |
221
+ | Web search (Mojeek + SearXNG + Metaso) | yes | yes | yes | yes |
185
222
  | Open community development | yes | — | — | yes |
186
223
 
187
224
  For live cache-hit rates, costs, and methodology, see [`benchmarks/`](./benchmarks/) — the numbers move with model pricing, so they live with the harness, not in the README.
@@ -192,6 +229,7 @@ For live cache-hit rates, costs, and methodology, see [`benchmarks/`](./benchmar
192
229
 
193
230
  - [**Architecture**](./docs/ARCHITECTURE.md) — three pillars: cache-first loop, tool-call repair, cost control
194
231
  - [**CLI Reference**](./docs/CLI-REFERENCE.md) — every shell subcommand, every slash command, every keybinding
232
+ - [**QQ channel setup**](./docs/qq-connect.md) — what it is, commands, setup flow, and QQ Open Platform credentials
195
233
  - [**Benchmarks**](./benchmarks/) — τ-bench-lite harness, transcripts, cost methodology
196
234
  - [**Website**](https://esengine.github.io/DeepSeek-Reasonix/) — getting started, dashboard mockup, TUI mockup
197
235
  - [**Contributing**](./CONTRIBUTING.md) — comment policy, error-handling rules, library-over-hand-rolled
package/README.zh-CN.md CHANGED
@@ -53,10 +53,10 @@
53
53
 
54
54
  ## 安装
55
55
 
56
- ```bash
56
+ ~~~bash
57
57
  cd my-project
58
58
  npx reasonix code # 首次运行粘贴 DeepSeek API Key,之后会记住
59
- ```
59
+ ~~~
60
60
 
61
61
  要求 Node ≥ 22。在 macOS · Linux · Windows(PowerShell · Git Bash · Windows Terminal)都跑得顺。[去拿 DeepSeek API Key →](https://platform.deepseek.com/api_keys) · 完整 flag 看 `reasonix code --help`。
62
62
 
@@ -72,14 +72,41 @@ npx reasonix code # 首次运行粘贴 DeepSeek API Key,之后会记住
72
72
 
73
73
  其他子命令(`replay` · `diff` · `events` · `stats` · `index` · `mcp` · `prune-sessions`)在 `reasonix --help` 和 [CLI 参考](https://esengine.github.io/DeepSeek-Reasonix/#cli)。
74
74
 
75
+ ### QQ 通道
76
+
77
+ Reasonix 可以把 QQ 挂到现有的 `chat` / `code` 会话上,作为远程通信通道使用。它不是一个独立的新模式。
78
+
79
+ 先启动一个会话:
80
+
81
+ ~~~bash
82
+ reasonix code
83
+ # 或
84
+ reasonix chat
85
+ ~~~
86
+
87
+ 然后在会话里连接 QQ:
88
+
89
+ ~~~text
90
+ /qq connect
91
+ ~~~
92
+
93
+ 可用命令:
94
+
95
+ - `/qq connect`
96
+ - `/qq status`
97
+ - `/qq disconnect`
98
+
99
+ 启用后,后续的 `chat` / `code` 会话会自动启动 QQ 通道。斜杠命令、确认提示,以及后续助手回复都可以通过 QQ 继续完成,不需要回到终端交互。
100
+
101
+ 详细说明见 [QQ 连接指南](./docs/qq-connect.zh-CN.md)。
75
102
  <details>
76
103
  <summary><strong>切换工作区 · chat vs. code · 写第一个 Skill</strong></summary>
77
104
 
78
105
  **切换工作区。** Reasonix 把文件系统工具作用域绑定在启动目录,传 `--dir` 可以指别处。中途切换是有意不支持的(消息日志和 memory 路径会和旧根目录混在一起)—— 退出再启动。
79
106
 
80
- ```bash
107
+ ~~~bash
81
108
  npx reasonix code --dir /path/to/project
82
- ```
109
+ ~~~
83
110
 
84
111
  **`chat` 还是 `code`?** `code` 是默认入口、唯一带文件系统 / shell 工具和 SEARCH/REPLACE 审阅的模式。`chat` 是更轻量的纯对话壳——想要一个挂着 MCP 但没有磁盘权限的“思路助手”时用它。
85
112
 
@@ -96,10 +123,10 @@ npx reasonix code --dir /path/to/project
96
123
 
97
124
  **写第一个 Skill。** 暂无在线市场——自己写。编辑文件(`description:` frontmatter + 正文),然后 `/skill list` 就能看到。frontmatter 加 `runAs: subagent` 会以隔离 subagent 跑,而不是把正文内联进父 prompt。
98
125
 
99
- ```bash
126
+ ~~~bash
100
127
  /skill new my-skill # <project>/.reasonix/skills/my-skill.md
101
128
  /skill new my-skill --global # ~/.reasonix/skills,跨项目共用
102
- ```
129
+ ~~~
103
130
 
104
131
  </details>
105
132
 
@@ -118,7 +145,7 @@ npx reasonix code --dir /path/to/project
118
145
  | [Memory](https://esengine.github.io/DeepSeek-Reasonix/configuration.html?lang=zh#memory) | 用户私有的知识,钉进前缀。`user` / `feedback` / `project` / `reference` 四类。 |
119
146
  | [Hooks](https://esengine.github.io/DeepSeek-Reasonix/configuration.html?lang=zh#hooks) | 生命周期事件触发的 shell 命令。`PreToolUse`(拦截)· `PostToolUse` · `UserPromptSubmit` · `Stop`。 |
120
147
  | [权限](https://esengine.github.io/DeepSeek-Reasonix/configuration.html?lang=zh#permissions) | 按工作区的 shell 白名单,精确前缀匹配。 |
121
- | [Web 搜索](https://esengine.github.io/DeepSeek-Reasonix/configuration.html?lang=zh#search) | 默认 Mojeek;用 `/search-engine` 可切到自托管的 SearXNG。 |
148
+ | [Web 搜索](https://esengine.github.io/DeepSeek-Reasonix/configuration.html?lang=zh#search) | 默认 Mojeek;用 `/search-engine` 可切到自托管的 SearXNG 或 Metaso。 |
122
149
  | [语义索引](https://esengine.github.io/DeepSeek-Reasonix/configuration.html?lang=zh#index) | `reasonix index` —— 本地 Ollama,或任何 OpenAI 兼容的 embedding 接口。 |
123
150
 
124
151
  <br/>
@@ -164,6 +191,7 @@ npx reasonix code --dir /path/to/project
164
191
 
165
192
  - [**架构**](./docs/ARCHITECTURE.md) —— 四大支柱、缓存优先循环、思维提取、脚手架
166
193
  - [**CLI 参考**](./docs/CLI-REFERENCE.md) —— 每个 shell 子命令、每个 slash 命令、每个快捷键
194
+ - [**QQ 连接指南**](./docs/qq-connect.zh-CN.md) —— 通道定位、命令、配置流程和 QQ 开放平台凭据
167
195
  - [**基准测试**](./benchmarks/) —— τ-bench-lite harness、transcript、成本方法论
168
196
  - [**官方网站**](https://esengine.github.io/DeepSeek-Reasonix/) —— 入门、Dashboard 设计稿、TUI 设计稿
169
197
  - [**贡献指南**](./CONTRIBUTING.md) —— 注释规则、错误处理、用现成库不手写
package/dashboard/app.css CHANGED
@@ -59,7 +59,14 @@
59
59
 
60
60
  /* Spacing / radius — tiny radius (2px) keeps web feel without going SaaS */
61
61
  --r: 2px;
62
+ --r-sm: 4px;
62
63
  --r-md: 4px;
64
+
65
+ /* Inline elevation step above --bg-elev-2 for nested cards/dropdowns. */
66
+ --bg-elev-3: #1d2230;
67
+
68
+ /* Brand sweep — used by .md hr and the mini status bar fill. */
69
+ --gradient-rule: linear-gradient(90deg, var(--c-brand), var(--c-accent));
63
70
  }
64
71
 
65
72
  * { box-sizing: border-box; }
@@ -1157,7 +1164,7 @@ input:focus, textarea:focus, select:focus { border-color: var(--c-brand); }
1157
1164
  font-size: 16px;
1158
1165
  }
1159
1166
  .md h3 {
1160
- background: var(--grad-8);
1167
+ background: var(--s2);
1161
1168
  font-size: 14px;
1162
1169
  }
1163
1170
 
@@ -2064,7 +2071,7 @@ input:focus, textarea:focus, select:focus { border-color: var(--c-brand); }
2064
2071
  }
2065
2072
 
2066
2073
  .modal-picker-row.selected {
2067
- border-color: var(--accent, #fcd34d);
2074
+ border-color: var(--c-accent);
2068
2075
  background: var(--bg-elev-3, var(--bg-elev-2));
2069
2076
  }
2070
2077
 
@@ -2079,7 +2086,7 @@ input:focus, textarea:focus, select:focus { border-color: var(--c-brand); }
2079
2086
  color: var(--fg-2);
2080
2087
  padding: 1px 6px;
2081
2088
  border-radius: 999px;
2082
- background: var(--bg-elev-1, var(--bg-elev-2));
2089
+ background: var(--bg-elev);
2083
2090
  }
2084
2091
 
2085
2092
  .modal-picker-subtitle {
@@ -2669,7 +2676,7 @@ input:focus, textarea:focus, select:focus { border-color: var(--c-brand); }
2669
2676
  display: inline-flex;
2670
2677
  align-items: center;
2671
2678
  gap: 8px;
2672
- background: var(--bg-elev-1);
2679
+ background: var(--bg-elev);
2673
2680
  border: 1px solid var(--bd);
2674
2681
  border-radius: 6px;
2675
2682
  padding: 6px 10px;
@@ -3010,4 +3017,218 @@ input:focus, textarea:focus, select:focus { border-color: var(--c-brand); }
3010
3017
  font-size: 12px;
3011
3018
  }
3012
3019
 
3020
+ /* ═══════════════════════════════════════════════════════════════════════════
3021
+ Light theme — toggled via data-theme="light" on <html>
3022
+
3023
+ Palette inspired by Element Plus: clean white surfaces, dark body text,
3024
+ and slightly deepened accent colours so they stay legible on light
3025
+ backgrounds. Every variable from the :root dark set is overridden here;
3026
+ hardcoded-hex fixups follow in a second block.
3027
+ ═══════════════════════════════════════════════════════════════════════════ */
3028
+ [data-theme="light"] {
3029
+ /* Surfaces */
3030
+ --bg: #f5f7fa;
3031
+ --bg-elev: #ffffff;
3032
+ --bg-elev-2: #f0f2f5;
3033
+ --bg-input: #ffffff;
3034
+ --bg-code: #f5f7fa;
3035
+ --bg-hover: #ecf5ff;
3036
+
3037
+ /* Text */
3038
+ --fg-0: #303133; /* primary — headings, emphasis */
3039
+ --fg-1: #606266; /* body — paragraphs, default */
3040
+ --fg-2: #909399; /* secondary — labels, meta */
3041
+ --fg-3: #a8abb2; /* dim — placeholders, hints */
3042
+ --fg-4: #c0c4cc; /* very dim — separators, disabled */
3043
+
3044
+ /* Accents — deepened ~15% so they hit ≥4.5:1 on white */
3045
+ --c-brand: #409eff; /* primary blue (Element Plus) */
3046
+ --c-accent: #9b6bff; /* purple */
3047
+ --c-violet: #8b5cf6; /* violet */
3048
+ --c-ok: #67c23a; /* success green */
3049
+ --c-warn: #e6a23c; /* warning amber */
3050
+ --c-err: #f56c6c; /* error red */
3051
+ --c-info: #409eff;
3052
+
3053
+ /* Chart spectrum */
3054
+ --s1: #409eff;
3055
+ --s2: #36cfc9;
3056
+ --s3: #67c23a;
3057
+ --s4: #e6a23c;
3058
+ --s5: #f56c6c;
3059
+ --s6: #9b6bff;
3060
+
3061
+ /* Borders */
3062
+ --bd: #e4e7ed;
3063
+ --bd-strong: #dcdfe6;
3064
+
3065
+ /* Elevation step above --bg-elev-2 in light mode — matches the surface scale. */
3066
+ --bg-elev-3: #e4e7ed;
3067
+ }
3068
+
3069
+ /* ── Light-theme fixups for hardcoded hex / rgba values ────────────────
3070
+ These selectors use literal colours (not CSS variables) in the dark
3071
+ theme and therefore need explicit overrides to look correct on a
3072
+ white background. Keep them scoped under [data-theme="light"] so
3073
+ dark mode is never touched. ────────────────────────────────────────── */
3074
+
3075
+ /* Hardcoded #14171e borders (dark-theme inner dividers) → var(--bd) */
3076
+ [data-theme="light"] .section,
3077
+ [data-theme="light"] .ssl-row,
3078
+ [data-theme="light"] .sr-card {
3079
+ border-bottom-color: var(--bd);
3080
+ }
3081
+ [data-theme="light"] .overlay::before {
3082
+ border-color: var(--bd);
3083
+ }
3084
+ [data-theme="light"] .composer-foot {
3085
+ border-top-color: var(--bd);
3086
+ }
3087
+ [data-theme="light"] .scale-row {
3088
+ border-bottom-color: var(--bd);
3089
+ }
3090
+
3091
+ /* Primary button hover — lighten the brand colour instead of the
3092
+ dark-theme hardcoded #94cdff. */
3093
+ [data-theme="light"] .btn.primary:hover,
3094
+ [data-theme="light"] button.primary:hover {
3095
+ background: #66b1ff;
3096
+ border-color: #66b1ff;
3097
+ color: #fff;
3098
+ }
3099
+
3100
+ /* Markdown headings — dark theme puts black text on coloured bg;
3101
+ light theme uses white text for cleaner contrast. */
3102
+ [data-theme="light"] .md h1,
3103
+ [data-theme="light"] .md h2,
3104
+ [data-theme="light"] .md h3 {
3105
+ color: #fff;
3106
+ }
3107
+
3108
+ /* Chat banner — rgba tint references the brand colour so it must
3109
+ switch to the light-mode brand hex. */
3110
+ [data-theme="light"] .chat-banner {
3111
+ background: rgba(64,158,255,.06);
3112
+ border-color: rgba(64,158,255,.18);
3113
+ }
3114
+
3115
+ /* Pills — semi-transparent accent backgrounds must shift hue. */
3116
+ [data-theme="light"] .pill.ok { background: rgba(103,194,58,.10); }
3117
+ [data-theme="light"] .pill.warn { background: rgba(230,162,60,.12); }
3118
+ [data-theme="light"] .pill.err { background: rgba(245,108,108,.10); }
3119
+ [data-theme="light"] .pill.info { background: rgba(64,158,255,.10); }
3120
+ [data-theme="light"] .pill.acc { background: rgba(155,107,255,.10); }
3121
+ [data-theme="light"] .pill-err { background: rgba(245,108,108,.10); }
3122
+ [data-theme="light"] .pill-active { background: rgba(64,158,255,.10); }
3123
+
3124
+ /* Step-dot glow — brand-colour box-shadow. */
3125
+ [data-theme="light"] .plan-step.active::before {
3126
+ box-shadow: 0 0 0 3px rgba(64,158,255,.18);
3127
+ }
3128
+
3129
+ /* Filter chips active state. */
3130
+ [data-theme="light"] .chip-f.active {
3131
+ background: rgba(64,158,255,.08);
3132
+ }
3133
+ [data-theme="light"] .chip-f.static.active:hover {
3134
+ background: rgba(64,158,255,.08);
3135
+ }
3136
+
3137
+ /* Matrix cell on-state. */
3138
+ [data-theme="light"] .matrix .cell.on {
3139
+ background: rgba(64,158,255,.05);
3140
+ }
3141
+
3142
+ /* Editor line hover. */
3143
+ [data-theme="light"] .editor-line:hover {
3144
+ background: rgba(64,158,255,.04);
3145
+ }
3146
+ [data-theme="light"] .editor-line.cur {
3147
+ background: rgba(64,158,255,.06);
3148
+ }
3149
+
3150
+ /* Markdown search-result highlight. */
3151
+ [data-theme="light"] .sr-card .sr-snip mark {
3152
+ background: rgba(230,162,60,.18);
3153
+ }
3154
+
3155
+ /* Why / notes callout. */
3156
+ [data-theme="light"] .why {
3157
+ background: rgba(155,107,255,.04);
3158
+ }
3159
+
3160
+ /* Diff-line insert / delete. */
3161
+ [data-theme="light"] .diff-line.ins {
3162
+ background: rgba(103,194,58,0.10);
3163
+ color: var(--c-ok);
3164
+ }
3165
+ [data-theme="light"] .diff-line.del {
3166
+ background: rgba(245,108,108,0.10);
3167
+ color: var(--c-err);
3168
+ }
3169
+
3170
+ /* Diff-row add / remove backgrounds. */
3171
+ [data-theme="light"] .diff-row.add { background: rgba(103,194,58,.06); }
3172
+ [data-theme="light"] .diff-row.rem { background: rgba(245,108,108,.05); }
3173
+ [data-theme="light"] .diff-row .word-add { background: rgba(103,194,58,.22); }
3174
+ [data-theme="light"] .diff-row .word-rem { background: rgba(245,108,108,.20); }
3175
+
3176
+ /* Edit-diff side-by-side markers and borders. */
3177
+ [data-theme="light"] .edit-diff-side-old .edit-diff-marker { color: var(--c-err); }
3178
+ [data-theme="light"] .edit-diff-side-new .edit-diff-marker { color: var(--c-ok); }
3179
+ [data-theme="light"] .edit-diff-row-del .edit-diff-cell-old,
3180
+ [data-theme="light"] .edit-diff-row-change .edit-diff-cell-old {
3181
+ background: rgba(245,108,108,0.10);
3182
+ border-left-color: var(--c-err);
3183
+ }
3184
+ [data-theme="light"] .edit-diff-row-ins .edit-diff-cell-new,
3185
+ [data-theme="light"] .edit-diff-row-change .edit-diff-cell-new {
3186
+ background: rgba(103,194,58,0.10);
3187
+ border-left-color: var(--c-ok);
3188
+ }
3189
+
3190
+ /* Plan-revision modal border. */
3191
+ [data-theme="light"] .modal-revise-reason {
3192
+ border-left-color: var(--c-accent);
3193
+ }
3194
+
3195
+ /* Picker selected row. */
3196
+ [data-theme="light"] .modal-picker-row.selected {
3197
+ border-color: var(--c-warn);
3198
+ }
3199
+
3200
+ /* Modal viewer step-done mark. */
3201
+ [data-theme="light"] .modal-viewer-step-done .modal-viewer-step-mark {
3202
+ color: var(--c-ok);
3203
+ }
3204
+
3205
+ /* Top-bar status dot glow. */
3206
+ [data-theme="light"] .tui-status.online .dot {
3207
+ box-shadow: 0 0 6px rgba(103,194,58,.5);
3208
+ }
3209
+
3210
+ /* Dialog box-shadow — dark mode uses a deep black shadow; light mode
3211
+ needs a softer grey one. */
3212
+ [data-theme="light"] .dialog {
3213
+ box-shadow: 0 18px 48px rgba(0,0,0,.08), 0 0 0 1px rgba(0,0,0,.04);
3214
+ }
3215
+ [data-theme="light"] .cmd-palette {
3216
+ box-shadow: 0 24px 64px rgba(0,0,0,.10);
3217
+ }
3218
+ [data-theme="light"] .popover {
3219
+ box-shadow: 0 12px 32px rgba(0,0,0,.08);
3220
+ }
3221
+
3222
+ /* Scrollbar — lighter thumb for light backgrounds. */
3223
+ [data-theme="light"] * {
3224
+ scrollbar-color: var(--bd-strong) transparent;
3225
+ }
3226
+ [data-theme="light"] *::-webkit-scrollbar-thumb {
3227
+ background: var(--bd);
3228
+ border-color: var(--bg);
3229
+ }
3230
+ [data-theme="light"] *::-webkit-scrollbar-thumb:hover {
3231
+ background: var(--fg-4);
3232
+ }
3233
+
3013
3234