@lotagate/cli 0.1.27 → 0.1.28

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.
@@ -1 +1 @@
1
- import m from"node:crypto";import a from"node:fs/promises";import p from"node:path";import{CliError as M}from"../../domain/errors/cli-error.js";import{CLI_ERROR_CODES as S}from"../../domain/errors/error-codes.js";import{isAlreadyExists as T,isFileNotFound as u}from"./fs-errors.js";import{currentProcessStartTimeMs as E,readProcessStartTimeMs as h}from"../platform/process-identity.js";import{DEFAULT_LOCK_STALE_MS as A,DEFAULT_LOCK_TIMEOUT_MS as _,LOCK_RETRY_MS as C,PROCESS_START_TIME_CACHE_MS as L,PROCESS_START_TIME_TOLERANCE_MS as g}from"./filesystem-constants.js";async function J(e,r,t=384){await a.mkdir(p.dirname(e),{recursive:!0});const i=`${e}.tmp-${process.pid}-${m.randomUUID()}`;try{await a.writeFile(i,r,{mode:t}),await a.rename(i,e)}finally{await a.rm(i,{force:!0})}}async function W(e,r){const t=`${r}.backup-${process.pid}-${m.randomUUID()}`;let i=!1,o=!1;try{try{await a.rename(r,t),i=!0}catch(n){if(!u(n))throw n}try{await a.rename(e,r)}catch(n){if(i)try{await a.rename(t,r)}catch(s){throw o=!0,new AggregateError([n,s],`Installation and recovery failed. Previous contents are preserved at ${t}.`)}throw n}}finally{o||await a.rm(t,{recursive:!0,force:!0})}}async function k(e){const r=await a.open(e,"wx",384);try{return await r.writeFile(JSON.stringify({pid:process.pid,processStartTimeMs:E(),createdAt:new Date().toISOString()})),r}catch(t){throw await l(r,e),t}}async function v(e,r){if(T(e))return!0;if(!w(e))return!1;try{return await a.stat(r),!0}catch(t){return u(t)||w(t)}}async function l(e,r){try{await e.close()}finally{await a.rm(r,{force:!0})}}async function B(e,r,t={}){const i=await O(e,t);try{return await r()}finally{await i()}}async function O(e,r={}){const t=`${e}.lock`,i=r.timeoutMs??_,o=r.staleMs??A;await a.mkdir(p.dirname(e),{recursive:!0});const n=Date.now()+i,s=new Map;let c;for(;c===void 0;)try{c=await k(t)}catch(d){if(!await v(d,t))throw d;if(await F(t,o,s))continue;if(Date.now()>=n)throw new M(S.CONFIG_LOCKED,`Configuration file is locked: ${e}`,{category:"config",userMessage:r.userMessage??"A configuration update is already in progress. Try again shortly.",retryable:!0});await new Promise(y=>setTimeout(y,C))}let f=!1;return async()=>{f||(f=!0,await l(c,t))}}function w(e){return typeof e=="object"&&e!==null&&"code"in e&&(e.code==="EPERM"||e.code==="EACCES")}async function F(e,r,t=new Map){let i;try{i=await a.stat(e)}catch(n){if(u(n))return!1;throw n}if(Date.now()-i.mtimeMs<r)return!1;let o={};try{o=R(JSON.parse(await a.readFile(e,"utf8")))}catch{}return o.pid!==void 0&&await b(o,t)?!1:(await a.rm(e,{force:!0}),!0)}function R(e){if(typeof e!="object"||e===null)return{};const r=e;return{...typeof r.pid=="number"&&Number.isSafeInteger(r.pid)&&r.pid>0?{pid:r.pid}:{},...typeof r.processStartTimeMs=="number"&&Number.isFinite(r.processStartTimeMs)?{processStartTimeMs:r.processStartTimeMs}:{}}}async function b(e,r){const t=e.pid;if(t===void 0||!x(t))return!1;if(e.processStartTimeMs===void 0)return!0;const i=await D(t,r);return i===void 0?!0:Math.abs(i-e.processStartTimeMs)<=g}async function D(e,r){const t=Date.now(),i=r.get(e);if(i!==void 0&&t-i.checkedAt<L)return i.startTimeMs;const o=await h(e);return r.set(e,{checkedAt:t,...o===void 0?{}:{startTimeMs:o}}),o}function x(e){if(e===process.pid)return!0;try{return process.kill(e,0),!0}catch(r){return r instanceof Error&&"code"in r&&r.code==="EPERM"}}export{k as acquireAdvisoryFileLock,O as acquireFileLock,J as atomicWriteFile,v as isAdvisoryLockContention,F as recoverStaleAdvisoryLock,l as releaseAdvisoryFileLock,W as replaceDirectoryWithRollback,B as withFileLock};
1
+ import m from"node:crypto";import a from"node:fs/promises";import p from"node:path";import{CliError as M}from"../../domain/errors/cli-error.js";import{CLI_ERROR_CODES as S}from"../../domain/errors/error-codes.js";import{isAlreadyExists as T,isFileNotFound as u}from"./fs-errors.js";import{currentProcessStartTimeMs as E,readProcessStartTimeMs as h}from"../platform/process-identity.js";import{DEFAULT_LOCK_STALE_MS as A,DEFAULT_LOCK_TIMEOUT_MS as _,LOCK_RETRY_MS as C,PROCESS_START_TIME_CACHE_MS as L,PROCESS_START_TIME_TOLERANCE_MS as g}from"./filesystem-constants.js";async function J(e,r,t=384){await a.mkdir(p.dirname(e),{recursive:!0});const i=`${e}.tmp-${process.pid}-${m.randomUUID()}`;try{await a.writeFile(i,r,{mode:t}),await a.rename(i,e)}finally{await a.rm(i,{force:!0})}}async function W(e,r){const t=`${r}.backup-${process.pid}-${m.randomUUID()}`;let i=!1,n=!1;try{try{await a.rename(r,t),i=!0}catch(o){if(!u(o))throw o}try{await a.rename(e,r)}catch(o){if(i)try{await a.rename(t,r)}catch(s){throw n=!0,new AggregateError([o,s],`Installation and recovery failed. Previous contents are preserved at ${t}.`)}throw o}}finally{n||await a.rm(t,{recursive:!0,force:!0})}}async function k(e){const r=await a.open(e,"wx",384);try{return await r.writeFile(JSON.stringify({pid:process.pid,processStartTimeMs:E(),createdAt:new Date().toISOString()})),r}catch(t){throw await w(r,e),t}}async function v(e,r){if(T(e))return!0;if(!l(e))return!1;try{return await a.stat(r),!0}catch(t){return u(t)||l(t)}}async function w(e,r){try{await e.close()}finally{await a.rm(r,{force:!0})}}async function B(e,r,t={}){const i=await O(e,t);try{return await r()}finally{await i()}}async function O(e,r={}){const t=`${e}.lock`,i=r.timeoutMs??_,n=r.staleMs??A;await a.mkdir(p.dirname(e),{recursive:!0});const o=Date.now()+i,s=new Map;let c;for(;c===void 0;)try{c=await k(t)}catch(d){if(!await v(d,t))throw d;if(await F(t,n,s))continue;if(Date.now()>=o)throw new M(S.CONFIG_LOCKED,`Configuration file is locked: ${e}`,{category:"config",userMessage:r.userMessage??"A configuration update is already in progress. Try again shortly.",retryable:!0});await new Promise(y=>setTimeout(y,C))}let f=!1;return async()=>{f||(f=!0,await w(c,t))}}function l(e){return typeof e=="object"&&e!==null&&"code"in e&&(e.code==="EPERM"||e.code==="EACCES")}async function F(e,r,t=new Map){let i;try{i=await a.stat(e)}catch(o){if(u(o))return!1;throw o}let n={};try{n=R(JSON.parse(await a.readFile(e,"utf8")))}catch{}return n.pid!==void 0&&!await b(n,t)?(await a.rm(e,{force:!0}),!0):Date.now()-i.mtimeMs<r||n.pid!==void 0?!1:(await a.rm(e,{force:!0}),!0)}function R(e){if(typeof e!="object"||e===null)return{};const r=e;return{...typeof r.pid=="number"&&Number.isSafeInteger(r.pid)&&r.pid>0?{pid:r.pid}:{},...typeof r.processStartTimeMs=="number"&&Number.isFinite(r.processStartTimeMs)?{processStartTimeMs:r.processStartTimeMs}:{}}}async function b(e,r){const t=e.pid;if(t===void 0||!x(t))return!1;if(e.processStartTimeMs===void 0)return!0;const i=await D(t,r);return i===void 0?!0:Math.abs(i-e.processStartTimeMs)<=g}async function D(e,r){const t=Date.now(),i=r.get(e);if(i!==void 0&&t-i.checkedAt<L)return i.startTimeMs;const n=await h(e);return r.set(e,{checkedAt:t,...n===void 0?{}:{startTimeMs:n}}),n}function x(e){if(e===process.pid)return!0;try{return process.kill(e,0),!0}catch(r){return r instanceof Error&&"code"in r&&r.code==="EPERM"}}export{k as acquireAdvisoryFileLock,O as acquireFileLock,J as atomicWriteFile,v as isAdvisoryLockContention,F as recoverStaleAdvisoryLock,w as releaseAdvisoryFileLock,W as replaceDirectoryWithRollback,B as withFileLock};
package/dist/version.d.ts CHANGED
@@ -1 +1 @@
1
- export declare const CLI_VERSION = "0.1.27";
1
+ export declare const CLI_VERSION = "0.1.28";
package/dist/version.js CHANGED
@@ -1 +1 @@
1
- const o="0.1.27";export{o as CLI_VERSION};
1
+ const o="0.1.28";export{o as CLI_VERSION};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lotagate/cli",
3
- "version": "0.1.27",
3
+ "version": "0.1.28",
4
4
  "description": "Enterprise-grade terminal client for LotaGate AI agents.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -71,12 +71,12 @@
71
71
  "tiktoken": "^1.0.22"
72
72
  },
73
73
  "optionalDependencies": {
74
- "@lotagate/cli-native-linux-arm64-gnu": "0.1.27",
75
- "@lotagate/cli-native-linux-x64-gnu": "0.1.27",
76
- "@lotagate/cli-native-macos-arm64": "0.1.27",
77
- "@lotagate/cli-native-macos-x64": "0.1.27",
78
- "@lotagate/cli-native-windows-arm64": "0.1.27",
79
- "@lotagate/cli-native-windows-x64": "0.1.27"
74
+ "@lotagate/cli-native-linux-arm64-gnu": "0.1.28",
75
+ "@lotagate/cli-native-linux-x64-gnu": "0.1.28",
76
+ "@lotagate/cli-native-macos-arm64": "0.1.28",
77
+ "@lotagate/cli-native-macos-x64": "0.1.28",
78
+ "@lotagate/cli-native-windows-arm64": "0.1.28",
79
+ "@lotagate/cli-native-windows-x64": "0.1.28"
80
80
  },
81
81
  "devDependencies": {
82
82
  "@eslint/js": "9.39.5",