reasonix 0.47.2 → 0.48.1
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 +14 -26
- package/README.zh-CN.md +5 -26
- package/dist/cli/{acp-GEOAKSTU.js → acp-QJGGHQLA.js} +52 -135
- package/dist/cli/acp-QJGGHQLA.js.map +1 -0
- package/dist/cli/{chat-YTPATMMG.js → chat-ZXF227MP.js} +25 -25
- package/dist/cli/{chunk-DN4B5S6Y.js → chunk-3FULTFRB.js} +2 -2
- package/dist/cli/chunk-43ROGEX2.js +5190 -0
- package/dist/cli/chunk-43ROGEX2.js.map +1 -0
- package/dist/cli/{chunk-DQ6K5ZQ7.js → chunk-4E2BHJU4.js} +4 -4
- package/dist/cli/chunk-4E2BHJU4.js.map +1 -0
- package/dist/cli/{chunk-T5A7EY6B.js → chunk-5AW6NIHU.js} +2 -2
- package/dist/cli/{chunk-DWPAKZTY.js → chunk-5U5LMMFF.js} +2 -2
- package/dist/cli/{chunk-TRSAHHCL.js → chunk-6FRNXWDZ.js} +321 -76
- package/dist/cli/chunk-6FRNXWDZ.js.map +1 -0
- package/dist/cli/{chunk-KYQVQ5X4.js → chunk-B5CZL2SE.js} +9 -4
- package/dist/cli/chunk-B5CZL2SE.js.map +1 -0
- package/dist/cli/{chunk-XMHP7BEE.js → chunk-DABAOQSV.js} +2273 -2517
- package/dist/cli/chunk-DABAOQSV.js.map +1 -0
- package/dist/cli/chunk-EO6RPTJG.js +831 -0
- package/dist/cli/chunk-EO6RPTJG.js.map +1 -0
- package/dist/cli/{chunk-BQ6HC66J.js → chunk-FD7SNDWW.js} +4 -14
- package/dist/cli/chunk-FD7SNDWW.js.map +1 -0
- package/dist/cli/chunk-FPME5QOO.js +17747 -0
- package/dist/cli/chunk-FPME5QOO.js.map +1 -0
- package/dist/cli/{chunk-6QC5RQLE.js → chunk-H2F4LDNH.js} +2 -2
- package/dist/cli/{chunk-QCFLPSPH.js → chunk-IKSYVBBZ.js} +2 -2
- package/dist/cli/{chunk-5QCB62C4.js → chunk-J2TQAWOM.js} +135 -18
- package/dist/cli/{chunk-5QCB62C4.js.map → chunk-J2TQAWOM.js.map} +1 -1
- package/dist/cli/{chunk-JBH5RM7X.js → chunk-JFBGSWQB.js} +395 -85
- package/dist/cli/chunk-JFBGSWQB.js.map +1 -0
- package/dist/cli/{chunk-CCJAP7G3.js → chunk-KH5JIJJD.js} +2 -2
- package/dist/cli/{chunk-TDHXB2ER.js → chunk-NQZ5U37J.js} +2 -2
- package/dist/cli/{chunk-CNG32VAB.js → chunk-O3AGYTG2.js} +2 -2
- package/dist/cli/{chunk-NRQ5UP5T.js → chunk-PIC5HJRD.js} +234 -40
- package/dist/cli/chunk-PIC5HJRD.js.map +1 -0
- package/dist/cli/{chunk-GH7DC2Y5.js → chunk-PJIQIYTV.js} +6 -3
- package/dist/cli/chunk-PJIQIYTV.js.map +1 -0
- package/dist/cli/{chunk-KVZZ5U75.js → chunk-R7U44O3Y.js} +2 -2
- package/dist/cli/{chunk-ZXSCAODE.js → chunk-RCLS63KE.js} +71 -3
- package/dist/cli/chunk-RCLS63KE.js.map +1 -0
- package/dist/cli/{chunk-FY4S7TJZ.js → chunk-SLAFMXAZ.js} +10 -2
- package/dist/cli/chunk-SLAFMXAZ.js.map +1 -0
- package/dist/cli/{chunk-TRWHTFG7.js → chunk-SWUMD2LX.js} +2 -2
- package/dist/cli/{chunk-2XY77LW7.js → chunk-TIJ4ZHD6.js} +56 -24
- package/dist/cli/chunk-TIJ4ZHD6.js.map +1 -0
- package/dist/cli/{chunk-4MFCAZ2W.js → chunk-WKOXKCF3.js} +3 -3
- package/dist/cli/{chunk-HUILPCYX.js → chunk-XMR2VCGT.js} +3 -3
- package/dist/cli/{code-Q4NRVEDG.js → code-OKA5YPOH.js} +31 -32
- package/dist/cli/code-OKA5YPOH.js.map +1 -0
- package/dist/cli/{commands-4CDI4GFM.js → commands-3U6PUVSS.js} +4 -4
- package/dist/cli/{commit-GW7LDQP5.js → commit-HFB7SRBU.js} +3 -3
- package/dist/cli/{desktop-EG6P5SF2.js → desktop-G7UMW3CJ.js} +503 -48
- package/dist/cli/desktop-G7UMW3CJ.js.map +1 -0
- package/dist/cli/{diff-VI2YX4FN.js → diff-PGXW4YZD.js} +8 -8
- package/dist/cli/{doctor-CQTTZP27.js → doctor-WWJFLVCB.js} +9 -9
- package/dist/cli/index.js +53 -41
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/{mcp-J2UCD4RZ.js → mcp-Y3VKIK3T.js} +2 -2
- package/dist/cli/{mcp-browse-GSX34JEK.js → mcp-browse-4IN2QIFR.js} +2 -2
- package/dist/cli/{mcp-inspect-RRFYF4ZV.js → mcp-inspect-BUXFXDHB.js} +2 -2
- package/dist/cli/{prompt-5TQPIVHV.js → prompt-US57R6BA.js} +5 -4
- package/dist/cli/{replay-MJCEMODU.js → replay-EQJMZRB3.js} +8 -8
- package/dist/cli/{run-P4D5VDYE.js → run-KVEI66TR.js} +14 -14
- package/dist/cli/{server-C25JNNZV.js → server-D6C4GHWN.js} +18 -15
- package/dist/cli/server-D6C4GHWN.js.map +1 -0
- package/dist/cli/{sessions-QIONZJQ6.js → sessions-TGVS2RQZ.js} +13 -13
- package/dist/cli/{setup-NLQ6G5G4.js → setup-WLKX6GGG.js} +5 -5
- package/dist/cli/{stats-DFZEXHP4.js → stats-TCD7Q6MB.js} +6 -6
- package/dist/cli/{version-GR3X3MPI.js → version-BCWWS2OU.js} +13 -13
- package/dist/grammars/tree-sitter-go.wasm +0 -0
- package/dist/grammars/tree-sitter-java.wasm +0 -0
- package/dist/grammars/tree-sitter-javascript.wasm +0 -0
- package/dist/grammars/tree-sitter-python.wasm +0 -0
- package/dist/grammars/tree-sitter-rust.wasm +0 -0
- package/dist/grammars/tree-sitter-tsx.wasm +0 -0
- package/dist/grammars/tree-sitter-typescript.wasm +0 -0
- package/dist/grammars/web-tree-sitter.wasm +0 -0
- package/dist/index.d.ts +46 -12
- package/dist/index.js +684 -129
- package/dist/index.js.map +1 -1
- package/package.json +16 -4
- package/dist/cli/acp-GEOAKSTU.js.map +0 -1
- package/dist/cli/chunk-2XY77LW7.js.map +0 -1
- package/dist/cli/chunk-6CRPCJAU.js +0 -3141
- package/dist/cli/chunk-6CRPCJAU.js.map +0 -1
- package/dist/cli/chunk-BQ6HC66J.js.map +0 -1
- package/dist/cli/chunk-DQ6K5ZQ7.js.map +0 -1
- package/dist/cli/chunk-FY4S7TJZ.js.map +0 -1
- package/dist/cli/chunk-GH7DC2Y5.js.map +0 -1
- package/dist/cli/chunk-JBH5RM7X.js.map +0 -1
- package/dist/cli/chunk-KYQVQ5X4.js.map +0 -1
- package/dist/cli/chunk-NRQ5UP5T.js.map +0 -1
- package/dist/cli/chunk-TRSAHHCL.js.map +0 -1
- package/dist/cli/chunk-XD6P7AFH.js +0 -375
- package/dist/cli/chunk-XD6P7AFH.js.map +0 -1
- package/dist/cli/chunk-XMHP7BEE.js.map +0 -1
- package/dist/cli/chunk-YFP3MYMY.js +0 -323
- package/dist/cli/chunk-YFP3MYMY.js.map +0 -1
- package/dist/cli/chunk-ZXSCAODE.js.map +0 -1
- package/dist/cli/code-Q4NRVEDG.js.map +0 -1
- package/dist/cli/desktop-EG6P5SF2.js.map +0 -1
- package/dist/cli/server-C25JNNZV.js.map +0 -1
- /package/dist/cli/{chat-YTPATMMG.js.map → chat-ZXF227MP.js.map} +0 -0
- /package/dist/cli/{chunk-DN4B5S6Y.js.map → chunk-3FULTFRB.js.map} +0 -0
- /package/dist/cli/{chunk-T5A7EY6B.js.map → chunk-5AW6NIHU.js.map} +0 -0
- /package/dist/cli/{chunk-DWPAKZTY.js.map → chunk-5U5LMMFF.js.map} +0 -0
- /package/dist/cli/{chunk-6QC5RQLE.js.map → chunk-H2F4LDNH.js.map} +0 -0
- /package/dist/cli/{chunk-QCFLPSPH.js.map → chunk-IKSYVBBZ.js.map} +0 -0
- /package/dist/cli/{chunk-CCJAP7G3.js.map → chunk-KH5JIJJD.js.map} +0 -0
- /package/dist/cli/{chunk-TDHXB2ER.js.map → chunk-NQZ5U37J.js.map} +0 -0
- /package/dist/cli/{chunk-CNG32VAB.js.map → chunk-O3AGYTG2.js.map} +0 -0
- /package/dist/cli/{chunk-KVZZ5U75.js.map → chunk-R7U44O3Y.js.map} +0 -0
- /package/dist/cli/{chunk-TRWHTFG7.js.map → chunk-SWUMD2LX.js.map} +0 -0
- /package/dist/cli/{chunk-4MFCAZ2W.js.map → chunk-WKOXKCF3.js.map} +0 -0
- /package/dist/cli/{chunk-HUILPCYX.js.map → chunk-XMR2VCGT.js.map} +0 -0
- /package/dist/cli/{commands-4CDI4GFM.js.map → commands-3U6PUVSS.js.map} +0 -0
- /package/dist/cli/{commit-GW7LDQP5.js.map → commit-HFB7SRBU.js.map} +0 -0
- /package/dist/cli/{diff-VI2YX4FN.js.map → diff-PGXW4YZD.js.map} +0 -0
- /package/dist/cli/{doctor-CQTTZP27.js.map → doctor-WWJFLVCB.js.map} +0 -0
- /package/dist/cli/{mcp-J2UCD4RZ.js.map → mcp-Y3VKIK3T.js.map} +0 -0
- /package/dist/cli/{mcp-browse-GSX34JEK.js.map → mcp-browse-4IN2QIFR.js.map} +0 -0
- /package/dist/cli/{mcp-inspect-RRFYF4ZV.js.map → mcp-inspect-BUXFXDHB.js.map} +0 -0
- /package/dist/cli/{prompt-5TQPIVHV.js.map → prompt-US57R6BA.js.map} +0 -0
- /package/dist/cli/{replay-MJCEMODU.js.map → replay-EQJMZRB3.js.map} +0 -0
- /package/dist/cli/{run-P4D5VDYE.js.map → run-KVEI66TR.js.map} +0 -0
- /package/dist/cli/{sessions-QIONZJQ6.js.map → sessions-TGVS2RQZ.js.map} +0 -0
- /package/dist/cli/{setup-NLQ6G5G4.js.map → setup-WLKX6GGG.js.map} +0 -0
- /package/dist/cli/{stats-DFZEXHP4.js.map → stats-TCD7Q6MB.js.map} +0 -0
- /package/dist/cli/{version-GR3X3MPI.js.map → version-BCWWS2OU.js.map} +0 -0
package/README.md
CHANGED
|
@@ -82,6 +82,15 @@ Grab a [DeepSeek API key →](https://platform.deepseek.com/api_keys) · `reason
|
|
|
82
82
|
|
|
83
83
|
If you use Reasonix daily, global install is the simplest path. If you just want to try it, use `npx`.
|
|
84
84
|
|
|
85
|
+
**Prefer fewer keystrokes?** The shorter `dsnix` alias resolves to the same CLI:
|
|
86
|
+
|
|
87
|
+
~~~bash
|
|
88
|
+
npm install -g dsnix # exposes `dsnix` on PATH, depends on reasonix
|
|
89
|
+
npx dsnix@latest code # one-shot via the shorter command
|
|
90
|
+
~~~
|
|
91
|
+
|
|
92
|
+
A global `npm install -g reasonix` also drops a `dsnix` shim on PATH, so the two are interchangeable.
|
|
93
|
+
|
|
85
94
|
Bare `reasonix` (no subcommand) launches `code` in the current directory — typing `reasonix` and `reasonix code` are equivalent.
|
|
86
95
|
|
|
87
96
|
| Command | When |
|
|
@@ -96,35 +105,14 @@ Other subcommands (`replay` · `diff` · `events` · `stats` · `index` · `mcp`
|
|
|
96
105
|
|
|
97
106
|
### QQ channel
|
|
98
107
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
Start a session first:
|
|
102
|
-
|
|
103
|
-
~~~bash
|
|
104
|
-
reasonix code
|
|
105
|
-
# or
|
|
106
|
-
reasonix chat
|
|
107
|
-
~~~
|
|
108
|
-
|
|
109
|
-
Then connect QQ from inside the session:
|
|
110
|
-
|
|
111
|
-
~~~text
|
|
112
|
-
/qq connect
|
|
113
|
-
~~~
|
|
114
|
-
|
|
115
|
-
On first use, Reasonix asks for the QQ `App ID` and `App Secret` inside the current TUI. Later `/qq connect` calls reuse the saved credentials directly.
|
|
116
|
-
|
|
117
|
-
Available commands:
|
|
118
|
-
|
|
119
|
-
- `/qq connect`
|
|
120
|
-
- `/qq status`
|
|
121
|
-
- `/qq disconnect`
|
|
108
|
+
QQ can extend an existing `chat`, `code`, or desktop session as a remote channel. It is part of the current session flow, not a separate runtime mode.
|
|
122
109
|
|
|
123
|
-
|
|
110
|
+
- CLI: start a session, then run `/qq connect`
|
|
111
|
+
- Desktop: open `Settings -> General -> QQ Channel`
|
|
124
112
|
|
|
125
|
-
|
|
113
|
+
Once connected, QQ messages can enter the current session, assistant replies route back to QQ, and follow-up interactions can continue remotely.
|
|
126
114
|
|
|
127
|
-
|
|
115
|
+
For full setup, desktop quick start, and troubleshooting, see [QQ channel setup](./docs/qq-connect.md).
|
|
128
116
|
|
|
129
117
|
### Desktop client (prerelease)
|
|
130
118
|
|
package/README.zh-CN.md
CHANGED
|
@@ -80,35 +80,14 @@ npx reasonix code # 首次运行粘贴 DeepSeek API Key,之后会记住
|
|
|
80
80
|
|
|
81
81
|
### QQ 通道
|
|
82
82
|
|
|
83
|
-
Reasonix
|
|
83
|
+
Reasonix 可以把现有的 `chat`、`code` 或桌面端会话延伸到 QQ 上,作为远程通道使用;它扩展的是当前会话,不是独立的新运行模式。
|
|
84
84
|
|
|
85
|
-
|
|
85
|
+
- CLI:先启动会话,再执行 `/qq connect`
|
|
86
|
+
- 桌面端:打开 `设置 -> 通用 -> QQ通道`
|
|
86
87
|
|
|
87
|
-
|
|
88
|
-
reasonix code
|
|
89
|
-
# 或
|
|
90
|
-
reasonix chat
|
|
91
|
-
~~~
|
|
92
|
-
|
|
93
|
-
然后在会话里连接 QQ:
|
|
94
|
-
|
|
95
|
-
~~~text
|
|
96
|
-
/qq connect
|
|
97
|
-
~~~
|
|
98
|
-
|
|
99
|
-
第一次使用时,Reasonix 会直接在当前 TUI 里引导输入 QQ 的 `App ID` 和 `App Secret`;之后再次执行 `/qq connect` 会直接复用已保存凭据。
|
|
100
|
-
|
|
101
|
-
可用命令:
|
|
102
|
-
|
|
103
|
-
- `/qq connect`
|
|
104
|
-
- `/qq status`
|
|
105
|
-
- `/qq disconnect`
|
|
106
|
-
|
|
107
|
-
启用后,后续的 `chat` / `code` 会话会自动启动 QQ 通道。斜杠命令、确认提示,以及后续助手回复都可以通过 QQ 继续完成,不需要回到终端交互。
|
|
108
|
-
|
|
109
|
-
桌面端也可以在 `Settings -> General -> QQ Channel` 里配置同一条通道。
|
|
88
|
+
连接成功后,QQ 消息可以进入当前会话,助手回复会回到 QQ,后续确认和跟进交互也可以继续在 QQ 上完成。
|
|
110
89
|
|
|
111
|
-
|
|
90
|
+
完整配置、桌面端快速上手与排障说明见:[QQ 连接指南](./docs/qq-connect.zh-CN.md)。
|
|
112
91
|
|
|
113
92
|
<details>
|
|
114
93
|
<summary><strong>切换工作区 · chat vs. code · 写第一个 Skill</strong></summary>
|
|
@@ -2,15 +2,15 @@
|
|
|
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
|
buildCodeToolset
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-43ROGEX2.js";
|
|
6
6
|
import {
|
|
7
7
|
Eventizer,
|
|
8
8
|
autoResolveVerdict
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-RCLS63KE.js";
|
|
10
10
|
import {
|
|
11
11
|
formatMcpLifecycleEvent,
|
|
12
12
|
formatMcpSlowToast
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-4E2BHJU4.js";
|
|
14
14
|
import {
|
|
15
15
|
buildTransportFromSpec,
|
|
16
16
|
preflightStdioSpec
|
|
@@ -19,19 +19,19 @@ import {
|
|
|
19
19
|
CacheFirstLoop,
|
|
20
20
|
ImmutablePrefix,
|
|
21
21
|
bridgeMcpTools
|
|
22
|
-
} from "./chunk-
|
|
23
|
-
import "./chunk-
|
|
22
|
+
} from "./chunk-JFBGSWQB.js";
|
|
23
|
+
import "./chunk-H2F4LDNH.js";
|
|
24
24
|
import {
|
|
25
25
|
openTranscriptFile,
|
|
26
26
|
recordFromLoopEvent,
|
|
27
27
|
writeRecord
|
|
28
|
-
} from "./chunk-
|
|
28
|
+
} from "./chunk-XMR2VCGT.js";
|
|
29
29
|
import {
|
|
30
30
|
McpClient
|
|
31
31
|
} from "./chunk-HIYTRCSW.js";
|
|
32
32
|
import {
|
|
33
33
|
codeSystemPrompt
|
|
34
|
-
} from "./chunk-
|
|
34
|
+
} from "./chunk-FD7SNDWW.js";
|
|
35
35
|
import {
|
|
36
36
|
canonicalPresetName,
|
|
37
37
|
resolvePreset
|
|
@@ -39,30 +39,31 @@ import {
|
|
|
39
39
|
import "./chunk-6OWJV3YW.js";
|
|
40
40
|
import {
|
|
41
41
|
DeepSeekClient
|
|
42
|
-
} from "./chunk-
|
|
42
|
+
} from "./chunk-5U5LMMFF.js";
|
|
43
43
|
import "./chunk-25T6CVUP.js";
|
|
44
44
|
import {
|
|
45
45
|
loadDotenv
|
|
46
46
|
} from "./chunk-2UQP6H6T.js";
|
|
47
|
-
import "./chunk-
|
|
47
|
+
import "./chunk-R7U44O3Y.js";
|
|
48
48
|
import {
|
|
49
|
-
derivePrefix,
|
|
50
49
|
pauseGate,
|
|
50
|
+
resolveApprovalPrompt,
|
|
51
|
+
toApprovalPrompt,
|
|
51
52
|
toolKindFor
|
|
52
|
-
} from "./chunk-
|
|
53
|
-
import "./chunk-
|
|
53
|
+
} from "./chunk-6FRNXWDZ.js";
|
|
54
|
+
import "./chunk-SLAFMXAZ.js";
|
|
54
55
|
import "./chunk-PLHAZOLZ.js";
|
|
55
|
-
import "./chunk-
|
|
56
|
-
import "./chunk-
|
|
56
|
+
import "./chunk-5AW6NIHU.js";
|
|
57
|
+
import "./chunk-PJIQIYTV.js";
|
|
57
58
|
import "./chunk-S4XVGLRW.js";
|
|
58
59
|
import {
|
|
59
60
|
timestampSuffix
|
|
60
61
|
} from "./chunk-RRXUIPWG.js";
|
|
61
|
-
import "./chunk-
|
|
62
|
-
import "./chunk-
|
|
62
|
+
import "./chunk-3FULTFRB.js";
|
|
63
|
+
import "./chunk-IKSYVBBZ.js";
|
|
63
64
|
import {
|
|
64
65
|
t
|
|
65
|
-
} from "./chunk-
|
|
66
|
+
} from "./chunk-PIC5HJRD.js";
|
|
66
67
|
import {
|
|
67
68
|
loadApiKey,
|
|
68
69
|
loadBaseUrl,
|
|
@@ -71,7 +72,7 @@ import {
|
|
|
71
72
|
loadReasoningEffort,
|
|
72
73
|
normalizeMcpConfig,
|
|
73
74
|
readConfig
|
|
74
|
-
} from "./chunk-
|
|
75
|
+
} from "./chunk-FPME5QOO.js";
|
|
75
76
|
import {
|
|
76
77
|
VERSION
|
|
77
78
|
} from "./chunk-XXC2BYTV.js";
|
|
@@ -172,133 +173,46 @@ function emit(server, params) {
|
|
|
172
173
|
}
|
|
173
174
|
|
|
174
175
|
// src/acp/gates.ts
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
function permissionOptionsFor(req) {
|
|
184
|
-
switch (req.kind) {
|
|
185
|
-
case "run_command":
|
|
186
|
-
case "run_background":
|
|
187
|
-
case "path_access":
|
|
188
|
-
return [
|
|
189
|
-
{ optionId: ID_ALLOW_ONCE, name: "Allow once", kind: "allow_once" },
|
|
190
|
-
{ optionId: ID_ALLOW_ALWAYS, name: "Allow always", kind: "allow_always" },
|
|
191
|
-
{ optionId: ID_REJECT, name: "Reject", kind: "reject_once" }
|
|
192
|
-
];
|
|
193
|
-
case "plan_proposed":
|
|
194
|
-
return [
|
|
195
|
-
{ optionId: ID_ALLOW_ONCE, name: "Approve plan", kind: "allow_once" },
|
|
196
|
-
{ optionId: ID_REFINE, name: "Refine", kind: "allow_once" },
|
|
197
|
-
{ optionId: ID_CANCEL, name: "Cancel", kind: "reject_once" }
|
|
198
|
-
];
|
|
199
|
-
case "plan_checkpoint":
|
|
200
|
-
return [
|
|
201
|
-
{ optionId: ID_ALLOW_ONCE, name: "Continue", kind: "allow_once" },
|
|
202
|
-
{ optionId: ID_REVISE, name: "Revise", kind: "allow_once" },
|
|
203
|
-
{ optionId: ID_STOP, name: "Stop", kind: "reject_once" }
|
|
204
|
-
];
|
|
205
|
-
case "plan_revision":
|
|
206
|
-
return [
|
|
207
|
-
{ optionId: ID_ACCEPT, name: "Accept revision", kind: "allow_once" },
|
|
208
|
-
{ optionId: ID_REJECT, name: "Keep original plan", kind: "reject_once" }
|
|
209
|
-
];
|
|
210
|
-
case "choice": {
|
|
211
|
-
const payload = req.payload;
|
|
212
|
-
const opts = (payload.options ?? []).map((o) => ({
|
|
213
|
-
optionId: o.id,
|
|
214
|
-
name: o.title ?? o.id,
|
|
215
|
-
kind: "allow_once"
|
|
216
|
-
}));
|
|
217
|
-
opts.push({ optionId: ID_CANCEL, name: "Cancel", kind: "reject_once" });
|
|
218
|
-
return opts;
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
function pathPrefix(p) {
|
|
223
|
-
return p;
|
|
224
|
-
}
|
|
225
|
-
function verdictFor(req, result) {
|
|
226
|
-
const cancelled = result.outcome.outcome === "cancelled";
|
|
227
|
-
const optionId = result.outcome.outcome === "selected" ? result.outcome.optionId : null;
|
|
228
|
-
switch (req.kind) {
|
|
229
|
-
case "run_command":
|
|
230
|
-
case "run_background": {
|
|
231
|
-
if (cancelled || optionId === ID_REJECT) return { type: "deny" };
|
|
232
|
-
if (optionId === ID_ALLOW_ALWAYS) {
|
|
233
|
-
const payload = req.payload;
|
|
234
|
-
return { type: "always_allow", prefix: derivePrefix(payload.command ?? "") };
|
|
235
|
-
}
|
|
236
|
-
return { type: "run_once" };
|
|
237
|
-
}
|
|
238
|
-
case "path_access": {
|
|
239
|
-
if (cancelled || optionId === ID_REJECT) return { type: "deny" };
|
|
240
|
-
if (optionId === ID_ALLOW_ALWAYS) {
|
|
241
|
-
const payload = req.payload;
|
|
242
|
-
return { type: "always_allow", prefix: pathPrefix(payload.allowPrefix) };
|
|
243
|
-
}
|
|
244
|
-
return { type: "run_once" };
|
|
245
|
-
}
|
|
246
|
-
case "plan_proposed": {
|
|
247
|
-
if (cancelled || optionId === ID_CANCEL) return { type: "cancel" };
|
|
248
|
-
if (optionId === ID_REFINE) return { type: "refine" };
|
|
249
|
-
return { type: "approve" };
|
|
250
|
-
}
|
|
251
|
-
case "plan_checkpoint": {
|
|
252
|
-
if (cancelled || optionId === ID_STOP) return { type: "stop" };
|
|
253
|
-
if (optionId === ID_REVISE) return { type: "revise" };
|
|
254
|
-
return { type: "continue" };
|
|
255
|
-
}
|
|
256
|
-
case "plan_revision": {
|
|
257
|
-
if (cancelled) return { type: "cancelled" };
|
|
258
|
-
if (optionId === ID_ACCEPT) return { type: "accepted" };
|
|
259
|
-
return { type: "rejected" };
|
|
260
|
-
}
|
|
261
|
-
case "choice": {
|
|
262
|
-
if (cancelled || optionId === ID_CANCEL || !optionId) return { type: "cancel" };
|
|
263
|
-
return { type: "pick", optionId };
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
function permissionTitleFor(req) {
|
|
268
|
-
switch (req.kind) {
|
|
269
|
-
case "run_command":
|
|
270
|
-
case "run_background":
|
|
271
|
-
return `Run command \u2014 ${(req.payload.command ?? "").slice(0, 80)}`;
|
|
272
|
-
case "path_access":
|
|
273
|
-
return `Access path \u2014 ${req.payload.path}`;
|
|
274
|
-
case "plan_proposed":
|
|
275
|
-
return "Approve plan";
|
|
276
|
-
case "plan_checkpoint":
|
|
277
|
-
return `Checkpoint \u2014 ${req.payload.title ?? "step complete"}`;
|
|
278
|
-
case "plan_revision":
|
|
279
|
-
return "Approve plan revision";
|
|
280
|
-
case "choice":
|
|
281
|
-
return req.payload.question ?? "Choose an option";
|
|
176
|
+
function acpPermissionKindFor(prompt) {
|
|
177
|
+
switch (prompt.kind) {
|
|
178
|
+
case "shell":
|
|
179
|
+
return "execute";
|
|
180
|
+
case "path":
|
|
181
|
+
return prompt.data?.intent === "write" ? "edit" : "other";
|
|
182
|
+
default:
|
|
183
|
+
return "other";
|
|
282
184
|
}
|
|
283
185
|
}
|
|
284
|
-
function
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
186
|
+
function acpOptionKindFor(kind) {
|
|
187
|
+
switch (kind) {
|
|
188
|
+
case "allow_once":
|
|
189
|
+
return "allow_once";
|
|
190
|
+
case "allow_always":
|
|
191
|
+
return "allow_always";
|
|
192
|
+
case "reject":
|
|
193
|
+
return "reject_once";
|
|
194
|
+
case "custom":
|
|
195
|
+
return "allow_once";
|
|
288
196
|
}
|
|
289
|
-
return "other";
|
|
290
197
|
}
|
|
291
198
|
async function requestPermissionForGate(server, sessionId, req) {
|
|
199
|
+
const prompt = toApprovalPrompt(req);
|
|
292
200
|
const params = {
|
|
293
201
|
sessionId,
|
|
294
202
|
toolCall: {
|
|
295
203
|
toolCallId: `gate-${req.id}`,
|
|
296
|
-
title:
|
|
297
|
-
kind:
|
|
204
|
+
title: prompt.title,
|
|
205
|
+
kind: acpPermissionKindFor(prompt),
|
|
298
206
|
status: "pending",
|
|
299
207
|
rawInput: req.payload
|
|
300
208
|
},
|
|
301
|
-
options:
|
|
209
|
+
options: prompt.actions.map(
|
|
210
|
+
(a) => ({
|
|
211
|
+
optionId: a.id,
|
|
212
|
+
name: a.label,
|
|
213
|
+
kind: acpOptionKindFor(a.kind)
|
|
214
|
+
})
|
|
215
|
+
)
|
|
302
216
|
};
|
|
303
217
|
let result;
|
|
304
218
|
try {
|
|
@@ -309,7 +223,10 @@ async function requestPermissionForGate(server, sessionId, req) {
|
|
|
309
223
|
} catch {
|
|
310
224
|
result = { outcome: { outcome: "cancelled" } };
|
|
311
225
|
}
|
|
312
|
-
|
|
226
|
+
if (result.outcome.outcome === "cancelled") {
|
|
227
|
+
return resolveApprovalPrompt(prompt, "");
|
|
228
|
+
}
|
|
229
|
+
return resolveApprovalPrompt(prompt, result.outcome.optionId);
|
|
313
230
|
}
|
|
314
231
|
|
|
315
232
|
// src/acp/protocol.ts
|
|
@@ -680,4 +597,4 @@ export {
|
|
|
680
597
|
acpCommand,
|
|
681
598
|
loadMcpServers
|
|
682
599
|
};
|
|
683
|
-
//# sourceMappingURL=acp-
|
|
600
|
+
//# sourceMappingURL=acp-QJGGHQLA.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/cli/commands/acp.ts","../../src/acp/dispatch.ts","../../src/acp/gates.ts","../../src/acp/protocol.ts","../../src/acp/server.ts"],"sourcesContent":["/** ACP (Agent Client Protocol) agent — drives the cache-first loop over stdio NDJSON JSON-RPC. */\n\nimport { AsyncLocalStorage } from \"node:async_hooks\";\nimport { type WriteStream, existsSync, statSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { dispatchKernelEvent } from \"../../acp/dispatch.js\";\nimport { requestPermissionForGate } from \"../../acp/gates.js\";\nimport {\n ACP_PROTOCOL_VERSION,\n type ContentBlock,\n ERR_INVALID_PARAMS,\n type InitializeParams,\n type InitializeResult,\n type SessionCancelParams,\n type SessionNewParams,\n type SessionNewResult,\n type SessionPromptParams,\n type SessionPromptResult,\n type SessionUpdateParams,\n type StopReason,\n flattenPrompt,\n} from \"../../acp/protocol.js\";\nimport { AcpServer } from \"../../acp/server.js\";\nimport { codeSystemPrompt } from \"../../code/prompt.js\";\nimport { buildCodeToolset } from \"../../code/setup.js\";\nimport {\n loadApiKey,\n loadBaseUrl,\n loadPreset,\n loadReasoningEffort,\n normalizeMcpConfig,\n readConfig,\n} from \"../../config.js\";\nimport { loadEditMode } from \"../../config.js\";\nimport { Eventizer } from \"../../core/eventize.js\";\nimport { pauseGate } from \"../../core/pause-gate.js\";\nimport { autoResolveVerdict } from \"../../core/pause-policy.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 { timestampSuffix } from \"../../memory/session.js\";\nimport { openTranscriptFile, recordFromLoopEvent, writeRecord } from \"../../transcript/log.js\";\nimport { VERSION } from \"../../version.js\";\nimport { formatMcpLifecycleEvent } from \"../ui/mcp-lifecycle.js\";\nimport { formatMcpSlowToast } from \"../ui/mcp-toast.js\";\nimport { canonicalPresetName, resolvePreset } from \"../ui/presets.js\";\n\nexport interface AcpOptions {\n model?: string;\n dir?: string;\n budgetUsd?: number;\n transcript?: string;\n yolo?: boolean;\n /** Zero or more MCP server specs. Each: `\"name=cmd args...\"` or `\"cmd args...\"`. */\n mcpSpecs?: string[];\n /** Global prefix — only honored when a single anonymous server is given. */\n mcpPrefix?: string;\n}\n\ninterface Session {\n id: string;\n rootDir: string;\n model: string;\n toolset: Awaited<ReturnType<typeof buildCodeToolset>>;\n mcpClients: McpClient[];\n loop: CacheFirstLoop;\n eventizer: Eventizer;\n ctx: { model: string; prefixHash: string; reasoningEffort: \"high\" | \"max\" };\n aborter: AbortController | null;\n}\n\nfunction resolveMcpPrefix(\n specName: string | null | undefined,\n specCount: number,\n globalPrefix: string | undefined,\n): string {\n if (specName) return `${specName}_`;\n if (specCount === 1 && globalPrefix) return globalPrefix;\n return \"\";\n}\n\n// Mirrors run.ts:81-142.\nexport async function loadMcpServers(\n tools: import(\"../../tools.js\").ToolRegistry,\n specs: string[],\n globalPrefix: string | undefined,\n): Promise<McpClient[]> {\n const clients: McpClient[] = [];\n if (specs.length === 0) return clients;\n const cfg = readConfig();\n const normalizedSpecs = normalizeMcpConfig(cfg, specs);\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 = resolveMcpPrefix(spec.name, normalizedSpecs.length, globalPrefix);\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 } catch (err) {\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 return clients;\n}\n\nfunction resolveDir(raw: string | undefined, fallback: string): string {\n if (!raw) return fallback;\n const abs = resolve(raw);\n if (!existsSync(abs) || !statSync(abs).isDirectory()) {\n throw new Error(`workspace directory not found: ${abs}`);\n }\n return abs;\n}\n\nasync function buildSession(opts: {\n rootDir: string;\n modelOverride?: string;\n budgetUsd?: number;\n mcpSpecs?: string[];\n mcpPrefix?: string;\n}): Promise<Session> {\n const preset = canonicalPresetName(loadPreset());\n const resolved = resolvePreset(preset);\n const model = opts.modelOverride || resolved.model;\n const toolset = await buildCodeToolset({ rootDir: opts.rootDir });\n // Bridge MCP tools BEFORE building the prefix so their specs make it into the cache key.\n const mcpClients = await loadMcpServers(toolset.tools, opts.mcpSpecs ?? [], opts.mcpPrefix);\n const system = codeSystemPrompt(opts.rootDir, {\n hasSemanticSearch: toolset.semantic.enabled,\n modelId: model,\n });\n const client = new DeepSeekClient({ baseUrl: loadBaseUrl() });\n const prefix = new ImmutablePrefix({ system, toolSpecs: toolset.tools.specs() });\n const loop = new CacheFirstLoop({\n client,\n prefix,\n tools: toolset.tools,\n model,\n budgetUsd: opts.budgetUsd,\n session: `acp-${timestampSuffix()}`,\n });\n return {\n id: `sess_${timestampSuffix()}-${Math.random().toString(36).slice(2, 8)}`,\n rootDir: opts.rootDir,\n model,\n toolset,\n mcpClients,\n loop,\n eventizer: new Eventizer(),\n ctx: {\n model,\n prefixHash: prefix.fingerprint,\n reasoningEffort: loadReasoningEffort(),\n },\n aborter: null,\n };\n}\n\nexport async function acpCommand(opts: AcpOptions): Promise<void> {\n loadDotenv();\n if (loadApiKey()) {\n process.env.DEEPSEEK_API_KEY = loadApiKey();\n }\n\n const defaultDir = resolveDir(opts.dir, process.cwd());\n const sessions = new Map<string, Session>();\n const sessionContext = new AsyncLocalStorage<string>();\n const server = new AcpServer();\n\n let transcriptStream: WriteStream | null = null;\n if (opts.transcript) {\n const defaultModel = opts.model || resolvePreset(canonicalPresetName(loadPreset())).model;\n transcriptStream = openTranscriptFile(opts.transcript, {\n version: 1,\n source: \"reasonix acp\",\n model: defaultModel,\n startedAt: new Date().toISOString(),\n });\n }\n\n pauseGate.on((req) => {\n const editMode = opts.yolo ? \"yolo\" : loadEditMode();\n const auto = autoResolveVerdict(req, editMode);\n if (auto !== null) {\n pauseGate.resolve(req.id, auto);\n return;\n }\n const activeSessionId = sessionContext.getStore();\n if (!activeSessionId || !sessions.has(activeSessionId)) {\n pauseGate.cancel(req.id);\n return;\n }\n void (async () => {\n const verdict = await requestPermissionForGate(server, activeSessionId, req);\n pauseGate.resolve(req.id, verdict);\n })();\n });\n\n server.onRequest<InitializeParams, InitializeResult>(\"initialize\", (params) => {\n if (!params || typeof params !== \"object\") {\n throw Object.assign(new Error(\"initialize: missing params\"), { code: ERR_INVALID_PARAMS });\n }\n return {\n protocolVersion: ACP_PROTOCOL_VERSION,\n agentCapabilities: {\n loadSession: false,\n promptCapabilities: { image: false, audio: false, embeddedContext: true },\n mcpCapabilities: { http: false, sse: false },\n },\n agentInfo: { name: \"reasonix\", title: \"Reasonix\", version: VERSION },\n authMethods: [],\n };\n });\n\n server.onRequest<SessionNewParams, SessionNewResult>(\"session/new\", async (params) => {\n const rootDir = resolveDir(params?.cwd, defaultDir);\n const session = await buildSession({\n rootDir,\n modelOverride: opts.model,\n budgetUsd: opts.budgetUsd,\n mcpSpecs: opts.mcpSpecs,\n mcpPrefix: opts.mcpPrefix,\n });\n sessions.set(session.id, session);\n return { sessionId: session.id };\n });\n\n server.onRequest<SessionPromptParams, SessionPromptResult>(\"session/prompt\", async (params) => {\n if (!params?.sessionId) {\n throw Object.assign(new Error(\"session/prompt: missing sessionId\"), {\n code: ERR_INVALID_PARAMS,\n });\n }\n const session = sessions.get(params.sessionId);\n if (!session) {\n throw Object.assign(new Error(`session/prompt: unknown session ${params.sessionId}`), {\n code: ERR_INVALID_PARAMS,\n });\n }\n const text = flattenPrompt(params.prompt as ContentBlock[]);\n if (!text) {\n throw Object.assign(new Error(\"session/prompt: empty prompt\"), { code: ERR_INVALID_PARAMS });\n }\n session.aborter = new AbortController();\n let stopReason: StopReason = \"end_turn\";\n try {\n await sessionContext.run(session.id, async () => {\n for await (const ev of session.loop.step(text)) {\n if (session.aborter?.signal.aborted) {\n stopReason = \"cancelled\";\n break;\n }\n // transcript needs raw LoopEvent (usage/cost/stats); kernel events lose those fields\n if (transcriptStream) {\n writeRecord(\n transcriptStream,\n recordFromLoopEvent(ev, {\n model: session.ctx.model,\n prefixHash: session.ctx.prefixHash,\n }),\n );\n }\n for (const kev of session.eventizer.consume(ev, session.ctx)) {\n dispatchKernelEvent(server, session.id, kev);\n if (kev.type === \"error\") stopReason = \"error\";\n }\n }\n });\n } catch (err) {\n const message = (err as Error).message;\n server.sendNotification(\"session/update\", {\n sessionId: session.id,\n update: {\n sessionUpdate: \"agent_message_chunk\",\n content: { type: \"text\", text: `\\n\\n[error] ${message}` },\n },\n } satisfies SessionUpdateParams);\n stopReason = \"error\";\n } finally {\n session.aborter = null;\n }\n return { stopReason };\n });\n\n server.onNotification<SessionCancelParams>(\"session/cancel\", (params) => {\n const session = params?.sessionId ? sessions.get(params.sessionId) : undefined;\n session?.aborter?.abort();\n });\n\n try {\n await server.done();\n } finally {\n transcriptStream?.end();\n // Tear down MCP children so spawned servers don't outlive the agent.\n const closes: Promise<unknown>[] = [];\n for (const session of sessions.values()) {\n for (const mcp of session.mcpClients) {\n closes.push(mcp.close().catch(() => undefined));\n }\n }\n await Promise.all(closes);\n }\n}\n","/** Map kernel events (model.delta / tool.preparing|intent|result) to ACP session/update notifications. */\n\nimport { toolKindFor } from \"@reasonix/core-utils\";\nimport type { Event as KernelEvent } from \"../core/events.js\";\nimport type { SessionUpdateParams } from \"./protocol.js\";\nimport type { AcpServer } from \"./server.js\";\nexport { toolKindFor } from \"@reasonix/core-utils\";\nexport type { AcpToolKind } from \"@reasonix/core-utils\";\n\nfunction tryParseJson(raw: string): unknown {\n if (!raw) return undefined;\n try {\n return JSON.parse(raw);\n } catch {\n return raw;\n }\n}\n\n/** Stateless mapping from one kernel event to (zero or more) ACP session/update notifications. */\nexport function dispatchKernelEvent(server: AcpServer, sessionId: string, ev: KernelEvent): void {\n switch (ev.type) {\n case \"model.delta\": {\n if (!ev.text) return;\n const variant = ev.channel === \"reasoning\" ? \"agent_thought_chunk\" : \"agent_message_chunk\";\n emit(server, {\n sessionId,\n update: { sessionUpdate: variant, content: { type: \"text\", text: ev.text } },\n });\n return;\n }\n case \"tool.preparing\": {\n emit(server, {\n sessionId,\n update: {\n sessionUpdate: \"tool_call\",\n toolCallId: ev.callId,\n title: ev.name,\n kind: toolKindFor(ev.name),\n status: \"pending\",\n },\n });\n return;\n }\n case \"tool.intent\": {\n emit(server, {\n sessionId,\n update: {\n sessionUpdate: \"tool_call_update\",\n toolCallId: ev.callId,\n status: \"in_progress\",\n },\n });\n const rawInput = tryParseJson(ev.args);\n if (rawInput !== undefined) {\n emit(server, {\n sessionId,\n update: {\n sessionUpdate: \"tool_call\",\n toolCallId: ev.callId,\n title: ev.name,\n kind: toolKindFor(ev.name),\n status: \"in_progress\",\n rawInput,\n },\n });\n }\n return;\n }\n case \"tool.result\": {\n emit(server, {\n sessionId,\n update: {\n sessionUpdate: \"tool_call_update\",\n toolCallId: ev.callId,\n status: ev.ok ? \"completed\" : \"failed\",\n content: [\n {\n type: \"content\",\n content: { type: \"text\", text: clip(ev.output) },\n },\n ],\n },\n });\n return;\n }\n default:\n return;\n }\n}\n\nconst MAX_RESULT_CHARS = 8000;\nfunction clip(text: string): string {\n if (text.length <= MAX_RESULT_CHARS) return text;\n return `${text.slice(0, MAX_RESULT_CHARS)}\\n…(${text.length - MAX_RESULT_CHARS} more chars truncated)`;\n}\n\nfunction emit(server: AcpServer, params: SessionUpdateParams): void {\n server.sendNotification(\"session/update\", params);\n}\n","/** Bridges Reasonix's internal `PauseGate` requests onto ACP `session/request_permission` round-trips. */\n\nimport { resolveApprovalPrompt, toApprovalPrompt } from \"@reasonix/core-utils\";\nimport type { PauseRequest } from \"../core/pause-gate.js\";\nimport type {\n PermissionOption,\n PermissionRequestParams,\n PermissionRequestResult,\n} from \"./protocol.js\";\nimport type { AcpServer } from \"./server.js\";\n\n/** Map an ApprovalPrompt kind to the ACP permission kind used by the host UI. */\nfunction acpPermissionKindFor(\n prompt: ReturnType<typeof toApprovalPrompt>,\n): \"execute\" | \"edit\" | \"other\" {\n switch (prompt.kind) {\n case \"shell\":\n return \"execute\";\n case \"path\":\n return prompt.data?.intent === \"write\" ? \"edit\" : \"other\";\n default:\n return \"other\";\n }\n}\n\n/** Map an ApprovalAction kind to the ACP PermissionOptionKind.\n * \"custom\" actions are treated as one-shot allows on the ACP wire. */\nfunction acpOptionKindFor(\n kind: ReturnType<typeof toApprovalPrompt>[\"actions\"][number][\"kind\"],\n): PermissionOption[\"kind\"] {\n switch (kind) {\n case \"allow_once\":\n return \"allow_once\";\n case \"allow_always\":\n return \"allow_always\";\n case \"reject\":\n return \"reject_once\";\n case \"custom\":\n return \"allow_once\";\n }\n}\n\n/** Forward a PauseGate request as an ACP `session/request_permission` call.\n * Uses `toApprovalPrompt()` as the single source of truth for UI metadata.\n */\nexport async function requestPermissionForGate(\n server: AcpServer,\n sessionId: string,\n req: PauseRequest,\n): Promise<\n | import(\"@reasonix/core-utils\").ConfirmationChoice\n | import(\"@reasonix/core-utils\").PlanVerdict\n | import(\"@reasonix/core-utils\").CheckpointVerdict\n | import(\"@reasonix/core-utils\").RevisionVerdict\n | import(\"@reasonix/core-utils\").ChoiceVerdict\n> {\n const prompt = toApprovalPrompt(req);\n\n const params: PermissionRequestParams = {\n sessionId,\n toolCall: {\n toolCallId: `gate-${req.id}`,\n title: prompt.title,\n kind: acpPermissionKindFor(prompt),\n status: \"pending\",\n rawInput: req.payload,\n },\n options: prompt.actions.map(\n (a): PermissionOption => ({\n optionId: a.id,\n name: a.label,\n kind: acpOptionKindFor(a.kind),\n }),\n ),\n };\n\n let result: PermissionRequestResult;\n try {\n result = await server.sendRequest<PermissionRequestResult>(\n \"session/request_permission\",\n params,\n );\n } catch {\n result = { outcome: { outcome: \"cancelled\" } };\n }\n\n if (result.outcome.outcome === \"cancelled\") {\n return resolveApprovalPrompt(prompt, \"\");\n }\n\n return resolveApprovalPrompt(prompt, result.outcome.optionId);\n}\n","/** Wire types for the Agent Client Protocol — https://agentclientprotocol.com */\n\nexport const ACP_PROTOCOL_VERSION = 1;\n\nexport type JsonRpcId = string | number;\n\nexport interface JsonRpcRequest<P = unknown> {\n jsonrpc: \"2.0\";\n id: JsonRpcId;\n method: string;\n params?: P;\n}\n\nexport interface JsonRpcNotification<P = unknown> {\n jsonrpc: \"2.0\";\n method: string;\n params?: P;\n}\n\nexport interface JsonRpcError {\n code: number;\n message: string;\n data?: unknown;\n}\n\nexport interface JsonRpcResponse<R = unknown> {\n jsonrpc: \"2.0\";\n id: JsonRpcId | null;\n result?: R;\n error?: JsonRpcError;\n}\n\nexport interface InitializeParams {\n protocolVersion: number;\n clientCapabilities?: {\n fs?: { readTextFile?: boolean; writeTextFile?: boolean };\n terminal?: boolean;\n };\n clientInfo?: { name: string; title?: string; version?: string };\n}\n\nexport interface InitializeResult {\n protocolVersion: number;\n agentCapabilities: {\n loadSession?: boolean;\n promptCapabilities?: { image?: boolean; audio?: boolean; embeddedContext?: boolean };\n mcpCapabilities?: { http?: boolean; sse?: boolean };\n };\n agentInfo: { name: string; title?: string; version: string };\n authMethods: never[];\n}\n\nexport interface SessionNewParams {\n cwd?: string;\n mcpServers?: Array<{\n name: string;\n command?: string;\n args?: string[];\n env?: Record<string, string>;\n }>;\n}\n\nexport interface SessionNewResult {\n sessionId: string;\n}\n\nexport type ContentBlock =\n | { type: \"text\"; text: string }\n | { type: \"resource\"; resource: { uri: string; mimeType?: string; text?: string } }\n | { type: \"image\"; mimeType: string; data: string }\n | { type: \"audio\"; mimeType: string; data: string };\n\nexport interface SessionPromptParams {\n sessionId: string;\n prompt: ContentBlock[];\n}\n\nexport type StopReason = \"end_turn\" | \"tool_use_complete\" | \"cancelled\" | \"error\";\n\nexport interface SessionPromptResult {\n stopReason: StopReason;\n}\n\nexport type SessionUpdate =\n | {\n sessionUpdate: \"agent_message_chunk\";\n content: { type: \"text\"; text: string };\n }\n | {\n sessionUpdate: \"agent_thought_chunk\";\n content: { type: \"text\"; text: string };\n }\n | {\n sessionUpdate: \"tool_call\";\n toolCallId: string;\n title?: string;\n kind?: \"read\" | \"edit\" | \"search\" | \"execute\" | \"other\";\n status?: \"pending\" | \"in_progress\" | \"completed\" | \"failed\";\n rawInput?: unknown;\n }\n | {\n sessionUpdate: \"tool_call_update\";\n toolCallId: string;\n status?: \"pending\" | \"in_progress\" | \"completed\" | \"failed\";\n content?: Array<{ type: \"content\"; content: { type: \"text\"; text: string } }>;\n }\n | {\n sessionUpdate: \"plan\";\n entries: Array<{\n content: string;\n priority: \"high\" | \"medium\" | \"low\";\n status: \"pending\" | \"in_progress\" | \"completed\";\n }>;\n };\n\nexport interface SessionUpdateParams {\n sessionId: string;\n update: SessionUpdate;\n}\n\nexport interface SessionCancelParams {\n sessionId: string;\n}\n\nexport type PermissionOptionKind = \"allow_once\" | \"allow_always\" | \"reject_once\" | \"reject_always\";\n\nexport interface PermissionOption {\n optionId: string;\n name: string;\n kind: PermissionOptionKind;\n}\n\nexport interface PermissionRequestParams {\n sessionId: string;\n toolCall: {\n toolCallId: string;\n title?: string;\n kind?: \"read\" | \"edit\" | \"search\" | \"execute\" | \"other\";\n status?: \"pending\";\n rawInput?: unknown;\n };\n options: PermissionOption[];\n}\n\nexport type PermissionOutcome =\n | { outcome: \"selected\"; optionId: string }\n | { outcome: \"cancelled\" };\n\nexport interface PermissionRequestResult {\n outcome: PermissionOutcome;\n}\n\nexport const ERR_PARSE = -32700;\nexport const ERR_INVALID_REQUEST = -32600;\nexport const ERR_METHOD_NOT_FOUND = -32601;\nexport const ERR_INVALID_PARAMS = -32602;\nexport const ERR_INTERNAL = -32603;\n\n/** Extract the user prompt text out of ACP content blocks. Resource blocks contribute their inline `text` if present. */\nexport function flattenPrompt(blocks: ContentBlock[]): string {\n const parts: string[] = [];\n for (const b of blocks) {\n if (b.type === \"text\") parts.push(b.text);\n else if (b.type === \"resource\" && b.resource.text) parts.push(b.resource.text);\n }\n return parts.join(\"\\n\\n\").trim();\n}\n","/** NDJSON JSON-RPC 2.0 server — per the ACP transport spec, one JSON object per line, no embedded newlines. */\n\nimport { type Interface, createInterface } from \"node:readline\";\nimport type { Readable, Writable } from \"node:stream\";\nimport {\n ERR_INTERNAL,\n ERR_METHOD_NOT_FOUND,\n ERR_PARSE,\n type JsonRpcId,\n type JsonRpcNotification,\n type JsonRpcRequest,\n type JsonRpcResponse,\n} from \"./protocol.js\";\n\nexport type RequestHandler<P = unknown, R = unknown> = (params: P) => Promise<R> | R;\nexport type NotificationHandler<P = unknown> = (params: P) => Promise<void> | void;\n\nexport interface AcpServerOptions {\n input?: Readable;\n output?: Writable;\n}\n\ninterface PendingOutbound {\n resolve: (value: unknown) => void;\n reject: (err: Error) => void;\n}\n\nexport class AcpServer {\n private requestHandlers = new Map<string, RequestHandler>();\n private notificationHandlers = new Map<string, NotificationHandler>();\n private pending = new Map<JsonRpcId, PendingOutbound>();\n private nextOutboundId = 1;\n private readonly output: Writable;\n private readonly rl: Interface;\n private closed = false;\n\n constructor(opts: AcpServerOptions = {}) {\n this.output = opts.output ?? process.stdout;\n const input = opts.input ?? process.stdin;\n this.rl = createInterface({ input });\n this.rl.on(\"line\", (line) => {\n void this.handleLine(line);\n });\n }\n\n onRequest<P, R>(method: string, handler: RequestHandler<P, R>): void {\n this.requestHandlers.set(method, handler as RequestHandler);\n }\n\n onNotification<P>(method: string, handler: NotificationHandler<P>): void {\n this.notificationHandlers.set(method, handler as NotificationHandler);\n }\n\n sendNotification(method: string, params: unknown): void {\n this.write({ jsonrpc: \"2.0\", method, params });\n }\n\n /** Send an outbound JSON-RPC request and resolve when the peer responds. */\n sendRequest<R = unknown>(method: string, params: unknown): Promise<R> {\n const id = this.nextOutboundId++;\n return new Promise<R>((resolve, reject) => {\n this.pending.set(id, {\n resolve: resolve as (v: unknown) => void,\n reject,\n });\n this.write({ jsonrpc: \"2.0\", id, method, params });\n });\n }\n\n close(): void {\n if (this.closed) return;\n this.closed = true;\n for (const p of this.pending.values()) p.reject(new Error(\"server closed\"));\n this.pending.clear();\n this.rl.close();\n }\n\n /** Wait for the input stream to end. */\n done(): Promise<void> {\n return new Promise((resolve) => this.rl.once(\"close\", () => resolve()));\n }\n\n private write(msg: JsonRpcRequest | JsonRpcNotification | JsonRpcResponse): void {\n this.output.write(`${JSON.stringify(msg)}\\n`);\n }\n\n private writeError(id: JsonRpcId | null, code: number, message: string): void {\n this.write({ jsonrpc: \"2.0\", id, error: { code, message } });\n }\n\n private async handleLine(raw: string): Promise<void> {\n const line = raw.trim();\n if (!line) return;\n let parsed: unknown;\n try {\n parsed = JSON.parse(line);\n } catch {\n this.writeError(null, ERR_PARSE, \"parse error\");\n return;\n }\n if (!parsed || typeof parsed !== \"object\") {\n this.writeError(null, ERR_PARSE, \"expected JSON object\");\n return;\n }\n const msg = parsed as Partial<JsonRpcRequest>;\n if (typeof msg.method === \"string\" && msg.id !== undefined) {\n const id = msg.id as JsonRpcId;\n const handler = this.requestHandlers.get(msg.method);\n if (!handler) {\n this.writeError(id, ERR_METHOD_NOT_FOUND, `method not found: ${msg.method}`);\n return;\n }\n try {\n const result = await handler(msg.params);\n this.write({ jsonrpc: \"2.0\", id, result });\n } catch (err) {\n this.writeError(id, ERR_INTERNAL, (err as Error).message);\n }\n return;\n }\n if (typeof msg.method === \"string\" && msg.id === undefined) {\n const handler = this.notificationHandlers.get(msg.method);\n if (!handler) return;\n try {\n await handler(msg.params);\n } catch {\n // notifications can't be replied to — log channel would help, but stderr would pollute the wire\n }\n return;\n }\n if (msg.id !== undefined && msg.method === undefined) {\n const response = parsed as JsonRpcResponse;\n const pending = this.pending.get(response.id as JsonRpcId);\n if (!pending) return;\n this.pending.delete(response.id as JsonRpcId);\n if (response.error) {\n pending.reject(new Error(response.error.message));\n } else {\n pending.resolve(response.result);\n }\n }\n }\n}\n"],"mappings":"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","names":["resolve"]}
|
|
@@ -2,50 +2,50 @@
|
|
|
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
|
chatCommand
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-DABAOQSV.js";
|
|
6
6
|
import "./chunk-TKVXTQ3T.js";
|
|
7
7
|
import "./chunk-JMBMLOBP.js";
|
|
8
|
-
import "./chunk-
|
|
9
|
-
import "./chunk-
|
|
10
|
-
import "./chunk-
|
|
8
|
+
import "./chunk-EO6RPTJG.js";
|
|
9
|
+
import "./chunk-RCLS63KE.js";
|
|
10
|
+
import "./chunk-4E2BHJU4.js";
|
|
11
11
|
import "./chunk-EQATK2L2.js";
|
|
12
12
|
import "./chunk-ZZM6QJ4W.js";
|
|
13
|
-
import "./chunk-
|
|
14
|
-
import "./chunk-
|
|
15
|
-
import "./chunk-
|
|
13
|
+
import "./chunk-JFBGSWQB.js";
|
|
14
|
+
import "./chunk-H2F4LDNH.js";
|
|
15
|
+
import "./chunk-XMR2VCGT.js";
|
|
16
16
|
import "./chunk-HIYTRCSW.js";
|
|
17
|
-
import "./chunk-
|
|
17
|
+
import "./chunk-FD7SNDWW.js";
|
|
18
18
|
import "./chunk-FEZK652I.js";
|
|
19
|
-
import "./chunk-
|
|
20
|
-
import "./chunk-
|
|
19
|
+
import "./chunk-SWUMD2LX.js";
|
|
20
|
+
import "./chunk-KH5JIJJD.js";
|
|
21
21
|
import "./chunk-X53B3JIX.js";
|
|
22
22
|
import "./chunk-LGEKVMMV.js";
|
|
23
|
-
import "./chunk-
|
|
24
|
-
import "./chunk-
|
|
23
|
+
import "./chunk-TIJ4ZHD6.js";
|
|
24
|
+
import "./chunk-J2TQAWOM.js";
|
|
25
25
|
import "./chunk-6OWJV3YW.js";
|
|
26
|
-
import "./chunk-
|
|
26
|
+
import "./chunk-5U5LMMFF.js";
|
|
27
27
|
import "./chunk-25T6CVUP.js";
|
|
28
28
|
import "./chunk-2UQP6H6T.js";
|
|
29
|
-
import "./chunk-
|
|
29
|
+
import "./chunk-WKOXKCF3.js";
|
|
30
30
|
import "./chunk-SZ5XES2N.js";
|
|
31
|
-
import "./chunk-
|
|
31
|
+
import "./chunk-B5CZL2SE.js";
|
|
32
32
|
import "./chunk-E5WCLUIU.js";
|
|
33
33
|
import "./chunk-XJXDHAES.js";
|
|
34
|
-
import "./chunk-
|
|
35
|
-
import "./chunk-
|
|
34
|
+
import "./chunk-6FRNXWDZ.js";
|
|
35
|
+
import "./chunk-SLAFMXAZ.js";
|
|
36
36
|
import "./chunk-PLHAZOLZ.js";
|
|
37
|
-
import "./chunk-
|
|
38
|
-
import "./chunk-
|
|
39
|
-
import "./chunk-
|
|
37
|
+
import "./chunk-NQZ5U37J.js";
|
|
38
|
+
import "./chunk-5AW6NIHU.js";
|
|
39
|
+
import "./chunk-PJIQIYTV.js";
|
|
40
40
|
import "./chunk-S4XVGLRW.js";
|
|
41
41
|
import "./chunk-RRXUIPWG.js";
|
|
42
|
-
import "./chunk-
|
|
43
|
-
import "./chunk-
|
|
44
|
-
import "./chunk-
|
|
45
|
-
import "./chunk-
|
|
42
|
+
import "./chunk-3FULTFRB.js";
|
|
43
|
+
import "./chunk-IKSYVBBZ.js";
|
|
44
|
+
import "./chunk-PIC5HJRD.js";
|
|
45
|
+
import "./chunk-FPME5QOO.js";
|
|
46
46
|
import "./chunk-XXC2BYTV.js";
|
|
47
47
|
import "./chunk-TUK7OWJA.js";
|
|
48
48
|
export {
|
|
49
49
|
chatCommand
|
|
50
50
|
};
|
|
51
|
-
//# sourceMappingURL=chat-
|
|
51
|
+
//# sourceMappingURL=chat-ZXF227MP.js.map
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
cacheSavingsUsd,
|
|
5
5
|
claudeEquivalentCost,
|
|
6
6
|
costUsd
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-IKSYVBBZ.js";
|
|
8
8
|
|
|
9
9
|
// src/telemetry/usage.ts
|
|
10
10
|
import {
|
|
@@ -229,4 +229,4 @@ export {
|
|
|
229
229
|
aggregateUsage,
|
|
230
230
|
formatLogSize
|
|
231
231
|
};
|
|
232
|
-
//# sourceMappingURL=chunk-
|
|
232
|
+
//# sourceMappingURL=chunk-3FULTFRB.js.map
|