oh-my-opencode-slim 0.8.6 → 0.9.0

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/dist/cli/index.js CHANGED
@@ -13676,6 +13676,7 @@ var CouncilMasterConfigSchema = exports_external.object({
13676
13676
  variant: exports_external.string().optional(),
13677
13677
  prompt: exports_external.string().optional().describe("Optional role/guidance injected into the master synthesis prompt")
13678
13678
  });
13679
+ var CouncillorExecutionModeSchema = exports_external.enum(["parallel", "serial"]).default("parallel").describe('Execution mode for councillors. Use "serial" for single-model systems to avoid conflicts. ' + 'Use "parallel" for multi-model systems for faster execution.');
13679
13680
  var CouncilConfigSchema = exports_external.object({
13680
13681
  master: CouncilMasterConfigSchema,
13681
13682
  presets: exports_external.record(exports_external.string(), CouncilPresetSchema),
@@ -13690,7 +13691,8 @@ var CouncilConfigSchema = exports_external.object({
13690
13691
  return unique;
13691
13692
  }
13692
13693
  return val;
13693
- }).describe("Fallback models for the council master. Tried in order if the primary model fails. " + 'Example: ["anthropic/claude-sonnet-4-6", "openai/gpt-5.4"]')
13694
+ }).describe("Fallback models for the council master. Tried in order if the primary model fails. " + 'Example: ["anthropic/claude-sonnet-4-6", "openai/gpt-5.4"]'),
13695
+ councillor_execution_mode: CouncillorExecutionModeSchema.describe('Execution mode for councillors. "serial" runs them one at a time (required for single-model systems). "parallel" runs them concurrently (default, faster for multi-model systems).')
13694
13696
  });
13695
13697
  // src/config/schema.ts
13696
13698
  var ProviderModelIdSchema = exports_external.string().regex(/^[^/\s]+\/[^\s]+$/, "Expected provider/model format (provider/.../model)");
@@ -13863,7 +13865,7 @@ var RECOMMENDED_SKILLS = [
13863
13865
  name: "simplify",
13864
13866
  repo: "https://github.com/brianlovin/claude-config",
13865
13867
  skillName: "simplify",
13866
- allowedAgents: ["orchestrator"],
13868
+ allowedAgents: ["oracle"],
13867
13869
  description: "YAGNI code simplification expert"
13868
13870
  },
