taskplane 0.24.20 → 0.24.21

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.
@@ -609,9 +609,20 @@ export async function spawnMergeAgentV2(
609
609
  timeoutMs: (config.merge.timeout_minutes ?? 10) * 60 * 1000,
610
610
  stateRoot: stateRoot ?? repoRoot,
611
611
  packet: null,
612
- env: { ORCH_BATCH_ID: bid },
612
+ env: {
613
+ ORCH_BATCH_ID: bid,
614
+ // Isolate merge agent from operator's user preferences to prevent
615
+ // verification test contamination (e.g., stale reviewerModel pref
616
+ // overriding schema defaults in deep-equal assertions).
617
+ PI_CODING_AGENT_DIR: join(sidecarRoot, "runtime", bid, "merge-agent-env"),
618
+ },
613
619
  };
614
620
 
621
+ // Ensure isolated agent dir exists with empty preferences
622
+ const isolatedAgentDir = join(sidecarRoot, "runtime", bid, "merge-agent-env", "taskplane");
623
+ mkdirSync(isolatedAgentDir, { recursive: true });
624
+ try { writeFileSync(join(isolatedAgentDir, "preferences.json"), "{}\n", { flag: "wx" }); } catch { /* already exists */ }
625
+
615
626
  const { promise, kill } = spawnAgent(opts);
616
627
 
617
628
  // Store the kill handle for external cleanup (pause/abort).
@@ -102,7 +102,7 @@ export const SECTIONS: SectionDef[] = [
102
102
  // The user-facing spawn mode setting is under Worker (controls /task behavior).
103
103
  { configPath: "orchestrator.orchestrator.sessionPrefix", label: "Session Prefix", control: "input", layer: "L1+L2", fieldType: "string", prefsKey: "sessionPrefix", description: "Prefix for orchestrator session names" },
104
104
  { configPath: "orchestrator.orchestrator.operatorId", label: "Operator ID", control: "input", layer: "L1+L2", fieldType: "string", prefsKey: "operatorId", description: "Operator identifier (empty = auto-detect)" },
105
- { configPath: "orchestrator.orchestrator.integration", label: "Integration", control: "toggle", layer: "L1", fieldType: "enum", values: ["manual", "supervised", "auto"], description: "How completed batches are integrated. manual = user runs /orch-integrate. supervised = supervisor proposes plan, asks confirmation. auto = supervisor executes without asking." },
105
+ { configPath: "orchestrator.orchestrator.integration", label: "Integration", control: "picker", layer: "L1", fieldType: "enum", values: ["manual", "supervised", "auto"], description: "How completed batches are integrated. manual = user runs /orch-integrate. supervised = supervisor proposes plan, asks confirmation. auto = supervisor executes without asking." },
106
106
  ],
107
107
  },
108
108
  {
@@ -154,7 +154,7 @@ export const SECTIONS: SectionDef[] = [
154
154
  name: "Supervisor",
155
155
  fields: [
156
156
  { configPath: "orchestrator.supervisor.model", label: "Supervisor Model", control: "input", layer: "L1+L2", fieldType: "string", prefsKey: "supervisorModel", description: "Supervisor model (inherit = use session model)" },
157
- { configPath: "orchestrator.supervisor.autonomy", label: "Autonomy Level", control: "toggle", layer: "L1", fieldType: "enum", values: ["interactive", "supervised", "autonomous"], description: "Recovery action confirmation behavior" },
157
+ { configPath: "orchestrator.supervisor.autonomy", label: "Autonomy Level", control: "picker", layer: "L1", fieldType: "enum", values: ["interactive", "supervised", "autonomous"], description: "Recovery action confirmation behavior" },
158
158
  ],
159
159
  },
160
160
  {
@@ -1391,6 +1391,14 @@ async function showSectionSettingsLoop(
1391
1391
  const selected = await pickThinkingMode(ctx, normalizedCurrent);
1392
1392
  if (selected === undefined) continue; // Cancelled
1393
1393
  result.rawValue = selected;
1394
+ } else if (field.control === "picker" && field.values && field.values.length > 0) {
1395
+ // Enum picker: show scrollable list of allowed values
1396
+ const options = field.values.map((v) =>
1397
+ `${v}${v === normalizedCurrent ? " ✓ current" : ""}`
1398
+ );
1399
+ const selected = await selectScrollable(ctx, field.label, options);
1400
+ if (!selected) continue; // Cancelled
1401
+ result.rawValue = selected.replace(/\s+✓ current$/, "");
1394
1402
  } else {
1395
1403
  const placeholder = currentClean === "(not set)" || currentClean === "(inherit)" ? "" : currentClean;
1396
1404
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "taskplane",
3
- "version": "0.24.20",
3
+ "version": "0.24.21",
4
4
  "description": "AI agent orchestration for pi — parallel task execution with checkpoint discipline",
5
5
  "keywords": [
6
6
  "pi-package",