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.
Files changed (108) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +167 -0
  3. package/README.zh-CN.md +163 -0
  4. package/dist/backend/client.d.ts +103 -0
  5. package/dist/backend/client.d.ts.map +1 -0
  6. package/dist/backend/client.js +344 -0
  7. package/dist/backend/client.js.map +1 -0
  8. package/dist/backend/credentials.d.ts +31 -0
  9. package/dist/backend/credentials.d.ts.map +1 -0
  10. package/dist/backend/credentials.js +93 -0
  11. package/dist/backend/credentials.js.map +1 -0
  12. package/dist/backend/index.d.ts +7 -0
  13. package/dist/backend/index.d.ts.map +1 -0
  14. package/dist/backend/index.js +6 -0
  15. package/dist/backend/index.js.map +1 -0
  16. package/dist/backend/listener.d.ts +63 -0
  17. package/dist/backend/listener.d.ts.map +1 -0
  18. package/dist/backend/listener.js +138 -0
  19. package/dist/backend/listener.js.map +1 -0
  20. package/dist/backend/resolve.d.ts +11 -0
  21. package/dist/backend/resolve.d.ts.map +1 -0
  22. package/dist/backend/resolve.js +116 -0
  23. package/dist/backend/resolve.js.map +1 -0
  24. package/dist/backend/types.d.ts +164 -0
  25. package/dist/backend/types.d.ts.map +1 -0
  26. package/dist/backend/types.js +15 -0
  27. package/dist/backend/types.js.map +1 -0
  28. package/dist/config/model-cache.d.ts +20 -0
  29. package/dist/config/model-cache.d.ts.map +1 -0
  30. package/dist/config/model-cache.js +62 -0
  31. package/dist/config/model-cache.js.map +1 -0
  32. package/dist/config/options.d.ts +36 -0
  33. package/dist/config/options.d.ts.map +1 -0
  34. package/dist/config/options.js +171 -0
  35. package/dist/config/options.js.map +1 -0
  36. package/dist/config/runtime-model.d.ts +33 -0
  37. package/dist/config/runtime-model.d.ts.map +1 -0
  38. package/dist/config/runtime-model.js +96 -0
  39. package/dist/config/runtime-model.js.map +1 -0
  40. package/dist/handlers/dispatch.d.ts +15 -0
  41. package/dist/handlers/dispatch.d.ts.map +1 -0
  42. package/dist/handlers/dispatch.js +183 -0
  43. package/dist/handlers/dispatch.js.map +1 -0
  44. package/dist/handlers/extensions.d.ts +43 -0
  45. package/dist/handlers/extensions.d.ts.map +1 -0
  46. package/dist/handlers/extensions.js +310 -0
  47. package/dist/handlers/extensions.js.map +1 -0
  48. package/dist/handlers/io.d.ts +40 -0
  49. package/dist/handlers/io.d.ts.map +1 -0
  50. package/dist/handlers/io.js +55 -0
  51. package/dist/handlers/io.js.map +1 -0
  52. package/dist/handlers/server-requests.d.ts +34 -0
  53. package/dist/handlers/server-requests.d.ts.map +1 -0
  54. package/dist/handlers/server-requests.js +357 -0
  55. package/dist/handlers/server-requests.js.map +1 -0
  56. package/dist/handlers/session.d.ts +46 -0
  57. package/dist/handlers/session.d.ts.map +1 -0
  58. package/dist/handlers/session.js +738 -0
  59. package/dist/handlers/session.js.map +1 -0
  60. package/dist/handlers/slash.d.ts +16 -0
  61. package/dist/handlers/slash.d.ts.map +1 -0
  62. package/dist/handlers/slash.js +107 -0
  63. package/dist/handlers/slash.js.map +1 -0
  64. package/dist/index.d.ts +11 -0
  65. package/dist/index.d.ts.map +1 -0
  66. package/dist/index.js +93 -0
  67. package/dist/index.js.map +1 -0
  68. package/dist/interaction/adapter.d.ts +136 -0
  69. package/dist/interaction/adapter.d.ts.map +1 -0
  70. package/dist/interaction/adapter.js +353 -0
  71. package/dist/interaction/adapter.js.map +1 -0
  72. package/dist/server.d.ts +73 -0
  73. package/dist/server.d.ts.map +1 -0
  74. package/dist/server.js +97 -0
  75. package/dist/server.js.map +1 -0
  76. package/dist/tasks-index.d.ts +39 -0
  77. package/dist/tasks-index.d.ts.map +1 -0
  78. package/dist/tasks-index.js +152 -0
  79. package/dist/tasks-index.js.map +1 -0
  80. package/dist/translators/event-translator.d.ts +40 -0
  81. package/dist/translators/event-translator.d.ts.map +1 -0
  82. package/dist/translators/event-translator.js +214 -0
  83. package/dist/translators/event-translator.js.map +1 -0
  84. package/dist/translators/index.d.ts +6 -0
  85. package/dist/translators/index.d.ts.map +1 -0
  86. package/dist/translators/index.js +5 -0
  87. package/dist/translators/index.js.map +1 -0
  88. package/dist/translators/projection-differ.d.ts +48 -0
  89. package/dist/translators/projection-differ.d.ts.map +1 -0
  90. package/dist/translators/projection-differ.js +239 -0
  91. package/dist/translators/projection-differ.js.map +1 -0
  92. package/dist/translators/tool-helpers.d.ts +60 -0
  93. package/dist/translators/tool-helpers.d.ts.map +1 -0
  94. package/dist/translators/tool-helpers.js +308 -0
  95. package/dist/translators/tool-helpers.js.map +1 -0
  96. package/dist/translators/types.d.ts +58 -0
  97. package/dist/translators/types.d.ts.map +1 -0
  98. package/dist/translators/types.js +27 -0
  99. package/dist/translators/types.js.map +1 -0
  100. package/dist/utils.d.ts +111 -0
  101. package/dist/utils.d.ts.map +1 -0
  102. package/dist/utils.js +110 -0
  103. package/dist/utils.js.map +1 -0
  104. package/docs/ARCHITECTURE.md +299 -0
  105. package/docs/DEVELOPMENT.md +193 -0
  106. package/docs/PROTOCOL.md +649 -0
  107. package/docs/TROUBLESHOOTING.md +251 -0
  108. 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)