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 +8 -0
- package/README.md +21 -8
- package/dist/executors/captured-execution.d.ts.map +1 -1
- package/dist/executors/captured-execution.js +12 -1
- package/dist/executors/captured-execution.js.map +1 -1
- package/dist/executors/herdr-launcher.d.ts.map +1 -1
- package/dist/executors/herdr-launcher.js +22 -3
- package/dist/executors/herdr-launcher.js.map +1 -1
- package/dist/executors/owned-pi-ui.d.ts +3 -0
- package/dist/executors/owned-pi-ui.d.ts.map +1 -0
- package/dist/executors/owned-pi-ui.js +114 -0
- package/dist/executors/owned-pi-ui.js.map +1 -0
- package/dist/executors/owned-pi-view.d.ts +5 -0
- package/dist/executors/owned-pi-view.d.ts.map +1 -0
- package/dist/executors/owned-pi-view.js +60 -0
- package/dist/executors/owned-pi-view.js.map +1 -0
- package/dist/executors/owned-worker.d.ts +2 -0
- package/dist/executors/owned-worker.d.ts.map +1 -1
- package/dist/executors/owned-worker.js +27 -11
- package/dist/executors/owned-worker.js.map +1 -1
- package/dist/governance/approval-prompt.d.ts +1 -1
- package/extensions/approvals.ts +3 -2
- package/extensions/execute-child.ts +1 -0
- package/extensions/session.ts +3 -8
- package/package.json +1 -1
- package/src/executors/captured-execution.ts +13 -1
- package/src/executors/herdr-launcher.ts +15 -2
- package/src/executors/owned-pi-ui.ts +116 -0
- package/src/executors/owned-pi-view.ts +58 -0
- package/src/executors/owned-worker.ts +29 -11
- package/src/governance/approval-prompt.ts +1 -1
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.
|
|
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
|
|
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.
|
|
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
|
-
|
|
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.
|
|
278
|
-
|
|
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":"
|
|
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
|
|
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,
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
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":"AAAA,iHAAiH;AACjH,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,aAAa,EAA6B,MAAM,mBAAmB,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,UAAkB,EAAE,KAAa;IACvE,MAAM,MAAM,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAC;IACpC,IAAI,OAAO,GAAG,KAAK,EACjB,aAAa,GAAG,KAAK,EACrB,WAAqC,EACrC,UAAgD,CAAC;IACnD,MAAM,IAAI,GAAG,CAAC,KAAY,EAAE,EAAE;QAC5B,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC,CAAC;IACF,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC,CAAC,CAAC;IAC7E,MAAM,IAAI,GAAG,IAAI,CACf,MAAM,EACN,CAAC,OAAO,EAAE,EAAE;QACV,IAAI,OAAO,EAAE,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC/B,KAAK,CAAC,KAAK,EAAE,CAAC;YACd,UAAU,EAAE,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC,CAAC;YAC3D,OAAO;QACT,CAAC;QACD,IAAI,OAAO,EAAE,IAAI,KAAK,OAAO,IAAI,aAAa,EAAE,CAAC;YAC/C,WAAW,EAAE,EAAE,CAAC;YAChB,WAAW,GAAG,SAAS,CAAC;YACxB,UAAU,GAAG,SAAS,CAAC;YACvB,OAAO;QACT,CAAC;QACD,IAAI,OAAO,EAAE,IAAI,KAAK,SAAS,IAAI,aAAa,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACrF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"herdr-launcher.js","sourceRoot":"","sources":["../../src/executors/herdr-launcher.ts"],"names":[],"mappings":"AAAA,iHAAiH;AACjH,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,aAAa,EAA6B,MAAM,mBAAmB,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,UAAkB,EAAE,KAAa;IACvE,MAAM,MAAM,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAC;IACpC,IAAI,OAAO,GAAG,KAAK,EACjB,aAAa,GAAG,KAAK,EACrB,UAAU,GAAG,KAAK,EAClB,WAAqC,EACrC,UAAgD,CAAC;IACnD,MAAM,IAAI,GAAG,CAAC,KAAY,EAAE,EAAE;QAC5B,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC,CAAC;IACF,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC,CAAC,CAAC;IAC7E,MAAM,IAAI,GAAG,IAAI,CACf,MAAM,EACN,CAAC,OAAO,EAAE,EAAE;QACV,IAAI,OAAO,EAAE,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC/B,KAAK,CAAC,KAAK,EAAE,CAAC;YACd,UAAU,EAAE,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC,CAAC;YAC3D,OAAO;QACT,CAAC;QACD,IAAI,OAAO,EAAE,IAAI,KAAK,OAAO,IAAI,aAAa,EAAE,CAAC;YAC/C,WAAW,EAAE,EAAE,CAAC;YAChB,WAAW,GAAG,SAAS,CAAC;YACxB,UAAU,GAAG,SAAS,CAAC;YACvB,OAAO;QACT,CAAC;QACD,IAAI,OAAO,EAAE,IAAI,KAAK,SAAS,IAAI,aAAa,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACrF,IAAI,CAAC,UAAU;gBAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACpD,OAAO;QACT,CAAC;QACD,IAAI,OAAO,EAAE,IAAI,KAAK,SAAS,IAAI,OAAO,EAAE,CAAC;YAC3C,IAAI,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC,CAAC;YACjD,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;QACD,OAAO,GAAG,IAAI,CAAC;QACf,aAAa,GAAG,IAAI,CAAC;QACrB,MAAM,OAAO,GAAG,OAAO,CAAC,OAA0D,CAAC;QACnF,UAAU,GAAG,OAAO,CAAC,UAAU,KAAK,IAAI,CAAC;QACzC,IAAI,QAA4B,CAAC;QACjC,MAAM,OAAO,GAAG,iBAAiB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACnD,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,KAAK,CAAC,KAAK,IAAI,EAAE;YACf,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;YACnC,IAAI,CAAC;gBACH,IAAI,UAAU,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK;oBAAE,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;gBACtE,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC;oBACjC,GAAG,OAAO;oBACV,MAAM,EAAE,KAAK,CAAC,MAAM;oBACpB,aAAa,EAAE,KAAK,IAAI,EAAE;wBACxB,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW;4BAC9B,CAAC,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;iCAC5B,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC;iCAC7C,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC;4BAC3B,CAAC,CAAC,SAAS,CAAC;wBACd,MAAM,IAAI,GAAG,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,mBAAmB,CAAC,QAAQ,CAAC,CAAC;wBACtF,OAAO,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC;oBAC1F,CAAC;oBACD,WAAW,EAAE,CAAC,QAAQ,EAAE,EAAE,CACxB,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;wBACpC,WAAW,GAAG,OAAO,CAAC;wBACtB,UAAU,GAAG,MAAM,CAAC;wBACpB,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;4BACzB,MAAM,CAAC,KAAK,CAAC,qDAAqD,CAAC,CAAC,CAAC;4BACrE,OAAO;wBACT,CAAC;wBACD,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,CAAC;oBACxC,CAAC,CAAC;oBACJ,aAAa,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;wBAC/B,IAAI,CAAC;4BACH,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;4BACjC,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,MAAM,IAAI,KAAK;gCACzD,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;wBACrG,CAAC;wBAAC,OAAO,KAAK,EAAE,CAAC;4BACf,IAAI,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;wBAC9D,CAAC;oBACH,CAAC;oBACD,WAAW,EAAE,CAAC,MAAM,EAAE,EAAE;wBACtB,IAAI,CAAC;4BACH,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,CAAC;wBACvC,CAAC;wBAAC,MAAM,CAAC,CAAA,CAAC;oBACZ,CAAC;oBACD,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;wBACf,QAAQ,GAAG,GAAG,CAAC;wBACf,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC;wBACvB,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;wBAC/B,IAAI,CAAC,UAAU;4BAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;oBAC9E,CAAC;iBACF,CAAC,CAAC;gBACH,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,KAAK,SAAS,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,KAAK,aAAa,CAAC;gBACvF,gGAAgG;gBAChG,mFAAmF;gBACnF,IAAI,UAAU,IAAI,OAAO;oBAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;gBAC3E,MAAM,eAAe,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBACtD,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;oBACtB,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,eAAe,EAAE,OAAO,IAAI,eAAe,EAAE,CAAC,CAAC;oBAC9E,MAAM,CAAC,GAAG,EAAE,CAAC;gBACf,CAAC;gBACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;YACrE,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBAC9B,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;oBACtB,IAAI,CAAC;wBACH,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;oBACnD,CAAC;4BAAS,CAAC;wBACT,MAAM,CAAC,GAAG,EAAE,CAAC;oBACf,CAAC;gBACH,CAAC;YACH,CAAC;oBAAS,CAAC;gBACT,IAAI,CAAC;oBACH,IAAI,UAAU,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK;wBAAE,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;gBAC1E,CAAC;gBAAC,MAAM,CAAC;oBACP,iFAAiF;gBACnF,CAAC;YACH,CAAC;QACH,CAAC,CAAC,EAAE,CAAC;IACP,CAAC,EACD,IAAI,CACL,CAAC;IACF,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC1C,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE;YAC1B,IAAI,CAAC;gBACH,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;YACjC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,KAAK,CAAC,CAAC;YAChB,CAAC;QACH,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;AACL,CAAC;AACD,IAAI,4BAA4B,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;IAC7D,MAAM,CAAC,EAAE,AAAD,EAAG,IAAI,EAAE,KAAK,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IACvC,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK;QAAE,MAAM,KAAK,CAAC,sDAAsD,CAAC,CAAC;IACzF,MAAM,iBAAiB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AACvC,CAAC"}
|
|
@@ -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,
|
|
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:
|
|
76
|
-
|
|
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
|
-
|
|
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
|
-
|
|
142
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
/**
|
|
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;
|
package/extensions/approvals.ts
CHANGED
|
@@ -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
|
-
|
|
237
|
-
|
|
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) => {
|
package/extensions/session.ts
CHANGED
|
@@ -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
|
-
//
|
|
698
|
-
//
|
|
699
|
-
|
|
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.
|
|
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
|
|
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:
|
|
99
|
-
|
|
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
|
-
|
|
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
|
-
|
|
164
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
/**
|
|
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;
|