@astralyn/pi 0.87.0 → 0.87.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/dist/bundle/chunks/{anthropic-messages-R2LYJUDD.js → anthropic-messages-XWFTZP2N.js} +1 -1
  3. package/dist/bundle/chunks/{chunk-RKLIHRPH.js → chunk-772GXEFD.js} +18 -18
  4. package/dist/bundle/chunks/{chunk-INDBRWNK.js → chunk-CDMUKIXY.js} +1 -1
  5. package/dist/bundle/chunks/github-copilot.js +1 -1
  6. package/dist/bundle/chunks/{openai-completions-JZCEEJ43.js → openai-completions-SHS3CAEL.js} +1 -1
  7. package/dist/bundle/chunks/{virtual-modules-CG7NJ5WO.js → virtual-modules-LQO2MG3T.js} +1 -1
  8. package/dist/bundle/cli.js +1 -1
  9. package/dist/bundle/index.js +1 -1
  10. package/dist/bundle/rpc-entry.js +1 -1
  11. package/dist/cli/args.d.ts.map +1 -1
  12. package/dist/cli/args.js +14 -4
  13. package/dist/cli/args.js.map +1 -1
  14. package/dist/core/agent-session.d.ts +16 -0
  15. package/dist/core/agent-session.d.ts.map +1 -1
  16. package/dist/core/agent-session.js +81 -13
  17. package/dist/core/agent-session.js.map +1 -1
  18. package/dist/core/background/service.d.ts +9 -0
  19. package/dist/core/background/service.d.ts.map +1 -1
  20. package/dist/core/background/service.js +13 -1
  21. package/dist/core/background/service.js.map +1 -1
  22. package/dist/core/background/session.d.ts +5 -0
  23. package/dist/core/background/session.d.ts.map +1 -1
  24. package/dist/core/background/session.js +2 -1
  25. package/dist/core/background/session.js.map +1 -1
  26. package/dist/core/compaction/compaction.js +9 -9
  27. package/dist/core/compaction/compaction.js.map +1 -1
  28. package/dist/core/model-resolver.js +1 -1
  29. package/dist/core/model-resolver.js.map +1 -1
  30. package/docs/bundled/extensions/background.md +3 -3
  31. package/docs/bundled/extensions/subagent.md +1 -1
  32. package/docs/compaction.md +1 -1
  33. package/docs/sdk.md +1 -1
  34. package/docs/usage.md +3 -0
  35. package/examples/README.md +11 -1
  36. package/examples/rpc-client.ts +35 -0
  37. package/examples/rpc-extension-ui.ts +25 -5
  38. package/npm-shrinkwrap.json +43 -43
  39. package/package.json +8 -8
@@ -17,7 +17,7 @@ Pi has two summarization mechanisms:
17
17
  | Compaction | Context exceeds threshold, or `/compact` | Summarize old messages to free up context |
18
18
  | Branch summarization | `/tree` navigation | Preserve context when switching branches |
19
19
 
20
- Both use the same structured summary format and track file operations cumulatively. Compaction and branch-summary requests use fresh routing session IDs and, where supported by the provider, disable prompt-cache writes because these one-off prompts are unlikely to be reused.
20
+ Both use the same structured summary format and track file operations cumulatively. Summarization requests disable prompt-cache writes because these one-off prompts are unlikely to be reused.
21
21
 
22
22
  ## Compaction
23
23
 
