pi-crew 0.11.9 → 0.11.10

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": "pi-crew",
3
- "version": "0.11.9",
3
+ "version": "0.11.10",
4
4
  "description": "Pi extension for coordinated AI teams, workflows, worktrees, and async task orchestration",
5
5
  "author": "baphuongna",
6
6
  "license": "MIT",
@@ -620,26 +620,16 @@ export async function openTeamDashboard(ctx: ExtensionContext): Promise<void> {
620
620
  continue;
621
621
  }
622
622
  if (selection.action === "agent-transcript" && (await openTranscriptViewer(cmdCtx, selection.runId))) continue;
623
+ // F1 (2026-10-08): openLiveConversation now owns ALL not-found messaging
624
+ // with a runtime-aware notice (child-process/scaffold runs point at the
625
+ // transcript viewer; live-session runs keep "No live agent found"). Its
626
+ // old fall-through block here fired even on picker-cancel — removed.
623
627
  if (selection.action === "agent-live" && (await openLiveConversation(cmdCtx, selection.runId))) continue;
624
628
  // feat/agents-browser: `b` from the dashboard opens the unified Agents
625
629
  // & Jobs overlay WITHOUT closing the loop — continue reopens the
626
630
  // dashboard underneath, mirroring the transcript/live-conversation
627
631
  // viewers. runId may be "" (no run selected — jobs-only view).
628
632
  if (selection.action === "browser-open" && (await openAgentsJobsBrowser(cmdCtx))) continue;
629
- if (selection.action === "agent-live") {
630
- await notifyCommandResult(
631
- cmdCtx,
632
- commandText({
633
- content: [
634
- {
635
- type: "text",
636
- text: "No live agent found for this run.",
637
- },
638
- ],
639
- }),
640
- );
641
- continue;
642
- }
643
633
  const result =
644
634
  selection.action === "api"
645
635
  ? await handleTeamTool(
@@ -10,6 +10,7 @@ import { requestRenderTarget } from "../../ui/pi-ui-compat.ts";
10
10
  import { asCrewTheme } from "../../ui/theme-adapter.ts";
11
11
  // Lazy-loaded: DurableTranscriptViewer is 658ms — only needed for /crew transcript command
12
12
  import type { DurableTranscriptViewer as DurableTranscriptViewerType } from "../../ui/transcript-viewer.ts";
13
+ import { notifyCommandResult } from "./command-utils.ts";
13
14
 
14
15
  async function getViewer(): Promise<typeof DurableTranscriptViewerType> {
15
16
  // LAZY: DurableTranscriptViewer is 658ms — only needed for /crew transcript.
@@ -68,6 +69,22 @@ export async function openTranscriptViewer(
68
69
  return true;
69
70
  }
70
71
 
72
+ /**
73
+ * F1 (2026-10-08 full-tier battery): notice shown when `V` (live conversation)
74
+ * finds no live agent for a run. With the default child-process runtime the
75
+ * in-process live-agent registry is ALWAYS empty by design — agents run as
76
+ * child Pis and stream transcripts to disk, and only the (ADR-frozen)
77
+ * live-session runtime ever registers handles. The old generic "No live agent
78
+ * found" therefore read as a bug on every child-process run. Route the user
79
+ * to the surface that works instead of a dead end.
80
+ */
81
+ export function liveConversationNotice(runtimeKind: string | undefined): string {
82
+ if (runtimeKind === "child-process" || runtimeKind === "scaffold") {
83
+ return `Live conversation requires the live-session runtime; this run executes via ${runtimeKind} and streams transcripts to disk. Press v (dashboard) or /team-transcript to follow along.`;
84
+ }
85
+ return "No live agent found for this run.";
86
+ }
87
+
71
88
  /** R2: Open live conversation overlay for a running live-session agent. */
72
89
  export async function openLiveConversation(
73
90
  ctx: ExtensionCommandContext,
@@ -78,7 +95,14 @@ export async function openLiveConversation(
78
95
  if (!selected || !ctx.hasUI) return false;
79
96
  const liveAgents = listLiveAgents();
80
97
  const handle = liveAgents.find((h) => h.runId === selected.runId && (selected.taskId ? h.taskId === selected.taskId : true));
81
- if (!handle) return false;
98
+ if (!handle) {
99
+ // F1: runtime-aware notice instead of a dead-end error. Contract change:
100
+ // `true` now also covers "answered with a notice" — `false` means the
101
+ // user cancelled the picker (or no UI), so callers stay silent on false.
102
+ const manifest = loadRunManifestById(ctx.cwd, selected.runId);
103
+ await notifyCommandResult(ctx, liveConversationNotice(manifest?.manifest.runtimeResolution?.kind));
104
+ return true;
105
+ }
82
106
  const theme = asCrewTheme({});
83
107
  await ctx.ui.custom<undefined>(
84
108
  (tui, _theme, _keybindings, done) => {