@episoda/cli 0.2.144 → 0.2.146
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.
|
@@ -2913,7 +2913,7 @@ var require_package = __commonJS({
|
|
|
2913
2913
|
"package.json"(exports2, module2) {
|
|
2914
2914
|
module2.exports = {
|
|
2915
2915
|
name: "@episoda/cli",
|
|
2916
|
-
version: "0.2.
|
|
2916
|
+
version: "0.2.145",
|
|
2917
2917
|
description: "CLI tool for Episoda local development workflow orchestration",
|
|
2918
2918
|
main: "dist/index.js",
|
|
2919
2919
|
types: "dist/index.d.ts",
|
|
@@ -9842,6 +9842,10 @@ If changes are needed, explain what needs to be done.`;
|
|
|
9842
9842
|
});
|
|
9843
9843
|
let stdoutBuffer = "";
|
|
9844
9844
|
let extractedSessionId;
|
|
9845
|
+
let resultModel;
|
|
9846
|
+
let resultCostUsd;
|
|
9847
|
+
let resultUsage;
|
|
9848
|
+
let resultNumTurns;
|
|
9845
9849
|
let stdoutEventCount = 0;
|
|
9846
9850
|
let chunksSent = 0;
|
|
9847
9851
|
const streamStartTime = Date.now();
|
|
@@ -9876,6 +9880,18 @@ If changes are needed, explain what needs to be done.`;
|
|
|
9876
9880
|
} else if (parsed.item?.type === "reasoning" && parsed.item.summary) {
|
|
9877
9881
|
onChunk(`[Thinking: ${parsed.item.summary}]
|
|
9878
9882
|
`);
|
|
9883
|
+
} else if (parsed.item?.type === "contextCompaction" && options.onCompaction) {
|
|
9884
|
+
const compactionEvent = {
|
|
9885
|
+
seq: stdoutEventCount,
|
|
9886
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
9887
|
+
provider: "codex",
|
|
9888
|
+
type: "session.compaction",
|
|
9889
|
+
raw: parsed,
|
|
9890
|
+
trigger: "auto",
|
|
9891
|
+
summary: parsed.item.summary
|
|
9892
|
+
};
|
|
9893
|
+
console.log(`[AgentManager] EP1321: Codex compaction completed`);
|
|
9894
|
+
options.onCompaction(compactionEvent);
|
|
9879
9895
|
}
|
|
9880
9896
|
break;
|
|
9881
9897
|
case "item.failed":
|
|
@@ -9886,6 +9902,9 @@ If changes are needed, explain what needs to be done.`;
|
|
|
9886
9902
|
onError(parsed.message || parsed.error?.message || "Unknown error from Codex");
|
|
9887
9903
|
break;
|
|
9888
9904
|
case "item.started":
|
|
9905
|
+
if (parsed.item?.type === "contextCompaction") {
|
|
9906
|
+
console.log(`[AgentManager] EP1321: Codex compaction started`);
|
|
9907
|
+
}
|
|
9889
9908
|
if (parsed.item?.type === "command_execution" && options.onToolUse) {
|
|
9890
9909
|
const toolEvent = {
|
|
9891
9910
|
id: parsed.item.id || `codex-cmd-${Date.now()}`,
|
|
@@ -9897,9 +9916,23 @@ If changes are needed, explain what needs to be done.`;
|
|
|
9897
9916
|
options.onToolUse(toolEvent);
|
|
9898
9917
|
}
|
|
9899
9918
|
break;
|
|
9900
|
-
|
|
9919
|
+
case "turn.completed":
|
|
9920
|
+
if (parsed.usage) {
|
|
9921
|
+
const u = parsed.usage;
|
|
9922
|
+
const inputTokens = u.input_tokens ?? u.prompt_tokens ?? 0;
|
|
9923
|
+
const outputTokens = u.output_tokens ?? u.completion_tokens ?? 0;
|
|
9924
|
+
resultUsage = {
|
|
9925
|
+
inputTokens,
|
|
9926
|
+
outputTokens,
|
|
9927
|
+
totalTokens: inputTokens + outputTokens
|
|
9928
|
+
};
|
|
9929
|
+
}
|
|
9930
|
+
resultModel = parsed.model;
|
|
9931
|
+
resultNumTurns = typeof parsed.num_turns === "number" ? parsed.num_turns : void 0;
|
|
9932
|
+
break;
|
|
9933
|
+
// Ignore: turn.started
|
|
9901
9934
|
default:
|
|
9902
|
-
if (
|
|
9935
|
+
if (parsed.type !== "turn.started") {
|
|
9903
9936
|
console.log(`[AgentManager] Codex event: ${parsed.type}`);
|
|
9904
9937
|
}
|
|
9905
9938
|
}
|
|
@@ -9969,6 +10002,25 @@ If changes are needed, explain what needs to be done.`;
|
|
|
9969
10002
|
session.agentSessionId = extractedSessionId;
|
|
9970
10003
|
session.claudeSessionId = extractedSessionId;
|
|
9971
10004
|
}
|
|
10005
|
+
resultModel = parsed.model;
|
|
10006
|
+
if (typeof parsed.total_cost_usd === "number") {
|
|
10007
|
+
resultCostUsd = parsed.total_cost_usd;
|
|
10008
|
+
} else if (typeof parsed.cost_usd === "number") {
|
|
10009
|
+
resultCostUsd = parsed.cost_usd;
|
|
10010
|
+
}
|
|
10011
|
+
resultNumTurns = typeof parsed.num_turns === "number" ? parsed.num_turns : void 0;
|
|
10012
|
+
if (parsed.usage) {
|
|
10013
|
+
const u = parsed.usage;
|
|
10014
|
+
const inputTokens = u.input_tokens ?? u.prompt_tokens ?? 0;
|
|
10015
|
+
const outputTokens = u.output_tokens ?? u.completion_tokens ?? 0;
|
|
10016
|
+
resultUsage = {
|
|
10017
|
+
inputTokens,
|
|
10018
|
+
outputTokens,
|
|
10019
|
+
cacheReadTokens: u.cache_read_input_tokens ?? u.cache_read_tokens,
|
|
10020
|
+
cacheWriteTokens: u.cache_creation_input_tokens ?? u.cache_write_tokens,
|
|
10021
|
+
totalTokens: inputTokens + outputTokens
|
|
10022
|
+
};
|
|
10023
|
+
}
|
|
9972
10024
|
break;
|
|
9973
10025
|
case "system":
|
|
9974
10026
|
if (parsed.session_id) {
|
|
@@ -9976,6 +10028,20 @@ If changes are needed, explain what needs to be done.`;
|
|
|
9976
10028
|
session.agentSessionId = extractedSessionId;
|
|
9977
10029
|
session.claudeSessionId = extractedSessionId;
|
|
9978
10030
|
}
|
|
10031
|
+
if (parsed.subtype === "compact_boundary" && options.onCompaction) {
|
|
10032
|
+
const metadata = parsed.compactMetadata;
|
|
10033
|
+
const compactionEvent = {
|
|
10034
|
+
seq: stdoutEventCount,
|
|
10035
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
10036
|
+
provider: "claude",
|
|
10037
|
+
type: "session.compaction",
|
|
10038
|
+
raw: parsed,
|
|
10039
|
+
trigger: metadata?.trigger ?? "auto",
|
|
10040
|
+
preCompactionTokens: metadata?.preCompactTokenCount
|
|
10041
|
+
};
|
|
10042
|
+
console.log(`[AgentManager] EP1321: Claude compaction detected - trigger: ${compactionEvent.trigger}, tokens: ${compactionEvent.preCompactionTokens ?? "unknown"}`);
|
|
10043
|
+
options.onCompaction(compactionEvent);
|
|
10044
|
+
}
|
|
9979
10045
|
break;
|
|
9980
10046
|
case "error":
|
|
9981
10047
|
onError(parsed.error?.message || parsed.message || "Unknown error from Claude Code");
|
|
@@ -10011,12 +10077,13 @@ If changes are needed, explain what needs to be done.`;
|
|
|
10011
10077
|
}
|
|
10012
10078
|
})();
|
|
10013
10079
|
}
|
|
10080
|
+
const resultMeta = resultModel || resultCostUsd !== void 0 || resultUsage ? { model: resultModel, costUsd: resultCostUsd, durationMs: duration, numTurns: resultNumTurns, usage: resultUsage } : void 0;
|
|
10014
10081
|
if (code === 0) {
|
|
10015
10082
|
session.status = "stopped";
|
|
10016
|
-
onComplete(extractedSessionId || session.agentSessionId || session.claudeSessionId);
|
|
10083
|
+
onComplete(extractedSessionId || session.agentSessionId || session.claudeSessionId, resultMeta);
|
|
10017
10084
|
} else if (signal === "SIGINT") {
|
|
10018
10085
|
session.status = "stopped";
|
|
10019
|
-
onComplete(extractedSessionId || session.agentSessionId || session.claudeSessionId);
|
|
10086
|
+
onComplete(extractedSessionId || session.agentSessionId || session.claudeSessionId, resultMeta);
|
|
10020
10087
|
} else {
|
|
10021
10088
|
session.status = "error";
|
|
10022
10089
|
const errorMsg = stderrBuffer.trim() || `Process exited with code ${code}`;
|
|
@@ -11987,7 +12054,25 @@ var Daemon = class _Daemon {
|
|
|
11987
12054
|
console.error(`[Daemon] EP1311: Failed to send tool_result (WebSocket may be disconnected):`, sendError);
|
|
11988
12055
|
}
|
|
11989
12056
|
},
|
|
11990
|
-
|
|
12057
|
+
// EP1321: Forward compaction events for UI visibility
|
|
12058
|
+
onCompaction: async (event) => {
|
|
12059
|
+
console.log(`[Daemon] EP1321: Forwarding compaction via WebSocket - trigger: ${event.trigger}`);
|
|
12060
|
+
try {
|
|
12061
|
+
await client.send({
|
|
12062
|
+
type: "agent_result",
|
|
12063
|
+
commandId,
|
|
12064
|
+
result: {
|
|
12065
|
+
success: true,
|
|
12066
|
+
status: "compaction",
|
|
12067
|
+
sessionId,
|
|
12068
|
+
compaction: event
|
|
12069
|
+
}
|
|
12070
|
+
});
|
|
12071
|
+
} catch (sendError) {
|
|
12072
|
+
console.error(`[Daemon] EP1321: Failed to send compaction (WebSocket may be disconnected):`, sendError);
|
|
12073
|
+
}
|
|
12074
|
+
},
|
|
12075
|
+
onComplete: async (claudeSessionId, resultMetadata) => {
|
|
11991
12076
|
const duration = Date.now() - daemonStreamStart;
|
|
11992
12077
|
console.log(`[Daemon] EP1191: Stream complete - ${daemonChunkCount} chunks, ${daemonToolUseCount} tool uses forwarded in ${duration}ms`);
|
|
11993
12078
|
commandQueue.complete(sessionId);
|
|
@@ -11995,7 +12080,7 @@ var Daemon = class _Daemon {
|
|
|
11995
12080
|
await client.send({
|
|
11996
12081
|
type: "agent_result",
|
|
11997
12082
|
commandId,
|
|
11998
|
-
result: { success: true, status: "complete", sessionId, claudeSessionId }
|
|
12083
|
+
result: { success: true, status: "complete", sessionId, claudeSessionId, resultMetadata }
|
|
11999
12084
|
});
|
|
12000
12085
|
} catch (sendError) {
|
|
12001
12086
|
console.error(`[Daemon] EP912: Failed to send complete (WebSocket may be disconnected):`, sendError);
|