package/docs/sdk.md CHANGED
@@ -280,7 +280,7 @@ An embedding can opt in with `await session.bindExtensions({ backgroundEnabled:
280
280
  The host must choose:
281
281
 
282
282
  - **Lifetime and cancellation:** a settled main-agent turn is not the end of background work. `session.abort()` cancels foreground-owned work, not detached work. Use `session.background.kill(id)` for a whole execution, or `await session.background.shutdown(graceMs?)` to close admission, cancel all owned work and drain within a bounded grace period (default 2 seconds, maximum 60 seconds). A non-cooperating executor can outlive that grace period.
283
- - **Result-driven turns and cost:** automatic completions can trigger new model turns at safe idle boundaries, after queued user work. Use the nestable `session.pauseBackgroundNotifications()` to defer delivery; its returned release function is idempotent. Pausing does not stop execution or its costs. Budget worker activity and completion-triggered turns explicitly.
283
+ - **Result-driven turns and cost:** automatic completions join the host's prompt queue, so a running turn receives them as steering and an idle session starts a completion turn. Use the nestable `session.pauseBackgroundNotifications()` to defer delivery; its returned release function is idempotent. Pausing does not stop execution or its costs. Budget worker activity and completion-triggered turns explicitly.
284
284
  - **Observation and delivery:** `session.background` exposes the [public supervision methods](extensions.md#ctxbackground). `read()` and `wait()` observe; a terminal snapshot alone does not acknowledge model delivery. The bundled `bg wait` result carries `details.backgroundTaskId`, which the host acknowledges only after persisting the tool result. A direct SDK waiter that consumes the result outside model history can explicitly call `session.background.markDelivered(task.id)` after successful consumption. A timeout or cancelled wait does not stop the execution. Failed notification delivery leaves the result available for inspection; after fixing the host failure, call `session.retryBackgroundNotifications()` explicitly. Pi does not retry a failed delivery forever on a timer.
285
285
  - **Shutdown:** `await runtime.dispose()` handles background shutdown and extension lifecycle when using the runtime API. For a directly owned session, drain Background, abort the main agent, then dispose; synchronous `session.dispose()` alone is not an awaited drain.
286
286
 
package/docs/usage.md CHANGED
@@ -168,10 +168,13 @@ See [Pi Packages](packages.md) for package sources and security notes.
168
168
  |------|-------------|
169
169
  | default | Interactive mode |
170
170
  | `-p`, `--print` | Print response and exit |
171
+ | `--mode text` | Text output; still opens the terminal UI when stdin and stdout are terminals |
171
172
  | `--mode json` | Output all events as JSON lines; see [JSON mode](json.md) |
172
173
  | `--mode rpc` | RPC mode over stdin/stdout; see [RPC mode](rpc.md) |
173
174
  | `--export <in> [out]` | Export a session to HTML |
174
175
 
176
+ `--mode` accepts only `text`, `json`, or `rpc`. A missing or invalid value is reported as an error and pi exits with a nonzero status instead of falling back to another mode.
177
+
175
178
  In print mode, pi also reads piped stdin and merges it into the initial prompt:
176
179
 
177
180
  ```bash
@@ -1,9 +1,18 @@
1
1
  # Examples
2
2
 
3
- Example code for the `@astralyn/pi` SDK and extensions.
3
+ Example code for the `@astralyn/pi` SDK, process integration, and extensions.
4
4
 
5
5
  ## Standalone
6
6
 
7
+ ### [rpc-client.ts](rpc-client.ts)
8
+ Runs one prompt through a Pi RPC child process with the typed `RpcClient`: it starts Pi, streams events, and waits for the run to settle.
9
+
10
+ Build the package before running it from a repository checkout:
11
+
12
+ ```bash
13
+ npx tsx examples/rpc-client.ts "Explain this repository"
14
+ ```
15
+
7
16
  ### [rpc-extension-ui.ts](rpc-extension-ui.ts)
8
17
  A lightweight RPC chat client that handles extension UI requests; pair it with [the RPC demo extension](extensions/rpc-demo.ts).
9
18
 
@@ -26,5 +35,6 @@ Example extensions demonstrating:
26
35
  ## Documentation
27
36
 
28
37
  - [SDK Reference](sdk/README.md)
38
+ - [RPC Protocol](../docs/rpc.md)
29
39
  - [Extensions Documentation](../docs/extensions.md)
30
40
  - [Skills Documentation](../docs/skills.md)
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Run one prompt through a Pi RPC child process.
3
+ *
4
+ * Build the coding-agent package first, then run:
5
+ * npx tsx examples/rpc-client.ts "Explain this repository"
6
+ */
7
+
8
+ import { dirname, join } from "node:path";
9
+ import { fileURLToPath } from "node:url";
10
+ import { RpcClient } from "@astralyn/pi";
11
+
12
+ const exampleDirectory = dirname(fileURLToPath(import.meta.url));
13
+ const prompt = process.argv.slice(2).join(" ") || "Explain this repository in one paragraph.";
14
+
15
+ const client = new RpcClient({
16
+ cliPath: join(exampleDirectory, "../dist/cli.js"),
17
+ args: ["--no-session"],
18
+ });
19
+
20
+ const unsubscribe = client.onEvent((event) => {
21
+ if (event.type === "message_update" && event.assistantMessageEvent.type === "text_delta") {
22
+ process.stdout.write(event.assistantMessageEvent.delta);
23
+ } else if (event.type === "tool_execution_start") {
24
+ process.stderr.write(`\n[tool: ${event.toolName}]\n`);
25
+ }
26
+ });
27
+
28
+ try {
29
+ await client.start();
30
+ await client.promptAndWait(prompt);
31
+ process.stdout.write("\n");
32
+ } finally {
33
+ unsubscribe();
34
+ await client.stop();
35
+ }
@@ -16,7 +16,7 @@
16
16
 
