@lmctl-ai/lmctl 0.1.337 → 0.1.338
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 +3 -3
- package/package.json +1 -1
package/dist/cli/index.js
CHANGED
|
@@ -1575,9 +1575,9 @@ ${n}`:n}function eC(t,e){if(t!=="kimi"||!e.includes("notifications/initialized")
|
|
|
1575
1575
|
ORDER BY s.time_updated DESC
|
|
1576
1576
|
LIMIT 2`).all(`${n}%`);return s.length!==1?null:s[0]}}});function Nd(){return new Id}var Id,Ad=E(()=>{"use strict";kd();ht();cn();it();Id=class extends Te{constructor(){super({provider:new $r,capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"custom-tool",leaderSetupHint:"OpenCode supports custom tools via .opencode/tools/ directory"},binary:"opencode",seedArgs:["run",ce],resumeTemplate:"opencode --session {{session_id}}",startTemplate:"opencode",transport:(e,n)=>Gt(e,{...n,acpTool:"opencode"})})}seedArgsFor(e){let n=["run"];return e?.model&&n.push("--model",e.model),e?.effort&&n.push("--variant",e.effort),n.push(e?.prompt??ce),n}}});import{appendFile as BC,mkdir as XC,readFile as qg,readdir as Hg,rm as JC,stat as Bg}from"node:fs/promises";import{basename as GC,dirname as KC,isAbsolute as Xg,join as rr,relative as VC,resolve as xd}from"node:path";function Rd(t){if(!t)return;let e=new Date(t);return Number.isNaN(e.getTime())?void 0:e}function QC(t){return typeof t=="number"?new Date(t):Rd(t)??new Date(0)}function Jg(t){return typeof t=="string"?t.trim():Array.isArray(t)?t.map(e=>e&&typeof e=="object"&&"text"in e&&typeof e.text=="string"?e.text:"").filter(Boolean).join(`
|
|
1577
1577
|
`).trim():""}function Gg(t){if(t!==void 0)try{return JSON.stringify(t)}catch{return String(t)}}function e$(t){return t&&typeof t=="object"&&"output"in t&&typeof t.output=="string"?t.output:Gg(t)??""}function t$(t){let e=n$(t),n=new Set;for(let r of t){if(r.role!=="tool_use"||r.toolName!=="Bash"||r.toolInputData?.run_in_background!==!0||r.toolCallId===void 0)continue;let s=e.get(r.toolCallId);if(s===void 0)continue;let i=s.content.match(/(?:^|\n)task_id:\s*([^\s]+)/)?.[1];i!==void 0&&(n.add(i),r.backgroundTaskId=i,s.backgroundTaskId=i)}for(let r of t){if(r.role!=="tool_use"||r.toolName!=="TaskOutput"&&r.toolName!=="TaskStop"||r.toolCallId===void 0)continue;let s=r.toolInputData?.task_id;if(typeof s!="string"||!n.has(s))continue;r.backgroundTaskId=s;let i=e.get(r.toolCallId);i!==void 0&&(i.backgroundTaskId=s)}}function n$(t){let e=new Map;for(let n of t)n.role==="tool_result"&&n.toolCallId!==void 0&&e.set(n.toolCallId,n);return e}var YC,zC,ZC,Ro,Kg=E(()=>{"use strict";At();YC="1.4",zC="1.5",ZC=new Set([YC,zC]),Ro=class{name="kimi";homeDir;sessionsDir;constructor(e){this.homeDir=xd(e?.kimiHome??process.env.KIMI_CODE_HOME??rr(ge,".kimi-code")),this.sessionsDir=rr(this.homeDir,"sessions")}async discoverSessions(){let e=[];for(let n of await this.sessionFiles())try{let r=await this.summary(n);r&&e.push(r)}catch{}return e.sort((n,r)=>r.modifiedAt.getTime()-n.modifiedAt.getTime())}async loadSession(e){let n=await this.findSession(e);if(!n)return null;let r=await this.summary(n);if(!r)return null;let s=await this.parseWire(n.wirePath);return{...r,messages:s.messages}}async resolveSessionPath(e){return(await this.findSession(e))?.wirePath??null}async deleteSession(e){let n=await this.findSession(e);return n?(await JC(n.sessionDir,{recursive:!0,force:!0}),await XC(KC(this.indexPath()),{recursive:!0,mode:448}),await BC(this.indexPath(),`${JSON.stringify({sessionId:n.sessionId,deleted:!0})}
|
|
1578
|
-
`,"utf-8"),!0):!1}getWatchPaths(){return[{directory:this.sessionsDir,filePattern:/wire\.jsonl$/}]}indexPath(){return rr(this.homeDir,"session_index.jsonl")}async sessionFiles(){let e=await this.readIndex(),n=new Map;for(let s of e.values())this.validSessionDir(s.sessionDir,s.sessionId)&&n.set(s.sessionId,this.filesFor(s.sessionId,s.sessionDir,s.workDir));let r;try{r=await Hg(this.sessionsDir,{withFileTypes:!0})}catch{return[...n.values()]}for(let s of r){if(!s.isDirectory())continue;let i=rr(this.sessionsDir,s.name),o;try{o=await Hg(i,{withFileTypes:!0})}catch{continue}for(let a of o){if(!a.isDirectory()||n.has(a.name))continue;let l=rr(i,a.name);n.set(a.name,this.filesFor(a.name,l))}}return[...n.values()]}async readIndex(){let e;try{e=await qg(this.indexPath(),"utf-8")}catch{return new Map}let n=new Map;for(let r of e.split(/\r?\n/))if(r.trim())try{let s=JSON.parse(r);if(typeof s.sessionId!="string")continue;s.deleted===!0?n.delete(s.sessionId):typeof s.sessionDir=="string"&&typeof s.workDir=="string"&&n.set(s.sessionId,{sessionId:s.sessionId,sessionDir:xd(s.sessionDir),workDir:s.workDir})}catch{}return n}filesFor(e,n,r){return{sessionId:e,sessionDir:n,statePath:rr(n,"state.json"),wirePath:rr(n,"agents","main","wire.jsonl"),indexedWorkDir:r}}validSessionDir(e,n){if(!Xg(e)||GC(e)!==n)return!1;let r=VC(this.sessionsDir,xd(e));return r!==""&&r!==".."&&!r.startsWith(`..${process.platform==="win32"?"\\":"/"}`)&&!Xg(r)}async findSession(e){let n=await this.sessionFiles(),r=n.find(i=>i.sessionId===e);if(r)return r;let s=n.filter(i=>i.sessionId.startsWith(e));return s.length===1?s[0]:null}async readState(e){try{let n=JSON.parse(await qg(e,"utf-8"));return n!==null&&typeof n=="object"&&!Array.isArray(n)?n:null}catch{return null}}async summary(e){let n=await this.readState(e.statePath);if(!n)return null;let r;try{r=await Bg(e.wirePath)}catch{return null}let s=await Bg(e.statePath).catch(()=>r),i=await this.parseWire(e.wirePath),o=Rd(n.createdAt)??s.birthtime,a=Rd(n.updatedAt)??(s.mtime>r.mtime?s.mtime:r.mtime);return{provider:"kimi",sessionId:e.sessionId,slug:n.title,cwd:n.workDir??e.indexedWorkDir??"(unknown)",createdAt:o,modifiedAt:a,model:i.model,startCommand:"kimi",firstUserMessage:i.firstUserMessage,lastUserMessage:i.lastUserMessage??(n.lastPrompt?B(n.lastPrompt.trim(),80):void 0),messageCount:i.messageCount,filePath:e.wirePath,filePaths:[e.statePath,e.wirePath],totalInputTokens:i.totalInputTokens,totalCachedInputTokens:i.totalCachedInputTokens,totalCacheWriteInputTokens:i.totalCacheWriteInputTokens,totalOutputTokens:i.totalOutputTokens,lastInputTokens:i.lastInputTokens,lastTokenUsage:i.lastTokenUsage}}async parseWire(e){let n=[],r=!0,s,i,o,a=0,l=0,c=0,u=0,d=!1,f=0,m,p;for await(let h of De(e)){let _=QC(h.time??h.created_at);if(r&&(r=!1,h.type==="metadata"&&!ZC.has(h.protocol_version))){let y=`Kimi transcript wire protocol version ${JSON.stringify(h.protocol_version)} is not supported by this lmctl version.`;return{messages:[{role:"system",timestamp:_,content:y}],messageCount:1,firstUserMessage:y,lastUserMessage:y}}if((h.type==="config.update"||h.type==="profile.bind")&&h.modelAlias&&(s=h.modelAlias),h.type==="usage.record"){h.model&&(s=h.model),d||=h.usage!==void 0;let y=h.usage?.inputOther??0,w=h.usage?.inputCacheRead??0,v=h.usage?.inputCacheCreation??0,N=h.usage?.output??0;a+=y,l+=w,c+=v,u+=N,h.usageScope==="turn"&&(m=y+w+v,p={inputTokens:y,cachedInputTokens:w,cacheWriteInputTokens:v,outputTokens:N,totalTokens:m+N});continue}if(h.type==="turn.prompt"&&h.origin?.kind==="user"){let y=Jg(h.input);y&&(i??=B(y,80),o=B(y,80),n.push({role:"user",timestamp:_,content:y}),f++);continue}if(h.type==="turn.steer"){let y=Jg(h.input);y&&(n.push({role:"system",timestamp:_,content:y}),f++);continue}if(h.type!=="context.append_loop_event"||!h.event)continue;let g=h.event;g.type==="content.part"&&g.part?.type==="text"&&g.part.text?(n.push({role:"assistant",timestamp:_,content:g.part.text,model:s}),f++):g.type==="content.part"&&g.part?.type==="think"&&g.part.think?n.push({role:"thinking",timestamp:_,content:g.part.think,model:s}):g.type==="tool.call"?n.push({role:"tool_use",timestamp:_,content:g.name??"tool",toolName:g.name,toolInput:Gg(g.args),toolInputData:_t(g.args),toolCallId:g.toolCallId,model:s}):g.type==="tool.result"&&n.push({role:"tool_result",timestamp:_,content:e$(g.result),toolCallId:g.toolCallId,model:s})}return t$(n),{messages:n,messageCount:f,model:s,firstUserMessage:i,lastUserMessage:o,totalInputTokens:d?a:void 0,totalCachedInputTokens:d?l:void 0,totalCacheWriteInputTokens:d?c:void 0,totalOutputTokens:d?u:void 0,lastInputTokens:m,lastTokenUsage:p}}}});function Ld(t){return new Od(t)}var Od,Cd=E(()=>{"use strict";Kg();ht();cn();it();Od=class extends Te{constructor(e){super({provider:new Ro(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append",leaderSetupHint:"Kimi supports skills through ~/.kimi-code/skills and --skills-dir."},binary:"kimi",seedArgs:["-p",ce,"--output-format","stream-json"],resumeTemplate:"kimi --session {{session_id}} --auto",startTemplate:"kimi --auto",transport:(n,r)=>Gt(n,{...r,acpTool:"kimi"})})}seedArgsFor(e){let n=[];return e?.model&&n.push("--model",e.model),n.push("-p",e?.prompt??ce,"--output-format","stream-json"),n}}});import{spawn as r$}from"node:child_process";import{mkdirSync as s$}from"node:fs";function Md(t){return new $d(t)}async function i$(t,e){let n=Date.now(),r=Vg({prompt:t,sessionId:e.sessionId,model:e.model,effort:e.effort,formatJson:!0,permissionMode:e.permissionMode??"yolo"});et("lmplayer",r,e.permissionMode??"yolo");let s=await zg(e.binary,r,{cwd:e.cwd,env:Ke(e.env,e.cwd,e.sessionId),signal:e.signal,onText:i=>{e.onProgress?.({kind:"text",summary:i.slice(0,120)}),e.onDelta?.(i)}});if(s.code!==0&&s.code!==null)throw new Error(Yg(s));return{text:s.text.trim(),sessionId:s.sessionId??e.sessionId,durationMs:Date.now()-n}}function Vg(t){let e=["run"];return t.model&&e.push("--model",t.model),t.sessionId&&e.push("--session",t.sessionId),t.formatJson&&e.push("--format","json"),t.effort&&e.push("--effort",t.effort),e.push(...An("lmplayer",t.permissionMode)??[]),e.push("--",t.prompt),e}function Yg(t){if(t.error)return t.error;let e=_o(t.stderr).trim();return e?e.slice(0,500):`exit code ${t.code}`}function zg(t,e,n){return new Promise((r,s)=>{let i;try{i=r$(t,e,{cwd:n.cwd,env:n.env,stdio:["ignore","pipe","pipe"]})}catch(
|
|
1579
|
-
`);for(;
|
|
1580
|
-
`)}}),i.stderr?.on("data",
|
|
1578
|
+
`,"utf-8"),!0):!1}getWatchPaths(){return[{directory:this.sessionsDir,filePattern:/wire\.jsonl$/}]}indexPath(){return rr(this.homeDir,"session_index.jsonl")}async sessionFiles(){let e=await this.readIndex(),n=new Map;for(let s of e.values())this.validSessionDir(s.sessionDir,s.sessionId)&&n.set(s.sessionId,this.filesFor(s.sessionId,s.sessionDir,s.workDir));let r;try{r=await Hg(this.sessionsDir,{withFileTypes:!0})}catch{return[...n.values()]}for(let s of r){if(!s.isDirectory())continue;let i=rr(this.sessionsDir,s.name),o;try{o=await Hg(i,{withFileTypes:!0})}catch{continue}for(let a of o){if(!a.isDirectory()||n.has(a.name))continue;let l=rr(i,a.name);n.set(a.name,this.filesFor(a.name,l))}}return[...n.values()]}async readIndex(){let e;try{e=await qg(this.indexPath(),"utf-8")}catch{return new Map}let n=new Map;for(let r of e.split(/\r?\n/))if(r.trim())try{let s=JSON.parse(r);if(typeof s.sessionId!="string")continue;s.deleted===!0?n.delete(s.sessionId):typeof s.sessionDir=="string"&&typeof s.workDir=="string"&&n.set(s.sessionId,{sessionId:s.sessionId,sessionDir:xd(s.sessionDir),workDir:s.workDir})}catch{}return n}filesFor(e,n,r){return{sessionId:e,sessionDir:n,statePath:rr(n,"state.json"),wirePath:rr(n,"agents","main","wire.jsonl"),indexedWorkDir:r}}validSessionDir(e,n){if(!Xg(e)||GC(e)!==n)return!1;let r=VC(this.sessionsDir,xd(e));return r!==""&&r!==".."&&!r.startsWith(`..${process.platform==="win32"?"\\":"/"}`)&&!Xg(r)}async findSession(e){let n=await this.sessionFiles(),r=n.find(i=>i.sessionId===e);if(r)return r;let s=n.filter(i=>i.sessionId.startsWith(e));return s.length===1?s[0]:null}async readState(e){try{let n=JSON.parse(await qg(e,"utf-8"));return n!==null&&typeof n=="object"&&!Array.isArray(n)?n:null}catch{return null}}async summary(e){let n=await this.readState(e.statePath);if(!n)return null;let r;try{r=await Bg(e.wirePath)}catch{return null}let s=await Bg(e.statePath).catch(()=>r),i=await this.parseWire(e.wirePath),o=Rd(n.createdAt)??s.birthtime,a=Rd(n.updatedAt)??(s.mtime>r.mtime?s.mtime:r.mtime);return{provider:"kimi",sessionId:e.sessionId,slug:n.title,cwd:n.workDir??e.indexedWorkDir??"(unknown)",createdAt:o,modifiedAt:a,model:i.model,startCommand:"kimi",firstUserMessage:i.firstUserMessage,lastUserMessage:i.lastUserMessage??(n.lastPrompt?B(n.lastPrompt.trim(),80):void 0),messageCount:i.messageCount,filePath:e.wirePath,filePaths:[e.statePath,e.wirePath],totalInputTokens:i.totalInputTokens,totalCachedInputTokens:i.totalCachedInputTokens,totalCacheWriteInputTokens:i.totalCacheWriteInputTokens,totalOutputTokens:i.totalOutputTokens,lastInputTokens:i.lastInputTokens,lastTokenUsage:i.lastTokenUsage}}async parseWire(e){let n=[],r=!0,s,i,o,a=0,l=0,c=0,u=0,d=!1,f=0,m,p;for await(let h of De(e)){let _=QC(h.time??h.created_at);if(r&&(r=!1,h.type==="metadata"&&!ZC.has(h.protocol_version))){let y=`Kimi transcript wire protocol version ${JSON.stringify(h.protocol_version)} is not supported by this lmctl version.`;return{messages:[{role:"system",timestamp:_,content:y}],messageCount:1,firstUserMessage:y,lastUserMessage:y}}if((h.type==="config.update"||h.type==="profile.bind")&&h.modelAlias&&(s=h.modelAlias),h.type==="usage.record"){h.model&&(s=h.model),d||=h.usage!==void 0;let y=h.usage?.inputOther??0,w=h.usage?.inputCacheRead??0,v=h.usage?.inputCacheCreation??0,N=h.usage?.output??0;a+=y,l+=w,c+=v,u+=N,h.usageScope==="turn"&&(m=y+w+v,p={inputTokens:y,cachedInputTokens:w,cacheWriteInputTokens:v,outputTokens:N,totalTokens:m+N});continue}if(h.type==="turn.prompt"&&h.origin?.kind==="user"){let y=Jg(h.input);y&&(i??=B(y,80),o=B(y,80),n.push({role:"user",timestamp:_,content:y}),f++);continue}if(h.type==="turn.steer"){let y=Jg(h.input);y&&(n.push({role:"system",timestamp:_,content:y}),f++);continue}if(h.type!=="context.append_loop_event"||!h.event)continue;let g=h.event;g.type==="content.part"&&g.part?.type==="text"&&g.part.text?(n.push({role:"assistant",timestamp:_,content:g.part.text,model:s}),f++):g.type==="content.part"&&g.part?.type==="think"&&g.part.think?n.push({role:"thinking",timestamp:_,content:g.part.think,model:s}):g.type==="tool.call"?n.push({role:"tool_use",timestamp:_,content:g.name??"tool",toolName:g.name,toolInput:Gg(g.args),toolInputData:_t(g.args),toolCallId:g.toolCallId,model:s}):g.type==="tool.result"&&n.push({role:"tool_result",timestamp:_,content:e$(g.result),toolCallId:g.toolCallId,model:s})}return t$(n),{messages:n,messageCount:f,model:s,firstUserMessage:i,lastUserMessage:o,totalInputTokens:d?a:void 0,totalCachedInputTokens:d?l:void 0,totalCacheWriteInputTokens:d?c:void 0,totalOutputTokens:d?u:void 0,lastInputTokens:m,lastTokenUsage:p}}}});function Ld(t){return new Od(t)}var Od,Cd=E(()=>{"use strict";Kg();ht();cn();it();Od=class extends Te{constructor(e){super({provider:new Ro(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append",leaderSetupHint:"Kimi supports skills through ~/.kimi-code/skills and --skills-dir."},binary:"kimi",seedArgs:["-p",ce,"--output-format","stream-json"],resumeTemplate:"kimi --session {{session_id}} --auto",startTemplate:"kimi --auto",transport:(n,r)=>Gt(n,{...r,acpTool:"kimi"})})}seedArgsFor(e){let n=[];return e?.model&&n.push("--model",e.model),n.push("-p",e?.prompt??ce,"--output-format","stream-json"),n}}});import{spawn as r$}from"node:child_process";import{mkdirSync as s$}from"node:fs";function Md(t){return new $d(t)}async function i$(t,e){let n=Date.now(),r=Vg({prompt:t,sessionId:e.sessionId,model:e.model,effort:e.effort,formatJson:!0,permissionMode:e.permissionMode??"yolo"});et("lmplayer",r,e.permissionMode??"yolo");let s=await zg(e.binary,r,{cwd:e.cwd,env:Ke(e.env,e.cwd,e.sessionId),signal:e.signal,onText:i=>{e.onProgress?.({kind:"text",summary:i.slice(0,120)}),e.onDelta?.(i)}});if(s.code!==0&&s.code!==null)throw new Error(Yg(s));return{text:s.text.trim(),sessionId:s.sessionId??e.sessionId,durationMs:Date.now()-n}}function Vg(t){let e=["run"];return t.model&&e.push("--model",t.model),t.sessionId&&e.push("--session",t.sessionId),t.formatJson&&e.push("--format","json"),t.effort&&e.push("--effort",t.effort),e.push(...An("lmplayer",t.permissionMode)??[]),e.push("--",t.prompt),e}function Yg(t){if(t.error)return t.error;let e=_o(t.stderr).trim();return e?e.slice(0,500):`exit code ${t.code}`}function zg(t,e,n){return new Promise((r,s)=>{let i;try{i=r$(t,e,{cwd:n.cwd,env:n.env,stdio:["ignore","pipe","pipe"]})}catch(h){s(h);return}let o="",a="",l="",c,u,d,f=[],m=!1,p=h=>{let _=h.trim();if(!_)return;let g;try{g=JSON.parse(_)}catch{f.push(h),n.onText?.(h);return}if(!Mr(g))return;let y=Oo(g,!1);c===void 0&&y!==void 0&&(c=y),u=Oo(g,!0)??u;let w=o$(g);w!==void 0&&(d=w);let v=Zg(g);v&&(f.push(v),n.onText?.(v))};i.stdout?.on("data",h=>{let _=h.toString("utf8");o+=_,l+=_;let g=l.indexOf(`
|
|
1579
|
+
`);for(;g>=0;){let y=l.slice(0,g);l=l.slice(g+1),p(y),g=l.indexOf(`
|
|
1580
|
+
`)}}),i.stderr?.on("data",h=>{a+=h.toString("utf8")}),n.signal&&(n.signal.aborted?i.kill():n.signal.addEventListener("abort",()=>i.kill(),{once:!0})),i.on("exit",h=>{m||(m=!0,l.length>0&&p(l),r({code:h,stdout:o,stderr:a,sessionId:c??u,text:f.join(""),error:d}))}),i.on("error",h=>{m||(m=!0,s(h))})})}function o$(t){let e=t.error;if(typeof e=="string"&&e.length>0)return e;if(Mr(e)){let n=e.data;if(Mr(n)&&typeof n.message=="string"&&n.message.length>0)return typeof e.name=="string"?`${e.name}: ${n.message}`:n.message;if(typeof e.message=="string"&&e.message.length>0)return e.message}}function Zg(t){for(let e of["text","content","delta","output","message"]){let n=t[e];if(typeof n=="string")return n}for(let e of["data","event","payload","part"]){let n=t[e];if(Mr(n)){let r=Zg(n);if(r)return r}}}function Oo(t,e){for(let r of["sessionID","sessionId","session_id"]){let s=t[r];if(typeof s=="string"&&s.length>0)return s}let n=t.session;if(typeof n=="string"&&n.length>0)return n;if(Mr(n)){let r=Oo(n,e);if(r!==void 0)return r}if(e){let r=t.id;if(typeof r=="string"&&r.length>0)return r}for(let r of["data","event","payload","part"]){let s=t[r];if(Mr(s)){let i=Oo(s,e);if(i!==void 0)return i}}}function Mr(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var $d,Dd=E(()=>{"use strict";kd();ht();it();er();xt();Wc();$d=class extends Te{constructor(e){super({provider:new $r({providerName:"lmplayer",startCommand:"lmplayer",dbPath:e?.lmplayerDbPath}),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!0},injection:{leaderMode:"none"},binary:"lmplayer",seedArgs:["run","--format","json","--dangerously-skip-permissions",ce],resumeTemplate:"lmplayer tui --session {{session_id}}",startTemplate:"lmplayer run --dangerously-skip-permissions",transport:i$})}seedArgsFor(e){return Vg({prompt:e?.prompt??ce,model:e?.model,effort:e?.effort,formatJson:!0,permissionMode:"yolo"})}async seed(e,n){s$(e,{recursive:!0});let r=this.seedArgsFor(n);et("lmplayer",r);try{let s=await zg(this.binary,r,{cwd:e,env:Nn(void 0,e)});return s.code!==0&&s.code!==null?{success:!1,error:Yg(s)}:s.sessionId?{success:!0,sessionId:s.sessionId}:{success:!1,error:"lmplayer seed failed; provider did not report a sessionID"}}catch(s){return{success:!1,error:s instanceof Error?s.message:String(s)}}}manualSeedHint(e){return{launchCommand:`cd ${e} && lmplayer run --format json --dangerously-skip-permissions "${ce}"`,postLaunchNote:"Copy the sessionID reported by lmplayer into this member's sessionid= field.",lsCommand:`lmctl ls --provider lmplayer --sessiondir ${e}`}}}});import{readdir as Lo,readFile as a$,rm as l$}from"node:fs/promises";import{basename as Qg,join as On}from"node:path";function c$(){return{observed:!1,totalInputTokens:0,totalCachedInputTokens:0,totalOutputTokens:0,totalReasoningOutputTokens:0}}function Xs(t){let e=Number(t??0);return Number.isFinite(e)?Math.max(0,Math.round(e)):0}function d$(t,e){if(!e)return;t.observed=!0;let n=Xs(e.promptTokenCount),r=Xs(e.cachedContentTokenCount),s=Xs(e.candidatesTokenCount),i=Xs(e.thoughtsTokenCount);t.totalInputTokens+=n,t.totalCachedInputTokens+=r,t.totalOutputTokens+=s,t.totalReasoningOutputTokens+=i,t.lastInputTokens=n,t.lastTokenUsage={inputTokens:Math.max(n-r,0),cachedInputTokens:r,outputTokens:s,reasoningOutputTokens:i,totalTokens:Xs(e.totalTokenCount)||n+s}}function u$(t){return{totalInputTokens:t.observed?t.totalInputTokens:void 0,totalCachedInputTokens:t.observed?t.totalCachedInputTokens:void 0,totalOutputTokens:t.observed?t.totalOutputTokens:void 0,totalReasoningOutputTokens:t.observed?t.totalReasoningOutputTokens:void 0,lastInputTokens:t.lastInputTokens,lastTokenUsage:t.lastTokenUsage}}function ey(t){return t.type==="user"||t.message?.role==="user"}function ty(t){return t.type==="assistant"||t.message?.role==="assistant"||t.message?.role==="model"}function ny(t){let e=t.message;return e?typeof e.content=="string"?e.content:Array.isArray(e.content)?e.content.filter(n=>n.type==="text").map(n=>n.text||"").join(`
|
|
1581
1581
|
`):Array.isArray(e.parts)?e.parts.filter(n=>!n.thought&&n.type!=="thinking").map(n=>n.text||"").join(`
|
|
1582
1582
|
`):"":""}function ry(t){return t.model||t.message?.model}function f$(t){let e=t.message?.content;return typeof e=="string"?e.length>0?1:0:iy(t).filter(n=>!n.thought&&n.type!=="thinking"&&typeof n.text=="string"&&n.text.length>0).length}function Js(t,e=!1){if(t!==void 0){if(typeof t=="string")return t;try{return JSON.stringify(t,null,e?2:void 0)}catch{return String(t)}}}function m$(t){if(t!==null&&typeof t=="object"&&!Array.isArray(t)){let e=t;return Js(e.output??e.error??t)}return Js(t)}function iy(t){return Array.isArray(t.message?.content)?t.message.content:t.message?.parts??[]}function sy(t,e,n){let r=t.name||"tool";return{role:"tool_use",timestamp:e,content:r,toolName:r,toolInput:Js(t.args,!0),toolInputData:_t(t.args),toolCallId:t.id,model:n}}var Co,oy=E(()=>{"use strict";At();Co=class{name="qwen";baseDir;constructor(e){this.baseDir=e?.qwenDir||On(ge,".qwen")}async discoverSessions(){let e=On(this.baseDir,"projects"),n;try{n=await Lo(e)}catch{return[]}let r=[];for(let s of n){let i=On(e,s,"chats"),o;try{o=await Lo(i)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=a.replace(/\.jsonl$/,""),c=On(i,a);try{let u=await this.extractSummary(c,l);u&&r.push(u)}catch{}}}return r}async extractSummary(e,n){let r=!1,s=await Le(e),i="(unknown)",o,a,l,c,u=0;for await(let d of De(e)){if(r=!0,d.cwd&&(i=d.cwd,d.version&&(a=d.version)),d.type==="system"&&d.cwd&&(i=d.cwd,d.version&&(a=d.version),d.model&&(o=d.model)),ey(d)){let f=ny(d).trim();f&&(l||(l=B(f,80)),c=B(f,80),u++)}if(ty(d)){let f=ry(d);f&&(o=f),u+=f$(d)}}return r?{provider:"qwen",sessionId:n,cwd:i,createdAt:s.createdAt,modifiedAt:s.modifiedAt,model:o,cliVersion:a,startCommand:"qwen",firstUserMessage:l,lastUserMessage:c,messageCount:u,filePath:e}:null}async loadSession(e){let n=await this.resolveSessionPath(e);if(!n)return null;let r=Qg(n,".jsonl");return this.loadFromFile(n,r)}async loadFromFile(e,n){let r=await Le(e),s="(unknown)",i,o,a,l,c,u,d=[],f=c$();for await(let m of De(e)){if(d$(f,m.usageMetadata),m.cwd&&(s=m.cwd,m.version&&(o=m.version),m.gitBranch&&(a=m.gitBranch)),m.type==="system"&&m.cwd&&(s=m.cwd,m.version&&(o=m.version),m.model&&(i=m.model),m.gitBranch&&(a=m.gitBranch)),!m.message)continue;let p=m.message,h=m.timestamp?new Date(m.timestamp):r.modifiedAt;if(m.type==="tool_result"){let _=iy(m).filter(g=>g.functionResponse!==void 0);_.length===0&&m.toolCallResult?.callId&&d.push({role:"tool_result",timestamp:h,content:Js(m.toolCallResult.resultDisplay??m.toolCallResult.error??m.toolCallResult.status)??"tool result",toolCallId:m.toolCallResult.callId});for(let g of _){let y=g.functionResponse,w=m$(y.response),v=Js(m.toolCallResult?.resultDisplay);d.push({role:"tool_result",timestamp:h,content:v??w??m.toolCallResult?.status??"tool result",toolName:y.name,toolCallId:m.toolCallResult?.callId??y.id,...w!==void 0?{toolDetailedContent:w}:{}})}}else if(ey(m)){let _=ny(m);_.trim()&&(c||(c=B(_.trim(),80)),u=B(_.trim(),80)),d.push({role:"user",timestamp:h,content:_})}else if(ty(m)){let _=ry(m);if(_&&(i=_),Array.isArray(p.content))for(let g of p.content)g.type==="text"&&g.text?d.push({role:"assistant",timestamp:h,content:g.text,model:_}):g.type==="thinking"&&g.thinking?d.push({role:"thinking",timestamp:h,content:g.thinking}):g.functionCall&&d.push(sy(g.functionCall,h,_));else if(typeof p.content=="string")d.push({role:"assistant",timestamp:h,content:p.content,model:_});else if(Array.isArray(p.parts))for(let g of p.parts)if(g.thought||g.type==="thinking"){let y=g.thinking||g.text;y&&d.push({role:"thinking",timestamp:h,content:y})}else g.functionCall?d.push(sy(g.functionCall,h,_)):g.text&&d.push({role:"assistant",timestamp:h,content:g.text,model:_})}}return{provider:"qwen",sessionId:n,slug:l,cwd:s,createdAt:r.createdAt,modifiedAt:r.modifiedAt,model:i,cliVersion:o,gitBranch:a,startCommand:"qwen",firstUserMessage:c,lastUserMessage:u,messageCount:d.filter(m=>m.role==="user"||m.role==="assistant").length,filePath:e,...u$(f),messages:d}}async resolveSessionPath(e){let n=On(this.baseDir,"projects");try{let r=await Lo(n),s=[];for(let i of r){let o=On(n,i,"chats",`${e}.jsonl`);try{return await a$(o,{flag:"r"}),o}catch{continue}}for(let i of r){let o=On(n,i,"chats"),a;try{a=await Lo(o)}catch{continue}for(let l of a){if(!l.endsWith(".jsonl"))continue;Qg(l,".jsonl").startsWith(e)&&s.push(On(o,l))}}if(s.length===1)return s[0]}catch{}return null}async deleteSession(e){let n=await this.resolveSessionPath(e);if(!n)return!1;try{return await l$(n),!0}catch{return!1}}}});function Pd(){return new jd}var jd,Fd=E(()=>{"use strict";oy();ht();cn();it();jd=class extends Te{constructor(){super({provider:new Co,capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"qwen",seedArgs:["-p",ce,"--approval-mode","yolo"],resumeTemplate:"qwen --resume {{session_id}}",startTemplate:"qwen",transport:So})}seedArgsFor(e){let n=super.seedArgsFor(e);return e?.model?[...n,"--model",e.model]:n}}});import{readdir as ay,readFile as ly,rm as cy,stat as dy}from"node:fs/promises";import{basename as Ud,join as Kt}from"node:path";import{fileURLToPath as p$}from"node:url";async function _$(t){let e=await Promise.all(t.map(n=>Le(n)));return{createdAt:new Date(Math.min(...e.map(n=>n.createdAt.getTime()))),modifiedAt:new Date(Math.max(...e.map(n=>n.modifiedAt.getTime())))}}function h$(t,e){if(!t)return e;let n=new Date(t);return Number.isNaN(n.getTime())?e:n}function uy(t){return t.type==="USER_INPUT"}function fy(t){return t.source==="MODEL"&&t.type==="PLANNER_RESPONSE"}function g$(t){return t.source==="MODEL"&&t.type!=="PLANNER_RESPONSE"}function my(t){if(!t)return"";let e=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(t);return e?e[1]:t}function py(t){if(!t)return;let e=/Model Selection` from [^\n]+? to ([^\n]+)/.exec(t);if(e)return e[1].replace(/\. No need\b[\s\S]*$/,"").replace(/\. If reporting\b[\s\S]*$/,"").replace(/\.\s*$/,"").trim()}function y$(t){if(t===void 0)return"";try{return JSON.stringify(t)}catch{return String(t)}}async function w$(t){for await(let e of De(t)){let n=e.tool_calls?.map(s=>s.args)??[];for(let s of n){let i=E$(s);if(i)return i}let r=T$(e.content);if(r)return r}return null}function E$(t){if(!t||typeof t!="object"||Array.isArray(t))return null;let e=t,n=e.Cwd??e.cwd??e.DirectoryPath;return typeof n!="string"?null:n.replace(/^"|"$/g,"")}function T$(t){return t?/"Cwd":"([^"]+)"/.exec(t)?.[1]??null:null}function v$(t,e){if(t.status!=="RUNNING"||!t.content)return;let n=/task id:\s*([^/\s]+)\/(task-(\d+))\b/.exec(t.content);if(!(!n||n[1]!==e)&&!(t.step_index===void 0||Number(n[3])!==t.step_index))return n[2]}function S$(t,e){let n=new Set;for(let r of e){let s=b$(t,n,r);if(!s)continue;n.add(s);let i=r.event.step_index===void 0?void 0:`agy-step-${r.event.step_index}`;s.message.toolCallId=i,s.message.backgroundTaskId=r.message.backgroundTaskId,r.message.toolName=s.name,r.message.toolCallId=i}}function b$(t,e,n){let r=n.message.backgroundTaskId===void 0?void 0:A$(n.event.content);if(r!==void 0)return _y(t.filter(i=>!e.has(i)&&x$(i)===r),n.event.step_index);let s=N$(n.event);if(s!==void 0)return _y(t.filter(i=>!e.has(i)&&k$(i.name,n.event.type)&&gy(I$(i))===s),n.event.step_index)}function _y(t,e){if(t.length===0)return;if(t.length===1)return t[0];if(e===void 0)return;let n=t.map(r=>({call:r,distance:r.stepIndex===void 0?Number.POSITIVE_INFINITY:Math.abs(e-r.stepIndex)})).sort((r,s)=>r.distance-s.distance);return n[0].distance<n[1].distance?n[0].call:void 0}function k$(t,e){return e==="VIEW_FILE"?t==="view_file":e!=="CODE_ACTION"?!1:t==="write_to_file"||t==="replace_file_content"||t==="multi_replace_file_content"}function I$(t){let e=t.name==="view_file"?t.input?.AbsolutePath:t.input?.TargetFile;return typeof e=="string"?e:void 0}function N$(t){if(!t.content)return;let e;return t.type==="VIEW_FILE"?e=/File Path:\s*`?([^`\n]+)`?/.exec(t.content)?.[1]:t.type==="CODE_ACTION"&&(e=/Created file\s+(.+?)\s+with requested content/.exec(t.content)?.[1]??/changes were made by .*? tool to:\s*(.+?)\.\s*(?:If relevant|$)/s.exec(t.content)?.[1]),gy(e)}function gy(t){if(!t)return;let e=t.trim().replace(/^`|`$/g,"");if(!e.startsWith("file://"))return e;try{return p$(e)}catch{return}}function A$(t){if(t)return/Task Description:\s*([^\n]+)/.exec(t)?.[1]?.trim()}function x$(t){if(t.name==="run_command"){let e=t.input?.CommandLine;return typeof e=="string"?e:void 0}if(t.name==="schedule"){let e=t.input?.DurationSeconds,n=t.input?.Prompt;return typeof e!="string"&&typeof e!="number"||typeof n!="string"?void 0:`Timer: ${e}s, Prompt: ${n}`}}function hy(t){if(t.endsWith(".db"))return Ud(t,".db");let e="/brain/",n=t.indexOf(e);return n===-1?null:t.slice(n+e.length).split("/")[0]||null}var $o,yy=E(()=>{"use strict";At();$o=class{name="agy";baseDir;constructor(e={}){this.baseDir=e.agyDir||Kt(ge,".gemini","antigravity-cli")}getWatchPaths(){return[{directory:Kt(this.baseDir,"conversations"),filePattern:/\.db$/}]}async discoverSessions(){let e=Kt(this.baseDir,"conversations"),n;try{n=await ay(e)}catch{return[]}let r=[];for(let s of n){if(!s.endsWith(".db"))continue;let i=Ud(s,".db");try{let o=await this.extractSummary(i);o&&r.push(o)}catch{}}return r}conversationPath(e){return Kt(this.baseDir,"conversations",`${e}.db`)}transcriptPath(e,n){return Kt(this.baseDir,"brain",e,".system_generated","logs",n?"transcript_full.jsonl":"transcript.jsonl")}async existingTranscriptPath(e){for(let n of[this.transcriptPath(e,!0),this.transcriptPath(e,!1)])try{return await dy(n),n}catch{}return null}async extractSummary(e){let n=this.conversationPath(e),r=await this.existingTranscriptPath(e),s=r??n,i=await _$([n,r].filter(Boolean)),o=await this.resolveCwd(e,r),a,l,c,u=0;if(r)for await(let d of De(r)){let f=py(d.content);if(f&&(a=f),uy(d)){let m=my(d.content).trim();m&&(l||(l=B(m,80)),c=B(m,80)),u++}else fy(d)&&d.content&&u++}return{provider:"agy",sessionId:e,cwd:o,createdAt:i.createdAt,modifiedAt:i.modifiedAt,model:a,startCommand:"agy",firstUserMessage:l,lastUserMessage:c,messageCount:u,filePath:s,filePaths:r?[n,r]:[n]}}async loadSession(e){let n=await this.resolveSessionPath(e);if(!n)return null;let r=hy(n);if(!r)return null;let s=await this.extractSummary(r);if(!s)return null;let i=await this.existingTranscriptPath(r),o=[],a=s.model,l=s.firstUserMessage,c=s.lastUserMessage,u=[],d=[];if(i)for await(let f of De(i)){let m=h$(f.created_at,s.modifiedAt),p=py(f.content);if(p&&(a=p),uy(f)){let h=my(f.content),_=h.trim();_&&(l||(l=B(_,80)),c=B(_,80)),o.push({role:"user",timestamp:m,content:h});continue}if(Array.isArray(f.tool_calls))for(let h of f.tool_calls){let _=h.name||"tool",g=y$(h.args),y=_t(h.args),w={role:"tool_use",timestamp:m,content:g,toolName:_,toolInput:g,toolInputData:y};o.push(w),u.push({name:_,stepIndex:f.step_index,input:y,message:w})}if(fy(f)&&f.content)o.push({role:"assistant",timestamp:m,content:f.content,model:a});else if(g$(f)&&f.content){let h=v$(f,r),_=h===void 0?null:await this.readTaskLog(r,h),g={role:"tool_result",timestamp:_?.modifiedAt??m,content:f.content,toolName:f.type?.toLowerCase(),backgroundTaskId:h,..._===null?{}:{toolDetailedContent:_.content}};o.push(g),d.push({event:f,message:g})}f.thinking&&o.push({role:"thinking",timestamp:m,content:f.thinking})}return S$(u,d),{...s,model:a,firstUserMessage:l,lastUserMessage:c,messageCount:o.filter(f=>f.role==="user"||f.role==="assistant").length,messages:o}}async resolveSessionPath(e){let n=this.conversationPath(e);try{return await dy(n),n}catch{}let r=Kt(this.baseDir,"conversations");try{let s=[];for(let i of await ay(r)){if(!i.endsWith(".db"))continue;Ud(i,".db").startsWith(e)&&s.push(Kt(r,i))}if(s.length===1)return s[0]}catch{}return null}async deleteSession(e){let n=await this.resolveSessionPath(e);if(!n)return!1;let r=hy(n);return r?(await cy(this.conversationPath(r),{force:!0}),await cy(Kt(this.baseDir,"brain",r),{recursive:!0,force:!0}),!0):!1}async resolveCwd(e,n){let r=await this.cwdFromLastConversationCache(e);if(r)return r;if(n){let s=await w$(n);if(s)return s}return"(unknown)"}async cwdFromLastConversationCache(e){let n=Kt(this.baseDir,"cache","last_conversations.json");try{let r=JSON.parse(await ly(n,"utf8"));for(let[s,i]of Object.entries(r))if(i===e)return s}catch{}return null}async readTaskLog(e,n){if(!/^task-\d+$/.test(n))return null;let r=Kt(this.baseDir,"brain",e,".system_generated","tasks",`${n}.log`);try{let[s,i]=await Promise.all([ly(r,"utf8"),Le(r)]);return{content:s,modifiedAt:i.modifiedAt}}catch{return null}}}});import{spawn as R$}from"node:child_process";function qd(t){return new Wd(t)}async function O$(t,e){let n=Date.now(),r=["--conversation",e.sessionId,"-p",t,"--dangerously-skip-permissions","--print-timeout",C$(e.timeoutMs)];e.model&&r.push("--model",e.model),et("agy",r,e.permissionMode??"yolo"),e.onProgress?.({kind:"system",summary:"agy -p one-shot started (no streaming events)"});let{stdout:s}=await L$(e.binary,r,{cwd:e.cwd,env:Ke(e.env,e.cwd,e.sessionId),signal:e.signal});return e.onProgress?.({kind:"system",summary:"agy -p one-shot completed"}),{text:s.trimEnd(),sessionId:e.sessionId,durationMs:Date.now()-n}}function L$(t,e,n){return new Promise((r,s)=>{let i;try{i=R$(t,e,{cwd:n.cwd,env:n.env,stdio:["ignore","pipe","pipe"]})}catch(c){s(c);return}let o="",a="";i.stdout?.on("data",c=>{o+=c.toString()}),i.stderr?.on("data",c=>{a+=c.toString()});let l=()=>{i.kill("SIGTERM"),s(new Error("agy turn aborted"))};if(n.signal){if(n.signal.aborted){l();return}n.signal.addEventListener("abort",l,{once:!0})}i.on("error",c=>{n.signal?.removeEventListener("abort",l),s(c)}),i.on("exit",(c,u)=>{if(n.signal?.removeEventListener("abort",l),c===0){r({stdout:o,stderr:a});return}let d=u?`signal ${u}`:`exit code ${c}`,f=a.trim()||o.trim();s(new Error(`agy failed (${d})${f?`: ${f}`:""}`))})})}function C$(t){return!t||t<=0?"8h":`${Math.max(1,Math.ceil(t/1e3))}s`}var Wd,Hd=E(()=>{"use strict";yy();ht();it();xt();er();Wd=class extends Te{constructor(e){super({provider:new $o(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1},injection:{leaderMode:"prompt-append",leaderSetupHint:"Antigravity uses one-shot print turns; no streaming events are available."},binary:"agy",seedArgs:["-p",ce,"--dangerously-skip-permissions","--print-timeout","2m"],resumeTemplate:"agy --conversation {{session_id}} --dangerously-skip-permissions",startTemplate:"agy --dangerously-skip-permissions",transport:O$})}seedArgsFor(e){let n=[...super.seedArgsFor(e)];return e?.model&&n.push("--model",e.model),n}manualSeedHint(e){return{launchCommand:`cd ${e} && agy --dangerously-skip-permissions`,postLaunchNote:"Send the lmctl seed instruction, wait for the conversation to write, then exit.",lsCommand:`lmctl ls --provider agy --sessiondir ${e}`}}}});import $$ from"node:zlib";function H$(t,e){return t[e]===D$&&t[e+1]===j$&&t[e+2]===P$&&t[e+3]===F$}function wy(t,e){return(t[e]&240)===80&&t[e+1]===U$&&t[e+2]===W$&&t[e+3]===q$}function B$(t,e){if(wy(t,e))return e+8>t.length?void 0:8+t.readUInt32LE(e+4);if(!H$(t,e))return;let n=e+4;if(n+1>t.length)return;let r=t[n];n+=1;let s=r>>6,i=(r&32)!==0,o=(r&4)!==0,a=r&3;i||(n+=1),n+=[0,1,2,4][a];let l=s===0?i?1:0:[2,4,8][s-1];if(n+=l,!(n>t.length)){for(;;){if(n+3>t.length)return;let c=t[n]|t[n+1]<<8|t[n+2]<<16,u=(c&1)!==0,d=c>>1&3,f=c>>3;if(n+=3,d===3||(n+=d===1?1:f,n>t.length))return;if(u)break}if(o&&(n+=4),!(n>t.length))return n-e}}function X$(t){let e=[],n=0;for(;n+4<=t.length;){let r=B$(t,n);if(r===void 0||r<=0)break;e.push(t.subarray(n,n+r)),n+=r}return e}function Mo(t){let e=[];for(let n of X$(t))wy(n,0)||e.push(M$(n).toString("utf8"));return e.join("")}var M$,D$,j$,P$,F$,U$,W$,q$,Bd=E(()=>{"use strict";M$=$$.zstdDecompressSync,D$=40,j$=181,P$=47,F$=253,U$=42,W$=77,q$=24});import{readdir as Xd,rm as J$,stat as G$}from"node:fs/promises";import{join as Ln}from"node:path";function K$(t){return"--"+t.replace(/^\/+|\/+$/g,"").replace(/\//g,"-")+"--"}function Jd(t){if(typeof t=="string")return t;if(!Array.isArray(t))return"";let e=[];for(let n of t)n&&typeof n=="object"&&n.type==="text"&&typeof n.text=="string"&&e.push(n.text);return e.join("")}function V$(t){if(!Array.isArray(t))return[];let e=[];for(let n of t)n&&typeof n=="object"&&n.type==="reasoning"&&typeof n.text=="string"&&e.push(n.text);return e}function Ey(t){let e=[];for(let n of t){let r=n.data??{},s=n.time?new Date(n.time):new Date(0);if(n.type==="user/message"){let i=r;if(i.source?.kind!==void 0&&i.source.kind!=="user")continue;e.push({role:"user",timestamp:s,content:Jd(i.content)})}else if(n.type==="assistant/message"){let i=r.message;for(let o of V$(i?.content))e.push({role:"thinking",timestamp:s,content:o});e.push({role:"assistant",timestamp:s,content:Jd(i?.content),model:i?.source?.model})}else if(n.type==="tool/call"){let i=r,o;if(typeof i.arguments=="string")try{o=JSON.parse(i.arguments)}catch{}else i.arguments&&typeof i.arguments=="object"&&(o=i.arguments);e.push({role:"tool_use",timestamp:s,content:typeof i.arguments=="string"?i.arguments:JSON.stringify(i.arguments??{}),toolName:i.name,toolCallId:i.callId,toolInputData:o})}else if(n.type==="tool/result"){let i=r,a=(Array.isArray(i.message?.content)?i.message.content:[])[0];e.push({role:"tool_result",timestamp:s,content:Jd(a?.content??i.message?.content),toolCallId:a?.toolCallId??i.message?.source?.callId})}}return e}function Y$(t){for(let e=t.length-1;e>=0;e--){let n=t[e];if(n.type==="turn/end")return n.data?.reason?.kind==="completed"?"complete":"aborted";if(n.type==="turn/start")return"in_progress"}}function Ty(t,e,n){let r=t.find(m=>m.type==="session");if(!r)return null;let s=r,i=r.data,o=s.id??i?.id;if(!o)return null;let a;for(let m of t)if(m.type==="request/header"){let p=m.data?.header;p?.config?.model&&(a=p.config.model)}let l=t.map(m=>m.time).filter(m=>typeof m=="number"),c=s.createdAt??i?.createdAt,u=c?new Date(c):new Date(0),d=l.length>0?new Date(Math.max(...l)):u,f=n.filter(m=>m.role==="user");return{provider:"dsh",sessionId:o,cwd:s.cwd??i?.cwd??"",createdAt:u,modifiedAt:d,model:a,firstUserMessage:f[0]?.content,lastUserMessage:f.at(-1)?.content,messageCount:n.filter(m=>m.role==="user"||m.role==="assistant").length,filePath:e,...z$(t)}}function z$(t){let e=!1,n=0,r=0,s=0,i=0,o,a;for(let l of t){if(l.type!=="assistant/message")continue;let c=l.data?.usage;if(!c)continue;e=!0;let u=Do(c.inputTokens),d=Do(c.cacheReadTokens),f=Do(c.outputTokens),m=Do(c.reasoningTokens);n+=u,r+=d,s+=f,i+=m,o=u+d,a={inputTokens:u,cachedInputTokens:d,outputTokens:f,reasoningOutputTokens:m,totalTokens:u+d+f}}return{totalInputTokens:e?n:void 0,totalCachedInputTokens:e?r:void 0,totalOutputTokens:e?s:void 0,totalReasoningOutputTokens:e?i:void 0,lastInputTokens:o,lastTokenUsage:a}}function Do(t){let e=Number(t??0);return Number.isFinite(e)?Math.max(0,Math.round(e)):0}var jo,vy=E(()=>{"use strict";At();Bd();jo=class{name="dsh";sessionsDir;constructor(e={}){let n=e.dshHome||Ln(ge,".dsh");this.sessionsDir=Ln(n,"sessions")}async discoverSessions(){let e=[],n;try{n=await Xd(this.sessionsDir)}catch{return[]}for(let r of n){let s;try{s=await Xd(Ln(this.sessionsDir,r))}catch{continue}for(let i of s)if(i.startsWith("session-"))try{let o=await this.readSummary(r,i);o&&e.push(o)}catch{}}return e}async loadSession(e){let n=await this.findSessionDir(e);if(!n)return null;let r=await this.readRecords(n.cwdDir,n.sessionDir);if(r.length===0)return null;let s=Ey(r),i=Ty(r,n.filePath,s);return i?{...i,turnStatus:Y$(r),messages:s}:null}async resolveSessionPath(e){return(await this.findSessionDir(e))?.filePath??null}async deleteSession(e){let n=await this.findSessionDir(e);return n?(await J$(Ln(this.sessionsDir,n.cwdDir,n.sessionDir),{recursive:!0,force:!0}),!0):!1}sessionFilePath(e,n){return Ln(this.sessionsDir,K$(e),n,"session.jsonl.zstd")}async findSessionDir(e){let n;try{n=await Xd(this.sessionsDir)}catch{return null}for(let r of n){let s=e,i=Ln(this.sessionsDir,r,s,"session.jsonl.zstd");try{return await G$(i),{cwdDir:r,sessionDir:s,filePath:i}}catch{}}return null}async readRecords(e,n){let{readFile:r}=await import("node:fs/promises"),s=Ln(this.sessionsDir,e,n,"session.jsonl.zstd"),i=await r(s),o=Mo(i),a=[];for(let l of o.split(`
|
|
1583
1583
|
`))if(l.trim())try{let c=JSON.parse(l);if(c.type?.endsWith("-chunks")||c.type==="assistant/chunk")continue;a.push(c)}catch{}return a}async readSummary(e,n){let r=await this.readRecords(e,n);if(r.length===0)return null;let s=Ln(this.sessionsDir,e,n,"session.jsonl.zstd");return Ty(r,s,Ey(r))}}});import{spawn as Z$}from"node:child_process";async function Kd(t,e=n=>Gd.spawn(n)){if(Cn){let n=await Cn.catch(()=>{});if(n?.alive)return n;Cn=void 0}return Cn=e(t),Cn}async function Vd(){if(!Cn)return;(await Cn.catch(()=>{}))?.shutdown(),Cn=void 0}var Q$,Sy,Dr,Gd,Cn,by=E(()=>{"use strict";Q$=/dsh web:\s*(https?:\/\/\S+)/,Sy=2e4,Dr=class t extends Error{method;detail;constructor(e,n){super(`dsh RPC ${e} failed: ${JSON.stringify(n)}`),this.name="DshRpcCallError",this.method=e,this.detail=n,Object.setPrototypeOf(this,t.prototype)}},Gd=class t{baseUrl;child;constructor(e,n){this.baseUrl=e,this.child=n}static forTesting(e){return new t(e,void 0)}async rpc(e,n){let r=`${e}-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,s;try{s=await fetch(`${this.baseUrl}/api/${e}`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({type:"client-request",rpcId:r,method:e,payload:n})})}catch(a){throw new Dr(e,`transport error: ${a instanceof Error?a.message:String(a)}`)}let i;try{i=await s.json()}catch{i=void 0}if(!s.ok)throw new Dr(e,i??s.statusText);let o=i&&typeof i=="object"?i.result:void 0;if(!o||typeof o!="object"||typeof o.ok!="boolean")throw new Dr(e,"malformed response: HTTP 200 but body is not a well-formed {result:{ok,\u2026}} envelope");if(o.ok===!1)throw new Dr(e,o.error??o);return"value"in o?o.value:void 0}get alive(){return this.child!==void 0&&this.child.exitCode===null&&this.child.signalCode===null}shutdown(){this.child!==void 0&&this.alive&&this.child.kill("SIGTERM")}static spawn(e){return new Promise((n,r)=>{let s=Z$("dsh",["web","--no-open","--port","0"],{env:e,stdio:["ignore","pipe","pipe"]}),i=!1,o="",a="",l=setTimeout(()=>{i||(i=!0,s.kill("SIGTERM"),r(new Error(`dsh web sidecar did not report a boot URL within ${Sy}ms (stdout: ${o.slice(0,500)}; stderr: ${a.slice(0,500)})`)))},Sy);s.stdout?.on("data",c=>{if(o+=c.toString(),i)return;let u=Q$.exec(o);u&&(i=!0,clearTimeout(l),n(new t(u[1],s)))}),s.stderr?.on("data",c=>{a+=c.toString()}),s.on("error",c=>{i||(i=!0,clearTimeout(l),r(c))}),s.on("exit",(c,u)=>{if(i)return;i=!0,clearTimeout(l);let d=u?`signal ${u}`:`exit code ${c}`;r(new Error(`dsh web exited before reporting a boot URL (${d}): ${a.slice(0,500)}`))})})}}});import{randomUUID as eM}from"node:crypto";import{readFile as tM,mkdir as nM}from"node:fs/promises";function zd(t){return new Yd(t)}function Iy(t){return{...t,DSH_PERMISSION_MODE:t.DSH_PERMISSION_MODE??"danger-full-access"}}function sM(t){let e=t?.kind??"unknown",n=t?.error?.message;return n?`dsh turn ended with reason=${e}: ${n}`:`dsh turn ended with reason=${e} and no assistant text`}function Po(t){return t instanceof Error?t.message:String(t)}async function iM(t){let e=await Ny(t),n=-1;for(let r of e)r.type==="turn/end"&&typeof r.seq=="number"&&r.seq>n&&(n=r.seq);return n}async function Ny(t){let e;try{e=await tM(t)}catch{return[]}let n=Mo(e),r=[];for(let s of n.split(`
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lmctl-ai/lmctl",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.338",
|
|
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",
|