@lmctl-ai/lmctl 0.1.261 → 0.1.262
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/index.js +1 -1
- package/package.json +1 -1
package/dist/cli/index.js
CHANGED
|
@@ -1640,7 +1640,7 @@ ${t}
|
|
|
1640
1640
|
|
|
1641
1641
|
${n}`:n}function kh(e,t){return new Promise((n,r)=>{let s=t.binaryPath||"codex",i=["app-server","--listen","stdio://"];t.model&&i.push("-c",`model=${JSON.stringify(t.model)}`);let o=t.isLead??t.alias?.toLowerCase()==="lead",a=o?ho():[];i.push(...a),le()&&je(JSON.stringify({event:"codex_mcp_inject",alias:t.alias??null,isLead:o,injected:a.length>0}));let l=t.permissionMode??"yolo",c=Bc(l);try{wt("codex",i,l)}catch(D){return r(D)}if(t.cwd&&!M0(t.cwd))return $({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:`sessiondir missing: ${t.cwd}`}),r(new Ie(`sessiondir missing: ${t.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let d=$0(s,i,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:Ye(t.env,t.cwd,t.threadId)}),u=!1;if(t.signal){if(t.signal.aborted)return u=!0,$({event:"transport_abort",provider:"codex",phase:"pre_spawn"}),tt(d).catch(()=>{}),r(new Error("Aborted"));t.signal.addEventListener("abort",()=>{u=!0,$({event:"transport_abort",provider:"codex"}),tt(d).catch(()=>{}),r(new Error("Aborted"))},{once:!0})}let f=C0({input:d.stdout}),m=new Map,p=1,_=t.threadId||"",h="",g=!1,y=!1,E=Date.now(),b=Hc(),S=Jc();function k(D,U={}){return new Promise((x,H)=>{let J=p++;m.set(J,{resolve:x,reject:H});let N=JSON.stringify({jsonrpc:"2.0",id:J,method:D,params:U});d.stdin?.write(N+`
|
|
1642
1642
|
`)})}function F(D,U={}){let x=JSON.stringify({jsonrpc:"2.0",method:D,params:U});d.stdin?.write(x+`
|
|
1643
|
-
`)}f.on("line",D=>{let U;try{U=JSON.parse(D)}catch{return}if(typeof U.id=="number"&&m.has(U.id)){let J=m.get(U.id);if(m.delete(U.id),U.error){let N=U.error,A=typeof N?.message=="string"&&N.message.length>0?N.message:JSON.stringify(U.error);J.reject(po(`codex app-server error: ${A}`,N))}else J.resolve(U);t.onEvent?.(U);return}let x=U.method;if(!x){t.onEvent?.(U);return}if(x==="thread/started"){let N=U.params?.thread;N?.id&&(_=N.id)}let H=le()?J=>{Ln("item.text/buffer-mismatch",{itemId:J.itemId,threadId:J.threadId??null,turnId:J.turnId??null,expectedFromItemText:J.expectedFromItemText,gotFromBuffer:J.gotFromBuffer,expectedLen:J.expectedFromItemText.length,gotLen:J.gotFromBuffer.length})}:void 0;if(x==="turn/started"){let J=U.params,N=J?.turn;N?.id&&(h=N.id),go(U,b,t.onDelta,H),le()&&Ln("turn/started",{params:J??null})}if(le()&&(x==="item/started"||x==="item/completed")){let J=U.params;J?.item?.type==="agentMessage"&&Ln(x,{params:J??null})}if(x==="item/started"||x==="item/agentMessage/delta"||x==="item/completed"){if(x==="item/agentMessage/delta"){let J=U.params;le()&&Ln("agentMessage/delta",{params:J??null})}go(U,b,t.onDelta,H)}if(x==="turn/completed"){let J=U.params;if(le())for(let[A,O]of b.agentItems.entries())O.buffer&&Ln("turn/completed/unflushed-item",{itemId:A,phase:O.phase,bufferLen:O.buffer.length});Xc(b),le()&&Ln("turn/completed",{params:J??null});let N=Kc(U,S);N.shouldReject?(le()&&Ln("turn/completed/terminal-reject",{message:N.turnError.message}),y=!0,g=!0,d.stdin?.end(),r(N.turnError)):(g=!0,d.stdin?.end())}if(x==="error"){let J=Gc(U,S);if(le()){let N=U.params,A=N?.error,O=typeof A?.message=="string"?A.message:"(no message)";Ln(J.willRetry?"error/retry":"error/terminal-deferred",{message:O,willRetry:J.willRetry,params:N??null})}}t.onEvent?.(U)});let P="";d.stderr?.on("data",D=>{P+=D.toString()}),d.on("error",D=>{$({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:D.message}),r(new Ie(`Failed to spawn codex app-server: ${D.message}`,{cause:D}))}),d.on("exit",D=>{if(!u&&!y){if(g){n({result:b.resultText,threadId:_,turnId:h,durationMs:Date.now()-E,exitCode:D});return}if(S.pendingCodexError){r(S.pendingCodexError);return}$({event:"transport_error",provider:"codex",error_class:"Error",reason:"provider_no_result",exit_code:D,stderr_tail:P.slice(0,500)}),r(new Error(U0({exitCode:D,stderr:P})))}}),(async()=>{try{if(await k("initialize",F0()),F("initialized",{}),t.threadId)try{let D=k("thread/resume",{threadId:t.threadId,sandbox:c,approvalPolicy:"never",...t.model?{model:t.model}:{}}),U=new Promise((x,H)=>setTimeout(()=>H(new Error("resume timeout")),
|
|
1643
|
+
`)}f.on("line",D=>{let U;try{U=JSON.parse(D)}catch{return}if(typeof U.id=="number"&&m.has(U.id)){let J=m.get(U.id);if(m.delete(U.id),U.error){let N=U.error,A=typeof N?.message=="string"&&N.message.length>0?N.message:JSON.stringify(U.error);J.reject(po(`codex app-server error: ${A}`,N))}else J.resolve(U);t.onEvent?.(U);return}let x=U.method;if(!x){t.onEvent?.(U);return}if(x==="thread/started"){let N=U.params?.thread;N?.id&&(_=N.id)}let H=le()?J=>{Ln("item.text/buffer-mismatch",{itemId:J.itemId,threadId:J.threadId??null,turnId:J.turnId??null,expectedFromItemText:J.expectedFromItemText,gotFromBuffer:J.gotFromBuffer,expectedLen:J.expectedFromItemText.length,gotLen:J.gotFromBuffer.length})}:void 0;if(x==="turn/started"){let J=U.params,N=J?.turn;N?.id&&(h=N.id),go(U,b,t.onDelta,H),le()&&Ln("turn/started",{params:J??null})}if(le()&&(x==="item/started"||x==="item/completed")){let J=U.params;J?.item?.type==="agentMessage"&&Ln(x,{params:J??null})}if(x==="item/started"||x==="item/agentMessage/delta"||x==="item/completed"){if(x==="item/agentMessage/delta"){let J=U.params;le()&&Ln("agentMessage/delta",{params:J??null})}go(U,b,t.onDelta,H)}if(x==="turn/completed"){let J=U.params;if(le())for(let[A,O]of b.agentItems.entries())O.buffer&&Ln("turn/completed/unflushed-item",{itemId:A,phase:O.phase,bufferLen:O.buffer.length});Xc(b),le()&&Ln("turn/completed",{params:J??null});let N=Kc(U,S);N.shouldReject?(le()&&Ln("turn/completed/terminal-reject",{message:N.turnError.message}),y=!0,g=!0,d.stdin?.end(),r(N.turnError)):(g=!0,d.stdin?.end())}if(x==="error"){let J=Gc(U,S);if(le()){let N=U.params,A=N?.error,O=typeof A?.message=="string"?A.message:"(no message)";Ln(J.willRetry?"error/retry":"error/terminal-deferred",{message:O,willRetry:J.willRetry,params:N??null})}}t.onEvent?.(U)});let P="";d.stderr?.on("data",D=>{P+=D.toString()}),d.on("error",D=>{$({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:D.message}),r(new Ie(`Failed to spawn codex app-server: ${D.message}`,{cause:D}))}),d.on("exit",D=>{if(!u&&!y){if(g){n({result:b.resultText,threadId:_,turnId:h,durationMs:Date.now()-E,exitCode:D});return}if(S.pendingCodexError){r(S.pendingCodexError);return}$({event:"transport_error",provider:"codex",error_class:"Error",reason:"provider_no_result",exit_code:D,stderr_tail:P.slice(0,500)}),r(new Error(U0({exitCode:D,stderr:P})))}}),(async()=>{try{if(await k("initialize",F0()),F("initialized",{}),t.threadId)try{let D=k("thread/resume",{threadId:t.threadId,sandbox:c,approvalPolicy:"never",...t.model?{model:t.model}:{}}),U=new Promise((x,H)=>setTimeout(()=>H(new Error("resume timeout")),3e4));await Promise.race([D,U]),_=t.threadId}catch(D){process.stderr.write(`[codex] thread/resume failed, creating new thread
|
|
1644
1644
|
`),$({event:"codex_thread_resume_fallback",provider:"codex",thread_id:t.threadId,error_message:D instanceof Error?D.message:String(D)});let x=(await k("thread/start",{cwd:t.cwd,approvalPolicy:"never",sandbox:c,...t.model?{model:t.model}:{}})).result?.thread;x?.id&&(_=x.id)}else{let U=(await k("thread/start",{cwd:t.cwd,approvalPolicy:"never",sandbox:c,...t.model?{model:t.model}:{}})).result?.thread;U?.id&&(_=U.id)}await k("turn/start",{threadId:_,input:[{type:"text",text:e}],...t.model?{model:t.model}:{}})}catch(D){tt(d).catch(()=>{}),r(D instanceof Error?D:new Error(String(D)))}})()})}var P0,Ih=w(()=>{"use strict";ce();ce();$r();js();Cr();qc();ce();Et();Vc();Vc();P0=(()=>{try{let e=new URL("../../../package.json",import.meta.url),t=JSON.parse(D0(j0(e),"utf8"));return typeof t.version=="string"?t.version:"0.0.0"}catch{return"0.0.0"}})()});import{existsSync as Ah,mkdirSync as W0,readFileSync as Rh,writeFileSync as Nh}from"node:fs";import{join as Ps,resolve as q0}from"node:path";function Lh(e){if(e==="allow")return!0;if(e&&typeof e=="object"&&!Array.isArray(e)){let t=Object.entries(e);if(t.length===1&&t[0][0]==="*"&&t[0][1]==="allow")return!0}return!1}function Yc(e,t,n={existsSync:Ah,readFileSync:Rh}){let r=[];for(let s of e){if(s.provider.trim().toLowerCase()!=="opencode")continue;let i=q0(t,s.sessiondir??t);for(let o of B0(i)){let a=H0(o,n);a!==void 0&&Object.prototype.hasOwnProperty.call(a,"permission")&&(Lh(a.permission)||r.push(`[${s.alias}] ${o} sets a non-allow \`permission\`, which opencode merges over lmctl's YOLO (.opencode/opencode.json permission:"allow") \u2014 the member may hang on permission prompts. Set \`permission: "allow"\` in that file (or remove the key).`))}}return r}function B0(e){return[Ps(e,".opencode","opencode.jsonc"),Ps(e,"opencode.jsonc"),Ps(e,"opencode.json")]}function H0(e,t){try{if(!t.existsSync(e))return;let n=t.readFileSync(e,"utf-8"),r=JSON.parse(X0(n));return r===null||typeof r!="object"||Array.isArray(r)?void 0:r}catch{return}}function X0(e){let t="",n=!1,r="",s=!1;for(let i=0;i<e.length;i+=1){let o=e[i],a=e[i+1];if(n){t+=o,s?s=!1:o==="\\"?s=!0:o===r&&(n=!1,r="");continue}if(o==='"'||o==="'"){n=!0,r=o,t+=o;continue}if(o==="/"&&a==="/"){for(;i<e.length&&e[i]!==`
|
|
1645
1645
|
`;)i+=1;i<e.length&&(t+=e[i]);continue}if(o==="/"&&a==="*"){for(i+=2;i<e.length&&!(e[i]==="*"&&e[i+1]==="/");)i+=1;i+=1;continue}t+=o}return t.replace(/,\s*([}\]])/g,"$1")}function yo(e,t={}){let n=Ps(e,".opencode"),r=Ps(n,"opencode.json");if(!Ah(r)){W0(n,{recursive:!0});let o=JSON.stringify({permission:"allow"},null,2);return Nh(r,o+`
|
|
1646
1646
|
`,"utf-8"),!0}let s;try{s=JSON.parse(Rh(r,"utf-8"))}catch{return console.log(xh.yellow(` .opencode/opencode.json at ${r} is malformed \u2014 skipping opencode config install.`)),!1}if(typeof s!="object"||s===null)return console.log(xh.yellow(` .opencode/opencode.json at ${r} is not an object \u2014 skipping opencode config install.`)),!1;let i=!1;return s.permission===void 0&&(s.permission="allow",i=!0),Lh(s.permission)||$({event:"opencode_yolo_override",provider:"opencode",config_path:r,user_permission:s.permission,message:`opencode.json has a user-set 'permission' value other than 'allow' \u2014 lmctl's YOLO contract is NOT in effect; turns may hang waiting on permission prompts. Set permission: "allow" or remove the key to restore YOLO.`}),i&&Nh(r,JSON.stringify(s,null,2)+`
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lmctl-ai/lmctl",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.262",
|
|
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",
|