@lmctl-ai/lmctl 0.1.69 → 0.1.71
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 +35 -10
- package/package.json +1 -1
package/dist/cli/index.js
CHANGED
|
@@ -1821,10 +1821,12 @@ services. Help exits before any port binding or daemon startup.
|
|
|
1821
1821
|
local identity. Mailbox store defaults to
|
|
1822
1822
|
~/.lmctl/local-mailbox/ ($LMCTL_LOCAL_MAILBOX_DIR overrides).
|
|
1823
1823
|
`;ja=class extends Error{missing;constructor(e){let r=e.map(n=>n.provider).join(", ");super(`provider binary pre-flight failed: ${r}`),this.name="ProviderBinaryPreflightError",this.missing=e}},sb=Bd});var db={};le(db,{runIntake:()=>i1});async function i1(t,e){let[r,...n]=t;return r==="--help"||r==="-h"||r==="help"?(e.stdout.write(o1),0):r==="scan"?a1(n,e):r==="config"?l1(n,e):(e.stderr.write(`usage: lmctl intake <scan|config> ...
|
|
1824
|
-
`),1)}async function a1(t,e){let r=D(t,["--project"],["--json"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>0)return w(e,`unknown argument: ${r.positionals[0]}`);let n=x(r,"--project");return L(e,async s=>{if(n!==void 0){let o=s.findProjectByName(n);if(o===null)return w(e,`project not found: ${n}`);let i=await du({dal:s,project:o});return B(e,{project_id:o.id,project_name:o.name,...i}),0}return B(e,await gn(s)),0})}async function l1(t,e){let[r,...n]=t;if(r===void 0||r.startsWith("--"))return w(e,"usage: lmctl intake config <project-name> --scan-github-issues true|false [--labels csv] [--state open|closed|all]");let s=D(n,["--scan-github-issues","--labels","--state"],["--json"]);if(s.error!==void 0)return w(e,s.error);let o=x(s,"--scan-github-issues");if(o!=="true"&&o!=="false")return w(e,"missing or invalid --scan-github-issues true|false");let i=x(s,"--state");if(i!==void 0&&i!=="open"&&i!=="closed"&&i!=="all")return w(e,"invalid --state: expected open, closed, or all");let a=x(s,"--labels"),l={scan_github_issues:o==="true",labels:a===void 0?void 0:a.split(",").map(c=>c.trim()).filter(Boolean),state:i};return L(e,c=>{let u=c.findProjectByName(r);if(u===null)return w(e,`project not found: ${r}`);let d=c.setProjectIntakeConfig(u.id,JSON.stringify(l));return B(e,d),0})}var o1,fb=b(()=>{"use strict";ji();ke();o1=`usage: lmctl intake
|
|
1824
|
+
`),1)}async function a1(t,e){let r=D(t,["--project"],["--json"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>0)return w(e,`unknown argument: ${r.positionals[0]}`);let n=x(r,"--project");return L(e,async s=>{if(n!==void 0){let o=s.findProjectByName(n);if(o===null)return w(e,`project not found: ${n}`);let i=await du({dal:s,project:o});return B(e,{project_id:o.id,project_name:o.name,...i}),0}return B(e,await gn(s)),0})}async function l1(t,e){let[r,...n]=t;if(r===void 0||r.startsWith("--"))return w(e,"usage: lmctl intake config <project-name> --scan-github-issues true|false [--labels csv] [--state open|closed|all]");let s=D(n,["--scan-github-issues","--labels","--state"],["--json"]);if(s.error!==void 0)return w(e,s.error);let o=x(s,"--scan-github-issues");if(o!=="true"&&o!=="false")return w(e,"missing or invalid --scan-github-issues true|false");let i=x(s,"--state");if(i!==void 0&&i!=="open"&&i!=="closed"&&i!=="all")return w(e,"invalid --state: expected open, closed, or all");let a=x(s,"--labels"),l={scan_github_issues:o==="true",labels:a===void 0?void 0:a.split(",").map(c=>c.trim()).filter(Boolean),state:i};return L(e,c=>{let u=c.findProjectByName(r);if(u===null)return w(e,`project not found: ${r}`);let d=c.setProjectIntakeConfig(u.id,JSON.stringify(l));return B(e,d),0})}var o1,fb=b(()=>{"use strict";ji();ke();o1=`usage: lmctl intake scan [--project NAME] [--json]
|
|
1825
|
+
lmctl intake config <project-name> --scan-github-issues true|false [--labels csv] [--state open|closed|all] [--json]
|
|
1825
1826
|
|
|
1826
1827
|
Scan configured project GitHub issues into lmctl, or update per-project
|
|
1827
1828
|
intake settings such as enabled state, labels, and issue state filters.
|
|
1829
|
+
scan writes JSON output; --project limits the scan to one project.
|
|
1828
1830
|
`});import{createHash as c1}from"node:crypto";import{existsSync as Os,mkdirSync as u1,readFileSync as hb,realpathSync as d1,writeFileSync as f1}from"node:fs";import{basename as mb,dirname as _b,resolve as gb}from"node:path";function Ne(t,e){let r=gb(t);if(Os(r))return d1(r);if(e!==void 0){let n=h1(t,r,e);if(n!==null)return n}return r}function pb(t,e){let r=_b(e),n=jd(t,ba(e),{baseDir:r});for(let s of n.members)s.sessiondir!==void 0&&!s.sessiondir.startsWith("/")&&(s.sessiondir=gb(r,s.sessiondir));return n}function Pr(t,e){let r=Ne(t,p1(e)?e:void 0);if(e!==void 0){let n=e.getRootTeam(r);if(n!==null)return!Os(r)&&"upsertRootTeam"in e&&(u1(_b(r),{recursive:!0}),f1(r,n.raw_text,"utf8")),pb(n.raw_text,r);if(Os(r)){let s=hb(r,"utf8"),o=pb(s,r);return"upsertRootTeam"in e&&_1(o)&&g1(e,r,o,s),o}throw new Error(`teamfile not found: ${t}`)}if(!Os(r))throw new Error(`teamfile not found: ${t}`);return Le(r)}function wb(t,e,r){let n=Ne(t,e),s=e.getRootTeam(n);s===null||!Os(n)||hb(n,"utf8")===s.raw_text||r(`warning: ${n} differs from the last seeded DB snapshot; runtime is using the seeded snapshot. Run: lmctl seed ${n}`)}function p1(t){return typeof t=="object"&&t!==null&&"getRootTeam"in t&&"listRootTeams"in t}function h1(t,e,r){let n=r.getRootTeam(t)??r.getRootTeam(e);if(n!==null)return n.teamfile_path;let s=mb(t),o=ba(t),i=r.listRootTeams().filter(l=>mb(l.teamfile_path)===s||l.name===o);if(i.length===0)return null;if(i.length===1)return i[0].teamfile_path;let a=i.map(l=>l.teamfile_path).join(", ");throw new Error(`ambiguous teamfile "${t}" in root-team registry: ${a}; pass an absolute path`)}function _1(t){return t.parseErrors.length>0?!1:t.members.every(e=>e.teamfile!==void 0?!0:e.session!==void 0&&e.session.length>=m1)}function g1(t,e,r,n){let s=new Date().toISOString(),o={teamfile_path:e,name:r.name,raw_text:n,raw_sha256:c1("sha256").update(n).digest("hex"),registered_at:s,last_seeded_at:s};t.upsertRootTeam(o)}var m1,mr=b(()=>{"use strict";Jt();m1=5});import{existsSync as w1}from"node:fs";import{dirname as yb}from"node:path";function b1(t){return y1.test(t)||E1.test(t)}function Eb(t){return Aa.test(t)}function Ls(t){if(!t.includes(":"))return null;let e=t.lastIndexOf(":"),r=t.slice(0,e),n=t.slice(e+1);return!r.endsWith(".lmctl")||!Aa.test(n)?null:{teamfile:r,alias:n}}function Nt(t,e,r){if(!t.endsWith(".lmctl"))throw new ge(`lmctl: "${t}" doesn't look like a teamfile (expected .lmctl extension).`);if(!Eb(e))throw new ge(`lmctl: "${e}" is not a valid alias (must match ${Aa.source}).`);let n=Ne(t,r);if(r===void 0&&!w1(n))throw new ge(`lmctl: teamfile not found: ${t}`);let s;try{s=Pr(n,r)}catch(i){throw new ge(`lmctl: ${t}: ${i instanceof Error?i.message:String(i)}`)}if(s.parseErrors.length>0)throw new ge(`lmctl: ${t}: ${s.parseErrors.join("; ")}`);let o=Ta(s,e);if(o===void 0){let i=s.members.map(a=>a.alias).join(", ")||"(none)";throw new ge(`lmctl: alias "${e}" not found in ${t}.
|
|
1829
1831
|
Known aliases: ${i}`)}if(o.teamfile!==void 0){let i=Rd(o,yb(n));return{teamfile:n,alias:o.alias,provider:i.provider,sessionid:i.session,sessiondir:i.sessiondir,isLead:!0,...i.model??o.model?{model:i.model??o.model}:{},...i.effort??o.effort?{effort:i.effort??o.effort}:{}}}if(o.session===void 0)throw new ge(`lmctl: alias "${o.alias}" in ${t} has no session ID yet.
|
|
1830
1832
|
Run: lmctl seed ${t}`);return{teamfile:n,alias:o.alias,provider:o.provider,sessionid:o.session,sessiondir:o.sessiondir??yb(n),isLead:It(s)?.alias===o.alias,...o.model!==void 0?{model:o.model}:{},...o.effort!==void 0?{effort:o.effort}:{}}}function pr(t,e){let{target:r,alias:n,flags:s}=e;if(s.run!==void 0||s.project!==void 0||s.workflow!==void 0){if(r!==void 0)return{mode:"error",message:`lmctl ${t.name}: --run/--project/--workflow (managed mode) are mutually exclusive with a positional target "${r}" \u2014 pick one form.`};let i={mode:"managed"};return s.run!==void 0&&(i.run=s.run),s.project!==void 0&&(i.project=s.project),s.workflow!==void 0&&(i.workflow=s.workflow),i}if(r!==void 0){let i=Ls(r);if(i!==null)return n!==void 0&&n!==i.alias?{mode:"error",message:`lmctl ${t.name}: got "${r}" AND second positional "${n}" \u2014 pick one form.`}:{mode:"ai-team",teamfile:i.teamfile,alias:i.alias};if(r.endsWith(".lmctl"))return n!==void 0?Eb(n)?{mode:"ai-team",teamfile:r,alias:n}:{mode:"error",message:`lmctl ${t.name}: "${n}" is not a valid alias (must match ${Aa.source}).`}:t.allowsBareTeamfile?{mode:"ai-team",teamfile:r}:{mode:"error",message:`lmctl ${t.name}: alias required.
|
|
@@ -1832,9 +1834,9 @@ intake settings such as enabled state, labels, and issue state filters.
|
|
|
1832
1834
|
Either drop the second arg, or pass <teamfile>.lmctl as the first arg.`}:{mode:"error",message:`lmctl ${t.name}: can't infer target type from "${r}".
|
|
1833
1835
|
Expected one of: <path>.lmctl, <path>.lmctl:<alias>, <sessionid>.`}}if(s.session!==void 0){if(!t.supportsRaw)return{mode:"error",message:`lmctl ${t.name}: --session (raw mode) is not supported by ${t.name}.`};let i={mode:"ai-team-raw",sessionid:s.session};return s.provider!==void 0&&(i.provider=s.provider),i}return{mode:"error",message:`lmctl ${t.name}: a target is required.
|
|
1834
1836
|
Use: <path>.lmctl[:<alias>] | <path>.lmctl <alias> | <sessionid> | --run <id>`}}var ge,y1,E1,Aa,Fr=b(()=>{"use strict";Jt();mr();ge=class extends Error{constructor(e){super(e),this.name="ChatTargetError"}},y1=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,E1=/^ses_[A-Za-z0-9_-]+$/,Aa=/^[A-Za-z][A-Za-z0-9_-]*$/});function Sb(t){let e=bb(t.registry,t.fromTeamfile);if(e===void 0)return jn(`sender team is not registered in policy graph: ${t.fromTeamfile}`);if(!Tb(e,t.fromAlias))return jn(`sender alias "${t.fromAlias}" not found in ${t.fromTeamfile}`);let r=bb(t.registry,t.toTeamfile);return r===void 0?jn(`target team is not registered in policy graph: ${t.toTeamfile}`):Tb(r,t.toAlias)?t.toTeamfile===t.fromTeamfile?{allowed:!0,outOfPolicy:!1,reason:"same team"}:e.leadAlias===null?jn(`sender team has no Lead: ${t.fromTeamfile}`):t.fromAlias!==e.leadAlias?jn(`cross-team sends may only originate from Lead; got "${t.fromAlias}" in ${t.fromTeamfile}`):{allowed:!0,outOfPolicy:!1,reason:"cross-team send from Lead"}:jn(`target alias "${t.toAlias}" not found in ${t.toTeamfile}`)}function bb(t,e){return t.teams.find(r=>r.teamfile===e)}function Tb(t,e){return t.aliases.some(r=>r===e)}function jn(t){return{allowed:!1,outOfPolicy:!0,reason:t}}var kb=b(()=>{"use strict"});import{basename as T1}from"node:path";function Nb(t,e){let r=new Date(e.now.getTime()-Ra()).toISOString(),n=jb(t,r).filter(f=>!f.sender.teamfile.startsWith("prompt:")),s=v1(e.sender,n),o=I1(e.sender,n);o!==null&&o.teamfile===e.root&&!Ib(s[0],o)&&s.unshift({...o,at:null});let i={teamfile:e.receiverTeamfile,alias:e.receiverAlias,at:e.now.getTime()},a=[...s,i],l=s.filter(f=>Ib(f,i)),c=l.map(f=>f.at).filter(f=>f!==null).sort((f,m)=>m-f)[0]??null,u=c!==null&&e.now.getTime()-c<S1;return{stop:l.length>=1&&u,chain:N1(a)}}function $b(t,e){let r=new Date(e.now.getTime()-Ra()).toISOString(),n=jb(t,r),s=Ab(e.sender,n);if(s.length===0)return null;let o=s[0];return o.sender.teamfile.startsWith("prompt:")?o.receiver.teamfile:o.sender.teamfile}function Ra(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return vb;let r=Number(e);return!Number.isFinite(r)||r<=0?vb:r}function xb(t){return`cross-team cycle detected (${t}); stopping to prevent a runaway loop.`}function k1(t){return{sender:{teamfile:t.sender_teamfile,alias:t.sender_alias},receiver:{teamfile:t.receiver_teamfile,alias:t.receiver_alias},at:Date.parse(t.started_at)}}function jb(t,e){return t.clearAgentInflightOlderThan(e),t.listAgentInflight().map(k1).filter(r=>Number.isFinite(r.at)&&new Date(r.at).toISOString()>=e).sort((r,n)=>r.at-n.at)}function v1(t,e,r={}){let n=new Map;for(let a of e)n.set(Ur(a.receiver),a);let s=[{...t,at:null}],o=t,i=new Set([Ur(t)]);for(let a=0;a<64;a+=1){let l=n.get(Ur(o));if(l===void 0)break;s[0]={...s[0],at:s[0].at??l.at};let c={...l.sender,at:l.at};if(l.sender.teamfile.startsWith("prompt:")&&r.includePromptSender!==!0)break;let u=Ur(l.sender);if(i.has(u))break;s.unshift(c),i.add(u),o=l.sender}return s}function Ab(t,e){let r=Ur(t),n=new Set([r]),s=[r],o=[];for(let i=0;s.length>0&&i<128;i+=1){let a=s.shift();for(let l of e){let c=Ur(l.sender),u=Ur(l.receiver);c!==a&&u!==a||(o.includes(l)||o.push(l),n.has(c)||(n.add(c),s.push(c)),n.has(u)||(n.add(u),s.push(u)))}}return o.sort((i,a)=>i.at-a.at)}function I1(t,e){let r=Ab(t,e);if(r.length===0)return null;let n=r[0];return n.sender.teamfile.startsWith("prompt:")?n.receiver:n.sender}function Ib(t,e){return t.teamfile===e.teamfile&&t.alias===e.alias}function Ur(t){return`${t.teamfile}\0${t.alias}`}function N1(t){return t.map(e=>`${T1(e.teamfile)}:${e.alias}`).join(" \u2192 ")}var S1,vb,Rb=b(()=>{"use strict";S1=6e4,vb=8*60*60*1e3});async function Cb(t){let e=Mb(t.io,()=>{}),r=await L(e,i=>Nt(t.teamfile,t.alias,i)),n=r.teamfile,s=t.fromFlag!==void 0?await L(e,i=>Db(t.fromFlag,n,i)):await L1(e,t.selfSessionId,n),o=await Pb(e,{explicitRoot:t.rootFlag,sender:s,receiverTeamfile:n,operatorOrigin:s.alias==="operator"});return{teamfile:n,alias:r.alias,fromIdentity:`${s.teamfile}:${s.alias}`,rootTeamfile:o}}async function Cs(t){let e=t.onEvent??(()=>{}),r=Mb(t.io,e),n=null,s=null,o=null;try{let i=await L(r,$=>Nt(t.teamfile,t.alias,$)),a=i.teamfile,l=await L(r,$=>Db(t.fromFlag,a,$)),c=await Pb(r,{explicitRoot:t.rootFlag,sender:l,receiverTeamfile:a,operatorOrigin:t.fromFlag===void 0}),u=t.fromFlag===void 0?null:await C1(r,{rootTeamfile:c,sender:l,receiverTeamfile:a,receiverAlias:i.alias});u!==null&&!u.allowed&&e({kind:"warning",message:`warning: out-of-policy chat send: ${u.reason}
|
|
1835
|
-
`}),ui(r,i.isLead,i.alias,i.provider,i.sessiondir);try{di(r,Le(a),a)}catch{}if(n={root_teamfile:c,sender_teamfile:l.teamfile,sender_alias:l.alias,receiver_teamfile:a,receiver_alias:i.alias,policy:u},t.fromFlag!==void 0&&l.teamfile!==a){let $=await L(r,v=>Nb(v,{root:c,sender:l,receiverTeamfile:a,receiverAlias:i.alias,now:new Date}));if($.stop){let v=xb($.chain),A=await La(r,{...n,message:t.prompt,response:null,status:"error",error_detail:v});return{status:"error",errorKind:"cycle",message:v,teamChatLogId:A}}}let d=await P1(r,{receiver_teamfile:a,receiver_alias:i.alias,sender_teamfile:l.teamfile,sender_alias:l.alias,force:t.force===!0});if(!d.acquired){let $=B1(i.alias,d.current),v=await La(r,{...n,message:t.prompt,response:null,status:"error",error_detail:$});return{status:"busy",message:$,teamChatLogId:v}}s=d.lease,i.isLead&&(o={teamfile:a,alias:i.alias,identity:`${a}:${i.alias}`,env:t.env});let f=!1,m=we(),p=0,h=0,g=0,_={provider:i.provider,sessionId:i.sessionid,cwd:i.sessiondir,prompt:t.prompt,permissionMode:t.permissionMode,env:t.env??process.env,onDelta:$=>{f=!0,m&&(p+=1,g=Buffer.byteLength($,"utf8"),h+=g),e({kind:"delta",chunk:$})},onProgress:$=>e({kind:"progress",alias:i.alias,event:$})};i.model!==void 0&&(_.model=i.model),i.effort!==void 0&&(_.effort=i.effort),_.alias=i.alias,_.isLead=i.isLead,t.idleTimeoutMs!==void 0&&(_.timeoutMs=t.idleTimeoutMs);let T=await Dt(_);m&&Je(JSON.stringify({event:"chat_return",alias:i.alias,provider:i.provider,streamed:f,blockCount:p,streamedBytes:h,resultTextBytes:Buffer.byteLength(T.text,"utf8"),lastChunkBytes:g,tailPreview:O1(T.text,200)}));let E=T.status==="stalled",k=await La(r,{...n,message:t.prompt,response:E?null:T.text,status:n.policy?.outOfPolicy===!0?"out_of_policy":E?"error":"ok",error_detail:n.policy?.outOfPolicy===!0?n.policy.reason:E?`provider stalled${T.stalledAfterMs!==void 0?` after ${T.stalledAfterMs}ms`:""}`:null});return{status:E?"stalled":"ok",replyText:T.text,wroteDelta:f,teamChatLogId:k,durationMs:T.durationMs}}catch(i){let a=i instanceof Error?i.message:String(i),l=n===null?null:await La(r,{...n,message:t.prompt,response:null,status:n.policy?.outOfPolicy===!0?"out_of_policy":"error",error_detail:n.policy?.outOfPolicy===!0?`${n.policy.reason}; provider error: ${a}`:a});return{status:"error",errorKind:i instanceof ge?"target":"provider",message:a,teamChatLogId:l}}finally{s!==null&&await W1(r,s),o!==null&&t.skipAutoDelivery!==!0&&await $1(r,o,t.autoDeliverySender??j1)}}async function $1(t,e,r){try{let n=await L(t,s=>s.claimDeliverableDelegationJobs(e.identity));if(n.length===0)return;for(let s of x1(n))try{await r({teamfile:e.teamfile,alias:e.alias,prompt:A1(s.jobs),fromFlag:`${s.teamfile}:${s.alias}`,io:t,env:e.env})}catch{}}catch{}}function x1(t){let e=new Map;for(let r of t){let n=`${r.teamfile}\0${r.alias}`,s=e.get(n);s===void 0&&(s={teamfile:r.teamfile,alias:r.alias,jobs:[]},e.set(n,s)),s.jobs.push(r)}return[...e.values()]}async function j1(t){let e=await Cs({teamfile:t.teamfile,alias:t.alias,prompt:t.prompt,fromFlag:t.fromFlag,permissionMode:"yolo",io:t.io,env:t.env,skipAutoDelivery:!0});if(e.status!=="ok"&&e.status!=="stalled")throw new Error(e.status==="busy"||e.status==="error"?e.message:"delivery failed")}function A1(t){return["Background delegation results:",...t.map(r=>`[background job ${r.id} to ${r.alias}: ${r.status}] ${R1(r)} (full: lmctl jobs show ${r.id})`),"","These results were marked delivered; use lmctl jobs for the full timeline."].join(`
|
|
1836
|
-
`)}function R1(t){let r=(t.status==="done"?t.result_text??"(no result)":t.error??t.result_text??t.status).replace(/\s+/gu," ").trim();return r.length<=500?r:`${r.slice(0,497)}...`}function Mb(t,e){return{...t,stdout:{write:()=>{}},stderr:{write:r=>{e({kind:"warning",message:r})}}}}function O1(t,e){return t.slice(-e)}function Db(t,e,r){if(t===void 0)return{teamfile:e,alias:"operator"};let n=Ls(t);if(n===null)throw new ge(
|
|
1837
|
-
`)}}function B1(t,e){return`${
|
|
1837
|
+
`}),ui(r,i.isLead,i.alias,i.provider,i.sessiondir);try{di(r,Le(a),a)}catch{}if(n={root_teamfile:c,sender_teamfile:l.teamfile,sender_alias:l.alias,receiver_teamfile:a,receiver_alias:i.alias,policy:u},t.fromFlag!==void 0&&l.teamfile!==a){let $=await L(r,v=>Nb(v,{root:c,sender:l,receiverTeamfile:a,receiverAlias:i.alias,now:new Date}));if($.stop){let v=xb($.chain),A=await La(r,{...n,message:t.prompt,response:null,status:"error",error_detail:v});return{status:"error",errorKind:"cycle",message:v,teamChatLogId:A}}}let d=await P1(r,{receiver_teamfile:a,receiver_alias:i.alias,sender_teamfile:l.teamfile,sender_alias:l.alias,force:t.force===!0});if(!d.acquired){let $=B1(a,i.alias,d.current),v=await La(r,{...n,message:t.prompt,response:null,status:"error",error_detail:$});return{status:"busy",message:$,teamChatLogId:v}}s=d.lease,i.isLead&&(o={teamfile:a,alias:i.alias,identity:`${a}:${i.alias}`,env:t.env});let f=!1,m=we(),p=0,h=0,g=0,_={provider:i.provider,sessionId:i.sessionid,cwd:i.sessiondir,prompt:t.prompt,permissionMode:t.permissionMode,env:t.env??process.env,onDelta:$=>{f=!0,m&&(p+=1,g=Buffer.byteLength($,"utf8"),h+=g),e({kind:"delta",chunk:$})},onProgress:$=>e({kind:"progress",alias:i.alias,event:$})};i.model!==void 0&&(_.model=i.model),i.effort!==void 0&&(_.effort=i.effort),_.alias=i.alias,_.isLead=i.isLead,t.idleTimeoutMs!==void 0&&(_.timeoutMs=t.idleTimeoutMs);let T=await Dt(_);m&&Je(JSON.stringify({event:"chat_return",alias:i.alias,provider:i.provider,streamed:f,blockCount:p,streamedBytes:h,resultTextBytes:Buffer.byteLength(T.text,"utf8"),lastChunkBytes:g,tailPreview:O1(T.text,200)}));let E=T.status==="stalled",k=await La(r,{...n,message:t.prompt,response:E?null:T.text,status:n.policy?.outOfPolicy===!0?"out_of_policy":E?"error":"ok",error_detail:n.policy?.outOfPolicy===!0?n.policy.reason:E?`provider stalled${T.stalledAfterMs!==void 0?` after ${T.stalledAfterMs}ms`:""}`:null});return{status:E?"stalled":"ok",replyText:T.text,wroteDelta:f,teamChatLogId:k,durationMs:T.durationMs}}catch(i){let a=i instanceof Error?i.message:String(i),l=n===null?null:await La(r,{...n,message:t.prompt,response:null,status:n.policy?.outOfPolicy===!0?"out_of_policy":"error",error_detail:n.policy?.outOfPolicy===!0?`${n.policy.reason}; provider error: ${a}`:a});return{status:"error",errorKind:i instanceof ge?"target":"provider",message:a,teamChatLogId:l}}finally{s!==null&&await W1(r,s),o!==null&&t.skipAutoDelivery!==!0&&await $1(r,o,t.autoDeliverySender??j1)}}async function $1(t,e,r){try{let n=await L(t,s=>s.claimDeliverableDelegationJobs(e.identity));if(n.length===0)return;for(let s of x1(n))try{await r({teamfile:e.teamfile,alias:e.alias,prompt:A1(s.jobs),fromFlag:`${s.teamfile}:${s.alias}`,io:t,env:e.env})}catch{}}catch{}}function x1(t){let e=new Map;for(let r of t){let n=`${r.teamfile}\0${r.alias}`,s=e.get(n);s===void 0&&(s={teamfile:r.teamfile,alias:r.alias,jobs:[]},e.set(n,s)),s.jobs.push(r)}return[...e.values()]}async function j1(t){let e=await Cs({teamfile:t.teamfile,alias:t.alias,prompt:t.prompt,fromFlag:t.fromFlag,permissionMode:"yolo",io:t.io,env:t.env,skipAutoDelivery:!0});if(e.status!=="ok"&&e.status!=="stalled")throw new Error(e.status==="busy"||e.status==="error"?e.message:"delivery failed")}function A1(t){return["Background delegation results:",...t.map(r=>`[background job ${r.id} to ${r.alias}: ${r.status}] ${R1(r)} (full: lmctl jobs show ${r.id})`),"","These results were marked delivered; use lmctl jobs for the full timeline."].join(`
|
|
1838
|
+
`)}function R1(t){let r=(t.status==="done"?t.result_text??"(no result)":t.error??t.result_text??t.status).replace(/\s+/gu," ").trim();return r.length<=500?r:`${r.slice(0,497)}...`}function Mb(t,e){return{...t,stdout:{write:()=>{}},stderr:{write:r=>{e({kind:"warning",message:r})}}}}function O1(t,e){return t.slice(-e)}function Db(t,e,r){if(t===void 0)return{teamfile:e,alias:"operator"};let n=Ls(t);if(n===null)throw new ge(`--from must be <teamfile.lmctl>:<alias>, got '${t}'`);let s=Ne(n.teamfile,r),o=Pr(s,r);if(o.parseErrors.length>0)throw new ge(`--from ${n.teamfile}: ${o.parseErrors.join("; ")}`);let i=Ta(o,n.alias);if(i===void 0)throw new ge(`--from alias "${n.alias}" not found in ${n.teamfile}`);return{teamfile:s,alias:i.alias}}async function L1(t,e,r){if(e===void 0||e.length===0)return{teamfile:r,alias:"operator"};let n=await L(t,o=>{let i=[];for(let a of o.listRootTeams()){let l=Pr(a.teamfile_path,o);for(let c of l.members)c.teamfile===void 0&&c.session===e&&i.push({teamfile:a.teamfile_path,alias:c.alias})}if(i.length===0){let a=Pr(r,o);for(let l of a.members)l.teamfile===void 0&&l.session===e&&i.push({teamfile:r,alias:l.alias})}return i});if(n.length===0)return{teamfile:r,alias:"operator"};let s=new Map(n.map(o=>[`${o.teamfile}:${o.alias}`,o]));if(s.size>1)throw new ge("LMCTL_SELF_SESSIONID matches multiple team members; pass --from explicitly");return[...s.values()][0]}async function Pb(t,e){return e.explicitRoot!==void 0?await L(t,r=>Ne(e.explicitRoot,r)):e.operatorOrigin?e.receiverTeamfile:await L(t,r=>$b(r,{sender:e.sender,now:new Date})??e.receiverTeamfile)}async function C1(t,e){return await L(t,r=>Sb({rootTeamfile:e.rootTeamfile,fromTeamfile:e.sender.teamfile,fromAlias:e.sender.alias,toTeamfile:e.receiverTeamfile,toAlias:e.receiverAlias,registry:M1(r,e.sender.teamfile,e.receiverTeamfile)}))}function M1(t,e,r){return{teams:[e,r].map(s=>D1(s,t))}}function D1(t,e){let r=Pr(t,e),n=It(r);return{teamfile:t,aliases:r.members.map(s=>s.alias),leadAlias:n?.alias??null}}async function P1(t,e){let r=new Date().toISOString(),n=new Date(Date.now()-Ra()).toISOString(),s={receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,started_at:r};return await L(t,o=>{let i=we(),a=i?o.getAgentInflight(e.receiver_teamfile,e.receiver_alias):null,l=o.tryAcquireAgentInflight(s,{stale_before:n,force:e.force});if(l.acquired){if(i){let c=a===null?null:e.force?"force":a.started_at<n?"stale":null;Je(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},result:c===null?"acquired":"reclaimed",...c===null?{}:{reclaim_reason:c,holder:Oa(a)}}))}return{acquired:!0,lease:l.current??s}}if(!l.acquired&&F1(l.current,n)){let c=o.tryAcquireAgentInflight(s,{stale_before:n,reclaim_observed:{sender_teamfile:l.current.sender_teamfile,sender_alias:l.current.sender_alias,started_at:l.current.started_at,holder_pid:l.current.holder_pid}});return c.acquired?(i&&Je(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},result:"reclaimed",reclaim_reason:l.current.holder_pid===null?"null-holder":"dead-pid",holder:Oa(l.current)})),{acquired:!0,lease:c.current??s}):(i&&Je(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},result:"rejected",holder:Oa(c.current)})),{acquired:!1,current:c.current})}return i&&Je(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},result:"rejected",holder:Oa(l.current)})),{acquired:!1,current:l.current}})}function Oa(t){return t===null?null:{sender_teamfile:t.sender_teamfile,sender_alias:t.sender_alias,holder_pid:t.holder_pid,started_at:t.started_at}}function F1(t,e){return t.holder_pid===null?t.started_at<e:!U1(t.holder_pid)}function U1(t){if(!Number.isInteger(t)||t<=0)return!1;try{return process.kill(t,0),!0}catch(e){return(e!==null&&typeof e=="object"&&"code"in e?e.code:void 0)!=="ESRCH"}}async function W1(t,e){try{await L(t,r=>{r.releaseAgentInflight(e)})}catch(r){t.stderr.write(`warning: failed to release chat in-flight slot: ${r instanceof Error?r.message:String(r)}
|
|
1839
|
+
`)}}function B1(t,e,r){return`${e} is servicing ${r.sender_alias} (${r.sender_teamfile}) since ${r.started_at} \u2014 wait and retry, or inspect without waking it: lmctl tail "${t}" ${e}`}async function La(t,e){let r=Lb(e.message),n=e.response===null?null:Lb(e.response);try{return await L(t,s=>s.insertTeamChatLog({root_teamfile:e.root_teamfile,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,message:r.text,response:n?.text??null,status:e.status,error_detail:e.error_detail,truncated:r.truncated||n?.truncated?1:0,created_at:new Date().toISOString()}))}catch(s){return t.stderr.write(`warning: failed to record chat log: ${s instanceof Error?s.message:String(s)}
|
|
1838
1840
|
`),null}}function Lb(t){return t.length<=Ob?{text:t,truncated:!1}:{text:t.slice(0,Ob),truncated:!0}}var Ob,Hd=b(()=>{"use strict";bt();Fr();Jt();cs();kb();mr();Rb();$e();ke();Ob=256*1024});var qb={};le(qb,{parseIdleTimeoutMs:()=>Ub,runChat:()=>J1});import{spawn as q1}from"node:child_process";async function J1(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.length===0||t[0]==="--help"||t[0]==="-h")return e.stdout.write(`${Fb}
|
|
1839
1841
|
`),t.length===0?2:0;let r=X1(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
|
|
1840
1842
|
${Fb}
|
|
@@ -2046,13 +2048,17 @@ ${sn}`:sn;r.setMemberPromptSnapshot(f.id,g),u.push(p);let _=on(xe(p),m.sessionid
|
|
|
2046
2048
|
`);try{await hi({dal:r,member:p,stderr:e.stderr})}catch(T){d=!0,e.stderr.write(`error: ${T instanceof Error?T.message:String(T)}
|
|
2047
2049
|
`)}}}return M(s,"--json")?B(e,u):e.stdout.write(`seeded ${u.length} member(s)
|
|
2048
2050
|
`),d?1:0}function SU(t,e,r){return t.filter(n=>e!==void 0&&n.alias!==e?!1:r||n.sessionid===null)}function kU(t,e,r){let n=D(t,["--interpreter","--of"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: team companion <team-name> --interpreter A --of B[,C]");let o=r.findTeamByName(s);if(o===null)return w(e,`team not found: ${s}`);let i=x(n,"--interpreter"),a=x(n,"--of")?.split(",").map(c=>c.trim()).filter(Boolean);if(i===void 0||a===void 0||a.length===0)return w(e,"team companion requires --interpreter and --of");let l=r.findTeamMemberByAlias(o.id,i);if(l===null)return w(e,`member not found: ${i}`);for(let c of a){let u=r.findTeamMemberByAlias(o.id,c);if(u===null)return w(e,`member not found: ${c}`);r.insertTeamMemberCompanion({interpreter_id:l.id,companion_id:u.id})}return e.stdout.write(`recorded ${a.length} companion link(s)
|
|
2049
|
-
`),0}var _U,xT=b(()=>{"use strict";Ye();Lo();ss();$c();Ue();an();Xc();Gi();ke();xc();_U=`usage: lmctl team <
|
|
2051
|
+
`),0}var _U,xT=b(()=>{"use strict";Ye();Lo();ss();$c();Ue();an();Xc();Gi();ke();xc();_U=`usage: lmctl team create <name>
|
|
2052
|
+
lmctl team list [--json]
|
|
2053
|
+
lmctl team show <name> [--json]
|
|
2054
|
+
lmctl team add-member <team-name> --alias A --provider P [--model M] [--role R] [--sessiondir D] [--json]
|
|
2055
|
+
lmctl team seed <team-name> [--alias A] [--json]
|
|
2056
|
+
lmctl team refresh <team-name> --alias A [--json]
|
|
2057
|
+
lmctl team companion <team-name> --interpreter A --of B[,C]
|
|
2058
|
+
lmctl team list-roots [--json]
|
|
2050
2059
|
|
|
2051
2060
|
Manage DB-backed teams, members, and provider session lifecycle. Use seed or
|
|
2052
2061
|
refresh to create/update native provider sessions for team members.
|
|
2053
|
-
|
|
2054
|
-
Root team registry:
|
|
2055
|
-
list-roots [--json] List .lmctl root teams registered by lmctl seed.
|
|
2056
2062
|
`});var jT={};le(jT,{runInfo:()=>xU});import{execFileSync as Zd}from"node:child_process";import{dirname as vU}from"node:path";function $U(t){return t>=1e6?`${(t/1e6).toFixed(1)}M`:t>=1e3?`${Math.round(t/1e3)}K`:String(t)}async function xU(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${NU}
|
|
2057
2063
|
`),0;let r=D(t,["--provider","--run"],["--json","--help"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>2)return w(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let n=M(r,"--json"),s=x(r,"--run");if(s!==void 0){if(r.positionals.length>0)return w(e,"--run is mutually exclusive with positional [target] [alias]");if(x(r,"--provider")!==void 0)return w(e,"--run is mutually exclusive with --provider");let c=Number.parseInt(s,10);if(!Number.isFinite(c)||c<=0||String(c)!==s)return w(e,`invalid --run "${s}" (expected a positive integer run id)`);try{return await L(e,async u=>AU(e,u,c,n))}catch(u){return me(e,u)}}let o=pr(IU,{target:r.positionals[0],alias:r.positionals[1],flags:{provider:x(r,"--provider")}});if(o.mode==="error")return w(e,o.message);if(o.mode==="managed")return w(e,"health managed mode requires --run <id>");if(o.mode==="ai-team"&&o.alias===void 0){let c;try{c=await L(e,u=>Ne(o.teamfile,u))}catch(u){return w(e,`health: ${u instanceof Error?u.message:String(u)}`)}return RU(e,c,n)}let i,a,l;if(o.mode==="ai-team")try{let c=await L(e,u=>Nt(o.teamfile,o.alias,u));i=c.provider,a=c.sessionid,l=c.alias}catch(c){return c instanceof ge?w(e,c.message):me(e,c)}else if(a=o.sessionid,o.provider!==void 0)i=o.provider;else{let c=await ri(a);if(c.length===0)return w(e,`health: session "${a}" not found in any provider store`);if(c.length>1)return w(e,`health: session "${a}" matches multiple providers (${c.join(", ")}); pass --provider`);i=c[0]}return jU(e,i,a,l,n)}async function jU(t,e,r,n,s){let o;try{o=await Ar(r,e)}catch(a){return w(t,`health: failed to load session: ${a instanceof Error?a.message:String(a)}`)}if(o===null)return w(t,`health: session not found: ${r} (provider=${e})`);let i={provider:o.provider,sessionId:o.sessionId,cwd:o.cwd,messageCount:o.messageCount??null,...o.model!==void 0?{model:o.model}:{},...n!==void 0?{alias:n}:{},totalInputTokens:o.totalInputTokens??null,totalOutputTokens:o.totalOutputTokens??null,...o.totalCachedInputTokens!==void 0?{totalCachedInputTokens:o.totalCachedInputTokens}:{},createdAt:o.createdAt.toISOString(),modifiedAt:o.modifiedAt.toISOString()};return s?(B(t,i),0):(t.stdout.write(`Session: ${o.sessionId}
|
|
2058
2064
|
`),t.stdout.write(` Provider: ${o.provider}
|
|
@@ -2354,10 +2360,18 @@ remote https:// workflow after a trust prompt.
|
|
|
2354
2360
|
`),2;let c=r.spawn??OS,u=On.map(p=>If(p,c)).filter(p=>p.status==="ok"||p.status==="unverified").map(p=>p.provider);if(u.length===0)return e.stderr.write(`error: no provider CLI found on PATH; install/auth ${On.join("|")} first
|
|
2355
2361
|
`),2;if(!u.includes(i))return e.stderr.write(`error: ${i} is not an available provider (available: ${u.join(", ")})
|
|
2356
2362
|
`),2;let d=e.dal===void 0,f=e.dal??pe({path:ue()});try{f.setConfig(`workspace.${l}`,i)}finally{d&&f.close()}let m=Mn()??yr.default;return e.stdout.write(`workspace.${l} = ${i} (workspace: ${m})
|
|
2357
|
-
`),0}var KB,On,r2,n2,DS=b(()=>{"use strict";Ue();xS();ke();Ye();KB=`usage: lmctl workspace
|
|
2363
|
+
`),0}var KB,On,r2,n2,DS=b(()=>{"use strict";Ue();xS();ke();Ye();KB=`usage: lmctl workspace list [--json]
|
|
2364
|
+
lmctl workspace create <name> [--docroot PATH] [--json]
|
|
2365
|
+
lmctl workspace use <name> [--json]
|
|
2366
|
+
lmctl workspace show <name> [--json]
|
|
2367
|
+
lmctl workspace delete <name> --confirm [--force] [--json]
|
|
2368
|
+
lmctl workspace migrate [--json]
|
|
2369
|
+
lmctl workspace init [--name N] [--basedir DIR] [--provider1 P] [--provider2 P] [--provider3 P] [--json]
|
|
2370
|
+
lmctl [--workspace W] workspace set-provider <provider1|provider2|provider3> <concrete>
|
|
2358
2371
|
|
|
2359
2372
|
Manage isolated workspace state directories, active workspace selection,
|
|
2360
2373
|
legacy profile migration, and configured provider slots.
|
|
2374
|
+
delete requires --confirm; deleting default or active workspaces also requires --force.
|
|
2361
2375
|
`;On=["claude","codex","gemini","qwen"],r2={provider1:"claude",provider2:"codex",provider3:"gemini"},n2={provider1:"primary implementer",provider2:"independent reviewer",provider3:"auxiliary / tie-break"}});var US={};le(US,{runProject:()=>l2});import{existsSync as o2,statSync as i2}from"node:fs";import{join as FS}from"node:path";async function l2(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(a2),0;try{return await L(e,s=>{switch(r){case"create":return g2(n,e,s);case"list":return w2(n,e,s);case"show":return h2(n,e,s);case"status":return _2(n,e,s);case"workflow":return c2(n,e,s);default:return w(e,"usage: lmctl project <create|list|show|status|workflow>")}})}catch(s){return me(e,s)}}function c2(t,e,r){let[n,...s]=t;switch(n){case"add":return u2(s,e,r);case"list":return d2(s,e,r);case"show":return f2(s,e,r);case"remove":return m2(s,e,r);case"enable":return PS(s,e,r,!0);case"disable":return PS(s,e,r,!1);default:return w(e,"usage: lmctl project workflow <add|list|show|remove|enable|disable>")}}function u2(t,e,r){let n=D(t,["--condition","--params","--priority"]);if(n.error!==void 0)return w(e,n.error);let[s,o]=n.positionals;if(s===void 0||o===void 0||n.positionals.length!==2)return w(e,"usage: project workflow add <project> <workflow> [--condition JEXL] [--params JSON] [--priority N]");let i=r.findProjectByName(s);if(i===null)return w(e,`project not found: ${s}`);let a=r.getWorkflowByName(o);if(a===null)return w(e,`workflow not found: ${o}`);let l=x(n,"--condition")??null;if(l!==null)try{ar(l)}catch{return w(e,"invalid --condition JEXL")}let c=p2(x(n,"--params"));if(typeof c=="string")return w(e,c);let u=x(n,"--priority"),d=u===void 0?100:Number(u);if(!Number.isInteger(d))return w(e,`invalid --priority: ${u??""}`);let f=r.insertProjectWorkflow({project_id:i.id,workflow_id:a.id,condition:l,parameters_override:c?.json??null,priority:d});return M(n,"--json")?B(e,f):e.stdout.write(`added project workflow ${f.id}
|
|
2362
2376
|
`),0}function d2(t,e,r){let n=D(t,[]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0||n.positionals.length!==1)return w(e,"usage: project workflow list <project>");let o=r.findProjectByName(s);if(o===null)return w(e,`project not found: ${s}`);let i=r.listProjectWorkflows(o.id);return M(n,"--json")?B(e,i):e.stdout.write(`${i.map(a=>`${a.id} ${a.workflow_id} ${a.priority} ${a.enabled} ${a.condition??""}`).join(`
|
|
2363
2377
|
`)}${i.length>0?`
|
|
@@ -2369,10 +2383,21 @@ legacy profile migration, and configured provider slots.
|
|
|
2369
2383
|
`),0}function g2(t,e,r){let n=D(t,["--local-path","--workflow","--team","--default-branch","--owner","--repo","--test-argv","--durable-memory-mode"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals,o=x(n,"--owner"),i=x(n,"--repo"),a=o!==void 0&&i!==void 0?`${o}/${i}`:s;if(a===void 0)return w(e,`usage: project create <name> --local-path P --workflow W --team T [--default-branch B] [--test-argv '["go","test","./..."]'] OR project create --owner OWNER --repo REPO ...`);let l=r.getConfig("project.docroot"),c=a.indexOf("/"),u=c>0?a.slice(c+1):a,d=x(n,"--local-path")??(l!==null?FS(l,u):void 0),f=x(n,"--workflow"),m=x(n,"--team");if(d===void 0||f===void 0||m===void 0)return w(e,"project create requires --local-path (or `api config set project.docroot`), --workflow, and --team");if(r.getWorkflowByName(f)===null)return w(e,`workflow not found: ${f}`);let p=r.findTeamByName(m);if(p===null)return w(e,`team not found: ${m}`);let h=x(n,"--test-argv"),g=null;if(h!==void 0)try{let k=JSON.parse(h);if(!Array.isArray(k)||!k.every($=>typeof $=="string")||k.length===0)return w(e,`--test-argv must be a non-empty JSON array of strings (e.g. '["go","test","./..."]')`);g=JSON.stringify(k)}catch{return w(e,"--test-argv must be valid JSON")}let _=x(n,"--durable-memory-mode");if(_!==void 0&&_!=="folder"&&_!=="db")return w(e,'--durable-memory-mode must be "folder" or "db"');let T=_!==void 0?_:y2(d)||ns(d)?"folder":"db",E=r.insertProject({name:a,local_path:d,workflow_name:f,team_id:p.id,default_branch:x(n,"--default-branch")??null,test_argv:g,durable_memory_mode:T});return M(n,"--json")?B(e,E):e.stdout.write(`created project ${E.name}
|
|
2370
2384
|
`),0}function w2(t,e,r){let n=D(t,[]);if(n.error!==void 0)return w(e,n.error);let s=r.listProjects();return M(n,"--json")?B(e,s):e.stdout.write(`${s.map(o=>`${o.id} ${o.name} ${o.workflow_name}`).join(`
|
|
2371
2385
|
`)}${s.length>0?`
|
|
2372
|
-
`:""}`),0}function y2(t){try{let e=FS(t,"durable-memory");return o2(e)&&i2(e).isDirectory()}catch{return!1}}var a2,WS=b(()=>{"use strict";ke();fn();ss();a2=`usage: lmctl project <
|
|
2386
|
+
`:""}`),0}function y2(t){try{let e=FS(t,"durable-memory");return o2(e)&&i2(e).isDirectory()}catch{return!1}}var a2,WS=b(()=>{"use strict";ke();fn();ss();a2=`usage: lmctl project create <name> [--local-path P] --workflow W --team T [--default-branch B] [--test-argv JSON] [--durable-memory-mode folder|db] [--json]
|
|
2387
|
+
lmctl project create --owner OWNER --repo REPO --workflow W --team T [--local-path P] [--default-branch B] [--test-argv JSON] [--durable-memory-mode folder|db] [--json]
|
|
2388
|
+
lmctl project list [--json]
|
|
2389
|
+
lmctl project show <name> [--json]
|
|
2390
|
+
lmctl project status <name> [--json]
|
|
2391
|
+
lmctl project workflow add <project> <workflow> [--condition JEXL] [--params JSON] [--priority N] [--json]
|
|
2392
|
+
lmctl project workflow list <project> [--json]
|
|
2393
|
+
lmctl project workflow show <id> [--json]
|
|
2394
|
+
lmctl project workflow remove <id>
|
|
2395
|
+
lmctl project workflow enable <id> [--json]
|
|
2396
|
+
lmctl project workflow disable <id> [--json]
|
|
2373
2397
|
|
|
2374
2398
|
Create, list, inspect, and check projects. The workflow subcommand manages
|
|
2375
2399
|
per-project workflow bindings and routing conditions.
|
|
2400
|
+
If project create omits --local-path, project.docroot must be configured.
|
|
2376
2401
|
`});import{createHash as E2,randomBytes as b2}from"node:crypto";import{readFile as T2}from"node:fs/promises";function BS(t=new Date,e=b2(4)){let r=t.getUTCFullYear().toString().padStart(4,"0"),n=(t.getUTCMonth()+1).toString().padStart(2,"0"),s=t.getUTCDate().toString().padStart(2,"0"),o=t.getUTCHours().toString().padStart(2,"0"),i=t.getUTCMinutes().toString().padStart(2,"0"),a=t.getUTCSeconds().toString().padStart(2,"0"),l=e.toString("hex").slice(0,8).padEnd(8,"0");return`dxx-${r}${n}${s}-${o}${i}${a}-${l}`}function S2(t){return E2("sha256").update(t).digest("hex")}async function qS(t){return(await Promise.all(t.map(async({bundlePath:r,absPath:n})=>{let s=await T2(n);return{path:r,sha256:S2(s),size:s.byteLength}}))).sort((r,n)=>r.path<n.path?-1:r.path>n.path?1:0)}function HS(t){return{ticket_id:t.ticketId,lmctl_next_version:t.lmctlNextVersion,node_version:t.nodeVersion,platform:t.platform,generated_at:t.generatedAt.toISOString(),sanitized:t.sanitized,files:t.files}}var Af=b(()=>{"use strict"});import{spawnSync as JS}from"node:child_process";import{mkdir as Rf,writeFile as XS,readFile as k2,rm as GS}from"node:fs/promises";import{tmpdir as v2}from"node:os";import{dirname as KS,join as Of}from"node:path";async function VS(t){let e=t.stagingDir??Of(v2(),`lmctl-diag-${t.ticketId}`),r=Of(e,`diagnostic-${t.ticketId}`);await Rf(r,{recursive:!0});let n=[],s=async(d,f)=>{let m=Of(r,d);if(await Rf(KS(m),{recursive:!0}),typeof f=="string")await XS(m,f);else{let p=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);await XS(m,new Uint8Array(p))}n.push({bundlePath:d,absPath:m})},o=d=>`${JSON.stringify(d,null,2)}
|
|
2377
2402
|
`;if(t.data.serve!==void 0){let d=t.data.serve,f=d.pid===null?`no daemon (source=${d.pid_source})
|
|
2378
2403
|
`:`${d.pid}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lmctl-ai/lmctl",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.71",
|
|
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",
|