@lesscap/baton-cli 0.7.10 → 0.7.11

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.
Files changed (2) hide show
  1. package/dist/baton.mjs +33 -6
  2. package/package.json +1 -1
package/dist/baton.mjs CHANGED
@@ -6706,9 +6706,23 @@ var startedMessageIds = (events) => {
6706
6706
  }
6707
6707
  return ids;
6708
6708
  };
6709
+ var messageLoopId = (event) => {
6710
+ if (event.type !== "user_message") return void 0;
6711
+ const id = event.payload?.loopId;
6712
+ return typeof id === "number" ? id : void 0;
6713
+ };
6709
6714
  var unstartedUserMessages = (events) => {
6710
6715
  const started = startedMessageIds(events);
6711
- return events.filter((e) => e.type === "user_message" && !started.has(e.id));
6716
+ const latest = /* @__PURE__ */ new Map();
6717
+ events.forEach((event) => {
6718
+ const loopId = messageLoopId(event);
6719
+ if (loopId !== void 0) latest.set(loopId, Math.max(latest.get(loopId) ?? -1, event.sequence));
6720
+ });
6721
+ return events.filter((event) => {
6722
+ if (event.type !== "user_message" || started.has(event.id)) return false;
6723
+ const loopId = messageLoopId(event);
6724
+ return loopId === void 0 || event.sequence === latest.get(loopId);
6725
+ });
6712
6726
  };
6713
6727
  var opensTurn = (e) => e.type === "user_message" || e.type === "turn_start";
6714
6728
  var closesTurn = (e) => e.type === "turn_complete" || e.type === "turn_error";
@@ -8628,16 +8642,27 @@ var runDaemon = async (config, deps, signal) => {
8628
8642
  log(`bin: ${claudeExecutable() ?? "(sdk bundled)"} cwd: ${config.worktreePath}`);
8629
8643
  log(`runtime env keys: ${maskedEnvKeys(deps.env)}`);
8630
8644
  const state = { seen: /* @__PURE__ */ new Set() };
8631
- const pendingQueue = [];
8645
+ let pendingQueue = [];
8646
+ const latestLoops = /* @__PURE__ */ new Map();
8632
8647
  let busy = false;
8633
8648
  let reconciling = false;
8634
8649
  let lastActivity = Date.now();
8635
8650
  let currentTurn;
8651
+ const trackLoopMessage = (event) => {
8652
+ const loopId = messageLoopId(event);
8653
+ if (loopId === void 0) return true;
8654
+ if (event.sequence < (latestLoops.get(loopId) ?? -1)) return false;
8655
+ latestLoops.set(loopId, event.sequence);
8656
+ pendingQueue = pendingQueue.filter(
8657
+ (queued) => messageLoopId(queued) !== loopId || queued.sequence >= event.sequence
8658
+ );
8659
+ return true;
8660
+ };
8636
8661
  const drain = async () => {
8637
- if (busy) return;
8662
+ if (busy || reconciling) return;
8638
8663
  busy = true;
8639
8664
  try {
8640
- while (pendingQueue.length > 0 && !signal.aborted) {
8665
+ while (pendingQueue.length > 0 && !signal.aborted && !reconciling) {
8641
8666
  const msg = pendingQueue.shift();
8642
8667
  if (!msg) break;
8643
8668
  const resuming = isAgentConversationResumable(config);
@@ -8673,10 +8698,11 @@ var runDaemon = async (config, deps, signal) => {
8673
8698
  reconciling = true;
8674
8699
  try {
8675
8700
  const events = await deps.worker.listEvents();
8701
+ events.forEach(trackLoopMessage);
8676
8702
  const pending = unstartedUserMessages(events);
8677
8703
  let added = 0;
8678
8704
  for (const ev of pending) {
8679
- if (state.seen.has(ev.sequence)) continue;
8705
+ if (state.seen.has(ev.sequence) || !trackLoopMessage(ev)) continue;
8680
8706
  state.seen.add(ev.sequence);
8681
8707
  pendingQueue.push(ev);
8682
8708
  added++;
@@ -8684,7 +8710,6 @@ var runDaemon = async (config, deps, signal) => {
8684
8710
  if (added > 0) {
8685
8711
  log(`reconciled ${added} queued message(s) from transcript`);
8686
8712
  lastActivity = Date.now();
8687
- void drain();
8688
8713
  } else if (pendingQueue.length === 0 && !busy && !currentTurn && isAgentWorking(events)) {
8689
8714
  await deps.worker.emitEvent("turn_error", {
8690
8715
  message: "turn abandoned \u2014 runner restarted",
@@ -8696,6 +8721,7 @@ var runDaemon = async (config, deps, signal) => {
8696
8721
  log(`reconcile failed: ${String(e)}`);
8697
8722
  } finally {
8698
8723
  reconciling = false;
8724
+ if (pendingQueue.length > 0) void drain();
8699
8725
  }
8700
8726
  };
8701
8727
  const es = subscribeStream(
@@ -8706,6 +8732,7 @@ var runDaemon = async (config, deps, signal) => {
8706
8732
  state.seen,
8707
8733
  log,
8708
8734
  (ev) => {
8735
+ if (!trackLoopMessage(ev)) return;
8709
8736
  lastActivity = Date.now();
8710
8737
  pendingQueue.push(ev);
8711
8738
  void drain();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lesscap/baton-cli",
3
- "version": "0.7.10",
3
+ "version": "0.7.11",
4
4
  "license": "MIT",
5
5
  "publishConfig": {
6
6
  "access": "public"