@lmctl-ai/lmctl 0.2.175 → 0.2.177
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1 -0
- package/build-info.json +1 -1
- package/dist/cli/index.js +2 -2
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,7 @@ All notable public-preview changes for `@lmctl-ai/lmctl` are recorded here.
|
|
|
5
5
|
## Unreleased
|
|
6
6
|
|
|
7
7
|
- Preserve runtime error exit 1 when implicit dry preflight blocks execution, replaying captured core stdout before the unchanged located error. Static/check errors stay 2; explicit dry and usage semantics are unchanged. require now stops with runtime exit 1, including opt-out runs; explicit exit codes and signals are retained.
|
|
8
|
+
- Fix prompt stall notice repetition (Issue 043): emit the stall notice once per stall episode when quiet beyond the threshold, re-arming only after assistant text or tool activity resumes. Suppresses repeating notices during prolonged quiet periods.
|
|
8
9
|
|
|
9
10
|
- Fix dry preflight guard coverage after console output and lm_error; logs remain planned and recorded errors remain nonfatal. Bound implicit execution by 16,000 checkpoints and a 100 ms backstop (explicit timeout overrides these), reaching ordinary recursive guards without replaying expensive computation in full. Capped dry loops still cannot roll back effects before a later real failure.
|
|
10
11
|
|
package/build-info.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"sha": "
|
|
1
|
+
{"sha": "2afd4f227e1d64b3d443f400012c0210644b765b", "dirty": false, "builtAt": "2026-10-09T19:37:42.000Z"}
|
package/dist/cli/index.js
CHANGED
|
@@ -1660,8 +1660,8 @@ ${d}`)}`}Ve.renderGrid=wE;function vE(t,{headers:e,align:n,truncate:r,truncateTr
|
|
|
1660
1660
|
`)}var bO,kO,Qn=x(()=>{"use strict";bO=".lmctl",kO="state.db"});function wn(t){return(t.env??process.env).LMCTL_NON_INTERACTIVE==="1"}function za(t){return{...t,env:{...t.env??process.env,LMCTL_NON_INTERACTIVE:"1"}}}function Je(t){let e=t.env?.LMCTL_DB;return e!==void 0&&e.length>0?e:at(void 0,{...process.env,...t.env})}async function j(t,e){if(t.dal!==void 0)return e(t.dal);let n=it({path:Je(t)});try{return await e(n)}finally{n.close()}}function le(t,e,n=["--json"]){let r=new Set(e),s=new Set(n),o=[],i={};for(let a=0;a<t.length;a+=1){let l=t[a];if(!l.startsWith("--")){o.push(l);continue}if(s.has(l)){i[l]=!0;continue}if(!r.has(l))return{positionals:o,flags:i,error:`unknown flag: ${l}`};let c=t[a+1];if(c===void 0||c.startsWith("--"))return{positionals:o,flags:i,error:`missing value for ${l}`};i[l]=c,a+=1}return{positionals:o,flags:i}}function V(t,e){let n=t.flags[e];return typeof n=="string"?n:void 0}function z(t,e){return t.flags[e]===!0}function ee(t,e){t.stdout.write(`${JSON.stringify(e,null,2)}
|
|
1661
1661
|
`)}function D(t,e){return t.stderr.write(`error: ${e}
|
|
1662
1662
|
`),1}function Pr(){return(0,CE.formatClock)()}function Xo(t,e,n=5e3){let r=Date.now(),s=r,o=setInterval(()=>{let i=Date.now();i-s<n||t.stderr.write(e(Math.round((i-r)/1e3)))},n);return o.unref(),{poke:()=>{s=Date.now()},stop:()=>clearInterval(o)}}function AO(t=process.env){return t.LMCTL_SELF_SESSIONID!==void 0&&t.LMCTL_SELF_SESSIONID!==""||t.LMCTL_LAUNCH_SOURCE!==void 0&&t.LMCTL_LAUNCH_SOURCE!==""||t.LMCTL_INVOCATION_ID!==void 0&&t.LMCTL_INVOCATION_ID!==""||t.LMCTL_NON_INTERACTIVE==="1"}function NO(t){let e=t.env??process.env;return e.LMCTL_HEARTBEAT==="0"||e.LMCTL_HEARTBEAT==="never"?!1:e.LMCTL_HEARTBEAT==="1"||e.LMCTL_HEARTBEAT==="always"?!0:!t.stderr.isTTY?!1:!AO(e)}function RO(t){if(t==null)return!0;if(typeof t!="object")return!1;let e=t;return e.kind==="delta"?typeof e.chunk=="string"&&e.chunk.length>0:e.kind==="progress"&&e.event&&typeof e.event=="object"?LE(e.event):LE(e)}function LE(t){let e=t.kind;return e==="text"||e==="tool_use"||e==="tool_result"?!0:e==="thinking"||e==="system"||e==="api_retry"||e==="warning"?!1:e==="other"}function OE(t,e){if(NO(t)){let l=e.intervalMs??5e3,c=Date.now(),d=c,u=t.env??process.env,m=t.stderr.isTTY===!0&&u.TERM!=="dumb",f=!1,h=setInterval(()=>{let _=Date.now();if(_-d<l)return;let p=Math.round((_-c)/1e3),g=e.alias+": turn still running ("+p+"s elapsed)";m?(f=!0,t.stderr.write("\r\x1B[K"+g)):t.stderr.write(g+`
|
|
1663
|
-
`)},l);return h.unref(),{poke:()=>{d=Date.now()},stop:()=>{clearInterval(h),m&&f&&t.stderr.write("\r\x1B[K")}}}let n=t.env??process.env,r=e.stallThresholdMs;if(r===void 0){if(n.LMCTL_STALL_THRESHOLD_MS){let l=Number(n.LMCTL_STALL_THRESHOLD_MS);Number.isFinite(l)&&l>0&&(r=l)}else if(n.LMCTL_STALL_MINUTES){let l=Number(n.LMCTL_STALL_MINUTES);Number.isFinite(l)&&l>0&&(r=l*6e4)}}(r===void 0||r<=0)&&(r=10*6e4);let s=Math.min(1e3,r),o=Date.now(),i
|
|
1664
|
-
`;t.stderr.write(u)}},s);return a.unref(),{poke:l=>{RO(l)&&(o=Date.now(),i
|
|
1663
|
+
`)},l);return h.unref(),{poke:()=>{d=Date.now()},stop:()=>{clearInterval(h),m&&f&&t.stderr.write("\r\x1B[K")}}}let n=t.env??process.env,r=e.stallThresholdMs;if(r===void 0){if(n.LMCTL_STALL_THRESHOLD_MS){let l=Number(n.LMCTL_STALL_THRESHOLD_MS);Number.isFinite(l)&&l>0&&(r=l)}else if(n.LMCTL_STALL_MINUTES){let l=Number(n.LMCTL_STALL_MINUTES);Number.isFinite(l)&&l>0&&(r=l*6e4)}}(r===void 0||r<=0)&&(r=10*6e4);let s=Math.min(1e3,r),o=Date.now(),i=!1,a=setInterval(()=>{let c=Date.now()-o;if(c>=r&&!i){i=!0;let d=Math.max(1,Math.floor(c/6e4)),u=e.alias+": no assistant output or tool activity for "+d+" min (reasoning events may still be arriving; inspect with: lmctl tail "+e.teamfile+" "+e.alias+`)
|
|
1664
|
+
`;t.stderr.write(u)}},s);return a.unref(),{poke:l=>{RO(l)&&(o=Date.now(),i=!1)},stop:()=>{clearInterval(a)}}}function bt(t,e){let n=e instanceof Error?e.message:String(e);return t.stderr.write(`internal error: ${n}
|
|
1665
1665
|
`),2}function bs(t){if(t===void 0)return null;let e=Number.parseInt(t,10);return Number.isInteger(e)&&e>0?e:null}function Qa(t){if(t.stdout!==process.stdout||xE)return;xE=!0;let e=n=>{throw n.code==="EPIPE"&&process.exit(0),process.stdout.off("error",e),n};process.stdout.on("error",e)}var CE,xE,ce=x(()=>{"use strict";Gt();CE=Lt(It(),1);Qn();xE=!1});function Fr(t){return t.replace(/\x1b\[[0-9;]*[a-zA-Z]/g,"")}var Za=x(()=>{"use strict"});import{randomUUID as DO}from"node:crypto";import{chmodSync as ME,mkdirSync as MO,readdirSync as $O,statSync as PO,unlinkSync as FO,writeFileSync as UO}from"node:fs";import{homedir as jO,tmpdir as WO}from"node:os";import{join as Vo}from"node:path";function Cu(t){return Fr(t.replace(/\x1b\][^\x07\x1b]*(?:\x07|\x1b\\|$)/g,"")).replace(/[\x00-\x08\x0b\x0c\x0e-\x1f\x7f-\x9f]/g,"\uFFFD")}function Jo(t){return Cu(t).replace(/-----BEGIN [A-Z0-9 ]*PRIVATE KEY-----[\s\S]*?(?:-----END [A-Z0-9 ]*PRIVATE KEY-----|$)/g,"[REDACTED_PRIVATE_KEY]").replace(/\b((?:set-)?cookie\s*:[ \t]*)[^\r\n]+/gi,"$1[REDACTED]").replace(/\b([a-z][a-z0-9+.-]*:\/\/[^\s/:@]*):[^\s/@]+@/gi,"$1:[REDACTED]@").replace(/\bBearer\s+(?=[A-Za-z0-9._~+/-]{12,}\b)(?=[A-Za-z0-9._~+/-]*[0-9._~+/-])[A-Za-z0-9._~+/-]{12,}/gi,"Bearer [REDACTED]").replace(VO,"$1[REDACTED]").replace(/\b((?:[A-Z0-9]+_)*(?:KEY|TOKEN|SECRET|PASSWORD|PASSWD|CREDENTIALS?)(?:_[A-Z0-9]+)*=)(?!\[REDACTED\])(?:"[^"]*"|'[^']*'|[^\s,;]+)/g,"$1[REDACTED]").replace(/([?&](?:key|sig|signature)=)[^&\s'"]+/gi,"$1[REDACTED]").replace(/\bsk-[A-Za-z0-9_-]{12,}\b/g,"[REDACTED_SECRET]").replace(/\b(?:gh[pousr]_[A-Za-z0-9]{20,}|github_pat_[A-Za-z0-9_]{20,}|glpat-[A-Za-z0-9_-]{16,}|xox[abeprs]-[A-Za-z0-9-]{10,})/g,"[REDACTED_SECRET]").replace(/\bAIza[0-9A-Za-z_-]{20,}\b/g,"[REDACTED_SECRET]").replace(/\bAKIA[0-9A-Z]{16}\b/g,"[REDACTED_SECRET]").replace(/\beyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\b/g,"[REDACTED_JWT]")}function JO(){let t=process.env.LMCTL_HOME||(process.env.NODE_ENV==="test"?Vo(WO(),`lmctl-test-${process.pid}`,".lmctl"):Vo(process.env.HOME||jO(),".lmctl"));return Vo(t,"provider-errors")}function KO(t,e,n){if(t.length<=e)return t;let r=Math.floor(e*.2),s=e-r,o=t.length-e;return`${t.slice(0,r)}
|
|
1666
1666
|
\u2026 ${o} characters of ${n} \u2026
|
|
1667
1667
|
${t.slice(-s)}`}function YO(t,e){try{let n=$O(t).filter(s=>GO.test(s)).sort().map(s=>{let o=Vo(t,s);return{path:o,size:PO(o).size}}),r=n.reduce((s,o)=>s+o.size,0);for(let s=0;s<n.length&&(n.length-s>XO||r>qO);s++){let o=n[s];o.path!==e&&(FO(o.path),r-=o.size)}}catch{}}function zO(t,e){let n=JO(),r=Vo(n,`stderr-${Date.now()}-${process.pid}-${DO()}.log`);try{MO(n,{recursive:!0,mode:448}),ME(n,448);let s=`[${new Date().toISOString()}] provider=${e}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lmctl-ai/lmctl",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.177",
|
|
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",
|