@oeronteros-1/opencode-orchestra 0.5.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/LICENSE +21 -0
- package/README.md +207 -0
- package/dashboard-dist/assets/index-89Gs8jun.css +2 -0
- package/dashboard-dist/assets/index-Bhe8OPZD.js +124 -0
- package/dashboard-dist/index.html +14 -0
- package/dist/agents/build.d.ts +7 -0
- package/dist/agents/build.js +16 -0
- package/dist/agents/build.js.map +1 -0
- package/dist/agents/judge.d.ts +3 -0
- package/dist/agents/judge.js +29 -0
- package/dist/agents/judge.js.map +1 -0
- package/dist/agents/lead.d.ts +3 -0
- package/dist/agents/lead.js +54 -0
- package/dist/agents/lead.js.map +1 -0
- package/dist/agents/types.d.ts +14 -0
- package/dist/agents/types.js +2 -0
- package/dist/agents/types.js.map +1 -0
- package/dist/agents/workers.d.ts +3 -0
- package/dist/agents/workers.js +114 -0
- package/dist/agents/workers.js.map +1 -0
- package/dist/cli.d.ts +24 -0
- package/dist/cli.js +418 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/defaults.d.ts +4 -0
- package/dist/config/defaults.js +26 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/load.d.ts +6 -0
- package/dist/config/load.js +58 -0
- package/dist/config/load.js.map +1 -0
- package/dist/config/paths.d.ts +2 -0
- package/dist/config/paths.js +13 -0
- package/dist/config/paths.js.map +1 -0
- package/dist/config/schema.d.ts +341 -0
- package/dist/config/schema.js +103 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/dashboard/server.d.ts +12 -0
- package/dist/dashboard/server.js +297 -0
- package/dist/dashboard/server.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +85 -0
- package/dist/index.js.map +1 -0
- package/dist/profiles/architecture.d.ts +2 -0
- package/dist/profiles/architecture.js +13 -0
- package/dist/profiles/architecture.js.map +1 -0
- package/dist/profiles/catalog.d.ts +2 -0
- package/dist/profiles/catalog.js +39 -0
- package/dist/profiles/catalog.js.map +1 -0
- package/dist/profiles/debug.d.ts +2 -0
- package/dist/profiles/debug.js +14 -0
- package/dist/profiles/debug.js.map +1 -0
- package/dist/profiles/performance.d.ts +2 -0
- package/dist/profiles/performance.js +13 -0
- package/dist/profiles/performance.js.map +1 -0
- package/dist/profiles/research.d.ts +2 -0
- package/dist/profiles/research.js +13 -0
- package/dist/profiles/research.js.map +1 -0
- package/dist/profiles/security.d.ts +2 -0
- package/dist/profiles/security.js +13 -0
- package/dist/profiles/security.js.map +1 -0
- package/dist/profiles/types.d.ts +9 -0
- package/dist/profiles/types.js +2 -0
- package/dist/profiles/types.js.map +1 -0
- package/dist/profiles/ui.d.ts +2 -0
- package/dist/profiles/ui.js +13 -0
- package/dist/profiles/ui.js.map +1 -0
- package/dist/prompts/load.d.ts +4 -0
- package/dist/prompts/load.js +26 -0
- package/dist/prompts/load.js.map +1 -0
- package/dist/routing/budget.d.ts +11 -0
- package/dist/routing/budget.js +45 -0
- package/dist/routing/budget.js.map +1 -0
- package/dist/routing/classifier.d.ts +10 -0
- package/dist/routing/classifier.js +160 -0
- package/dist/routing/classifier.js.map +1 -0
- package/dist/routing/escalation.d.ts +12 -0
- package/dist/routing/escalation.js +30 -0
- package/dist/routing/escalation.js.map +1 -0
- package/dist/routing/model-discovery.d.ts +3 -0
- package/dist/routing/model-discovery.js +96 -0
- package/dist/routing/model-discovery.js.map +1 -0
- package/dist/routing/model-resolver.d.ts +26 -0
- package/dist/routing/model-resolver.js +66 -0
- package/dist/routing/model-resolver.js.map +1 -0
- package/dist/superpowers/compatibility.d.ts +2 -0
- package/dist/superpowers/compatibility.js +9 -0
- package/dist/superpowers/compatibility.js.map +1 -0
- package/dist/telemetry/ledger.d.ts +68 -0
- package/dist/telemetry/ledger.js +179 -0
- package/dist/telemetry/ledger.js.map +1 -0
- package/dist/tools.d.ts +4 -0
- package/dist/tools.js +57 -0
- package/dist/tools.js.map +1 -0
- package/package.json +79 -0
- package/prompts/judge.md +13 -0
- package/prompts/lead.md +24 -0
- package/schema/opencode-orchestra.schema.json +112 -0
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { mkdir, readFile, rename, writeFile } from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { normalizeCandidate } from "../routing/model-resolver.js";
|
|
4
|
+
function emptySession() {
|
|
5
|
+
return {
|
|
6
|
+
agents: {},
|
|
7
|
+
premiumEscalations: 0,
|
|
8
|
+
estimatedPaidUsage: 0,
|
|
9
|
+
freeWorkerCalls: 0,
|
|
10
|
+
messages: {},
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
export function emptyLedgerState() {
|
|
14
|
+
return { version: 2, updatedAt: new Date(0).toISOString(), sessions: {} };
|
|
15
|
+
}
|
|
16
|
+
function normalizeTokens(tokens) {
|
|
17
|
+
return {
|
|
18
|
+
input: Math.max(0, tokens?.input ?? 0),
|
|
19
|
+
output: Math.max(0, tokens?.output ?? 0),
|
|
20
|
+
reasoning: Math.max(0, tokens?.reasoning ?? 0),
|
|
21
|
+
cache: {
|
|
22
|
+
read: Math.max(0, tokens?.cache?.read ?? 0),
|
|
23
|
+
write: Math.max(0, tokens?.cache?.write ?? 0),
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
function upgradeState(input) {
|
|
28
|
+
if (typeof input !== "object" || input === null)
|
|
29
|
+
return emptyLedgerState();
|
|
30
|
+
const candidate = input;
|
|
31
|
+
if (candidate.version !== 1 && candidate.version !== 2)
|
|
32
|
+
return emptyLedgerState();
|
|
33
|
+
const sessions = candidate.sessions ?? {};
|
|
34
|
+
for (const session of Object.values(sessions)) {
|
|
35
|
+
session.messages ??= {};
|
|
36
|
+
for (const [id, message] of Object.entries(session.messages)) {
|
|
37
|
+
session.messages[id] = {
|
|
38
|
+
...message,
|
|
39
|
+
cost: Math.max(0, message.cost ?? 0),
|
|
40
|
+
tokens: normalizeTokens(message.tokens),
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return {
|
|
45
|
+
version: 2,
|
|
46
|
+
updatedAt: candidate.updatedAt ?? new Date(0).toISOString(),
|
|
47
|
+
sessions,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
export async function readLedgerState(file) {
|
|
51
|
+
try {
|
|
52
|
+
return upgradeState(JSON.parse(await readFile(file, "utf8")));
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return emptyLedgerState();
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
export class Ledger {
|
|
59
|
+
enabled;
|
|
60
|
+
stateFile;
|
|
61
|
+
modelCosts;
|
|
62
|
+
state;
|
|
63
|
+
queue = Promise.resolve();
|
|
64
|
+
constructor(directory, telemetryDirectory, enabled, pools) {
|
|
65
|
+
this.enabled = enabled;
|
|
66
|
+
this.stateFile = path.resolve(directory, telemetryDirectory, "state.json");
|
|
67
|
+
this.modelCosts = new Map(pools.flat().map((candidate) => {
|
|
68
|
+
const normalized = normalizeCandidate(candidate);
|
|
69
|
+
return [normalized.id, normalized.cost];
|
|
70
|
+
}));
|
|
71
|
+
}
|
|
72
|
+
async load() {
|
|
73
|
+
if (this.state)
|
|
74
|
+
return this.state;
|
|
75
|
+
try {
|
|
76
|
+
this.state = upgradeState(JSON.parse(await readFile(this.stateFile, "utf8")));
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
this.state = emptyLedgerState();
|
|
80
|
+
}
|
|
81
|
+
return this.state;
|
|
82
|
+
}
|
|
83
|
+
async save(state) {
|
|
84
|
+
if (!this.enabled)
|
|
85
|
+
return;
|
|
86
|
+
const directory = path.dirname(this.stateFile);
|
|
87
|
+
await mkdir(directory, { recursive: true });
|
|
88
|
+
const ignoreFile = path.join(directory, ".gitignore");
|
|
89
|
+
try {
|
|
90
|
+
await writeFile(ignoreFile, "*\n!.gitignore\n", { flag: "wx" });
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
// The sentinel already exists or the directory is intentionally read-only.
|
|
94
|
+
}
|
|
95
|
+
state.updatedAt = new Date().toISOString();
|
|
96
|
+
const temporary = `${this.stateFile}.tmp`;
|
|
97
|
+
await writeFile(temporary, `${JSON.stringify(state, null, 2)}\n`, "utf8");
|
|
98
|
+
await rename(temporary, this.stateFile);
|
|
99
|
+
}
|
|
100
|
+
mutate(operation) {
|
|
101
|
+
if (!this.enabled)
|
|
102
|
+
return Promise.resolve();
|
|
103
|
+
this.queue = this.queue.then(async () => {
|
|
104
|
+
const state = await this.load();
|
|
105
|
+
operation(state);
|
|
106
|
+
await this.save(state);
|
|
107
|
+
});
|
|
108
|
+
return this.queue;
|
|
109
|
+
}
|
|
110
|
+
async setProfile(sessionID, profile) {
|
|
111
|
+
await this.mutate((state) => {
|
|
112
|
+
const session = (state.sessions[sessionID] ??= emptySession());
|
|
113
|
+
session.profile = profile;
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
async setConsensus(sessionID, consensus) {
|
|
117
|
+
await this.mutate((state) => {
|
|
118
|
+
const session = (state.sessions[sessionID] ??= emptySession());
|
|
119
|
+
session.consensus = consensus;
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
async recordAssistant(info) {
|
|
123
|
+
const mode = info.mode;
|
|
124
|
+
if (!mode?.startsWith("orch-"))
|
|
125
|
+
return;
|
|
126
|
+
await this.mutate((state) => {
|
|
127
|
+
const session = (state.sessions[info.sessionID] ??= emptySession());
|
|
128
|
+
const previous = session.messages[info.id];
|
|
129
|
+
const currentCost = Math.max(0, info.cost ?? 0);
|
|
130
|
+
const delta = Math.max(0, currentCost - (previous?.cost ?? 0));
|
|
131
|
+
session.estimatedPaidUsage += delta;
|
|
132
|
+
if (!previous) {
|
|
133
|
+
session.agents[mode] = (session.agents[mode] ?? 0) + 1;
|
|
134
|
+
if (mode === "orch-judge")
|
|
135
|
+
session.premiumEscalations += 1;
|
|
136
|
+
const model = info.providerID && info.modelID ? `${info.providerID}/${info.modelID}` : undefined;
|
|
137
|
+
if (mode !== "orch-lead" && mode !== "orch-judge" && model && this.modelCosts.get(model) === "free") {
|
|
138
|
+
session.freeWorkerCalls += 1;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
session.messages[info.id] = {
|
|
142
|
+
cost: currentCost,
|
|
143
|
+
...(mode ? { agent: mode } : {}),
|
|
144
|
+
...(info.modelID ? { model: info.modelID } : {}),
|
|
145
|
+
...(info.providerID ? { provider: info.providerID } : {}),
|
|
146
|
+
...(info.time?.created ? { createdAt: info.time.created } : {}),
|
|
147
|
+
...(info.time?.completed ? { completedAt: info.time.completed } : {}),
|
|
148
|
+
...(info.finish ? { finish: info.finish } : {}),
|
|
149
|
+
tokens: normalizeTokens(info.tokens),
|
|
150
|
+
};
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
async getSession(sessionID) {
|
|
154
|
+
await this.queue;
|
|
155
|
+
const state = await this.load();
|
|
156
|
+
return state.sessions[sessionID] ?? emptySession();
|
|
157
|
+
}
|
|
158
|
+
async formatStatus(sessionID) {
|
|
159
|
+
const session = await this.getSession(sessionID);
|
|
160
|
+
const agents = Object.entries(session.agents)
|
|
161
|
+
.sort(([a], [b]) => a.localeCompare(b))
|
|
162
|
+
.map(([name, calls]) => ` ${name.padEnd(24)} ${calls}`)
|
|
163
|
+
.join("\n");
|
|
164
|
+
return [
|
|
165
|
+
"OpenCode Orchestra status",
|
|
166
|
+
"",
|
|
167
|
+
`profile: ${session.profile?.toUpperCase() ?? "not classified"}`,
|
|
168
|
+
"",
|
|
169
|
+
"agents:",
|
|
170
|
+
agents || " no recorded calls",
|
|
171
|
+
"",
|
|
172
|
+
`premium escalations: ${session.premiumEscalations}`,
|
|
173
|
+
`estimated paid usage: $${session.estimatedPaidUsage.toFixed(4)}`,
|
|
174
|
+
`free worker calls: ${session.freeWorkerCalls}`,
|
|
175
|
+
`consensus: ${session.consensus === undefined ? "not recorded" : `${Math.round(session.consensus * 100)}%`}`,
|
|
176
|
+
].join("\n");
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=ledger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ledger.js","sourceRoot":"","sources":["../../src/telemetry/ledger.ts"],"names":[],"mappings":"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"}
|
package/dist/tools.d.ts
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type ToolDefinition } from "@opencode-ai/plugin";
|
|
2
|
+
import type { OrchestraConfig } from "./config/schema.js";
|
|
3
|
+
import type { Ledger } from "./telemetry/ledger.js";
|
|
4
|
+
export declare function createOrchestraTools(config: OrchestraConfig, ledger: Ledger): Record<string, ToolDefinition>;
|
package/dist/tools.js
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { tool } from "@opencode-ai/plugin";
|
|
2
|
+
import { profileNameSchema } from "./config/schema.js";
|
|
3
|
+
import { PROFILE_CATALOG } from "./profiles/catalog.js";
|
|
4
|
+
import { classifyTask } from "./routing/classifier.js";
|
|
5
|
+
import { decideEscalation } from "./routing/escalation.js";
|
|
6
|
+
export function createOrchestraTools(config, ledger) {
|
|
7
|
+
return {
|
|
8
|
+
orchestra_route: tool({
|
|
9
|
+
description: "Classify a complex task and return the recommended OpenCode Orchestra worker team for the active budget mode. This does not execute the team.",
|
|
10
|
+
args: {
|
|
11
|
+
task: tool.schema.string().min(1),
|
|
12
|
+
profile: tool.schema.string().optional(),
|
|
13
|
+
},
|
|
14
|
+
async execute(args, context) {
|
|
15
|
+
const requested = args.profile ? profileNameSchema.safeParse(args.profile) : undefined;
|
|
16
|
+
const automatic = classifyTask(args.task, config.orchestration.profiles);
|
|
17
|
+
const profile = requested?.success ? requested.data : automatic.profile;
|
|
18
|
+
const classification = requested?.success
|
|
19
|
+
? { ...automatic, profile, confidence: 1, matchedSignals: ["explicit profile"] }
|
|
20
|
+
: automatic;
|
|
21
|
+
const definition = PROFILE_CATALOG[profile];
|
|
22
|
+
const enabledWorkers = Object.values(PROFILE_CATALOG)
|
|
23
|
+
.filter((candidate) => config.orchestration.profiles[candidate.name] !== false)
|
|
24
|
+
.flatMap((candidate) => candidate.workers);
|
|
25
|
+
const workerPool = config.budget === "ebobo"
|
|
26
|
+
? Array.from(new Set(enabledWorkers))
|
|
27
|
+
: definition.workers;
|
|
28
|
+
const workers = workerPool.slice(0, config.orchestration.maxWorkers);
|
|
29
|
+
const escalation = decideEscalation(config, { classification });
|
|
30
|
+
const sessionID = context.sessionID;
|
|
31
|
+
if (sessionID)
|
|
32
|
+
await ledger.setProfile(sessionID, profile);
|
|
33
|
+
return JSON.stringify({
|
|
34
|
+
profile,
|
|
35
|
+
secondaryProfiles: classification.secondaryProfiles,
|
|
36
|
+
confidence: classification.confidence,
|
|
37
|
+
critical: classification.critical,
|
|
38
|
+
workers,
|
|
39
|
+
parallelWorkers: Math.min(config.orchestration.parallelWorkers, workers.length),
|
|
40
|
+
escalation,
|
|
41
|
+
next: `Delegate the full task once to orch-lead with profile=${profile}. Let orch-lead dispatch workers.`,
|
|
42
|
+
}, null, 2);
|
|
43
|
+
},
|
|
44
|
+
}),
|
|
45
|
+
orchestra_status: tool({
|
|
46
|
+
description: "Show model, worker, escalation, cost, and consensus statistics for the current Orchestra session.",
|
|
47
|
+
args: {},
|
|
48
|
+
async execute(_args, context) {
|
|
49
|
+
const sessionID = context.sessionID;
|
|
50
|
+
if (!sessionID)
|
|
51
|
+
return "Orchestra status is unavailable because the current session ID was not provided.";
|
|
52
|
+
return ledger.formatStatus(sessionID);
|
|
53
|
+
},
|
|
54
|
+
}),
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@oeronteros-1/opencode-orchestra",
|
|
3
|
+
"version": "0.5.0",
|
|
4
|
+
"description": "Additive model and subagent orchestration for OpenCode",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"publishConfig": {
|
|
8
|
+
"access": "public"
|
|
9
|
+
},
|
|
10
|
+
"keywords": [
|
|
11
|
+
"opencode",
|
|
12
|
+
"plugin",
|
|
13
|
+
"agents",
|
|
14
|
+
"orchestration"
|
|
15
|
+
],
|
|
16
|
+
"files": [
|
|
17
|
+
"dist",
|
|
18
|
+
"dashboard-dist",
|
|
19
|
+
"prompts",
|
|
20
|
+
"schema",
|
|
21
|
+
"README.md",
|
|
22
|
+
"LICENSE"
|
|
23
|
+
],
|
|
24
|
+
"exports": {
|
|
25
|
+
".": "./dist/index.js",
|
|
26
|
+
"./schema": "./schema/opencode-orchestra.schema.json"
|
|
27
|
+
},
|
|
28
|
+
"bin": {
|
|
29
|
+
"opencode-orchestra": "dist/cli.js"
|
|
30
|
+
},
|
|
31
|
+
"scripts": {
|
|
32
|
+
"build": "npm run build:dashboard && npm run build:plugin",
|
|
33
|
+
"build:dashboard": "vite build --config dashboard/vite.config.ts",
|
|
34
|
+
"build:plugin": "tsc -p tsconfig.build.json",
|
|
35
|
+
"dev:dashboard": "vite --config dashboard/vite.config.ts",
|
|
36
|
+
"prepack": "npm run build",
|
|
37
|
+
"typecheck": "tsc --noEmit && tsc -p dashboard/tsconfig.json",
|
|
38
|
+
"test": "tsc -p tsconfig.test.json && node --test dist-test/test/classifier.test.js dist-test/test/model-resolver.test.js dist-test/test/model-discovery.test.js dist-test/test/budget.test.js dist-test/test/agents.test.js dist-test/test/plugin.test.js dist-test/test/cli.test.js dist-test/test/dashboard.test.js",
|
|
39
|
+
"check": "npm run typecheck && npm test"
|
|
40
|
+
},
|
|
41
|
+
"dependencies": {
|
|
42
|
+
"@opencode-ai/plugin": "^1.18.18",
|
|
43
|
+
"jsonc-parser": "^3.3.1",
|
|
44
|
+
"zod": "^4.0.0"
|
|
45
|
+
},
|
|
46
|
+
"devDependencies": {
|
|
47
|
+
"@base-ui/react": "^1.7.0",
|
|
48
|
+
"@hookform/resolvers": "^5.9.0",
|
|
49
|
+
"@hugeicons/core-free-icons": "^4.2.3",
|
|
50
|
+
"@hugeicons/react": "^1.1.9",
|
|
51
|
+
"@tailwindcss/vite": "^4.3.3",
|
|
52
|
+
"@tanstack/react-query": "^5.101.4",
|
|
53
|
+
"@tanstack/react-router": "^1.170.29",
|
|
54
|
+
"@tanstack/react-table": "^9.1.2",
|
|
55
|
+
"@tanstack/react-virtual": "^3.14.9",
|
|
56
|
+
"@types/node": "^22.0.0",
|
|
57
|
+
"@types/react": "^19.2.18",
|
|
58
|
+
"@types/react-dom": "^19.2.4",
|
|
59
|
+
"@vitejs/plugin-react": "^6.0.5",
|
|
60
|
+
"class-variance-authority": "^0.7.1",
|
|
61
|
+
"clsx": "^2.1.1",
|
|
62
|
+
"i18next": "^26.3.6",
|
|
63
|
+
"motion": "^13.1.0",
|
|
64
|
+
"react": "^19.2.8",
|
|
65
|
+
"react-dom": "^19.2.8",
|
|
66
|
+
"react-hook-form": "^7.85.0",
|
|
67
|
+
"react-i18next": "^17.0.11",
|
|
68
|
+
"recharts": "^3.10.1",
|
|
69
|
+
"tailwind-merge": "^3.6.0",
|
|
70
|
+
"tailwindcss": "^4.3.3",
|
|
71
|
+
"typescript": "^5.9.0",
|
|
72
|
+
"vite": "^8.2.1",
|
|
73
|
+
"zustand": "^5.0.15"
|
|
74
|
+
},
|
|
75
|
+
"engines": {
|
|
76
|
+
"bun": ">=1.2",
|
|
77
|
+
"node": ">=22"
|
|
78
|
+
}
|
|
79
|
+
}
|
package/prompts/judge.md
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
You are `orch-judge`, a costly independent arbiter.
|
|
2
|
+
|
|
3
|
+
You are called only when specialist findings conflict, uncertainty remains above the configured threshold, or the task is critical. Inspect only the evidence needed to resolve the disagreement.
|
|
4
|
+
|
|
5
|
+
Do not delegate. Do not edit files. Do not replace the primary agent's decision-making.
|
|
6
|
+
|
|
7
|
+
Return:
|
|
8
|
+
|
|
9
|
+
- claims accepted and the evidence supporting them;
|
|
10
|
+
- claims rejected and why;
|
|
11
|
+
- remaining uncertainty;
|
|
12
|
+
- safest recommended decision;
|
|
13
|
+
- the cheapest decisive verification if uncertainty remains.
|
package/prompts/lead.md
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
You are `orch-lead`, an evidence-driven orchestration subagent.
|
|
2
|
+
|
|
3
|
+
For structural repository questions, query Codebase Memory before broad grep or file reading, then verify decisive claims against exact source. Use MemoryGraph `recall_memories` at most once near the start when prior decisions or learned patterns can materially change the answer. Store only verified fixes, architecture decisions, and reusable patterns; never store secrets, raw transcripts, or transient task state. Add relationships when they clarify why a memory matters. Use Context7 only for current library/API facts that repository evidence cannot settle.
|
|
4
|
+
|
|
5
|
+
Your job is to decide what kind of intellectual work the task requires, dispatch the smallest useful specialist team, and synthesize their evidence for the primary agent.
|
|
6
|
+
|
|
7
|
+
Operating rules:
|
|
8
|
+
|
|
9
|
+
1. Classify the task as architecture, debug, UI, research, review, security, performance, migration, or ops. Use at most two secondary profiles.
|
|
10
|
+
2. Dispatch workers only when their evidence can change the answer. Avoid ceremonial parallelism.
|
|
11
|
+
3. Give each worker a narrow question, relevant context, explicit deliverable, and a prohibition on editing or further delegation.
|
|
12
|
+
4. Run independent questions in parallel, but stay within the runtime worker limits.
|
|
13
|
+
5. Compare claims, evidence, and uncertainty. Do not treat repeated unsupported opinions as consensus.
|
|
14
|
+
6. Invoke `orch-judge` only for critical risk or genuinely unresolved disagreement. Never use it merely to polish prose.
|
|
15
|
+
7. Do not edit files. Do not invoke yourself. Do not take over the primary agent's implementation, plan, TDD, review, or active skill workflow.
|
|
16
|
+
|
|
17
|
+
Return a compact handoff with:
|
|
18
|
+
|
|
19
|
+
- selected profile and why;
|
|
20
|
+
- workers used and their questions;
|
|
21
|
+
- evidence-backed findings;
|
|
22
|
+
- consensus and unresolved disagreement;
|
|
23
|
+
- recommendation and risks;
|
|
24
|
+
- verification or next implementation step for the primary agent.
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://unpkg.com/@oeronteros-1/opencode-orchestra@latest/schema/opencode-orchestra.schema.json",
|
|
4
|
+
"title": "OpenCode Orchestra configuration",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"additionalProperties": false,
|
|
7
|
+
"properties": {
|
|
8
|
+
"$schema": { "type": "string" },
|
|
9
|
+
"budget": { "enum": ["eco", "balanced", "quality", "ebobo"], "default": "balanced" },
|
|
10
|
+
"models": {
|
|
11
|
+
"type": "object",
|
|
12
|
+
"additionalProperties": false,
|
|
13
|
+
"properties": {
|
|
14
|
+
"strategy": { "enum": ["auto", "manual"], "default": "auto" },
|
|
15
|
+
"agents": {
|
|
16
|
+
"type": "object",
|
|
17
|
+
"default": {},
|
|
18
|
+
"additionalProperties": { "type": "string", "pattern": "^[^/]+/.+$" }
|
|
19
|
+
},
|
|
20
|
+
"lead": { "$ref": "#/$defs/modelPool" },
|
|
21
|
+
"worker": {
|
|
22
|
+
"type": "object",
|
|
23
|
+
"additionalProperties": false,
|
|
24
|
+
"properties": {
|
|
25
|
+
"code": { "$ref": "#/$defs/modelPool" },
|
|
26
|
+
"reasoning": { "$ref": "#/$defs/modelPool" },
|
|
27
|
+
"research": { "$ref": "#/$defs/modelPool" },
|
|
28
|
+
"vision": { "$ref": "#/$defs/modelPool" },
|
|
29
|
+
"image": { "$ref": "#/$defs/modelPool" }
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
"judge": { "$ref": "#/$defs/modelPool" }
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
"orchestration": {
|
|
36
|
+
"type": "object",
|
|
37
|
+
"additionalProperties": false,
|
|
38
|
+
"properties": {
|
|
39
|
+
"parallelWorkers": { "type": "integer", "minimum": 1, "maximum": 8, "default": 3 },
|
|
40
|
+
"maxWorkers": { "type": "integer", "minimum": 1, "maximum": 12, "default": 5 },
|
|
41
|
+
"premiumEscalation": { "type": "boolean", "default": true },
|
|
42
|
+
"maxPremiumCallsPerTask": { "type": "integer", "minimum": 0, "maximum": 5, "default": 1 },
|
|
43
|
+
"confidenceThreshold": { "type": "number", "minimum": 0, "maximum": 1, "default": 0.72 },
|
|
44
|
+
"exposeWorkers": { "type": "boolean", "default": false },
|
|
45
|
+
"profiles": {
|
|
46
|
+
"type": "object",
|
|
47
|
+
"additionalProperties": false,
|
|
48
|
+
"properties": {
|
|
49
|
+
"architecture": { "type": "boolean" },
|
|
50
|
+
"debug": { "type": "boolean" },
|
|
51
|
+
"ui": { "type": "boolean" },
|
|
52
|
+
"research": { "type": "boolean" },
|
|
53
|
+
"review": { "type": "boolean" },
|
|
54
|
+
"security": { "type": "boolean" },
|
|
55
|
+
"performance": { "type": "boolean" },
|
|
56
|
+
"migration": { "type": "boolean" },
|
|
57
|
+
"ops": { "type": "boolean" }
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
"superpowers": {
|
|
63
|
+
"type": "object",
|
|
64
|
+
"additionalProperties": false,
|
|
65
|
+
"properties": {
|
|
66
|
+
"compatibility": { "type": "boolean", "default": true },
|
|
67
|
+
"injectPrimaryHint": { "type": "boolean", "default": false }
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
"telemetry": {
|
|
71
|
+
"type": "object",
|
|
72
|
+
"additionalProperties": false,
|
|
73
|
+
"properties": {
|
|
74
|
+
"enabled": { "type": "boolean", "default": true },
|
|
75
|
+
"directory": { "type": "string", "minLength": 1, "default": ".orchestra" }
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
},
|
|
79
|
+
"$defs": {
|
|
80
|
+
"modelPool": {
|
|
81
|
+
"type": "array",
|
|
82
|
+
"items": {
|
|
83
|
+
"oneOf": [
|
|
84
|
+
{ "type": "string", "pattern": "^[^/]+/.+$" },
|
|
85
|
+
{ "$ref": "#/$defs/model" }
|
|
86
|
+
]
|
|
87
|
+
}
|
|
88
|
+
},
|
|
89
|
+
"model": {
|
|
90
|
+
"type": "object",
|
|
91
|
+
"additionalProperties": false,
|
|
92
|
+
"required": ["id"],
|
|
93
|
+
"properties": {
|
|
94
|
+
"id": { "type": "string", "pattern": "^[^/]+/.+$" },
|
|
95
|
+
"cost": { "enum": ["free", "subscription", "paid"], "default": "free" },
|
|
96
|
+
"tier": { "enum": ["worker", "lead", "frontier"], "default": "worker" },
|
|
97
|
+
"priority": { "type": "number", "minimum": 0, "maximum": 100, "default": 50 },
|
|
98
|
+
"capabilities": {
|
|
99
|
+
"type": "array",
|
|
100
|
+
"items": {
|
|
101
|
+
"enum": ["code", "reasoning", "research", "vision", "image", "review", "security", "performance", "large-context"]
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
"scores": {
|
|
105
|
+
"type": "object",
|
|
106
|
+
"additionalProperties": { "type": "number", "minimum": 0, "maximum": 10 }
|
|
107
|
+
},
|
|
108
|
+
"context": { "enum": ["small", "medium", "large", "xlarge"] }
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|