pi-better-subagents 0.1.25 → 0.1.27

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/index.ts CHANGED
@@ -127,6 +127,11 @@ const SUBAGENT_TOOLS = [
127
127
  "subagent_result",
128
128
  ];
129
129
 
130
+ const SUBAGENT_ORCHESTRATION_GUIDELINES = [
131
+ "When a structured plan is active, keep it as the parent-owned coordinator ledger: delegate bounded independent work, continue unblocked foreground work, and update the plan after integrating each result or failure.",
132
+ "Do not treat launching a subagent as completion of the parent milestone; relevant terminal results must be inspected and integrated before verification or completion.",
133
+ ];
134
+
130
135
  const GOAL_READY_EVENT = "pi-better-goal:ready";
131
136
  const GOAL_REGISTER_PROVIDER_EVENT = "pi-better-goal:register-provider";
132
137
  const goalReadySubscriptions = new WeakSet<ExtensionAPI>();
@@ -1267,7 +1272,8 @@ export default function (pi: ExtensionAPI) {
1267
1272
  promptGuidelines: [
1268
1273
  "Use subagent_spawn for independent work the user should not have to wait on. It returns at once with a run id; that return IS the deliverable — report the id to the user and continue.",
1269
1274
  "After subagent_spawn, do NOT call subagent_output or subagent_result in a loop to wait for the result, and do NOT sleep. The run completes on its own and reports back on the next turn.",
1270
- "Only call subagent_result / subagent_output when the user explicitly asks how a run is going or for its result.",
1275
+ "Call subagent_result after a completion or attention callback, or when the user explicitly asks for the result. Use subagent_output only when the user explicitly asks how a run is progressing; never use either tool to poll.",
1276
+ ...SUBAGENT_ORCHESTRATION_GUIDELINES,
1271
1277
  "The tools param is both the tool allowlist AND what determines which extensions load in the child (e.g. tools='read,bash,web_fetch' loads only the web-tools package). Ask for the tools the task needs and nothing more; clean:true gives a built-ins-only child. Pick a model with the model param (e.g. 'xai/grok-4.5@high'); providerless model patterns are resolved by Pi, while provider/model is deterministic and loads mapped provider extensions.",
1272
1278
  "By default the subagent is sandboxed (writes confined to its working dir, reads and network open) and triggers completion here on finish. Set callback:false to finish quietly — then read the result on demand via subagent_result.",
1273
1279
  "Use git_clone_workspace:true when the subagent will mutate Git in a sandbox. The parent prepares a disposable, self-contained clone with a real .git/ directory inside the sandbox root, so linked-worktree metadata outside the sandbox cannot stall the child.",
@@ -1336,6 +1342,7 @@ export default function (pi: ExtensionAPI) {
1336
1342
  "Use subagent_spawn_batch when you have several independent tasks to delegate. It returns immediately with a batch id and one run id per launched job.",
1337
1343
  "Each job is a normal subagent run; use subagent_result / subagent_output / subagent_stop with the individual run ids just like subagent_spawn.",
1338
1344
  "Do NOT poll for results. Each job reports back on its own when it finishes.",
1345
+ ...SUBAGENT_ORCHESTRATION_GUIDELINES,
1339
1346
  "By default the whole batch is rejected if there is not enough capacity. Set onCapacity to 'launch-available' to launch as many as fit and report the rest as skipped.",
1340
1347
  ],
1341
1348
  parameters: Type.Object({
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pi-better-subagents",
3
- "version": "0.1.25",
3
+ "version": "0.1.27",
4
4
  "description": "Pi extension for detached, sandboxed subagent runs that keep the foreground session free.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -97,7 +97,6 @@ type NavigatorState = {
97
97
  };
98
98
 
99
99
  const GLOBAL_KEY = Symbol.for("pi-better-harness.navigator.state");
100
- const PLAN_NAVIGATION_KEY = Symbol.for("pi-better-harness.plan-navigation.state");
101
100
  const FACTORY_MARK = "__piBetterHarnessNavigatorFactory";
102
101
  const FACTORY_REFRESH = "__piBetterHarnessNavigatorRefresh";
103
102
 
@@ -121,14 +120,6 @@ function state(): NavigatorState {
121
120
  return g[GLOBAL_KEY]!;
122
121
  }
123
122
 
124
- type PlanNavigationState = { visible: boolean; releaseWorkFocus?: () => void };
125
-
126
- function planNavigationState(): PlanNavigationState {
127
- const global = globalThis as typeof globalThis & { [PLAN_NAVIGATION_KEY]?: PlanNavigationState };
128
- if (!global[PLAN_NAVIGATION_KEY]) global[PLAN_NAVIGATION_KEY] = { visible: false };
129
- return global[PLAN_NAVIGATION_KEY]!;
130
- }
131
-
132
123
  export function registerBackgroundWorkProvider(provider: BackgroundWorkProvider): () => void {
133
124
  const s = state();
134
125
  const previousUnsub = s.unsubscribers.get(provider.id);
@@ -194,7 +185,6 @@ export function ensureBackgroundWorkNavigator(ctx: ExtensionContext, deps: HostD
194
185
  s.mainListRequestRender = undefined;
195
186
  s.mainListDeadlineScheduler?.dispose();
196
187
  s.mainListDeadlineScheduler = createRenderScheduler(() => refreshMainListWidget());
197
- planNavigationState().releaseWorkFocus = unfocusMainList;
198
188
  installNavigatorEditor(ctx.ui as any, deps);
199
189
  s.lastHint = undefined;
200
190
  refreshBackgroundWorkNavigator(ctx);
@@ -223,7 +213,6 @@ export function disposeBackgroundWorkNavigator(ctx?: ExtensionContext): void {
223
213
  s.mainListRequestRender = undefined;
224
214
  s.editorComponent = undefined;
225
215
  s.detailOverlayRows = undefined;
226
- planNavigationState().releaseWorkFocus = undefined;
227
216
  s.mainListSelectedId = undefined;
228
217
  s.mainListFocused = false;
229
218
  }
@@ -471,10 +460,9 @@ function buildMainListLines(
471
460
  }
472
461
 
473
462
  function shortcutsLine(focused: boolean, fg: (color: string, value: string) => string): string {
474
- const plan = planNavigationState().visible ? " · → plan" : "";
475
463
  const keys = focused
476
- ? `↑↓ switch · Enter detail · x stop${plan} · Esc unfocus`
477
- : `← work navigator${plan}`;
464
+ ? "↑↓ switch · Enter detail · x stop · Esc unfocus"
465
+ : "← work navigator";
478
466
  return dim(keys, fg);
479
467
  }
480
468