@esso0428/pi-subagents 0.17.14 → 0.17.15

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
@@ -7,7 +7,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
- ## [0.17.14] - 2026-10-01
10
+ ## [0.17.15] - 2026-09-30
11
+
12
+ ### Changed
13
+ - **Removed the deprecated FleetView UI and its settings/runtime wiring**, leaving the Agents widget and workflow menu as the supported status surfaces.
14
+ - **Capped Vitest at four workers** so local, CI, E2E, and prepublish test runs avoid CPU saturation on common development hosts.
15
+
16
+ ### Fixed
17
+ - **Reduced Agents widget redraw latency** by making UI refresh requests use normal unforced renders by default.
18
+
19
+ ## [0.17.14] - 2026-09-30
11
20
 
12
21
  ### Fixed
13
22
  - **Restored focus-gated selector routing** so agent history selectors receive navigation input without suspending the background Agents widget.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,EAAc,KAAK,YAAY,EAA8G,MAAM,iCAAiC,CAAC;AAC5L,OAAO,EAAE,SAAS,EAA2F,MAAM,wBAAwB,CAAC;AAyB5I,OAAO,EAAE,KAAK,WAAW,EAAuK,MAAM,YAAY,CAAC;AAEnN,OAAO,EAeL,KAAK,KAAK,EAEX,MAAM,sBAAsB,CAAC;AAM9B,OAAO,EAA2B,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AAChG,OAAO,EAAE,mBAAmB,EAAE,KAAK,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAmBrG,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,GACvB,SAAS,CAKX;AAgKD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,WAAW,GAAG,SAAS,GAAG,MAAM,CAatE;AAED,6DAA6D;AAC7D,eAAO,MAAM,kBAAkB,4BAA4B,CAAC;AAE5D;;;;GAIG;AACH,OAAO,EAAE,2BAA2B,EAAE,mBAAmB,EAAE,KAAK,iBAAiB,EAAE,iBAAiB,EAAE,CAAC;AAEvG,MAAM,CAAC,OAAO,WAAW,EAAE,EAAE,YAAY,QAiuHxC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,EAAc,KAAK,YAAY,EAA8G,MAAM,iCAAiC,CAAC;AAC5L,OAAO,EAAE,SAAS,EAA2F,MAAM,wBAAwB,CAAC;AAyB5I,OAAO,EAAE,KAAK,WAAW,EAAuK,MAAM,YAAY,CAAC;AAEnN,OAAO,EAeL,KAAK,KAAK,EAEX,MAAM,sBAAsB,CAAC;AAK9B,OAAO,EAA2B,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AAChG,OAAO,EAAE,mBAAmB,EAAE,KAAK,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAmBrG,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,GACvB,SAAS,CAKX;AAgKD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,WAAW,GAAG,SAAS,GAAG,MAAM,CAatE;AAED,6DAA6D;AAC7D,eAAO,MAAM,kBAAkB,4BAA4B,CAAC;AAE5D;;;;GAIG;AACH,OAAO,EAAE,2BAA2B,EAAE,mBAAmB,EAAE,KAAK,iBAAiB,EAAE,iBAAiB,EAAE,CAAC;AAEvG,MAAM,CAAC,OAAO,WAAW,EAAE,EAAE,YAAY,QAonHxC"}
package/dist/index.js CHANGED
@@ -39,10 +39,9 @@ import { applyAndEmitLoaded, loadSettings, saveAndEmitChanged } from "./settings
39
39
  import { getForegroundOutcomeNote, getStatusNote, partialOutputSuffix } from "./status-note.js";
40
40
  import { createMentionProvider, mentionRoster } from "./ui/agent-mention.js";
41
41
  import { AgentWidget, buildInvocationTags, describeActivity, fgPreservingNestedStyles, formatCost, formatDuration, formatMs, formatTokens, formatTurns, getDisplayName, getPromptModeLabel, SPINNER, } from "./ui/agent-widget.js";
42
- import { FleetList } from "./ui/fleet-list.js";
43
42
  import { showSchedulesMenu } from "./ui/schedule-menu.js";
44
43
  import { renderWorkflowCard, renderWorkflowEntryCard } from "./ui/workflow-card.js";
