@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.144",
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
- // Ignore: turn.started, turn.completed (usage stats)
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 (!["turn.started", "turn.completed"].includes(parsed.type)) {
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
- onComplete: async (claudeSessionId) => {
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);