u-foo 2.3.9 → 2.3.10

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "u-foo",
3
- "version": "2.3.9",
3
+ "version": "2.3.10",
4
4
  "description": "Multi-Agent Workspace Protocol. Just add u. claude → uclaude, codex → ucodex.",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "homepage": "https://ufoo.dev",
@@ -9,6 +9,7 @@ const { ActivityDetector } = require("./activityDetector");
9
9
  const { createActivityStatePublisher } = require("./activityStatePublisher");
10
10
  const {
11
11
  parseStreamEnvelope,
12
+ shouldAutoReplyFromPtyToPublisher,
12
13
  shouldForwardStreamToPublisher,
13
14
  } = require("./publisherRouting");
14
15
 
@@ -192,7 +193,6 @@ async function runPtyRunner({ projectRoot, agentType = "codex", extraArgs = [] }
192
193
  let suppressEcho = false;
193
194
  let echoMarker = "";
194
195
  let suppressTimer = null;
195
- let managedReplyBuffer = "";
196
196
  let ptyProcess = null;
197
197
  let restartCount = 0;
198
198
  let lastSpawnTime = 0;
@@ -254,45 +254,23 @@ async function runPtyRunner({ projectRoot, agentType = "codex", extraArgs = [] }
254
254
  return result;
255
255
  }
256
256
 
257
- function appendManagedReply(chunk) {
258
- const text = String(chunk || "");
259
- if (!text) return;
260
- managedReplyBuffer += text;
261
- if (managedReplyBuffer.length > 40000) {
262
- managedReplyBuffer = managedReplyBuffer.slice(-40000);
263
- }
264
- }
265
-
266
- function takeManagedReply() {
267
- const reply = sanitizeChunk(managedReplyBuffer)
268
- .replace(/\n{3,}/g, "\n\n")
269
- .trim();
270
- managedReplyBuffer = "";
271
- return reply;
272
- }
273
-
274
257
  function completePublisherResponse(reason, fallbackNote = "") {
275
258
  if (!currentPublisher) return;
276
259
  if (flushTimer) {
277
260
  clearTimeout(flushTimer);
278
261
  flushTimer = null;
279
262
  }
263
+ if (!shouldAutoReplyFromPtyToPublisher(projectRoot, currentPublisher)) {
264
+ outputBuffer = "";
265
+ return;
266
+ }
280
267
  if (outputBuffer) {
281
268
  const remaining = outputBuffer;
282
269
  outputBuffer = "";
283
270
  deliverChunk(remaining);
284
271
  }
285
- if (canStreamToPublisher(currentPublisher)) {
286
- if (fallbackNote) enqueueSend(currentPublisher, fallbackNote);
287
- enqueueSend(currentPublisher, JSON.stringify({ stream: true, done: true, reason }));
288
- return;
289
- }
290
- const reply = takeManagedReply();
291
- if (reply) {
292
- enqueueSend(currentPublisher, reply);
293
- } else if (fallbackNote) {
294
- enqueueSend(currentPublisher, fallbackNote);
295
- }
272
+ if (fallbackNote) enqueueSend(currentPublisher, fallbackNote);
273
+ enqueueSend(currentPublisher, JSON.stringify({ stream: true, done: true, reason }));
296
274
  }
297
275
 
298
276
  // TTY view subscribers (same protocol as launcher inject.sock)
@@ -623,8 +601,6 @@ async function runPtyRunner({ projectRoot, agentType = "codex", extraArgs = [] }
623
601
  if (currentPublisher) {
624
602
  if (canStreamToPublisher(currentPublisher)) {
625
603
  enqueueSend(currentPublisher, payload);
626
- } else {
627
- appendManagedReply(cleaned);
628
604
  }
629
605
  } else {
630
606
  pendingOutput.push(payload);
@@ -699,7 +675,6 @@ async function runPtyRunner({ projectRoot, agentType = "codex", extraArgs = [] }
699
675
  }
700
676
  busy = false;
701
677
  currentPublisher = "";
702
- managedReplyBuffer = "";
703
678
  processQueue();
704
679
  }
705
680
  });
@@ -752,7 +727,6 @@ async function runPtyRunner({ projectRoot, agentType = "codex", extraArgs = [] }
752
727
  busy = false;
753
728
  activityDetector.markIdle();
754
729
  currentPublisher = "";
755
- managedReplyBuffer = "";
756
730
  if (watchdogTimer) {
757
731
  clearTimeout(watchdogTimer);
758
732
  watchdogTimer = null;
@@ -793,7 +767,6 @@ async function runPtyRunner({ projectRoot, agentType = "codex", extraArgs = [] }
793
767
  busy = false;
794
768
  activityDetector.markIdle();
795
769
  currentPublisher = "";
796
- managedReplyBuffer = "";
797
770
  processQueue();
798
771
  }, idleMs);
799
772
  }
@@ -833,7 +806,6 @@ async function runPtyRunner({ projectRoot, agentType = "codex", extraArgs = [] }
833
806
  activityDetector.markIdle();
834
807
  currentPublisher = "";
835
808
  currentMarker = "";
836
- managedReplyBuffer = "";
837
809
 
838
810
  // If stop() was called, let the runner exit
839
811
  if (!running) return;
@@ -969,7 +941,6 @@ async function runPtyRunner({ projectRoot, agentType = "codex", extraArgs = [] }
969
941
  activityDetector.markWorking();
970
942
  currentPublisher = next.publisher;
971
943
  currentMarker = next.marker || "";
972
- managedReplyBuffer = "";
973
944
  if (suppressTimer) {
974
945
  clearTimeout(suppressTimer);
975
946
  suppressTimer = null;
@@ -1040,7 +1011,6 @@ async function runPtyRunner({ projectRoot, agentType = "codex", extraArgs = [] }
1040
1011
  busy = false;
1041
1012
  activityDetector.markIdle();
1042
1013
  currentPublisher = "";
1043
- managedReplyBuffer = "";
1044
1014
  processQueue();
1045
1015
  }, watchdogMs);
1046
1016
  }
@@ -33,6 +33,10 @@ function shouldForwardStreamToPublisher(projectRoot, publisher) {
33
33
  return !isManagedAgentPublisher(projectRoot, id);
34
34
  }
35
35
 
36
+ function shouldAutoReplyFromPtyToPublisher(projectRoot, publisher) {
37
+ return shouldForwardStreamToPublisher(projectRoot, publisher);
38
+ }
39
+
36
40
  function parseStreamEnvelope(message) {
37
41
  if (typeof message !== "string" || !message.trim()) return null;
38
42
  try {
@@ -50,5 +54,6 @@ module.exports = {
50
54
  isManagedAgentPublisher,
51
55
  normalizePublisher,
52
56
  parseStreamEnvelope,
57
+ shouldAutoReplyFromPtyToPublisher,
53
58
  shouldForwardStreamToPublisher,
54
59
  };