17
17
  import { spawn } from "node:child_process";
18
18
  import { dirname, join } from "node:path";
19
- import * as readline from "node:readline";
19
+ import { StringDecoder } from "node:string_decoder";
20
20
  import { fileURLToPath } from "node:url";
21
21
  import {
22
22
  type Component,
@@ -258,7 +258,7 @@ async function main() {
258
258
 
259
259
  const agent = spawn(
260
260
  "node",
261
- [cliPath, "--mode", "rpc", "--no-session", "--no-extension", "--extension", extensionPath],
261
+ [cliPath, "--mode", "rpc", "--no-session", "--no-extensions", "--extension", extensionPath],
262
262
  { stdio: ["pipe", "pipe", "pipe"] },
263
263
  );
264
264
 
@@ -518,9 +518,7 @@ async function main() {
518
518
 
519
519
  // -- Process agent stdout --
520
520
 
521
- const stdoutRl = readline.createInterface({ input: agent.stdout!, terminal: false });
522
-
523
- stdoutRl.on("line", (line) => {
521
+ function handleAgentLine(line: string): void {
524
522
  let data: Record<string, unknown>;
525
523
  try {
526
524
  data = JSON.parse(line);
@@ -583,6 +581,28 @@ async function main() {
583
581
  tui.requestRender();
584
582
  return;
585
583
  }
584
+ }
585
+
586
+ const stdoutDecoder = new StringDecoder("utf8");
587
+ let stdoutBuffer = "";
588
+
589
+ agent.stdout!.on("data", (chunk: Buffer) => {
590
+ stdoutBuffer += stdoutDecoder.write(chunk);
591
+ while (true) {
592
+ const newlineIndex = stdoutBuffer.indexOf("\n");
593
+ if (newlineIndex === -1) break;
594
+
595
+ const line = stdoutBuffer.slice(0, newlineIndex);
596
+ stdoutBuffer = stdoutBuffer.slice(newlineIndex + 1);
597
+ handleAgentLine(line.endsWith("\r") ? line.slice(0, -1) : line);
598
+ }
599
+ });
600
+
601
+ agent.stdout!.on("end", () => {
602
+ stdoutBuffer += stdoutDecoder.end();
603
+ if (stdoutBuffer.length > 0) {
604
+ handleAgentLine(stdoutBuffer.endsWith("\r") ? stdoutBuffer.slice(0, -1) : stdoutBuffer);
605
+ }
586
606
  });
587
607
 
588
608
  // -- User input --
@@ -1,18 +1,18 @@
1
1
  {
2
2
  "name": "@astralyn/pi",
3
- "version": "0.87.0",
3
+ "version": "0.87.1",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@astralyn/pi",
9
- "version": "0.87.0",
9
+ "version": "0.87.1",
10
10
  "license": "MIT",
11
11
  "dependencies": {
12
- "@earendil-works/chord": "0.87.0",
13
- "@earendil-works/pi-agent-core": "0.87.0",
14
- "@earendil-works/pi-ai": "0.87.0",
15
- "@earendil-works/pi-tui": "0.87.0",
12
+ "@earendil-works/chord": "0.87.1",
13
+ "@earendil-works/pi-agent-core": "0.87.1",
14
+ "@earendil-works/pi-ai": "0.87.1",
15
+ "@earendil-works/pi-tui": "0.87.1",
16
16
  "@silvia-odwyer/photon-node": "0.3.4",
17
17
  "chalk": "6.0.0",
18
18
  "cross-spawn": "7.0.6",
@@ -36,9 +36,9 @@
36
36
  "@anthropic-ai/sandbox-runtime": "0.0.26",
37
37
  "@anthropic-ai/sdk": "0.52.0",
38
38
  "@biomejs/biome": "2.3.5",
39
- "@earendil-works/pi-client": "0.87.0",
40
- "@earendil-works/pi-protocol": "0.87.0",
41
- "@earendil-works/pi-server": "0.87.0",
39
+ "@earendil-works/pi-client": "0.87.1",
40
+ "@earendil-works/pi-protocol": "0.87.1",
41
+ "@earendil-works/pi-server": "0.87.1",
42
42
  "@types/cross-spawn": "6.0.6",
43
43
  "@types/hosted-git-info": "3.0.5",
44
44
  "@types/ms": "2.1.0",
@@ -626,9 +626,9 @@
626
626
  }
627
627
  },
628
628
  "node_modules/@earendil-works/chord": {
629
- "version": "0.87.0",
630
- "resolved": "https://registry.npmjs.org/@earendil-works/chord/-/chord-0.87.0.tgz",
631
- "integrity": "sha512-t8QOTf0GTHrsDSfcdtXuA9RCkh6mnR4l25N0SM/sgH7Ih25jH4tGXNbkGs9MWpV5xTu9MRPj4A7Zn1UEwQm9+g==",
629
+ "version": "0.87.1",
630
+ "resolved": "https://registry.npmjs.org/@earendil-works/chord/-/chord-0.87.1.tgz",
631
+ "integrity": "sha512-bg7IkJGFcEaMqqYgOGUiq5Ky9RghpRfrlZ8I/v/1b4bBZ02A7t3E+6uhPRbadwWb/kWsnVFbZsqOKRN4a3LLCg==",
632
632
  "license": "MIT",
633
633
  "dependencies": {
634
634
  "esbuild": "0.28.2"
@@ -638,14 +638,14 @@
638
638
  }
639
639
  },
640
640
  "node_modules/@earendil-works/pi-agent-core": {
641
- "version": "0.87.0",
642
- "resolved": "https://registry.npmjs.org/@earendil-works/pi-agent-core/-/pi-agent-core-0.87.0.tgz",
643
- "integrity": "sha512-c5b2FMdJ7C++HBa6AyBmusdf96gdgRqpF7J+UCq2yVGB28UETJvJ190HkgDWUaLPnOQQPbanjKMAm/TgRmFE2w==",
641
+ "version": "0.87.1",
642
+ "resolved": "https://registry.npmjs.org/@earendil-works/pi-agent-core/-/pi-agent-core-0.87.1.tgz",
643
+ "integrity": "sha512-Zev3B0HK7YS5A4EZQ2XnEqiJuirx6QBiltJ+LpmjV5a/+2IU0cfKtIfnkNkORK707XOvKBY2WRtk7cAwHpbh2Q==",
644
644
  "license": "MIT",
645
645
  "dependencies": {
646
- "@earendil-works/chord": "^0.87.0",
647
- "@earendil-works/pi-ai": "^0.87.0",
648
- "@earendil-works/pi-telemetry": "^0.87.0",
646
+ "@earendil-works/chord": "^0.87.1",
647
+ "@earendil-works/pi-ai": "^0.87.1",
648
+ "@earendil-works/pi-telemetry": "^0.87.1",
649
649
  "diff": "8.0.4",
650
650
  "ignore": "7.0.8",
651
651
  "typebox": "1.3.27",
@@ -656,14 +656,14 @@
656
656
  }
657
657
  },
658
658
  "node_modules/@earendil-works/pi-ai": {
659
- "version": "0.87.0",
660
- "resolved": "https://registry.npmjs.org/@earendil-works/pi-ai/-/pi-ai-0.87.0.tgz",
661
- "integrity": "sha512-lbRm+EMY6Jx3l+HLpbqbm9Yrhkc5u7EffLk2id+zJQEoBuR5I+tijGiZU8zlnuuCclmQOgH0PVjL9PLbeqJ9MQ==",
659
+ "version": "0.87.1",
660
+ "resolved": "https://registry.npmjs.org/@earendil-works/pi-ai/-/pi-ai-0.87.1.tgz",
661
+ "integrity": "sha512-X/3PfQBnnoeVdO9Cv8zHghUMglzlgNZYGNzoPnbRoGnHl3Rw3TlA2UKSUB7BRHUOxMryHXYa8dnjWZlbRheDZA==",
662
662
  "license": "MIT",
663
663
  "dependencies": {
664
664
  "@anthropic-ai/sdk": "0.124.0",
665
665
  "@aws-sdk/client-bedrock-runtime": "3.1127.0",
666
- "@earendil-works/pi-telemetry": "^0.87.0",
666
+ "@earendil-works/pi-telemetry": "^0.87.1",
667
667
  "@google/genai": "2.21.0",
668
668
  "@smithy/node-http-handler": "4.12.1",
669
669
  "http-proxy-agent": "9.1.0",
@@ -701,27 +701,27 @@
701
701
  }
702
702
  },
703
703
  "node_modules/@earendil-works/pi-client": {
704
- "version": "0.87.0",
705
- "resolved": "https://registry.npmjs.org/@earendil-works/pi-client/-/pi-client-0.87.0.tgz",
706
- "integrity": "sha512-SzlKFULcz3VchpfVizd9fTxaFHxhIe/Dpn9CDHthqRzUx6Sym2tWwlveqdjD4V81yid+r7VEziZuHYYqNt4+kA==",
704
+ "version": "0.87.1",
705
+ "resolved": "https://registry.npmjs.org/@earendil-works/pi-client/-/pi-client-0.87.1.tgz",
706
+ "integrity": "sha512-x8dfZ7ppAao9SDnZvD5/DErVdq2fI7hg4lFj7qEhtgo6wimrRafGSLsqLklFVjb6kxU2W3j9F4RZz0rRcb0cwA==",
707
707
  "dev": true,
708
708
  "license": "MIT",
709
709
  "dependencies": {
710
- "@earendil-works/chord": "^0.87.0",
711
- "@earendil-works/pi-protocol": "^0.87.0"
710
+ "@earendil-works/chord": "^0.87.1",
711
+ "@earendil-works/pi-protocol": "^0.87.1"
712
712
  },
713
713
  "engines": {
714
714
  "node": ">=22.19.0"
715
715
  }
716
716
  },
717
717
  "node_modules/@earendil-works/pi-protocol": {
718
- "version": "0.87.0",
719
- "resolved": "https://registry.npmjs.org/@earendil-works/pi-protocol/-/pi-protocol-0.87.0.tgz",
720
- "integrity": "sha512-H6tL0BGj5RbvwPQq7YnaGSudASvmPbHBP3FVqeIIJa91hURB6DdKCmITQkJwQz8nR/bc4B/r2tZXgzlVTBYOrQ==",
718
+ "version": "0.87.1",
719
+ "resolved": "https://registry.npmjs.org/@earendil-works/pi-protocol/-/pi-protocol-0.87.1.tgz",
720
+ "integrity": "sha512-48WVjryAIiKOJXnKgO15h2MT/oeH5uf0S4DykcVj3ZrxMTDSGxcUaS5VtvHtFQ1rZSSIjkVcblE13k0GksBuoQ==",
721
721
  "dev": true,
722
722
  "license": "MIT",
723
723
  "dependencies": {
724
- "@earendil-works/chord": "^0.87.0",
724
+ "@earendil-works/chord": "^0.87.1",
725
725
  "typebox": "1.3.27"
726
726
  },
727
727
  "engines": {
@@ -729,33 +729,33 @@
729
729
  }
730
730
  },
731
731
  "node_modules/@earendil-works/pi-server": {
732
- "version": "0.87.0",
733
- "resolved": "https://registry.npmjs.org/@earendil-works/pi-server/-/pi-server-0.87.0.tgz",
734
- "integrity": "sha512-hnxO8xe1iUIvPiPiVmj/UkfVTeOHPam2b62FuvB4OJRqhqDCVRPec+KJZST70c9rb+v1QTQnbimeNop5Ji5N5A==",
732
+ "version": "0.87.1",
733
+ "resolved": "https://registry.npmjs.org/@earendil-works/pi-server/-/pi-server-0.87.1.tgz",
734
+ "integrity": "sha512-EZYQ6mSOv7IyDcWoBflNGJcyIBjTnQY9W4z1tF3vOMY5xbksHOsVVzU9Kh49z8iIXGYNawKZSyjaWi9OJjO7Sw==",
735
735
  "dev": true,
736
736
  "license": "MIT",
737
737
  "dependencies": {
738
- "@earendil-works/chord": "^0.87.0",
739
- "@earendil-works/pi-agent-core": "^0.87.0",
740
- "@earendil-works/pi-protocol": "^0.87.0"
738
+ "@earendil-works/chord": "^0.87.1",
739
+ "@earendil-works/pi-agent-core": "^0.87.1",
740
+ "@earendil-works/pi-protocol": "^0.87.1"
741
741
  },
742
742
  "engines": {
743
743
  "node": ">=22.19.0"
744
744
  }
745
745
  },
746
746
  "node_modules/@earendil-works/pi-telemetry": {
747
- "version": "0.87.0",
748
- "resolved": "https://registry.npmjs.org/@earendil-works/pi-telemetry/-/pi-telemetry-0.87.0.tgz",
749
- "integrity": "sha512-IEUMnV6mgHyOMfAxa4CKXoBKKfHM8KxNjbXWM4Bps/iLJcFMf8hQsEZ+95VnVTc7C0cU77Rmdxt773C35jb5AA==",
747
+ "version": "0.87.1",
748
+ "resolved": "https://registry.npmjs.org/@earendil-works/pi-telemetry/-/pi-telemetry-0.87.1.tgz",
749
+ "integrity": "sha512-MC6TRQH5lgMXpcN+Vku2WMI2T8BsiUPzMQHGo81uqFZD3/9O79WWJAysEDGuzduP6R4tvtgwMLwmqIxynM10JQ==",
750
750
  "license": "MIT",
751
751
  "engines": {
752
752
  "node": ">=22.19.0"
753
753
  }
754
754
  },
755
755
  "node_modules/@earendil-works/pi-tui": {
756
- "version": "0.87.0",
757
- "resolved": "https://registry.npmjs.org/@earendil-works/pi-tui/-/pi-tui-0.87.0.tgz",
758
- "integrity": "sha512-7gTC0XOgQfVWg4yGxwHINBpCnGl9p4KEC7PXIc8gAwc/cyxSW4VuFQrp+r1YD3oM+rBkoepKwAt6w6+VJ7BCaw==",
756
+ "version": "0.87.1",
757
+ "resolved": "https://registry.npmjs.org/@earendil-works/pi-tui/-/pi-tui-0.87.1.tgz",
758
+ "integrity": "sha512-YEH2vRyOeiO7hhN6j6AE6YwKSq2Kz2f3XR8bj1TbR+aGE/JsnY1hLPMI2pvaZfRM1n9Y00tejxFQ4zbzvF7nkQ==",
759
759
  "license": "MIT",
760
760
  "dependencies": {
761
761
  "get-east-asian-width": "1.6.0",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@astralyn/pi",
3
- "version": "0.87.0",
3
+ "version": "0.87.1",
4
4
  "description": "Coding agent CLI with read, bash, edit, write tools and session management",
5
5
  "type": "module",
6
6
  "piConfig": {
@@ -62,10 +62,10 @@
62
62
  "prepublishOnly": "npm run clean && npm run build"
63
63
  },
64
64
  "dependencies": {
65
- "@earendil-works/chord": "0.87.0",
66
- "@earendil-works/pi-agent-core": "0.87.0",
67
- "@earendil-works/pi-ai": "0.87.0",
68
- "@earendil-works/pi-tui": "0.87.0",
65
+ "@earendil-works/chord": "0.87.1",
66
+ "@earendil-works/pi-agent-core": "0.87.1",
67
+ "@earendil-works/pi-ai": "0.87.1",
68
+ "@earendil-works/pi-tui": "0.87.1",
69
69
  "@silvia-odwyer/photon-node": "0.3.4",
70
70
  "chalk": "6.0.0",
71
71
  "cross-spawn": "7.0.6",
@@ -86,9 +86,9 @@
86
86
  "@anthropic-ai/sandbox-runtime": "0.0.26",
87
87
  "@anthropic-ai/sdk": "0.52.0",
88
88
  "@biomejs/biome": "2.3.5",
89
- "@earendil-works/pi-client": "0.87.0",
90
- "@earendil-works/pi-protocol": "0.87.0",
91
- "@earendil-works/pi-server": "0.87.0",
89
+ "@earendil-works/pi-client": "0.87.1",
90
+ "@earendil-works/pi-protocol": "0.87.1",
91
+ "@earendil-works/pi-server": "0.87.1",
92
92
  "@types/cross-spawn": "6.0.6",
93
93
  "@types/hosted-git-info": "3.0.5",
94
94
  "@types/ms": "2.1.0",