45
- import { openWorkflowFromFleet, showWorkflowsMenu } from "./ui/workflow-menu.js";
44
+ import { showWorkflowsMenu } from "./ui/workflow-menu.js";
46
45
  import { getLifetimeCost, getLifetimeTotal, getSessionContextPercent, PendingUsagePool, toReportedUsage } from "./usage.js";
47
46
  import { decideWorkflowCollision, FOREIGN_WORKFLOW_TOOL_NAMES } from "./workflow/collisions.js";
48
47
  import { WORKFLOW_ENTRY_TYPE, workflowEntryData } from "./workflow/entry.js";
@@ -371,7 +370,7 @@ export default function (pi) {
371
370
  /** Show `~$X` next to token counts in the subagent surfaces. */
372
371
  let showCost = false;
373
372
  function isShowCostEnabled() { return showCost; }
374
- function setShowCost(b) { showCost = b; widget.update(); fleet.update(); }
373
+ function setShowCost(b) { showCost = b; widget.update(); }
375
374
  /** Name the model and thinking level on the widget's running rows. */
376
375
  let showModel = false;
377
376
  function isShowModelEnabled() { return showModel; }
@@ -384,16 +383,6 @@ export default function (pi) {
384
383
  let viewerMarkdown = "assistant";
385
384
  function getViewerMarkdown() { return viewerMarkdown; }
386
385
  function setViewerMarkdown(mode) { viewerMarkdown = mode; }
387
- /**
388
- * The viewer's `m` key, from either entry point: set the mode and persist it,
389
- * so the key and `/agents → Settings` stay one setting rather than one per
390
- * entry point. `ctx` carries only the warning a failed write notifies with,
391
- * and the fleet list may be acting without one.
392
- */
393
- function chooseViewerMarkdown(mode, ctx) {
394
- setViewerMarkdown(mode);
395
- persistSettings(ctx, `Viewer markdown set to ${mode}`);
396
- }
397
386
  const pendingUsage = new PendingUsagePool();
398
387
  // ---- Cancellable pending notifications ----
399
388
  // Holds notifications briefly so get_subagent_result can cancel them
@@ -436,7 +425,6 @@ export default function (pi) {
436
425
  function sendIndividualNudge(record) {
437
426
  agentActivity.delete(record.id);
438
427
  widget.markFinished(record.id);
439
- fleet.onAgentFinished(record.id);
440
428
  scheduleNudge(record.id, () => emitIndividualNudge(record));
441
429
  widget.update();
442
430
  }
@@ -445,7 +433,6 @@ export default function (pi) {
445
433
  for (const r of records) {
446
434
  agentActivity.delete(r.id);
447
435
  widget.markFinished(r.id);
448
- fleet.onAgentFinished(r.id);
449
436
  }
450
437
  const groupKey = `group:${records.map(r => r.id).join(",")}`;
451
438
  scheduleNudge(groupKey, () => {
@@ -542,7 +529,6 @@ export default function (pi) {
542
529
  if (record.resultConsumed) {
543
530
  agentActivity.delete(record.id);
544
531
  widget.markFinished(record.id);
545
- fleet.onAgentFinished(record.id);
546
532
  widget.update();
547
533
  return;
548
534
  }
@@ -624,7 +610,7 @@ export default function (pi) {
624
610
  // Every programmatic spawn lands here — cross-extension RPC, both `@handle`
625
611
  // mention paths, and the `Symbol.for("pi-subagents:manager")` registry — and
626
612
  // none came through the Agent tool, which is where the UI activity tracker is
627
- // otherwise created. Without one the widget and FleetView have no tool name
613
+ // otherwise created. Without one the widget has no tool name
628
614
  // and no turn count, so the row reads `thinking…` for the agent's whole life
629
615
  // while the header's tool-use count climbs beside it (#181). Double-tracking
630
616
  // is not possible: the Agent tool calls `manager.spawn` directly. The tracker
@@ -638,7 +624,7 @@ export default function (pi) {
638
624
  // leaves the displayed ceiling stale.
639
625
  const { state, callbacks } = createActivityTracker(resolveEffectiveMaxTurns(dispatch.type, options?.maxTurns));
640
626
  // Repaints are left to the manager's `onStart` callback, which already starts
641
- // the widget/fleet timers for agents that enter this way.
627
+ // the widget timer for agents that enter this way.
642
628
  const id = manager.spawn(piRef, ctxRef, dispatch.type, prompt, { ...options, ...callbacks });
643
629
  agentActivity.set(id, state);
644
630
  return id;
@@ -746,8 +732,6 @@ export default function (pi) {
746
732
  if (ctx.hasUI && (ctx.mode === undefined || ctx.mode === "tui")) {
747
733
  widget.setUICtx(ctx.ui);
748
734
  widget.update();
749
- fleet.setUICtx(ctx.ui, false);
750
- fleet.setCwd(ctx.cwd);
751
735
  }
752
736
  manager.clearCompleted(true);
753
737
  // Guard mirrors the `!scheduler.isActive()` pattern below: session_start
@@ -794,8 +778,8 @@ export default function (pi) {
794
778
  if (ctx.mode === "tui" && !mentionProviderRegistered && typeof ctx.ui.addAutocompleteProvider === "function") {
795
779
  mentionProviderRegistered = true;
796
780
  ctx.ui.addAutocompleteProvider(current => createMentionProvider(current,
797
- // Plain text, not renderAgentName: the same label FleetView and the
798
- // widget show, but the autocomplete description cannot carry ANSI.
781
+ // Plain text, not renderAgentName: the same label the widget shows,
782
+ // but the autocomplete description cannot carry ANSI.
799
783
  () => mentionRoster(manager, mentionTypes(), type => getConfig(type).displayName), isAgentMentionsEnabled));
800
784
  }
801
785
  // Last, and only here: CLI flag values are applied by the host AFTER every
@@ -892,7 +876,7 @@ export default function (pi) {
892
876
  }
893
877
  // Evicted, but its conversation is still on disk: reopen it. This is an
894
878
  // ordinary spawn carrying a session file, so the new record picks up the
895
- // widget, fleet row, transcript and completion notification unchanged —
879
+ // widget row, transcript and completion notification unchanged —
896
880
  // and `reclaim` hands it back the names the tombstone was holding.
897
881
  if (resolved?.kind === "tombstone") {
898
882
  const entry = resolved.entry;
@@ -1006,8 +990,8 @@ export default function (pi) {
1006
990
  try {
1007
991
  // Nothing else to pass: runAgent resolves model, thinking and max turns
1008
992
  // from the agent's own config when the spawn omits them, and the
1009
- // manager's onStart/onComplete callbacks own the widget, the fleet list
1010
- // and the completion notification — the same contract the scheduler and
993
+ // manager's onStart/onComplete callbacks own the widget and completion
994
+ // notification — the same contract the scheduler and
1011
995
  // cross-extension RPC spawns run under.
1012
996
  const id = spawnTopLevel(pi, ctx, type, mention.message, {
1013
997
  description: describeMention(mention.message),
@@ -1053,7 +1037,6 @@ export default function (pi) {
1053
1037
  clearTimeout(timer);
1054
1038
  pendingNudges.clear();
1055
1039
  widget.dispose();
1056
- fleet.dispose();
1057
1040
  // Awaited: it emits `session_shutdown` into every retained child session so
1058
1041
  // extensions bound there can release what they armed in `session_start` (#242).
1059
1042
  // pi awaits this handler, and the process exits right after — unawaited, those
@@ -1076,13 +1059,6 @@ export default function (pi) {
1076
1059
  showCost: isShowCostEnabled,
1077
1060
  }, isShowModelEnabled);
1078
1061
  function setWidgetMode(m) { widgetMode = m; widget.update(); }
1079
- // Claude Code-style FleetView: navigable list of main + subagents below the editor.
1080
- // The last two arguments keep a conversation overlay opened here identical to
1081
- // one opened from `/agents`: same setting on the way in, same persist out.
1082
- const fleet = new FleetList(manager, agentActivity, isShowCostEnabled, getViewerMarkdown, (mode) => chooseViewerMarkdown(mode, currentCtx), process.cwd());
1083
- let fleetViewEnabled = true;
1084
- function isFleetViewEnabled() { return fleetViewEnabled; }
1085
- function setFleetViewEnabled(b) { fleetViewEnabled = b; fleet.setEnabled(b); }
1086
1062
  // Claude Code-style `@handle message` prompt mentions. Read live by both the
1087
1063
  // `input` hook and the stacked autocomplete provider, so the toggle applies
1088
1064
  // immediately — the provider itself can never be unregistered (pi's wrapper
@@ -1199,7 +1175,7 @@ export default function (pi) {
1199
1175
  /**
1200
1176
  * Launch a detached resume of an existing agent and wire everything a
1201
1177
  * re-running agent needs: transcript anchoring, activity tracking, join-mode
1202
- * batching, the widget/fleet refresh, and the `subagents:created` event.
1178
+ * batching, the widget refresh, and the `subagents:created` event.
1203
1179
  *
1204
1180
  * Shared by the Agent tool's `resume` + `run_in_background` branch and the
1205
1181
  * `@handle message` prompt mention — they differ only in how they report the
@@ -1267,8 +1243,6 @@ export default function (pi) {
1267
1243
  widget.markRunning(id);
1268
1244
  widget.ensureTimer();
1269
1245
  widget.update();
1270
- fleet.ensureTimer();
1271
- fleet.update();
1272
1246
  // Resume ignores subagent_type (the record keeps the type it was
1273
1247
  // spawned with), so report the record's own identity — a "created"
1274
1248
  // event carrying the caller's type would re-register the agent under
@@ -1285,8 +1259,6 @@ export default function (pi) {
1285
1259
  pi.on("tool_execution_start", async (_event, ctx) => {
1286
1260
  if (ctx.hasUI && (ctx.mode === undefined || ctx.mode === "tui"))
1287
1261
  widget.setUICtx(ctx.ui);
1288
- if (ctx.hasUI && ctx.mode === undefined)
1289
- fleet.setUICtx(ctx.ui, true);
1290
1262
  widget.onTurnStart();
1291
1263
  });
1292
1264
  /** Build the full type list text dynamically from available agents only. */
@@ -1331,7 +1303,6 @@ export default function (pi) {
1331
1303
  setStrictAgentFiles: (b) => { strictAgentFiles = b; },
1332
1304
  setDisableDefaultAgents: setDisableDefaultAgents,
1333
1305
  setToolDescriptionMode: setToolDescriptionMode,
1334
- setFleetView: setFleetViewEnabled,
1335
1306
  setAgentMentions: setAgentMentionMode,
1336
1307
  setRememberAgents,
1337
1308
  setWidgetMode: setWidgetMode,
@@ -1958,8 +1929,6 @@ Terse command-style prompts produce shallow, generic work.
1958
1929
  agentActivity.set(id, bgState);
1959
1930
  widget.ensureTimer();
1960
1931
  widget.update();
1961
- fleet.ensureTimer();
1962
- fleet.update();
1963
1932
  // Emit created event
1964
1933
  pi.events.emit("subagents:created", {
1965
1934
  id,
@@ -2034,8 +2003,6 @@ Terse command-style prompts produce shallow, generic work.
2034
2003
  fgId = a.id;
2035
2004
  agentActivity.set(a.id, fgState);
2036
2005
  widget.ensureTimer();
2037
- fleet.ensureTimer();
2038
- fleet.update();
2039
2006
  break;
2040
2007
  }
2041
2008
  }
@@ -2089,7 +2056,6 @@ Terse command-style prompts produce shallow, generic work.
2089
2056
  if (fgId) {
2090
2057
  agentActivity.delete(fgId);
2091
2058
  widget.markFinished(fgId);
2092
- fleet.onAgentFinished(fgId);
2093
2059
  }
2094
2060
  }
2095
2061
  // Get final token count — from the record, like the cost below it, so the
@@ -2154,29 +2120,6 @@ Terse command-style prompts produce shallow, generic work.
2154
2120
  * background run.
2155
2121
  */
2156
2122
  const workflowTasks = new Map();
2157
- /**
2158
- * Workflow runs as the fleet list wants them.
2159
- *
2160
- * Mapped here rather than handing `WorkflowTask` over the seam: the list is
2161
- * deliberately ignorant of the workflow engine, and a run's counters live in
2162
- * the progress log rather than on the record, so they are derived per call
2163
- * the same way the card derives them.
2164
- */
2165
- function fleetWorkflows() {
2166
- // Cached counters only, no derivation: the fleet list calls this on a
2167
- // 200ms tick and reads the roster several times per update, so walking a
2168
- // run's progress log here would put O(log) work in the render loop.
2169
- return [...workflowTasks.values()].map(task => ({
2170
- id: task.id,
2171
- name: task.meta?.name ?? task.workflowName ?? task.id,
2172
- status: task.status,
2173
- doneCount: task.doneCount,
2174
- totalCount: task.agentCount,
2175
- startedAt: task.startTime,
2176
- ...(task.endTime !== undefined ? { completedAt: task.endTime } : {}),
2177
- tokens: task.totalTokens,
2178
- }));
2179
- }
2180
2123
  /**
2181
2124
  * Run a task to completion against the real manager, settling the record
2182
2125
  * either way. Never rejects: a run that cannot start (bad `meta`, oversized
@@ -2221,7 +2164,6 @@ Terse command-style prompts produce shallow, generic work.
2221
2164
  */
2222
2165
  function notifyWorkflowFinished(task) {
2223
2166
  widget.update();
2224
- fleet.update();
2225
2167
  const result = workflowResultText(task);
2226
2168
  scheduleNudge(task.id, () => {
2227
2169
  pi.sendMessage({
@@ -2364,7 +2306,6 @@ Terse command-style prompts produce shallow, generic work.
2364
2306
  // surfaces — nothing else would register the widget for a run whose
2365
2307
  // first agent has not started yet.
2366
2308
  widget.update();
2367
- fleet.update();
2368
2309
  // Background, like Claude Code: the id comes back now and the run keeps
2369
2310
  // going without the tool call.
2370
2311
  void runWorkflowTask(ctx, task).then(() => notifyWorkflowFinished(task));
@@ -2440,7 +2381,6 @@ Terse command-style prompts produce shallow, generic work.
2440
2381
  }
2441
2382
  workflowsEnabled = false; // not setWorkflowsEnabled: this is not the user pinning it
2442
2383
  widget.update();
2443
- fleet.update();
2444
2384
  warn(verdict.message);
2445
2385
  if (!verdict.withdraw)
2446
2386
  return;
@@ -2512,7 +2452,6 @@ Terse command-style prompts produce shallow, generic work.
2512
2452
  const task = createWorkflowTask({ id: workflowRunId(), script, scriptPath: path, meta });
2513
2453
  workflowTasks.set(task.id, task);
2514
2454
  widget.update();
2515
- fleet.update();
2516
2455
  report(`Running workflow ${meta.name}…`, "info");
2517
2456
  // Detached: session_start is awaited by the host, and a workflow can run for
2518
2457
  // minutes — blocking here would hold the whole session's startup.
@@ -2527,7 +2466,6 @@ Terse command-style prompts produce shallow, generic work.
2527
2466
  display: false,
2528
2467
  }, { deliverAs: "nextTurn" });
2529
2468
  widget.update();
2530
- fleet.update();
2531
2469
  });
2532
2470
  }
2533
2471
  // ---- get_subagent_result tool ----
@@ -3295,7 +3233,6 @@ Write the file using the write tool. Only write the file, nothing else.`;
3295
3233
  strictAgentFiles,
3296
3234
  disableDefaultAgents: isDefaultsDisabled(),
3297
3235
  toolDescriptionMode: getToolDescriptionMode(),
3298
- fleetView: isFleetViewEnabled(),
3299
3236
  agentMentions: getAgentMentionMode(),
3300
3237
  rememberAgents: getRememberAgents(),
3301
3238
  widgetMode: getWidgetMode(),
@@ -3457,7 +3394,7 @@ Write the file using the write tool. Only write the file, nothing else.`;
3457
3394
  {
3458
3395
  id: "showCost",
3459
3396
  label: "Show cost",
3460
- description: "Show an estimated `~$0.0042` beside subagent token counts in the widget, fleet view, results and notifications. Priced by pi from the model's rates — omitted entirely for a model it has no rates for.",
3397
+ description: "Show an estimated `~$0.0042` beside subagent token counts in the widget, results and notifications. Priced by pi from the model's rates — omitted entirely for a model it has no rates for.",
3461
3398
  currentValue: isShowCostEnabled() ? "on" : "off",
3462
3399
  values: ["on", "off"],
3463
3400
  },
@@ -3475,13 +3412,6 @@ Write the file using the write tool. Only write the file, nothing else.`;
3475
3412
  currentValue: getViewerMarkdown(),
3476
3413
  values: ["off", "assistant", "all"],
3477
3414
  },
3478
- {
3479
- id: "fleetView",
3480
- label: "Fleet view",
3481
- description: "Claude Code-style main+subagents list below the editor (↓/← to navigate, Enter to view)",
3482
- currentValue: isFleetViewEnabled() ? "on" : "off",
3483
- values: ["on", "off"],
3484
- },
3485
3415
  {
3486
3416
  id: "agentMentions",
3487
3417
  label: "Agent mentions",
@@ -3651,11 +3581,6 @@ Write the file using the write tool. Only write the file, nothing else.`;
3651
3581
  setViewerMarkdown(value);
3652
3582
  notifyApplied(ctx, `Viewer markdown set to ${value}`);
3653
3583
  }
3654
- else if (id === "fleetView") {
3655
- const enabled = value === "on";
3656
- setFleetViewEnabled(enabled);
3657
- notifyApplied(ctx, `Fleet view ${enabled ? "enabled" : "disabled"}`);
3658
- }
3659
3584
  else if (id === "agentMentions") {
3660
3585
  const mode = value;
3661
3586
  setAgentMentionMode(mode);
@@ -3744,27 +3669,6 @@ Write the file using the write tool. Only write the file, nothing else.`;
3744
3669
  }
3745
3670
  }
3746
3671
  }
3747
- // Persist the current snapshot, emit `subagents:settings_changed`, and surface
3748
- // the right toast. Successful saves show info; persistence failures downgrade
3749
- // to warning so users aren't silently reverted on restart. Event fires regardless
3750
- // of outcome so listeners see the in-memory change.
3751
- /**
3752
- * Persist + broadcast the settings, silent on success — for a change whose
3753
- * feedback is the UI it just changed: the viewer's `m` key, where a
3754
- * notification per press would talk over the overlay it is describing.
3755
- *
3756
- * A *failed* write still speaks. Every other settings path warns when the
3757
- * value is session-only, and swallowing it here would leave a preference
3758
- * looking persisted when the next session will not have it.
3759
- */
3760
- function persistSettings(ctx, changeMsg) {
3761
- const { message, level } = saveAndEmitChanged(snapshotSettings(), changeMsg, (event, payload) => pi.events.emit(event, payload));
3762
- // `ctx` is absent only on the fleet path between sessions, where
3763
- // `currentCtx` has been cleared and there is no UI to carry the warning to.
3764
- // The write still happens.
3765
- if (level === "warning")
3766
- ctx?.ui.notify(message, level);
3767
- }
3768
3672
  function notifyApplied(ctx, successMsg) {
3769
3673
  const { message, level } = saveAndEmitChanged(snapshotSettings(), successMsg, (event, payload) => pi.events.emit(event, payload));
3770
3674
  ctx.ui.notify(message, level);
@@ -3773,19 +3677,11 @@ Write the file using the write tool. Only write the file, nothing else.`;
3773
3677
  description: "Manage agents",
3774
3678
  handler: async (_args, ctx) => { await showAgentsMenu(ctx); },
3775
3679
  });
3776
- /**
3777
- * What `/agents → Workflows` and the fleet list's `workflow` rows need from
3778
- * here. One object, built once: both entry points open the same inspector,
3779
- * and handing them different views of the session would let the two drift.
3780
- */
3680
+ /** Dependencies shared by `/agents → Workflows` and its inspector. */
3781
3681
  const workflowMenuDeps = {
3782
3682
  tasks: workflowTasks,
3783
3683
  getRecord: id => manager.getRecord(id),
3784
3684
  viewAgentConversation,
3785
- // Read lazily: `currentCtx` is rebound on every session_start, and the
3786
- // fleet list may act between sessions, when there is none.
3787
- getCtx: () => currentCtx,
3788
3685
  };
3789
- fleet.setWorkflowSource(fleetWorkflows, id => openWorkflowFromFleet(id, workflowMenuDeps));
3790
3686
  }
3791
3687
  //# sourceMappingURL=index.js.map