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 +4 -2
- package/dist/config/council-schema.d.ts +16 -1
- package/dist/config/schema.d.ts +4 -0
- package/dist/index.js +125 -68
- package/oh-my-opencode-slim.schema.json +9 -0
- package/package.json +1 -1
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: ["
|
|
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.
|
package/dist/config/schema.d.ts
CHANGED
|
@@ -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: ["
|
|
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
|
-
-
|
|
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
|
|
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
|
|
19410
|
-
|
|
19411
|
-
|
|
19412
|
-
|
|
19413
|
-
|
|
19414
|
-
|
|
19415
|
-
|
|
19416
|
-
|
|
19417
|
-
|
|
19418
|
-
|
|
19419
|
-
|
|
19420
|
-
|
|
19421
|
-
|
|
19422
|
-
|
|
19423
|
-
|
|
19424
|
-
|
|
19425
|
-
|
|
19426
|
-
|
|
19427
|
-
|
|
19428
|
-
|
|
19429
|
-
|
|
19430
|
-
|
|
19431
|
-
|
|
19432
|
-
|
|
19433
|
-
|
|
19434
|
-
|
|
19435
|
-
|
|
19436
|
-
|
|
19437
|
-
|
|
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
|
-
|
|
19442
|
-
|
|
19443
|
-
|
|
19444
|
-
|
|
19445
|
-
|
|
19446
|
-
|
|
19447
|
-
|
|
19448
|
-
|
|
19449
|
-
|
|
19450
|
-
|
|
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
|
-
|
|
19454
|
-
|
|
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