zcode-acp-server 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +167 -0
- package/README.zh-CN.md +163 -0
- package/dist/backend/client.d.ts +103 -0
- package/dist/backend/client.d.ts.map +1 -0
- package/dist/backend/client.js +344 -0
- package/dist/backend/client.js.map +1 -0
- package/dist/backend/credentials.d.ts +31 -0
- package/dist/backend/credentials.d.ts.map +1 -0
- package/dist/backend/credentials.js +93 -0
- package/dist/backend/credentials.js.map +1 -0
- package/dist/backend/index.d.ts +7 -0
- package/dist/backend/index.d.ts.map +1 -0
- package/dist/backend/index.js +6 -0
- package/dist/backend/index.js.map +1 -0
- package/dist/backend/listener.d.ts +63 -0
- package/dist/backend/listener.d.ts.map +1 -0
- package/dist/backend/listener.js +138 -0
- package/dist/backend/listener.js.map +1 -0
- package/dist/backend/resolve.d.ts +11 -0
- package/dist/backend/resolve.d.ts.map +1 -0
- package/dist/backend/resolve.js +116 -0
- package/dist/backend/resolve.js.map +1 -0
- package/dist/backend/types.d.ts +164 -0
- package/dist/backend/types.d.ts.map +1 -0
- package/dist/backend/types.js +15 -0
- package/dist/backend/types.js.map +1 -0
- package/dist/config/model-cache.d.ts +20 -0
- package/dist/config/model-cache.d.ts.map +1 -0
- package/dist/config/model-cache.js +62 -0
- package/dist/config/model-cache.js.map +1 -0
- package/dist/config/options.d.ts +36 -0
- package/dist/config/options.d.ts.map +1 -0
- package/dist/config/options.js +171 -0
- package/dist/config/options.js.map +1 -0
- package/dist/config/runtime-model.d.ts +33 -0
- package/dist/config/runtime-model.d.ts.map +1 -0
- package/dist/config/runtime-model.js +96 -0
- package/dist/config/runtime-model.js.map +1 -0
- package/dist/handlers/dispatch.d.ts +15 -0
- package/dist/handlers/dispatch.d.ts.map +1 -0
- package/dist/handlers/dispatch.js +183 -0
- package/dist/handlers/dispatch.js.map +1 -0
- package/dist/handlers/extensions.d.ts +43 -0
- package/dist/handlers/extensions.d.ts.map +1 -0
- package/dist/handlers/extensions.js +310 -0
- package/dist/handlers/extensions.js.map +1 -0
- package/dist/handlers/io.d.ts +40 -0
- package/dist/handlers/io.d.ts.map +1 -0
- package/dist/handlers/io.js +55 -0
- package/dist/handlers/io.js.map +1 -0
- package/dist/handlers/server-requests.d.ts +34 -0
- package/dist/handlers/server-requests.d.ts.map +1 -0
- package/dist/handlers/server-requests.js +357 -0
- package/dist/handlers/server-requests.js.map +1 -0
- package/dist/handlers/session.d.ts +46 -0
- package/dist/handlers/session.d.ts.map +1 -0
- package/dist/handlers/session.js +738 -0
- package/dist/handlers/session.js.map +1 -0
- package/dist/handlers/slash.d.ts +16 -0
- package/dist/handlers/slash.d.ts.map +1 -0
- package/dist/handlers/slash.js +107 -0
- package/dist/handlers/slash.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +93 -0
- package/dist/index.js.map +1 -0
- package/dist/interaction/adapter.d.ts +136 -0
- package/dist/interaction/adapter.d.ts.map +1 -0
- package/dist/interaction/adapter.js +353 -0
- package/dist/interaction/adapter.js.map +1 -0
- package/dist/server.d.ts +73 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +97 -0
- package/dist/server.js.map +1 -0
- package/dist/tasks-index.d.ts +39 -0
- package/dist/tasks-index.d.ts.map +1 -0
- package/dist/tasks-index.js +152 -0
- package/dist/tasks-index.js.map +1 -0
- package/dist/translators/event-translator.d.ts +40 -0
- package/dist/translators/event-translator.d.ts.map +1 -0
- package/dist/translators/event-translator.js +214 -0
- package/dist/translators/event-translator.js.map +1 -0
- package/dist/translators/index.d.ts +6 -0
- package/dist/translators/index.d.ts.map +1 -0
- package/dist/translators/index.js +5 -0
- package/dist/translators/index.js.map +1 -0
- package/dist/translators/projection-differ.d.ts +48 -0
- package/dist/translators/projection-differ.d.ts.map +1 -0
- package/dist/translators/projection-differ.js +239 -0
- package/dist/translators/projection-differ.js.map +1 -0
- package/dist/translators/tool-helpers.d.ts +60 -0
- package/dist/translators/tool-helpers.d.ts.map +1 -0
- package/dist/translators/tool-helpers.js +308 -0
- package/dist/translators/tool-helpers.js.map +1 -0
- package/dist/translators/types.d.ts +58 -0
- package/dist/translators/types.d.ts.map +1 -0
- package/dist/translators/types.js +27 -0
- package/dist/translators/types.js.map +1 -0
- package/dist/utils.d.ts +111 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +110 -0
- package/dist/utils.js.map +1 -0
- package/docs/ARCHITECTURE.md +299 -0
- package/docs/DEVELOPMENT.md +193 -0
- package/docs/PROTOCOL.md +649 -0
- package/docs/TROUBLESHOOTING.md +251 -0
- package/package.json +66 -0
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
# Development Guide
|
|
2
|
+
|
|
3
|
+
## Prerequisites
|
|
4
|
+
|
|
5
|
+
### Requirements
|
|
6
|
+
|
|
7
|
+
- Node.js >= 22 (requires `node:sqlite` support)
|
|
8
|
+
- pnpm (package manager)
|
|
9
|
+
- ZCode CLI >= 0.14.8
|
|
10
|
+
|
|
11
|
+
### Install dependencies
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
cd zcode-acp-server
|
|
15
|
+
pnpm install
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Local Development
|
|
19
|
+
|
|
20
|
+
### Build
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
pnpm build # tsc -> dist/
|
|
24
|
+
pnpm dev # tsc --watch (hot reload)
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
### Test
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
pnpm test # run all tests
|
|
31
|
+
pnpm test:watch # watch mode
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### Format
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
pnpm format # prettier --write src
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Manual Testing
|
|
41
|
+
|
|
42
|
+
### Method 1: Start directly
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
pnpm build
|
|
46
|
+
node dist/index.js
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Then manually send an ACP JSON-RPC request:
|
|
50
|
+
|
|
51
|
+
```json
|
|
52
|
+
{ "jsonrpc": "2.0", "id": 1, "method": "initialize", "params": { "protocolVersion": 1 } }
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### Method 2: Connect via Zed
|
|
56
|
+
|
|
57
|
+
Add the following to `~/.config/zed/settings.json` (see the README for the
|
|
58
|
+
full `ZCODE_BIN` per-platform paths):
|
|
59
|
+
|
|
60
|
+
```json
|
|
61
|
+
{
|
|
62
|
+
"agent_servers": {
|
|
63
|
+
"ZCode": {
|
|
64
|
+
"type": "custom",
|
|
65
|
+
"command": "node",
|
|
66
|
+
"args": ["/absolute/path/to/zcode-acp-server/dist/index.js"],
|
|
67
|
+
"env": {
|
|
68
|
+
"ZCODE_BIN": "/Applications/ZCode.app/Contents/Resources/glm/zcode.cjs"
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
Restart Zed and pick **ZCode** from the agent dropdown.
|
|
76
|
+
|
|
77
|
+
### Method 3: Mock backend testing
|
|
78
|
+
|
|
79
|
+
See `tests/backend.test.ts` for how to mock `ZcodeBackend`:
|
|
80
|
+
|
|
81
|
+
```typescript
|
|
82
|
+
import { describe, it, expect, vi } from "vitest";
|
|
83
|
+
import { ZcodeBackend } from "../src/backend/client.js";
|
|
84
|
+
|
|
85
|
+
describe("backend", () => {
|
|
86
|
+
it("should handle request/response", async () => {
|
|
87
|
+
const backend = new ZcodeBackend(["node", "mock-zcode.js"], { ...process.env });
|
|
88
|
+
// test logic
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
## Debugging Tips
|
|
94
|
+
|
|
95
|
+
### Enable verbose logging
|
|
96
|
+
|
|
97
|
+
The code uses a `log()` function (written to stderr); you can see output like
|
|
98
|
+
this in the terminal:
|
|
99
|
+
|
|
100
|
+
```
|
|
101
|
+
[zcode-acp] backend: started zcode app-server (pid=12345)
|
|
102
|
+
[zcode-acp] [event] turn.started
|
|
103
|
+
[zcode-acp] [event] turn.completed (resultType=success)
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### Check the ZCode backend version
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
zcode --version
|
|
110
|
+
# must be >= 0.14.8
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
### Check the ZCode configuration
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
cat ~/.zcode/v2/config.json
|
|
117
|
+
# confirm a provider is enabled and has models
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### Test session/subscribe
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
# start the zcode app-server
|
|
124
|
+
cd /path/to/project
|
|
125
|
+
zcode app-server --stdio
|
|
126
|
+
|
|
127
|
+
# manually send a request
|
|
128
|
+
{ "id": 1, "method": "session/create", "params": { "workspace": { "workspacePath": ".", "workspaceKey": "." }, "mode": "yolo" } }
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
## Adding a New Session Extension Method
|
|
132
|
+
|
|
133
|
+
Using `session/customAction` as an example:
|
|
134
|
+
|
|
135
|
+
### 1. Add the handler in `src/handlers/extensions.ts`
|
|
136
|
+
|
|
137
|
+
```typescript
|
|
138
|
+
export async function customAction(
|
|
139
|
+
server: ZcodeAcpServer,
|
|
140
|
+
params: ExtensionParams,
|
|
141
|
+
): Promise<Result> {
|
|
142
|
+
const zcodeSid = resolveSidOrThrow(server, params);
|
|
143
|
+
const resp = await server
|
|
144
|
+
.ensureBackend()
|
|
145
|
+
.request(server.nextId(), "session/customAction", { sessionId: zcodeSid, ...params }, 15000);
|
|
146
|
+
if (resp.error) throw new Error(`customAction failed: ${resp.error.message}`);
|
|
147
|
+
log("session/customAction -> ok");
|
|
148
|
+
return (resp.result ?? {}) as Result;
|
|
149
|
+
}
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### 2. Register it in `src/index.ts`
|
|
153
|
+
|
|
154
|
+
```typescript
|
|
155
|
+
import { customAction } from "./handlers/extensions.js";
|
|
156
|
+
|
|
157
|
+
.onRequest("session/customAction", extParams, (ctx) =>
|
|
158
|
+
customAction(server, ctx.params),
|
|
159
|
+
)
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### 3. Add a test
|
|
163
|
+
|
|
164
|
+
Add a test in `tests/extensions.test.ts` (create it if it does not exist):
|
|
165
|
+
|
|
166
|
+
```typescript
|
|
167
|
+
import { describe, it, expect } from "vitest";
|
|
168
|
+
import { customAction } from "../src/handlers/extensions.js";
|
|
169
|
+
|
|
170
|
+
describe("customAction", () => {
|
|
171
|
+
it("should forward to zcode backend", async () => {
|
|
172
|
+
// mock server and backend
|
|
173
|
+
// test the handler logic
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
## Contributing
|
|
179
|
+
|
|
180
|
+
### PR checklist
|
|
181
|
+
|
|
182
|
+
- [ ] Code passes `pnpm build` (no TypeScript errors)
|
|
183
|
+
- [ ] All tests pass `pnpm test`
|
|
184
|
+
- [ ] Code is formatted `pnpm format`
|
|
185
|
+
- [ ] New methods have corresponding tests
|
|
186
|
+
- [ ] Documentation is updated (if needed)
|
|
187
|
+
|
|
188
|
+
### Code style
|
|
189
|
+
|
|
190
|
+
- Use TypeScript strict mode
|
|
191
|
+
- Files use the `.js` extension (Node.js ESM requirement)
|
|
192
|
+
- Logging uses the `log()` function (writes to stderr to avoid polluting the stdout protocol stream)
|
|
193
|
+
- Error handling: return `{ error }` instead of throwing (at the backend request layer)
|