You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
src/auto-reply/reply/get-reply-run.ts is the hot path for every inbound auto-reply. After the pi-embedded gut (b27cecc795, #76/#77) and the v2026.3.7 sync regression (9ef1894, #2298), four pi-embedded function imports were reintroduced at lines 5-9 and now silently operate on no-op stubs. This collapses every user-configured queue mode gate to the "no run active" branch, breaking interrupt / steer / steer-backlog / collect semantics.
Tracked from the ChannelBridge compatibility audit on #2089 as the highest-severity regression discovered.
Downstream, isActive and isStreaming are passed to runReplyAgent in agent-runner.ts. With both false, the branch at agent-runner.ts:197-204 (shouldSteer && isStreaming → queueEmbeddedPiMessage) is dead, and the active-run queue action resolver in agent-runner.ts:206-216 always picks the "not active" path regardless of whether a ChannelBridge CLI subprocess is actually running.
Impact
Any user who sets queue.mode to interrupt, steer, steer-backlog, or collect in their config gets silently downgraded behavior — the mode is honored only for the "no run active" case, which is the least interesting case. The configured interrupt mode never actually interrupts.
Proposed fix
Drop the four pi-embedded imports at lines 5-9 of get-reply-run.ts.
Remove isStreaming from get-reply-run.ts entirely. ChannelBridge CLI runtimes don't expose a "streaming" state distinct from "active"; the closest equivalent is binary. Also remove isStreaming from the runReplyAgent params contract in agent-runner.ts:68,71,100,102 and delete the shouldSteer && isStreaming dead branch at agent-runner.ts:197-204.
Remove the sessionLaneKey / laneSize / clearCommandLane block (lines 402-408). The command-queue.ts lanes are main/cron/subagent/nested (from src/process/lanes.ts); there is no session-keyed lane that the current code populates. This block is dead whether or not pi-embedded stubs exist.
Wire "interrupt" queue mode to killSessionRun if the intent is still to stop the running subprocess when a new interrupt-mode message arrives:
Summary
src/auto-reply/reply/get-reply-run.tsis the hot path for every inbound auto-reply. After the pi-embedded gut (b27cecc795, #76/#77) and thev2026.3.7sync regression (9ef1894, #2298), four pi-embedded function imports were reintroduced at lines 5-9 and now silently operate on no-op stubs. This collapses every user-configured queue mode gate to the "no run active" branch, breakinginterrupt/steer/steer-backlog/collectsemantics.Tracked from the ChannelBridge compatibility audit on #2089 as the highest-severity regression discovered.
Current regressed state
Downstream,
isActiveandisStreamingare passed torunReplyAgentinagent-runner.ts. With bothfalse, the branch atagent-runner.ts:197-204(shouldSteer && isStreaming → queueEmbeddedPiMessage) is dead, and the active-run queue action resolver inagent-runner.ts:206-216always picks the "not active" path regardless of whether a ChannelBridge CLI subprocess is actually running.Impact
Any user who sets
queue.modetointerrupt,steer,steer-backlog, orcollectin their config gets silently downgraded behavior — the mode is honored only for the "no run active" case, which is the least interesting case. The configuredinterruptmode never actually interrupts.Proposed fix
get-reply-run.ts.isActivetosession-run-registry:isStreamingfromget-reply-run.tsentirely. ChannelBridge CLI runtimes don't expose a "streaming" state distinct from "active"; the closest equivalent is binary. Also removeisStreamingfrom therunReplyAgentparams contract inagent-runner.ts:68,71,100,102and delete theshouldSteer && isStreamingdead branch atagent-runner.ts:197-204.sessionLaneKey/laneSize/clearCommandLaneblock (lines 402-408). Thecommand-queue.tslanes aremain/cron/subagent/nested(fromsrc/process/lanes.ts); there is no session-keyed lane that the current code populates. This block is dead whether or not pi-embedded stubs exist.killSessionRunif the intent is still to stop the running subprocess when a new interrupt-mode message arrives:Acceptance Criteria
get-reply-run.tsno longer imports anything frompi-embedded.jsisActiveusessession-run-registry.isSessionRunActiveisStreamingandshouldSteer && isStreamingdead branch removed fromagent-runner.tsinterruptqueue mode either callskillSessionRunor has documented rationale for no-oppnpm checkpassesisEmbeddedPiRunActive/isEmbeddedPiRunStreaming— seereply.directive.*andagent-runner.*.test.tsfiles)git grep -n "isEmbeddedPiRunActive\|isEmbeddedPiRunStreaming\|resolveEmbeddedSessionLane" src/auto-reply/returns zero production hitsOut of Scope
pi-embedded.tsstub barrel itself — tracked under audit: review all Pi engine stub replacements for ChannelBridge compatibility #2089 parent issue as a cascade sweep.steermode abort+restart implementation — separate design discussion; this issue fixes only the gating regression.abort.ts,sessions.ts,server-reload-handlers.ts,subagents-tool.ts,action-kill.ts,action-send.ts,commands-session.ts) — separate sub-issues.Related
subagent-announce.ts)b27cecc795— original Pi gut commit (Remove pi-embedded.ts stub barrel and clean up no-op call sites #76/feat: remove pi-embedded.ts stub barrel and clean up call sites (#76) #77)9ef18943dc— v2026.3.7 sync that re-introducedpi-embedded.tsstubs