pi-daddy 0.48.2 → 0.48.3

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/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # Changelog — pi-daddy
2
2
 
3
+ ## 0.48.3 — 2026-10-09
4
+
5
+ Restore Pi's live native interface inside governed Herdr child tabs: initial task, live tool calls/results, and final answer. Ctrl+O expands tool output. The view consumes other user input after session start; task changes and cancellation stay with the parent. Update pi-daddy and restart Pi; existing running children keep their original executor.
6
+
7
+ A dedicated inherited event channel keeps exact native final/session checks independent of terminal rendering. The same native owner gates startup and reaps descendants. A settled retained tab contains output, not a live authorized child. Reset the terminal title after normal settlement. Herdr can retain a cached unknown Pi sidebar entry after our lifecycle source is released and all owned processes have exited; observed on servers 0.8.2, 0.9.0 and 0.9.3. Native receipts and process checks remain authoritative; a newer release number does not guarantee sidebar removal. A killed launcher can leave the last terminal title visible.
8
+
9
+ Suppress reasoning in the rendered UI without changing model context or native session files. Preserve headless permission behavior for descendants and existing Pi project-trust policy, so the viewer cannot wait on unanswered local approvals or silently approve an unknown project.
10
+
3
11
  ## 0.48.2 — 2026-10-09
4
12
 
5
13
  Restore governed children in Herdr's native agent sidebar. Active entries show the role, and tabs are named for that role instead of all using the same generic label. Update pi-daddy and restart Pi to use the fix.
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # pi-daddy
2
2
 
3
- Source target: **0.48.2**. Before installation, verify that `npm view pi-daddy version` and Git tag `v0.48.2` both resolve to this release.
3
+ Source target: **0.48.3**. Before installation, verify that `npm view pi-daddy version` and Git tag `v0.48.3` both resolve to this release.
4
4
 
