linersh 1.1.3 → 1.2.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 +15 -61
- package/bin/liner.js +60 -16
- package/package.json +10 -17
- package/cli-update-docs/README.md +0 -129
- package/cli-update-docs/SKILL.md +0 -294
- package/cli-update-docs/curator-notes.md +0 -85
- package/cli-update-docs/quality-check-tests.md +0 -435
- package/cli-update-docs/source-finding-tactics.md +0 -224
- package/cli-update-docs/source-quality-hierarchy.md +0 -209
- package/cli-update-docs/synthesis-guidance.md +0 -151
- package/dist/agents/artifact-validation.js +0 -567
- package/dist/agents/artifact-validation.js.map +0 -1
- package/dist/agents/candidate-longlist.js +0 -116
- package/dist/agents/candidate-longlist.js.map +0 -1
- package/dist/agents/detect.js +0 -169
- package/dist/agents/detect.js.map +0 -1
- package/dist/agents/evaluation-assembly.js +0 -270
- package/dist/agents/evaluation-assembly.js.map +0 -1
- package/dist/agents/events.js +0 -8
- package/dist/agents/events.js.map +0 -1
- package/dist/agents/headless-runner.js +0 -432
- package/dist/agents/headless-runner.js.map +0 -1
- package/dist/agents/jtbd-clarify.js +0 -169
- package/dist/agents/jtbd-clarify.js.map +0 -1
- package/dist/agents/models.js +0 -98
- package/dist/agents/models.js.map +0 -1
- package/dist/agents/parsers.js +0 -316
- package/dist/agents/parsers.js.map +0 -1
- package/dist/agents/prompts.js +0 -522
- package/dist/agents/prompts.js.map +0 -1
- package/dist/agents/run-log.js +0 -71
- package/dist/agents/run-log.js.map +0 -1
- package/dist/agents/runner.js +0 -906
- package/dist/agents/runner.js.map +0 -1
- package/dist/agents/types.js +0 -2
- package/dist/agents/types.js.map +0 -1
- package/dist/bin-resolver.js +0 -92
- package/dist/bin-resolver.js.map +0 -1
- package/dist/config.js +0 -282
- package/dist/config.js.map +0 -1
- package/dist/editor.js +0 -40
- package/dist/editor.js.map +0 -1
- package/dist/gates.js +0 -121
- package/dist/gates.js.map +0 -1
- package/dist/ipc.js +0 -145
- package/dist/ipc.js.map +0 -1
- package/dist/open-folder.js +0 -28
- package/dist/open-folder.js.map +0 -1
- package/dist/phases.js +0 -346
- package/dist/phases.js.map +0 -1
- package/dist/progress.js +0 -184
- package/dist/progress.js.map +0 -1
- package/dist/source-inbox.js +0 -297
- package/dist/source-inbox.js.map +0 -1
- package/dist/types.js +0 -3
- package/dist/types.js.map +0 -1
- package/dist/version.js +0 -18
- package/dist/version.js.map +0 -1
- package/dist/yaml-io.js +0 -376
- package/dist/yaml-io.js.map +0 -1
- package/maintenance-skill/SKILL.md +0 -18
- package/maintenance-skill/agents/openai.yaml +0 -4
package/dist/agents/models.js
DELETED
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
// Per-task model and Thinking-effort selection.
|
|
2
|
-
//
|
|
3
|
-
// OpenAI Auto runs Sol 6.1 at Medium for every task. Claude runs Sonnet 5.5 at
|
|
4
|
-
// Medium unless Settings chooses another model or effort. A provider
|
|
5
|
-
// preference or hand-edited phase override remains authoritative; choosing
|
|
6
|
-
// provider default disables the OpenAI Auto policy.
|
|
7
|
-
export const AUTO_OPENAI_MODEL = "gpt-6.1-sol";
|
|
8
|
-
export const AUTO_OPENAI_EFFORT = "medium";
|
|
9
|
-
export const DEFAULT_CLAUDE_MODEL = "claude-sonnet-5-5";
|
|
10
|
-
export const DEFAULT_CLAUDE_EFFORT = "medium";
|
|
11
|
-
// Claude Code's --effort levels; "none" is OpenAI-only.
|
|
12
|
-
export const CLAUDE_REASONING_EFFORTS = new Set([
|
|
13
|
-
"low",
|
|
14
|
-
"medium",
|
|
15
|
-
"high",
|
|
16
|
-
"xhigh",
|
|
17
|
-
"max",
|
|
18
|
-
]);
|
|
19
|
-
// Claude Code aliases saved by earlier Liner versions, and the models that
|
|
20
|
-
// replaced them in Settings.
|
|
21
|
-
const LEGACY_CLAUDE_MODELS = {
|
|
22
|
-
sonnet: DEFAULT_CLAUDE_MODEL,
|
|
23
|
-
opus: "claude-opus-5-5",
|
|
24
|
-
};
|
|
25
|
-
export function normalizeProviderModel(agent, model) {
|
|
26
|
-
const value = model.trim();
|
|
27
|
-
if (agent !== "claude")
|
|
28
|
-
return value;
|
|
29
|
-
return LEGACY_CLAUDE_MODELS[value.toLowerCase()] ?? value;
|
|
30
|
-
}
|
|
31
|
-
// Built-in models when neither a phase override nor a provider preference is
|
|
32
|
-
// set. The values are the agent CLIs' own model identifiers.
|
|
33
|
-
const DEFAULT_MODELS = {
|
|
34
|
-
claude: DEFAULT_CLAUDE_MODEL,
|
|
35
|
-
codex: undefined,
|
|
36
|
-
};
|
|
37
|
-
export function defaultModelFor(agent) {
|
|
38
|
-
return DEFAULT_MODELS[agent];
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* Resolve the model for a phase. A user override for that exact phase wins
|
|
42
|
-
* (including an empty string, read as "use the agent default"); otherwise the
|
|
43
|
-
* provider preference; otherwise the built-in model; otherwise undefined →
|
|
44
|
-
* the agent's own model.
|
|
45
|
-
*/
|
|
46
|
-
export function modelForPhase(agent, phaseId, overrides, providerModel) {
|
|
47
|
-
return resolveModelForPhase(agent, phaseId, overrides, providerModel).model;
|
|
48
|
-
}
|
|
49
|
-
export function resolveModelForPhase(agent, phaseId, overrides, providerModel) {
|
|
50
|
-
if (overrides && Object.prototype.hasOwnProperty.call(overrides, phaseId)) {
|
|
51
|
-
return { model: overrides[phaseId] || undefined, source: "phase" };
|
|
52
|
-
}
|
|
53
|
-
if (providerModel?.trim()) {
|
|
54
|
-
return { model: providerModel.trim(), source: "provider" };
|
|
55
|
-
}
|
|
56
|
-
const builtin = defaultModelFor(agent);
|
|
57
|
-
if (builtin)
|
|
58
|
-
return { model: builtin, source: "builtin" };
|
|
59
|
-
return { model: undefined, source: "default" };
|
|
60
|
-
}
|
|
61
|
-
/** Resolve the complete provider invocation profile for one Liner AI task. */
|
|
62
|
-
export function resolveRunProfile(agent, taskId, overrides, preference) {
|
|
63
|
-
const providerModel = preference?.model?.trim() || undefined;
|
|
64
|
-
const autoActive = agent === "codex" && !providerModel && preference?.modelMode !== "default";
|
|
65
|
-
let model;
|
|
66
|
-
let modelSource = "default";
|
|
67
|
-
if (Object.prototype.hasOwnProperty.call(overrides || {}, taskId)) {
|
|
68
|
-
model = overrides?.[taskId] || undefined;
|
|
69
|
-
modelSource = "phase";
|
|
70
|
-
}
|
|
71
|
-
else if (providerModel) {
|
|
72
|
-
model = providerModel;
|
|
73
|
-
modelSource = "provider";
|
|
74
|
-
}
|
|
75
|
-
else if (autoActive) {
|
|
76
|
-
model = AUTO_OPENAI_MODEL;
|
|
77
|
-
modelSource = "auto";
|
|
78
|
-
}
|
|
79
|
-
else {
|
|
80
|
-
const builtin = defaultModelFor(agent);
|
|
81
|
-
if (builtin) {
|
|
82
|
-
model = builtin;
|
|
83
|
-
modelSource = "builtin";
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
const providerEffort = preference?.reasoningEffort?.trim() || undefined;
|
|
87
|
-
if (providerEffort) {
|
|
88
|
-
return { model, reasoningEffort: providerEffort, modelSource, effortSource: "provider" };
|
|
89
|
-
}
|
|
90
|
-
if (agent === "claude") {
|
|
91
|
-
return { model, reasoningEffort: DEFAULT_CLAUDE_EFFORT, modelSource, effortSource: "auto" };
|
|
92
|
-
}
|
|
93
|
-
if (autoActive) {
|
|
94
|
-
return { model, reasoningEffort: AUTO_OPENAI_EFFORT, modelSource, effortSource: "auto" };
|
|
95
|
-
}
|
|
96
|
-
return { model, reasoningEffort: undefined, modelSource, effortSource: "default" };
|
|
97
|
-
}
|
|
98
|
-
//# sourceMappingURL=models.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/agents/models.ts"],"names":[],"mappings":"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"}
|
package/dist/agents/parsers.js
DELETED
|
@@ -1,316 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Parse a single newline-delimited JSON line into zero or more normalized events.
|
|
3
|
-
*
|
|
4
|
-
* Both Claude's stream-json and Codex's --json emit one JSON object per line.
|
|
5
|
-
* Each object can produce multiple AgentEvents (an assistant message with
|
|
6
|
-
* mixed text + tool_use content blocks becomes one `text` + one or more
|
|
7
|
-
* `tool_start` events).
|
|
8
|
-
*/
|
|
9
|
-
export function parseLine(agent, line) {
|
|
10
|
-
const trimmed = line.trim();
|
|
11
|
-
if (!trimmed)
|
|
12
|
-
return [];
|
|
13
|
-
let obj;
|
|
14
|
-
try {
|
|
15
|
-
obj = JSON.parse(trimmed);
|
|
16
|
-
}
|
|
17
|
-
catch {
|
|
18
|
-
return [{ kind: "raw", text: trimmed }];
|
|
19
|
-
}
|
|
20
|
-
if (agent === "claude")
|
|
21
|
-
return parseClaudeObject(obj);
|
|
22
|
-
if (agent === "codex")
|
|
23
|
-
return parseCodexObject(obj);
|
|
24
|
-
return [{ kind: "raw", text: trimmed }];
|
|
25
|
-
}
|
|
26
|
-
// ---------------------------------------------------------------------------
|
|
27
|
-
// Claude stream-json
|
|
28
|
-
// ---------------------------------------------------------------------------
|
|
29
|
-
//
|
|
30
|
-
// Observed shapes (from `claude -p --output-format stream-json --verbose`):
|
|
31
|
-
//
|
|
32
|
-
// { type: "system", subtype: "init", model, session_id, tools, ... }
|
|
33
|
-
// { type: "assistant", message: { content: [{type:"text"|"tool_use",...}], ... } }
|
|
34
|
-
// { type: "user", message: { content: [{type:"tool_result", tool_use_id, content, is_error}] } }
|
|
35
|
-
// { type: "rate_limit_event", rate_limit_info: { status, ... } }
|
|
36
|
-
// { type: "result", subtype: "success"|"error", duration_ms, num_turns, result, total_cost_usd, is_error }
|
|
37
|
-
function parseClaudeObject(obj) {
|
|
38
|
-
if (!obj || typeof obj !== "object")
|
|
39
|
-
return [];
|
|
40
|
-
const o = obj;
|
|
41
|
-
const type = String(o["type"] ?? "");
|
|
42
|
-
if (type === "system" && o["subtype"] === "init") {
|
|
43
|
-
return [
|
|
44
|
-
{
|
|
45
|
-
kind: "init",
|
|
46
|
-
model: typeof o["model"] === "string" ? o["model"] : undefined,
|
|
47
|
-
sessionId: typeof o["session_id"] === "string"
|
|
48
|
-
? o["session_id"]
|
|
49
|
-
: undefined,
|
|
50
|
-
},
|
|
51
|
-
];
|
|
52
|
-
}
|
|
53
|
-
if (type === "assistant") {
|
|
54
|
-
const message = (o["message"] ?? {});
|
|
55
|
-
const content = Array.isArray(message["content"]) ? message["content"] : [];
|
|
56
|
-
const out = [];
|
|
57
|
-
for (const block of content) {
|
|
58
|
-
const b = (block ?? {});
|
|
59
|
-
const blockType = String(b["type"] ?? "");
|
|
60
|
-
if (blockType === "text") {
|
|
61
|
-
const text = String(b["text"] ?? "");
|
|
62
|
-
if (text)
|
|
63
|
-
out.push({ kind: "text", text });
|
|
64
|
-
}
|
|
65
|
-
else if (blockType === "tool_use") {
|
|
66
|
-
out.push({
|
|
67
|
-
kind: "tool_start",
|
|
68
|
-
id: String(b["id"] ?? ""),
|
|
69
|
-
name: String(b["name"] ?? ""),
|
|
70
|
-
input: b["input"] ?? null,
|
|
71
|
-
});
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
// Claude emits per-turn usage on every assistant message. Treat it as an
|
|
75
|
-
// incremental tokens event so the UI can accumulate a live counter.
|
|
76
|
-
const usage = (message["usage"] ?? {});
|
|
77
|
-
if (usage && Object.keys(usage).length > 0) {
|
|
78
|
-
out.push({
|
|
79
|
-
kind: "tokens",
|
|
80
|
-
inputTokens: numericOrZero(usage["input_tokens"]),
|
|
81
|
-
outputTokens: numericOrZero(usage["output_tokens"]),
|
|
82
|
-
cacheReadTokens: numericOrZero(usage["cache_read_input_tokens"]),
|
|
83
|
-
cacheCreationTokens: numericOrZero(usage["cache_creation_input_tokens"]),
|
|
84
|
-
});
|
|
85
|
-
}
|
|
86
|
-
return out;
|
|
87
|
-
}
|
|
88
|
-
if (type === "user") {
|
|
89
|
-
const message = (o["message"] ?? {});
|
|
90
|
-
const content = Array.isArray(message["content"]) ? message["content"] : [];
|
|
91
|
-
const out = [];
|
|
92
|
-
for (const block of content) {
|
|
93
|
-
const b = (block ?? {});
|
|
94
|
-
if (b["type"] !== "tool_result")
|
|
95
|
-
continue;
|
|
96
|
-
const id = String(b["tool_use_id"] ?? "");
|
|
97
|
-
const isError = Boolean(b["is_error"]);
|
|
98
|
-
out.push({
|
|
99
|
-
kind: "tool_done",
|
|
100
|
-
id,
|
|
101
|
-
ok: !isError,
|
|
102
|
-
preview: extractToolResultPreview(b["content"]),
|
|
103
|
-
});
|
|
104
|
-
}
|
|
105
|
-
return out;
|
|
106
|
-
}
|
|
107
|
-
if (type === "rate_limit_event") {
|
|
108
|
-
const info = (o["rate_limit_info"] ?? {});
|
|
109
|
-
return [{ kind: "rate_limit", status: String(info["status"] ?? "rate_limited") }];
|
|
110
|
-
}
|
|
111
|
-
if (type === "result") {
|
|
112
|
-
const isError = Boolean(o["is_error"]);
|
|
113
|
-
return [
|
|
114
|
-
{
|
|
115
|
-
kind: "summary",
|
|
116
|
-
ok: !isError,
|
|
117
|
-
durationMs: typeof o["duration_ms"] === "number" ? o["duration_ms"] : undefined,
|
|
118
|
-
costUsd: typeof o["total_cost_usd"] === "number"
|
|
119
|
-
? o["total_cost_usd"]
|
|
120
|
-
: undefined,
|
|
121
|
-
turns: typeof o["num_turns"] === "number" ? o["num_turns"] : undefined,
|
|
122
|
-
finalText: typeof o["result"] === "string" ? o["result"] : undefined,
|
|
123
|
-
},
|
|
124
|
-
];
|
|
125
|
-
}
|
|
126
|
-
return [{ kind: "raw", text: JSON.stringify(o) }];
|
|
127
|
-
}
|
|
128
|
-
/** Max chars retained for a tool result preview. Long enough to carry the
|
|
129
|
-
* page title + a few lines of context for a fetched URL; short enough that
|
|
130
|
-
* storing it for every tool call doesn't bloat memory.
|
|
131
|
-
*/
|
|
132
|
-
const RESULT_PREVIEW_MAX = 600;
|
|
133
|
-
function extractToolResultPreview(content) {
|
|
134
|
-
let text;
|
|
135
|
-
if (typeof content === "string")
|
|
136
|
-
text = content;
|
|
137
|
-
else if (Array.isArray(content)) {
|
|
138
|
-
// Claude's tool_result content is either a string (legacy) or an array of
|
|
139
|
-
// {type:"text",text:...} blocks. Concatenate text blocks so multi-block
|
|
140
|
-
// results (rare) still surface a useful preview.
|
|
141
|
-
const texts = [];
|
|
142
|
-
for (const block of content) {
|
|
143
|
-
const b = (block ?? {});
|
|
144
|
-
if (b["type"] === "text" && typeof b["text"] === "string") {
|
|
145
|
-
texts.push(b["text"]);
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
text = texts.join("\n");
|
|
149
|
-
}
|
|
150
|
-
if (!text)
|
|
151
|
-
return undefined;
|
|
152
|
-
// Keep newlines so the UI's detail panel can render multi-line previews.
|
|
153
|
-
// The PhaseRunner row display extracts the first line for the single-line
|
|
154
|
-
// table view.
|
|
155
|
-
return text.trim().slice(0, RESULT_PREVIEW_MAX);
|
|
156
|
-
}
|
|
157
|
-
function numericOrZero(v) {
|
|
158
|
-
return typeof v === "number" && Number.isFinite(v) ? v : 0;
|
|
159
|
-
}
|
|
160
|
-
function firstLine(s) {
|
|
161
|
-
const trimmed = s.trim();
|
|
162
|
-
const nl = trimmed.indexOf("\n");
|
|
163
|
-
return nl < 0 ? trimmed : trimmed.slice(0, nl);
|
|
164
|
-
}
|
|
165
|
-
// ---------------------------------------------------------------------------
|
|
166
|
-
// Codex --json
|
|
167
|
-
// ---------------------------------------------------------------------------
|
|
168
|
-
//
|
|
169
|
-
// Observed shapes (from `codex exec --json -`):
|
|
170
|
-
//
|
|
171
|
-
// { type: "thread.started", thread_id }
|
|
172
|
-
// { type: "turn.started" }
|
|
173
|
-
// { type: "item.started", item: { id, type: "agent_message"|"tool_call"|..., ... } }
|
|
174
|
-
// { type: "item.completed", item: { id, type, ... } }
|
|
175
|
-
// { type: "turn.completed", usage: {...} }
|
|
176
|
-
//
|
|
177
|
-
// Codex's item.type for tool invocations varies by Codex version; we treat any
|
|
178
|
-
// non-agent_message item that has an `id` and `name` (or `command`) as a tool.
|
|
179
|
-
/**
|
|
180
|
-
* Reshape a Codex `item` into the (name, input) pair the rest of the TUI
|
|
181
|
-
* expects. Centralizes the per-item-type translation so the parser stays a
|
|
182
|
-
* thin dispatcher and the detail panel doesn't have to know about Codex's
|
|
183
|
-
* field names.
|
|
184
|
-
*
|
|
185
|
-
* For `command_execution` specifically: the name becomes "bash" (short,
|
|
186
|
-
* fits the row chip) and the command goes into `{ command }` so
|
|
187
|
-
* `formatInputDetail` renders it via its existing "command: …" branch.
|
|
188
|
-
* Without this the tool name was the full shell command — useless for
|
|
189
|
-
* scanning the list — and the input was a plain string, which the formatter
|
|
190
|
-
* skipped entirely.
|
|
191
|
-
*/
|
|
192
|
-
function normalizeCodexToolInput(item, itemType) {
|
|
193
|
-
if (itemType === "command_execution") {
|
|
194
|
-
const command = typeof item["command"] === "string" ? item["command"] : "";
|
|
195
|
-
return { name: "bash", input: command ? { command } : null };
|
|
196
|
-
}
|
|
197
|
-
// Generic fallback for other item types Codex emits — preserve whatever
|
|
198
|
-
// name/input fields are present so we don't lose information.
|
|
199
|
-
const name = String(item["name"] ?? itemType);
|
|
200
|
-
const input = item["input"] != null
|
|
201
|
-
? item["input"]
|
|
202
|
-
: typeof item["command"] === "string"
|
|
203
|
-
? { command: item["command"] }
|
|
204
|
-
: null;
|
|
205
|
-
return { name, input };
|
|
206
|
-
}
|
|
207
|
-
function parseCodexObject(obj) {
|
|
208
|
-
if (!obj || typeof obj !== "object")
|
|
209
|
-
return [];
|
|
210
|
-
const o = obj;
|
|
211
|
-
const type = String(o["type"] ?? "");
|
|
212
|
-
if (type === "thread.started") {
|
|
213
|
-
return [
|
|
214
|
-
{
|
|
215
|
-
kind: "init",
|
|
216
|
-
sessionId: typeof o["thread_id"] === "string" ? o["thread_id"] : undefined,
|
|
217
|
-
},
|
|
218
|
-
];
|
|
219
|
-
}
|
|
220
|
-
if (type === "turn.started")
|
|
221
|
-
return [];
|
|
222
|
-
if (type === "item.started") {
|
|
223
|
-
const item = (o["item"] ?? {});
|
|
224
|
-
const itemType = String(item["type"] ?? "");
|
|
225
|
-
if (itemType === "agent_message")
|
|
226
|
-
return [];
|
|
227
|
-
const { name, input } = normalizeCodexToolInput(item, itemType);
|
|
228
|
-
return [
|
|
229
|
-
{
|
|
230
|
-
kind: "tool_start",
|
|
231
|
-
id: String(item["id"] ?? ""),
|
|
232
|
-
name,
|
|
233
|
-
input,
|
|
234
|
-
},
|
|
235
|
-
];
|
|
236
|
-
}
|
|
237
|
-
if (type === "item.completed") {
|
|
238
|
-
const item = (o["item"] ?? {});
|
|
239
|
-
const itemType = String(item["type"] ?? "");
|
|
240
|
-
if (itemType === "agent_message") {
|
|
241
|
-
const text = String(item["text"] ?? "");
|
|
242
|
-
if (!text)
|
|
243
|
-
return [];
|
|
244
|
-
return [{ kind: "text", text }];
|
|
245
|
-
}
|
|
246
|
-
// Tool result.
|
|
247
|
-
const id = String(item["id"] ?? "");
|
|
248
|
-
// Codex marks the process "completed" even when the underlying command
|
|
249
|
-
// exited non-zero — so we also have to consult exit_code. Without this
|
|
250
|
-
// the UI showed "failed without an error message" for half of the calls
|
|
251
|
-
// (parser said ok, but resultPreview was empty because we were reading
|
|
252
|
-
// the wrong output field too).
|
|
253
|
-
const statusLower = String(item["status"] ?? "").toLowerCase();
|
|
254
|
-
const exitCode = item["exit_code"];
|
|
255
|
-
const isError = Boolean(item["is_error"]) ||
|
|
256
|
-
statusLower === "error" ||
|
|
257
|
-
statusLower === "failed" ||
|
|
258
|
-
(typeof exitCode === "number" && exitCode !== 0);
|
|
259
|
-
// Codex's command_execution puts the captured stdout/stderr in
|
|
260
|
-
// `aggregated_output`. Other (future) item types may use `output`;
|
|
261
|
-
// fall back to that for forward-compat.
|
|
262
|
-
const rawOutput = typeof item["aggregated_output"] === "string"
|
|
263
|
-
? item["aggregated_output"]
|
|
264
|
-
: typeof item["output"] === "string"
|
|
265
|
-
? item["output"]
|
|
266
|
-
: "";
|
|
267
|
-
return [
|
|
268
|
-
{
|
|
269
|
-
kind: "tool_done",
|
|
270
|
-
id,
|
|
271
|
-
ok: !isError,
|
|
272
|
-
preview: rawOutput ? rawOutput.trim().slice(0, RESULT_PREVIEW_MAX) : undefined,
|
|
273
|
-
},
|
|
274
|
-
];
|
|
275
|
-
}
|
|
276
|
-
if (type === "turn.completed") {
|
|
277
|
-
const usage = (o["usage"] ?? {});
|
|
278
|
-
const out = [];
|
|
279
|
-
if (usage && Object.keys(usage).length > 0) {
|
|
280
|
-
out.push({
|
|
281
|
-
kind: "tokens",
|
|
282
|
-
inputTokens: numericOrZero(usage["input_tokens"]),
|
|
283
|
-
outputTokens: numericOrZero(usage["output_tokens"]),
|
|
284
|
-
cacheReadTokens: numericOrZero(usage["cached_input_tokens"]),
|
|
285
|
-
cacheCreationTokens: 0,
|
|
286
|
-
});
|
|
287
|
-
}
|
|
288
|
-
out.push({
|
|
289
|
-
kind: "summary",
|
|
290
|
-
ok: true,
|
|
291
|
-
turns: typeof usage["turns"] === "number" ? usage["turns"] : undefined,
|
|
292
|
-
});
|
|
293
|
-
return out;
|
|
294
|
-
}
|
|
295
|
-
return [{ kind: "raw", text: JSON.stringify(o) }];
|
|
296
|
-
}
|
|
297
|
-
// ---------------------------------------------------------------------------
|
|
298
|
-
// Line buffering — chunks from a child's stdout may split a JSON line.
|
|
299
|
-
// ---------------------------------------------------------------------------
|
|
300
|
-
export class LineBuffer {
|
|
301
|
-
remainder = "";
|
|
302
|
-
push(chunk) {
|
|
303
|
-
const combined = this.remainder + chunk;
|
|
304
|
-
const lines = combined.split("\n");
|
|
305
|
-
// The last element is whatever came after the final \n (could be empty).
|
|
306
|
-
// Hold it for the next push so we don't try to parse a partial JSON line.
|
|
307
|
-
this.remainder = lines.pop() ?? "";
|
|
308
|
-
return lines;
|
|
309
|
-
}
|
|
310
|
-
flush() {
|
|
311
|
-
const out = this.remainder ? [this.remainder] : [];
|
|
312
|
-
this.remainder = "";
|
|
313
|
-
return out;
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
|
-
//# sourceMappingURL=parsers.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"parsers.js","sourceRoot":"","sources":["../../src/agents/parsers.ts"],"names":[],"mappings":"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"}
|