linersh 0.5.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/README.md +168 -0
- package/bin/liner.js +126 -0
- package/dist/App.js +195 -0
- package/dist/App.js.map +1 -0
- package/dist/agents/detect.js +102 -0
- package/dist/agents/detect.js.map +1 -0
- package/dist/agents/events.js +8 -0
- package/dist/agents/events.js.map +1 -0
- package/dist/agents/jtbd-clarify.js +144 -0
- package/dist/agents/jtbd-clarify.js.map +1 -0
- package/dist/agents/parsers.js +316 -0
- package/dist/agents/parsers.js.map +1 -0
- package/dist/agents/prompts.js +301 -0
- package/dist/agents/prompts.js.map +1 -0
- package/dist/agents/run-log.js +71 -0
- package/dist/agents/run-log.js.map +1 -0
- package/dist/agents/runner.js +180 -0
- package/dist/agents/runner.js.map +1 -0
- package/dist/agents/types.js +2 -0
- package/dist/agents/types.js.map +1 -0
- package/dist/bin-resolver.js +92 -0
- package/dist/bin-resolver.js.map +1 -0
- package/dist/browser-support.js +62 -0
- package/dist/browser-support.js.map +1 -0
- package/dist/colors.js +105 -0
- package/dist/colors.js.map +1 -0
- package/dist/components/Header.js +17 -0
- package/dist/components/Header.js.map +1 -0
- package/dist/components/KeyHints.js +10 -0
- package/dist/components/KeyHints.js.map +1 -0
- package/dist/components/LabeledBox.js +53 -0
- package/dist/components/LabeledBox.js.map +1 -0
- package/dist/components/NextSteps.js +18 -0
- package/dist/components/NextSteps.js.map +1 -0
- package/dist/config.js +88 -0
- package/dist/config.js.map +1 -0
- package/dist/editor.js +40 -0
- package/dist/editor.js.map +1 -0
- package/dist/gates.js +121 -0
- package/dist/gates.js.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/ipc.js +136 -0
- package/dist/ipc.js.map +1 -0
- package/dist/phases.js +348 -0
- package/dist/phases.js.map +1 -0
- package/dist/progress.js +185 -0
- package/dist/progress.js.map +1 -0
- package/dist/screens/AgentSetup.js +217 -0
- package/dist/screens/AgentSetup.js.map +1 -0
- package/dist/screens/BootSplash.js +159 -0
- package/dist/screens/BootSplash.js.map +1 -0
- package/dist/screens/BrowserSetup.js +181 -0
- package/dist/screens/BrowserSetup.js.map +1 -0
- package/dist/screens/CompileView.js +297 -0
- package/dist/screens/CompileView.js.map +1 -0
- package/dist/screens/FramingConfirmReview.js +193 -0
- package/dist/screens/FramingConfirmReview.js.map +1 -0
- package/dist/screens/Gate1Review.js +143 -0
- package/dist/screens/Gate1Review.js.map +1 -0
- package/dist/screens/Gate2Review.js +158 -0
- package/dist/screens/Gate2Review.js.map +1 -0
- package/dist/screens/ImportPrompt.js +65 -0
- package/dist/screens/ImportPrompt.js.map +1 -0
- package/dist/screens/LocalFilePicker.js +139 -0
- package/dist/screens/LocalFilePicker.js.map +1 -0
- package/dist/screens/NewMixtapeWizard.js +662 -0
- package/dist/screens/NewMixtapeWizard.js.map +1 -0
- package/dist/screens/NewProjectPrompt.js +66 -0
- package/dist/screens/NewProjectPrompt.js.map +1 -0
- package/dist/screens/PhaseRunner.js +1119 -0
- package/dist/screens/PhaseRunner.js.map +1 -0
- package/dist/screens/ProcessManifest.js +158 -0
- package/dist/screens/ProcessManifest.js.map +1 -0
- package/dist/screens/ProjectHub.js +546 -0
- package/dist/screens/ProjectHub.js.map +1 -0
- package/dist/screens/Settings.js +72 -0
- package/dist/screens/Settings.js.map +1 -0
- package/dist/screens/SourceModal.js +269 -0
- package/dist/screens/SourceModal.js.map +1 -0
- package/dist/screens/TapeBrowser.js +277 -0
- package/dist/screens/TapeBrowser.js.map +1 -0
- package/dist/screens/TapeDraftReview.js +440 -0
- package/dist/screens/TapeDraftReview.js.map +1 -0
- package/dist/screens/TapeEditor.js +310 -0
- package/dist/screens/TapeEditor.js.map +1 -0
- package/dist/screens/cassette-art.js +72 -0
- package/dist/screens/cassette-art.js.map +1 -0
- package/dist/store.js +10 -0
- package/dist/store.js.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/yaml-io.js +345 -0
- package/dist/yaml-io.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
// JTBD elicitation — generate 3-4 clarifying questions targeted at the
|
|
2
|
+
// user's just-typed JTBD, so the downstream curation has a sharper input.
|
|
3
|
+
//
|
|
4
|
+
// Runs as a side task at wizard time, not as a methodology phase. The agent
|
|
5
|
+
// answers in JSON; we accumulate streamed text and parse once the run
|
|
6
|
+
// completes. If anything goes wrong (no agent installed, agent crashed,
|
|
7
|
+
// response can't be parsed) the wizard falls back to the hardcoded questions
|
|
8
|
+
// below — they're the same canonical set the recommendation system uses when
|
|
9
|
+
// the agent path is unavailable. Better to ask predictable questions than
|
|
10
|
+
// to skip the step entirely.
|
|
11
|
+
import { runAgentTask } from "./runner.js";
|
|
12
|
+
/**
|
|
13
|
+
* Canonical fallback questions when the agent path is unavailable or fails.
|
|
14
|
+
* Designed to cover the four axes the recommendation in the plan called out:
|
|
15
|
+
* 1. Scope splits (the "and"/"or" boundary problem)
|
|
16
|
+
* 2. Output kinds expected
|
|
17
|
+
* 3. Quality anchors the curator can name
|
|
18
|
+
* 4. Audience / autonomy mode
|
|
19
|
+
*/
|
|
20
|
+
export const HARDCODED_QUESTIONS = [
|
|
21
|
+
"If your JTBD names multiple domains (e.g. X and Y), are they equally weighted, or is one primary?",
|
|
22
|
+
"What specific kinds of output should this mixtape help produce — flag descriptions, errors, help text, longer docs, all of the above?",
|
|
23
|
+
"Name 1–2 tools, projects, or authors whose work in this domain you admire. These become quality anchors for source discovery.",
|
|
24
|
+
"Is this corpus for an AI assisting you interactively, or for an AI working autonomously?",
|
|
25
|
+
];
|
|
26
|
+
/**
|
|
27
|
+
* Generate clarifying questions for a raw JTBD. Returns the agent's
|
|
28
|
+
* questions on success, or the hardcoded baseline if anything prevents a
|
|
29
|
+
* clean agent answer. Never throws — failure modes degrade to fallback.
|
|
30
|
+
*/
|
|
31
|
+
export async function elicitClarifyingQuestions(args) {
|
|
32
|
+
if (!args.agent || !args.skillPath) {
|
|
33
|
+
return [...HARDCODED_QUESTIONS];
|
|
34
|
+
}
|
|
35
|
+
const prompt = buildPrompt(args.jtbd);
|
|
36
|
+
// Accumulate every text + tool-result event into one buffer; the response
|
|
37
|
+
// will be in there somewhere. The agent's `summary.finalText` lands at the
|
|
38
|
+
// end and is usually the cleanest source of the JSON.
|
|
39
|
+
let finalText = "";
|
|
40
|
+
const textChunks = [];
|
|
41
|
+
const handle = runAgentTask({
|
|
42
|
+
agent: args.agent,
|
|
43
|
+
project: args.cwd,
|
|
44
|
+
skillPath: args.skillPath,
|
|
45
|
+
prompt,
|
|
46
|
+
taskLabel: "jtbd-clarify",
|
|
47
|
+
onEvent: (event) => {
|
|
48
|
+
if (event.kind === "text") {
|
|
49
|
+
textChunks.push(event.text);
|
|
50
|
+
}
|
|
51
|
+
else if (event.kind === "summary" && event.finalText) {
|
|
52
|
+
finalText = event.finalText;
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
});
|
|
56
|
+
const timeoutMs = args.timeoutMs ?? 60_000;
|
|
57
|
+
let timedOut = false;
|
|
58
|
+
const timeout = setTimeout(() => {
|
|
59
|
+
timedOut = true;
|
|
60
|
+
handle.cancel();
|
|
61
|
+
}, timeoutMs);
|
|
62
|
+
try {
|
|
63
|
+
const { code } = await handle.done;
|
|
64
|
+
clearTimeout(timeout);
|
|
65
|
+
if (timedOut || code !== 0) {
|
|
66
|
+
return [...HARDCODED_QUESTIONS];
|
|
67
|
+
}
|
|
68
|
+
const body = finalText || textChunks.join("\n");
|
|
69
|
+
const questions = parseQuestions(body);
|
|
70
|
+
if (questions.length === 0) {
|
|
71
|
+
return [...HARDCODED_QUESTIONS];
|
|
72
|
+
}
|
|
73
|
+
// Clamp to a sane range: at least 2, at most 6. The wizard step renders
|
|
74
|
+
// them one at a time, so very long question lists fatigue the user.
|
|
75
|
+
return questions.slice(0, 6);
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
clearTimeout(timeout);
|
|
79
|
+
return [...HARDCODED_QUESTIONS];
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
function buildPrompt(jtbd) {
|
|
83
|
+
return `You are helping a curator sharpen a just-typed JTBD for an AI-curated mixtape.
|
|
84
|
+
|
|
85
|
+
# The JTBD
|
|
86
|
+
${jtbd}
|
|
87
|
+
|
|
88
|
+
# Your task
|
|
89
|
+
|
|
90
|
+
Generate 3-4 targeted questions whose answers will make the downstream curation produce a sharper corpus. Cover the following four axes — one question per axis, in order:
|
|
91
|
+
|
|
92
|
+
1. **Scope splits** the user named ("and"/"or" boundaries). If the JTBD names two domains, ask whether they're equally weighted.
|
|
93
|
+
2. **Output kinds** — what specific things will this mixtape help produce (e.g. flag descriptions, errors, designs, prose, etc.)? Force a concrete answer.
|
|
94
|
+
3. **Quality anchors** — name 1-2 tools/projects/authors whose work in this domain the curator admires. These anchor source discovery.
|
|
95
|
+
4. **Audience / autonomy** — is the corpus for an AI assisting interactively, or for an AI working autonomously?
|
|
96
|
+
|
|
97
|
+
If the JTBD doesn't have a scope split (axis 1), ask a different sharpening question instead — something about the JTBD's most ambiguous word or phrase.
|
|
98
|
+
|
|
99
|
+
# Output format (strict)
|
|
100
|
+
|
|
101
|
+
Respond with ONLY a JSON array of strings, each string being one question. No prose before or after. No markdown code fences. Example:
|
|
102
|
+
|
|
103
|
+
["First question?", "Second question?", "Third question?"]
|
|
104
|
+
|
|
105
|
+
Do not use any tools. Do not write to disk. Just output the JSON array.`;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Extract a JSON array of question strings from the agent's response body.
|
|
109
|
+
* Permissive — accepts the array nested in a code fence, surrounded by
|
|
110
|
+
* prose, or as a top-level value. Returns an empty array on any failure.
|
|
111
|
+
*/
|
|
112
|
+
function parseQuestions(body) {
|
|
113
|
+
if (!body)
|
|
114
|
+
return [];
|
|
115
|
+
// Strip common code-fence wrappers first.
|
|
116
|
+
const fenceMatch = body.match(/```(?:json)?\s*([\s\S]*?)```/);
|
|
117
|
+
const candidate = fenceMatch ? fenceMatch[1] : body;
|
|
118
|
+
// Find the first [ ... ] that parses cleanly as an array.
|
|
119
|
+
const arrayMatch = candidate.match(/\[\s*(?:[\s\S]*?)\s*\]/);
|
|
120
|
+
const json = arrayMatch ? arrayMatch[0] : candidate.trim();
|
|
121
|
+
let parsed;
|
|
122
|
+
try {
|
|
123
|
+
parsed = JSON.parse(json);
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
return [];
|
|
127
|
+
}
|
|
128
|
+
if (!Array.isArray(parsed))
|
|
129
|
+
return [];
|
|
130
|
+
const out = [];
|
|
131
|
+
for (const item of parsed) {
|
|
132
|
+
if (typeof item === "string" && item.trim()) {
|
|
133
|
+
out.push(item.trim());
|
|
134
|
+
}
|
|
135
|
+
else if (item && typeof item === "object" && "question" in item) {
|
|
136
|
+
// Accept {question: "..."} shape too — some agents like the structure.
|
|
137
|
+
const q = item["question"];
|
|
138
|
+
if (typeof q === "string" && q.trim())
|
|
139
|
+
out.push(q.trim());
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return out;
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=jtbd-clarify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jtbd-clarify.js","sourceRoot":"","sources":["../../src/agents/jtbd-clarify.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,316 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parsers.js","sourceRoot":"","sources":["../../src/agents/parsers.ts"],"names":[],"mappings":"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"}
|