@braintrust/pi-extension 0.2.0 → 0.3.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@braintrust/pi-extension",
3
- "version": "0.2.0",
3
+ "version": "0.3.1",
4
4
  "description": "Braintrust extension for pi. Includes automatic tracing for pi sessions, turns, LLM calls, and tool executions to Braintrust.",
5
5
  "keywords": [
6
6
  "braintrust",
@@ -24,17 +24,16 @@
24
24
  "access": "public"
25
25
  },
26
26
  "dependencies": {
27
- "braintrust": "^3.7.0",
27
+ "braintrust": "^3.8.0",
28
28
  "valibot": "^1.3.1"
29
29
  },
30
30
  "devDependencies": {
31
- "@mariozechner/pi-ai": "^0.64.0",
32
- "@mariozechner/pi-coding-agent": "^0.64.0",
33
- "@types/node": "^25.5.0",
34
- "tsx": "^4.21.0",
31
+ "@mariozechner/pi-ai": "^0.67.2",
32
+ "@mariozechner/pi-coding-agent": "^0.67.2",
33
+ "@types/node": "^25.6.0",
35
34
  "typescript": "^6.0.2",
36
- "vite-plus": "^0.1.14",
37
- "vitest": "^4.1.2"
35
+ "vite-plus": "^0.1.16",
36
+ "vitest": "^4.1.4"
38
37
  },
39
38
  "peerDependencies": {
40
39
  "@mariozechner/pi-coding-agent": "*"
@@ -66,6 +65,6 @@
66
65
  "test:integration": "vitest run src/index.integration.test.ts",
67
66
  "test:watch": "vitest",
68
67
  "typecheck": "vp check",
69
- "smoke": "tsx -e \"import('./src/index.ts')\""
68
+ "smoke": "vp exec node -e \"import('./src/index.ts')\""
70
69
  }
71
70
  }
@@ -433,6 +433,9 @@ async function createHarness(options?: {
433
433
  return { agentDir, cwd, session, stateDir };
434
434
  }
435
435
 
436
+ // TODO: Remove this legacy fallback once our supported pi compatibility window no
437
+ // longer includes pi <0.65.0, which introduced the session runtime API and the
438
+ // session_start-only post-transition model.
436
439
  const resourceLoader = new DefaultResourceLoader({
437
440
  cwd,
438
441
  agentDir,
@@ -447,26 +450,32 @@ async function createHarness(options?: {
447
450
  resourceLoader,
448
451
  sessionManager,
449
452
  });
453
+ const legacyRuntimeSession = legacySession as typeof legacySession & {
454
+ newSession(): Promise<boolean>;
455
+ switchSession(sessionPath: string): Promise<boolean>;
456
+ fork(entryId: string): Promise<{ cancelled: boolean; selectedText?: string }>;
457
+ sessionManager: SessionManager;
458
+ };
450
459
 
451
460
  const session: TestSessionController = {
452
- prompt: (text) => legacySession.prompt(text),
453
- newSession: () => legacySession.newSession(),
454
- switchSession: (sessionPath) => legacySession.switchSession(sessionPath),
461
+ prompt: (text) => legacyRuntimeSession.prompt(text),
462
+ newSession: () => legacyRuntimeSession.newSession(),
463
+ switchSession: (sessionPath) => legacyRuntimeSession.switchSession(sessionPath),
455
464
  fork: async (entryId) => {
456
- const result = await legacySession.fork(entryId);
465
+ const result = await legacyRuntimeSession.fork(entryId);
457
466
  return {
458
467
  cancelled: result.cancelled,
459
- selectedText: result.selectedText,
468
+ selectedText: result.selectedText ?? "",
460
469
  };
461
470
  },
462
471
  dispose: async () => {
463
- legacySession.dispose();
472
+ legacyRuntimeSession.dispose();
464
473
  },
465
474
  get sessionFile() {
466
- return legacySession.sessionFile;
475
+ return legacyRuntimeSession.sessionFile;
467
476
  },
468
477
  get sessionManager() {
469
- return legacySession.sessionManager;
478
+ return legacyRuntimeSession.sessionManager;
470
479
  },
471
480
  };
472
481
 
package/src/index.ts CHANGED
@@ -622,12 +622,21 @@ export default function braintrustPiExtension(pi: ExtensionAPI): void {
622
622
  });
623
623
  });
624
624
 
625
- pi.on("session_switch", async (event, ctx) => {
625
+ // TODO: Remove these legacy transition listeners once our compatibility window
626
+ // no longer includes pi <0.65.0.
627
+ const legacyPi = pi as ExtensionAPI & {
628
+ on(
629
+ event: "session_switch" | "session_fork",
630
+ handler: (event: unknown, ctx: ExtensionContext) => Promise<void> | void,
631
+ ): void;
632
+ };
633
+
634
+ legacyPi.on("session_switch", async (event, ctx) => {
626
635
  refreshTracingUi(ctx);
627
636
  await rolloverSession(ctx, "session_switch", getPreviousSessionFile(event));
628
637
  });
629
638
 
630
- pi.on("session_fork", async (event, ctx) => {
639
+ legacyPi.on("session_fork", async (event, ctx) => {
631
640
  refreshTracingUi(ctx);
632
641
  await rolloverSession(ctx, "session_fork", getPreviousSessionFile(event));
633
642
  });