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,239 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ProjectionDiffer: diff two `{projection, messages, todos}` snapshots into
|
|
3
|
+
* internal events.
|
|
4
|
+
*
|
|
5
|
+
* Used in three places:
|
|
6
|
+
* 1. Turn completion — emit the final PlanUpdate / usage (text/tools are
|
|
7
|
+
* already deduped by seenMessageIds).
|
|
8
|
+
* 2. Stall reconciliation — recover missed events from an authoritative
|
|
9
|
+
* `session/messages` snapshot.
|
|
10
|
+
* 3. session/load — replay an initial plan.
|
|
11
|
+
*
|
|
12
|
+
* Only NEW messages (by message id dedup) are processed, so multi-turn/resume
|
|
13
|
+
* history isn't re-emitted. The PlanUpdate fires whenever the todos signature
|
|
14
|
+
* changes (including clearing to empty — the initial `_lastPlanSig = "__none__"`
|
|
15
|
+
* makes the first empty list also emit).
|
|
16
|
+
*/
|
|
17
|
+
import { buildDiffContent, buildResultContent, extractLocations, renderToolOutput, summarizeToolInput, TOOL_KIND_MAP, } from "./tool-helpers.js";
|
|
18
|
+
import { makePlanEntry } from "./types.js";
|
|
19
|
+
const TOOL_STATUS_MAP = {
|
|
20
|
+
pending: "pending",
|
|
21
|
+
running: "in_progress",
|
|
22
|
+
completed: "completed",
|
|
23
|
+
error: "failed",
|
|
24
|
+
};
|
|
25
|
+
export class ProjectionDiffer {
|
|
26
|
+
seenToolIds = new Set();
|
|
27
|
+
lastToolStatus = new Map();
|
|
28
|
+
lastUsage = null;
|
|
29
|
+
seenMessageIds = new Set();
|
|
30
|
+
lastPlanSig = "__none__";
|
|
31
|
+
seenPatchHashes = new Set();
|
|
32
|
+
/** Whether any TextDelta fired this turn (used by fallback detection). */
|
|
33
|
+
emittedTextThisTurn = false;
|
|
34
|
+
/** Mark all given messages as seen (baseline so we don't re-emit history). */
|
|
35
|
+
markSeen(messages) {
|
|
36
|
+
for (const m of messages) {
|
|
37
|
+
const key = this.messageDedupKey(m);
|
|
38
|
+
if (key)
|
|
39
|
+
this.seenMessageIds.add(key);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/** Whether a message's dedup key has already been processed. */
|
|
43
|
+
hasSeenMessage(m) {
|
|
44
|
+
const key = this.messageDedupKey(m);
|
|
45
|
+
return key !== null && this.seenMessageIds.has(key);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Mark a tool call id as seen + completed. Used to sync state from the
|
|
49
|
+
* EventTranslator so the next `diff()` won't re-emit a tool the event path
|
|
50
|
+
* already dispatched (which would clear Bash terminal output via a
|
|
51
|
+
* content-less ToolCallNew through the terminal path).
|
|
52
|
+
*/
|
|
53
|
+
markToolSeen(callId) {
|
|
54
|
+
this.seenToolIds.add(callId);
|
|
55
|
+
this.lastToolStatus.set(callId, "completed");
|
|
56
|
+
}
|
|
57
|
+
/** Reset per-turn flags (does NOT reset seenMessageIds). */
|
|
58
|
+
resetTurn() {
|
|
59
|
+
this.emittedTextThisTurn = false;
|
|
60
|
+
}
|
|
61
|
+
/** Set the usage baseline so the next diff won't re-emit the same value. */
|
|
62
|
+
setLastUsage(used) {
|
|
63
|
+
this.lastUsage = used;
|
|
64
|
+
}
|
|
65
|
+
/** Diff two snapshots. Returns 0..n events. */
|
|
66
|
+
diff(curSnapshot) {
|
|
67
|
+
const events = [];
|
|
68
|
+
const curProj = (curSnapshot?.projection ?? {});
|
|
69
|
+
const curMsgs = curSnapshot?.messages ?? [];
|
|
70
|
+
// 1. usage_update: prefer contextUsed (current occupancy) over totalTokenCount
|
|
71
|
+
// (cumulative). `||` so an explicit contextUsed=0 falls back to totalTokenCount.
|
|
72
|
+
const used = curProj.contextUsed || curProj.totalTokenCount || 0;
|
|
73
|
+
const size = curProj.contextWindow ?? 0;
|
|
74
|
+
if (this.lastUsage === null || used !== this.lastUsage) {
|
|
75
|
+
if (size > 0)
|
|
76
|
+
events.push({ kind: "UsageDelta", used, size });
|
|
77
|
+
this.lastUsage = used;
|
|
78
|
+
}
|
|
79
|
+
// 2. Only NEW messages (dedup by id).
|
|
80
|
+
for (const m of curMsgs) {
|
|
81
|
+
const dedupKey = this.messageDedupKey(m);
|
|
82
|
+
if (dedupKey && this.seenMessageIds.has(dedupKey))
|
|
83
|
+
continue;
|
|
84
|
+
if (dedupKey)
|
|
85
|
+
this.seenMessageIds.add(dedupKey);
|
|
86
|
+
const role = m.info?.role;
|
|
87
|
+
for (const p of m.parts ?? []) {
|
|
88
|
+
if (!p || typeof p !== "object")
|
|
89
|
+
continue;
|
|
90
|
+
const ptype = p.type;
|
|
91
|
+
if (ptype === "tool") {
|
|
92
|
+
events.push(...this.diffToolPart(p));
|
|
93
|
+
}
|
|
94
|
+
else if (ptype === "text" && role === "assistant") {
|
|
95
|
+
const text = p.text ?? "";
|
|
96
|
+
if (text.trim()) {
|
|
97
|
+
events.push({ kind: "TextDelta", text });
|
|
98
|
+
this.emittedTextThisTurn = true;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
else if (ptype === "reasoning") {
|
|
102
|
+
const text = p.text ?? "";
|
|
103
|
+
if (text.trim())
|
|
104
|
+
events.push({ kind: "ReasoningDelta", text });
|
|
105
|
+
}
|
|
106
|
+
else if (ptype === "patch") {
|
|
107
|
+
const ph = p.hash;
|
|
108
|
+
if (ph && !this.seenPatchHashes.has(ph)) {
|
|
109
|
+
this.seenPatchHashes.add(ph);
|
|
110
|
+
events.push({ kind: "FilesChanged", files: p.files ?? [] });
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// 3. plan (todos) — including clearing to empty.
|
|
116
|
+
const todos = (curSnapshot?.todos ?? []);
|
|
117
|
+
const sig = stableStringify(todos);
|
|
118
|
+
if (sig !== this.lastPlanSig) {
|
|
119
|
+
this.lastPlanSig = sig;
|
|
120
|
+
const entries = todos.map((t) => makePlanEntry(String(t["content"] ?? ""), String(t["status"] ?? "pending"), String(t["priority"] ?? "medium")));
|
|
121
|
+
events.push({ kind: "PlanUpdate", entries });
|
|
122
|
+
}
|
|
123
|
+
return events;
|
|
124
|
+
}
|
|
125
|
+
diffToolPart(p) {
|
|
126
|
+
const events = [];
|
|
127
|
+
const callId = String(p["callID"] ?? p["callId"] ?? "");
|
|
128
|
+
if (!callId)
|
|
129
|
+
return events;
|
|
130
|
+
const toolName = String(p["tool"] ?? "other");
|
|
131
|
+
const state = p["state"] ?? {};
|
|
132
|
+
const status = String(state["status"] ?? "pending");
|
|
133
|
+
if (!this.seenToolIds.has(callId)) {
|
|
134
|
+
this.seenToolIds.add(callId);
|
|
135
|
+
this.lastToolStatus.set(callId, status);
|
|
136
|
+
const input = state["input"];
|
|
137
|
+
const summary = summarizeToolInput(toolName, input);
|
|
138
|
+
const newEv = {
|
|
139
|
+
kind: "ToolCallNew",
|
|
140
|
+
callId,
|
|
141
|
+
tool: toolName,
|
|
142
|
+
acpKind: (TOOL_KIND_MAP[toolName] ?? "other"),
|
|
143
|
+
status: (TOOL_STATUS_MAP[status] ?? "other"),
|
|
144
|
+
title: summary ? `${toolName}: ${summary}` : toolName,
|
|
145
|
+
};
|
|
146
|
+
if (input !== undefined)
|
|
147
|
+
newEv.input = input;
|
|
148
|
+
const display = state["metadata"]?.["display"];
|
|
149
|
+
if (status === "completed" || status === "error") {
|
|
150
|
+
const outPayload = state["output"] ?? state["error"];
|
|
151
|
+
newEv.output = renderToolOutput(outPayload);
|
|
152
|
+
const diff = buildDiffContent(display);
|
|
153
|
+
if (diff.length > 0) {
|
|
154
|
+
newEv.diffContent = diff;
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
const rc = buildResultContent(toolName, outPayload, status === "error");
|
|
158
|
+
if (rc.length > 0)
|
|
159
|
+
newEv.content = rc;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
const locs = extractLocations(toolName, input, display);
|
|
163
|
+
if (locs.length > 0)
|
|
164
|
+
newEv.locations = locs;
|
|
165
|
+
events.push(newEv);
|
|
166
|
+
}
|
|
167
|
+
else if (status !== this.lastToolStatus.get(callId)) {
|
|
168
|
+
// Status transition on a seen tool. On completed/error, carry the rich
|
|
169
|
+
// payload (output / diff / content / locations) like the new-tool branch,
|
|
170
|
+
// so snapshot-path transitions aren't content-less.
|
|
171
|
+
this.lastToolStatus.set(callId, status);
|
|
172
|
+
const display = state["metadata"]?.["display"];
|
|
173
|
+
const update = {
|
|
174
|
+
kind: "ToolCallUpdate",
|
|
175
|
+
callId,
|
|
176
|
+
tool: toolName,
|
|
177
|
+
status: (TOOL_STATUS_MAP[status] ?? "other"),
|
|
178
|
+
};
|
|
179
|
+
if (status === "completed" || status === "error") {
|
|
180
|
+
const outPayload = state["output"] ?? state["error"];
|
|
181
|
+
update.output = renderToolOutput(outPayload);
|
|
182
|
+
const diff = buildDiffContent(display);
|
|
183
|
+
if (diff.length > 0) {
|
|
184
|
+
update.diffContent = diff;
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
const rc = buildResultContent(toolName, outPayload, status === "error");
|
|
188
|
+
if (rc.length > 0)
|
|
189
|
+
update.content = rc;
|
|
190
|
+
}
|
|
191
|
+
const locs = extractLocations(toolName, state["input"], display);
|
|
192
|
+
if (locs.length > 0)
|
|
193
|
+
update.locations = locs;
|
|
194
|
+
}
|
|
195
|
+
events.push(update);
|
|
196
|
+
}
|
|
197
|
+
return events;
|
|
198
|
+
}
|
|
199
|
+
messageDedupKey(m) {
|
|
200
|
+
const info = (m.info ?? {});
|
|
201
|
+
const msgId = info.id;
|
|
202
|
+
if (msgId)
|
|
203
|
+
return msgId;
|
|
204
|
+
const role = info.role ?? "?";
|
|
205
|
+
try {
|
|
206
|
+
const sig = stableStringify(m.parts ?? []).slice(0, 200);
|
|
207
|
+
return `__fallback::${role}::${sig}`;
|
|
208
|
+
}
|
|
209
|
+
catch {
|
|
210
|
+
return `__fallback::${role}::${String(m.parts).slice(0, 200)}`;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
/** Deterministic JSON string with recursively sorted object keys, mirroring
|
|
215
|
+
* Python's `json.dumps(..., sort_keys=True)` so signatures are stable regardless
|
|
216
|
+
* of key insertion order. */
|
|
217
|
+
function stableStringify(value) {
|
|
218
|
+
try {
|
|
219
|
+
return JSON.stringify(sortKeys(value));
|
|
220
|
+
}
|
|
221
|
+
catch {
|
|
222
|
+
return String(value);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
function sortKeys(value) {
|
|
226
|
+
if (Array.isArray(value))
|
|
227
|
+
return value.map(sortKeys);
|
|
228
|
+
if (value && typeof value === "object") {
|
|
229
|
+
const obj = value;
|
|
230
|
+
return Object.keys(obj)
|
|
231
|
+
.sort()
|
|
232
|
+
.reduce((acc, k) => {
|
|
233
|
+
acc[k] = sortKeys(obj[k]);
|
|
234
|
+
return acc;
|
|
235
|
+
}, {});
|
|
236
|
+
}
|
|
237
|
+
return value;
|
|
238
|
+
}
|
|
239
|
+
//# sourceMappingURL=projection-differ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projection-differ.js","sourceRoot":"","sources":["../../src/translators/projection-differ.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAUH,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,EAClB,aAAa,GACd,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,eAAe,GAAmC;IACtD,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,aAAa;IACtB,SAAS,EAAE,WAAW;IACtB,KAAK,EAAE,QAAQ;CAChB,CAAC;AAEF,MAAM,OAAO,gBAAgB;IACV,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,cAAc,GAAG,IAAI,GAAG,EAAkB,CAAC;IACpD,SAAS,GAAkB,IAAI,CAAC;IACvB,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;IAC5C,WAAW,GAAG,UAAU,CAAC;IAChB,eAAe,GAAG,IAAI,GAAG,EAAU,CAAC;IACrD,0EAA0E;IAC1E,mBAAmB,GAAG,KAAK,CAAC;IAE5B,8EAA8E;IAC9E,QAAQ,CAAC,QAAwB;QAC/B,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YACpC,IAAI,GAAG;gBAAE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAED,gEAAgE;IAChE,cAAc,CAAC,CAAe;QAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACpC,OAAO,GAAG,KAAK,IAAI,IAAI,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACtD,CAAC;IAED;;;;;OAKG;IACH,YAAY,CAAC,MAAc;QACzB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC7B,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAC/C,CAAC;IAED,4DAA4D;IAC5D,SAAS;QACP,IAAI,CAAC,mBAAmB,GAAG,KAAK,CAAC;IACnC,CAAC;IAED,4EAA4E;IAC5E,YAAY,CAAC,IAAY;QACvB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;IACxB,CAAC;IAED,+CAA+C;IAC/C,IAAI,CAAC,WAAiC;QACpC,MAAM,MAAM,GAAoB,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,CAAC,WAAW,EAAE,UAAU,IAAI,EAAE,CAAoB,CAAC;QACnE,MAAM,OAAO,GAAG,WAAW,EAAE,QAAQ,IAAI,EAAE,CAAC;QAE5C,+EAA+E;QAC/E,oFAAoF;QACpF,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,eAAe,IAAI,CAAC,CAAC;QACjE,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,IAAI,CAAC,CAAC;QACxC,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,CAAC,SAAS,EAAE,CAAC;YACvD,IAAI,IAAI,GAAG,CAAC;gBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YAC9D,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACxB,CAAC;QAED,sCAAsC;QACtC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YACzC,IAAI,QAAQ,IAAI,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC;gBAAE,SAAS;YAC5D,IAAI,QAAQ;gBAAE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAChD,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC;YAC1B,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;gBAC9B,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ;oBAAE,SAAS;gBAC1C,MAAM,KAAK,GAAI,CAAuB,CAAC,IAAI,CAAC;gBAC5C,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;oBACrB,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,CAA+C,CAAC,CAAC,CAAC;gBACrF,CAAC;qBAAM,IAAI,KAAK,KAAK,MAAM,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;oBACpD,MAAM,IAAI,GAAI,CAAuB,CAAC,IAAI,IAAI,EAAE,CAAC;oBACjD,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;wBAChB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;wBACzC,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;oBAClC,CAAC;gBACH,CAAC;qBAAM,IAAI,KAAK,KAAK,WAAW,EAAE,CAAC;oBACjC,MAAM,IAAI,GAAI,CAAuB,CAAC,IAAI,IAAI,EAAE,CAAC;oBACjD,IAAI,IAAI,CAAC,IAAI,EAAE;wBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAC;gBACjE,CAAC;qBAAM,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;oBAC7B,MAAM,EAAE,GAAI,CAAuB,CAAC,IAAI,CAAC;oBACzC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;wBACxC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;wBAC7B,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAG,CAA0B,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC,CAAC;oBACxF,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,iDAAiD;QACjD,MAAM,KAAK,GAAG,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE,CAAmC,CAAC;QAC3E,MAAM,GAAG,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;QACnC,IAAI,GAAG,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC;YAC7B,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC;YACvB,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAC9B,aAAa,CACX,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,EAC1B,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,SAAS,CAAC,EAChC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,QAAQ,CAAC,CAClC,CACF,CAAC;YACF,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,CAAC;QAC/C,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,YAAY,CAAC,CAA6C;QAChE,MAAM,MAAM,GAAoB,EAAE,CAAC;QACnC,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;QACxD,IAAI,CAAC,MAAM;YAAE,OAAO,MAAM,CAAC;QAC3B,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,CAAC;QAC9C,MAAM,KAAK,GAAI,CAAC,CAAC,OAAO,CAA6B,IAAI,EAAE,CAAC;QAC5D,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,SAAS,CAAC,CAAC;QAEpD,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YAClC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAC7B,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YACxC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;YAC7B,MAAM,OAAO,GAAG,kBAAkB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YACpD,MAAM,KAAK,GAAkB;gBAC3B,IAAI,EAAE,aAAa;gBACnB,MAAM;gBACN,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAa;gBACzD,MAAM,EAAE,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,OAAO,CAAmB;gBAC9D,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,QAAQ,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC,QAAQ;aACtD,CAAC;YACF,IAAI,KAAK,KAAK,SAAS;gBAAG,KAA6B,CAAC,KAAK,GAAG,KAAK,CAAC;YACtE,MAAM,OAAO,GAAI,KAAK,CAAC,UAAU,CAAyC,EAAE,CAAC,SAAS,CAAC,CAAC;YACxF,IAAI,MAAM,KAAK,WAAW,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;gBACjD,MAAM,UAAU,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;gBACpD,KAA6B,CAAC,MAAM,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;gBACrE,MAAM,IAAI,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;gBACvC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACnB,KAAuC,CAAC,WAAW,GAAG,IAAI,CAAC;gBAC9D,CAAC;qBAAM,CAAC;oBACN,MAAM,EAAE,GAAG,kBAAkB,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC;oBACxE,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;wBAAG,KAAiC,CAAC,OAAO,GAAG,EAAE,CAAC;gBACrE,CAAC;YACH,CAAC;YACD,MAAM,IAAI,GAAG,gBAAgB,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;YACxD,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;gBAAG,KAAqC,CAAC,SAAS,GAAG,IAAI,CAAC;YAC7E,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;aAAM,IAAI,MAAM,KAAK,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YACtD,uEAAuE;YACvE,0EAA0E;YAC1E,oDAAoD;YACpD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YACxC,MAAM,OAAO,GAAI,KAAK,CAAC,UAAU,CAAyC,EAAE,CAAC,SAAS,CAAC,CAAC;YACxF,MAAM,MAAM,GAAkB;gBAC5B,IAAI,EAAE,gBAAgB;gBACtB,MAAM;gBACN,IAAI,EAAE,QAAQ;gBACd,MAAM,EAAE,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,OAAO,CAAmB;aAC/D,CAAC;YACF,IAAI,MAAM,KAAK,WAAW,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;gBACjD,MAAM,UAAU,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;gBACpD,MAA8B,CAAC,MAAM,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;gBACtE,MAAM,IAAI,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;gBACvC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACnB,MAAwC,CAAC,WAAW,GAAG,IAAI,CAAC;gBAC/D,CAAC;qBAAM,CAAC;oBACN,MAAM,EAAE,GAAG,kBAAkB,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC;oBACxE,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;wBAAG,MAAkC,CAAC,OAAO,GAAG,EAAE,CAAC;gBACtE,CAAC;gBACD,MAAM,IAAI,GAAG,gBAAgB,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;gBACjE,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;oBAAG,MAAsC,CAAC,SAAS,GAAG,IAAI,CAAC;YAChF,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtB,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,eAAe,CAAC,CAAe;QACrC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAmC,CAAC;QAC9D,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC;QACtB,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC;QACxB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC;QAC9B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,eAAe,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YACzD,OAAO,eAAe,IAAI,KAAK,GAAG,EAAE,CAAC;QACvC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,eAAe,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;QACjE,CAAC;IACH,CAAC;CACF;AAED;;8BAE8B;AAC9B,SAAS,eAAe,CAAC,KAAc;IACrC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACrD,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvC,MAAM,GAAG,GAAG,KAAgC,CAAC;QAC7C,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;aACpB,IAAI,EAAE;aACN,MAAM,CAA0B,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;YAC1C,GAAG,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1B,OAAO,GAAG,CAAC;QACb,CAAC,EAAE,EAAE,CAAC,CAAC;IACX,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool translation helpers: kind mapping, input summary, result-content
|
|
3
|
+
* shaping, diff parsing, location extraction, exit-code extraction, error
|
|
4
|
+
* rendering.
|
|
5
|
+
*
|
|
6
|
+
* These are pure functions shared by `EventTranslator` (event-stream path) and
|
|
7
|
+
* `ProjectionDiffer` (snapshot path) so both render the same titles/content for
|
|
8
|
+
* the same tool.
|
|
9
|
+
*/
|
|
10
|
+
import type { ToolCallContent, ToolCallLocation, ToolKind } from "@agentclientprotocol/sdk";
|
|
11
|
+
/** zcode toolName → ACP ToolKind. Keys are case-duplicated for safety. */
|
|
12
|
+
export declare const TOOL_KIND_MAP: Record<string, ToolKind>;
|
|
13
|
+
/**
|
|
14
|
+
* Extract a one-line summary from a tool's input object (used for the ACP
|
|
15
|
+
* ToolCall `title`). Priority: command / description / query / file_path /
|
|
16
|
+
* path / pattern / prompt. Bash `command` is NOT truncated (Zed's terminal
|
|
17
|
+
* card needs the full command); other fields truncate to SUMMARY_MAX. Falls
|
|
18
|
+
* back to compact JSON, then String(input). Returns "" for empty input.
|
|
19
|
+
*/
|
|
20
|
+
export declare function summarizeToolInput(_toolName: string, inp: unknown): string;
|
|
21
|
+
/**
|
|
22
|
+
* Render a tool result/progress output into a readable string. The zcode
|
|
23
|
+
* standard result structure is `{success, content, perf:{...}}`; the `content`
|
|
24
|
+
* field is the actual command output the user cares about. On `success:false`
|
|
25
|
+
* with empty content, prefix the error/message. Other shapes fall back to JSON.
|
|
26
|
+
*/
|
|
27
|
+
export declare function renderToolOutput(output: unknown): string;
|
|
28
|
+
/**
|
|
29
|
+
* Extract a Bash exit code from a result payload. Reads `perf.exitCode`
|
|
30
|
+
* (integer); falls back to inferring 1 on `success:false`, else 0. For error
|
|
31
|
+
* payloads with no usable dict, returns 1 when `isError`.
|
|
32
|
+
*/
|
|
33
|
+
export declare function extractExitCode(resultPayload: unknown, isError?: boolean): number;
|
|
34
|
+
/**
|
|
35
|
+
* Build ACP `ToolCallContent[]` (type:"content") from a result, for display in
|
|
36
|
+
* the editor's tool card. Error → code fence; Read → plain text; Bash →
|
|
37
|
+
* `console` code block; default → plain text. Returns [] when there's no text
|
|
38
|
+
* (caller skips to avoid clobbering rawOutput).
|
|
39
|
+
*
|
|
40
|
+
* Edit/Write are NOT handled here — their diff is dispatched separately from
|
|
41
|
+
* `session/messages` metadata (more timely and reliable).
|
|
42
|
+
*/
|
|
43
|
+
export declare function buildResultContent(toolName: string, resultPayload: unknown, isError?: boolean): ToolCallContent[];
|
|
44
|
+
/**
|
|
45
|
+
* Build ACP `ToolCallContent[]` with the "diff" variant from a tool part's
|
|
46
|
+
* `metadata.display` (kind:"file_diff"). Each hunk → one
|
|
47
|
+
* `{type:"diff", path, oldText, newText}` where the texts are the old/new
|
|
48
|
+
* line sets (not unified-diff strings). Empty `oldText` → null (new-file
|
|
49
|
+
* convention). Returns [] when display isn't a file_diff or has no patches.
|
|
50
|
+
*/
|
|
51
|
+
export declare function buildDiffContent(display: unknown): ToolCallContent[];
|
|
52
|
+
/**
|
|
53
|
+
* Extract ACP `ToolCallLocation[]` ({path, line?}) for deep-linking. Edit/Write
|
|
54
|
+
* completion prefers the diff display's `newStart` (precise change line); other
|
|
55
|
+
* tools derive from input (Read → file_path+offset, Glob/Grep → search dir).
|
|
56
|
+
*/
|
|
57
|
+
export declare function extractLocations(toolName: string, inp: unknown, display?: unknown): ToolCallLocation[];
|
|
58
|
+
/** Render a turn.failed error object into a readable single-line string. */
|
|
59
|
+
export declare function formatTurnError(error: unknown): string;
|
|
60
|
+
//# sourceMappingURL=tool-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-helpers.d.ts","sourceRoot":"","sources":["../../src/translators/tool-helpers.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAE5F,0EAA0E;AAC1E,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAmBlD,CAAC;AAOF;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,MAAM,CAmB1E;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAyBxD;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,aAAa,EAAE,OAAO,EAAE,OAAO,UAAQ,GAAG,MAAM,CAY/E;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,OAAO,EACtB,OAAO,UAAQ,GACd,eAAe,EAAE,CA4CnB;AAgBD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,eAAe,EAAE,CAmCpE;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,OAAO,EACZ,OAAO,CAAC,EAAE,OAAO,GAChB,gBAAgB,EAAE,CA8CpB;AAED,4EAA4E;AAC5E,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAsBtD"}
|
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool translation helpers: kind mapping, input summary, result-content
|
|
3
|
+
* shaping, diff parsing, location extraction, exit-code extraction, error
|
|
4
|
+
* rendering.
|
|
5
|
+
*
|
|
6
|
+
* These are pure functions shared by `EventTranslator` (event-stream path) and
|
|
7
|
+
* `ProjectionDiffer` (snapshot path) so both render the same titles/content for
|
|
8
|
+
* the same tool.
|
|
9
|
+
*/
|
|
10
|
+
/** zcode toolName → ACP ToolKind. Keys are case-duplicated for safety. */
|
|
11
|
+
export const TOOL_KIND_MAP = {
|
|
12
|
+
Bash: "execute",
|
|
13
|
+
bash: "execute",
|
|
14
|
+
Edit: "edit",
|
|
15
|
+
Write: "edit",
|
|
16
|
+
edit: "edit",
|
|
17
|
+
write: "edit",
|
|
18
|
+
Read: "read",
|
|
19
|
+
read: "read",
|
|
20
|
+
Grep: "search",
|
|
21
|
+
grep: "search",
|
|
22
|
+
Glob: "search",
|
|
23
|
+
WebFetch: "fetch",
|
|
24
|
+
WebSearch: "fetch",
|
|
25
|
+
web_search: "fetch",
|
|
26
|
+
// Sub-agent dispatch (zcode toolName="Agent", not Task). Deliberately NOT
|
|
27
|
+
// "execute" so the editor shows a generic call card rather than a shell.
|
|
28
|
+
Agent: "other",
|
|
29
|
+
Task: "other",
|
|
30
|
+
};
|
|
31
|
+
/** Max length for single-field title summaries (not Bash command — kept full). */
|
|
32
|
+
const SUMMARY_MAX = 60;
|
|
33
|
+
/** Max length for rendered result output. */
|
|
34
|
+
const OUTPUT_MAX = 2000;
|
|
35
|
+
/**
|
|
36
|
+
* Extract a one-line summary from a tool's input object (used for the ACP
|
|
37
|
+
* ToolCall `title`). Priority: command / description / query / file_path /
|
|
38
|
+
* path / pattern / prompt. Bash `command` is NOT truncated (Zed's terminal
|
|
39
|
+
* card needs the full command); other fields truncate to SUMMARY_MAX. Falls
|
|
40
|
+
* back to compact JSON, then String(input). Returns "" for empty input.
|
|
41
|
+
*/
|
|
42
|
+
export function summarizeToolInput(_toolName, inp) {
|
|
43
|
+
if (inp == null)
|
|
44
|
+
return "";
|
|
45
|
+
if (typeof inp === "object" && !Array.isArray(inp)) {
|
|
46
|
+
const obj = inp;
|
|
47
|
+
for (const k of ["command", "description", "query", "file_path", "path", "pattern", "prompt"]) {
|
|
48
|
+
const v = obj[k];
|
|
49
|
+
if (v) {
|
|
50
|
+
// Bash command: full (matches reference impl; Zed terminal card needs full command).
|
|
51
|
+
if (k === "command")
|
|
52
|
+
return String(v);
|
|
53
|
+
return String(v).slice(0, SUMMARY_MAX);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
try {
|
|
57
|
+
return JSON.stringify(obj).slice(0, SUMMARY_MAX);
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
return String(inp).slice(0, SUMMARY_MAX);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return String(inp).slice(0, SUMMARY_MAX);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Render a tool result/progress output into a readable string. The zcode
|
|
67
|
+
* standard result structure is `{success, content, perf:{...}}`; the `content`
|
|
68
|
+
* field is the actual command output the user cares about. On `success:false`
|
|
69
|
+
* with empty content, prefix the error/message. Other shapes fall back to JSON.
|
|
70
|
+
*/
|
|
71
|
+
export function renderToolOutput(output) {
|
|
72
|
+
if (output == null)
|
|
73
|
+
return "";
|
|
74
|
+
if (typeof output === "string")
|
|
75
|
+
return output.slice(0, OUTPUT_MAX);
|
|
76
|
+
if (typeof output === "object") {
|
|
77
|
+
if (!Array.isArray(output)) {
|
|
78
|
+
const obj = output;
|
|
79
|
+
const content = obj["content"];
|
|
80
|
+
if (typeof content === "string" && content)
|
|
81
|
+
return content.slice(0, OUTPUT_MAX);
|
|
82
|
+
if (obj["success"] === false) {
|
|
83
|
+
const err = String(obj["error"] ?? obj["message"] ?? "");
|
|
84
|
+
if (err)
|
|
85
|
+
return `[failed] ${err.slice(0, OUTPUT_MAX)}`;
|
|
86
|
+
}
|
|
87
|
+
try {
|
|
88
|
+
return JSON.stringify(obj).slice(0, OUTPUT_MAX);
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
return String(output).slice(0, OUTPUT_MAX);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
try {
|
|
95
|
+
return JSON.stringify(output).slice(0, OUTPUT_MAX);
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
return String(output).slice(0, OUTPUT_MAX);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return String(output).slice(0, OUTPUT_MAX);
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Extract a Bash exit code from a result payload. Reads `perf.exitCode`
|
|
105
|
+
* (integer); falls back to inferring 1 on `success:false`, else 0. For error
|
|
106
|
+
* payloads with no usable dict, returns 1 when `isError`.
|
|
107
|
+
*/
|
|
108
|
+
export function extractExitCode(resultPayload, isError = false) {
|
|
109
|
+
if (resultPayload && typeof resultPayload === "object" && !Array.isArray(resultPayload)) {
|
|
110
|
+
const obj = resultPayload;
|
|
111
|
+
const perf = obj["perf"];
|
|
112
|
+
if (perf && typeof perf["exitCode"] === "number") {
|
|
113
|
+
return perf["exitCode"];
|
|
114
|
+
}
|
|
115
|
+
if (obj["success"] === false)
|
|
116
|
+
return 1;
|
|
117
|
+
return 0;
|
|
118
|
+
}
|
|
119
|
+
if (isError)
|
|
120
|
+
return 1;
|
|
121
|
+
return 0;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Build ACP `ToolCallContent[]` (type:"content") from a result, for display in
|
|
125
|
+
* the editor's tool card. Error → code fence; Read → plain text; Bash →
|
|
126
|
+
* `console` code block; default → plain text. Returns [] when there's no text
|
|
127
|
+
* (caller skips to avoid clobbering rawOutput).
|
|
128
|
+
*
|
|
129
|
+
* Edit/Write are NOT handled here — their diff is dispatched separately from
|
|
130
|
+
* `session/messages` metadata (more timely and reliable).
|
|
131
|
+
*/
|
|
132
|
+
export function buildResultContent(toolName, resultPayload, isError = false) {
|
|
133
|
+
let text = "";
|
|
134
|
+
if (resultPayload && typeof resultPayload === "object" && !Array.isArray(resultPayload)) {
|
|
135
|
+
const obj = resultPayload;
|
|
136
|
+
const c = obj["content"];
|
|
137
|
+
if (typeof c === "string" && c) {
|
|
138
|
+
text = c;
|
|
139
|
+
}
|
|
140
|
+
else if (obj["success"] === false) {
|
|
141
|
+
text = String(obj["error"] ?? obj["message"] ?? "");
|
|
142
|
+
}
|
|
143
|
+
else if (c == null) {
|
|
144
|
+
try {
|
|
145
|
+
text = JSON.stringify(obj);
|
|
146
|
+
}
|
|
147
|
+
catch {
|
|
148
|
+
text = String(resultPayload);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
else if (typeof resultPayload === "string") {
|
|
153
|
+
text = resultPayload;
|
|
154
|
+
}
|
|
155
|
+
else if (resultPayload != null) {
|
|
156
|
+
try {
|
|
157
|
+
text = JSON.stringify(resultPayload);
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
text = String(resultPayload);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
if (!text || !text.trim())
|
|
164
|
+
return [];
|
|
165
|
+
text = text.slice(0, OUTPUT_MAX);
|
|
166
|
+
if (isError) {
|
|
167
|
+
return [{ type: "content", content: { type: "text", text: "```\n" + text + "\n```" } }];
|
|
168
|
+
}
|
|
169
|
+
if (toolName === "Read" || toolName === "read") {
|
|
170
|
+
return [{ type: "content", content: { type: "text", text } }];
|
|
171
|
+
}
|
|
172
|
+
if (toolName === "Bash" || toolName === "bash") {
|
|
173
|
+
return [
|
|
174
|
+
{
|
|
175
|
+
type: "content",
|
|
176
|
+
content: { type: "text", text: "```console\n" + text.trimEnd() + "\n```" },
|
|
177
|
+
},
|
|
178
|
+
];
|
|
179
|
+
}
|
|
180
|
+
return [{ type: "content", content: { type: "text", text } }];
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Build ACP `ToolCallContent[]` with the "diff" variant from a tool part's
|
|
184
|
+
* `metadata.display` (kind:"file_diff"). Each hunk → one
|
|
185
|
+
* `{type:"diff", path, oldText, newText}` where the texts are the old/new
|
|
186
|
+
* line sets (not unified-diff strings). Empty `oldText` → null (new-file
|
|
187
|
+
* convention). Returns [] when display isn't a file_diff or has no patches.
|
|
188
|
+
*/
|
|
189
|
+
export function buildDiffContent(display) {
|
|
190
|
+
if (!display || typeof display !== "object" || Array.isArray(display))
|
|
191
|
+
return [];
|
|
192
|
+
const d = display;
|
|
193
|
+
if (d.kind !== "file_diff")
|
|
194
|
+
return [];
|
|
195
|
+
const filePath = d.filePath ?? "";
|
|
196
|
+
const patches = d.structuredPatch ?? [];
|
|
197
|
+
if (!filePath || patches.length === 0)
|
|
198
|
+
return [];
|
|
199
|
+
const content = [];
|
|
200
|
+
for (const hunk of patches) {
|
|
201
|
+
const oldLines = [];
|
|
202
|
+
const newLines = [];
|
|
203
|
+
for (const hl of hunk.lines ?? []) {
|
|
204
|
+
if (typeof hl !== "string")
|
|
205
|
+
continue;
|
|
206
|
+
if (hl.startsWith("-")) {
|
|
207
|
+
oldLines.push(hl.slice(1));
|
|
208
|
+
}
|
|
209
|
+
else if (hl.startsWith("+")) {
|
|
210
|
+
newLines.push(hl.slice(1));
|
|
211
|
+
}
|
|
212
|
+
else {
|
|
213
|
+
// Context line (leading " " or no prefix) → both sides.
|
|
214
|
+
const ctx = hl.startsWith(" ") ? hl.slice(1) : hl;
|
|
215
|
+
oldLines.push(ctx);
|
|
216
|
+
newLines.push(ctx);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
if (oldLines.length > 0 || newLines.length > 0) {
|
|
220
|
+
content.push({
|
|
221
|
+
type: "diff",
|
|
222
|
+
path: filePath,
|
|
223
|
+
oldText: oldLines.length > 0 ? oldLines.join("\n") : null,
|
|
224
|
+
newText: newLines.join("\n"),
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
return content;
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Extract ACP `ToolCallLocation[]` ({path, line?}) for deep-linking. Edit/Write
|
|
232
|
+
* completion prefers the diff display's `newStart` (precise change line); other
|
|
233
|
+
* tools derive from input (Read → file_path+offset, Glob/Grep → search dir).
|
|
234
|
+
*/
|
|
235
|
+
export function extractLocations(toolName, inp, display) {
|
|
236
|
+
// 1. Edit/Write completion: prefer diff display's filePath + newStart.
|
|
237
|
+
if (display && typeof display === "object" && !Array.isArray(display)) {
|
|
238
|
+
const d = display;
|
|
239
|
+
if (d.kind === "file_diff") {
|
|
240
|
+
const fp = d.filePath ?? "";
|
|
241
|
+
const patches = d.structuredPatch ?? [];
|
|
242
|
+
if (fp && patches.length > 0) {
|
|
243
|
+
const locs = [];
|
|
244
|
+
for (const hunk of patches) {
|
|
245
|
+
if (typeof hunk.newStart === "number") {
|
|
246
|
+
locs.push({ path: fp, line: hunk.newStart });
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
return locs.length > 0 ? locs : fp ? [{ path: fp }] : [];
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
// 2. Derive from input by tool type.
|
|
254
|
+
if (!inp || typeof inp !== "object" || Array.isArray(inp))
|
|
255
|
+
return [];
|
|
256
|
+
const obj = inp;
|
|
257
|
+
if (toolName === "Read" || toolName === "read") {
|
|
258
|
+
const fp = String(obj["file_path"] ?? obj["path"] ?? "");
|
|
259
|
+
if (fp) {
|
|
260
|
+
const offset = obj["offset"];
|
|
261
|
+
return [{ path: fp, line: typeof offset === "number" ? offset : 1 }];
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
else if (toolName === "Write" ||
|
|
265
|
+
toolName === "write" ||
|
|
266
|
+
toolName === "Edit" ||
|
|
267
|
+
toolName === "edit") {
|
|
268
|
+
const fp = String(obj["file_path"] ?? obj["path"] ?? "");
|
|
269
|
+
if (fp)
|
|
270
|
+
return [{ path: fp }];
|
|
271
|
+
}
|
|
272
|
+
else if (toolName === "Glob" ||
|
|
273
|
+
toolName === "glob" ||
|
|
274
|
+
toolName === "Grep" ||
|
|
275
|
+
toolName === "grep") {
|
|
276
|
+
const p = String(obj["path"] ?? obj["file_path"] ?? "");
|
|
277
|
+
if (p)
|
|
278
|
+
return [{ path: p }];
|
|
279
|
+
}
|
|
280
|
+
return [];
|
|
281
|
+
}
|
|
282
|
+
/** Render a turn.failed error object into a readable single-line string. */
|
|
283
|
+
export function formatTurnError(error) {
|
|
284
|
+
if (!error || typeof error !== "object" || Array.isArray(error))
|
|
285
|
+
return "";
|
|
286
|
+
const e = error;
|
|
287
|
+
const code = String(e["code"] ?? "").trim();
|
|
288
|
+
const message = String(e["message"] ?? "").trim();
|
|
289
|
+
const detail = String(e["detail"] ?? "").trim();
|
|
290
|
+
const etype = String(e["type"] ?? "").trim();
|
|
291
|
+
const parts = [];
|
|
292
|
+
if (code)
|
|
293
|
+
parts.push(code);
|
|
294
|
+
if (message)
|
|
295
|
+
parts.push(message);
|
|
296
|
+
if (parts.length === 0 && etype)
|
|
297
|
+
parts.push(etype);
|
|
298
|
+
let out = parts.join(" ");
|
|
299
|
+
if (detail) {
|
|
300
|
+
const firstDetail = detail.split("\n")[0]?.trim() ?? "";
|
|
301
|
+
if (firstDetail && !out.includes(firstDetail)) {
|
|
302
|
+
const trimmed = firstDetail.length > 160 ? firstDetail.slice(0, 160) + "..." : firstDetail;
|
|
303
|
+
out = out ? `${out} (${trimmed})` : trimmed;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
return out;
|
|
307
|
+
}
|
|
308
|
+
//# sourceMappingURL=tool-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-helpers.js","sourceRoot":"","sources":["../../src/translators/tool-helpers.ts"],"names":[],"mappings":"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"}
|