13869
13871
  {
@@ -61,6 +61,15 @@ export declare const CouncilMasterConfigSchema: z.ZodObject<{
61
61
  prompt: z.ZodOptional<z.ZodString>;
62
62
  }, z.core.$strip>;
63
63
  export type CouncilMasterConfig = z.infer<typeof CouncilMasterConfigSchema>;
64
+ /**
65
+ * Execution mode for councillors.
66
+ * - parallel: Run all councillors concurrently (default, fastest for multi-model systems)
67
+ * - serial: Run councillors one at a time (required for single-model systems to avoid conflicts)
68
+ */
69
+ export declare const CouncillorExecutionModeSchema: z.ZodDefault<z.ZodEnum<{
70
+ parallel: "parallel";
71
+ serial: "serial";
72
+ }>>;
64
73
  /**
65
74
  * Top-level council configuration.
66
75
  *
@@ -77,7 +86,8 @@ export type CouncilMasterConfig = z.infer<typeof CouncilMasterConfigSchema>;
77
86
  * }
78
87
  * },
79
88
  * "master_timeout": 300000,
80
- * "councillors_timeout": 180000
89
+ * "councillors_timeout": 180000,
90
+ * "councillor_execution_mode": "serial"
81
91
  * }
82
92
  * }
83
93
  * ```
@@ -104,8 +114,13 @@ export declare const CouncilConfigSchema: z.ZodObject<{
104
114
  councillors_timeout: z.ZodDefault<z.ZodNumber>;
105
115
  default_preset: z.ZodDefault<z.ZodString>;
106
116
  master_fallback: z.ZodPipe<z.ZodOptional<z.ZodArray<z.ZodString>>, z.ZodTransform<string[] | undefined, string[] | undefined>>;
117
+ councillor_execution_mode: z.ZodDefault<z.ZodEnum<{
118
+ parallel: "parallel";
119
+ serial: "serial";
120
+ }>>;
107
121
  }, z.core.$strip>;
108
122
  export type CouncilConfig = z.infer<typeof CouncilConfigSchema>;
123
+ export type CouncillorExecutionMode = z.infer<typeof CouncillorExecutionModeSchema>;
109
124
  /**
110
125
  * A sensible default council configuration that users can copy into their
111
126
  * opencode.jsonc. Provides a 3-councillor preset using common models.
@@ -238,6 +238,10 @@ export declare const PluginConfigSchema: z.ZodObject<{
238
238
  councillors_timeout: z.ZodDefault<z.ZodNumber>;
239
239
  default_preset: z.ZodDefault<z.ZodString>;
240
240
  master_fallback: z.ZodPipe<z.ZodOptional<z.ZodArray<z.ZodString>>, z.ZodTransform<string[] | undefined, string[] | undefined>>;
241
+ councillor_execution_mode: z.ZodDefault<z.ZodEnum<{
242
+ parallel: "parallel";
243
+ serial: "serial";
244
+ }>>;
241
245
  }, z.core.$strip>>;
242
246
  }, z.core.$strip>;
243
247
  export type PluginConfig = z.infer<typeof PluginConfigSchema>;
package/dist/index.js CHANGED
@@ -3529,7 +3529,7 @@ var RECOMMENDED_SKILLS = [
3529
3529
  name: "simplify",
3530
3530
  repo: "https://github.com/brianlovin/claude-config",
3531
3531
  skillName: "simplify",
3532
- allowedAgents: ["orchestrator"],
3532
+ allowedAgents: ["oracle"],
3533
3533
  description: "YAGNI code simplification expert"
3534
3534
  },
3535
3535
  {
@@ -17217,6 +17217,7 @@ var CouncilMasterConfigSchema = exports_external.object({
17217
17217
  variant: exports_external.string().optional(),
17218
17218
  prompt: exports_external.string().optional().describe("Optional role/guidance injected into the master synthesis prompt")
17219
17219
  });
17220
+ var CouncillorExecutionModeSchema = exports_external.enum(["parallel", "serial"]).default("parallel").describe('Execution mode for councillors. Use "serial" for single-model systems to avoid conflicts. ' + 'Use "parallel" for multi-model systems for faster execution.');
17220
17221
  var CouncilConfigSchema = exports_external.object({
17221
17222
  master: CouncilMasterConfigSchema,
17222
17223
  presets: exports_external.record(exports_external.string(), CouncilPresetSchema),
@@ -17231,7 +17232,8 @@ var CouncilConfigSchema = exports_external.object({
17231
17232
  return unique;
17232
17233
  }
17233
17234
  return val;
17234
- }).describe("Fallback models for the council master. Tried in order if the primary model fails. " + 'Example: ["anthropic/claude-sonnet-4-6", "openai/gpt-5.4"]')
17235
+ }).describe("Fallback models for the council master. Tried in order if the primary model fails. " + 'Example: ["anthropic/claude-sonnet-4-6", "openai/gpt-5.4"]'),
17236
+ councillor_execution_mode: CouncillorExecutionModeSchema.describe('Execution mode for councillors. "serial" runs them one at a time (required for single-model systems). "parallel" runs them concurrently (default, faster for multi-model systems).')
17235
17237
  });
17236
17238
  // src/config/loader.ts
17237
17239
  import * as fs from "fs";
@@ -17581,16 +17583,16 @@ You are an AI coding orchestrator that optimizes for quality, speed, cost, and r
17581
17583
  @oracle
17582
17584
  - Role: Strategic advisor for high-stakes decisions and persistent problems, code reviewer
17583
17585
  - Stats: 5x better decision maker, problem solver, investigator than orchestrator, 0.8x speed of orchestrator, same cost.
17584
- - Capabilities: Deep architectural reasoning, system-level trade-offs, complex debugging, code review
17585
- - **Delegate when:** Major architectural decisions with long-term impact \u2022 Problems persisting after 2+ fix attempts \u2022 High-risk multi-system refactors \u2022 Costly trade-offs (performance vs maintainability) \u2022 Complex debugging with unclear root cause \u2022 Security/scalability/data integrity decisions \u2022 Genuinely uncertain and cost of wrong choice is high \u2022 When a workflow calls for a **reviewer** subagent
17586
+ - Capabilities: Deep architectural reasoning, system-level trade-offs, complex debugging, code review, simplification, maintainability review
17587
+ - **Delegate when:** Major architectural decisions with long-term impact \u2022 Problems persisting after 2+ fix attempts \u2022 High-risk multi-system refactors \u2022 Costly trade-offs (performance vs maintainability) \u2022 Complex debugging with unclear root cause \u2022 Security/scalability/data integrity decisions \u2022 Genuinely uncertain and cost of wrong choice is high \u2022 When a workflow calls for a **reviewer** subagent \u2022 Code needs simplification or YAGNI scrutiny
17586
17588
  - **Don't delegate when:** Routine decisions you're confident about \u2022 First bug fix attempt \u2022 Straightforward trade-offs \u2022 Tactical "how" vs strategic "should" \u2022 Time-sensitive good-enough decisions \u2022 Quick research/testing can answer
17587
- - **Rule of thumb:** Need senior architect review? \u2192 @oracle. Need code review? \u2192 @oracle. Just do it and PR? \u2192 yourself.
17589
+ - **Rule of thumb:** Need senior architect review? \u2192 @oracle. Need code review or simplification? \u2192 @oracle. Just do it and PR? \u2192 yourself.
17588
17590
 
17589
17591
  @designer
17590
17592
  - Role: UI/UX specialist for intentional, polished experiences
17591
17593
  - Stats: 10x better UI/UX than orchestrator
17592
- - Capabilities: Visual direction, interactions, responsive layouts, design systems with aesthetic intent
17593
- - **Delegate when:** User-facing interfaces needing polish \u2022 Responsive layouts \u2022 UX-critical components (forms, nav, dashboards) \u2022 Visual consistency systems \u2022 Animations/micro-interactions \u2022 Landing/marketing pages \u2022 Refining functional\u2192delightful
17594
+ - Capabilities: Visual direction, interactions, responsive layouts, design systems with aesthetic intent, UI/UX review
17595
+ - **Delegate when:** User-facing interfaces needing polish \u2022 Responsive layouts \u2022 UX-critical components (forms, nav, dashboards) \u2022 Visual consistency systems \u2022 Animations/micro-interactions \u2022 Landing/marketing pages \u2022 Refining functional\u2192delightful \u2022 Reviewing existing UI/UX quality
17594
17596
  - **Don't delegate when:** Backend/logic with no visual \u2022 Quick prototypes where design doesn't matter yet
17595
17597
  - **Rule of thumb:** Users see it and polish matters? \u2192 @designer. Headless/functional? \u2192 yourself.
17596
17598
 
@@ -17598,9 +17600,9 @@ You are an AI coding orchestrator that optimizes for quality, speed, cost, and r
17598
17600
  - Role: Fast execution specialist for well-defined tasks, which empowers orchestrator with parallel, speedy executions
17599
17601
  - Stats: 2x faster code edits, 1/2 cost of orchestrator, 0.8x quality of orchestrator
17600
17602
  - Tools/Constraints: Execution-focused\u2014no research, no architectural decisions
17601
- - **Delegate when:** For implementation work, think and triage first. If the change is non-trivial or multi-file, hand bounded execution to @fixer
17603
+ - **Delegate when:** For implementation work, think and triage first. If the change is non-trivial or multi-file, hand bounded execution to @fixer \u2022 Writing or updating tests \u2022 Tasks that touch test files, fixtures, mocks, or test helpers
17602
17604
  - **Don't delegate when:** Needs discovery/research/decisions \u2022 Single small change (<20 lines, one file) \u2022 Unclear requirements needing iteration \u2022 Explaining to fixer > doing \u2022 Tight integration with your current work \u2022 Sequential dependencies
17603
- - **Rule of thumb:** Explaining > doing? \u2192 yourself. Orchestrator paths selection is vastly improved by Fixer. eg it can reduce overall speed if Orchestrator splits what's usually a single task into multiple subtasks and parallelize it with fixer.
17605
+ - **Rule of thumb:** Explaining > doing? \u2192 yourself. Test file modifications and bounded implementation work usually go to @fixer. Orchestrator paths selection is vastly improved by Fixer. eg it can reduce overall speed if Orchestrator splits what's usually a single task into multiple subtasks and parallelize it with fixer.
17604
17606
 
17605
17607
  @council
17606
17608
  - Role: Multi-LLM consensus engine for high-confidence answers
@@ -17648,9 +17650,17 @@ Balance: respect dependencies, avoid parallelizing what must be sequential.
17648
17650
  4. Integrate results
17649
17651
  5. Adjust if needed
17650
17652
 
17653
+ ### Validation routing
17654
+ - Validation is a workflow stage owned by the Orchestrator, not a separate specialist
17655
+ - Route UI/UX validation and review to @designer
17656
+ - Route code review, simplification, maintainability review, and YAGNI checks to @oracle
17657
+ - Route test writing, test updates, and changes touching test files to @fixer
17658
+ - If a request spans multiple lanes, delegate only the lanes that add clear value
17659
+
17651
17660
  ## 6. Verify
17652
17661
  - Run \`lsp_diagnostics\` for errors
17653
- - Suggest \`simplify\` skill when applicable
17662
+ - Use validation routing when applicable instead of doing all review work yourself
17663
+ - If test files are involved, prefer @fixer for bounded test changes and @oracle only for test strategy or quality review
17654
17664
  - Confirm specialists completed successfully
17655
17665
  - Verify solution meets requirements
17656
17666
 
@@ -17901,9 +17911,9 @@ function createCouncillorAgent(model, customPrompt, customAppendPrompt) {
17901
17911
  }
17902
17912
 
17903
17913
  // src/agents/designer.ts
17904
- var DESIGNER_PROMPT = `You are a Designer - a frontend UI/UX specialist who creates intentional, polished experiences.
17914
+ var DESIGNER_PROMPT = `You are a Designer - a frontend UI/UX specialist who creates and reviews intentional, polished experiences.
17905
17915
 
17906
- **Role**: Craft cohesive UI/UX that balances visual impact with usability.
17916
+ **Role**: Craft and review cohesive UI/UX that balances visual impact with usability.
17907
17917
 
17908
17918
  ## Design Principles
17909
17919
 
@@ -17949,6 +17959,11 @@ var DESIGNER_PROMPT = `You are a Designer - a frontend UI/UX specialist who crea
17949
17959
  - Leverage component libraries where available
17950
17960
  - Prioritize visual excellence\u2014code perfection comes second
17951
17961
 
17962
+ ## Review Responsibilities
17963
+ - Review existing UI for usability, responsiveness, visual consistency, and polish when asked
17964
+ - Call out concrete UX issues and improvements, not just abstract design advice
17965
+ - When validating, focus on what users actually see and feel
17966
+
17952
17967
  ## Output Quality
17953
17968
  You're capable of extraordinary creative work. Commit fully to distinctive visions and show what's possible when breaking conventions thoughtfully.`;
17954
17969
  function createDesignerAgent(model, customPrompt, customAppendPrompt) {
@@ -17962,7 +17977,7 @@ ${customAppendPrompt}`;
17962
17977
  }
17963
17978
  return {
17964
17979
  name: "designer",
17965
- description: "UI/UX design and implementation. Use for styling, responsive design, component architecture and visual polish.",
17980
+ description: "UI/UX design, review, and implementation. Use for styling, responsive design, component architecture and visual polish.",
17966
17981
  config: {
17967
17982
  model,
17968
17983
  temperature: 0.7,
@@ -18030,6 +18045,7 @@ var FIXER_PROMPT = `You are Fixer - a fast, focused implementation specialist.
18030
18045
  - Use the research context (file paths, documentation, patterns) provided
18031
18046
  - Read files before using edit/write tools and gather exact content before making changes
18032
18047
  - Be fast and direct - no research, no delegation, No multi-step research/planning; minimal execution sequence ok
18048
+ - Write or update tests when requested, especially for bounded tasks involving test files, fixtures, mocks, or test helpers
18033
18049
  - Run tests/lsp_diagnostics when relevant or requested (otherwise note as skipped with reason)
18034
18050
  - Report completion with summary of changes
18035
18051
 
@@ -18039,6 +18055,7 @@ var FIXER_PROMPT = `You are Fixer - a fast, focused implementation specialist.
18039
18055
  - No multi-step research/planning; minimal execution sequence ok
18040
18056
  - If context is insufficient: use grep/glob/lsp_diagnostics directly \u2014 do not delegate
18041
18057
  - Only ask for missing inputs you truly cannot retrieve yourself
18058
+ - Do not act as the primary reviewer; implement requested changes and surface obvious issues briefly
18042
18059
 
18043
18060
  **Output Format**:
18044
18061
  <summary>
@@ -18123,14 +18140,15 @@ ${customAppendPrompt}`;
18123
18140
  }
18124
18141
 
18125
18142
  // src/agents/oracle.ts
18126
- var ORACLE_PROMPT = `You are Oracle - a strategic technical advisor.
18143
+ var ORACLE_PROMPT = `You are Oracle - a strategic technical advisor and code reviewer.
18127
18144
 
18128
- **Role**: High-IQ debugging, architecture decisions, code review, and engineering guidance.
18145
+ **Role**: High-IQ debugging, architecture decisions, code review, simplification, and engineering guidance.
18129
18146
 
18130
18147
  **Capabilities**:
18131
18148
  - Analyze complex codebases and identify root causes
18132
18149
  - Propose architectural solutions with tradeoffs
18133
- - Review code for correctness, performance, and maintainability
18150
+ - Review code for correctness, performance, maintainability, and unnecessary complexity
18151
+ - Enforce YAGNI and suggest simpler designs when abstractions are not pulling their weight
18134
18152
  - Guide debugging when standard approaches fail
18135
18153
 
18136
18154
  **Behavior**:
@@ -18138,6 +18156,7 @@ var ORACLE_PROMPT = `You are Oracle - a strategic technical advisor.
18138
18156
  - Provide actionable recommendations
18139
18157
  - Explain reasoning briefly
18140
18158
  - Acknowledge uncertainty when present
18159
+ - Prefer simpler designs unless complexity clearly earns its keep
18141
18160
 
18142
18161
  **Constraints**:
18143
18162
  - READ-ONLY: You advise, you don't implement
@@ -18154,7 +18173,7 @@ ${customAppendPrompt}`;
18154
18173
  }
18155
18174
  return {
18156
18175
  name: "oracle",
18157
- description: "Strategic technical advisor. Use for architecture decisions, complex debugging, code review, and engineering guidance.",
18176
+ description: "Strategic technical advisor. Use for architecture decisions, complex debugging, code review, simplification, and engineering guidance.",
18158
18177
  config: {
18159
18178
  model,
18160
18179
  temperature: 0.1,
@@ -19294,6 +19313,7 @@ class CouncilManager {
19294
19313
  }
19295
19314
  const councillorsTimeout = councilConfig.councillors_timeout ?? 180000;
19296
19315
  const masterTimeout = councilConfig.master_timeout ?? 300000;
19316
+ const executionMode = councilConfig.councillor_execution_mode ?? "parallel";
19297
19317
  const councillorCount = Object.keys(preset.councillors).length;
19298
19318
  log(`[council-manager] Starting council with preset "${resolvedPreset}"`, {
19299
19319
  councillors: Object.keys(preset.councillors)
@@ -19303,7 +19323,7 @@ class CouncilManager {
19303
19323
  error: err instanceof Error ? err.message : String(err)
19304
19324
  });
19305
19325
  });
19306
- const councillorResults = await this.runCouncillors(prompt, preset.councillors, parentSessionId, councillorsTimeout);
19326
+ const councillorResults = await this.runCouncillors(prompt, preset.councillors, parentSessionId, councillorsTimeout, executionMode);
19307
19327
  const completedCount = councillorResults.filter((r) => r.status === "completed").length;
19308
19328
  log(`[council-manager] Councillors completed: ${completedCount}/${councillorResults.length}`);
19309
19329
  if (completedCount === 0) {
@@ -19404,59 +19424,96 @@ ${bestResult.result}` : undefined,
19404
19424
  }
19405
19425
  }
19406
19426
  }
19407
- async runCouncillors(prompt, councillors, parentSessionId, timeout) {
19427
+ async runCouncillors(prompt, councillors, parentSessionId, timeout, executionMode = "parallel") {
19408
19428
  const entries = Object.entries(councillors);
19409
- const promises = entries.map(([name, config2], index) => (async () => {
19410
- if (index > 0) {
19411
- await new Promise((r) => setTimeout(r, index * COUNCILLOR_STAGGER_MS));
19412
- }
19413
- const modelLabel = shortModelLabel(config2.model);
19414
- try {
19415
- const result = await this.runAgentSession({
19416
- parentSessionId,
19417
- title: `Council ${name} (${modelLabel})`,
19418
- agent: "councillor",
19419
- model: config2.model,
19420
- promptText: formatCouncillorPrompt(prompt, config2.prompt),
19421
- variant: config2.variant,
19422
- timeout,
19423
- includeReasoning: false
19424
- });
19425
- return {
19426
- name,
19427
- model: config2.model,
19428
- status: "completed",
19429
- result
19430
- };
19431
- } catch (error48) {
19432
- const msg = error48 instanceof Error ? error48.message : String(error48);
19433
- return {
19434
- name,
19435
- model: config2.model,
19436
- status: msg.includes("timed out") ? "timed_out" : "failed",
19437
- error: `Councillor "${name}": ${msg}`
19438
- };
19429
+ const results = [];
19430
+ if (executionMode === "serial") {
19431
+ for (const [name, config2] of entries) {
19432
+ const modelLabel = shortModelLabel(config2.model);
19433
+ log(`[council-manager] Running councillor "${name}" (${modelLabel}) serially`);
19434
+ try {
19435
+ const result = await this.runAgentSession({
19436
+ parentSessionId,
19437
+ title: `Council ${name} (${modelLabel})`,
19438
+ agent: "councillor",
19439
+ model: config2.model,
19440
+ promptText: formatCouncillorPrompt(prompt, config2.prompt),
19441
+ variant: config2.variant,
19442
+ timeout,
19443
+ includeReasoning: false
19444
+ });
19445
+ results.push({
19446
+ name,
19447
+ model: config2.model,
19448
+ status: "completed",
19449
+ result
19450
+ });
19451
+ } catch (error48) {
19452
+ const msg = error48 instanceof Error ? error48.message : String(error48);
19453
+ results.push({
19454
+ name,
19455
+ model: config2.model,
19456
+ status: msg.includes("timed out") ? "timed_out" : "failed",
19457
+ error: `Councillor "${name}": ${msg}`
19458
+ });
19459
+ }
19439
19460
  }
19440
- })());
19441
- const settled = await Promise.allSettled(promises);
19442
- return settled.map((result, index) => {
19443
- const [name, cfg] = entries[index];
19444
- if (result.status === "fulfilled") {
19445
- return {
19446
- name,
19447
- model: cfg.model,
19448
- status: result.value.status,
19449
- result: result.value.result,
19450
- error: result.value.error
19451
- };
19461
+ } else {
19462
+ const promises = entries.map(([name, config2], index) => (async () => {
19463
+ if (index > 0) {
19464
+ await new Promise((r) => setTimeout(r, index * COUNCILLOR_STAGGER_MS));
19465
+ }
19466
+ const modelLabel = shortModelLabel(config2.model);
19467
+ try {
19468
+ const result = await this.runAgentSession({
19469
+ parentSessionId,
19470
+ title: `Council ${name} (${modelLabel})`,
19471
+ agent: "councillor",
19472
+ model: config2.model,
19473
+ promptText: formatCouncillorPrompt(prompt, config2.prompt),
19474
+ variant: config2.variant,
19475
+ timeout,
19476
+ includeReasoning: false
19477
+ });
19478
+ return {
19479
+ name,
19480
+ model: config2.model,
19481
+ status: "completed",
19482
+ result
19483
+ };
19484
+ } catch (error48) {
19485
+ const msg = error48 instanceof Error ? error48.message : String(error48);
19486
+ return {
19487
+ name,
19488
+ model: config2.model,
19489
+ status: msg.includes("timed out") ? "timed_out" : "failed",
19490
+ error: `Councillor "${name}": ${msg}`
19491
+ };
19492
+ }
19493
+ })());
19494
+ const settled = await Promise.allSettled(promises);
19495
+ for (let index = 0;index < settled.length; index++) {
19496
+ const result = settled[index];
19497
+ const [name, cfg] = entries[index];
19498
+ if (result.status === "fulfilled") {
19499
+ results.push({
19500
+ name,
19501
+ model: cfg.model,
19502
+ status: result.value.status,
19503
+ result: result.value.result,
19504
+ error: result.value.error
19505
+ });
19506
+ } else {
19507
+ results.push({
19508
+ name,
19509
+ model: cfg.model,
19510
+ status: "failed",
19511
+ error: result.reason instanceof Error ? result.reason.message : String(result.reason)
19512
+ });
19513
+ }
19452
19514
  }
19453
- return {
19454
- name,
19455
- model: cfg.model,
19456
- status: "failed",
19457
- error: result.reason instanceof Error ? result.reason.message : String(result.reason)
19458
- };
19459
- });
19515
+ }
19516
+ return results;
19460
19517
  }
19461
19518
  async runMaster(prompt, councillorResults, councilConfig, parentSessionId, timeout, presetMasterOverride) {
19462
19519
  const masterConfig = councilConfig.master;
@@ -505,6 +505,15 @@
505
505
  "type": "string",
506
506
  "pattern": "^[^/\\s]+\\/[^\\s]+$"
507
507
  }
508
+ },
509
+ "councillor_execution_mode": {
510
+ "default": "parallel",
511
+ "description": "Execution mode for councillors. \"serial\" runs them one at a time (required for single-model systems). \"parallel\" runs them concurrently (default, faster for multi-model systems).",
512
+ "type": "string",
513
+ "enum": [
514
+ "parallel",
515
+ "serial"
516
+ ]
508
517
  }
509
518
  },
510
519
  "required": [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "oh-my-opencode-slim",
3
- "version": "0.8.6",
3
+ "version": "0.9.0",
4
4
  "description": "Lightweight agent orchestration plugin for OpenCode - a slimmed-down fork of oh-my-opencode",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",