@lmctl-ai/lmctl 0.1.19 → 0.1.21

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 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.github-copilot.json` as a copyable opencode provider/variant sample.
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
@@ -43,7 +43,7 @@ _MEMBER_ alias=Reviewer provider=opencode model=github-copilot/gpt-5.4 effort=xh
43
43
  ```
44
44
 
45
45
  If `~/.config/opencode/opencode.json` is missing, `lmctl lint` warns and points
46
- to [this sample config](https://lmctl.com/examples/opencode.github-copilot.json).
46
+ to [this sample config](https://lmctl.com/examples/opencode.json).
47
47
  Copy it into your opencode config location and adjust it for the models your
48
48
  account can access.
49
49
 
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.github-copilot.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>
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.19",
3
+ "version": "0.1.21",
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
- }