5
5
  **Capability governance and coordination for [pi](https://github.com/badlogic/pi-mono)'s multi-level agent system.**
6
6
  An orchestrator grants each sub-agent a deliberate subset of what it holds and withholds the rest. A sub-agent may
@@ -181,8 +181,7 @@ escape hatch for an operator who wants the old behaviour, and an explicitly empt
181
181
 
182
182
  ## Approvals
183
183
 
184
- With Auto OFF, a gated capability needs a valid approval or the UI of the session executing the delegation. Captured children use Pi's JSON mode
185
- without a UI; a gate with neither a valid approval nor an available UI is denied. The answer is **once**, **for this session**, or **always** (persisted for a bounded period, offered only for a
184
+ With Auto OFF, a gated capability needs a valid approval or the UI of the session executing the delegation. Captured children use Pi's JSON mode; Herdr children have a view-only native UI. Neither can answer local permission dialogs; a gate with neither a valid approval nor an available UI is denied. The answer is **once**, **for this session**, or **always** (persisted for a bounded period, offered only for a
186
185
  named definition, keyed `capability@subject`). Approvals inherit down the subtree intersected with each child's grant;
187
186
  a `once` never crosses a spawn. The approval store and governance ledger never store raw task text. `/grants
188
187
  approvals` lists what is persisted; `/grants revoke <capability>@<definition>` or `--all` removes it. The store lives
@@ -247,7 +246,7 @@ Pi 1.0.4 and 1.1.0, client 0.9.3/server 0.9.0 with Pi 1.1.0, and client/server 0
247
246
  Each combination exercises real child results, retained tabs, cancellation, coordinator loss and server loss.
248
247
  These are measured combinations, not a product-version allowlist. Native Windows and WSL-to-Windows worker
249
248
  interop remain unqualified.
250
- A packaged native helper owns and reaps the cooperating child subtree. The final is accepted only when Pi's JSON
249
+ A packaged native helper owns and reaps the cooperating child subtree. The final is accepted only when Pi's native lifecycle
251
250
  protocol settles and matches the exact persisted current turn and active branch. Complete final text is preserved;
252
251
  work, final availability, subtree cleanup and optional observation completeness are separate result fields. A failed
253
252
  execution returns `isError` with its available evidence. Display, diagnostics and optional recording cannot replace
@@ -261,9 +260,22 @@ Retained capacity is rechecked against the original bound ownership and settleme
261
260
 
262
261
  Governed Herdr children appear in the native agent sidebar while running, with their role (for example
263
262
  Plan, Build or Review) and a corresponding named tab. Sidebar state is observational: native process
264
- receipts still determine settlement. A settled child leaves the active agent list; with
263
+ receipts still determine settlement. The launcher releases its own sidebar source after settlement; with
265
264
  `PI_DADDY_HERDR_KEEP_PANE=1`, its output tab remains for inspection, without a live interactive child.
266
- Missing sidebar delivery is reported but does not change the execution result.
265
+ Herdr can retain a cached unknown Pi entry after that release even when all owned processes have exited.
266
+ This display limitation has been observed on servers 0.8.2, 0.9.0 and 0.9.3; disappearance is not guaranteed by
267
+ a newer release number. Normal settlement resets the terminal title; an abruptly killed launcher can
268
+ leave the last title visible. Neither a title nor a cached entry proves liveness.
269
+ While running, the tab displays Pi's own interface with the initial task, live tool calls and results, and
270
+ the final answer. It is view-only: Ctrl+O expands or collapses tool output, and terminal scrollback remains
271
+ available. Type task changes in the parent session. The child consumes other input once its session starts;
272
+ an interruption during Pi startup can still fail the launch. Reasoning text is suppressed by Pi's public
273
+ display transformer. This does not redact native session files or optional private diagnostic captures.
274
+
275
+ The parent continues to control task dispatch and cancellation. Children retain existing/Auto permissions;
276
+ a new local approval request refuses instead of waiting in a view-only tab. Existing Pi project-trust
277
+ decisions remain effective; an unknown project receives the same noninteractive refusal as captured mode,
278
+ without writing a new trust decision. Missing sidebar delivery is reported but does not change the execution result.
267
279
 
268
280
  Set `PI_DADDY_HERDR=0` for captured execution or `PI_DADDY_HERDR=1` to demand Herdr panes. An unset value
269
281
  probes for a responding server. Startup requires a successful tab-list response and live JSON server status
@@ -274,8 +286,9 @@ protocol number or a client/server product-version comparison. Missing or incomp
274
286
  with no backend fallback. Each owned pane starts a packaged launcher
275
287
  connected to the coordinator over a private bounded Unix socket. The launcher uses the same pinned native
276
288
  subreaper, and the coordinator binds its identity before releasing the worker gate. Child environment and
277
- arguments come from the governed plan, without inheriting the Herdr daemon's environment. Only public text is
278
- shown in the pane; raw protocol/private reasoning is not used as a display channel.
289
+ arguments come from the governed plan, without inheriting the Herdr daemon's environment. The native UI owns the pane terminal, while a separate inherited pipe carries lifecycle events to the
290
+ same final validator. Terminal text never determines success or cleanup. Raw protocol/private reasoning
291
+ is not used as a display channel.
279
292
 
280
293
  Native receipts, not pane closure or idle screen state, prove subtree cleanup. Model-free qualification covers
281
294
  actual Pi CLI success, retry, nested tool and failed-final cases, cancellation, coordinator SIGKILL and loss of
@@ -1 +1 @@
1
- {"version":3,"file":"captured-execution.d.ts","sourceRoot":"","sources":["../../src/executors/captured-execution.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,KAAK,oBAAoB,EAAE,KAAK,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACvG,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACzE,OAAO,EAAqB,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACtE,MAAM,WAAW,uBAAwB,SAAQ,mBAAmB;IAClE,KAAK,EAAE,UAAU,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,oBAAoB,EAAE,OAAO,CAAC;CAC/B;AACD,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,IAAI,CAAC,oBAAoB,EAAE,cAAc,GAAG,eAAe,CAAC,GAAG;IACtE,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,uBAAuB,KAAK,IAAI,CAAC;CAC1D,EACD,QAAQ,GAAE,OAAO,aAA6B,GAC7C,OAAO,CAAC,uBAAuB,CAAC,CA2ClC"}
1
+ {"version":3,"file":"captured-execution.d.ts","sourceRoot":"","sources":["../../src/executors/captured-execution.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,aAAa,EAAE,KAAK,oBAAoB,EAAE,KAAK,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACvG,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACzE,OAAO,EAAqB,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACtE,MAAM,WAAW,uBAAwB,SAAQ,mBAAmB;IAClE,KAAK,EAAE,UAAU,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,oBAAoB,EAAE,OAAO,CAAC;CAC/B;AACD,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,IAAI,CAAC,oBAAoB,EAAE,cAAc,GAAG,eAAe,CAAC,GAAG;IACtE,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,uBAAuB,KAAK,IAAI,CAAC;CAC1D,EACD,QAAQ,GAAE,OAAO,aAA6B,GAC7C,OAAO,CAAC,uBAAuB,CAAC,CAsDlC"}
@@ -2,6 +2,7 @@
2
2
  import { mkdtemp } from "node:fs/promises";
3
3
  import { tmpdir } from "node:os";
4
4
  import { join } from "node:path";
5
+ import { fileURLToPath } from "node:url";
5
6
  import { runOwnedChild } from "./owned-worker.js";
6
7
  import { ChildFinalCapture } from "./child-final.js";
7
8
  export async function runCapturedExecution(request, runOwned = runOwnedChild) {
@@ -25,7 +26,17 @@ export async function runCapturedExecution(request, runOwned = runOwnedChild) {
25
26
  };
26
27
  }
27
28
  const capture = new ChildFinalCapture(request.onOutput, request.onReadCleanup);
28
- const args = [...request.args.slice(0, -1), "--mode", "json", request.args.at(-1)];
29
+ const args = [...request.args];
30
+ if (request.terminalUi) {
31
+ const extension = (name) => fileURLToPath(new URL("./" + name + (import.meta.url.endsWith(".ts") ? ".ts" : ".js"), import.meta.url));
32
+ // Pi enables editor commands before awaiting session_start handlers. The view guard must be first;
33
+ // the event observer remains last so earlier message transformations are captured exactly.
34
+ const firstExtension = args.findIndex((arg, index) => index < args.length - 1 && ["--no-extensions", "-ne", "-e", "--extension"].includes(arg));
35
+ args.splice(firstExtension < 0 ? args.length - 1 : firstExtension, 0, "-e", extension("owned-pi-view"));
36
+ args.splice(args.length - 1, 0, "-e", extension("owned-pi-ui"), "--tui-mode", "regular");
37
+ }
38
+ else
39
+ args.splice(args.length - 1, 0, "--mode", "json");
29
40
  const output = await runOwned({
30
41
  ...request,
31
42
  args,
@@ -1 +1 @@
1
- {"version":3,"file":"captured-execution.js","sourceRoot":"","sources":["../../src/executors/captured-execution.ts"],"names":[],"mappings":"AAAA,2GAA2G;AAC3G,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAuD,MAAM,mBAAmB,CAAC;AAEvG,OAAO,EAAE,iBAAiB,EAAmB,MAAM,kBAAkB,CAAC;AAMtE,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,OAGC,EACD,WAAiC,aAAa;IAE9C,IAAI,SAAiB,CAAC;IACtB,IAAI,CAAC;QACH,SAAS,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAC/D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,yDAAyD,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QACxF,OAAO;YACL,IAAI,EAAE,IAAI;YACV,IAAI,EAAE,EAAE;YACR,SAAS,EAAE,KAAK;YAChB,QAAQ,EAAE,KAAK;YACf,OAAO,EAAE,KAAK;YACd,UAAU,EAAE,MAAM;YAClB,OAAO,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE;YACzC,KAAK,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE;YACvC,WAAW,EAAE,EAAE;YACf,oBAAoB,EAAE,KAAK;SAC5B,CAAC;IACJ,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,iBAAiB,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IAC/E,MAAM,IAAI,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC;IACpF,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC;QAC5B,GAAG,OAAO;QACV,IAAI;QACJ,YAAY,EAAE,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC;QAC1C,aAAa,EAAE,KAAK;QACpB,iBAAiB,EAAE,KAAK;QACxB,aAAa,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;YAC/B,IAAI,MAAM,KAAK,QAAQ;gBAAE,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YAC7D,OAAO,CAAC,aAAa,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACzC,CAAC;KACF,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACzC,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IACxC,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACpG,OAAO;QACL,GAAG,MAAM;QACT,KAAK;QACL,SAAS,EAAE,KAAK;QAChB,WAAW,EAAE,MAAM,CAAC,IAAI;QACxB,oBAAoB,EAAE,MAAM,CAAC,SAAS;QACtC,IAAI,EAAE,KAAK,CAAC,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,IAAI,EAAE,CAAC;KAC7E,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"captured-execution.js","sourceRoot":"","sources":["../../src/executors/captured-execution.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"herdr-launcher.d.ts","sourceRoot":"","sources":["../../src/executors/herdr-launcher.ts"],"names":[],"mappings":"AAOA,wBAAsB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAsHxF"}
1
+ {"version":3,"file":"herdr-launcher.d.ts","sourceRoot":"","sources":["../../src/executors/herdr-launcher.ts"],"names":[],"mappings":"AAOA,wBAAsB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmIxF"}
@@ -8,7 +8,7 @@ import { herdrAgentDisplay } from "./herdr-agent-display.js";
8
8
  export async function launchHerdrWorker(socketPath, token) {
9
9
  const socket = createConnection(socketPath);
10
10
  const abort = new AbortController();
11
- let started = false, authenticated = false, acknowledge, rejectGate;
11
+ let started = false, authenticated = false, terminalUi = false, acknowledge, rejectGate;
12
12
  const lost = (error) => {
13
13
  abort.abort();
14
14
  rejectGate?.(error);
@@ -27,7 +27,8 @@ export async function launchHerdrWorker(socketPath, token) {
27
27
  return;
28
28
  }
29
29
  if (message?.type === "display" && authenticated && typeof message.text === "string") {
30
- process.stdout.write(message.text);
30
+ if (!terminalUi)
31
+ process.stdout.write(message.text);
31
32
  return;
32
33
  }
33
34
  if (message?.type !== "request" || started) {
@@ -38,11 +39,15 @@ export async function launchHerdrWorker(socketPath, token) {
38
39
  started = true;
39
40
  authenticated = true;
40
41
  const request = message.request;
42
+ terminalUi = request.terminalUi === true;
41
43
  let childPid;
42
44
  const display = herdrAgentDisplay(message.display);
43
45
  let settled = false;
44
46
  void (async () => {
47
+ const wasRaw = process.stdin.isRaw;
45
48
  try {
49
+ if (terminalUi && process.stdin.isTTY)
50
+ process.stdin.setRawMode(true);
46
51
  const result = await runOwnedChild({
47
52
  ...request,
48
53
  signal: abort.signal,
@@ -84,10 +89,15 @@ export async function launchHerdrWorker(socketPath, token) {
84
89
  childPid = pid;
85
90
  void display.working();
86
91
  send({ type: "spawned", pid });
87
- process.stdout.write("pi-daddy: governed child running\n");
92
+ if (!terminalUi)
93
+ process.stdout.write("pi-daddy: governed child running\n");
88
94
  },
89
95
  });
90
96
  settled = result.cleanup.state === "settled" || result.cleanup.state === "not-started";
97
+ // Mark only this owned terminal as settled; this is cosmetic, not process or sidebar authority.
98
+ // Unknown cleanup keeps its existing title, and a killed launcher cannot reset it.
99
+ if (terminalUi && settled)
100
+ process.stdout.write("\x1b]0;Task settled\x07");
91
101
  const displayReleased = await display.finish(settled);
92
102
  if (!socket.destroyed) {
93
103
  send({ type: "result", result, displayReleased: settled && displayReleased });
@@ -106,6 +116,15 @@ export async function launchHerdrWorker(socketPath, token) {
106
116
  }
107
117
  }
108
118
  }
119
+ finally {
120
+ try {
121
+ if (terminalUi && process.stdin.isTTY)
122
+ process.stdin.setRawMode(wasRaw);
123
+ }
124
+ catch {
125
+ // A lost pane cannot be restored; native cleanup remains independently recorded.
126
+ }
127
+ }
109
128
  })();
110
129
  }, lost);
111
130
  await new Promise((resolve, reject) => {
@@ -1 +1 @@
1
- {"version":3,"file":"herdr-launcher.js","sourceRoot":"","sources":["../../src/executors/herdr-launcher.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"herdr-launcher.js","sourceRoot":"","sources":["../../src/executors/herdr-launcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
2
+ export default function ownedPiUi(pi: ExtensionAPI): void;
3
+ //# sourceMappingURL=owned-pi-ui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"owned-pi-ui.d.ts","sourceRoot":"","sources":["../../src/executors/owned-pi-ui.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAsB,MAAM,iCAAiC,CAAC;AAMxF,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAyGxD"}
@@ -0,0 +1,114 @@
1
+ /** Install LAST: observe final extension-transformed Pi events through the private inherited pipe. */
2
+ import { fstatSync } from "node:fs";
3
+ import { Socket } from "node:net";
4
+ import { getAgentDir, ProjectTrustStore, SettingsManager } from "@earendil-works/pi-coding-agent";
5
+ import { OWNED_PI_VIEW_READY, failOwnedPiUi as fail } from "./owned-pi-view.js";
6
+ const EVENT_FD = 6;
7
+ export default function ownedPiUi(pi) {
8
+ try {
9
+ const channel = fstatSync(EVENT_FD);
10
+ if (!channel.isFIFO() && !channel.isSocket())
11
+ throw Error("fd 6 is not an inherited event pipe");
12
+ const output = new Socket({ fd: EVENT_FD, readable: false, writable: true });
13
+ output.on("error", fail);
14
+ let pending = Promise.resolve();
15
+ const send = (event) => {
16
+ let record;
17
+ try {
18
+ record = JSON.stringify(event) + "\n";
19
+ }
20
+ catch (error) {
21
+ return fail(error);
22
+ }
23
+ pending = pending
24
+ .then(() => new Promise((resolve) => {
25
+ output.write(record, (error) => (error ? fail(error) : resolve()));
26
+ }))
27
+ .catch(fail);
28
+ return pending;
29
+ };
30
+ // Keep the previous noninteractive trust policy; native UI must not introduce a blocking trust dialog.
31
+ pi.on("project_trust", (event) => {
32
+ try {
33
+ const agentDir = getAgentDir();
34
+ const remembered = new ProjectTrustStore(agentDir).get(event.cwd);
35
+ const trusted = remembered ??
36
+ SettingsManager.create(event.cwd, agentDir, { projectTrusted: false }).getDefaultProjectTrust() === "always";
37
+ return { trusted: trusted ? "yes" : "no", remember: false };
38
+ }
39
+ catch (error) {
40
+ return fail(error);
41
+ }
42
+ });
43
+ let guardedSession;
44
+ pi.events.on(OWNED_PI_VIEW_READY, (ready) => {
45
+ if (ready && typeof ready === "object" && "sessionManager" in ready && "sessionId" in ready)
46
+ guardedSession = { sessionManager: ready.sessionManager, sessionId: ready.sessionId };
47
+ });
48
+ let started = false;
49
+ pi.on("session_start", (_event, ctx) => {
50
+ try {
51
+ if (started)
52
+ throw Error("the owned session cannot be replaced");
53
+ if (ctx.mode !== "tui" ||
54
+ guardedSession?.sessionManager !== ctx.sessionManager ||
55
+ guardedSession.sessionId !== ctx.sessionManager.getSessionId())
56
+ throw Error("the native Pi view guard is not ready for this session");
57
+ const header = ctx.sessionManager.getHeader();
58
+ if (!header ||
59
+ header.type !== "session" ||
60
+ header.version !== 3 ||
61
+ header.id !== ctx.sessionManager.getSessionId())
62
+ throw Error("missing or mismatched actual Pi session header");
63
+ started = true;
64
+ return send(header);
65
+ }
66
+ catch (error) {
67
+ return fail(error);
68
+ }
69
+ });
70
+ const forward = (event) => {
71
+ if (!started)
72
+ fail("Pi event arrived before the guarded session");
73
+ return send(event);
74
+ };
75
+ pi.on("agent_start", forward);
76
+ pi.on("agent_end", forward);
77
+ pi.on("turn_start", forward);
78
+ pi.on("turn_end", forward);
79
+ pi.on("message_start", forward);
80
+ pi.on("message_end", forward);
81
+ pi.on("tool_execution_start", forward);
82
+ pi.on("tool_execution_update", forward);
83
+ pi.on("tool_execution_end", forward);
84
+ pi.on("message_update", (event) => {
85
+ // Match Pi's JSON delta projection without copying growing partial-message snapshots.
86
+ if (event.message.role !== "assistant")
87
+ fail("message_update is not an assistant message");
88
+ const usage = event.message.usage, update = event.assistantMessageEvent;
89
+ if (!("partial" in update))
90
+ return forward({ type: event.type, usage, assistantMessageEvent: update });
91
+ const { partial, ...delta } = update;
92
+ if (update.type === "toolcall_start") {
93
+ const tool = partial.content[update.contentIndex];
94
+ if (tool?.type !== "toolCall")
95
+ fail("toolcall_start lacks its actual tool call");
96
+ return forward({
97
+ type: event.type,
98
+ usage,
99
+ assistantMessageEvent: { ...delta, id: tool.id, toolName: tool.name },
100
+ });
101
+ }
102
+ return forward({ type: event.type, usage, assistantMessageEvent: delta });
103
+ });
104
+ pi.on("agent_settled", async (event, ctx) => {
105
+ await forward(event);
106
+ // The pipe has flushed before orderly shutdown; native receipt/session checks remain authoritative.
107
+ ctx.shutdown();
108
+ });
109
+ }
110
+ catch (error) {
111
+ fail(error);
112
+ }
113
+ }
114
+ //# sourceMappingURL=owned-pi-ui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"owned-pi-ui.js","sourceRoot":"","sources":["../../src/executors/owned-pi-ui.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
2
+ export declare const OWNED_PI_VIEW_READY = "pi-daddy:owned-pi-view-ready";
3
+ export declare function failOwnedPiUi(error: unknown): never;
4
+ export default function ownedPiView(pi: ExtensionAPI): void;
5
+ //# sourceMappingURL=owned-pi-view.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"owned-pi-view.d.ts","sourceRoot":"","sources":["../../src/executors/owned-pi-view.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAEpE,eAAO,MAAM,mBAAmB,iCAAiC,CAAC;AAClE,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,CAMnD;AAED,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CA4C1D"}
@@ -0,0 +1,60 @@
1
+ /** Install FIRST: native Pi remains observable, but only its parent can control work. */
2
+ import { writeSync } from "node:fs";
3
+ export const OWNED_PI_VIEW_READY = "pi-daddy:owned-pi-view-ready";
4
+ export function failOwnedPiUi(error) {
5
+ try {
6
+ writeSync(2, "pi-daddy: owned Pi UI refused: " + String(error) + "\n");
7
+ }
8
+ finally {
9
+ process.exit(70);
10
+ }
11
+ }
12
+ export default function ownedPiView(pi) {
13
+ try {
14
+ if (typeof pi.registerMarkdownTransformer !== "function")
15
+ throw Error("Pi lacks its public markdown renderer hook");
16
+ pi.registerMarkdownTransformer((markdown, context) => context.messageType === "assistant-thinking" ? "Thinking hidden" : markdown);
17
+ let guarded = false;
18
+ // No await here: the first session handler installs the guard before another handler can yield.
19
+ pi.on("session_start", (_event, ctx) => {
20
+ try {
21
+ if (guarded)
22
+ throw Error("the owned session cannot be replaced");
23
+ if (ctx.mode !== "tui" ||
24
+ typeof ctx.ui.onTerminalInput !== "function" ||
25
+ typeof ctx.ui.getToolsExpanded !== "function" ||
26
+ typeof ctx.ui.setToolsExpanded !== "function")
27
+ throw Error("Pi lacks the required native TUI controls");
28
+ const unsubscribe = ctx.ui.onTerminalInput((data) => {
29
+ // The renderer consumes this exact terminal response before dispatching any user action.
30
+ if (/^\x1b\[6;\d+;\d+t$/.test(data))
31
+ return;
32
+ try {
33
+ if (["\x0f", "\x1b[111;5u", "\x1b[111;5:1u", "\x1b[111;5:2u", "\x1b[27;5;111~"].includes(data))
34
+ ctx.ui.setToolsExpanded(!ctx.ui.getToolsExpanded());
35
+ }
36
+ catch (error) {
37
+ failOwnedPiUi(error);
38
+ }
39
+ return { consume: true };
40
+ });
41
+ if (typeof unsubscribe !== "function")
42
+ throw Error("Pi did not install the terminal input guard");
43
+ ctx.ui.setEditorText("");
44
+ ctx.ui.setStatus("pi-daddy-owned", "View only · parent controls the task · Ctrl+O expands tools");
45
+ guarded = true;
46
+ pi.events.emit(OWNED_PI_VIEW_READY, {
47
+ sessionManager: ctx.sessionManager,
48
+ sessionId: ctx.sessionManager.getSessionId(),
49
+ });
50
+ }
51
+ catch (error) {
52
+ failOwnedPiUi(error);
53
+ }
54
+ });
55
+ }
56
+ catch (error) {
57
+ failOwnedPiUi(error);
58
+ }
59
+ }
60
+ //# sourceMappingURL=owned-pi-view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"owned-pi-view.js","sourceRoot":"","sources":["../../src/executors/owned-pi-view.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,8 @@ export interface OwnedChildRunRequest extends ChildRunRequest {
8
8
  onOwnership?: (identity: CapturedWorkerIdentity) => Promise<void> | void;
9
9
  /** JSON protocol consumers observe all bytes without capturing enormous replay streams as answer text. */
10
10
  captureStdout?: boolean;
11
+ /** Actual pane terminal for Pi's native view. Protocol events arrive separately on fd 6. */
12
+ terminalUi?: boolean;
11
13
  /** Bounded diagnostics may truncate without stopping independently captured primary output. */
12
14
  stopOnOutputLimit?: boolean;
13
15
  }
@@ -1 +1 @@
1
- {"version":3,"file":"owned-worker.d.ts","sourceRoot":"","sources":["../../src/executors/owned-worker.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE9E,OAAO,KAAK,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAM3G,YAAY,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAE3G,MAAM,WAAW,oBAAqB,SAAQ,eAAe;IAC3D,WAAW,EAAE,MAAM,CAAC;IACpB,iGAAiG;IACjG,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,sBAAsB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACzE,0GAA0G;IAC1G,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,+FAA+F;IAC/F,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AACD,MAAM,WAAW,mBAAoB,SAAQ,cAAc;IACzD,OAAO,EAAE,qBAAqB,CAAC;CAChC;AACD,wBAAsB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAgS/F"}
1
+ {"version":3,"file":"owned-worker.d.ts","sourceRoot":"","sources":["../../src/executors/owned-worker.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE9E,OAAO,KAAK,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAM3G,YAAY,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAE3G,MAAM,WAAW,oBAAqB,SAAQ,eAAe;IAC3D,WAAW,EAAE,MAAM,CAAC;IACpB,iGAAiG;IACjG,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,sBAAsB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACzE,0GAA0G;IAC1G,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,4FAA4F;IAC5F,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,+FAA+F;IAC/F,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AACD,MAAM,WAAW,mBAAoB,SAAQ,cAAc;IACzD,OAAO,EAAE,qBAAqB,CAAC;CAChC;AACD,wBAAsB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAgT/F"}
@@ -26,6 +26,8 @@ export async function runOwnedChild(request) {
26
26
  return notStarted("cancelled before helper launch", true);
27
27
  if (process.platform !== "linux" || process.arch !== "x64")
28
28
  return notStarted("captured worker requires qualified Linux x64 helper");
29
+ if (request.terminalUi && (!process.stdin.isTTY || !process.stdout.isTTY || !process.stderr.isTTY))
30
+ return notStarted("native Pi view requires a real pane terminal on stdin, stdout and stderr");
29
31
  let helper, root, hash;
30
32
  const nonce = randomUUID();
31
33
  let binary;
@@ -72,12 +74,25 @@ export async function runOwnedChild(request) {
72
74
  ], {
73
75
  cwd: root,
74
76
  env: request.env,
75
- stdio: ["ignore", "pipe", "pipe", "pipe", "pipe", binary.fd],
76
- detached: true,
77
+ stdio: request.terminalUi
78
+ ? ["inherit", "inherit", "inherit", "pipe", "pipe", binary.fd, "pipe"]
79
+ : ["ignore", "pipe", "pipe", "pipe", "pipe", binary.fd],
80
+ // The UI shares the pane's foreground process group for raw input and SIGWINCH.
81
+ // Cleanup still targets owned descendants by pidfd, never by process group.
82
+ detached: !request.terminalUi,
77
83
  });
78
84
  void binary.close();
79
85
  const control = child.stdio[3];
80
86
  const status = child.stdio[4];
87
+ const streams = {
88
+ stdout: request.terminalUi ? child.stdio.at(6) : child.stdout,
89
+ stderr: child.stderr,
90
+ };
91
+ const closeObservations = () => {
92
+ streams.stdout?.destroy();
93
+ streams.stderr?.destroy();
94
+ status.destroy();
95
+ };
81
96
  let identity;
82
97
  let text = "", count = 0, truncated = false, timedOut = false, aborted = false, idle = false;
83
98
  let failure, done = false, stopping = false, ready = "";
@@ -122,9 +137,7 @@ export async function runOwnedChild(request) {
122
137
  stopWatchdog = setTimeout(() => {
123
138
  failure ??= "worker helper failed to establish cleanup before its bound";
124
139
  child.kill("SIGKILL");
125
- child.stdout?.destroy();
126
- child.stderr?.destroy();
127
- status.destroy();
140
+ closeObservations();
128
141
  }, cleanupCeiling + 1000);
129
142
  };
130
143
  function armIdle() {
@@ -138,10 +151,15 @@ export async function runOwnedChild(request) {
138
151
  stop();
139
152
  }, request.idleTimeoutMs);
140
153
  }
141
- child.stdout?.on("data", (bytes) => observe("stdout", bytes));
142
- child.stderr?.on("data", (bytes) => observe("stderr", bytes));
154
+ streams.stdout?.on("data", (bytes) => observe("stdout", bytes));
155
+ streams.stderr?.on("data", (bytes) => observe("stderr", bytes));
156
+ for (const stream of Object.values(streams))
157
+ stream?.on("error", (error) => {
158
+ failure ??= "child event channel failed: " + String(error);
159
+ stop();
160
+ });
143
161
  for (const stream of ["stdout", "stderr"])
144
- child[stream]?.on("end", () => {
162
+ streams[stream]?.on("end", () => {
145
163
  const tail = decoders[stream].end();
146
164
  if (tail && !(stream === "stdout" && request.captureStdout === false)) {
147
165
  const kept = takeBytes(tail, Math.max(0, (request.maxOutputBytes ?? DEFAULT_MAX_OUTPUT_BYTES) - count));
@@ -248,9 +266,7 @@ export async function runOwnedChild(request) {
248
266
  void (async () => {
249
267
  if (!identity || !(await readCapturedWorkerReceipt(identity))) {
250
268
  failure ??= "helper exited without an independent settlement receipt";
251
- child.stdout?.destroy();
252
- child.stderr?.destroy();
253
- status.destroy();
269
+ closeObservations();
254
270
  }
255
271
  })();
256
272
  });
@@ -1 +1 @@
1
- {"version":3,"file":"owned-worker.js","sourceRoot":"","sources":["../../src/executors/owned-worker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"owned-worker.js","sourceRoot":"","sources":["../../src/executors/owned-worker.ts"],"names":[],"mappings":"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"}
@@ -58,7 +58,7 @@ export interface PromptOutcome {
58
58
  }
59
59
  export interface ApprovalGateOptions {
60
60
  ui: ApprovalUI;
61
- /** pi's `ctx.hasUI` — false in print/json mode, and therefore in every governed child. */
61
+ /** Whether a human can answer here. False in print/json mode and view-only child tabs. */
62
62
  hasUI: boolean;
63
63
  /** pi's `ctx.mode`, quoted back in the refusal so an operator can see why. */
64
64
  mode: string;
@@ -233,8 +233,9 @@ export async function obtainApprovals(
233
233
  // precisely what spec §6.1 exists to prevent. Options are per-call; the queue is session-long.
234
234
  const gate = session.approvalGateFor({
235
235
  ui: ctx.ui,
236
- hasUI: ctx.hasUI,
237
- mode: ctx.mode,
236
+ // A native child tab is a viewer. Auto and inherited approvals still work; only the root can answer.
237
+ hasUI: ctx.hasUI && !(session.depth > 0),
238
+ mode: session.depth > 0 && ctx.mode === "tui" ? "view-only child" : ctx.mode,
238
239
  timeoutMs: () => timeoutMsFromEnv(process.env[ENV_APPROVAL_TIMEOUT]),
239
240
  autoMode: session.autoMode,
240
241
  });
@@ -424,6 +424,7 @@ async function executePreparedChild(
424
424
  const output = await runCapturedExecution(
425
425
  {
426
426
  executionId,
427
+ terminalUi: session.executor.kind === "herdr",
427
428
  sessionPath: activitySession.path,
428
429
  onReadCleanup,
429
430
  onOwnership: async (identity) => {
@@ -694,14 +694,9 @@ export function createGrantsSession(
694
694
  skillPaths: skillPathsFromCatalog(await delegationCatalog(session)),
695
695
  // ADR-0016: operator-authored SKILL.md definitions, so `delegate({agent})` can name one.
696
696
  definitions: session.definitions,
697
- // The herdr executor drives the child after starting it, so its plan must NOT carry `--print`.
698
- // Threaded through the plan rather than patched afterwards: the argv is what the ledger records, and
699
- // an executor quietly rewriting it would make the record describe a spawn that did not happen.
700
- //
701
- // Read live off `session.executor` (ADR-0031) rather than a boolean captured in the factory: the probe
702
- // has not run when this session object is built, so a captured value would plan `--print` for a session
703
- // that turns out to use panes — and `runHerdrPane` refuses a plan containing `--print` by design.
704
- interactive: false, // Both qualified backends use the same one-shot Pi JSON protocol.
697
+ // Plan the real terminal invocation explicitly; the captured backend remains one-shot JSON.
698
+ // Read the selected executor at dispatch, after its live qualification completes.
699
+ interactive: session.executor.kind === "herdr",
705
700
  ...(approved ? { approved } : {}),
706
701
  };
707
702
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pi-daddy",
3
- "version": "0.48.2",
3
+ "version": "0.48.3",
4
4
  "description": "Capability governance for pi sub-agents: spawn Agent Skills (SKILL.md) definitions whose allowed-tools becomes a grant that can only narrow going down a delegation tree, enforced by pi's own --tools allowlist, with an append-only ledger.",
5
5
  "keywords": [
6
6
  "pi-package",
@@ -2,6 +2,7 @@
2
2
  import { mkdtemp } from "node:fs/promises";
3
3
  import { tmpdir } from "node:os";
4
4
  import { join } from "node:path";
5
+ import { fileURLToPath } from "node:url";
5
6
  import { runOwnedChild, type OwnedChildRunRequest, type OwnedChildRunResult } from "./owned-worker.ts";
6
7
  import type { BoundedReadCleanupError } from "../kernel/bounded-read.ts";
7
8
  import { ChildFinalCapture, type ChildFinal } from "./child-final.ts";
@@ -36,7 +37,18 @@ export async function runCapturedExecution(
36
37
  };
37
38
  }
38
39
  const capture = new ChildFinalCapture(request.onOutput, request.onReadCleanup);
39
- const args = [...request.args.slice(0, -1), "--mode", "json", request.args.at(-1)!];
40
+ const args = [...request.args];
41
+ if (request.terminalUi) {
42
+ const extension = (name: string) =>
43
+ fileURLToPath(new URL("./" + name + (import.meta.url.endsWith(".ts") ? ".ts" : ".js"), import.meta.url));
44
+ // Pi enables editor commands before awaiting session_start handlers. The view guard must be first;
45
+ // the event observer remains last so earlier message transformations are captured exactly.
46
+ const firstExtension = args.findIndex(
47
+ (arg, index) => index < args.length - 1 && ["--no-extensions", "-ne", "-e", "--extension"].includes(arg),
48
+ );
49
+ args.splice(firstExtension < 0 ? args.length - 1 : firstExtension, 0, "-e", extension("owned-pi-view"));
50
+ args.splice(args.length - 1, 0, "-e", extension("owned-pi-ui"), "--tui-mode", "regular");
51
+ } else args.splice(args.length - 1, 0, "--mode", "json");
40
52
  const output = await runOwned({
41
53
  ...request,
42
54
  args,
@@ -10,6 +10,7 @@ export async function launchHerdrWorker(socketPath: string, token: string): Prom
10
10
  const abort = new AbortController();
11
11
  let started = false,
12
12
  authenticated = false,
13
+ terminalUi = false,
13
14
  acknowledge: (() => void) | undefined,
14
15
  rejectGate: ((error: Error) => void) | undefined;
15
16
  const lost = (error: Error) => {
@@ -32,7 +33,7 @@ export async function launchHerdrWorker(socketPath: string, token: string): Prom
32
33
  return;
33
34
  }
34
35
  if (message?.type === "display" && authenticated && typeof message.text === "string") {
35
- process.stdout.write(message.text);
36
+ if (!terminalUi) process.stdout.write(message.text);
36
37
  return;
37
38
  }
38
39
  if (message?.type !== "request" || started) {
@@ -43,11 +44,14 @@ export async function launchHerdrWorker(socketPath: string, token: string): Prom
43
44
  started = true;
44
45
  authenticated = true;
45
46
  const request = message.request as OwnedChildRunRequest & { sessionPath?: string };
47
+ terminalUi = request.terminalUi === true;
46
48
  let childPid: number | undefined;
47
49
  const display = herdrAgentDisplay(message.display);
48
50
  let settled = false;
49
51
  void (async () => {
52
+ const wasRaw = process.stdin.isRaw;
50
53
  try {
54
+ if (terminalUi && process.stdin.isTTY) process.stdin.setRawMode(true);
51
55
  const result = await runOwnedChild({
52
56
  ...request,
53
57
  signal: abort.signal,
@@ -88,10 +92,13 @@ export async function launchHerdrWorker(socketPath: string, token: string): Prom
88
92
  childPid = pid;
89
93
  void display.working();
90
94
  send({ type: "spawned", pid });
91
- process.stdout.write("pi-daddy: governed child running\n");
95
+ if (!terminalUi) process.stdout.write("pi-daddy: governed child running\n");
92
96
  },
93
97
  });
94
98
  settled = result.cleanup.state === "settled" || result.cleanup.state === "not-started";
99
+ // Mark only this owned terminal as settled; this is cosmetic, not process or sidebar authority.
100
+ // Unknown cleanup keeps its existing title, and a killed launcher cannot reset it.
101
+ if (terminalUi && settled) process.stdout.write("\x1b]0;Task settled\x07");
95
102
  const displayReleased = await display.finish(settled);
96
103
  if (!socket.destroyed) {
97
104
  send({ type: "result", result, displayReleased: settled && displayReleased });
@@ -107,6 +114,12 @@ export async function launchHerdrWorker(socketPath: string, token: string): Prom
107
114
  socket.end();
108
115
  }
109
116
  }
117
+ } finally {
118
+ try {
119
+ if (terminalUi && process.stdin.isTTY) process.stdin.setRawMode(wasRaw);
120
+ } catch {
121
+ // A lost pane cannot be restored; native cleanup remains independently recorded.
122
+ }
110
123
  }
111
124
  })();
112
125
  },
@@ -0,0 +1,116 @@
1
+ /** Install LAST: observe final extension-transformed Pi events through the private inherited pipe. */
2
+ import { fstatSync } from "node:fs";
3
+ import { Socket } from "node:net";
4
+ import { getAgentDir, ProjectTrustStore, SettingsManager } from "@earendil-works/pi-coding-agent";
5
+ import type { ExtensionAPI, MessageUpdateEvent } from "@earendil-works/pi-coding-agent";
6
+
7
+ import { OWNED_PI_VIEW_READY, failOwnedPiUi as fail } from "./owned-pi-view.ts";
8
+
9
+ const EVENT_FD = 6;
10
+
11
+ export default function ownedPiUi(pi: ExtensionAPI): void {
12
+ try {
13
+ const channel = fstatSync(EVENT_FD);
14
+ if (!channel.isFIFO() && !channel.isSocket()) throw Error("fd 6 is not an inherited event pipe");
15
+ const output = new Socket({ fd: EVENT_FD, readable: false, writable: true });
16
+ output.on("error", fail);
17
+ let pending = Promise.resolve();
18
+ const send = (event: unknown): Promise<void> => {
19
+ let record: string;
20
+ try {
21
+ record = JSON.stringify(event) + "\n";
22
+ } catch (error) {
23
+ return fail(error);
24
+ }
25
+ pending = pending
26
+ .then(
27
+ () =>
28
+ new Promise<void>((resolve) => {
29
+ output.write(record, (error) => (error ? fail(error) : resolve()));
30
+ }),
31
+ )
32
+ .catch(fail);
33
+ return pending;
34
+ };
35
+ // Keep the previous noninteractive trust policy; native UI must not introduce a blocking trust dialog.
36
+ pi.on("project_trust", (event) => {
37
+ try {
38
+ const agentDir = getAgentDir();
39
+ const remembered = new ProjectTrustStore(agentDir).get(event.cwd);
40
+ const trusted =
41
+ remembered ??
42
+ SettingsManager.create(event.cwd, agentDir, { projectTrusted: false }).getDefaultProjectTrust() === "always";
43
+ return { trusted: trusted ? "yes" : "no", remember: false };
44
+ } catch (error) {
45
+ return fail(error);
46
+ }
47
+ });
48
+ let guardedSession: { sessionManager: unknown; sessionId: unknown } | undefined;
49
+ pi.events.on(OWNED_PI_VIEW_READY, (ready) => {
50
+ if (ready && typeof ready === "object" && "sessionManager" in ready && "sessionId" in ready)
51
+ guardedSession = { sessionManager: ready.sessionManager, sessionId: ready.sessionId };
52
+ });
53
+ let started = false;
54
+ pi.on("session_start", (_event, ctx) => {
55
+ try {
56
+ if (started) throw Error("the owned session cannot be replaced");
57
+ if (
58
+ ctx.mode !== "tui" ||
59
+ guardedSession?.sessionManager !== ctx.sessionManager ||
60
+ guardedSession.sessionId !== ctx.sessionManager.getSessionId()
61
+ )
62
+ throw Error("the native Pi view guard is not ready for this session");
63
+ const header = ctx.sessionManager.getHeader();
64
+ if (
65
+ !header ||
66
+ header.type !== "session" ||
67
+ header.version !== 3 ||
68
+ header.id !== ctx.sessionManager.getSessionId()
69
+ )
70
+ throw Error("missing or mismatched actual Pi session header");
71
+ started = true;
72
+ return send(header);
73
+ } catch (error) {
74
+ return fail(error);
75
+ }
76
+ });
77
+ const forward = (event: unknown): Promise<void> => {
78
+ if (!started) fail("Pi event arrived before the guarded session");
79
+ return send(event);
80
+ };
81
+ pi.on("agent_start", forward);
82
+ pi.on("agent_end", forward);
83
+ pi.on("turn_start", forward);
84
+ pi.on("turn_end", forward);
85
+ pi.on("message_start", forward);
86
+ pi.on("message_end", forward);
87
+ pi.on("tool_execution_start", forward);
88
+ pi.on("tool_execution_update", forward);
89
+ pi.on("tool_execution_end", forward);
90
+ pi.on("message_update", (event: MessageUpdateEvent) => {
91
+ // Match Pi's JSON delta projection without copying growing partial-message snapshots.
92
+ if (event.message.role !== "assistant") fail("message_update is not an assistant message");
93
+ const usage = event.message.usage,
94
+ update = event.assistantMessageEvent;
95
+ if (!("partial" in update)) return forward({ type: event.type, usage, assistantMessageEvent: update });
96
+ const { partial, ...delta } = update;
97
+ if (update.type === "toolcall_start") {
98
+ const tool = partial.content[update.contentIndex];
99
+ if (tool?.type !== "toolCall") fail("toolcall_start lacks its actual tool call");
100
+ return forward({
101
+ type: event.type,
102
+ usage,
103
+ assistantMessageEvent: { ...delta, id: tool.id, toolName: tool.name },
104
+ });
105
+ }
106
+ return forward({ type: event.type, usage, assistantMessageEvent: delta });
107
+ });
108
+ pi.on("agent_settled", async (event, ctx) => {
109
+ await forward(event);
110
+ // The pipe has flushed before orderly shutdown; native receipt/session checks remain authoritative.
111
+ ctx.shutdown();
112
+ });
113
+ } catch (error) {
114
+ fail(error);
115
+ }
116
+ }
@@ -0,0 +1,58 @@
1
+ /** Install FIRST: native Pi remains observable, but only its parent can control work. */
2
+ import { writeSync } from "node:fs";
3
+ import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
4
+
5
+ export const OWNED_PI_VIEW_READY = "pi-daddy:owned-pi-view-ready";
6
+ export function failOwnedPiUi(error: unknown): never {
7
+ try {
8
+ writeSync(2, "pi-daddy: owned Pi UI refused: " + String(error) + "\n");
9
+ } finally {
10
+ process.exit(70);
11
+ }
12
+ }
13
+
14
+ export default function ownedPiView(pi: ExtensionAPI): void {
15
+ try {
16
+ if (typeof pi.registerMarkdownTransformer !== "function") throw Error("Pi lacks its public markdown renderer hook");
17
+ pi.registerMarkdownTransformer((markdown, context) =>
18
+ context.messageType === "assistant-thinking" ? "Thinking hidden" : markdown,
19
+ );
20
+ let guarded = false;
21
+ // No await here: the first session handler installs the guard before another handler can yield.
22
+ pi.on("session_start", (_event, ctx) => {
23
+ try {
24
+ if (guarded) throw Error("the owned session cannot be replaced");
25
+ if (
26
+ ctx.mode !== "tui" ||
27
+ typeof ctx.ui.onTerminalInput !== "function" ||
28
+ typeof ctx.ui.getToolsExpanded !== "function" ||
29
+ typeof ctx.ui.setToolsExpanded !== "function"
30
+ )
31
+ throw Error("Pi lacks the required native TUI controls");
32
+ const unsubscribe = ctx.ui.onTerminalInput((data) => {
33
+ // The renderer consumes this exact terminal response before dispatching any user action.
34
+ if (/^\x1b\[6;\d+;\d+t$/.test(data)) return;
35
+ try {
36
+ if (["\x0f", "\x1b[111;5u", "\x1b[111;5:1u", "\x1b[111;5:2u", "\x1b[27;5;111~"].includes(data))
37
+ ctx.ui.setToolsExpanded(!ctx.ui.getToolsExpanded());
38
+ } catch (error) {
39
+ failOwnedPiUi(error);
40
+ }
41
+ return { consume: true };
42
+ });
43
+ if (typeof unsubscribe !== "function") throw Error("Pi did not install the terminal input guard");
44
+ ctx.ui.setEditorText("");
45
+ ctx.ui.setStatus("pi-daddy-owned", "View only · parent controls the task · Ctrl+O expands tools");
46
+ guarded = true;
47
+ pi.events.emit(OWNED_PI_VIEW_READY, {
48
+ sessionManager: ctx.sessionManager,
49
+ sessionId: ctx.sessionManager.getSessionId(),
50
+ });
51
+ } catch (error) {
52
+ failOwnedPiUi(error);
53
+ }
54
+ });
55
+ } catch (error) {
56
+ failOwnedPiUi(error);
57
+ }
58
+ }
@@ -25,6 +25,8 @@ export interface OwnedChildRunRequest extends ChildRunRequest {
25
25
  onOwnership?: (identity: CapturedWorkerIdentity) => Promise<void> | void;
26
26
  /** JSON protocol consumers observe all bytes without capturing enormous replay streams as answer text. */
27
27
  captureStdout?: boolean;
28
+ /** Actual pane terminal for Pi's native view. Protocol events arrive separately on fd 6. */
29
+ terminalUi?: boolean;
28
30
  /** Bounded diagnostics may truncate without stopping independently captured primary output. */
29
31
  stopOnOutputLimit?: boolean;
30
32
  }
@@ -46,6 +48,8 @@ export async function runOwnedChild(request: OwnedChildRunRequest): Promise<Owne
46
48
  if (request.signal?.aborted) return notStarted("cancelled before helper launch", true);
47
49
  if (process.platform !== "linux" || process.arch !== "x64")
48
50
  return notStarted("captured worker requires qualified Linux x64 helper");
51
+ if (request.terminalUi && (!process.stdin.isTTY || !process.stdout.isTTY || !process.stderr.isTTY))
52
+ return notStarted("native Pi view requires a real pane terminal on stdin, stdout and stderr");
49
53
  let helper: string, root: string, hash: string;
50
54
  const nonce = randomUUID();
51
55
  let binary: import("node:fs/promises").FileHandle | undefined;
@@ -95,13 +99,26 @@ export async function runOwnedChild(request: OwnedChildRunRequest): Promise<Owne
95
99
  {
96
100
  cwd: root,
97
101
  env: request.env,
98
- stdio: ["ignore", "pipe", "pipe", "pipe", "pipe", binary!.fd],
99
- detached: true,
102
+ stdio: request.terminalUi
103
+ ? ["inherit", "inherit", "inherit", "pipe", "pipe", binary!.fd, "pipe"]
104
+ : ["ignore", "pipe", "pipe", "pipe", "pipe", binary!.fd],
105
+ // The UI shares the pane's foreground process group for raw input and SIGWINCH.
106
+ // Cleanup still targets owned descendants by pidfd, never by process group.
107
+ detached: !request.terminalUi,
100
108
  },
101
109
  );
102
110
  void binary!.close();
103
111
  const control = child.stdio[3] as import("node:stream").Duplex;
104
112
  const status = child.stdio[4] as import("node:stream").Readable;
113
+ const streams = {
114
+ stdout: request.terminalUi ? (child.stdio.at(6) as import("node:stream").Readable) : child.stdout,
115
+ stderr: child.stderr,
116
+ };
117
+ const closeObservations = () => {
118
+ streams.stdout?.destroy();
119
+ streams.stderr?.destroy();
120
+ status.destroy();
121
+ };
105
122
  let identity: CapturedWorkerIdentity | undefined;
106
123
  let text = "",
107
124
  count = 0,
@@ -146,9 +163,7 @@ export async function runOwnedChild(request: OwnedChildRunRequest): Promise<Owne
146
163
  stopWatchdog = setTimeout(() => {
147
164
  failure ??= "worker helper failed to establish cleanup before its bound";
148
165
  child.kill("SIGKILL");
149
- child.stdout?.destroy();
150
- child.stderr?.destroy();
151
- status.destroy();
166
+ closeObservations();
152
167
  }, cleanupCeiling + 1000);
153
168
  };
154
169
  function armIdle() {
@@ -160,10 +175,15 @@ export async function runOwnedChild(request: OwnedChildRunRequest): Promise<Owne
160
175
  stop();
161
176
  }, request.idleTimeoutMs);
162
177
  }
163
- child.stdout?.on("data", (bytes) => observe("stdout", bytes));
164
- child.stderr?.on("data", (bytes) => observe("stderr", bytes));
178
+ streams.stdout?.on("data", (bytes: Buffer) => observe("stdout", bytes));
179
+ streams.stderr?.on("data", (bytes: Buffer) => observe("stderr", bytes));
180
+ for (const stream of Object.values(streams))
181
+ stream?.on("error", (error) => {
182
+ failure ??= "child event channel failed: " + String(error);
183
+ stop();
184
+ });
165
185
  for (const stream of ["stdout", "stderr"] as const)
166
- child[stream]?.on("end", () => {
186
+ streams[stream]?.on("end", () => {
167
187
  const tail = decoders[stream].end();
168
188
  if (tail && !(stream === "stdout" && request.captureStdout === false)) {
169
189
  const kept = takeBytes(tail, Math.max(0, (request.maxOutputBytes ?? DEFAULT_MAX_OUTPUT_BYTES) - count));
@@ -276,9 +296,7 @@ export async function runOwnedChild(request: OwnedChildRunRequest): Promise<Owne
276
296
  void (async () => {
277
297
  if (!identity || !(await readCapturedWorkerReceipt(identity))) {
278
298
  failure ??= "helper exited without an independent settlement receipt";
279
- child.stdout?.destroy();
280
- child.stderr?.destroy();
281
- status.destroy();
299
+ closeObservations();
282
300
  }
283
301
  })();
284
302
  });
@@ -80,7 +80,7 @@ export interface PromptOutcome {
80
80
 
81
81
  export interface ApprovalGateOptions {
82
82
  ui: ApprovalUI;
83
- /** pi's `ctx.hasUI` — false in print/json mode, and therefore in every governed child. */
83
+ /** Whether a human can answer here. False in print/json mode and view-only child tabs. */
84
84
  hasUI: boolean;
85
85
  /** pi's `ctx.mode`, quoted back in the refusal so an operator can see why. */
86
86
  mode: string;