@lmctl-ai/lmctl 0.1.20 → 0.1.22
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/CHANGELOG.md +1 -1
- package/README.md +15 -4
- package/dist/cli/index.js +1 -1
- package/examples/opencode.json +552 -0
- package/package.json +1 -1
- package/examples/opencode.github-copilot.json +0 -40
package/CHANGELOG.md
CHANGED
|
@@ -10,7 +10,7 @@ All notable public-preview changes for `@lmctl-ai/lmctl` are recorded here.
|
|
|
10
10
|
- Chat/MCP path: sends opencode ACP `session/set_config_option` for `model`, then `effort`.
|
|
11
11
|
- Seed path: uses `opencode run --model <id> --variant <effort>`.
|
|
12
12
|
- Added managed opencode provider entries for GitHub Copilot, DeepSeek, and OpenRouter-backed Qwen models.
|
|
13
|
-
- Added `examples/opencode.
|
|
13
|
+
- Added `examples/opencode.json` as a copyable opencode provider/variant sample.
|
|
14
14
|
- `lmctl lint` now warns when:
|
|
15
15
|
- `effort=` is used outside `provider=opencode`;
|
|
16
16
|
- opencode `effort=` is set without `model=`;
|
package/README.md
CHANGED
|
@@ -6,9 +6,20 @@
|
|
|
6
6
|
|
|
7
7
|
AI agents shouldn't be locked to one provider, one workflow, or one context
|
|
8
8
|
window. **lmctl** is a local-first control plane for running *teams* of AI coding
|
|
9
|
-
agents — across providers, with
|
|
10
|
-
in plain text. It coordinates the agent CLIs you already use
|
|
11
|
-
Gemini, and more); it's not an IDE and not another chatbot.
|
|
9
|
+
agents — across providers, with adversarial cross-provider review and durable
|
|
10
|
+
memory, composed in plain text. It coordinates the agent CLIs you already use
|
|
11
|
+
(Claude, Codex, Gemini, and more); it's not an IDE and not another chatbot.
|
|
12
|
+
|
|
13
|
+
Two things set it apart from how "multi-agent" and "AI review" usually work:
|
|
14
|
+
|
|
15
|
+
- **Review is adversarial, not self-review.** The reviewer is a different
|
|
16
|
+
provider *and* model from the author — a Claude lead hands coding to Codex and
|
|
17
|
+
has Gemini review it — so a model's blind spots aren't rubber-stamped by
|
|
18
|
+
itself in a different hat.
|
|
19
|
+
- **You build and tune the team — the provider doesn't.** Most "multi-agent"
|
|
20
|
+
tools have one provider auto-spawn agents you can't steer. In lmctl you divide
|
|
21
|
+
the work, compose the team in plain text, pick the provider and model for each
|
|
22
|
+
role, and tune how they interact.
|
|
12
23
|
|
|
13
24
|
> **Public preview.** Free to use during the preview. Closed-source, proprietary
|
|
14
25
|
> software distributed in binary form — see the [License](https://lmctl.com/lmctl/docs/license).
|
|
@@ -43,7 +54,7 @@ _MEMBER_ alias=Reviewer provider=opencode model=github-copilot/gpt-5.4 effort=xh
|
|
|
43
54
|
```
|
|
44
55
|
|
|
45
56
|
If `~/.config/opencode/opencode.json` is missing, `lmctl lint` warns and points
|
|
46
|
-
to [this sample config](https://lmctl.com/examples/opencode.
|
|
57
|
+
to [this sample config](https://lmctl.com/examples/opencode.json).
|
|
47
58
|
Copy it into your opencode config location and adjust it for the models your
|
|
48
59
|
account can access.
|
|
49
60
|
|
package/dist/cli/index.js
CHANGED
|
@@ -1906,7 +1906,7 @@ Show provider session details, team rollups, or managed run state/token totals.`
|
|
|
1906
1906
|
[--recursive] [--all] [--format table|teamfile|json] [--json]
|
|
1907
1907
|
lmctl ls --runs [--limit N] [--format table|json] [--json]
|
|
1908
1908
|
|
|
1909
|
-
List native provider sessions in scope, or list recent managed runs with --runs.`,E1=50,pb=500});import{existsSync as wb,readFileSync as yb}from"node:fs";import{homedir as v1}from"node:os";import{dirname as I1,resolve as Eb}from"node:path";import{fileURLToPath as $1}from"node:url";function bb(t,e={}){let r=[],n=j1(e.modelSelectionDocPath);for(let s of t){let o=s.provider.trim().toLowerCase();if(s.effort&&o!=="opencode"&&r.push(`[${s.alias}] effort="${s.effort}" is ignored: effort selection is only supported for opencode.`),o==="copilot"){if(!s.model)continue;r.push(`[${s.alias}] model="${s.model}" is ignored: copilot does not support lmctl model selection.`);continue}if(o==="opencode"){if(s.effort&&!s.model&&r.push(`[${s.alias}] effort="${s.effort}" has no effect without model= on an opencode member.`),!s.model)continue;let a=C1(e.opencodeConfigPath);a.missingConfigPath&&r.push(`[${s.alias}] opencode config not found at ${a.missingConfigPath}. lmctl can still validate lmctl-managed model ids, but opencode itself needs provider config/auth for use outside lmctl. Sample config: https://lmctl.com/examples/opencode.
|
|
1909
|
+
List native provider sessions in scope, or list recent managed runs with --runs.`,E1=50,pb=500});import{existsSync as wb,readFileSync as yb}from"node:fs";import{homedir as v1}from"node:os";import{dirname as I1,resolve as Eb}from"node:path";import{fileURLToPath as $1}from"node:url";function bb(t,e={}){let r=[],n=j1(e.modelSelectionDocPath);for(let s of t){let o=s.provider.trim().toLowerCase();if(s.effort&&o!=="opencode"&&r.push(`[${s.alias}] effort="${s.effort}" is ignored: effort selection is only supported for opencode.`),o==="copilot"){if(!s.model)continue;r.push(`[${s.alias}] model="${s.model}" is ignored: copilot does not support lmctl model selection.`);continue}if(o==="opencode"){if(s.effort&&!s.model&&r.push(`[${s.alias}] effort="${s.effort}" has no effect without model= on an opencode member.`),!s.model)continue;let a=C1(e.opencodeConfigPath);a.missingConfigPath&&r.push(`[${s.alias}] opencode config not found at ${a.missingConfigPath}. lmctl can still validate lmctl-managed model ids, but opencode itself needs provider config/auth for use outside lmctl. Sample config: https://lmctl.com/examples/opencode.json (copy it to that path and adjust for the models your account can access).`),a.available?a.models.includes(s.model)||r.push(`[${s.alias}] model="${s.model}" is not configured for opencode. Valid configured or lmctl-managed models: ${gb(a.models)}`):r.push(`[${s.alias}] model="${s.model}" cannot be verified for opencode: ${a.reason}.`);continue}if(!s.model)continue;let i=n.get(o);if(!i){r.push(`[${s.alias}] model="${s.model}" cannot be verified for provider "${o}": `+(la??"no tested models found in durable-memory/model_selection.md"));continue}i.includes(s.model)||r.push(`[${s.alias}] model="${s.model}" is not in the tested model list for provider "${o}". Valid tested models: ${gb(i)}`)}return r}function j1(t){if(!t&&bs)return bs;let e=new Map,r,n=t??A1();if(!wb(n))return r=`${n} not found`,t||_d(e),t||(bs=e),t||(la=r),e;let s;try{s=yb(n,"utf-8")}catch(o){return r=`${n} could not be read: ${o instanceof Error?o.message:String(o)}`,t||_d(e),t||(bs=e),t||(la=r),e}for(let[o,i]of Object.entries(N1)){let a=R1(s,i),l=O1(a);l.length>0&&e.set(o,l)}return e.size===0&&(r=`${n} has no tested model rows`),!t&&e.size===0&&_d(e),t||(bs=e),t||(la=r),e}function A1(){let t=I1($1(import.meta.url));return Eb(t,"..","..","..","durable-memory","model_selection.md")}function _d(t){for(let[e,r]of Object.entries(x1))t.set(e,r)}function R1(t,e){let n=new RegExp(`^## ${M1(e)}\\s*$`,"m").exec(t);if(!n)return"";let s=n.index+n[0].length,o=t.slice(s),i=/^##\s+/m.exec(o);return i?o.slice(0,i.index):o}function O1(t){let e=new Set;for(let r of t.split(/\r?\n/)){let n=r.trim();if(!n.startsWith("| `"))continue;let s=/^\|\s*`([^`]+)`\s*\|/.exec(n);if(!s)continue;let o=s[1].trim();o&&o!=="Configured `model="&&e.add(o)}return[...e]}function C1(t){let e=t??Eb(v1(),".config","opencode","opencode.json"),r=sm();if(!wb(e))return{available:!0,models:r,missingConfigPath:e};let n;try{n=JSON.parse(yb(e,"utf-8"))}catch(o){return{available:!1,models:[],reason:`${e} could not be parsed: ${o instanceof Error?o.message:String(o)}`}}let s=[...new Set([...L1(n),...r])].sort();return s.length===0?{available:!1,models:s,reason:`${e} has no provider models`}:{available:!0,models:s}}function L1(t){if(!gd(t))return[];let e=aa(t.provider)??aa(t.providers);if(!e)return[];let r=new Set;for(let[n,s]of Object.entries(e)){if(!gd(s))continue;let o=aa(s.models)??aa(s.model);if(o)for(let i of Object.keys(o))r.add(i.startsWith(`${n}/`)?i:`${n}/${i}`)}return[...r].sort()}function aa(t){return gd(t)?t:null}function gd(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function gb(t){return t.length>0?t.join(", "):"(none)"}function M1(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var N1,x1,bs,la,Tb=E(()=>{"use strict";za();N1={claude:"Claude",codex:"Codex",gemini:"Gemini",qwen:"Qwen",agy:"Antigravity"},x1={claude:["claude-opus-4-6","claude-opus-4-7","claude-opus-4-8","claude-sonnet-4-6","claude-haiku-4-5","claude-fable-5"],codex:["gpt-5.2","gpt-5.4","gpt-5.5","gpt-5.4-mini","gpt-5.3-codex","gpt-5.3-codex-spark"],gemini:["gemini-3.1-pro-preview","gemini-3-flash-preview","gemini-3.1-flash-lite-preview","gemini-2.5-flash","gemini-2.5-flash-lite"],qwen:["qwen3.5-plus","qwen3.6-plus"],agy:["gemini-1.5-flash","gemini-1.5-pro","gemini-3.5-flash","gemini-3.1-pro","gpt-oss-120b","gpt-4-turbo","gpt-4","gpt-3.5-turbo","claude-3-opus","claude-3-sonnet","claude-3-haiku"]},bs=null});var Is={};ie(Is,{GEMINI_PROVIDER_NOTICE:()=>Nb,_setSkillFileOpsForTests:()=>V1,_setTeamfileSeedForTests:()=>X1,buildRootTeamRegistrationRow:()=>Rb,persistTeamConnections:()=>Cb,registerRootTeam:()=>Ob,runHire:()=>Y1,runLint:()=>K1,runRefresh:()=>z1,runSeed:()=>jb,sha256Text:()=>Ab,skillNameFromSource:()=>Sd,skillNameFromUrl:()=>fF});import{createHash as D1,randomUUID as P1}from"node:crypto";import{existsSync as F1,mkdirSync as U1,readFileSync as ks,realpathSync as yd,renameSync as W1,unlinkSync as B1,writeFileSync as jr}from"node:fs";import{basename as q1,dirname as fa,isAbsolute as Sb,join as da,resolve as vs}from"node:path";function X1(t){xb=t??(async e=>{let{seed:r}=await Promise.resolve().then(()=>(It(),Al)),n=await r(e);return n.success?{sessionId:n.sessionId}:{error:n.error??"provider seed failed"}})}function V1(t){Ss=t===null?Ed:{...Ed,...t}}async function K1(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(J1),0;if(t.length!==1)return e.stderr.write(`usage: lmctl lint <teamfile.lmctl>
|
|
1910
1910
|
`),2;let r=t[0],n;try{n=Ne(r)}catch(i){return Le(e,`${r}: ${i instanceof Error?i.message:String(i)}`)}let s=Yu(n,fa(vs(r))),o=bb(n.members);for(let i of s)e.stderr.write(`error: ${i.field}: ${i.message}
|
|
1911
1911
|
`);if(s.length===0)try{Ir(r)}catch(i){return e.stderr.write(`error: connect: ${i instanceof Error?i.message:String(i)}
|
|
1912
1912
|
`),1}for(let i of n.members)Td([i],e),i.session!==void 0&&i.session.length<Ts&&o.push(`${i.alias}: sessionid is shorter than ${Ts} chars; run lmctl seed to refresh it`);for(let i of o)e.stderr.write(`warning: ${i}
|
|
@@ -0,0 +1,552 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://opencode.ai/config.json",
|
|
3
|
+
"provider": {
|
|
4
|
+
"z-ai-coding": {
|
|
5
|
+
"npm": "@ai-sdk/openai-compatible",
|
|
6
|
+
"name": "Z.AI Coding Plan",
|
|
7
|
+
"options": {
|
|
8
|
+
"baseURL": "https://api.z.ai/api/coding/paas/v4",
|
|
9
|
+
"apiKey": "{env:ZAI_API_KEY}"
|
|
10
|
+
},
|
|
11
|
+
"models": {
|
|
12
|
+
"GLM-4.7": {
|
|
13
|
+
"name": "GLM-4.7"
|
|
14
|
+
},
|
|
15
|
+
"GLM-5.1": {
|
|
16
|
+
"name": "GLM-5.1"
|
|
17
|
+
},
|
|
18
|
+
"GLM-5.2": {
|
|
19
|
+
"name": "GLM-5.2"
|
|
20
|
+
},
|
|
21
|
+
"GLM-5": {
|
|
22
|
+
"name": "GLM-5"
|
|
23
|
+
},
|
|
24
|
+
"GLM-5-Turbo": {
|
|
25
|
+
"name": "GLM-5-Turbo"
|
|
26
|
+
},
|
|
27
|
+
"GLM-4.5-air": {
|
|
28
|
+
"name": "GLM-4.5 Air"
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
"ollama-local": {
|
|
33
|
+
"npm": "@ai-sdk/openai-compatible",
|
|
34
|
+
"name": "Local Ollama (Windows)",
|
|
35
|
+
"options": {
|
|
36
|
+
"baseURL": "http://172.18.32.1:11434/v1"
|
|
37
|
+
},
|
|
38
|
+
"models": {
|
|
39
|
+
"qwen3.5:9b": {
|
|
40
|
+
"name": "Qwen 3.5 9B"
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
"deepseek": {
|
|
45
|
+
"npm": "@ai-sdk/openai-compatible",
|
|
46
|
+
"name": "DeepSeek",
|
|
47
|
+
"options": {
|
|
48
|
+
"baseURL": "https://api.deepseek.com/v1",
|
|
49
|
+
"apiKey": "{env:DEEPSEEK_API_KEY}"
|
|
50
|
+
},
|
|
51
|
+
"models": {
|
|
52
|
+
"deepseek-chat": {
|
|
53
|
+
"name": "deepseek-chat"
|
|
54
|
+
},
|
|
55
|
+
"deepseek-reasoner": {
|
|
56
|
+
"name": "deepseek-reasoner"
|
|
57
|
+
},
|
|
58
|
+
"deepseek-v4-flash": {
|
|
59
|
+
"name": "deepseek-v4-flash"
|
|
60
|
+
},
|
|
61
|
+
"deepseek-v4-pro": {
|
|
62
|
+
"name": "deepseek-v4-pro"
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
"openrouter": {
|
|
67
|
+
"npm": "@ai-sdk/openai-compatible",
|
|
68
|
+
"name": "OpenRouter",
|
|
69
|
+
"options": {
|
|
70
|
+
"baseURL": "https://openrouter.ai/api/v1",
|
|
71
|
+
"apiKey": "{env:OPENROUTER_API_KEY}"
|
|
72
|
+
},
|
|
73
|
+
"models": {
|
|
74
|
+
"qwen/qwen3-coder": {
|
|
75
|
+
"name": "qwen/qwen3-coder"
|
|
76
|
+
},
|
|
77
|
+
"qwen/qwen3-coder-plus": {
|
|
78
|
+
"name": "qwen/qwen3-coder-plus"
|
|
79
|
+
},
|
|
80
|
+
"qwen/qwen3-coder-flash": {
|
|
81
|
+
"name": "qwen/qwen3-coder-flash"
|
|
82
|
+
},
|
|
83
|
+
"qwen/qwen3.5-9b": {
|
|
84
|
+
"name": "qwen/qwen3.5-9b"
|
|
85
|
+
},
|
|
86
|
+
"qwen/qwen3.5-397b-a17b": {
|
|
87
|
+
"name": "qwen/qwen3.5-397b-a17b"
|
|
88
|
+
},
|
|
89
|
+
"qwen/qwen3.5-plus-20260420": {
|
|
90
|
+
"name": "qwen/qwen3.5-plus-20260420"
|
|
91
|
+
},
|
|
92
|
+
"qwen/qwen3.6-flash": {
|
|
93
|
+
"name": "qwen/qwen3.6-flash"
|
|
94
|
+
},
|
|
95
|
+
"qwen/qwen3.6-plus": {
|
|
96
|
+
"name": "qwen/qwen3.6-plus"
|
|
97
|
+
},
|
|
98
|
+
"qwen/qwen3.6-max-preview": {
|
|
99
|
+
"name": "qwen/qwen3.6-max-preview"
|
|
100
|
+
},
|
|
101
|
+
"qwen/qwen3.7-plus": {
|
|
102
|
+
"name": "qwen/qwen3.7-plus"
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
},
|
|
106
|
+
"github-copilot": {
|
|
107
|
+
"npm": "@ai-sdk/openai-compatible",
|
|
108
|
+
"name": "GitHub Copilot",
|
|
109
|
+
"api": "https://api.githubcopilot.com",
|
|
110
|
+
"options": {
|
|
111
|
+
"baseURL": ""
|
|
112
|
+
},
|
|
113
|
+
"models": {
|
|
114
|
+
"claude-fable-5": {
|
|
115
|
+
"name": "Claude Fable 5",
|
|
116
|
+
"reasoning": true,
|
|
117
|
+
"provider": {
|
|
118
|
+
"npm": "@ai-sdk/anthropic",
|
|
119
|
+
"api": "https://api.githubcopilot.com/v1"
|
|
120
|
+
},
|
|
121
|
+
"variants": {
|
|
122
|
+
"high": {
|
|
123
|
+
"thinking": {
|
|
124
|
+
"type": "adaptive",
|
|
125
|
+
"display": "summarized"
|
|
126
|
+
},
|
|
127
|
+
"effort": "high"
|
|
128
|
+
},
|
|
129
|
+
"xhigh": {
|
|
130
|
+
"thinking": {
|
|
131
|
+
"type": "adaptive",
|
|
132
|
+
"display": "summarized"
|
|
133
|
+
},
|
|
134
|
+
"effort": "xhigh"
|
|
135
|
+
},
|
|
136
|
+
"max": {
|
|
137
|
+
"thinking": {
|
|
138
|
+
"type": "adaptive",
|
|
139
|
+
"display": "summarized"
|
|
140
|
+
},
|
|
141
|
+
"effort": "max"
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
},
|
|
145
|
+
"claude-haiku-4.5": {
|
|
146
|
+
"name": "Claude Haiku 4.5",
|
|
147
|
+
"reasoning": true,
|
|
148
|
+
"provider": {
|
|
149
|
+
"npm": "@ai-sdk/anthropic",
|
|
150
|
+
"api": "https://api.githubcopilot.com/v1"
|
|
151
|
+
},
|
|
152
|
+
"variants": {
|
|
153
|
+
"high": {
|
|
154
|
+
"thinking": {
|
|
155
|
+
"type": "enabled",
|
|
156
|
+
"budgetTokens": 16000
|
|
157
|
+
}
|
|
158
|
+
},
|
|
159
|
+
"max": {
|
|
160
|
+
"thinking": {
|
|
161
|
+
"type": "enabled",
|
|
162
|
+
"budgetTokens": 31999
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
},
|
|
167
|
+
"claude-opus-4.5": {
|
|
168
|
+
"name": "Claude Opus 4.5",
|
|
169
|
+
"reasoning": true,
|
|
170
|
+
"provider": {
|
|
171
|
+
"npm": "@ai-sdk/anthropic",
|
|
172
|
+
"api": "https://api.githubcopilot.com/v1"
|
|
173
|
+
},
|
|
174
|
+
"variants": {
|
|
175
|
+
"high": {
|
|
176
|
+
"effort": "high"
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
},
|
|
180
|
+
"claude-opus-4.6": {
|
|
181
|
+
"name": "Claude Opus 4.6",
|
|
182
|
+
"reasoning": true,
|
|
183
|
+
"provider": {
|
|
184
|
+
"npm": "@ai-sdk/anthropic",
|
|
185
|
+
"api": "https://api.githubcopilot.com/v1"
|
|
186
|
+
},
|
|
187
|
+
"variants": {
|
|
188
|
+
"high": {
|
|
189
|
+
"thinking": {
|
|
190
|
+
"type": "adaptive"
|
|
191
|
+
},
|
|
192
|
+
"effort": "high"
|
|
193
|
+
},
|
|
194
|
+
"max": {
|
|
195
|
+
"thinking": {
|
|
196
|
+
"type": "adaptive"
|
|
197
|
+
},
|
|
198
|
+
"effort": "max"
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
},
|
|
202
|
+
"claude-opus-4.7": {
|
|
203
|
+
"name": "Claude Opus 4.7",
|
|
204
|
+
"reasoning": true,
|
|
205
|
+
"provider": {
|
|
206
|
+
"npm": "@ai-sdk/anthropic",
|
|
207
|
+
"api": "https://api.githubcopilot.com/v1"
|
|
208
|
+
},
|
|
209
|
+
"variants": {
|
|
210
|
+
"high": {
|
|
211
|
+
"thinking": {
|
|
212
|
+
"type": "adaptive",
|
|
213
|
+
"display": "summarized"
|
|
214
|
+
},
|
|
215
|
+
"effort": "high"
|
|
216
|
+
},
|
|
217
|
+
"xhigh": {
|
|
218
|
+
"thinking": {
|
|
219
|
+
"type": "adaptive",
|
|
220
|
+
"display": "summarized"
|
|
221
|
+
},
|
|
222
|
+
"effort": "xhigh"
|
|
223
|
+
},
|
|
224
|
+
"max": {
|
|
225
|
+
"thinking": {
|
|
226
|
+
"type": "adaptive",
|
|
227
|
+
"display": "summarized"
|
|
228
|
+
},
|
|
229
|
+
"effort": "max"
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
},
|
|
233
|
+
"claude-opus-4.8": {
|
|
234
|
+
"name": "Claude Opus 4.8",
|
|
235
|
+
"reasoning": true,
|
|
236
|
+
"provider": {
|
|
237
|
+
"npm": "@ai-sdk/anthropic",
|
|
238
|
+
"api": "https://api.githubcopilot.com/v1"
|
|
239
|
+
},
|
|
240
|
+
"variants": {
|
|
241
|
+
"high": {
|
|
242
|
+
"thinking": {
|
|
243
|
+
"type": "adaptive",
|
|
244
|
+
"display": "summarized"
|
|
245
|
+
},
|
|
246
|
+
"effort": "high"
|
|
247
|
+
},
|
|
248
|
+
"xhigh": {
|
|
249
|
+
"thinking": {
|
|
250
|
+
"type": "adaptive",
|
|
251
|
+
"display": "summarized"
|
|
252
|
+
},
|
|
253
|
+
"effort": "xhigh"
|
|
254
|
+
},
|
|
255
|
+
"max": {
|
|
256
|
+
"thinking": {
|
|
257
|
+
"type": "adaptive",
|
|
258
|
+
"display": "summarized"
|
|
259
|
+
},
|
|
260
|
+
"effort": "max"
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
},
|
|
264
|
+
"claude-sonnet-4": {
|
|
265
|
+
"name": "Claude Sonnet 4",
|
|
266
|
+
"reasoning": true,
|
|
267
|
+
"provider": {
|
|
268
|
+
"npm": "@ai-sdk/anthropic",
|
|
269
|
+
"api": "https://api.githubcopilot.com/v1"
|
|
270
|
+
},
|
|
271
|
+
"variants": {
|
|
272
|
+
"high": {
|
|
273
|
+
"thinking": {
|
|
274
|
+
"type": "enabled",
|
|
275
|
+
"budgetTokens": 16000
|
|
276
|
+
}
|
|
277
|
+
},
|
|
278
|
+
"max": {
|
|
279
|
+
"thinking": {
|
|
280
|
+
"type": "enabled",
|
|
281
|
+
"budgetTokens": 31999
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
},
|
|
286
|
+
"claude-sonnet-4.5": {
|
|
287
|
+
"name": "Claude Sonnet 4.5",
|
|
288
|
+
"reasoning": true,
|
|
289
|
+
"provider": {
|
|
290
|
+
"npm": "@ai-sdk/anthropic",
|
|
291
|
+
"api": "https://api.githubcopilot.com/v1"
|
|
292
|
+
},
|
|
293
|
+
"variants": {
|
|
294
|
+
"high": {
|
|
295
|
+
"thinking": {
|
|
296
|
+
"type": "enabled",
|
|
297
|
+
"budgetTokens": 16000
|
|
298
|
+
}
|
|
299
|
+
},
|
|
300
|
+
"max": {
|
|
301
|
+
"thinking": {
|
|
302
|
+
"type": "enabled",
|
|
303
|
+
"budgetTokens": 31999
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
},
|
|
308
|
+
"claude-sonnet-4.6": {
|
|
309
|
+
"name": "Claude Sonnet 4.6",
|
|
310
|
+
"reasoning": true,
|
|
311
|
+
"provider": {
|
|
312
|
+
"npm": "@ai-sdk/anthropic",
|
|
313
|
+
"api": "https://api.githubcopilot.com/v1"
|
|
314
|
+
},
|
|
315
|
+
"variants": {
|
|
316
|
+
"high": {
|
|
317
|
+
"thinking": {
|
|
318
|
+
"type": "adaptive"
|
|
319
|
+
},
|
|
320
|
+
"effort": "high"
|
|
321
|
+
},
|
|
322
|
+
"max": {
|
|
323
|
+
"thinking": {
|
|
324
|
+
"type": "adaptive"
|
|
325
|
+
},
|
|
326
|
+
"effort": "max"
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
},
|
|
330
|
+
"gemini-2.5-pro": {
|
|
331
|
+
"name": "Gemini 2.5 Pro",
|
|
332
|
+
"provider": {
|
|
333
|
+
"npm": "@ai-sdk/github-copilot"
|
|
334
|
+
}
|
|
335
|
+
},
|
|
336
|
+
"gemini-3-flash-preview": {
|
|
337
|
+
"name": "Gemini 3 Flash Preview",
|
|
338
|
+
"provider": {
|
|
339
|
+
"npm": "@ai-sdk/github-copilot"
|
|
340
|
+
}
|
|
341
|
+
},
|
|
342
|
+
"gemini-3.1-pro-preview": {
|
|
343
|
+
"name": "Gemini 3.1 Pro Preview",
|
|
344
|
+
"provider": {
|
|
345
|
+
"npm": "@ai-sdk/github-copilot"
|
|
346
|
+
}
|
|
347
|
+
},
|
|
348
|
+
"gemini-3.5-flash": {
|
|
349
|
+
"name": "Gemini 3.5 Flash",
|
|
350
|
+
"provider": {
|
|
351
|
+
"npm": "@ai-sdk/github-copilot"
|
|
352
|
+
}
|
|
353
|
+
},
|
|
354
|
+
"gpt-4.1": {
|
|
355
|
+
"name": "gpt-4.1"
|
|
356
|
+
},
|
|
357
|
+
"gpt-4.1-2025-04-14": {
|
|
358
|
+
"name": "gpt-4.1-2025-04-14"
|
|
359
|
+
},
|
|
360
|
+
"gpt-4o-mini": {
|
|
361
|
+
"name": "gpt-4o-mini"
|
|
362
|
+
},
|
|
363
|
+
"gpt-4o-mini-2024-07-18": {
|
|
364
|
+
"name": "gpt-4o-mini-2024-07-18"
|
|
365
|
+
},
|
|
366
|
+
"gpt-5-mini": {
|
|
367
|
+
"name": "GPT-5 mini",
|
|
368
|
+
"reasoning": true,
|
|
369
|
+
"provider": {
|
|
370
|
+
"npm": "@ai-sdk/github-copilot"
|
|
371
|
+
},
|
|
372
|
+
"variants": {
|
|
373
|
+
"high": {
|
|
374
|
+
"reasoningEffort": "high",
|
|
375
|
+
"reasoningSummary": "auto",
|
|
376
|
+
"include": [
|
|
377
|
+
"reasoning.encrypted_content"
|
|
378
|
+
]
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
},
|
|
382
|
+
"gpt-5.2": {
|
|
383
|
+
"name": "GPT-5.2",
|
|
384
|
+
"reasoning": true,
|
|
385
|
+
"provider": {
|
|
386
|
+
"npm": "@ai-sdk/github-copilot"
|
|
387
|
+
},
|
|
388
|
+
"variants": {
|
|
389
|
+
"high": {
|
|
390
|
+
"reasoningEffort": "high",
|
|
391
|
+
"reasoningSummary": "auto",
|
|
392
|
+
"include": [
|
|
393
|
+
"reasoning.encrypted_content"
|
|
394
|
+
]
|
|
395
|
+
},
|
|
396
|
+
"xhigh": {
|
|
397
|
+
"reasoningEffort": "xhigh",
|
|
398
|
+
"reasoningSummary": "auto",
|
|
399
|
+
"include": [
|
|
400
|
+
"reasoning.encrypted_content"
|
|
401
|
+
]
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
},
|
|
405
|
+
"gpt-5.2-codex": {
|
|
406
|
+
"name": "GPT-5.2 Codex",
|
|
407
|
+
"reasoning": true,
|
|
408
|
+
"provider": {
|
|
409
|
+
"npm": "@ai-sdk/github-copilot"
|
|
410
|
+
},
|
|
411
|
+
"variants": {
|
|
412
|
+
"high": {
|
|
413
|
+
"reasoningEffort": "high",
|
|
414
|
+
"reasoningSummary": "auto",
|
|
415
|
+
"include": [
|
|
416
|
+
"reasoning.encrypted_content"
|
|
417
|
+
]
|
|
418
|
+
},
|
|
419
|
+
"xhigh": {
|
|
420
|
+
"reasoningEffort": "xhigh",
|
|
421
|
+
"reasoningSummary": "auto",
|
|
422
|
+
"include": [
|
|
423
|
+
"reasoning.encrypted_content"
|
|
424
|
+
]
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
},
|
|
428
|
+
"gpt-5.3-codex": {
|
|
429
|
+
"name": "GPT-5.3 Codex",
|
|
430
|
+
"reasoning": true,
|
|
431
|
+
"provider": {
|
|
432
|
+
"npm": "@ai-sdk/github-copilot"
|
|
433
|
+
},
|
|
434
|
+
"variants": {
|
|
435
|
+
"high": {
|
|
436
|
+
"reasoningEffort": "high",
|
|
437
|
+
"reasoningSummary": "auto",
|
|
438
|
+
"include": [
|
|
439
|
+
"reasoning.encrypted_content"
|
|
440
|
+
]
|
|
441
|
+
},
|
|
442
|
+
"xhigh": {
|
|
443
|
+
"reasoningEffort": "xhigh",
|
|
444
|
+
"reasoningSummary": "auto",
|
|
445
|
+
"include": [
|
|
446
|
+
"reasoning.encrypted_content"
|
|
447
|
+
]
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
},
|
|
451
|
+
"gpt-5.4": {
|
|
452
|
+
"name": "GPT-5.4",
|
|
453
|
+
"reasoning": true,
|
|
454
|
+
"provider": {
|
|
455
|
+
"npm": "@ai-sdk/github-copilot"
|
|
456
|
+
},
|
|
457
|
+
"variants": {
|
|
458
|
+
"high": {
|
|
459
|
+
"reasoningEffort": "high",
|
|
460
|
+
"reasoningSummary": "auto",
|
|
461
|
+
"include": [
|
|
462
|
+
"reasoning.encrypted_content"
|
|
463
|
+
]
|
|
464
|
+
},
|
|
465
|
+
"xhigh": {
|
|
466
|
+
"reasoningEffort": "xhigh",
|
|
467
|
+
"reasoningSummary": "auto",
|
|
468
|
+
"include": [
|
|
469
|
+
"reasoning.encrypted_content"
|
|
470
|
+
]
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
},
|
|
474
|
+
"gpt-5.4-mini": {
|
|
475
|
+
"name": "GPT-5.4 mini",
|
|
476
|
+
"reasoning": true,
|
|
477
|
+
"provider": {
|
|
478
|
+
"npm": "@ai-sdk/github-copilot"
|
|
479
|
+
},
|
|
480
|
+
"variants": {
|
|
481
|
+
"high": {
|
|
482
|
+
"reasoningEffort": "high",
|
|
483
|
+
"reasoningSummary": "auto",
|
|
484
|
+
"include": [
|
|
485
|
+
"reasoning.encrypted_content"
|
|
486
|
+
]
|
|
487
|
+
},
|
|
488
|
+
"xhigh": {
|
|
489
|
+
"reasoningEffort": "xhigh",
|
|
490
|
+
"reasoningSummary": "auto",
|
|
491
|
+
"include": [
|
|
492
|
+
"reasoning.encrypted_content"
|
|
493
|
+
]
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
},
|
|
497
|
+
"gpt-5.4-nano": {
|
|
498
|
+
"name": "GPT-5.4 nano",
|
|
499
|
+
"reasoning": true,
|
|
500
|
+
"provider": {
|
|
501
|
+
"npm": "@ai-sdk/github-copilot"
|
|
502
|
+
},
|
|
503
|
+
"variants": {
|
|
504
|
+
"high": {
|
|
505
|
+
"reasoningEffort": "high",
|
|
506
|
+
"reasoningSummary": "auto",
|
|
507
|
+
"include": [
|
|
508
|
+
"reasoning.encrypted_content"
|
|
509
|
+
]
|
|
510
|
+
},
|
|
511
|
+
"xhigh": {
|
|
512
|
+
"reasoningEffort": "xhigh",
|
|
513
|
+
"reasoningSummary": "auto",
|
|
514
|
+
"include": [
|
|
515
|
+
"reasoning.encrypted_content"
|
|
516
|
+
]
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
},
|
|
520
|
+
"gpt-5.5": {
|
|
521
|
+
"name": "GPT-5.5",
|
|
522
|
+
"reasoning": true,
|
|
523
|
+
"provider": {
|
|
524
|
+
"npm": "@ai-sdk/github-copilot"
|
|
525
|
+
},
|
|
526
|
+
"variants": {
|
|
527
|
+
"high": {
|
|
528
|
+
"reasoningEffort": "high",
|
|
529
|
+
"reasoningSummary": "auto",
|
|
530
|
+
"include": [
|
|
531
|
+
"reasoning.encrypted_content"
|
|
532
|
+
]
|
|
533
|
+
},
|
|
534
|
+
"xhigh": {
|
|
535
|
+
"reasoningEffort": "xhigh",
|
|
536
|
+
"reasoningSummary": "auto",
|
|
537
|
+
"include": [
|
|
538
|
+
"reasoning.encrypted_content"
|
|
539
|
+
]
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
},
|
|
543
|
+
"mai-code-1-flash-picker": {
|
|
544
|
+
"name": "MAI-Code-1-Flash",
|
|
545
|
+
"provider": {
|
|
546
|
+
"npm": "@ai-sdk/github-copilot"
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lmctl-ai/lmctl",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.22",
|
|
4
4
|
"description": "A provider-agnostic control plane for teams of AI coding agents — across providers, with independent review and durable memory.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"homepage": "https://lmctl.com",
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "https://opencode.ai/config.json",
|
|
3
|
-
"provider": {
|
|
4
|
-
"github-copilot": {
|
|
5
|
-
"npm": "@ai-sdk/openai-compatible",
|
|
6
|
-
"name": "GitHub Copilot",
|
|
7
|
-
"options": {
|
|
8
|
-
"baseURL": "https://api.githubcopilot.com"
|
|
9
|
-
},
|
|
10
|
-
"models": {
|
|
11
|
-
"gpt-4.1": {
|
|
12
|
-
"name": "GPT-4.1"
|
|
13
|
-
},
|
|
14
|
-
"gpt-5.4": {
|
|
15
|
-
"name": "GPT-5.4",
|
|
16
|
-
"reasoning": true,
|
|
17
|
-
"provider": {
|
|
18
|
-
"npm": "@ai-sdk/github-copilot"
|
|
19
|
-
},
|
|
20
|
-
"variants": {
|
|
21
|
-
"high": {
|
|
22
|
-
"reasoningEffort": "high",
|
|
23
|
-
"reasoningSummary": "auto",
|
|
24
|
-
"include": [
|
|
25
|
-
"reasoning.encrypted_content"
|
|
26
|
-
]
|
|
27
|
-
},
|
|
28
|
-
"xhigh": {
|
|
29
|
-
"reasoningEffort": "xhigh",
|
|
30
|
-
"reasoningSummary": "auto",
|
|
31
|
-
"include": [
|
|
32
|
-
"reasoning.encrypted_content"
|
|
33
|
-
]
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
}
|