@tessl/cli 0.21.1 → 0.21.2

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.
Files changed (2) hide show
  1. package/dist/bundle.mjs +6 -6
  2. package/package.json +1 -1
package/dist/bundle.mjs CHANGED
@@ -88,7 +88,7 @@ return globalThis.Object.getOwnPropertyNames(e).reduce((t,r)=>({...t,[r]:Compute
88
88
  function Void(e){return CreateType({[Kind]:"Void",type:"void"},e)}var TypeBuilder=Object.freeze({__proto__:null,Any:Any$1,Argument,Array:Array$1,AsyncIterator,Awaited,BigInt:BigInt$1,Boolean:Boolean$1,Capitalize,Composite,Const,Constructor,ConstructorParameters,Date:Date$1,Enum,Exclude,Extends,Extract,Function:Function$1,Index,InstanceType,Instantiate,Integer,Intersect:Intersect$1,Iterator,KeyOf,Literal,Lowercase,Mapped,Module,Never,Not,Null,Number:Number$1,Object:Object$1,Omit,Optional,Parameters,Partial,Pick,Promise:Promise$1,Readonly,ReadonlyOptional,Record,Recursive,Ref,RegExp:RegExp$1,Required,Rest,ReturnType,String:String$1,Symbol:Symbol$1,TemplateLiteral,Transform:Transform$1,Tuple,Uint8Array:Uint8Array$1,Uncapitalize,Undefined,Union:Union$1,Unknown,Unsafe,Uppercase,Void});const Type=TypeBuilder;function _nullishCoalesce$12(e,t){return null!=e?e:t()}const ProjectConfigSchema=Type.Object({name:Type.Optional(Type.String({description:"Project name"})),
89
89
  ciCommand:Type.Optional(Type.Array(Type.String()))}),CONFIG_DIR_NAME=".tessl",AGENTS_MD_FILENAME="AGENTS.md",SYSTEM_PROMPT_FILENAME="tessl-system-prompt.md",TESSL_CONFIG_FILE_NAME="tessl-config.jsonc",TMP_DIR_NAME="tmp",DEFAULT_TESSL_DIRS={customToolDirectory:join(CONFIG_DIR_NAME,"tools"),frameworkDirectory:join(CONFIG_DIR_NAME,"framework"),tmpDirectory:join(CONFIG_DIR_NAME,TMP_DIR_NAME),testRunnerDirectory:join(CONFIG_DIR_NAME,TMP_DIR_NAME,"test-runners"),testResultsDirectory:join(CONFIG_DIR_NAME,TMP_DIR_NAME,"test-results"),sessionDataDirectory:join(CONFIG_DIR_NAME,TMP_DIR_NAME,"session-data"),toolOutputLogsDirectory:join(CONFIG_DIR_NAME,TMP_DIR_NAME,"tool-output-logs")};function getDefaultGlobalConfigDir(e,t){const r=_nullishCoalesce$12(t,()=>os$2.homedir()),n=_nullishCoalesce$12(_nullishCoalesce$12(e,()=>"production"),()=>"development");return path__default.join(r,"production"===n?".tessl":`.tessl_${n}`)}function getProvisionedEnvPath(e,t){
90
90
  return join$1(getDefaultGlobalConfigDir(e,t),"dotenv")}function getLocalCliEnvPath(){const e=fileURLToPath(import.meta.url),t=dirname(e),r=join$1(t,"..","..","..","..");return join$1(r,".cli.env")}function loadEnvAndWatch(){loadEnv(),setupFileWatchers()}function loadEnvFile(e){fs__default.existsSync(e)&&mainExports.config({path:e,override:!0,quiet:!0})}function loadEnv(){loadEnvFile(getProvisionedEnvPath("production")),process.env.TESSL_LLM_API_KEY?process.env.ANTHROPIC_AUTH_TOKEN=process.env.TESSL_LLM_API_KEY:delete process.env.ANTHROPIC_AUTH_TOKEN,process.env.TESSL_LLM_BASE_URL?process.env.ANTHROPIC_BASE_URL=process.env.TESSL_LLM_BASE_URL:delete process.env.ANTHROPIC_BASE_URL;const e=getClaudeCodeSdkModels();process.env.ANTHROPIC_MODEL=e.DEFAULT,process.env.ANTHROPIC_SMALL_FAST_MODEL=e.SMALL_FAST}let localCliWatcher=null,provisionedEnvWatcher=null,cleanupRegistered=!1;function createFileWatcher(e,t){const r=dirname(e),n=basename(e);if(!fs__default.existsSync(r))return null
91
- ;const i=watch(r,(e,r)=>{r!==n||"change"!==e&&"rename"!==e||t()});return i.on("error",()=>{}),i.unref(),i}function cleanup(){localCliWatcher&&(localCliWatcher.close(),localCliWatcher=null),provisionedEnvWatcher&&(provisionedEnvWatcher.close(),provisionedEnvWatcher=null)}function setupFileWatchers(){cleanup(),localCliWatcher=createFileWatcher(getLocalCliEnvPath(),loadEnv),provisionedEnvWatcher=createFileWatcher(getProvisionedEnvPath("production"),loadEnv),cleanupRegistered||(process.on("SIGINT",cleanup),process.on("SIGTERM",cleanup),cleanupRegistered=!0)}function getTesslCmdName(){return"tessl"}process.env={...process.env,ROLLUP_BUNDLING_CLI:!0,NODE_ENV:"production",GLOBAL_CONFIG_DIR:".tessl",STAMPED_REVISION:"c239ff5e4c64c85bb970e5403eb2556f98ad0f8d",STAMPED_RELEASE_DATE:"2025-09-16T11:14:27.886Z",STAMPED_VERSION:"v0.21.1",TESSL_BASE_API_URL:"https://api.tessl.io",WORKOS_CLIENT_ID:"client_01HXSHDD9KV92A4892CWHZZDDR",POSTHOG_API_KEY:"phc_S8tHJaPxa5ORnP0RVyyTaJHeCcft6XMqfjx9ZlJWvkO",
91
+ ;const i=watch(r,(e,r)=>{r!==n||"change"!==e&&"rename"!==e||t()});return i.on("error",()=>{}),i.unref(),i}function cleanup(){localCliWatcher&&(localCliWatcher.close(),localCliWatcher=null),provisionedEnvWatcher&&(provisionedEnvWatcher.close(),provisionedEnvWatcher=null)}function setupFileWatchers(){cleanup(),localCliWatcher=createFileWatcher(getLocalCliEnvPath(),loadEnv),provisionedEnvWatcher=createFileWatcher(getProvisionedEnvPath("production"),loadEnv),cleanupRegistered||(process.on("SIGINT",cleanup),process.on("SIGTERM",cleanup),cleanupRegistered=!0)}function getTesslCmdName(){return"tessl"}process.env={...process.env,ROLLUP_BUNDLING_CLI:!0,NODE_ENV:"production",GLOBAL_CONFIG_DIR:".tessl",STAMPED_REVISION:"c3c0b1ef0bb8947101538793801a6a224495bb07",STAMPED_RELEASE_DATE:"2025-09-16T12:42:03.852Z",STAMPED_VERSION:"v0.21.2",TESSL_BASE_API_URL:"https://api.tessl.io",WORKOS_CLIENT_ID:"client_01HXSHDD9KV92A4892CWHZZDDR",POSTHOG_API_KEY:"phc_S8tHJaPxa5ORnP0RVyyTaJHeCcft6XMqfjx9ZlJWvkO",
92
92
  POSTHOG_FEEDBACK_SURVEY_ID:"0197d0d3-6704-0000-e36e-569911acb8ee",POSTHOG_FEEDBACK_SURVEY_QUESTION_ID:"e34e48fc-938a-4af1-b255-3c55d6bdcbc7"},loadEnvAndWatch();var _globalThis$2="object"==typeof globalThis?globalThis:global,VERSION$a="1.9.0",re$1=/^(\d+)\.(\d+)\.(\d+)(-(.+))?$/;function _makeCompatibilityCheck(e){var t=new Set([e]),r=new Set,n=e.match(re$1);if(!n)return function(){return!1};var i=+n[1],s=+n[2],o=+n[3];if(null!=n[4])return function(t){return t===e};function a(e){return r.add(e),!1}function c(e){return t.add(e),!0}return function(e){if(t.has(e))return!0;if(r.has(e))return!1;var n=e.match(re$1);if(!n)return a(e);var u=+n[1],l=+n[2],d=+n[3];return null!=n[4]||i!==u?a(e):0===i?s===l&&o<=d?c(e):a(e):s<=l?c(e):a(e)}}var isCompatible=_makeCompatibilityCheck(VERSION$a),major=VERSION$a.split(".")[0],GLOBAL_OPENTELEMETRY_API_KEY=Symbol.for("opentelemetry.js.api."+major),_global$1=_globalThis$2;function registerGlobal(e,t,r,n){var i;void 0===n&&(n=!1)
93
93
  ;var s=_global$1[GLOBAL_OPENTELEMETRY_API_KEY]=null!==(i=_global$1[GLOBAL_OPENTELEMETRY_API_KEY])&&void 0!==i?i:{version:VERSION$a};if(!n&&s[e]){var o=new Error("@opentelemetry/api: Attempted duplicate registration of API: "+e);return r.error(o.stack||o.message),!1}if(s.version!==VERSION$a){o=new Error("@opentelemetry/api: Registration of version v"+s.version+" for "+e+" does not match previously registered API v"+VERSION$a);return r.error(o.stack||o.message),!1}return s[e]=t,r.debug("@opentelemetry/api: Registered a global for "+e+" v"+VERSION$a+"."),!0}function getGlobal(e){var t,r,n=null===(t=_global$1[GLOBAL_OPENTELEMETRY_API_KEY])||void 0===t?void 0:t.version;if(n&&isCompatible(n))return null===(r=_global$1[GLOBAL_OPENTELEMETRY_API_KEY])||void 0===r?void 0:r[e]}function unregisterGlobal(e,t){t.debug("@opentelemetry/api: Unregistering a global for "+e+" v"+VERSION$a+".");var r=_global$1[GLOBAL_OPENTELEMETRY_API_KEY];r&&delete r[e]}var __read$4=function(e,t){
94
94
  var r="function"==typeof Symbol&&e[Symbol.iterator];if(!r)return e;var n,i,s=r.call(e),o=[];try{for(;(void 0===t||t-- >0)&&!(n=s.next()).done;)o.push(n.value)}catch(e){i={error:e}}finally{try{n&&!n.done&&(r=s.return)&&r.call(s)}finally{if(i)throw i.error}}return o},__spreadArray$3=function(e,t,r){if(r||2===arguments.length)for(var n,i=0,s=t.length;i<s;i++)!n&&i in t||(n||(n=Array.prototype.slice.call(t,0,i)),n[i]=t[i]);return e.concat(n||Array.prototype.slice.call(t))},DiagComponentLogger=function(){function e(e){this._namespace=e.namespace||"DiagComponentLogger"}return e.prototype.debug=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return logProxy("debug",this._namespace,e)},e.prototype.error=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return logProxy("error",this._namespace,e)},e.prototype.info=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return logProxy("info",this._namespace,e)},e.prototype.warn=function(){
@@ -320,9 +320,9 @@ const r=process.env.OTEL_EXPORTER_OTLP_METRICS_PROTOCOL?.trim()||process.env.OTE
320
320
  })):"prometheus"===r?t.push(new d.PrometheusExporter):e.diag.warn(`Unsupported OTEL_METRICS_EXPORTER value: "${r}". Supported values are: otlp, console, prometheus, none.`)}),t)):t}();if(this._meterProviderConfig||o.length>0){const t=[];this._meterProviderConfig?.reader&&t.push(this._meterProviderConfig.reader),0===t.length&&o.forEach(e=>t.push(e));const r=new p.MeterProvider({resource:this._resource,views:this._meterProviderConfig?.views??[],readers:t});this._meterProvider=r,e.metrics.setGlobalMeterProvider(r);for(const t of this._instrumentations)t.setMeterProvider(e.metrics.getMeterProvider())}}shutdown(){const e=[];return this._tracerProvider&&e.push(this._tracerProvider.shutdown()),this._loggerProvider&&e.push(this._loggerProvider.shutdown()),this._meterProvider&&e.push(this._meterProvider.shutdown()),Promise.all(e).then(()=>{})}configureLoggerProviderFromEnv(){const t=(0,g.getStringListFromEnv)("OTEL_LOGS_EXPORTER")??[]
321
321
  ;if(0===t.length&&(e.diag.debug("OTEL_LOGS_EXPORTER is empty. Using default otlp exporter."),t.push("otlp")),t.includes("none"))return void e.diag.info('OTEL_LOGS_EXPORTER contains "none". Logger provider will not be initialized.');const r=[];t.forEach(t=>{if("otlp"===t){const t=((0,g.getStringFromEnv)("OTEL_EXPORTER_OTLP_LOGS_PROTOCOL")??(0,g.getStringFromEnv)("OTEL_EXPORTER_OTLP_PROTOCOL"))?.trim();switch(t){case"grpc":r.push(new o.OTLPLogExporter);break;case"http/json":r.push(new s.OTLPLogExporter);break;case"http/protobuf":case void 0:case"":r.push(new a.OTLPLogExporter);break;default:e.diag.warn(`Unsupported OTLP logs protocol: "${t}". Using http/protobuf.`),r.push(new a.OTLPLogExporter)}}else"console"===t?r.push(new i.ConsoleLogRecordExporter):e.diag.warn(`Unsupported OTEL_LOGS_EXPORTER value: "${t}". Supported values are: otlp, console, none.`)}),r.length>0&&(this._loggerProviderConfig={
322
322
  logRecordProcessors:r.map(e=>e instanceof i.ConsoleLogRecordExporter?new i.SimpleLogRecordProcessor(e):new i.BatchLogRecordProcessor(e))})}},sdk$1}function requireSrc$3(){return hasRequiredSrc$3||(hasRequiredSrc$3=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.NodeSDK=e.tracing=e.resources=e.node=e.metrics=e.logs=e.core=e.contextBase=e.api=void 0,e.api=require$$0$9,e.contextBase=require$$0$9,e.core=require$$1$6,e.logs=require$$2$2,e.metrics=require$$1$a,e.node=requireSrc$7(),e.resources=require$$5$3,e.tracing=require$$6$1;var t=requireSdk();Object.defineProperty(e,"NodeSDK",{enumerable:!0,get:function(){return t.NodeSDK}})}(src$8)),src$8}var srcExports$4=requireSrc$3(),srcExports$3=requireSrc$7();function register$1(){if(process.env.TELEMETRY_USER){const e="https://7530.tessl.io:443";process.env.OTEL_EXPORTER_OTLP_ENDPOINT=e,process.env.OTEL_EXPORTER_OTLP_PROTOCOL="http/json",
323
- process.env.OTEL_EXPORTER_OTLP_HEADERS=`Authorization=Basic ${Buffer.from(`${process.env.TELEMETRY_USER}:${process.env.TELEMETRY_PASSWORD}`).toString("base64")}`}const e=new srcExports$4.NodeSDK({resource:resourceFromAttributes({[ATTR_SERVICE_NAME]:"stepper",[ATTR_K8S_POD_NAME]:process.env.INJECTED_POD_NAME,[ATTR_K8S_NAMESPACE_NAME]:process.env.INJECTED_POD_NAMESPACE,[ATTR_K8S_POD_UID]:process.env.INJECTED_POD_UID,[ATTR_VCS_CHANGE_ID]:"c239ff5e4c64c85bb970e5403eb2556f98ad0f8d",[ATTR_VCS_REF_BASE_NAME]:"c239ff5e4c64c85bb970e5403eb2556f98ad0f8d"}),instrumentations:[new srcExports$5.GrpcInstrumentation({ignoreGrpcMethods:["Check"]})],spanProcessors:[new srcExports$3.SimpleSpanProcessor(process.env.TELEMETRY_USER?new OTLPTraceExporter$1:new srcExports$6.OTLPTraceExporter)]});return e.start(),{shutdown:async()=>{await e.shutdown()}}}"yes"===process.env.TESSL_DEBUG_MONITORING&&diag.setLogger(new DiagConsoleLogger,DiagLogLevel.INFO);const sdk=register$1();function isAbortError$3(e){
323
+ process.env.OTEL_EXPORTER_OTLP_HEADERS=`Authorization=Basic ${Buffer.from(`${process.env.TELEMETRY_USER}:${process.env.TELEMETRY_PASSWORD}`).toString("base64")}`}const e=new srcExports$4.NodeSDK({resource:resourceFromAttributes({[ATTR_SERVICE_NAME]:"stepper",[ATTR_K8S_POD_NAME]:process.env.INJECTED_POD_NAME,[ATTR_K8S_NAMESPACE_NAME]:process.env.INJECTED_POD_NAMESPACE,[ATTR_K8S_POD_UID]:process.env.INJECTED_POD_UID,[ATTR_VCS_CHANGE_ID]:"c3c0b1ef0bb8947101538793801a6a224495bb07",[ATTR_VCS_REF_BASE_NAME]:"c3c0b1ef0bb8947101538793801a6a224495bb07"}),instrumentations:[new srcExports$5.GrpcInstrumentation({ignoreGrpcMethods:["Check"]})],spanProcessors:[new srcExports$3.SimpleSpanProcessor(process.env.TELEMETRY_USER?new OTLPTraceExporter$1:new srcExports$6.OTLPTraceExporter)]});return e.start(),{shutdown:async()=>{await e.shutdown()}}}"yes"===process.env.TESSL_DEBUG_MONITORING&&diag.setLogger(new DiagConsoleLogger,DiagLogLevel.INFO);const sdk=register$1();function isAbortError$3(e){
324
324
  return"object"==typeof e&&null!==e&&"AbortError"===e.name}function someErrorIs(e,t,r=32){return!(r<=0)&&(!!t(e)||(!!(e instanceof AggregateError&&e.errors.some(e=>someErrorIs(e,t,r-1)))||!!(e instanceof Error&&"cause"in e&&someErrorIs(e.cause,t,r-1))))}const tracer$1=trace$1.getTracer("stepper/otel");let currentUser,bag;function setOtelUser(e){currentUser=e;const t=trace$1.getActiveSpan();currentUser&&t&&(t.setAttribute(ATTR_USER_ID,currentUser.id),t.setAttribute(ATTR_USER_EMAIL,currentUser.email))}async function withSpan(e,t){return tracer$1.startActiveSpan(e,async e=>{currentUser&&(e.setAttribute(ATTR_USER_ID,currentUser.id),e.setAttribute(ATTR_USER_EMAIL,currentUser.email));try{return await t(e)}catch(t){throw annotateSpanWithError(e,t),t}finally{e.end()}})}function annotateSpanWithError(e,t){let r;someErrorIs(t,e=>isAbortError$3(e))&&e.setAttribute("cancelled",!0),t instanceof Error&&(r=t.message),e.setStatus({code:SpanStatusCode.ERROR,message:r})}function execSyncFailsafe(e){try{
325
- return execSync(e,{stdio:["ignore","pipe","ignore"],encoding:"utf-8",cwd:import.meta.dirname}).trim()}catch(e){return"unknown"}}function isGitDirty(){return"clean"}function initSysinfo(e={}){bag||(bag={}),bag.gitRevision="c239ff5e4c64c85bb970e5403eb2556f98ad0f8d",bag.gitDirty=isGitDirty(),bag.releaseDate="2025-09-16T11:14:27.886Z",bag.version="v0.21.1",bag.osImplementation=os$2.type(),bag.osRelease=os$2.release(),bag.argv=JSON.stringify(process.argv),bag.nodeVersion=process.version,bag.nodeExecPath=process.execPath,bag.nodeFirstPath=execSyncFailsafe("which node"),Object.assign(bag,e)}function getSysinfo(){if(!bag)throw new Error("Sysinfo not initialized");return{...bag}}const GLOBAL_DIR_NAME=".tessl",PROJECTS_DIR_NAME="projects";function getGlobalDir(){const e=process.env.TESSL_GLOBAL_DIR;if(e&&""!==e.trim())return e;let t=GLOBAL_DIR_NAME;return join(homedir$1(),t)}function getProjectCacheDir(){const e=process.env.TESSL_PROJECT_CACHE_DIR;if(e&&""!==e.trim())return e
325
+ return execSync(e,{stdio:["ignore","pipe","ignore"],encoding:"utf-8",cwd:import.meta.dirname}).trim()}catch(e){return"unknown"}}function isGitDirty(){return"clean"}function initSysinfo(e={}){bag||(bag={}),bag.gitRevision="c3c0b1ef0bb8947101538793801a6a224495bb07",bag.gitDirty=isGitDirty(),bag.releaseDate="2025-09-16T12:42:03.852Z",bag.version="v0.21.2",bag.osImplementation=os$2.type(),bag.osRelease=os$2.release(),bag.argv=JSON.stringify(process.argv),bag.nodeVersion=process.version,bag.nodeExecPath=process.execPath,bag.nodeFirstPath=execSyncFailsafe("which node"),Object.assign(bag,e)}function getSysinfo(){if(!bag)throw new Error("Sysinfo not initialized");return{...bag}}const GLOBAL_DIR_NAME=".tessl",PROJECTS_DIR_NAME="projects";function getGlobalDir(){const e=process.env.TESSL_GLOBAL_DIR;if(e&&""!==e.trim())return e;let t=GLOBAL_DIR_NAME;return join(homedir$1(),t)}function getProjectCacheDir(){const e=process.env.TESSL_PROJECT_CACHE_DIR;if(e&&""!==e.trim())return e
326
326
  ;const t=getGlobalDir(),r=getProjectDir().replace(/[/\\:]/g,"-").replace(/^-+/,"");return join(t,PROJECTS_DIR_NAME,r)}function getProjectDir(e=!1){const t=process.env.TESSL_PROJECT_DIR;if(t&&""!==t.trim())return t;let r=process.cwd();for(;;){const t=join(r,CONFIG_DIR_NAME);if(existsSync(t))return r;const n=dirname$1(r);if(n===r||n===homedir$1()){if(e)throw new Error("Tessl project root not found");return process.cwd()}r=n}}const T_AND_C_FILE="terms-and-conditions",T_AND_C_URL="https://tessl.io/policies/terms",T_AND_C_QUESTION=`You'll need to review and accept our Terms of Service at ${T_AND_C_URL} before running Tessl.\n\nAccept Terms of Service? [Y/n] `;async function checkLegal(){const e=getGlobalDir(),t=join$1(e,T_AND_C_FILE);if(!existsSync$1(t)||"accepted"!==readFileSync(t,"utf-8")){const e=createInterface({input:process.stdin,output:process.stdout}),r=await new Promise(t=>{e.question(T_AND_C_QUESTION,r=>{e.close(),t(r.toLowerCase())})});if("n"!==r){const e=dirname(t)
327
327
  ;return existsSync$1(e)||mkdirSync(e,{recursive:!0}),writeFileSync(t,"accepted","utf-8"),!0}return!1}return!0}const balanced=(e,t,r)=>{const n=e instanceof RegExp?maybeMatch(e,r):e,i=t instanceof RegExp?maybeMatch(t,r):t,s=null!==n&&null!=i&&range$2(n,i,r);return s&&{start:s[0],end:s[1],pre:r.slice(0,s[0]),body:r.slice(s[0]+n.length,s[1]),post:r.slice(s[1]+i.length)}},maybeMatch=(e,t)=>{const r=t.match(e);return r?r[0]:null},range$2=(e,t,r)=>{let n,i,s,o,a,c=r.indexOf(e),u=r.indexOf(t,c+1),l=c;if(c>=0&&u>0){if(e===t)return[c,u];for(n=[],s=r.length;l>=0&&!a;){if(l===c)n.push(l),c=r.indexOf(e,l+1);else if(1===n.length){const e=n.pop();void 0!==e&&(a=[e,u])}else i=n.pop(),void 0!==i&&i<s&&(s=i,o=u),u=r.indexOf(t,l+1);l=c<u&&c>=0?c:u}n.length&&void 0!==o&&(a=[s,o])}return a
328
328
  },escSlash="\0SLASH"+Math.random()+"\0",escOpen="\0OPEN"+Math.random()+"\0",escClose="\0CLOSE"+Math.random()+"\0",escComma="\0COMMA"+Math.random()+"\0",escPeriod="\0PERIOD"+Math.random()+"\0",escSlashPattern=new RegExp(escSlash,"g"),escOpenPattern=new RegExp(escOpen,"g"),escClosePattern=new RegExp(escClose,"g"),escCommaPattern=new RegExp(escComma,"g"),escPeriodPattern=new RegExp(escPeriod,"g"),slashPattern=/\\\\/g,openPattern=/\\{/g,closePattern=/\\}/g,commaPattern=/\\,/g,periodPattern=/\\./g;function numeric(e){return isNaN(e)?e.charCodeAt(0):parseInt(e,10)}function escapeBraces(e){return e.replace(slashPattern,escSlash).replace(openPattern,escOpen).replace(closePattern,escClose).replace(commaPattern,escComma).replace(periodPattern,escPeriod)}function unescapeBraces(e){return e.replace(escSlashPattern,"\\").replace(escOpenPattern,"{").replace(escClosePattern,"}").replace(escCommaPattern,",").replace(escPeriodPattern,".")}function parseCommaParts(e){if(!e)return[""]
@@ -4558,9 +4558,9 @@ await e(t,_nullishCoalesce$d(r,()=>i.emitMgmt))}),i={uuid:r,parent:t.parent,lfTr
4558
4558
  const CLI_SESSION_KEY="cli-session-id",SESSION_EXPIRY_KEY="cli-session-expiry",MCP_PARENT_RUN_KEY="mcp-parent-run-id",SESSION_INACTIVITY_MS=18e5;class SessionManager{static async getCliSessionId(){const e=Date.now(),t=await projectCache().readText(CLI_SESSION_KEY),r=await projectCache().readText(SESSION_EXPIRY_KEY),n=r?parseInt(r,10):0;if(t&&n>e)return await this.extendCliSessionExpiry(),t;const i=v4();return await projectCache().writeText(CLI_SESSION_KEY,i),await this.extendCliSessionExpiry(),i}static async extendCliSessionExpiry(){const e=Date.now()+SESSION_INACTIVITY_MS;await projectCache().writeText(SESSION_EXPIRY_KEY,e.toString())}static generateMcpRunId(){return v4()}static async getCliSessionInfo(){return{sessionId:await this.getCliSessionId()}}static async setMcpParentRunId(e){await projectCache().writeText(MCP_PARENT_RUN_KEY,e)}static async getMcpToolInfo(){const e=await this.getCliSessionId(),t=await projectCache().readText(MCP_PARENT_RUN_KEY);return{
4559
4559
  runId:this.generateMcpRunId(),sessionId:e,parentRunId:t}}static async endCliSession(){try{await projectCache().writeText(SESSION_EXPIRY_KEY,"0")}catch(e){}}}function _nullishCoalesce$c(e,t){return null!=e?e:t()}function _optionalChain$f(e){let t,r=e[0],n=1;for(;n<e.length;){const i=e[n],s=e[n+1];if(n+=2,("optionalAccess"===i||"optionalCall"===i)&&null==r)return;"access"===i||"optionalAccess"===i?(t=r,r=s(r)):"call"!==i&&"optionalCall"!==i||(r=s((...e)=>r.call(t,...e)),t=void 0)}return r}async function createCliRequestContext(e,t){const{logger:r,langfuse:n}=e.monitoring,i=logManagementEvents(r.originalLogger,!0),s=createJsonlEventConsumer(),o=await SessionManager.getCliSessionInfo(),a=e.monitoring.analytics.getProjectId(),c=n.trace({name:"cli",userId:userIdentifier(e.monitoring.user),sessionId:o.sessionId,metadata:{...getSysinfo(),sessionId:o.sessionId,projectId:a}}),u=DEFAULT_TESSL_DIRS.customToolDirectory,l=u?[path__default.resolve(e.projectDir,u)]:[],d=await makeLookupTool({
4560
4560
  customToolDirs:l}),p=validateBaseEnv(process.env),h=[];e.inputDir&&h.push(nodeImportResolver(e.inputDir));const A=chainImportResolvers(h),f=getTesslClient(r,p,e.globalConfigDir),g={keys:{openAi:process.env.TESSL_LLM_API_KEY,fireworks:process.env.FIREWORKS_API_KEY,cerebras:process.env.CEREBRAS_API_KEY},cacheWith:{fs:await considerFsCaching()},apiEndpoint:{fireworks:process.env.FIREWORKS_API_ENDPOINT,openAi:process.env.TESSL_LLM_BASE_URL,cerebras:process.env.CEREBRAS_API_ENDPOINT},shareUsageData:_nullishCoalesce$c(e.monitoring.shareUsageData,()=>!0)},m=createRequestContext(async t=>{await i(t,m.emitMgmt),await s(t,m.emitMgmt),await _optionalChain$f([e,"access",e=>e.handleManagementEvent,"optionalCall",e=>e(t,m.emitMgmt)])},{lfTrace:c,logger:r,abortSignal:t.signal,lookupTool:d,resolveImport:A,llmFactory:g,tesslClient:f,projectConfig:e.projectConfig,projectDir:e.projectDir,userFeatureFlags:FeatureFlagsAlwaysReturnTrue,waitForInput:e.waitForInput,shutdown:s.shutdown});return m}
4561
- function _nullishCoalesce$b(e,t){return null!=e?e:t()}function _optionalChain$e(e){let t,r=e[0],n=1;for(;n<e.length;){const i=e[n],s=e[n+1];if(n+=2,("optionalAccess"===i||"optionalCall"===i)&&null==r)return;"access"===i||"optionalAccess"===i?(t=r,r=s(r)):"call"!==i&&"optionalCall"!==i||(r=s((...e)=>r.call(t,...e)),t=void 0)}return r}function getErrorProperty(e,t){return e&&"object"==typeof e&&t in e?e[t]:void 0}const executeToolInCli=async e=>{const{toolName:t,params:r,onStart:n,monitoring:{analytics:i},projectDir:s}=e;if("spec-registry"===getExistingFrameworkType(s))throw new ExpectedError("To run this command, you need to install the Tessl framework first. Re-run `tessl init` to install it.");const o=reqSchema.parse({steps:[{name:t,params:r}]});let a;if(1===o.steps.length){a=performance$2.now();const e=o.steps[0],t=builtInTools().every(t=>t.name!==e.name);i.toolStart({toolName:e.name,isAliased:!1,isCustom:t,executionMode:"local",params:_nullishCoalesce$b(e.params,()=>({}))})}
4562
- const c=e.fsd?void 0:function(e){return openFsd(e)}(e.projectDir),u=c?fsdiff(c):e.fsd,l=_nullishCoalesce$b(_optionalChain$e([c,"optionalAccess",e=>e.root]),()=>e.inputDir);_optionalChain$e([n,"optionalCall",e=>e({fsd:u,req:o})]);const d=new AbortController,p=()=>{d.abort()};process.once("SIGINT",p),process.once("SIGTERM",p);const h=await createCliRequestContext({...e,inputDir:l,fsd:u,req:o},d),A=await bindTools(h.lookupTool,o);for(const{tool:e}of A)checkToolCanRun(e,!0);let f=SUCCESS;try{f=await withHeartbeat(h,d,async e=>executeToolList(A,{rc:h,fsd:u},e))}catch(e){await h.emitMgmt({id:"crash",err:d.signal.aborted?{message:"Operation cancelled by user",name:"AbortError"}:serializeError(e),uuid:_nullishCoalesce$b(getErrorProperty(e,"uuid"),()=>h.uuid),parent:_nullishCoalesce$b(getErrorProperty(e,"parent"),()=>h.parent)}),f=FAILURE}finally{process.removeListener("SIGINT",p),process.removeListener("SIGTERM",p)}if(await finishWorkflowAndKillRequest(h),void 0!==a){
4563
- const e=performance$2.now()-a;i.toolEnd({toolName:o.steps[0].name,success:f===SUCCESS,exitCode:f,durationMs:e,result:{}})}return f};async function finishWorkflowAndKillRequest(e){await e.emitMgmt({id:"bye",traceUrl:e.lfTrace.getTraceUrl()}),await e.shutdown()}function hasUnwantedTesslMd(e){return fs__default.existsSync(join(e,"TESSL.md"))?stripIndent`
4561
+ function _nullishCoalesce$b(e,t){return null!=e?e:t()}function _optionalChain$e(e){let t,r=e[0],n=1;for(;n<e.length;){const i=e[n],s=e[n+1];if(n+=2,("optionalAccess"===i||"optionalCall"===i)&&null==r)return;"access"===i||"optionalAccess"===i?(t=r,r=s(r)):"call"!==i&&"optionalCall"!==i||(r=s((...e)=>r.call(t,...e)),t=void 0)}return r}function getErrorProperty(e,t){return e&&"object"==typeof e&&t in e?e[t]:void 0}const executeToolInCli=async e=>{const{toolName:t,params:r,onStart:n,monitoring:{analytics:i},projectDir:s}=e;if(![searchTool.name,installTool.name].includes(t)&&"spec-registry"===getExistingFrameworkType(s))throw new ExpectedError("To run this command, you need to install the Tessl framework first. Re-run `tessl init` to install it.");const o=reqSchema.parse({steps:[{name:t,params:r}]});let a;if(1===o.steps.length){a=performance$2.now();const e=o.steps[0],t=builtInTools().every(t=>t.name!==e.name);i.toolStart({toolName:e.name,isAliased:!1,isCustom:t,executionMode:"local",
4562
+ params:_nullishCoalesce$b(e.params,()=>({}))})}const c=e.fsd?void 0:function(e){return openFsd(e)}(e.projectDir),u=c?fsdiff(c):e.fsd,l=_nullishCoalesce$b(_optionalChain$e([c,"optionalAccess",e=>e.root]),()=>e.inputDir);_optionalChain$e([n,"optionalCall",e=>e({fsd:u,req:o})]);const d=new AbortController,p=()=>{d.abort()};process.once("SIGINT",p),process.once("SIGTERM",p);const h=await createCliRequestContext({...e,inputDir:l,fsd:u,req:o},d),A=await bindTools(h.lookupTool,o);for(const{tool:e}of A)checkToolCanRun(e,!0);let f=SUCCESS;try{f=await withHeartbeat(h,d,async e=>executeToolList(A,{rc:h,fsd:u},e))}catch(e){await h.emitMgmt({id:"crash",err:d.signal.aborted?{message:"Operation cancelled by user",name:"AbortError"}:serializeError(e),uuid:_nullishCoalesce$b(getErrorProperty(e,"uuid"),()=>h.uuid),parent:_nullishCoalesce$b(getErrorProperty(e,"parent"),()=>h.parent)}),f=FAILURE}finally{process.removeListener("SIGINT",p),process.removeListener("SIGTERM",p)}
4563
+ if(await finishWorkflowAndKillRequest(h),void 0!==a){const e=performance$2.now()-a;i.toolEnd({toolName:o.steps[0].name,success:f===SUCCESS,exitCode:f,durationMs:e,result:{}})}return f};async function finishWorkflowAndKillRequest(e){await e.emitMgmt({id:"bye",traceUrl:e.lfTrace.getTraceUrl()}),await e.shutdown()}function hasUnwantedTesslMd(e){return fs__default.existsSync(join(e,"TESSL.md"))?stripIndent`
4564
4564
  TESSL.md file found in project directory, which is no longer supported.
4565
4565
 
4566
4566
  To migrate your project, please follow these steps in your project directory:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tessl/cli",
3
- "version": "0.21.1",
3
+ "version": "0.21.2",
4
4
  "description": "Command line interface and MCP server for using Tessl",
5
5
  "types": "dist/cli.d.ts",
6
6
  "bin": {