oh-my-openidea 0.1.2 → 0.1.4
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/README.md +6 -6
- package/dist/cli/dynamic-model-selection.d.ts +1 -1
- package/dist/cli/index.js +195 -182
- package/dist/cli/providers.d.ts +40 -40
- package/dist/cli/scoring-v2/types.d.ts +1 -1
- package/dist/config/loader.d.ts +1 -1
- package/dist/index.js +40 -27
- package/dist/utils/agent-variant.d.ts +5 -5
- package/package.json +1 -1
- package/src/skills/cartography/SKILL.md +32 -0
package/README.md
CHANGED
|
@@ -57,7 +57,7 @@ Additional guides:
|
|
|
57
57
|
|
|
58
58
|
### 01. Orchestrator: The Architect of Discovery
|
|
59
59
|
|
|
60
|
-
| The one who sees all paths. | The Orchestrator
|
|
60
|
+
| The one who sees all paths. | The Orchestrator is the lead coordinator for the whole research workflow. Give it a problem, and it decides which agents should work next, what information is still missing, and how the pieces should come together into a strong research direction. |
|
|
61
61
|
| --- | --- |
|
|
62
62
|
| Role: Strategic research coordination and idea synthesis |
|
|
63
63
|
| Prompt: orchestrator.ts |
|
|
@@ -67,7 +67,7 @@ Additional guides:
|
|
|
67
67
|
|
|
68
68
|
### 02. Surveyor: The Cartographer of Knowledge
|
|
69
69
|
|
|
70
|
-
| The one who maps the unknown. | The Surveyor
|
|
70
|
+
| The one who maps the unknown. | The Surveyor finds and collects the most relevant papers for your topic. It helps you quickly understand what has already been done, which papers matter most, and where the current limits of the literature are. |
|
|
71
71
|
| --- | --- |
|
|
72
72
|
| Role: Literature search and paper retrieval |
|
|
73
73
|
| Prompt: surveyor.ts |
|
|
@@ -77,7 +77,7 @@ Additional guides:
|
|
|
77
77
|
|
|
78
78
|
### 03. Synthesizer: The Weaver of Understanding
|
|
79
79
|
|
|
80
|
-
| The one who connects the dots. | The Synthesizer
|
|
80
|
+
| The one who connects the dots. | The Synthesizer turns a pile of papers into a clear understanding of the field. It groups results, highlights patterns and disagreements, and points out open problems that can lead to new research ideas. |
|
|
81
81
|
| --- | --- |
|
|
82
82
|
| Role: Gap analysis and knowledge synthesis |
|
|
83
83
|
| Prompt: synthesizer.ts |
|
|
@@ -87,7 +87,7 @@ Additional guides:
|
|
|
87
87
|
|
|
88
88
|
### 04. Critic: The Guardian of Truth
|
|
89
89
|
|
|
90
|
-
| The voice of rigorous doubt. | The Critic
|
|
90
|
+
| The voice of rigorous doubt. | The Critic stress-tests your idea before you invest too much in it. It looks for weak assumptions, missing baselines, overlap with prior work, and other reasons the idea might fail novelty or review standards. |
|
|
91
91
|
| --- | --- |
|
|
92
92
|
| Role: Novelty validation and adversarial review |
|
|
93
93
|
| Prompt: critic.ts |
|
|
@@ -97,7 +97,7 @@ Additional guides:
|
|
|
97
97
|
|
|
98
98
|
### 05. Architect: The Builder of Methods
|
|
99
99
|
|
|
100
|
-
| The one who turns vision into plan. | The Architect
|
|
100
|
+
| The one who turns vision into plan. | The Architect converts an idea into a concrete experiment plan. It defines datasets, baselines, metrics, ablations, failure cases, and resource needs so you know exactly how to test whether the idea works. |
|
|
101
101
|
| --- | --- |
|
|
102
102
|
| Role: Methodology and experiment design |
|
|
103
103
|
| Prompt: architect.ts |
|
|
@@ -107,7 +107,7 @@ Additional guides:
|
|
|
107
107
|
|
|
108
108
|
### 06. Writer: The Voice of Science
|
|
109
109
|
|
|
110
|
-
| The one who makes it legible to the world. | The Writer
|
|
110
|
+
| The one who makes it legible to the world. | The Writer turns your research into a clear paper draft. It helps organize the story, sharpen the main message, and present the method and results in a way that is easy for readers and reviewers to follow. |
|
|
111
111
|
| --- | --- |
|
|
112
112
|
| Role: Research writing and paper structure |
|
|
113
113
|
| Prompt: writer.ts |
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { DiscoveredModel, DynamicModelPlan, ExternalSignalMap, InstallConfig, ScoringEngineVersion } from './types';
|
|
2
|
-
declare const AGENTS: readonly ["orchestrator", "
|
|
2
|
+
declare const AGENTS: readonly ["orchestrator", "critic", "architect", "surveyor", "synthesizer", "writer"];
|
|
3
3
|
type AgentName = (typeof AGENTS)[number];
|
|
4
4
|
export type V1RankedScore = {
|
|
5
5
|
model: string;
|
package/dist/cli/index.js
CHANGED
|
@@ -13782,10 +13782,40 @@ import { homedir as homedir2 } from "os";
|
|
|
13782
13782
|
import { dirname, join as join2 } from "path";
|
|
13783
13783
|
import { fileURLToPath } from "url";
|
|
13784
13784
|
var CUSTOM_SKILLS = [
|
|
13785
|
+
{
|
|
13786
|
+
name: "literature-review",
|
|
13787
|
+
description: "Structured literature survey workflow",
|
|
13788
|
+
allowedAgents: ["orchestrator", "surveyor", "synthesizer"],
|
|
13789
|
+
sourcePath: "src/skills/literature-review"
|
|
13790
|
+
},
|
|
13791
|
+
{
|
|
13792
|
+
name: "hypothesis-generation",
|
|
13793
|
+
description: "Gap-driven hypothesis generation workflow",
|
|
13794
|
+
allowedAgents: ["orchestrator", "synthesizer"],
|
|
13795
|
+
sourcePath: "src/skills/hypothesis-generation"
|
|
13796
|
+
},
|
|
13797
|
+
{
|
|
13798
|
+
name: "idea-critique",
|
|
13799
|
+
description: "Multi-round adversarial idea review workflow",
|
|
13800
|
+
allowedAgents: ["orchestrator", "critic"],
|
|
13801
|
+
sourcePath: "src/skills/idea-critique"
|
|
13802
|
+
},
|
|
13803
|
+
{
|
|
13804
|
+
name: "experiment-design",
|
|
13805
|
+
description: "Experimental plan design workflow",
|
|
13806
|
+
allowedAgents: ["orchestrator", "architect"],
|
|
13807
|
+
sourcePath: "src/skills/experiment-design"
|
|
13808
|
+
},
|
|
13809
|
+
{
|
|
13810
|
+
name: "paper-outline",
|
|
13811
|
+
description: "Paper outline generation workflow",
|
|
13812
|
+
allowedAgents: ["orchestrator", "writer"],
|
|
13813
|
+
sourcePath: "src/skills/paper-outline"
|
|
13814
|
+
},
|
|
13785
13815
|
{
|
|
13786
13816
|
name: "cartography",
|
|
13787
13817
|
description: "Repository understanding and hierarchical codemap generation",
|
|
13788
|
-
allowedAgents: ["orchestrator"
|
|
13818
|
+
allowedAgents: ["orchestrator"],
|
|
13789
13819
|
sourcePath: "src/skills/cartography"
|
|
13790
13820
|
}
|
|
13791
13821
|
];
|
|
@@ -13832,39 +13862,22 @@ function installCustomSkill(skill) {
|
|
|
13832
13862
|
// src/cli/skills.ts
|
|
13833
13863
|
var RECOMMENDED_SKILLS = [
|
|
13834
13864
|
{
|
|
13835
|
-
name: "
|
|
13836
|
-
repo: "https://github.com/
|
|
13837
|
-
skillName: "
|
|
13838
|
-
allowedAgents: ["orchestrator"
|
|
13839
|
-
description: "
|
|
13865
|
+
name: "simplify",
|
|
13866
|
+
repo: "https://github.com/brianlovin/claude-config",
|
|
13867
|
+
skillName: "simplify",
|
|
13868
|
+
allowedAgents: ["orchestrator"],
|
|
13869
|
+
description: "YAGNI code simplification expert"
|
|
13840
13870
|
},
|
|
13841
13871
|
{
|
|
13842
|
-
name: "
|
|
13843
|
-
repo: "https://github.com/
|
|
13844
|
-
skillName: "
|
|
13845
|
-
allowedAgents: ["
|
|
13846
|
-
description: "
|
|
13847
|
-
|
|
13848
|
-
|
|
13849
|
-
|
|
13850
|
-
|
|
13851
|
-
skillName: "idea-critique",
|
|
13852
|
-
allowedAgents: ["orchestrator", "critic"],
|
|
13853
|
-
description: "Multi-round adversarial idea review workflow"
|
|
13854
|
-
},
|
|
13855
|
-
{
|
|
13856
|
-
name: "experiment-design",
|
|
13857
|
-
repo: "https://github.com/ZeguanXiao/oh-my-openidea",
|
|
13858
|
-
skillName: "experiment-design",
|
|
13859
|
-
allowedAgents: ["orchestrator", "architect"],
|
|
13860
|
-
description: "Experimental plan design workflow"
|
|
13861
|
-
},
|
|
13862
|
-
{
|
|
13863
|
-
name: "paper-outline",
|
|
13864
|
-
repo: "https://github.com/ZeguanXiao/oh-my-openidea",
|
|
13865
|
-
skillName: "paper-outline",
|
|
13866
|
-
allowedAgents: ["orchestrator", "writer"],
|
|
13867
|
-
description: "Paper outline generation workflow"
|
|
13872
|
+
name: "agent-browser",
|
|
13873
|
+
repo: "https://github.com/vercel-labs/agent-browser",
|
|
13874
|
+
skillName: "agent-browser",
|
|
13875
|
+
allowedAgents: ["architect"],
|
|
13876
|
+
description: "High-performance browser automation",
|
|
13877
|
+
postInstallCommands: [
|
|
13878
|
+
"npm install -g agent-browser",
|
|
13879
|
+
"agent-browser install"
|
|
13880
|
+
]
|
|
13868
13881
|
}
|
|
13869
13882
|
];
|
|
13870
13883
|
function installSkill(skill) {
|
|
@@ -13905,85 +13918,85 @@ function installSkill(skill) {
|
|
|
13905
13918
|
// src/cli/providers.ts
|
|
13906
13919
|
var AGENT_NAMES = [
|
|
13907
13920
|
"orchestrator",
|
|
13908
|
-
"
|
|
13909
|
-
"
|
|
13910
|
-
"
|
|
13911
|
-
"
|
|
13912
|
-
"
|
|
13921
|
+
"critic",
|
|
13922
|
+
"architect",
|
|
13923
|
+
"surveyor",
|
|
13924
|
+
"synthesizer",
|
|
13925
|
+
"writer"
|
|
13913
13926
|
];
|
|
13914
13927
|
var MODEL_MAPPINGS = {
|
|
13915
13928
|
kimi: {
|
|
13916
13929
|
orchestrator: { model: "kimi-for-coding/k2p5" },
|
|
13917
|
-
|
|
13918
|
-
|
|
13919
|
-
|
|
13920
|
-
|
|
13921
|
-
|
|
13930
|
+
critic: { model: "kimi-for-coding/k2p5", variant: "high" },
|
|
13931
|
+
synthesizer: { model: "kimi-for-coding/k2p5", variant: "low" },
|
|
13932
|
+
surveyor: { model: "kimi-for-coding/k2p5", variant: "low" },
|
|
13933
|
+
architect: { model: "kimi-for-coding/k2p5", variant: "medium" },
|
|
13934
|
+
writer: { model: "kimi-for-coding/k2p5", variant: "low" }
|
|
13922
13935
|
},
|
|
13923
13936
|
openai: {
|
|
13924
13937
|
orchestrator: { model: "openai/gpt-5.3-codex" },
|
|
13925
|
-
|
|
13926
|
-
|
|
13927
|
-
|
|
13928
|
-
|
|
13929
|
-
|
|
13938
|
+
critic: { model: "openai/gpt-5.3-codex", variant: "high" },
|
|
13939
|
+
synthesizer: { model: "openai/gpt-5.1-codex-mini", variant: "low" },
|
|
13940
|
+
surveyor: { model: "openai/gpt-5.1-codex-mini", variant: "low" },
|
|
13941
|
+
architect: { model: "openai/gpt-5.1-codex-mini", variant: "medium" },
|
|
13942
|
+
writer: { model: "openai/gpt-5.1-codex-mini", variant: "low" }
|
|
13930
13943
|
},
|
|
13931
13944
|
anthropic: {
|
|
13932
13945
|
orchestrator: { model: "anthropic/claude-opus-4-6" },
|
|
13933
|
-
|
|
13934
|
-
|
|
13935
|
-
|
|
13936
|
-
|
|
13937
|
-
|
|
13946
|
+
critic: { model: "anthropic/claude-opus-4-6", variant: "high" },
|
|
13947
|
+
synthesizer: { model: "anthropic/claude-sonnet-4-5", variant: "low" },
|
|
13948
|
+
surveyor: { model: "anthropic/claude-haiku-4-5", variant: "low" },
|
|
13949
|
+
architect: { model: "anthropic/claude-sonnet-4-5", variant: "medium" },
|
|
13950
|
+
writer: { model: "anthropic/claude-sonnet-4-5", variant: "low" }
|
|
13938
13951
|
},
|
|
13939
13952
|
copilot: {
|
|
13940
13953
|
orchestrator: { model: "github-copilot/grok-code-fast-1" },
|
|
13941
|
-
|
|
13942
|
-
|
|
13943
|
-
|
|
13944
|
-
|
|
13945
|
-
|
|
13954
|
+
critic: { model: "github-copilot/grok-code-fast-1", variant: "high" },
|
|
13955
|
+
synthesizer: { model: "github-copilot/grok-code-fast-1", variant: "low" },
|
|
13956
|
+
surveyor: { model: "github-copilot/grok-code-fast-1", variant: "low" },
|
|
13957
|
+
architect: { model: "github-copilot/grok-code-fast-1", variant: "medium" },
|
|
13958
|
+
writer: { model: "github-copilot/grok-code-fast-1", variant: "low" }
|
|
13946
13959
|
},
|
|
13947
13960
|
"zai-plan": {
|
|
13948
13961
|
orchestrator: { model: "zai-coding-plan/glm-4.7" },
|
|
13949
|
-
|
|
13950
|
-
|
|
13951
|
-
|
|
13952
|
-
|
|
13953
|
-
|
|
13962
|
+
critic: { model: "zai-coding-plan/glm-4.7", variant: "high" },
|
|
13963
|
+
synthesizer: { model: "zai-coding-plan/glm-4.7", variant: "low" },
|
|
13964
|
+
surveyor: { model: "zai-coding-plan/glm-4.7", variant: "low" },
|
|
13965
|
+
architect: { model: "zai-coding-plan/glm-4.7", variant: "medium" },
|
|
13966
|
+
writer: { model: "zai-coding-plan/glm-4.7", variant: "low" }
|
|
13954
13967
|
},
|
|
13955
13968
|
antigravity: {
|
|
13956
13969
|
orchestrator: { model: "google/antigravity-gemini-3-flash" },
|
|
13957
|
-
|
|
13958
|
-
|
|
13970
|
+
critic: { model: "google/antigravity-gemini-3.1-pro" },
|
|
13971
|
+
synthesizer: {
|
|
13959
13972
|
model: "google/antigravity-gemini-3-flash",
|
|
13960
13973
|
variant: "low"
|
|
13961
13974
|
},
|
|
13962
|
-
|
|
13975
|
+
surveyor: {
|
|
13963
13976
|
model: "google/antigravity-gemini-3-flash",
|
|
13964
13977
|
variant: "low"
|
|
13965
13978
|
},
|
|
13966
|
-
|
|
13979
|
+
architect: {
|
|
13967
13980
|
model: "google/antigravity-gemini-3-flash",
|
|
13968
13981
|
variant: "medium"
|
|
13969
13982
|
},
|
|
13970
|
-
|
|
13983
|
+
writer: { model: "google/antigravity-gemini-3-flash", variant: "low" }
|
|
13971
13984
|
},
|
|
13972
13985
|
chutes: {
|
|
13973
13986
|
orchestrator: { model: "chutes/kimi-k2.5" },
|
|
13974
|
-
|
|
13975
|
-
|
|
13976
|
-
|
|
13977
|
-
|
|
13978
|
-
|
|
13987
|
+
critic: { model: "chutes/kimi-k2.5", variant: "high" },
|
|
13988
|
+
synthesizer: { model: "chutes/minimax-m2.1", variant: "low" },
|
|
13989
|
+
surveyor: { model: "chutes/minimax-m2.1", variant: "low" },
|
|
13990
|
+
architect: { model: "chutes/kimi-k2.5", variant: "medium" },
|
|
13991
|
+
writer: { model: "chutes/minimax-m2.1", variant: "low" }
|
|
13979
13992
|
},
|
|
13980
13993
|
"zen-free": {
|
|
13981
13994
|
orchestrator: { model: "opencode/big-pickle" },
|
|
13982
|
-
|
|
13983
|
-
|
|
13984
|
-
|
|
13985
|
-
|
|
13986
|
-
|
|
13995
|
+
critic: { model: "opencode/big-pickle", variant: "high" },
|
|
13996
|
+
synthesizer: { model: "opencode/big-pickle", variant: "low" },
|
|
13997
|
+
surveyor: { model: "opencode/big-pickle", variant: "low" },
|
|
13998
|
+
architect: { model: "opencode/big-pickle", variant: "medium" },
|
|
13999
|
+
writer: { model: "opencode/big-pickle", variant: "low" }
|
|
13987
14000
|
}
|
|
13988
14001
|
};
|
|
13989
14002
|
function generateAntigravityMixedPreset(config2, existingPreset) {
|
|
@@ -13991,7 +14004,7 @@ function generateAntigravityMixedPreset(config2, existingPreset) {
|
|
|
13991
14004
|
const createAgentConfig = (agentName, modelInfo) => {
|
|
13992
14005
|
const isOrchestrator = agentName === "orchestrator";
|
|
13993
14006
|
const skills = isOrchestrator ? ["*"] : RECOMMENDED_SKILLS.filter((s) => s.allowedAgents.includes("*") || s.allowedAgents.includes(agentName)).map((s) => s.skillName);
|
|
13994
|
-
if (agentName === "
|
|
14007
|
+
if (agentName === "architect" && !skills.includes("agent-browser")) {
|
|
13995
14008
|
skills.push("agent-browser");
|
|
13996
14009
|
}
|
|
13997
14010
|
return {
|
|
@@ -14005,7 +14018,7 @@ function generateAntigravityMixedPreset(config2, existingPreset) {
|
|
|
14005
14018
|
model: "google/antigravity-gemini-3-flash"
|
|
14006
14019
|
};
|
|
14007
14020
|
const chutesPrimary = config2.selectedChutesPrimaryModel ?? MODEL_MAPPINGS.chutes.orchestrator.model;
|
|
14008
|
-
const chutesSupport = config2.selectedChutesSecondaryModel ?? MODEL_MAPPINGS.chutes.
|
|
14021
|
+
const chutesSupport = config2.selectedChutesSecondaryModel ?? MODEL_MAPPINGS.chutes.surveyor.model;
|
|
14009
14022
|
if (config2.hasKimi) {
|
|
14010
14023
|
result.orchestrator = createAgentConfig("orchestrator", MODEL_MAPPINGS.kimi.orchestrator);
|
|
14011
14024
|
} else if (config2.hasChutes) {
|
|
@@ -14016,45 +14029,45 @@ function generateAntigravityMixedPreset(config2, existingPreset) {
|
|
|
14016
14029
|
result.orchestrator = createAgentConfig("orchestrator", MODEL_MAPPINGS.antigravity.orchestrator);
|
|
14017
14030
|
}
|
|
14018
14031
|
if (config2.hasOpenAI) {
|
|
14019
|
-
result.
|
|
14020
|
-
} else if (!result.
|
|
14021
|
-
result.
|
|
14032
|
+
result.critic = createAgentConfig("critic", MODEL_MAPPINGS.openai.critic);
|
|
14033
|
+
} else if (!result.critic) {
|
|
14034
|
+
result.critic = createAgentConfig("critic", MODEL_MAPPINGS.antigravity.critic);
|
|
14022
14035
|
}
|
|
14023
|
-
result.
|
|
14036
|
+
result.surveyor = createAgentConfig("surveyor", {
|
|
14024
14037
|
...antigravityFlash,
|
|
14025
14038
|
variant: "low"
|
|
14026
14039
|
});
|
|
14027
14040
|
if (config2.hasChutes) {
|
|
14028
|
-
result.
|
|
14041
|
+
result.synthesizer = createAgentConfig("synthesizer", {
|
|
14029
14042
|
model: chutesSupport,
|
|
14030
14043
|
variant: "low"
|
|
14031
14044
|
});
|
|
14032
|
-
result.
|
|
14045
|
+
result.architect = createAgentConfig("architect", {
|
|
14033
14046
|
model: chutesPrimary,
|
|
14034
14047
|
variant: "medium"
|
|
14035
14048
|
});
|
|
14036
14049
|
} else {
|
|
14037
|
-
result.
|
|
14050
|
+
result.synthesizer = createAgentConfig("synthesizer", {
|
|
14038
14051
|
...antigravityFlash,
|
|
14039
14052
|
variant: "low"
|
|
14040
14053
|
});
|
|
14041
|
-
result.
|
|
14054
|
+
result.architect = createAgentConfig("architect", {
|
|
14042
14055
|
...antigravityFlash,
|
|
14043
14056
|
variant: "medium"
|
|
14044
14057
|
});
|
|
14045
14058
|
}
|
|
14046
14059
|
if (config2.hasOpenAI) {
|
|
14047
|
-
result.
|
|
14048
|
-
...MODEL_MAPPINGS.openai.
|
|
14060
|
+
result.writer = createAgentConfig("writer", {
|
|
14061
|
+
...MODEL_MAPPINGS.openai.critic,
|
|
14049
14062
|
variant: "low"
|
|
14050
14063
|
});
|
|
14051
14064
|
} else if (config2.hasChutes) {
|
|
14052
|
-
result.
|
|
14065
|
+
result.writer = createAgentConfig("writer", {
|
|
14053
14066
|
model: chutesSupport,
|
|
14054
14067
|
variant: "low"
|
|
14055
14068
|
});
|
|
14056
14069
|
} else {
|
|
14057
|
-
result.
|
|
14070
|
+
result.writer = createAgentConfig("writer", {
|
|
14058
14071
|
...antigravityFlash,
|
|
14059
14072
|
variant: "low"
|
|
14060
14073
|
});
|
|
@@ -14129,7 +14142,7 @@ function generateLiteConfig(installConfig) {
|
|
|
14129
14142
|
const createAgentConfig = (agentName, modelInfo) => {
|
|
14130
14143
|
const isOrchestrator = agentName === "orchestrator";
|
|
14131
14144
|
const skills = isOrchestrator ? ["*"] : RECOMMENDED_SKILLS.filter((s) => s.allowedAgents.includes("*") || s.allowedAgents.includes(agentName)).map((s) => s.skillName);
|
|
14132
|
-
if (agentName === "
|
|
14145
|
+
if (agentName === "architect" && !skills.includes("agent-browser")) {
|
|
14133
14146
|
skills.push("agent-browser");
|
|
14134
14147
|
}
|
|
14135
14148
|
return {
|
|
@@ -14172,12 +14185,12 @@ function generateLiteConfig(installConfig) {
|
|
|
14172
14185
|
};
|
|
14173
14186
|
if (!hasExternalProviders) {
|
|
14174
14187
|
setAgent("orchestrator", primaryModel);
|
|
14175
|
-
setAgent("
|
|
14176
|
-
setAgent("
|
|
14188
|
+
setAgent("critic", primaryModel);
|
|
14189
|
+
setAgent("architect", primaryModel);
|
|
14177
14190
|
}
|
|
14178
|
-
setAgent("
|
|
14179
|
-
setAgent("
|
|
14180
|
-
setAgent("
|
|
14191
|
+
setAgent("synthesizer", secondaryModel);
|
|
14192
|
+
setAgent("surveyor", secondaryModel);
|
|
14193
|
+
setAgent("writer", secondaryModel);
|
|
14181
14194
|
};
|
|
14182
14195
|
const applyChutesAssignments = (presetAgents) => {
|
|
14183
14196
|
if (!installConfig.hasChutes)
|
|
@@ -14193,11 +14206,11 @@ function generateLiteConfig(installConfig) {
|
|
|
14193
14206
|
presetAgents[agentName] = createAgentConfig(agentName, { model });
|
|
14194
14207
|
};
|
|
14195
14208
|
setAgent("orchestrator", primaryModel);
|
|
14196
|
-
setAgent("
|
|
14197
|
-
setAgent("
|
|
14198
|
-
setAgent("
|
|
14199
|
-
setAgent("
|
|
14200
|
-
setAgent("
|
|
14209
|
+
setAgent("critic", primaryModel);
|
|
14210
|
+
setAgent("architect", primaryModel);
|
|
14211
|
+
setAgent("synthesizer", secondaryModel);
|
|
14212
|
+
setAgent("surveyor", secondaryModel);
|
|
14213
|
+
setAgent("writer", secondaryModel);
|
|
14201
14214
|
};
|
|
14202
14215
|
const dedupeModels = (models) => {
|
|
14203
14216
|
const seen = new Set;
|
|
@@ -14213,7 +14226,7 @@ function generateLiteConfig(installConfig) {
|
|
|
14213
14226
|
const getOpenCodeFallbackForAgent = (agentName) => {
|
|
14214
14227
|
if (!installConfig.useOpenCodeFreeModels)
|
|
14215
14228
|
return;
|
|
14216
|
-
const isSupport = agentName === "
|
|
14229
|
+
const isSupport = agentName === "surveyor" || agentName === "synthesizer" || agentName === "writer";
|
|
14217
14230
|
if (isSupport) {
|
|
14218
14231
|
return installConfig.selectedOpenCodeSecondaryModel ?? installConfig.selectedOpenCodePrimaryModel;
|
|
14219
14232
|
}
|
|
@@ -14222,7 +14235,7 @@ function generateLiteConfig(installConfig) {
|
|
|
14222
14235
|
const getChutesFallbackForAgent = (agentName) => {
|
|
14223
14236
|
if (!installConfig.hasChutes)
|
|
14224
14237
|
return;
|
|
14225
|
-
const isSupport = agentName === "
|
|
14238
|
+
const isSupport = agentName === "surveyor" || agentName === "synthesizer" || agentName === "writer";
|
|
14226
14239
|
if (isSupport) {
|
|
14227
14240
|
return installConfig.selectedChutesSecondaryModel ?? installConfig.selectedChutesPrimaryModel ?? MODEL_MAPPINGS.chutes[agentName].model;
|
|
14228
14241
|
}
|
|
@@ -14258,8 +14271,8 @@ function generateLiteConfig(installConfig) {
|
|
|
14258
14271
|
const mapping = MODEL_MAPPINGS[mappingName];
|
|
14259
14272
|
return Object.fromEntries(Object.entries(mapping).map(([agentName, modelInfo]) => {
|
|
14260
14273
|
let activeModelInfo = { ...modelInfo };
|
|
14261
|
-
if (activePreset === "kimi" && installConfig.hasOpenAI && agentName === "
|
|
14262
|
-
activeModelInfo = { ...MODEL_MAPPINGS.openai.
|
|
14274
|
+
if (activePreset === "kimi" && installConfig.hasOpenAI && agentName === "critic") {
|
|
14275
|
+
activeModelInfo = { ...MODEL_MAPPINGS.openai.critic };
|
|
14263
14276
|
}
|
|
14264
14277
|
return [agentName, createAgentConfig(agentName, activeModelInfo)];
|
|
14265
14278
|
}));
|
|
@@ -14757,27 +14770,27 @@ function kimiVersionBonus(agent, model) {
|
|
|
14757
14770
|
const isMinimaxM21 = isChutes && /minimax[-_ ]?m2\.1/.test(lowered);
|
|
14758
14771
|
const qwenPenalty = {
|
|
14759
14772
|
orchestrator: -6,
|
|
14760
|
-
|
|
14761
|
-
|
|
14762
|
-
|
|
14763
|
-
|
|
14764
|
-
|
|
14773
|
+
critic: -6,
|
|
14774
|
+
architect: -8,
|
|
14775
|
+
surveyor: -6,
|
|
14776
|
+
synthesizer: -12,
|
|
14777
|
+
writer: -12
|
|
14765
14778
|
};
|
|
14766
14779
|
const kimiBonus = {
|
|
14767
14780
|
orchestrator: 1,
|
|
14768
|
-
|
|
14769
|
-
|
|
14770
|
-
|
|
14771
|
-
|
|
14772
|
-
|
|
14781
|
+
critic: 1,
|
|
14782
|
+
architect: 3,
|
|
14783
|
+
surveyor: 2,
|
|
14784
|
+
synthesizer: 2,
|
|
14785
|
+
writer: 3
|
|
14773
14786
|
};
|
|
14774
14787
|
const minimaxBonus = {
|
|
14775
14788
|
orchestrator: 1,
|
|
14776
|
-
|
|
14777
|
-
|
|
14778
|
-
|
|
14779
|
-
|
|
14780
|
-
|
|
14789
|
+
critic: 1,
|
|
14790
|
+
architect: 2,
|
|
14791
|
+
surveyor: 4,
|
|
14792
|
+
synthesizer: 4,
|
|
14793
|
+
writer: 4
|
|
14781
14794
|
};
|
|
14782
14795
|
if (isQwen3)
|
|
14783
14796
|
return qwenPenalty[agent];
|
|
@@ -14797,11 +14810,11 @@ function extractFeatureVector(model, agent, externalSignals) {
|
|
|
14797
14810
|
const quality = (signal?.qualityScore ?? 0) / 100;
|
|
14798
14811
|
const coding = (signal?.codingScore ?? 0) / 100;
|
|
14799
14812
|
const pricePenalty = Math.min(blendedPrice(signal), 50) / 10;
|
|
14800
|
-
const explorerLatencyMultiplier = agent === "
|
|
14813
|
+
const explorerLatencyMultiplier = agent === "surveyor" ? 1.4 : 1;
|
|
14801
14814
|
return {
|
|
14802
14815
|
status: statusValue(model.status),
|
|
14803
14816
|
context: normalizedContext,
|
|
14804
|
-
output: agent === "
|
|
14817
|
+
output: agent === "architect" ? designerOutputScore : normalizedOutput,
|
|
14805
14818
|
versionBonus,
|
|
14806
14819
|
reasoning: capability(model.reasoning),
|
|
14807
14820
|
toolcall: capability(model.toolcall),
|
|
@@ -14835,33 +14848,33 @@ var AGENT_WEIGHT_OVERRIDES = {
|
|
|
14835
14848
|
coding: 16,
|
|
14836
14849
|
latencyPenalty: -2
|
|
14837
14850
|
},
|
|
14838
|
-
|
|
14851
|
+
critic: {
|
|
14839
14852
|
reasoning: 26,
|
|
14840
14853
|
quality: 20,
|
|
14841
14854
|
coding: 18,
|
|
14842
14855
|
latencyPenalty: -2,
|
|
14843
14856
|
output: 7
|
|
14844
14857
|
},
|
|
14845
|
-
|
|
14858
|
+
architect: {
|
|
14846
14859
|
attachment: 12,
|
|
14847
14860
|
output: 10,
|
|
14848
14861
|
quality: 16,
|
|
14849
14862
|
coding: 10
|
|
14850
14863
|
},
|
|
14851
|
-
|
|
14864
|
+
surveyor: {
|
|
14852
14865
|
latencyPenalty: -8,
|
|
14853
14866
|
toolcall: 24,
|
|
14854
14867
|
reasoning: 2,
|
|
14855
14868
|
context: 4,
|
|
14856
14869
|
output: 4
|
|
14857
14870
|
},
|
|
14858
|
-
|
|
14871
|
+
synthesizer: {
|
|
14859
14872
|
context: 14,
|
|
14860
14873
|
output: 10,
|
|
14861
14874
|
quality: 18,
|
|
14862
14875
|
coding: 14
|
|
14863
14876
|
},
|
|
14864
|
-
|
|
14877
|
+
writer: {
|
|
14865
14878
|
coding: 28,
|
|
14866
14879
|
toolcall: 22,
|
|
14867
14880
|
reasoning: 12,
|
|
@@ -14923,28 +14936,28 @@ function rankModelsV2(models, agent, externalSignals) {
|
|
|
14923
14936
|
// src/cli/dynamic-model-selection.ts
|
|
14924
14937
|
var AGENTS = [
|
|
14925
14938
|
"orchestrator",
|
|
14926
|
-
"
|
|
14927
|
-
"
|
|
14928
|
-
"
|
|
14929
|
-
"
|
|
14930
|
-
"
|
|
14939
|
+
"critic",
|
|
14940
|
+
"architect",
|
|
14941
|
+
"surveyor",
|
|
14942
|
+
"synthesizer",
|
|
14943
|
+
"writer"
|
|
14931
14944
|
];
|
|
14932
14945
|
var FREE_BIASED_PROVIDERS = new Set(["opencode"]);
|
|
14933
14946
|
var PRIMARY_ASSIGNMENT_ORDER = [
|
|
14934
|
-
"
|
|
14947
|
+
"critic",
|
|
14935
14948
|
"orchestrator",
|
|
14936
|
-
"
|
|
14937
|
-
"
|
|
14938
|
-
"
|
|
14939
|
-
"
|
|
14949
|
+
"writer",
|
|
14950
|
+
"architect",
|
|
14951
|
+
"synthesizer",
|
|
14952
|
+
"surveyor"
|
|
14940
14953
|
];
|
|
14941
14954
|
var ROLE_VARIANT = {
|
|
14942
14955
|
orchestrator: undefined,
|
|
14943
|
-
|
|
14944
|
-
|
|
14945
|
-
|
|
14946
|
-
|
|
14947
|
-
|
|
14956
|
+
critic: "high",
|
|
14957
|
+
architect: "medium",
|
|
14958
|
+
surveyor: "low",
|
|
14959
|
+
synthesizer: "low",
|
|
14960
|
+
writer: "low"
|
|
14948
14961
|
};
|
|
14949
14962
|
function getEnabledProviders(config2) {
|
|
14950
14963
|
const providers = [];
|
|
@@ -15099,28 +15112,28 @@ function chutesPreferenceAdjustment(agent, model) {
|
|
|
15099
15112
|
const isKimiK25 = /kimi-k2\.5|k2\.5/.test(lowered);
|
|
15100
15113
|
const isMinimaxM21 = /minimax[-_ ]?m2\.1/.test(lowered);
|
|
15101
15114
|
const qwenPenalty = {
|
|
15102
|
-
|
|
15115
|
+
critic: -12,
|
|
15103
15116
|
orchestrator: -10,
|
|
15104
|
-
|
|
15105
|
-
|
|
15106
|
-
|
|
15107
|
-
|
|
15117
|
+
writer: -22,
|
|
15118
|
+
architect: -14,
|
|
15119
|
+
synthesizer: -18,
|
|
15120
|
+
surveyor: -10
|
|
15108
15121
|
};
|
|
15109
15122
|
const kimiBonus = {
|
|
15110
|
-
|
|
15123
|
+
critic: 0,
|
|
15111
15124
|
orchestrator: 0,
|
|
15112
|
-
|
|
15113
|
-
|
|
15114
|
-
|
|
15115
|
-
|
|
15125
|
+
writer: 8,
|
|
15126
|
+
architect: 6,
|
|
15127
|
+
synthesizer: 5,
|
|
15128
|
+
surveyor: 4
|
|
15116
15129
|
};
|
|
15117
15130
|
const minimaxBonus = {
|
|
15118
|
-
|
|
15131
|
+
critic: 0,
|
|
15119
15132
|
orchestrator: 0,
|
|
15120
|
-
|
|
15121
|
-
|
|
15122
|
-
|
|
15123
|
-
|
|
15133
|
+
writer: 10,
|
|
15134
|
+
architect: 3,
|
|
15135
|
+
synthesizer: 9,
|
|
15136
|
+
surveyor: 12
|
|
15124
15137
|
};
|
|
15125
15138
|
return (isQwen3 ? qwenPenalty[agent] : 0) + (isKimiK25 ? kimiBonus[agent] : 0) + (isMinimaxM21 ? minimaxBonus[agent] : 0);
|
|
15126
15139
|
}
|
|
@@ -15137,7 +15150,7 @@ function roleScore(agent, model, versionRecencyBoost = 0) {
|
|
|
15137
15150
|
const deep = tokenScore(lowered, /(opus|pro|thinking|reason|r1|gpt-5|k2\.5)/i, 1);
|
|
15138
15151
|
const fast = tokenScore(lowered, /(nano|flash|mini|lite|fast|turbo|haiku|small)/i, 1);
|
|
15139
15152
|
const code = tokenScore(lowered, /(codex|coder|code|dev|program)/i, 1);
|
|
15140
|
-
if ((agent === "orchestrator" || agent === "
|
|
15153
|
+
if ((agent === "orchestrator" || agent === "surveyor" || agent === "synthesizer" || agent === "writer") && !model.toolcall) {
|
|
15141
15154
|
return -1e4;
|
|
15142
15155
|
}
|
|
15143
15156
|
if (model.status === "deprecated") {
|
|
@@ -15157,24 +15170,24 @@ function roleScore(agent, model, versionRecencyBoost = 0) {
|
|
|
15157
15170
|
const nonReasoningFlashPenalty2 = flash && !model.reasoning ? -16 : 0;
|
|
15158
15171
|
return score + reasoning * 40 + toolcall * 25 + deep * 10 + code * 8 + context + flashAdjustment2 + zaiAdjustment2 + nonReasoningFlashPenalty2 + geminiAdjustment + chutesAdjustment + providerBias;
|
|
15159
15172
|
}
|
|
15160
|
-
if (agent === "
|
|
15173
|
+
if (agent === "critic") {
|
|
15161
15174
|
const flashAdjustment2 = flash ? -34 : 0;
|
|
15162
15175
|
const zaiAdjustment2 = zai47NonFlash ? 16 : zai47Flash ? -18 : 0;
|
|
15163
15176
|
const nonReasoningFlashPenalty2 = flash && !model.reasoning ? -16 : 0;
|
|
15164
15177
|
return score + reasoning * 55 + deep * 18 + context * 1.2 + toolcall * 10 + flashAdjustment2 + zaiAdjustment2 + nonReasoningFlashPenalty2 + geminiAdjustment + chutesAdjustment + providerBias;
|
|
15165
15178
|
}
|
|
15166
|
-
if (agent === "
|
|
15179
|
+
if (agent === "architect") {
|
|
15167
15180
|
const flashAdjustment2 = flash ? -8 : 0;
|
|
15168
15181
|
const zaiAdjustment2 = zai47NonFlash ? 10 : zai47Flash ? -8 : 0;
|
|
15169
15182
|
return score + attachment * 25 + reasoning * 18 + toolcall * 15 + context * 0.8 + output + flashAdjustment2 + zaiAdjustment2 + geminiAdjustment + chutesAdjustment + providerBias;
|
|
15170
15183
|
}
|
|
15171
|
-
if (agent === "
|
|
15184
|
+
if (agent === "surveyor") {
|
|
15172
15185
|
const flashAdjustment2 = flash ? 26 : -10;
|
|
15173
15186
|
const zaiAdjustment2 = zai47NonFlash ? 2 : zai47Flash ? 6 : 0;
|
|
15174
15187
|
const deepPenalty = deep * -18;
|
|
15175
15188
|
return score + fast * 68 + toolcall * 28 + reasoning * 2 + context * 0.2 + flashAdjustment2 + zaiAdjustment2 + deepPenalty + geminiAdjustment + chutesAdjustment + providerBias;
|
|
15176
15189
|
}
|
|
15177
|
-
if (agent === "
|
|
15190
|
+
if (agent === "synthesizer") {
|
|
15178
15191
|
const flashAdjustment2 = flash ? -12 : 0;
|
|
15179
15192
|
const zaiAdjustment2 = zai47NonFlash ? 16 : zai47Flash ? -18 : 0;
|
|
15180
15193
|
return score + context * 30 + toolcall * 22 + reasoning * 15 + output * 10 + flashAdjustment2 + zaiAdjustment2 + geminiAdjustment + chutesAdjustment + providerBias;
|
|
@@ -15194,7 +15207,7 @@ function getExternalSignalBoost(agent, model, externalSignals) {
|
|
|
15194
15207
|
const codingScore = signal.codingScore ?? 0;
|
|
15195
15208
|
const latencySeconds = signal.latencySeconds;
|
|
15196
15209
|
const blendedPrice2 = signal.inputPricePer1M !== undefined && signal.outputPricePer1M !== undefined ? signal.inputPricePer1M * 0.75 + signal.outputPricePer1M * 0.25 : signal.inputPricePer1M ?? signal.outputPricePer1M ?? 0;
|
|
15197
|
-
if (agent === "
|
|
15210
|
+
if (agent === "surveyor") {
|
|
15198
15211
|
const qualityBoost2 = qualityScore * 0.05;
|
|
15199
15212
|
const codingBoost2 = codingScore * 0.08;
|
|
15200
15213
|
const latencyPenalty2 = typeof latencySeconds === "number" && Number.isFinite(latencySeconds) ? Math.min(latencySeconds, 12) * 3.2 + (latencySeconds > 7 ? 16 : latencySeconds > 4 ? 10 : 0) : 0;
|
|
@@ -15337,17 +15350,17 @@ function chooseProviderRepresentative(providerModels, agent, externalSignals, ve
|
|
|
15337
15350
|
return nonFlashBest;
|
|
15338
15351
|
const flashScore = combinedScore(agent, flashBest, externalSignals, versionRecencyMap);
|
|
15339
15352
|
const nonFlashScore = combinedScore(agent, nonFlashBest, externalSignals, versionRecencyMap);
|
|
15340
|
-
const threshold = agent === "
|
|
15353
|
+
const threshold = agent === "surveyor" ? -6 : 12;
|
|
15341
15354
|
return flashScore >= nonFlashScore + threshold ? flashBest : nonFlashBest;
|
|
15342
15355
|
}
|
|
15343
15356
|
function getQualityWindow(agent) {
|
|
15344
|
-
if (agent === "
|
|
15357
|
+
if (agent === "critic" || agent === "orchestrator")
|
|
15345
15358
|
return 12;
|
|
15346
|
-
if (agent === "
|
|
15359
|
+
if (agent === "writer")
|
|
15347
15360
|
return 15;
|
|
15348
|
-
if (agent === "
|
|
15361
|
+
if (agent === "architect")
|
|
15349
15362
|
return 16;
|
|
15350
|
-
if (agent === "
|
|
15363
|
+
if (agent === "synthesizer")
|
|
15351
15364
|
return 18;
|
|
15352
15365
|
return 22;
|
|
15353
15366
|
}
|
|
@@ -15363,7 +15376,7 @@ function getProviderBundle(providerModels, agent, externalSignals, versionRecenc
|
|
|
15363
15376
|
const score1 = combinedScore(agent, representative, externalSignals, versionRecencyMap);
|
|
15364
15377
|
const score2 = combinedScore(agent, second, externalSignals, versionRecencyMap);
|
|
15365
15378
|
const gap = Math.abs(score1 - score2);
|
|
15366
|
-
const includeSecond = representative.providerID === "chutes" || gap <= (agent === "
|
|
15379
|
+
const includeSecond = representative.providerID === "chutes" || gap <= (agent === "critic" || agent === "orchestrator" ? 8 : agent === "architect" || agent === "synthesizer" ? 12 : agent === "writer" ? 15 : 18);
|
|
15367
15380
|
return includeSecond ? [representative.model, second.model] : [representative.model];
|
|
15368
15381
|
}
|
|
15369
15382
|
function selectPrimaryWithDiversity(candidates, agent, providerUsage, targetByProvider, remainingSlots, externalSignals, versionRecencyMap) {
|
|
@@ -15423,7 +15436,7 @@ function selectPrimaryWithDiversity(candidates, agent, providerUsage, targetByPr
|
|
|
15423
15436
|
chosen = bestUnused;
|
|
15424
15437
|
}
|
|
15425
15438
|
}
|
|
15426
|
-
if (agent !== "
|
|
15439
|
+
if (agent !== "surveyor" && isZai47Model(chosen.model) && hasFlashToken(chosen.model)) {
|
|
15427
15440
|
const kimiCandidate = candidateScores.find((item) => isKimiK25Model(item.model));
|
|
15428
15441
|
if (kimiCandidate && kimiCandidate.rawScore >= chosen.rawScore - 2) {
|
|
15429
15442
|
chosen = kimiCandidate;
|
|
@@ -15513,12 +15526,12 @@ function buildDynamicModelPlan(catalog, config2, externalSignals, options) {
|
|
|
15513
15526
|
const getSelectedChutesForAgent = (agent) => {
|
|
15514
15527
|
if (!config2.hasChutes)
|
|
15515
15528
|
return;
|
|
15516
|
-
return agent === "
|
|
15529
|
+
return agent === "surveyor" || agent === "synthesizer" || agent === "writer" ? config2.selectedChutesSecondaryModel ?? config2.selectedChutesPrimaryModel : config2.selectedChutesPrimaryModel;
|
|
15517
15530
|
};
|
|
15518
15531
|
const getSelectedOpenCodeForAgent = (agent) => {
|
|
15519
15532
|
if (!config2.useOpenCodeFreeModels)
|
|
15520
15533
|
return;
|
|
15521
|
-
return agent === "
|
|
15534
|
+
return agent === "surveyor" || agent === "synthesizer" || agent === "writer" ? config2.selectedOpenCodeSecondaryModel ?? config2.selectedOpenCodePrimaryModel : config2.selectedOpenCodePrimaryModel;
|
|
15522
15535
|
};
|
|
15523
15536
|
const getPinnedModelForProvider = (agent, providerID) => {
|
|
15524
15537
|
if (providerID === "chutes")
|
|
@@ -16489,11 +16502,11 @@ async function runManualSetupMode(rl, detected, modelsOnly = false) {
|
|
|
16489
16502
|
const manualAgentConfigs = {};
|
|
16490
16503
|
const agentNames = [
|
|
16491
16504
|
"orchestrator",
|
|
16492
|
-
"
|
|
16493
|
-
"
|
|
16494
|
-
"
|
|
16495
|
-
"
|
|
16496
|
-
"
|
|
16505
|
+
"critic",
|
|
16506
|
+
"architect",
|
|
16507
|
+
"surveyor",
|
|
16508
|
+
"synthesizer",
|
|
16509
|
+
"writer"
|
|
16497
16510
|
];
|
|
16498
16511
|
for (const agentName of agentNames) {
|
|
16499
16512
|
manualAgentConfigs[agentName] = await configureAgentManually(rl, agentName, availableModels);
|
|
@@ -16595,13 +16608,13 @@ async function runInteractiveMode(detected, modelsOnly = false) {
|
|
|
16595
16608
|
if (recommendedPrimary) {
|
|
16596
16609
|
printInfo("This step configures only OpenCode Free primary/support models.");
|
|
16597
16610
|
console.log(`${BOLD}OpenCode Free Models:${RESET}`);
|
|
16598
|
-
selectedOpenCodePrimaryModel = await askModelSelection(rl, discovery.models, recommendedPrimary, "Choose primary model for orchestrator/
|
|
16611
|
+
selectedOpenCodePrimaryModel = await askModelSelection(rl, discovery.models, recommendedPrimary, "Choose primary model for orchestrator/critic");
|
|
16599
16612
|
}
|
|
16600
16613
|
if (selectedOpenCodePrimaryModel) {
|
|
16601
16614
|
const recommendedSecondary = pickSupportOpenCodeModel(discovery.models, selectedOpenCodePrimaryModel)?.model ?? selectedOpenCodePrimaryModel;
|
|
16602
16615
|
const openCodeSupportList = discovery.models.filter((model) => model.model !== selectedOpenCodePrimaryModel);
|
|
16603
16616
|
const openCodeSupportDefault = recommendedSecondary === selectedOpenCodePrimaryModel ? openCodeSupportList[0]?.model ?? recommendedSecondary : recommendedSecondary;
|
|
16604
|
-
selectedOpenCodeSecondaryModel = await askModelSelection(rl, openCodeSupportList, openCodeSupportDefault, "Choose support model for
|
|
16617
|
+
selectedOpenCodeSecondaryModel = await askModelSelection(rl, openCodeSupportList, openCodeSupportDefault, "Choose support model for surveyor/synthesizer/writer");
|
|
16605
16618
|
}
|
|
16606
16619
|
console.log();
|
|
16607
16620
|
}
|
|
@@ -16637,13 +16650,13 @@ async function runInteractiveMode(detected, modelsOnly = false) {
|
|
|
16637
16650
|
const recommendedPrimary = pickBestCodingChutesModel(discovery.models)?.model ?? discovery.models[0]?.model;
|
|
16638
16651
|
if (recommendedPrimary) {
|
|
16639
16652
|
console.log(`${BOLD}Chutes Models:${RESET}`);
|
|
16640
|
-
selectedChutesPrimaryModel = await askModelSelection(rl, discovery.models, recommendedPrimary, "Choose Chutes primary model for orchestrator/
|
|
16653
|
+
selectedChutesPrimaryModel = await askModelSelection(rl, discovery.models, recommendedPrimary, "Choose Chutes primary model for orchestrator/critic/architect");
|
|
16641
16654
|
}
|
|
16642
16655
|
if (selectedChutesPrimaryModel) {
|
|
16643
16656
|
const recommendedSecondary = pickSupportChutesModel(discovery.models, selectedChutesPrimaryModel)?.model ?? selectedChutesPrimaryModel;
|
|
16644
16657
|
const chutesSupportList = discovery.models.filter((model) => model.model !== selectedChutesPrimaryModel);
|
|
16645
16658
|
const chutesSupportDefault = recommendedSecondary === selectedChutesPrimaryModel ? chutesSupportList[0]?.model ?? recommendedSecondary : recommendedSecondary;
|
|
16646
|
-
selectedChutesSecondaryModel = await askModelSelection(rl, chutesSupportList, chutesSupportDefault, "Choose Chutes support model for
|
|
16659
|
+
selectedChutesSecondaryModel = await askModelSelection(rl, chutesSupportList, chutesSupportDefault, "Choose Chutes support model for surveyor/synthesizer/writer");
|
|
16647
16660
|
}
|
|
16648
16661
|
console.log();
|
|
16649
16662
|
}
|
package/dist/cli/providers.d.ts
CHANGED
|
@@ -4,23 +4,23 @@ export declare const MODEL_MAPPINGS: {
|
|
|
4
4
|
readonly orchestrator: {
|
|
5
5
|
readonly model: "kimi-for-coding/k2p5";
|
|
6
6
|
};
|
|
7
|
-
readonly
|
|
7
|
+
readonly critic: {
|
|
8
8
|
readonly model: "kimi-for-coding/k2p5";
|
|
9
9
|
readonly variant: "high";
|
|
10
10
|
};
|
|
11
|
-
readonly
|
|
11
|
+
readonly synthesizer: {
|
|
12
12
|
readonly model: "kimi-for-coding/k2p5";
|
|
13
13
|
readonly variant: "low";
|
|
14
14
|
};
|
|
15
|
-
readonly
|
|
15
|
+
readonly surveyor: {
|
|
16
16
|
readonly model: "kimi-for-coding/k2p5";
|
|
17
17
|
readonly variant: "low";
|
|
18
18
|
};
|
|
19
|
-
readonly
|
|
19
|
+
readonly architect: {
|
|
20
20
|
readonly model: "kimi-for-coding/k2p5";
|
|
21
21
|
readonly variant: "medium";
|
|
22
22
|
};
|
|
23
|
-
readonly
|
|
23
|
+
readonly writer: {
|
|
24
24
|
readonly model: "kimi-for-coding/k2p5";
|
|
25
25
|
readonly variant: "low";
|
|
26
26
|
};
|
|
@@ -29,23 +29,23 @@ export declare const MODEL_MAPPINGS: {
|
|
|
29
29
|
readonly orchestrator: {
|
|
30
30
|
readonly model: "openai/gpt-5.3-codex";
|
|
31
31
|
};
|
|
32
|
-
readonly
|
|
32
|
+
readonly critic: {
|
|
33
33
|
readonly model: "openai/gpt-5.3-codex";
|
|
34
34
|
readonly variant: "high";
|
|
35
35
|
};
|
|
36
|
-
readonly
|
|
36
|
+
readonly synthesizer: {
|
|
37
37
|
readonly model: "openai/gpt-5.1-codex-mini";
|
|
38
38
|
readonly variant: "low";
|
|
39
39
|
};
|
|
40
|
-
readonly
|
|
40
|
+
readonly surveyor: {
|
|
41
41
|
readonly model: "openai/gpt-5.1-codex-mini";
|
|
42
42
|
readonly variant: "low";
|
|
43
43
|
};
|
|
44
|
-
readonly
|
|
44
|
+
readonly architect: {
|
|
45
45
|
readonly model: "openai/gpt-5.1-codex-mini";
|
|
46
46
|
readonly variant: "medium";
|
|
47
47
|
};
|
|
48
|
-
readonly
|
|
48
|
+
readonly writer: {
|
|
49
49
|
readonly model: "openai/gpt-5.1-codex-mini";
|
|
50
50
|
readonly variant: "low";
|
|
51
51
|
};
|
|
@@ -54,23 +54,23 @@ export declare const MODEL_MAPPINGS: {
|
|
|
54
54
|
readonly orchestrator: {
|
|
55
55
|
readonly model: "anthropic/claude-opus-4-6";
|
|
56
56
|
};
|
|
57
|
-
readonly
|
|
57
|
+
readonly critic: {
|
|
58
58
|
readonly model: "anthropic/claude-opus-4-6";
|
|
59
59
|
readonly variant: "high";
|
|
60
60
|
};
|
|
61
|
-
readonly
|
|
61
|
+
readonly synthesizer: {
|
|
62
62
|
readonly model: "anthropic/claude-sonnet-4-5";
|
|
63
63
|
readonly variant: "low";
|
|
64
64
|
};
|
|
65
|
-
readonly
|
|
65
|
+
readonly surveyor: {
|
|
66
66
|
readonly model: "anthropic/claude-haiku-4-5";
|
|
67
67
|
readonly variant: "low";
|
|
68
68
|
};
|
|
69
|
-
readonly
|
|
69
|
+
readonly architect: {
|
|
70
70
|
readonly model: "anthropic/claude-sonnet-4-5";
|
|
71
71
|
readonly variant: "medium";
|
|
72
72
|
};
|
|
73
|
-
readonly
|
|
73
|
+
readonly writer: {
|
|
74
74
|
readonly model: "anthropic/claude-sonnet-4-5";
|
|
75
75
|
readonly variant: "low";
|
|
76
76
|
};
|
|
@@ -79,23 +79,23 @@ export declare const MODEL_MAPPINGS: {
|
|
|
79
79
|
readonly orchestrator: {
|
|
80
80
|
readonly model: "github-copilot/grok-code-fast-1";
|
|
81
81
|
};
|
|
82
|
-
readonly
|
|
82
|
+
readonly critic: {
|
|
83
83
|
readonly model: "github-copilot/grok-code-fast-1";
|
|
84
84
|
readonly variant: "high";
|
|
85
85
|
};
|
|
86
|
-
readonly
|
|
86
|
+
readonly synthesizer: {
|
|
87
87
|
readonly model: "github-copilot/grok-code-fast-1";
|
|
88
88
|
readonly variant: "low";
|
|
89
89
|
};
|
|
90
|
-
readonly
|
|
90
|
+
readonly surveyor: {
|
|
91
91
|
readonly model: "github-copilot/grok-code-fast-1";
|
|
92
92
|
readonly variant: "low";
|
|
93
93
|
};
|
|
94
|
-
readonly
|
|
94
|
+
readonly architect: {
|
|
95
95
|
readonly model: "github-copilot/grok-code-fast-1";
|
|
96
96
|
readonly variant: "medium";
|
|
97
97
|
};
|
|
98
|
-
readonly
|
|
98
|
+
readonly writer: {
|
|
99
99
|
readonly model: "github-copilot/grok-code-fast-1";
|
|
100
100
|
readonly variant: "low";
|
|
101
101
|
};
|
|
@@ -104,23 +104,23 @@ export declare const MODEL_MAPPINGS: {
|
|
|
104
104
|
readonly orchestrator: {
|
|
105
105
|
readonly model: "zai-coding-plan/glm-4.7";
|
|
106
106
|
};
|
|
107
|
-
readonly
|
|
107
|
+
readonly critic: {
|
|
108
108
|
readonly model: "zai-coding-plan/glm-4.7";
|
|
109
109
|
readonly variant: "high";
|
|
110
110
|
};
|
|
111
|
-
readonly
|
|
111
|
+
readonly synthesizer: {
|
|
112
112
|
readonly model: "zai-coding-plan/glm-4.7";
|
|
113
113
|
readonly variant: "low";
|
|
114
114
|
};
|
|
115
|
-
readonly
|
|
115
|
+
readonly surveyor: {
|
|
116
116
|
readonly model: "zai-coding-plan/glm-4.7";
|
|
117
117
|
readonly variant: "low";
|
|
118
118
|
};
|
|
119
|
-
readonly
|
|
119
|
+
readonly architect: {
|
|
120
120
|
readonly model: "zai-coding-plan/glm-4.7";
|
|
121
121
|
readonly variant: "medium";
|
|
122
122
|
};
|
|
123
|
-
readonly
|
|
123
|
+
readonly writer: {
|
|
124
124
|
readonly model: "zai-coding-plan/glm-4.7";
|
|
125
125
|
readonly variant: "low";
|
|
126
126
|
};
|
|
@@ -129,22 +129,22 @@ export declare const MODEL_MAPPINGS: {
|
|
|
129
129
|
readonly orchestrator: {
|
|
130
130
|
readonly model: "google/antigravity-gemini-3-flash";
|
|
131
131
|
};
|
|
132
|
-
readonly
|
|
132
|
+
readonly critic: {
|
|
133
133
|
readonly model: "google/antigravity-gemini-3.1-pro";
|
|
134
134
|
};
|
|
135
|
-
readonly
|
|
135
|
+
readonly synthesizer: {
|
|
136
136
|
readonly model: "google/antigravity-gemini-3-flash";
|
|
137
137
|
readonly variant: "low";
|
|
138
138
|
};
|
|
139
|
-
readonly
|
|
139
|
+
readonly surveyor: {
|
|
140
140
|
readonly model: "google/antigravity-gemini-3-flash";
|
|
141
141
|
readonly variant: "low";
|
|
142
142
|
};
|
|
143
|
-
readonly
|
|
143
|
+
readonly architect: {
|
|
144
144
|
readonly model: "google/antigravity-gemini-3-flash";
|
|
145
145
|
readonly variant: "medium";
|
|
146
146
|
};
|
|
147
|
-
readonly
|
|
147
|
+
readonly writer: {
|
|
148
148
|
readonly model: "google/antigravity-gemini-3-flash";
|
|
149
149
|
readonly variant: "low";
|
|
150
150
|
};
|
|
@@ -153,23 +153,23 @@ export declare const MODEL_MAPPINGS: {
|
|
|
153
153
|
readonly orchestrator: {
|
|
154
154
|
readonly model: "chutes/kimi-k2.5";
|
|
155
155
|
};
|
|
156
|
-
readonly
|
|
156
|
+
readonly critic: {
|
|
157
157
|
readonly model: "chutes/kimi-k2.5";
|
|
158
158
|
readonly variant: "high";
|
|
159
159
|
};
|
|
160
|
-
readonly
|
|
160
|
+
readonly synthesizer: {
|
|
161
161
|
readonly model: "chutes/minimax-m2.1";
|
|
162
162
|
readonly variant: "low";
|
|
163
163
|
};
|
|
164
|
-
readonly
|
|
164
|
+
readonly surveyor: {
|
|
165
165
|
readonly model: "chutes/minimax-m2.1";
|
|
166
166
|
readonly variant: "low";
|
|
167
167
|
};
|
|
168
|
-
readonly
|
|
168
|
+
readonly architect: {
|
|
169
169
|
readonly model: "chutes/kimi-k2.5";
|
|
170
170
|
readonly variant: "medium";
|
|
171
171
|
};
|
|
172
|
-
readonly
|
|
172
|
+
readonly writer: {
|
|
173
173
|
readonly model: "chutes/minimax-m2.1";
|
|
174
174
|
readonly variant: "low";
|
|
175
175
|
};
|
|
@@ -178,23 +178,23 @@ export declare const MODEL_MAPPINGS: {
|
|
|
178
178
|
readonly orchestrator: {
|
|
179
179
|
readonly model: "opencode/big-pickle";
|
|
180
180
|
};
|
|
181
|
-
readonly
|
|
181
|
+
readonly critic: {
|
|
182
182
|
readonly model: "opencode/big-pickle";
|
|
183
183
|
readonly variant: "high";
|
|
184
184
|
};
|
|
185
|
-
readonly
|
|
185
|
+
readonly synthesizer: {
|
|
186
186
|
readonly model: "opencode/big-pickle";
|
|
187
187
|
readonly variant: "low";
|
|
188
188
|
};
|
|
189
|
-
readonly
|
|
189
|
+
readonly surveyor: {
|
|
190
190
|
readonly model: "opencode/big-pickle";
|
|
191
191
|
readonly variant: "low";
|
|
192
192
|
};
|
|
193
|
-
readonly
|
|
193
|
+
readonly architect: {
|
|
194
194
|
readonly model: "opencode/big-pickle";
|
|
195
195
|
readonly variant: "medium";
|
|
196
196
|
};
|
|
197
|
-
readonly
|
|
197
|
+
readonly writer: {
|
|
198
198
|
readonly model: "opencode/big-pickle";
|
|
199
199
|
readonly variant: "low";
|
|
200
200
|
};
|
|
@@ -2,7 +2,7 @@ import type { DiscoveredModel, ExternalSignalMap } from '../types';
|
|
|
2
2
|
export type ScoreFeatureName = 'status' | 'context' | 'output' | 'versionBonus' | 'reasoning' | 'toolcall' | 'attachment' | 'quality' | 'coding' | 'latencyPenalty' | 'pricePenalty';
|
|
3
3
|
export type FeatureVector = Record<ScoreFeatureName, number>;
|
|
4
4
|
export type FeatureWeights = Record<ScoreFeatureName, number>;
|
|
5
|
-
export type ScoringAgentName = 'orchestrator' | '
|
|
5
|
+
export type ScoringAgentName = 'orchestrator' | 'critic' | 'architect' | 'surveyor' | 'synthesizer' | 'writer';
|
|
6
6
|
export interface ScoringContext {
|
|
7
7
|
agent: ScoringAgentName;
|
|
8
8
|
externalSignals?: ExternalSignalMap;
|
package/dist/config/loader.d.ts
CHANGED
|
@@ -20,7 +20,7 @@ export declare function loadPluginConfig(directory: string): PluginConfig;
|
|
|
20
20
|
* If preset is provided and safe for paths, it first checks {preset}/ subdirectory,
|
|
21
21
|
* then falls back to the root prompts directory.
|
|
22
22
|
*
|
|
23
|
-
* @param agentName - Name of the agent (e.g., "orchestrator", "
|
|
23
|
+
* @param agentName - Name of the agent (e.g., "orchestrator", "surveyor")
|
|
24
24
|
* @param preset - Optional preset name for preset-scoped prompt lookup
|
|
25
25
|
* @returns Object with prompt and/or appendPrompt if files exist
|
|
26
26
|
*/
|
package/dist/index.js
CHANGED
|
@@ -16,50 +16,63 @@ var __export = (target, all) => {
|
|
|
16
16
|
|
|
17
17
|
// src/cli/custom-skills.ts
|
|
18
18
|
var CUSTOM_SKILLS = [
|
|
19
|
-
{
|
|
20
|
-
name: "cartography",
|
|
21
|
-
description: "Repository understanding and hierarchical codemap generation",
|
|
22
|
-
allowedAgents: ["orchestrator", "explorer"],
|
|
23
|
-
sourcePath: "src/skills/cartography"
|
|
24
|
-
}
|
|
25
|
-
];
|
|
26
|
-
|
|
27
|
-
// src/cli/skills.ts
|
|
28
|
-
var RECOMMENDED_SKILLS = [
|
|
29
19
|
{
|
|
30
20
|
name: "literature-review",
|
|
31
|
-
|
|
32
|
-
skillName: "literature-review",
|
|
21
|
+
description: "Structured literature survey workflow",
|
|
33
22
|
allowedAgents: ["orchestrator", "surveyor", "synthesizer"],
|
|
34
|
-
|
|
23
|
+
sourcePath: "src/skills/literature-review"
|
|
35
24
|
},
|
|
36
25
|
{
|
|
37
26
|
name: "hypothesis-generation",
|
|
38
|
-
|
|
39
|
-
skillName: "hypothesis-generation",
|
|
27
|
+
description: "Gap-driven hypothesis generation workflow",
|
|
40
28
|
allowedAgents: ["orchestrator", "synthesizer"],
|
|
41
|
-
|
|
29
|
+
sourcePath: "src/skills/hypothesis-generation"
|
|
42
30
|
},
|
|
43
31
|
{
|
|
44
32
|
name: "idea-critique",
|
|
45
|
-
|
|
46
|
-
skillName: "idea-critique",
|
|
33
|
+
description: "Multi-round adversarial idea review workflow",
|
|
47
34
|
allowedAgents: ["orchestrator", "critic"],
|
|
48
|
-
|
|
35
|
+
sourcePath: "src/skills/idea-critique"
|
|
49
36
|
},
|
|
50
37
|
{
|
|
51
38
|
name: "experiment-design",
|
|
52
|
-
|
|
53
|
-
skillName: "experiment-design",
|
|
39
|
+
description: "Experimental plan design workflow",
|
|
54
40
|
allowedAgents: ["orchestrator", "architect"],
|
|
55
|
-
|
|
41
|
+
sourcePath: "src/skills/experiment-design"
|
|
56
42
|
},
|
|
57
43
|
{
|
|
58
44
|
name: "paper-outline",
|
|
59
|
-
|
|
60
|
-
skillName: "paper-outline",
|
|
45
|
+
description: "Paper outline generation workflow",
|
|
61
46
|
allowedAgents: ["orchestrator", "writer"],
|
|
62
|
-
|
|
47
|
+
sourcePath: "src/skills/paper-outline"
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
name: "cartography",
|
|
51
|
+
description: "Repository understanding and hierarchical codemap generation",
|
|
52
|
+
allowedAgents: ["orchestrator"],
|
|
53
|
+
sourcePath: "src/skills/cartography"
|
|
54
|
+
}
|
|
55
|
+
];
|
|
56
|
+
|
|
57
|
+
// src/cli/skills.ts
|
|
58
|
+
var RECOMMENDED_SKILLS = [
|
|
59
|
+
{
|
|
60
|
+
name: "simplify",
|
|
61
|
+
repo: "https://github.com/brianlovin/claude-config",
|
|
62
|
+
skillName: "simplify",
|
|
63
|
+
allowedAgents: ["orchestrator"],
|
|
64
|
+
description: "YAGNI code simplification expert"
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
name: "agent-browser",
|
|
68
|
+
repo: "https://github.com/vercel-labs/agent-browser",
|
|
69
|
+
skillName: "agent-browser",
|
|
70
|
+
allowedAgents: ["architect"],
|
|
71
|
+
description: "High-performance browser automation",
|
|
72
|
+
postInstallCommands: [
|
|
73
|
+
"npm install -g agent-browser",
|
|
74
|
+
"agent-browser install"
|
|
75
|
+
]
|
|
63
76
|
}
|
|
64
77
|
];
|
|
65
78
|
var PERMISSION_ONLY_SKILLS = [];
|
|
@@ -15830,12 +15843,12 @@ var DELEGATE_TASK_ERROR_PATTERNS = [
|
|
|
15830
15843
|
{
|
|
15831
15844
|
pattern: "category OR subagent_type",
|
|
15832
15845
|
errorType: "mutual_exclusion",
|
|
15833
|
-
fixHint: 'Provide only one: category (e.g., "unspecified-low") OR subagent_type (e.g., "
|
|
15846
|
+
fixHint: 'Provide only one: category (e.g., "unspecified-low") OR subagent_type (e.g., "surveyor").'
|
|
15834
15847
|
},
|
|
15835
15848
|
{
|
|
15836
15849
|
pattern: "Must provide either category or subagent_type",
|
|
15837
15850
|
errorType: "missing_category_or_agent",
|
|
15838
|
-
fixHint: 'Add either category="unspecified-low" or subagent_type="
|
|
15851
|
+
fixHint: 'Add either category="unspecified-low" or subagent_type="surveyor".'
|
|
15839
15852
|
},
|
|
15840
15853
|
{
|
|
15841
15854
|
pattern: "Unknown category",
|
|
@@ -2,11 +2,11 @@ import type { PluginConfig } from '../config';
|
|
|
2
2
|
/**
|
|
3
3
|
* Normalizes an agent name by trimming whitespace and removing the optional @ prefix.
|
|
4
4
|
*
|
|
5
|
-
* @param agentName - The agent name to normalize (e.g., "@
|
|
5
|
+
* @param agentName - The agent name to normalize (e.g., "@critic" or "critic")
|
|
6
6
|
* @returns The normalized agent name without @ prefix and trimmed of whitespace
|
|
7
7
|
*
|
|
8
8
|
* @example
|
|
9
|
-
* normalizeAgentName("@
|
|
9
|
+
* normalizeAgentName("@critic") // returns "critic"
|
|
10
10
|
* normalizeAgentName(" explore ") // returns "explore"
|
|
11
11
|
*/
|
|
12
12
|
export declare function normalizeAgentName(agentName: string): string;
|
|
@@ -24,7 +24,7 @@ export declare function normalizeAgentName(agentName: string): string;
|
|
|
24
24
|
* @returns The trimmed variant string, or undefined if no valid variant is found
|
|
25
25
|
*
|
|
26
26
|
* @example
|
|
27
|
-
* resolveAgentVariant(config, "@
|
|
27
|
+
* resolveAgentVariant(config, "@critic") // returns "high" if configured
|
|
28
28
|
*/
|
|
29
29
|
export declare function resolveAgentVariant(config: PluginConfig | undefined, agentName: string): string | undefined;
|
|
30
30
|
/**
|
|
@@ -39,8 +39,8 @@ export declare function resolveAgentVariant(config: PluginConfig | undefined, ag
|
|
|
39
39
|
* @returns The body with the variant applied (new object) or the original body unchanged
|
|
40
40
|
*
|
|
41
41
|
* @example
|
|
42
|
-
* applyAgentVariant("high", { agent: "
|
|
43
|
-
* applyAgentVariant("high", { agent: "
|
|
42
|
+
* applyAgentVariant("high", { agent: "critic" }) // returns { agent: "critic", variant: "high" }
|
|
43
|
+
* applyAgentVariant("high", { agent: "critic", variant: "low" }) // returns original body with variant: "low"
|
|
44
44
|
*/
|
|
45
45
|
export declare function applyAgentVariant<T extends {
|
|
46
46
|
variant?: string;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "oh-my-openidea",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.4",
|
|
4
4
|
"description": "Multi-agent framework for CS/ML research idea generation — literature survey, hypothesis generation, novelty checking, methodology design, and paper outlining",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: cartography
|
|
3
|
+
description: Repository understanding and hierarchical codemap generation — maps project structure, generates codemap.md files, and tracks changes via .slim/cartography.json.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Cartography Skill
|
|
7
|
+
|
|
8
|
+
This skill provides **repository understanding and hierarchical codemap generation** for projects managed by the orchestrator.
|
|
9
|
+
|
|
10
|
+
## When to Use
|
|
11
|
+
|
|
12
|
+
Use this skill when:
|
|
13
|
+
- Starting work on an unfamiliar codebase and need a high-level map
|
|
14
|
+
- Generating or updating `codemap.md` files after significant refactors
|
|
15
|
+
- Creating `.slim/cartography.json` for change tracking
|
|
16
|
+
- Answering questions about project structure and file organization
|
|
17
|
+
|
|
18
|
+
## Workflow
|
|
19
|
+
|
|
20
|
+
### Step 1: Explore Repository Structure
|
|
21
|
+
Traverse the repository tree and identify top-level modules, entry points, and key directories.
|
|
22
|
+
|
|
23
|
+
### Step 2: Generate Codemaps
|
|
24
|
+
For each significant directory, produce a `codemap.md` summarizing its purpose, key files, and their roles.
|
|
25
|
+
|
|
26
|
+
### Step 3: Update Tracking File
|
|
27
|
+
Write or update `.slim/cartography.json` with the current map, file hashes, and last-modified timestamps.
|
|
28
|
+
|
|
29
|
+
## Output
|
|
30
|
+
|
|
31
|
+
- `codemap.md` files in each mapped directory
|
|
32
|
+
- `.slim/cartography.json` with the full repository map
|