@crewx/sdk 0.9.0-rc.181 → 0.9.0-rc.182
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/app/app.d.ts +1 -0
- package/dist/app/index.js +8 -8
- package/dist/esm/app/index.js +7 -7
- package/dist/esm/index.js +294 -280
- package/dist/esm/publish/index.js +2 -2
- package/dist/esm/skills/index.js +2 -2
- package/dist/index.d.ts +3 -3
- package/dist/index.js +296 -282
- package/dist/mcp-app/agent-access.d.ts +8 -1
- package/dist/mcp-app/index.d.ts +1 -0
- package/dist/mcp-app/view-call.d.ts +7 -0
- package/dist/mcp-app/workspace-snapshot.d.ts +2 -1
- package/dist/publish/index.js +2 -2
- package/dist/skills/index.js +2 -2
- package/dist/ui-instance/index.d.ts +2 -2
- package/dist/ui-instance/store.d.ts +2 -1
- package/dist/ui-instance/types.d.ts +39 -0
- package/package.json +1 -1
package/dist/app/app.d.ts
CHANGED
|
@@ -72,6 +72,7 @@ export interface ToolOptions {
|
|
|
72
72
|
readonly schedule?: ToolScheduleDeclaration;
|
|
73
73
|
readonly job?: ToolJobDeclaration;
|
|
74
74
|
readonly jobAccess?: readonly AppJobOperation[];
|
|
75
|
+
readonly viewCall?: true;
|
|
75
76
|
}
|
|
76
77
|
export interface AppContext {
|
|
77
78
|
readonly instanceId: string;
|
package/dist/app/index.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
'use strict';var fs=require('fs'),path=require('path'),util=require('util'),child_process=require('child_process'),crypto=require('crypto'),os=require('os'),net=require('net'),console$1=require('console'),stream=require('stream');var L=["text/plain","application/json"];var W=[5,15,30,60],v=Object.freeze({min:15e3,max:6e5,default:3e5}),It=1,Be="schedule:",Pt="schedule",Tt="exit 78",Sn=["standby","disabled","draining","degraded"],Ct=["cron","cron_manual","app_enable"],kt=/^[A-Z][A-Z0-9_]{0,63}$/u;function Rn(n){return typeof n=="string"&&kt.test(n)}var wn=["status","everyMinutes","lastStartedAt","lastFinishedAt","lastOutcome","lastErrorCode","nextRunAt","periodic","periodicReason"],Nt=["unset","on","off"],Jt=["available","unavailable"],Me=64,Dt=128;function In(n){return W.includes(n)}function Ue(n){return Number.isSafeInteger(n)&&n>=v.min&&n<=v.max}function Pn(n){return Sn.includes(n)}function Tn(n){if(!xt(n)||Object.keys(n).length!==wn.length||!wn.every(r=>Object.hasOwn(n,r))||typeof n.status!="string"||!Nt.includes(n.status)||!In(n.everyMinutes)||!ue(n.lastStartedAt,Me)||!ue(n.lastFinishedAt,Me)||!ue(n.lastOutcome,Dt)||!ue(n.nextRunAt,Me)||n.lastErrorCode!==null&&!Rn(n.lastErrorCode)||typeof n.periodic!="string"||!Jt.includes(n.periodic))return;let t=n.periodic;if(!(t==="available"?n.periodicReason!==null:!Pn(n.periodicReason))&&!(n.nextRunAt!==null&&(n.status!=="on"||t!=="available")))return Object.freeze({status:n.status,everyMinutes:n.everyMinutes,lastStartedAt:n.lastStartedAt,lastFinishedAt:n.lastFinishedAt,lastOutcome:n.lastOutcome,lastErrorCode:n.lastErrorCode,nextRunAt:n.nextRunAt,periodic:t,periodicReason:n.periodicReason})}function ue(n,e){return n===null||typeof n=="string"&&n.length>0&&n.length<=e}function xt(n){if(n===null||typeof n!="object"||Array.isArray(n))return false;let e=Object.getPrototypeOf(n);return e===Object.prototype||e===null}var j=Object.freeze({min:6e4,max:18e5,default:6e5}),Ft=Object.freeze({min:1e3,max:12e4,default:3e4}),Lt=1,Cn="crewx/appJobs",kn=1,He=["starting","running","stopping","finished"],qe=["succeeded","failed","timed_out","cancelled","shutdown","interrupted"],le=["cancelled","timed_out","shutdown"],Ve=["manual","schedule"],vt=/^[a-z][a-z0-9_]{0,63}$/u,jt=/^[A-Z][A-Z0-9_]{0,63}$/u,pe=["start","status","cancel"],Xe=["APP_JOB_NOT_DECLARED","APP_JOB_NOT_AUTHORIZED","APP_JOB_SELF_START","APP_JOB_OWNER_INVALID","APP_JOB_DEFINITION_INVALID","APP_JOB_DEFINITION_CHANGED","APP_JOB_DEADLINE_INVALID","APP_JOB_SHUTTING_DOWN","APP_JOB_OWNER_MISMATCH","APP_JOB_STALE_HANDLE","APP_JOB_NOT_ACTIVE","APP_JOB_NOT_GRANTED"],Ge="APP_JOB_RUN_REQUIRED";function We(n){return Number.isSafeInteger(n)&&n>=j.min&&n<=j.max}function M(n){return typeof n=="string"&&jt.test(n)}function B(n){return typeof n=="string"&&vt.test(n)}function z(n){return pe.includes(n)}function Mt(n){return n?.some(({name:e,version:t})=>e===Cn&&t===kn)===true}var Nn=Symbol;Nn.metadata===void 0&&Object.defineProperty(Symbol,"metadata",{configurable:false,value:Symbol.for("Symbol.metadata")});var Bt=Nn.metadata,$=Symbol.for("crewx.app.tool-metadata"),f=class extends Error{code;detail;outcome;constructor(e,t=null,r){super(e),this.name="AppError",this.code=e,this.detail=t,this.outcome=$e(r?.outcome);}};function $e(n){return n==="rejected"?"rejected":"failed"}var ze=class{static devtools=process.env.CREWX_APP_DEV==="1"?Object.freeze({log:true}):void 0;currentState;stateWasSet=false;answerBody;answerRange;callContext;callSchedule;callJobs;callJobRun;scheduleDirective;workspaceRoot;constructor(e={workspaceRoot:process.cwd()}){this.currentState=e.state??{},this.workspaceRoot=e.workspaceRoot,this.callContext=e.context===void 0?void 0:Wt(e.context),this.callSchedule=e.schedule===void 0?void 0:Object.freeze({...e.schedule}),this.callJobs=e.jobs,this.callJobRun=e.jobRun;}get jobs(){return this.callJobs}get jobRun(){return this.callJobRun}get schedule(){return this.callSchedule}requestSchedule(e){if(typeof e!="boolean")throw new TypeError("requestSchedule needs true or false");if(this.callSchedule===void 0)throw new f("SCHEDULE_UNSUPPORTED","this App has no schedule on this Host");let t=this.callContext?.actor;if(t==="schedule")throw new f("SCHEDULE_UNSUPPORTED","a scheduled run cannot change its own schedule",{outcome:"rejected"});if(e&&t!=="user")throw new f("SCHEDULE_ENABLE_DENIED","only the person at the screen can turn a schedule on",{outcome:"rejected"});this.scheduleDirective=Object.freeze({enabled:e});}get didRequestSchedule(){return this.scheduleDirective}get context(){if(this.callContext===void 0)throw new TypeError("this.context is only set when the Host runs the action; pass options.context when you construct the App in a test");return this.callContext}get state(){return this.currentState}get didSetState(){return this.stateWasSet}setState(e){this.currentState=e,this.stateWasSet=true;}get didSetContent(){return this.answerBody!==void 0}get producedContent(){return this.answerBody===void 0?void 0:{body:this.answerBody,...this.answerRange===void 0?{}:{range:this.answerRange}}}setContent(e,t){if(typeof e!="string"&&!(e instanceof Uint8Array))throw new TypeError("setContent needs a string or a Uint8Array");if(t!==void 0&&!$t(t))throw new TypeError("setContent range must be { startLine, lineCount, totalLines }, three integers of at least 1");this.answerBody=typeof e=="string"?new TextEncoder().encode(e):new Uint8Array(e),this.answerRange=t===void 0?void 0:{startLine:t.startLine,lineCount:t.lineCount,totalLines:t.totalLines};}emptyState(){return {}}validate(e,t,r){}mapError(e){return {code:"EXECUTION_FAILED",detail:null}}errorState(e,t,r){return {...O(r.state)?r.state:{},error:{code:e,detail:t}}}};function Ut(n){return function(e,t){if(t.static||t.private||t.kind!=="method")throw new TypeError("@Tool can decorate public instance methods only");let r=t.metadata;if(!r)throw new TypeError("standard decorator metadata is unavailable");let o=Object.hasOwn(r,$)?r[$]:[];if(o.some(p=>p.methodName===String(t.name)))throw new TypeError(`@Tool is declared more than once for ${String(t.name)}`);let i=n.content===void 0?void 0:qt(n.name,n.content),s=n.schedule===void 0?void 0:Vt(n);if(s!==void 0&&o.some(p=>p.options.schedule!==void 0))throw new TypeError(`@Tool ${n.name}: an App declares at most one scheduled action`);let a=n.job===void 0?void 0:Xt(n);if(a!==void 0&&o.some(p=>p.options.job!==void 0))throw new TypeError(`@Tool ${n.name}: an App declares at most one job action`);let d=n.jobAccess===void 0?void 0:Gt(n);r[$]=[...o,{methodName:String(t.name),options:Object.freeze({...n,...i===void 0?{}:{content:i},...s===void 0?{}:{schedule:s},...a===void 0?{}:{job:a},...d===void 0?{}:{jobAccess:d}})}];}}function K(n){let e=n[Bt],t=e&&Object.hasOwn(e,$)?e[$]:[],r=new Map(t.map(i=>[i.methodName,i])),o=Object.getOwnPropertyNames(n.prototype).map(i=>r.get(i)).filter(i=>i!==void 0);if(o.length!==t.length)throw new TypeError("a @Tool method is missing from the App prototype");return o}function Jn(n){return K(n).some(({options:e})=>e.schedule!==void 0)}function Dn(n){let e=n.definition,t=K(n),r=new Set;return t.map(({options:o})=>{if(r.has(o.name))throw new TypeError(`duplicate @Tool name: ${o.name}`);return r.add(o.name),{actionId:o.name,...o.dataInputs===void 0?{}:{dataInputs:[...o.dataInputs]},confirmation:o.confirmation??"none",capability:o.capability??"app.read",mutation:o.mutation??true,inputSchema:o.inputSchema,...o.content===void 0?{}:{content:zt(o.content)},...o.schedule===void 0?{}:{schedule:{...o.schedule}},...o.job===void 0?{}:{job:{...o.job}},...o.jobAccess===void 0?{}:{jobAccess:[...o.jobAccess]},resultProjection:o.resultProjection??{allow:[...e.stateProjection.allow]},_meta:{description:o.description}}})}function Ht(n,e){if(e.length===0)throw new TypeError("backendCommand must name the skill command");let t=Dn(n).map(({_meta:r,...o})=>({...o,backend:{type:"skill",command:[...e]},_meta:r}));return {...n.definition,actions:t}}function qt(n,e){let t=i=>{throw new TypeError(`@Tool ${n}: content ${i}`)},r=(i,s,a)=>{if(!O(a))return t(`${i} must be an object`);for(let d of Object.keys(a))if(d==="mediaType"){if(!L.includes(a[d]))return t(`${i}.mediaType must be one of ${L.join(", ")}`)}else if(d===s){if(typeof a[d]!="boolean")return t(`${i}.${d} must be true or false`)}else return t(`${i} has the unknown key "${d}"`);return Object.hasOwn(a,"mediaType")?Object.freeze({...a}):t(`${i}.mediaType is required`)};if(!O(e))return t("must be an object");let o={};for(let i of Object.keys(e))if(i==="in")o[i]=r("in","required",e[i]);else if(i==="out")o[i]=r("out","range",e[i]);else return t(`has the unknown key "${i}"; use "in" and/or "out"`);return Object.keys(o).length===0?t('needs "in" and/or "out"'):Object.freeze(o)}function Vt(n){let e=r=>{throw new TypeError(`@Tool ${n.name}: schedule ${r}`)},t=n.schedule;if(!O(t))return e("must be an object");for(let r of Object.keys(t))if(r!=="everyMinutes"&&r!=="timeoutMs")return e(`has the unknown key "${r}"`);return W.includes(t.everyMinutes)?t.timeoutMs!==void 0&&!Ue(t.timeoutMs)?e(`timeoutMs must be an integer from ${v.min} to ${v.max}`):n.content!==void 0?e("cannot be combined with content"):n.dataInputs!==void 0?e("cannot be combined with dataInputs"):n.confirmation!==void 0&&n.confirmation!=="none"?e("cannot require a native confirmation"):Object.freeze({everyMinutes:t.everyMinutes,...t.timeoutMs===void 0?{}:{timeoutMs:t.timeoutMs}}):e(`everyMinutes must be one of ${W.join(", ")}`)}function Xt(n){let e=r=>{throw new TypeError(`@Tool ${n.name}: job ${r}`)},t=n.job;if(!O(t))return e("must be an object");for(let r of Object.keys(t))if(r!=="deadlineMs")return e(`has the unknown key "${r}"`);return t.deadlineMs!==void 0&&!We(t.deadlineMs)?e(`deadlineMs must be an integer from ${j.min} to ${j.max}`):n.content!==void 0?e("cannot be combined with content"):n.dataInputs!==void 0?e("cannot be combined with dataInputs"):n.confirmation!==void 0&&n.confirmation!=="none"?e("cannot require a native confirmation"):n.schedule!==void 0?e("cannot be the scheduled action too"):n.jobAccess!==void 0?e("cannot also be a control action: a run does not control itself"):Object.freeze({...t.deadlineMs===void 0?{}:{deadlineMs:t.deadlineMs}})}function Gt(n){let e=r=>{throw new TypeError(`@Tool ${n.name}: jobAccess ${r}`)},t=n.jobAccess;return !Array.isArray(t)||t.length===0?e("must list at least one operation"):new Set(t).size!==t.length?e("must not repeat an operation"):t.every(z)?n.job!==void 0?e("cannot be set on the job action, which runs the job and cannot control it"):n.content!==void 0?e("cannot be combined with content"):Object.freeze([...t]):e("names an unknown operation")}function Wt(n){return Object.freeze({instanceId:n.instanceId,threadId:n.threadId,actor:n.actor,requestId:n.requestId,nowMs:n.nowMs})}function zt(n){let e={};for(let[t,r]of Object.entries(n))e[t]={...r};return e}function $t(n){return O(n)&&["startLine","lineCount","totalLines"].every(e=>Number.isSafeInteger(n[e])&&n[e]>=1)}function O(n){if(n===null||typeof n!="object"||Array.isArray(n))return false;let e=Object.getPrototypeOf(n);return e===Object.prototype||e===null}var Kt=/^[A-Za-z0-9._:-]{1,128}$/u,Yt=/[\u0000-\u001f\u007f\u2028\u2029]/u,Zt=512;function Ke(n=process.env){let e=xn(n.CREWX_APP_INSTANCE_ID),t=n.CREWX_APP_REQUEST_ID,r=n.CREWX_APP_ACTOR_KIND,o=n.CREWX_APP_NOW_MS;if(e===void 0||typeof t!="string"||!Kt.test(t)||r!=="user"&&r!=="agent"&&r!=="schedule"||typeof o!="string"||!/^\d{1,16}$/u.test(o))return;let i=Number(o);if(!Number.isSafeInteger(i))return;let s=n.CREWX_THREAD_ID===void 0?null:xn(n.CREWX_THREAD_ID);if(s!==void 0&&!(r==="schedule"&&(s!==null||!e.startsWith(Be))))return Object.freeze({instanceId:e,threadId:s,actor:r,requestId:t,nowMs:i})}function xn(n){if(!(typeof n!="string"||n.length===0||Yt.test(n)))return new TextEncoder().encode(n).byteLength<=Zt?n:void 0}var Qt="dist/tools.json",er=1,nr="dist/main.mjs";var Fn=["CREWX_APP_INSTANCE_ID","CREWX_THREAD_ID"];function tr(n){if(!Array.isArray(n)||n.length===0)return false;let e=new Set;for(let t of n){if(!Fn.some(r=>r===t)||e.has(t))return false;e.add(t);}return true}var Ln=["INVALID_REF","FILE_NOT_FOUND","DOCUMENT_CHANGED","TOO_LARGE","IO_ERROR","FILE_BUSY"],u=class extends Error{code;constructor(e){super(e),this.name="AppFilesError",this.code=e;}};var S={textBytes:256*1024,refCodePoints:200,refSegments:3,pageSize:200},U=/^[\p{L}\p{N}][\p{L}\p{N}\p{M}_-]{0,99}$/u,D=()=>{throw new u("INVALID_REF")};function Y(n){let e=n.normalize("NFC");if([...e].length>S.refCodePoints)return;let t=e.split("/");if(t.length>S.refSegments)return;let r=t[t.length-1];return r.endsWith(".md")&&[...t.slice(0,-1),r.slice(0,-3)].every(i=>U.test(i))?e:void 0}function Z(n){return typeof n!="string"?D():Y(n)??D()}function vn(n){if(n==null||n==="")return "";if(typeof n!="string")return D();let e=n.normalize("NFC");if([...e].length>S.refCodePoints)return D();let t=(e.endsWith("/")?e.slice(0,-1):e).split("/");return t.length>S.refSegments-1||!t.every(r=>U.test(r))?D():`${t.join("/")}/`}function jn(n){if(typeof n!="string")return D();if(Buffer.byteLength(n,"utf8")>S.textBytes)throw new u("TOO_LARGE");return n}function Mn(n){return n===null?null:typeof n=="string"&&n.length<=S.refCodePoints?n:D()}var ye=path.join("locks","files"),ne=12e3,{link:ur,mkdir:lr,open:pr,readFile:Qe,unlink:ee}=fs.promises,cr=5,fr=50,yr=1e3,Ar=2e3,mr="/bin/ps",br={LC_ALL:"C",TZ:"UTC"},gr=100,hr=19,_r=/^[A-Za-z]{3} ([A-Za-z]{3}) +(\d{1,2}) (\d{2}):(\d{2}):(\d{2}) (\d{4})$/,Er=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],Or=util.promisify(child_process.execFile),Bn,ce;function en(n=process.env){if(n.CREWX_HOME){let e=path.resolve(n.CREWX_HOME);try{return fs.realpathSync(e)}catch(t){if(t.code==="ENOENT")return e;throw t}}return process.platform!=="win32"&&n.XDG_CONFIG_HOME?path.join(n.XDG_CONFIG_HOME,"crewx"):path.join(os.homedir(),".crewx")}async function Ae(n){let{lockDir:e,key:t}=n,r=path.join(e,wr(t)),o=Date.now()+n.waitMs,i=await qn(e,{token:crypto.randomUUID(),pid:process.pid,startedAtMs:await Xn()}),s=new Ye;try{let a=cr;for(;;){if(await Vn(i.staged,r))return {path:r,token:i.record.token};let d=await fe(r);if(d!=="vanished"&&!(d!=="unreadable"&&await s.isDead(d)&&await Pr(e,r,d,s))){if(Date.now()>=o)throw new u("FILE_BUSY");await Jr(a),a=Math.min(a*2,fr);}}}finally{await ee(i.staged).catch(()=>{});}}async function me(n){await Ze(n.path,n.token);}function wr(n){return crypto.createHash("sha256").update(n,"utf8").digest("hex")}async function qn(n,e){let t=path.join(n,`.${e.token}.tmp`);try{await lr(n,{recursive:!0}),await Sr(t,JSON.stringify(e));}catch{throw await ee(t).catch(()=>{}),new u("IO_ERROR")}return {record:e,staged:t}}async function Sr(n,e){let t=await pr(n,"wx");try{await t.writeFile(e),await t.sync();}finally{await t.close();}}async function Vn(n,e){try{return await ur(n,e),!0}catch(t){if(t.code==="EEXIST")return false;throw new u("IO_ERROR")}}async function fe(n){let e;try{e=await Qe(n,"utf8");}catch(t){return t.code==="ENOENT"?"vanished":"unreadable"}try{let t=JSON.parse(e);return Rr(t)?t:"unreadable"}catch{return "unreadable"}}function Rr(n){if(typeof n!="object"||n===null||Array.isArray(n))return false;let e=n;return typeof e.token=="string"&&e.token.length>0&&typeof e.pid=="number"&&Number.isSafeInteger(e.pid)&&e.pid>0&&(e.startedAtMs===null||Number.isSafeInteger(e.startedAtMs))}async function Ir(n){try{process.kill(n.pid,0);}catch(t){return t.code==="ESRCH"}if(n.startedAtMs===null)return false;let e=await Gn(n.pid);return e!==null&&e!==n.startedAtMs}var Ye=class{constructor(e=Ir,t=Date.now){this.check=e;this.now=t;}check;now;answers=new Map;async isDead(e){let t=this.now(),r=this.answers.get(e.token);if(r!==void 0&&t-r.at<yr)return r.dead;let o=await this.check(e);return this.answers.set(e.token,{at:t,dead:o}),o}};async function Pr(n,e,t,r){let o=`${e}.reclaim`,i=await qn(n,{token:crypto.randomUUID(),pid:process.pid,startedAtMs:await Xn()});try{if(!await Vn(i.staged,o)){let s=await fe(o);return s!=="vanished"&&s!=="unreadable"&&await r.isDead(s)&&await Ze(o,s.token),!1}try{let s=await fe(e);return typeof s!="object"||s.token!==t.token?!1:(await ee(e).catch(()=>{}),!0)}finally{await Ze(o,i.record.token);}}finally{await ee(i.staged).catch(()=>{});}}async function Ze(n,e){let t=await fe(n);typeof t=="object"&&t.token===e&&await ee(n).catch(()=>{});}function Xn(){return (ce===void 0||ce.pid!==process.pid)&&(ce={pid:process.pid,startedAtMs:Gn(process.pid)}),ce.startedAtMs}async function Gn(n){return process.platform==="linux"&&(Bn??=await fs.promises.access("/proc/self/stat").then(()=>true,()=>false),Bn)?Tr(n):kr(n)}async function Tr(n){try{let e=await Qe(`/proc/${n}/stat`,"utf8"),t=e.slice(e.lastIndexOf(")")+2).split(" "),r=Number(t[hr]),o=await Cr();return !Number.isSafeInteger(r)||o===void 0?null:o*1e3+r*1e3/gr}catch{return null}}async function Cr(){let n=(await Qe("/proc/stat","utf8")).split(`
|
|
2
|
-
`).find(t=>t.startsWith("btime ")),e=Number(n?.slice(6));return Number.isSafeInteger(e)?e:void 0}async function kr(n){try{let{stdout:e}=await Or(mr,["-o","lstart=","-p",String(n)],{env:br,encoding:"utf8",timeout:Ar});return Nr(e.trim())}catch{return null}}function Nr(n){let e=_r.exec(n);if(e===null)return null;let t=Er.indexOf(e[1]);return t<0?null:Date.UTC(Number(e[6]),t,Number(e[2]),Number(e[3]),Number(e[4]),Number(e[5]))}function Jr(n){return new Promise(e=>setTimeout(e,n))}var Fr=[".git",".crewx","node_modules","apps","skills"],{lstat:Lr,readFile:vr}=fs.promises,jr=4,Mr=200,Br=1024*1024,Wn=/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/;function Ur(n){return ["docs","apps",n]}function zn(n){let e={segments:Ur(n.appId),declared:false};if(n.origin!=="not_installed"||n.source!=="workspace"&&n.source!=="bundled"||n.declared===void 0||n.declared===null)return e;let t=Hr(n.declared);return t.ok?n.packageRelativePath!==void 0&&qr(t.segments,Vr(n.packageRelativePath))?{...e,warning:"FILES_ROOT_FORBIDDEN"}:{segments:t.segments,declared:true}:{...e,warning:t.warning}}async function $n(n){let e={appId:void 0,declared:void 0};try{let t=path.join(n,"manifest.json"),r=await Lr(t);if(!r.isFile()||r.size>Br)return e;let o=JSON.parse(await vr(t,"utf8"));if(!be(o))return e;let i=o.name,s=typeof i=="string"&&Wn.test(i)?i:void 0,a=o._meta,d=be(a)?a["dev.crewx"]:void 0,p=be(d)?d.files:void 0;return {appId:s,declared:p}}catch{return e}}function Hr(n){return !be(n)||Object.keys(n).some(e=>e!=="root")||typeof n.root!="string"?{ok:false,warning:"FILES_ROOT_INVALID"}:Yn(n.root.normalize("NFC"),Kn)}function ge(n){if(n.normalize("NFC")!==n)return;let e=Yn(n,t=>Kn(t)||Wn.test(t));return e.ok?e.segments:void 0}function Kn(n){return U.test(n)}function Yn(n,e){let t={ok:false,warning:"FILES_ROOT_INVALID"},r={ok:false,warning:"FILES_ROOT_FORBIDDEN"};if([...n].length>Mr)return t;let o=n.split("/");return o.length>jr||!o.every(e)?t:o.length===1||Fr.includes(o[0].toLowerCase())?r:{ok:true,segments:o}}function qr(n,e){let t=Math.min(n.length,e.length);for(let r=0;r<t;r+=1)if(n[r].toLowerCase()!==e[r].toLowerCase())return false;return t>0}function Vr(n){return n.normalize("NFC").split("/").filter(e=>e.length>0)}function be(n){return typeof n=="object"&&n!==null&&!Array.isArray(n)}var{lstat:Kr,mkdir:Yr,open:Zr,readdir:Qr,rename:eo,stat:no,unlink:nt}=fs.promises;function te(n){return `sha256:${crypto.createHash("sha256").update(n).digest("hex")}`}function tn(n,e){return e===n||e.startsWith(n.endsWith(path.sep)?n:n+path.sep)}var Ee=class{constructor(e={},t){this.hooks=e;this.lockDir=t.lockDir,this.lockWaitMs=t.lockWaitMs??ne;}hooks;lockDir;lockWaitMs;async list(e,t,r){let o=t===""?[]:t.slice(0,-1).split("/"),i=await he(e.workspaceReal,[...e.segments,...o]);if(i.status!=="complete")return {items:[],next:null};let s=await nn(e),a=await uo(s,i.dir,t);a.sort((y,l)=>Qn(y.ref,l.ref));let d=r===void 0?a:a.filter(y=>Qn(y.ref,r)>0),p=d.slice(0,S.pageSize),c=[];for(let y of p){let l=await this.readVerified(s,y.abs);c.push({ref:y.ref,version:te(l.bytes),bytes:l.bytes.length,modifiedAt:l.stat.mtime.toISOString()});}return {items:c,next:d.length>p.length?p[p.length-1].ref:null}}async read(e,t){let r=t.split("/"),o=await he(e.workspaceReal,[...e.segments,...r.slice(0,-1)]);if(o.status!=="complete")throw new u("FILE_NOT_FOUND");let i=await _e(o.dir,r[r.length-1]);if(!i)throw new u("FILE_NOT_FOUND");if(!i.stat.isFile())throw new u("IO_ERROR");let{bytes:s}=await this.readVerified(await nn(e),i.abs,S.textBytes);return {ref:t,text:yo(s),version:te(s)}}async stat(e,t){let r=t.split("/"),o=await he(e.workspaceReal,[...e.segments,...r.slice(0,-1)]);if(o.status!=="complete")throw new u("FILE_NOT_FOUND");let i=await _e(o.dir,r[r.length-1]);if(!i)throw new u("FILE_NOT_FOUND");if(!i.stat.isFile())throw new u("IO_ERROR");let s=await this.readVerified(await nn(e),i.abs,S.textBytes);return {ref:t,version:te(s.bytes),bytes:s.bytes.length,modifiedAt:s.stat.mtime.toISOString()}}async write(e,t,r,o){let i=t.split("/"),s=i[i.length-1],a=new Uint8Array(Buffer.from(r,"utf8"));return this.withFileLock(await oo(e,t),async()=>{let d=await he(e.workspaceReal,[...e.segments,...i.slice(0,-1)]);if(d.status==="blocked")throw new u("IO_ERROR");let p=await Oe(d.dir),c=d.status==="complete"?await _e(d.dir,s):void 0;if(c&&!c.stat.isFile())throw new u("IO_ERROR");if((c?te((await this.readVerified(p.real,c.abs)).bytes):null)!==o)throw new u("DOCUMENT_CHANGED");let l=await this.createFolders(p,d.status==="missing"?d.missing:[]);await ro(l,s);let b=c?.abs??path.join(l.path,s);return await this.writeAtomically(l,b,s,a,c?.stat),{ref:t,version:te(a)}})}async readVerified(e,t,r){return await this.hooks.beforeOpen?.(t),so(e,t,r)}async createFolders(e,t){let r=e;for(let o of t){let i=path.join(r.path,o);await this.hooks.beforeMkdir?.(i);try{await Yr(i);}catch(s){if(s.code!=="EEXIST")throw new u("IO_ERROR")}r=await ao(r,i);}return r}async writeAtomically(e,t,r,o,i){let s=path.join(e.path,to(r)),a;try{await this.hooks.beforeOpen?.(s),a=await tt(s,fs.constants.O_CREAT|fs.constants.O_EXCL|fs.constants.O_WRONLY),await a.writeFile(o),i!==void 0&&await a.chmod(i.mode&4095),await a.sync(),await a.close(),a=void 0,await on(e),await eo(s,t);}catch(d){throw await a?.close().catch(()=>{}),await nt(s).catch(()=>{}),d instanceof u?d:new u("IO_ERROR")}}async withFileLock(e,t){let r=await Ae({lockDir:this.lockDir,key:e,waitMs:this.lockWaitMs});try{return await t()}finally{await me(r);}}};function to(n){return `.${n}.crewx-${crypto.randomUUID()}.tmp`}async function ro(n,e){let t=`.${e}.crewx-`;for(let r of await an(n.path))r.normalize("NFC").startsWith(t)&&r.endsWith(".tmp")&&await nt(path.join(n.path,r)).catch(()=>{});}async function rn(n){return (await io(n)).normalize("NFC").toLowerCase()}async function oo(n,e){return rn(path.join(n.workspaceReal,...n.segments,...e.split("/")))}async function io(n){let e=[],t=n;for(;;)try{return path.join(await rt(t),...e.reverse())}catch{let r=path.dirname(t);if(r===t)throw new u("IO_ERROR");e.push(path.basename(t)),t=r;}}async function so(n,e,t){let r=await tt(e,fs.constants.O_RDONLY);try{let o=await r.stat();if(!o.isFile())throw new u("IO_ERROR");if(t!==void 0&&o.size>t)throw new u("TOO_LARGE");let i=fo(await r.readFile());return await po(n,e,o),{bytes:i,stat:o}}finally{await r.close();}}async function nn(n){let e=await sn(path.join(n.workspaceReal,...n.segments));if(!tn(n.workspaceReal,e))throw new u("INVALID_REF");return e}async function _e(n,e){let t=(await an(n)).filter(i=>i.normalize("NFC")===e);if(t.length>1)throw new u("IO_ERROR");let r=path.join(n,t[0]??e),o=await dn(r);if(o){if(o.isSymbolicLink())throw new u("INVALID_REF");return {abs:r,stat:o}}}async function he(n,e){let t=n;for(let r=0;r<e.length;r+=1){let o=await _e(t,e[r]);if(!o)return {status:"missing",dir:t,missing:e.slice(r)};if(!o.stat.isDirectory())return {status:"blocked"};t=o.abs;}return {status:"complete",dir:t}}async function ao(n,e){await on(n);let t=await Oe(e);if(path.dirname(t.real)!==n.real)throw new u("INVALID_REF");return t}async function uo(n,e,t){let r=[],o=s=>s===""?0:s.split("/").length-1,i=async(s,a)=>{let d=await lo(n,s),p=await an(s);await on(d);let c=new Set;for(let y of p){let l=y.normalize("NFC");if(c.has(l))throw new u("IO_ERROR");c.add(l);let b=path.join(s,y),A=await dn(b);if(!(!A||A.isSymbolicLink())){if(A.isDirectory())o(a)<S.refSegments-1&&U.test(l)&&await i(b,`${a}${l}/`);else if(A.isFile()){let m=Y(`${a}${l}`);m!==void 0&&r.push({ref:m,abs:b});}}}};return await i(e,t),r}function Qn(n,e){return n<e?-1:n>e?1:0}async function Oe(n){let e=await dn(n);if(e?.isSymbolicLink())throw new u("INVALID_REF");if(!e?.isDirectory())throw new u("IO_ERROR");return {path:n,real:await sn(n),dev:e.dev,ino:e.ino}}async function lo(n,e){let t=await Oe(e);if(!tn(n,t.real))throw new u("INVALID_REF");return t}async function on(n){let e=await Oe(n.path);if(e.real!==n.real||e.dev!==n.dev||e.ino!==n.ino)throw new u("INVALID_REF")}async function po(n,e,t){let r=await sn(e);if(!tn(n,r))throw new u("INVALID_REF");let o=await co(r);if(o.dev!==t.dev||o.ino!==t.ino)throw new u("INVALID_REF")}async function tt(n,e){try{return await Zr(n,e|fs.constants.O_NOFOLLOW)}catch(t){throw t.code==="ELOOP"?new u("INVALID_REF"):new u("IO_ERROR")}}async function sn(n){try{return await rt(n)}catch{throw new u("IO_ERROR")}}function rt(n){return new Promise((e,t)=>{fs.realpath.native(n,(r,o)=>r?t(r):e(o));})}async function an(n){try{return await Qr(n)}catch(e){let t=e.code;if(t==="ENOENT"||t==="ENOTDIR")return [];throw new u("IO_ERROR")}}async function dn(n){try{return await Kr(n)}catch(e){let t=e.code;if(t==="ENOENT"||t==="ENOTDIR")return;throw new u("IO_ERROR")}}async function co(n){try{return await no(n)}catch{throw new u("IO_ERROR")}}function fo(n){return new Uint8Array(n.buffer,n.byteOffset,n.byteLength)}function yo(n){try{return new TextDecoder("utf-8",{fatal:!0,ignoreBOM:!0}).decode(n)}catch{throw new u("IO_ERROR")}}var it=util.promisify(fs.realpath.native),st="CREWX_APP_FILES_ROOT";function _o(n,e={}){return {async list(t={}){let r=vn(t.prefix),o=t.after===void 0||t.after===null?void 0:Z(t.after),i=await we(n,e);return Se(n,e).list(i,r,o)},async read(t){let r=Z(t),o=await we(n,e);return Se(n,e).read(o,r)},async stat(t){let r=Z(t),o=await we(n,e);return Se(n,e).stat(o,r)},async write(t,r,o){let i=Z(t),s=jn(r),a=Mn(o),d=await we(n,e);return Se(n,e).write(d,i,s,a)}}}async function we(n,e){let t=await So(n.workspaceRoot),r=(e.env??process.env)[st]??e.filesRoot;if(r!==void 0)return {workspaceReal:t,segments:Eo(r)};let o=e.packageDir??process.cwd(),i=await $n(o);if(i.appId===void 0)throw new u("IO_ERROR");let s=zn({appId:i.appId,origin:e.origin??"not_installed",source:e.source??"workspace",packageRelativePath:await wo(t,o),declared:i.declared});return {workspaceReal:t,segments:s.segments}}function Eo(n){let e=ge(n);if(e===void 0)throw new u("IO_ERROR");return e}function Se(n,e){let t=path.join(e.crewxHome??en(),ye);return new Ee({},{lockDir:t,lockWaitMs:Oo(n)})}function Oo(n){let e;try{e=n.context?.nowMs;}catch{e=void 0;}return typeof e!="number"||!Number.isSafeInteger(e)?ne:Math.max(0,e+ne-Date.now())}async function wo(n,e){let t;try{t=await it(e);}catch{return}let r=path.relative(n,t);if(!(r===""||r===".."||r.startsWith(`..${path.sep}`)||path.isAbsolute(r)))return r.split(path.sep).join("/")}async function So(n){try{return await it(n)}catch{throw new u("IO_ERROR")}}var Re=2,Ie=2097152;var H=2*1024*1024,Pe=2e4;function un(n){return crypto.createHash("sha256").update(n).digest("hex")}function Te(n){if(n.byteLength===0)return 0;let e=0;for(let t of n)t===10&&(e+=1);return n[n.byteLength-1]!==10&&(e+=1),e}var Po=Ie+1+H,To=64*1024,Co=10,Ce={kind:"invalid"};function ko(n,e){try{let t=[],r=0;for(;;){let s=new Uint8Array(To),a=fs.readSync(n,s,0,s.length,null);if(a===0)break;if(r+=a,r>e)return;t.push(s.subarray(0,a));}let o=new Uint8Array(r),i=0;for(let s of t)o.set(s,i),i+=s.byteLength;return o}catch{return}}function ke(n){return No(ko(n,Po))}function No(n){if(n===void 0)return Ce;let e=n.indexOf(Co);if(n.byteLength<=Ie){let r=vo(Buffer.from(n.buffer,n.byteOffset,n.byteLength).toString("utf8"));if(r.ok&&!(e>=0&&x(r.value)&&r.value.schemaVersion===Re))return {kind:"v1",value:r.value}}if(e<=0||e>Ie)return Ce;let t;try{t=JSON.parse(new TextDecoder("utf-8",{fatal:!0}).decode(n.subarray(0,e)));}catch{return Ce}return !x(t)||t.schemaVersion!==Re?Ce:{kind:"v2",header:t,body:n.subarray(e+1)}}var Jo="actionId,content,input,schemaVersion,state",Do="bytes,lines,mediaType,sha256",xo="mediaType,range",Fo=/^[a-f0-9]{64}$/u,Lo=new TextDecoder("utf-8",{fatal:true,ignoreBOM:true});function ut(n,e){let t=d=>({code:d,outcome:"rejected"});if(oe(n)!==Jo||n.schemaVersion!==Re||typeof n.actionId!="string"||!x(n.input)||!x(n.state)||!x(n.content)||oe(n.content)!=="in,out")return {code:"INPUT_INVALID",outcome:"failed"};let r=n.content,o,i=r.in;if(i===null){if(e.byteLength!==0)return t(e.byteLength>H?"CONTENT_TOO_LARGE":"CONTENT_DIGEST_MISMATCH")}else {if(!x(i)||oe(i)!==Do||!at(i.mediaType)||!dt(i.bytes,H)||!dt(i.lines,Pe)||typeof i.sha256!="string"||!Fo.test(i.sha256)||e.byteLength!==i.bytes)return t(e.byteLength>H?"CONTENT_TOO_LARGE":"CONTENT_DIGEST_MISMATCH");if(un(e)!==i.sha256||Te(e)!==i.lines)return t("CONTENT_DIGEST_MISMATCH");let d;try{d=Lo.decode(e);}catch{return t("CONTENT_ENCODING_INVALID")}o={mediaType:i.mediaType,text:d};}let s,a=r.out;if(a!==null){if(!x(a)||oe(a)!==xo||!at(a.mediaType))return t("CONTENT_SOURCE_UNSUPPORTED");let d=a.range;if(d!==null&&!jo(d))return t("CONTENT_SOURCE_UNSUPPORTED");s={mediaType:a.mediaType,...d===null?{}:{range:{startLine:d.startLine,lineCount:d.lineCount}}};}return {actionId:n.actionId,input:n.input,state:n.state,content:{...o===void 0?{}:{in:o},...s===void 0?{}:{out:s}}}}function lt(n){return Object.hasOwn(n,"code")}function pt(n,e){let t=r=>({code:r,outcome:"rejected"});if(n?.in===void 0){if(e.in!==void 0)return t("CONTENT_SOURCE_UNSUPPORTED")}else if(e.in===void 0){if(n.in.required===true)return t("CONTENT_REQUIRED")}else if(e.in.mediaType!==n.in.mediaType)return t("CONTENT_SOURCE_UNSUPPORTED");if(n?.out===void 0){if(e.out!==void 0)return t("CONTENT_SOURCE_UNSUPPORTED")}else {if(e.out===void 0)return t("CONTENT_REQUIRED");if(e.out.mediaType!==n.out.mediaType||e.out.range!==void 0&&n.out.range!==true)return t("CONTENT_SOURCE_UNSUPPORTED")}}function Ne(n,e){let{content:t,...r}=n,o=e===void 0?r:{...r,content:{bytes:e.body.byteLength,lines:Te(e.body),sha256:un(e.body),...e.range===void 0?{}:{range:e.range}}},i=new TextEncoder().encode(`${JSON.stringify(o)}
|
|
1
|
+
'use strict';var fs=require('fs'),path=require('path'),util=require('util'),child_process=require('child_process'),crypto=require('crypto'),os=require('os'),net=require('net'),console$1=require('console'),stream=require('stream');var L=["text/plain","application/json"];var W=[5,15,30,60],v=Object.freeze({min:15e3,max:6e5,default:3e5}),It=1,Be="schedule:",Pt="schedule",Tt="exit 78",Sn=["standby","disabled","draining","degraded"],Ct=["cron","cron_manual","app_enable"],kt=/^[A-Z][A-Z0-9_]{0,63}$/u;function Rn(n){return typeof n=="string"&&kt.test(n)}var On=["status","everyMinutes","lastStartedAt","lastFinishedAt","lastOutcome","lastErrorCode","nextRunAt","periodic","periodicReason"],Nt=["unset","on","off"],Jt=["available","unavailable"],Me=64,Dt=128;function In(n){return W.includes(n)}function Ue(n){return Number.isSafeInteger(n)&&n>=v.min&&n<=v.max}function Pn(n){return Sn.includes(n)}function Tn(n){if(!xt(n)||Object.keys(n).length!==On.length||!On.every(r=>Object.hasOwn(n,r))||typeof n.status!="string"||!Nt.includes(n.status)||!In(n.everyMinutes)||!ue(n.lastStartedAt,Me)||!ue(n.lastFinishedAt,Me)||!ue(n.lastOutcome,Dt)||!ue(n.nextRunAt,Me)||n.lastErrorCode!==null&&!Rn(n.lastErrorCode)||typeof n.periodic!="string"||!Jt.includes(n.periodic))return;let t=n.periodic;if(!(t==="available"?n.periodicReason!==null:!Pn(n.periodicReason))&&!(n.nextRunAt!==null&&(n.status!=="on"||t!=="available")))return Object.freeze({status:n.status,everyMinutes:n.everyMinutes,lastStartedAt:n.lastStartedAt,lastFinishedAt:n.lastFinishedAt,lastOutcome:n.lastOutcome,lastErrorCode:n.lastErrorCode,nextRunAt:n.nextRunAt,periodic:t,periodicReason:n.periodicReason})}function ue(n,e){return n===null||typeof n=="string"&&n.length>0&&n.length<=e}function xt(n){if(n===null||typeof n!="object"||Array.isArray(n))return false;let e=Object.getPrototypeOf(n);return e===Object.prototype||e===null}var j=Object.freeze({min:6e4,max:18e5,default:6e5}),Ft=Object.freeze({min:1e3,max:12e4,default:3e4}),Lt=1,Cn="crewx/appJobs",kn=1,He=["starting","running","stopping","finished"],qe=["succeeded","failed","timed_out","cancelled","shutdown","interrupted"],le=["cancelled","timed_out","shutdown"],Ve=["manual","schedule"],vt=/^[a-z][a-z0-9_]{0,63}$/u,jt=/^[A-Z][A-Z0-9_]{0,63}$/u,pe=["start","status","cancel"],Xe=["APP_JOB_NOT_DECLARED","APP_JOB_NOT_AUTHORIZED","APP_JOB_SELF_START","APP_JOB_OWNER_INVALID","APP_JOB_DEFINITION_INVALID","APP_JOB_DEFINITION_CHANGED","APP_JOB_DEADLINE_INVALID","APP_JOB_SHUTTING_DOWN","APP_JOB_OWNER_MISMATCH","APP_JOB_STALE_HANDLE","APP_JOB_NOT_ACTIVE","APP_JOB_NOT_GRANTED"],Ge="APP_JOB_RUN_REQUIRED";function We(n){return Number.isSafeInteger(n)&&n>=j.min&&n<=j.max}function M(n){return typeof n=="string"&&jt.test(n)}function B(n){return typeof n=="string"&&vt.test(n)}function z(n){return pe.includes(n)}function Mt(n){return n?.some(({name:e,version:t})=>e===Cn&&t===kn)===true}var Nn=Symbol;Nn.metadata===void 0&&Object.defineProperty(Symbol,"metadata",{configurable:false,value:Symbol.for("Symbol.metadata")});var Bt=Nn.metadata,$=Symbol.for("crewx.app.tool-metadata"),c=class extends Error{code;detail;outcome;constructor(e,t=null,r){super(e),this.name="AppError",this.code=e,this.detail=t,this.outcome=$e(r?.outcome);}};function $e(n){return n==="rejected"?"rejected":"failed"}var ze=class{static devtools=process.env.CREWX_APP_DEV==="1"?Object.freeze({log:true}):void 0;currentState;stateWasSet=false;answerBody;answerRange;callContext;callSchedule;callJobs;callJobRun;scheduleDirective;workspaceRoot;constructor(e={workspaceRoot:process.cwd()}){this.currentState=e.state??{},this.workspaceRoot=e.workspaceRoot,this.callContext=e.context===void 0?void 0:Wt(e.context),this.callSchedule=e.schedule===void 0?void 0:Object.freeze({...e.schedule}),this.callJobs=e.jobs,this.callJobRun=e.jobRun;}get jobs(){return this.callJobs}get jobRun(){return this.callJobRun}get schedule(){return this.callSchedule}requestSchedule(e){if(typeof e!="boolean")throw new TypeError("requestSchedule needs true or false");if(this.callSchedule===void 0)throw new c("SCHEDULE_UNSUPPORTED","this App has no schedule on this Host");let t=this.callContext?.actor;if(t==="schedule")throw new c("SCHEDULE_UNSUPPORTED","a scheduled run cannot change its own schedule",{outcome:"rejected"});if(e&&t!=="user")throw new c("SCHEDULE_ENABLE_DENIED","only the person at the screen can turn a schedule on",{outcome:"rejected"});this.scheduleDirective=Object.freeze({enabled:e});}get didRequestSchedule(){return this.scheduleDirective}get context(){if(this.callContext===void 0)throw new TypeError("this.context is only set when the Host runs the action; pass options.context when you construct the App in a test");return this.callContext}get state(){return this.currentState}get didSetState(){return this.stateWasSet}setState(e){this.currentState=e,this.stateWasSet=true;}get didSetContent(){return this.answerBody!==void 0}get producedContent(){return this.answerBody===void 0?void 0:{body:this.answerBody,...this.answerRange===void 0?{}:{range:this.answerRange}}}setContent(e,t){if(typeof e!="string"&&!(e instanceof Uint8Array))throw new TypeError("setContent needs a string or a Uint8Array");if(t!==void 0&&!$t(t))throw new TypeError("setContent range must be { startLine, lineCount, totalLines }, three integers of at least 1");this.answerBody=typeof e=="string"?new TextEncoder().encode(e):new Uint8Array(e),this.answerRange=t===void 0?void 0:{startLine:t.startLine,lineCount:t.lineCount,totalLines:t.totalLines};}emptyState(){return {}}validate(e,t,r){}mapError(e){return {code:"EXECUTION_FAILED",detail:null}}errorState(e,t,r){return {...w(r.state)?r.state:{},error:{code:e,detail:t}}}};function Ut(n){return function(e,t){if(t.static||t.private||t.kind!=="method")throw new TypeError("@Tool can decorate public instance methods only");let r=t.metadata;if(!r)throw new TypeError("standard decorator metadata is unavailable");let o=Object.hasOwn(r,$)?r[$]:[];if(o.some(p=>p.methodName===String(t.name)))throw new TypeError(`@Tool is declared more than once for ${String(t.name)}`);let i=n.content===void 0?void 0:qt(n.name,n.content);if(n.viewCall!==void 0&&(n.viewCall!==true||n.mutation!==false||n.confirmation!==void 0&&n.confirmation!=="none"||n.resultProjection===void 0||i!==void 0||n.schedule!==void 0||n.job!==void 0||n.jobAccess!==void 0))throw new TypeError(`@Tool ${n.name}: viewCall requires mutation false, confirmation none, resultProjection, and no content, job, or schedule`);let s=n.schedule===void 0?void 0:Vt(n);if(s!==void 0&&o.some(p=>p.options.schedule!==void 0))throw new TypeError(`@Tool ${n.name}: an App declares at most one scheduled action`);let a=n.job===void 0?void 0:Xt(n);if(a!==void 0&&o.some(p=>p.options.job!==void 0))throw new TypeError(`@Tool ${n.name}: an App declares at most one job action`);let d=n.jobAccess===void 0?void 0:Gt(n);r[$]=[...o,{methodName:String(t.name),options:Object.freeze({...n,...i===void 0?{}:{content:i},...s===void 0?{}:{schedule:s},...a===void 0?{}:{job:a},...d===void 0?{}:{jobAccess:d}})}];}}function K(n){let e=n[Bt],t=e&&Object.hasOwn(e,$)?e[$]:[],r=new Map(t.map(i=>[i.methodName,i])),o=Object.getOwnPropertyNames(n.prototype).map(i=>r.get(i)).filter(i=>i!==void 0);if(o.length!==t.length)throw new TypeError("a @Tool method is missing from the App prototype");return o}function Jn(n){return K(n).some(({options:e})=>e.schedule!==void 0)}function Dn(n){let e=n.definition,t=K(n),r=new Set;return t.map(({options:o})=>{if(r.has(o.name))throw new TypeError(`duplicate @Tool name: ${o.name}`);return r.add(o.name),{actionId:o.name,...o.dataInputs===void 0?{}:{dataInputs:[...o.dataInputs]},confirmation:o.confirmation??"none",capability:o.capability??"app.read",mutation:o.mutation??true,inputSchema:o.inputSchema,...o.viewCall===true?{viewCall:true}:{},...o.content===void 0?{}:{content:zt(o.content)},...o.schedule===void 0?{}:{schedule:{...o.schedule}},...o.job===void 0?{}:{job:{...o.job}},...o.jobAccess===void 0?{}:{jobAccess:[...o.jobAccess]},resultProjection:o.resultProjection??{allow:[...e.stateProjection.allow]},_meta:{description:o.description}}})}function Ht(n,e){if(e.length===0)throw new TypeError("backendCommand must name the skill command");let t=Dn(n);if(t.some(o=>o.viewCall===true))throw new TypeError("viewCall is available only to a server.ts screen App");let r=t.map(({_meta:o,...i})=>({...i,backend:{type:"skill",command:[...e]},_meta:o}));return {...n.definition,actions:r}}function qt(n,e){let t=i=>{throw new TypeError(`@Tool ${n}: content ${i}`)},r=(i,s,a)=>{if(!w(a))return t(`${i} must be an object`);for(let d of Object.keys(a))if(d==="mediaType"){if(!L.includes(a[d]))return t(`${i}.mediaType must be one of ${L.join(", ")}`)}else if(d===s){if(typeof a[d]!="boolean")return t(`${i}.${d} must be true or false`)}else return t(`${i} has the unknown key "${d}"`);return Object.hasOwn(a,"mediaType")?Object.freeze({...a}):t(`${i}.mediaType is required`)};if(!w(e))return t("must be an object");let o={};for(let i of Object.keys(e))if(i==="in")o[i]=r("in","required",e[i]);else if(i==="out")o[i]=r("out","range",e[i]);else return t(`has the unknown key "${i}"; use "in" and/or "out"`);return Object.keys(o).length===0?t('needs "in" and/or "out"'):Object.freeze(o)}function Vt(n){let e=r=>{throw new TypeError(`@Tool ${n.name}: schedule ${r}`)},t=n.schedule;if(!w(t))return e("must be an object");for(let r of Object.keys(t))if(r!=="everyMinutes"&&r!=="timeoutMs")return e(`has the unknown key "${r}"`);return W.includes(t.everyMinutes)?t.timeoutMs!==void 0&&!Ue(t.timeoutMs)?e(`timeoutMs must be an integer from ${v.min} to ${v.max}`):n.content!==void 0?e("cannot be combined with content"):n.dataInputs!==void 0?e("cannot be combined with dataInputs"):n.confirmation!==void 0&&n.confirmation!=="none"?e("cannot require a native confirmation"):Object.freeze({everyMinutes:t.everyMinutes,...t.timeoutMs===void 0?{}:{timeoutMs:t.timeoutMs}}):e(`everyMinutes must be one of ${W.join(", ")}`)}function Xt(n){let e=r=>{throw new TypeError(`@Tool ${n.name}: job ${r}`)},t=n.job;if(!w(t))return e("must be an object");for(let r of Object.keys(t))if(r!=="deadlineMs")return e(`has the unknown key "${r}"`);return t.deadlineMs!==void 0&&!We(t.deadlineMs)?e(`deadlineMs must be an integer from ${j.min} to ${j.max}`):n.content!==void 0?e("cannot be combined with content"):n.dataInputs!==void 0?e("cannot be combined with dataInputs"):n.confirmation!==void 0&&n.confirmation!=="none"?e("cannot require a native confirmation"):n.schedule!==void 0?e("cannot be the scheduled action too"):n.jobAccess!==void 0?e("cannot also be a control action: a run does not control itself"):Object.freeze({...t.deadlineMs===void 0?{}:{deadlineMs:t.deadlineMs}})}function Gt(n){let e=r=>{throw new TypeError(`@Tool ${n.name}: jobAccess ${r}`)},t=n.jobAccess;return !Array.isArray(t)||t.length===0?e("must list at least one operation"):new Set(t).size!==t.length?e("must not repeat an operation"):t.every(z)?n.job!==void 0?e("cannot be set on the job action, which runs the job and cannot control it"):n.content!==void 0?e("cannot be combined with content"):Object.freeze([...t]):e("names an unknown operation")}function Wt(n){return Object.freeze({instanceId:n.instanceId,threadId:n.threadId,actor:n.actor,requestId:n.requestId,nowMs:n.nowMs})}function zt(n){let e={};for(let[t,r]of Object.entries(n))e[t]={...r};return e}function $t(n){return w(n)&&["startLine","lineCount","totalLines"].every(e=>Number.isSafeInteger(n[e])&&n[e]>=1)}function w(n){if(n===null||typeof n!="object"||Array.isArray(n))return false;let e=Object.getPrototypeOf(n);return e===Object.prototype||e===null}var Kt=/^[A-Za-z0-9._:-]{1,128}$/u,Yt=/[\u0000-\u001f\u007f\u2028\u2029]/u,Zt=512;function Ke(n=process.env){let e=xn(n.CREWX_APP_INSTANCE_ID),t=n.CREWX_APP_REQUEST_ID,r=n.CREWX_APP_ACTOR_KIND,o=n.CREWX_APP_NOW_MS;if(e===void 0||typeof t!="string"||!Kt.test(t)||r!=="user"&&r!=="agent"&&r!=="schedule"||typeof o!="string"||!/^\d{1,16}$/u.test(o))return;let i=Number(o);if(!Number.isSafeInteger(i))return;let s=n.CREWX_THREAD_ID===void 0?null:xn(n.CREWX_THREAD_ID);if(s!==void 0&&!(r==="schedule"&&(s!==null||!e.startsWith(Be))))return Object.freeze({instanceId:e,threadId:s,actor:r,requestId:t,nowMs:i})}function xn(n){if(!(typeof n!="string"||n.length===0||Yt.test(n)))return new TextEncoder().encode(n).byteLength<=Zt?n:void 0}var Qt="dist/tools.json",er=1,nr="dist/main.mjs";var Fn=["CREWX_APP_INSTANCE_ID","CREWX_THREAD_ID"];function tr(n){if(!Array.isArray(n)||n.length===0)return false;let e=new Set;for(let t of n){if(!Fn.some(r=>r===t)||e.has(t))return false;e.add(t);}return true}var Ln=["INVALID_REF","FILE_NOT_FOUND","DOCUMENT_CHANGED","TOO_LARGE","IO_ERROR","FILE_BUSY"],u=class extends Error{code;constructor(e){super(e),this.name="AppFilesError",this.code=e;}};var S={textBytes:256*1024,refCodePoints:200,refSegments:3,pageSize:200},U=/^[\p{L}\p{N}][\p{L}\p{N}\p{M}_-]{0,99}$/u,D=()=>{throw new u("INVALID_REF")};function Y(n){let e=n.normalize("NFC");if([...e].length>S.refCodePoints)return;let t=e.split("/");if(t.length>S.refSegments)return;let r=t[t.length-1];return r.endsWith(".md")&&[...t.slice(0,-1),r.slice(0,-3)].every(i=>U.test(i))?e:void 0}function Z(n){return typeof n!="string"?D():Y(n)??D()}function vn(n){if(n==null||n==="")return "";if(typeof n!="string")return D();let e=n.normalize("NFC");if([...e].length>S.refCodePoints)return D();let t=(e.endsWith("/")?e.slice(0,-1):e).split("/");return t.length>S.refSegments-1||!t.every(r=>U.test(r))?D():`${t.join("/")}/`}function jn(n){if(typeof n!="string")return D();if(Buffer.byteLength(n,"utf8")>S.textBytes)throw new u("TOO_LARGE");return n}function Mn(n){return n===null?null:typeof n=="string"&&n.length<=S.refCodePoints?n:D()}var ye=path.join("locks","files"),ne=12e3,{link:ur,mkdir:lr,open:pr,readFile:Qe,unlink:ee}=fs.promises,cr=5,fr=50,yr=1e3,Ar=2e3,mr="/bin/ps",br={LC_ALL:"C",TZ:"UTC"},hr=100,gr=19,_r=/^[A-Za-z]{3} ([A-Za-z]{3}) +(\d{1,2}) (\d{2}):(\d{2}):(\d{2}) (\d{4})$/,Er=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],wr=util.promisify(child_process.execFile),Bn,ce;function en(n=process.env){if(n.CREWX_HOME){let e=path.resolve(n.CREWX_HOME);try{return fs.realpathSync(e)}catch(t){if(t.code==="ENOENT")return e;throw t}}return process.platform!=="win32"&&n.XDG_CONFIG_HOME?path.join(n.XDG_CONFIG_HOME,"crewx"):path.join(os.homedir(),".crewx")}async function Ae(n){let{lockDir:e,key:t}=n,r=path.join(e,Or(t)),o=Date.now()+n.waitMs,i=await qn(e,{token:crypto.randomUUID(),pid:process.pid,startedAtMs:await Xn()}),s=new Ye;try{let a=cr;for(;;){if(await Vn(i.staged,r))return {path:r,token:i.record.token};let d=await fe(r);if(d!=="vanished"&&!(d!=="unreadable"&&await s.isDead(d)&&await Pr(e,r,d,s))){if(Date.now()>=o)throw new u("FILE_BUSY");await Jr(a),a=Math.min(a*2,fr);}}}finally{await ee(i.staged).catch(()=>{});}}async function me(n){await Ze(n.path,n.token);}function Or(n){return crypto.createHash("sha256").update(n,"utf8").digest("hex")}async function qn(n,e){let t=path.join(n,`.${e.token}.tmp`);try{await lr(n,{recursive:!0}),await Sr(t,JSON.stringify(e));}catch{throw await ee(t).catch(()=>{}),new u("IO_ERROR")}return {record:e,staged:t}}async function Sr(n,e){let t=await pr(n,"wx");try{await t.writeFile(e),await t.sync();}finally{await t.close();}}async function Vn(n,e){try{return await ur(n,e),!0}catch(t){if(t.code==="EEXIST")return false;throw new u("IO_ERROR")}}async function fe(n){let e;try{e=await Qe(n,"utf8");}catch(t){return t.code==="ENOENT"?"vanished":"unreadable"}try{let t=JSON.parse(e);return Rr(t)?t:"unreadable"}catch{return "unreadable"}}function Rr(n){if(typeof n!="object"||n===null||Array.isArray(n))return false;let e=n;return typeof e.token=="string"&&e.token.length>0&&typeof e.pid=="number"&&Number.isSafeInteger(e.pid)&&e.pid>0&&(e.startedAtMs===null||Number.isSafeInteger(e.startedAtMs))}async function Ir(n){try{process.kill(n.pid,0);}catch(t){return t.code==="ESRCH"}if(n.startedAtMs===null)return false;let e=await Gn(n.pid);return e!==null&&e!==n.startedAtMs}var Ye=class{constructor(e=Ir,t=Date.now){this.check=e;this.now=t;}check;now;answers=new Map;async isDead(e){let t=this.now(),r=this.answers.get(e.token);if(r!==void 0&&t-r.at<yr)return r.dead;let o=await this.check(e);return this.answers.set(e.token,{at:t,dead:o}),o}};async function Pr(n,e,t,r){let o=`${e}.reclaim`,i=await qn(n,{token:crypto.randomUUID(),pid:process.pid,startedAtMs:await Xn()});try{if(!await Vn(i.staged,o)){let s=await fe(o);return s!=="vanished"&&s!=="unreadable"&&await r.isDead(s)&&await Ze(o,s.token),!1}try{let s=await fe(e);return typeof s!="object"||s.token!==t.token?!1:(await ee(e).catch(()=>{}),!0)}finally{await Ze(o,i.record.token);}}finally{await ee(i.staged).catch(()=>{});}}async function Ze(n,e){let t=await fe(n);typeof t=="object"&&t.token===e&&await ee(n).catch(()=>{});}function Xn(){return (ce===void 0||ce.pid!==process.pid)&&(ce={pid:process.pid,startedAtMs:Gn(process.pid)}),ce.startedAtMs}async function Gn(n){return process.platform==="linux"&&(Bn??=await fs.promises.access("/proc/self/stat").then(()=>true,()=>false),Bn)?Tr(n):kr(n)}async function Tr(n){try{let e=await Qe(`/proc/${n}/stat`,"utf8"),t=e.slice(e.lastIndexOf(")")+2).split(" "),r=Number(t[gr]),o=await Cr();return !Number.isSafeInteger(r)||o===void 0?null:o*1e3+r*1e3/hr}catch{return null}}async function Cr(){let n=(await Qe("/proc/stat","utf8")).split(`
|
|
2
|
+
`).find(t=>t.startsWith("btime ")),e=Number(n?.slice(6));return Number.isSafeInteger(e)?e:void 0}async function kr(n){try{let{stdout:e}=await wr(mr,["-o","lstart=","-p",String(n)],{env:br,encoding:"utf8",timeout:Ar});return Nr(e.trim())}catch{return null}}function Nr(n){let e=_r.exec(n);if(e===null)return null;let t=Er.indexOf(e[1]);return t<0?null:Date.UTC(Number(e[6]),t,Number(e[2]),Number(e[3]),Number(e[4]),Number(e[5]))}function Jr(n){return new Promise(e=>setTimeout(e,n))}var Fr=[".git",".crewx","node_modules","apps","skills"],{lstat:Lr,readFile:vr}=fs.promises,jr=4,Mr=200,Br=1024*1024,Wn=/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/;function Ur(n){return ["docs","apps",n]}function zn(n){let e={segments:Ur(n.appId),declared:false};if(n.origin!=="not_installed"||n.source!=="workspace"&&n.source!=="bundled"||n.declared===void 0||n.declared===null)return e;let t=Hr(n.declared);return t.ok?n.packageRelativePath!==void 0&&qr(t.segments,Vr(n.packageRelativePath))?{...e,warning:"FILES_ROOT_FORBIDDEN"}:{segments:t.segments,declared:true}:{...e,warning:t.warning}}async function $n(n){let e={appId:void 0,declared:void 0};try{let t=path.join(n,"manifest.json"),r=await Lr(t);if(!r.isFile()||r.size>Br)return e;let o=JSON.parse(await vr(t,"utf8"));if(!be(o))return e;let i=o.name,s=typeof i=="string"&&Wn.test(i)?i:void 0,a=o._meta,d=be(a)?a["dev.crewx"]:void 0,p=be(d)?d.files:void 0;return {appId:s,declared:p}}catch{return e}}function Hr(n){return !be(n)||Object.keys(n).some(e=>e!=="root")||typeof n.root!="string"?{ok:false,warning:"FILES_ROOT_INVALID"}:Yn(n.root.normalize("NFC"),Kn)}function he(n){if(n.normalize("NFC")!==n)return;let e=Yn(n,t=>Kn(t)||Wn.test(t));return e.ok?e.segments:void 0}function Kn(n){return U.test(n)}function Yn(n,e){let t={ok:false,warning:"FILES_ROOT_INVALID"},r={ok:false,warning:"FILES_ROOT_FORBIDDEN"};if([...n].length>Mr)return t;let o=n.split("/");return o.length>jr||!o.every(e)?t:o.length===1||Fr.includes(o[0].toLowerCase())?r:{ok:true,segments:o}}function qr(n,e){let t=Math.min(n.length,e.length);for(let r=0;r<t;r+=1)if(n[r].toLowerCase()!==e[r].toLowerCase())return false;return t>0}function Vr(n){return n.normalize("NFC").split("/").filter(e=>e.length>0)}function be(n){return typeof n=="object"&&n!==null&&!Array.isArray(n)}var{lstat:Kr,mkdir:Yr,open:Zr,readdir:Qr,rename:eo,stat:no,unlink:nt}=fs.promises;function te(n){return `sha256:${crypto.createHash("sha256").update(n).digest("hex")}`}function tn(n,e){return e===n||e.startsWith(n.endsWith(path.sep)?n:n+path.sep)}var Ee=class{constructor(e={},t){this.hooks=e;this.lockDir=t.lockDir,this.lockWaitMs=t.lockWaitMs??ne;}hooks;lockDir;lockWaitMs;async list(e,t,r){let o=t===""?[]:t.slice(0,-1).split("/"),i=await ge(e.workspaceReal,[...e.segments,...o]);if(i.status!=="complete")return {items:[],next:null};let s=await nn(e),a=await uo(s,i.dir,t);a.sort((y,l)=>Qn(y.ref,l.ref));let d=r===void 0?a:a.filter(y=>Qn(y.ref,r)>0),p=d.slice(0,S.pageSize),f=[];for(let y of p){let l=await this.readVerified(s,y.abs);f.push({ref:y.ref,version:te(l.bytes),bytes:l.bytes.length,modifiedAt:l.stat.mtime.toISOString()});}return {items:f,next:d.length>p.length?p[p.length-1].ref:null}}async read(e,t){let r=t.split("/"),o=await ge(e.workspaceReal,[...e.segments,...r.slice(0,-1)]);if(o.status!=="complete")throw new u("FILE_NOT_FOUND");let i=await _e(o.dir,r[r.length-1]);if(!i)throw new u("FILE_NOT_FOUND");if(!i.stat.isFile())throw new u("IO_ERROR");let{bytes:s}=await this.readVerified(await nn(e),i.abs,S.textBytes);return {ref:t,text:yo(s),version:te(s)}}async stat(e,t){let r=t.split("/"),o=await ge(e.workspaceReal,[...e.segments,...r.slice(0,-1)]);if(o.status!=="complete")throw new u("FILE_NOT_FOUND");let i=await _e(o.dir,r[r.length-1]);if(!i)throw new u("FILE_NOT_FOUND");if(!i.stat.isFile())throw new u("IO_ERROR");let s=await this.readVerified(await nn(e),i.abs,S.textBytes);return {ref:t,version:te(s.bytes),bytes:s.bytes.length,modifiedAt:s.stat.mtime.toISOString()}}async write(e,t,r,o){let i=t.split("/"),s=i[i.length-1],a=new Uint8Array(Buffer.from(r,"utf8"));return this.withFileLock(await oo(e,t),async()=>{let d=await ge(e.workspaceReal,[...e.segments,...i.slice(0,-1)]);if(d.status==="blocked")throw new u("IO_ERROR");let p=await we(d.dir),f=d.status==="complete"?await _e(d.dir,s):void 0;if(f&&!f.stat.isFile())throw new u("IO_ERROR");if((f?te((await this.readVerified(p.real,f.abs)).bytes):null)!==o)throw new u("DOCUMENT_CHANGED");let l=await this.createFolders(p,d.status==="missing"?d.missing:[]);await ro(l,s);let b=f?.abs??path.join(l.path,s);return await this.writeAtomically(l,b,s,a,f?.stat),{ref:t,version:te(a)}})}async readVerified(e,t,r){return await this.hooks.beforeOpen?.(t),so(e,t,r)}async createFolders(e,t){let r=e;for(let o of t){let i=path.join(r.path,o);await this.hooks.beforeMkdir?.(i);try{await Yr(i);}catch(s){if(s.code!=="EEXIST")throw new u("IO_ERROR")}r=await ao(r,i);}return r}async writeAtomically(e,t,r,o,i){let s=path.join(e.path,to(r)),a;try{await this.hooks.beforeOpen?.(s),a=await tt(s,fs.constants.O_CREAT|fs.constants.O_EXCL|fs.constants.O_WRONLY),await a.writeFile(o),i!==void 0&&await a.chmod(i.mode&4095),await a.sync(),await a.close(),a=void 0,await on(e),await eo(s,t);}catch(d){throw await a?.close().catch(()=>{}),await nt(s).catch(()=>{}),d instanceof u?d:new u("IO_ERROR")}}async withFileLock(e,t){let r=await Ae({lockDir:this.lockDir,key:e,waitMs:this.lockWaitMs});try{return await t()}finally{await me(r);}}};function to(n){return `.${n}.crewx-${crypto.randomUUID()}.tmp`}async function ro(n,e){let t=`.${e}.crewx-`;for(let r of await an(n.path))r.normalize("NFC").startsWith(t)&&r.endsWith(".tmp")&&await nt(path.join(n.path,r)).catch(()=>{});}async function rn(n){return (await io(n)).normalize("NFC").toLowerCase()}async function oo(n,e){return rn(path.join(n.workspaceReal,...n.segments,...e.split("/")))}async function io(n){let e=[],t=n;for(;;)try{return path.join(await rt(t),...e.reverse())}catch{let r=path.dirname(t);if(r===t)throw new u("IO_ERROR");e.push(path.basename(t)),t=r;}}async function so(n,e,t){let r=await tt(e,fs.constants.O_RDONLY);try{let o=await r.stat();if(!o.isFile())throw new u("IO_ERROR");if(t!==void 0&&o.size>t)throw new u("TOO_LARGE");let i=fo(await r.readFile());return await po(n,e,o),{bytes:i,stat:o}}finally{await r.close();}}async function nn(n){let e=await sn(path.join(n.workspaceReal,...n.segments));if(!tn(n.workspaceReal,e))throw new u("INVALID_REF");return e}async function _e(n,e){let t=(await an(n)).filter(i=>i.normalize("NFC")===e);if(t.length>1)throw new u("IO_ERROR");let r=path.join(n,t[0]??e),o=await dn(r);if(o){if(o.isSymbolicLink())throw new u("INVALID_REF");return {abs:r,stat:o}}}async function ge(n,e){let t=n;for(let r=0;r<e.length;r+=1){let o=await _e(t,e[r]);if(!o)return {status:"missing",dir:t,missing:e.slice(r)};if(!o.stat.isDirectory())return {status:"blocked"};t=o.abs;}return {status:"complete",dir:t}}async function ao(n,e){await on(n);let t=await we(e);if(path.dirname(t.real)!==n.real)throw new u("INVALID_REF");return t}async function uo(n,e,t){let r=[],o=s=>s===""?0:s.split("/").length-1,i=async(s,a)=>{let d=await lo(n,s),p=await an(s);await on(d);let f=new Set;for(let y of p){let l=y.normalize("NFC");if(f.has(l))throw new u("IO_ERROR");f.add(l);let b=path.join(s,y),A=await dn(b);if(!(!A||A.isSymbolicLink())){if(A.isDirectory())o(a)<S.refSegments-1&&U.test(l)&&await i(b,`${a}${l}/`);else if(A.isFile()){let m=Y(`${a}${l}`);m!==void 0&&r.push({ref:m,abs:b});}}}};return await i(e,t),r}function Qn(n,e){return n<e?-1:n>e?1:0}async function we(n){let e=await dn(n);if(e?.isSymbolicLink())throw new u("INVALID_REF");if(!e?.isDirectory())throw new u("IO_ERROR");return {path:n,real:await sn(n),dev:e.dev,ino:e.ino}}async function lo(n,e){let t=await we(e);if(!tn(n,t.real))throw new u("INVALID_REF");return t}async function on(n){let e=await we(n.path);if(e.real!==n.real||e.dev!==n.dev||e.ino!==n.ino)throw new u("INVALID_REF")}async function po(n,e,t){let r=await sn(e);if(!tn(n,r))throw new u("INVALID_REF");let o=await co(r);if(o.dev!==t.dev||o.ino!==t.ino)throw new u("INVALID_REF")}async function tt(n,e){try{return await Zr(n,e|fs.constants.O_NOFOLLOW)}catch(t){throw t.code==="ELOOP"?new u("INVALID_REF"):new u("IO_ERROR")}}async function sn(n){try{return await rt(n)}catch{throw new u("IO_ERROR")}}function rt(n){return new Promise((e,t)=>{fs.realpath.native(n,(r,o)=>r?t(r):e(o));})}async function an(n){try{return await Qr(n)}catch(e){let t=e.code;if(t==="ENOENT"||t==="ENOTDIR")return [];throw new u("IO_ERROR")}}async function dn(n){try{return await Kr(n)}catch(e){let t=e.code;if(t==="ENOENT"||t==="ENOTDIR")return;throw new u("IO_ERROR")}}async function co(n){try{return await no(n)}catch{throw new u("IO_ERROR")}}function fo(n){return new Uint8Array(n.buffer,n.byteOffset,n.byteLength)}function yo(n){try{return new TextDecoder("utf-8",{fatal:!0,ignoreBOM:!0}).decode(n)}catch{throw new u("IO_ERROR")}}var it=util.promisify(fs.realpath.native),st="CREWX_APP_FILES_ROOT";function _o(n,e={}){return {async list(t={}){let r=vn(t.prefix),o=t.after===void 0||t.after===null?void 0:Z(t.after),i=await Oe(n,e);return Se(n,e).list(i,r,o)},async read(t){let r=Z(t),o=await Oe(n,e);return Se(n,e).read(o,r)},async stat(t){let r=Z(t),o=await Oe(n,e);return Se(n,e).stat(o,r)},async write(t,r,o){let i=Z(t),s=jn(r),a=Mn(o),d=await Oe(n,e);return Se(n,e).write(d,i,s,a)}}}async function Oe(n,e){let t=await So(n.workspaceRoot),r=(e.env??process.env)[st]??e.filesRoot;if(r!==void 0)return {workspaceReal:t,segments:Eo(r)};let o=e.packageDir??process.cwd(),i=await $n(o);if(i.appId===void 0)throw new u("IO_ERROR");let s=zn({appId:i.appId,origin:e.origin??"not_installed",source:e.source??"workspace",packageRelativePath:await Oo(t,o),declared:i.declared});return {workspaceReal:t,segments:s.segments}}function Eo(n){let e=he(n);if(e===void 0)throw new u("IO_ERROR");return e}function Se(n,e){let t=path.join(e.crewxHome??en(),ye);return new Ee({},{lockDir:t,lockWaitMs:wo(n)})}function wo(n){let e;try{e=n.context?.nowMs;}catch{e=void 0;}return typeof e!="number"||!Number.isSafeInteger(e)?ne:Math.max(0,e+ne-Date.now())}async function Oo(n,e){let t;try{t=await it(e);}catch{return}let r=path.relative(n,t);if(!(r===""||r===".."||r.startsWith(`..${path.sep}`)||path.isAbsolute(r)))return r.split(path.sep).join("/")}async function So(n){try{return await it(n)}catch{throw new u("IO_ERROR")}}var Re=2,Ie=2097152;var H=2*1024*1024,Pe=2e4;function un(n){return crypto.createHash("sha256").update(n).digest("hex")}function Te(n){if(n.byteLength===0)return 0;let e=0;for(let t of n)t===10&&(e+=1);return n[n.byteLength-1]!==10&&(e+=1),e}var Po=Ie+1+H,To=64*1024,Co=10,Ce={kind:"invalid"};function ko(n,e){try{let t=[],r=0;for(;;){let s=new Uint8Array(To),a=fs.readSync(n,s,0,s.length,null);if(a===0)break;if(r+=a,r>e)return;t.push(s.subarray(0,a));}let o=new Uint8Array(r),i=0;for(let s of t)o.set(s,i),i+=s.byteLength;return o}catch{return}}function ke(n){return No(ko(n,Po))}function No(n){if(n===void 0)return Ce;let e=n.indexOf(Co);if(n.byteLength<=Ie){let r=vo(Buffer.from(n.buffer,n.byteOffset,n.byteLength).toString("utf8"));if(r.ok&&!(e>=0&&x(r.value)&&r.value.schemaVersion===Re))return {kind:"v1",value:r.value}}if(e<=0||e>Ie)return Ce;let t;try{t=JSON.parse(new TextDecoder("utf-8",{fatal:!0}).decode(n.subarray(0,e)));}catch{return Ce}return !x(t)||t.schemaVersion!==Re?Ce:{kind:"v2",header:t,body:n.subarray(e+1)}}var Jo="actionId,content,input,schemaVersion,state",Do="bytes,lines,mediaType,sha256",xo="mediaType,range",Fo=/^[a-f0-9]{64}$/u,Lo=new TextDecoder("utf-8",{fatal:true,ignoreBOM:true});function ut(n,e){let t=d=>({code:d,outcome:"rejected"});if(oe(n)!==Jo||n.schemaVersion!==Re||typeof n.actionId!="string"||!x(n.input)||!x(n.state)||!x(n.content)||oe(n.content)!=="in,out")return {code:"INPUT_INVALID",outcome:"failed"};let r=n.content,o,i=r.in;if(i===null){if(e.byteLength!==0)return t(e.byteLength>H?"CONTENT_TOO_LARGE":"CONTENT_DIGEST_MISMATCH")}else {if(!x(i)||oe(i)!==Do||!at(i.mediaType)||!dt(i.bytes,H)||!dt(i.lines,Pe)||typeof i.sha256!="string"||!Fo.test(i.sha256)||e.byteLength!==i.bytes)return t(e.byteLength>H?"CONTENT_TOO_LARGE":"CONTENT_DIGEST_MISMATCH");if(un(e)!==i.sha256||Te(e)!==i.lines)return t("CONTENT_DIGEST_MISMATCH");let d;try{d=Lo.decode(e);}catch{return t("CONTENT_ENCODING_INVALID")}o={mediaType:i.mediaType,text:d};}let s,a=r.out;if(a!==null){if(!x(a)||oe(a)!==xo||!at(a.mediaType))return t("CONTENT_SOURCE_UNSUPPORTED");let d=a.range;if(d!==null&&!jo(d))return t("CONTENT_SOURCE_UNSUPPORTED");s={mediaType:a.mediaType,...d===null?{}:{range:{startLine:d.startLine,lineCount:d.lineCount}}};}return {actionId:n.actionId,input:n.input,state:n.state,content:{...o===void 0?{}:{in:o},...s===void 0?{}:{out:s}}}}function lt(n){return Object.hasOwn(n,"code")}function pt(n,e){let t=r=>({code:r,outcome:"rejected"});if(n?.in===void 0){if(e.in!==void 0)return t("CONTENT_SOURCE_UNSUPPORTED")}else if(e.in===void 0){if(n.in.required===true)return t("CONTENT_REQUIRED")}else if(e.in.mediaType!==n.in.mediaType)return t("CONTENT_SOURCE_UNSUPPORTED");if(n?.out===void 0){if(e.out!==void 0)return t("CONTENT_SOURCE_UNSUPPORTED")}else {if(e.out===void 0)return t("CONTENT_REQUIRED");if(e.out.mediaType!==n.out.mediaType||e.out.range!==void 0&&n.out.range!==true)return t("CONTENT_SOURCE_UNSUPPORTED")}}function Ne(n,e){let{content:t,...r}=n,o=e===void 0?r:{...r,content:{bytes:e.body.byteLength,lines:Te(e.body),sha256:un(e.body),...e.range===void 0?{}:{range:e.range}}},i=new TextEncoder().encode(`${JSON.stringify(o)}
|
|
3
3
|
`);if(e===void 0)return i;let s=new Uint8Array(i.byteLength+e.body.byteLength);return s.set(i,0),s.set(e.body,i.byteLength),s}function ct(n){if(n.body.byteLength>H||Te(n.body)>Pe)return {code:"CONTENT_TOO_LARGE",outcome:"failed"}}function vo(n){try{return {ok:!0,value:JSON.parse(n)}}catch{return {ok:false}}}function oe(n){return Object.keys(n).sort().join(",")}function x(n){if(n===null||typeof n!="object"||Array.isArray(n))return false;let e=Object.getPrototypeOf(n);return e===Object.prototype||e===null}function at(n){return typeof n=="string"&&L.includes(n)}function dt(n,e){return Number.isSafeInteger(n)&&n>=0&&n<=e}function jo(n){return x(n)&&oe(n)==="lineCount,startLine"&&Number.isSafeInteger(n.startLine)&&n.startLine>=1&&Number.isSafeInteger(n.lineCount)&&n.lineCount>=1&&n.lineCount<=Pe}var yt="CREWX_APP_JOB_CHANNEL",R=1,ie=4096,cn=1e4,fn=5e3,yn=512,ln=Object.freeze({min:3,max:16}),Mo=["APP_JOB_BRIDGE_UNAVAILABLE","APP_JOB_BRIDGE_INVALID","APP_JOB_BRIDGE_TIMEOUT","APP_JOB_BRIDGE_CLOSED"],ae=/^[A-Za-z0-9._:-]{1,128}$/u,Bo=64,At=2147483647,se=class{#e="";#n=false;push(e){let t=[],r=e;for(;;){let o=r.indexOf(`
|
|
4
|
-
`);if(o===-1)return this.#n||(this.#e+=r,q(this.#e)>ie&&(t.push({kind:"oversized"}),this.#e="",this.#n=true)),t;let i=r.slice(0,o);if(r=r.slice(o+1),this.#n){this.#n=false;continue}let s=this.#e+i;this.#e="",t.push(q(s)>ie?{kind:"oversized"}:{kind:"line",line:s});}}};function xe(n){let e=JSON.stringify(n);if(q(e)>ie)throw new TypeError("App job bridge message is over the line bound");return e}function Uo(n){let e=Fe(n);if(e===void 0||e.v!==R||!mt(e.requestId)||!bt(e.seq))return;let t={v:R,requestId:e.requestId,seq:e.seq};switch(e.op){case "start":return E(e,["v","op","requestId","seq"],[])?{...t,op:"start"}:void 0;case "status":{if(!E(e,["v","op","requestId","seq"],["handle"]))return;if(e.handle===void 0)return {...t,op:"status"};let r=pn(e.handle);return r===void 0?void 0:{...t,op:"status",handle:r}}case "cancel":{if(!E(e,["v","op","requestId","seq","handle"],[]))return;let r=pn(e.handle);return r===void 0?void 0:{...t,op:"cancel",handle:r}}default:return}}function An(n){let e=Fe(n);if(e===void 0||e.v!==R||!mt(e.requestId)||!bt(e.seq))return;let t={v:R,requestId:e.requestId,seq:e.seq};if(e.ok===false)return E(e,["v","requestId","seq","ok","code"],[])&&Xe.includes(e.code)?{...t,ok:false,code:e.code}:void 0;if(e.ok===true)switch(e.op){case "start":{if(!E(e,["v","requestId","seq","ok","op","outcome","job"],[]))return;let r=Je(e.job),o=e.outcome;return r===void 0||o!=="started"&&o!=="attached"?void 0:{...t,ok:true,op:"start",outcome:o,job:r}}case "status":{if(!E(e,["v","requestId","seq","ok","op","job"],[]))return;if(e.job===null)return {...t,ok:true,op:"status",job:null};let r=Je(e.job);return r===void 0?void 0:{...t,ok:true,op:"status",job:r}}case "cancel":{if(!E(e,["v","requestId","seq","ok","op","outcome","job"],[]))return;let r=Je(e.job);return r===void 0||e.outcome!=="stopping"?void 0:{...t,ok:true,op:"cancel",outcome:"stopping",job:r}}default:return}}function Ho(n){let e=Fe(n);if(e===void 0||e.v!==R||typeof e.runId!="string"||!ae.test(e.runId)||!ve(e.generation))return;let t={v:R,runId:e.runId,generation:e.generation};switch(e.kind){case "heartbeat":return E(e,["v","kind","runId","generation"],[])?{...t,kind:"heartbeat"}:void 0;case "completed":return E(e,["v","kind","runId","generation"],[])?{...t,kind:"completed"}:void 0;case "progress":{if(!E(e,["v","kind","runId","generation","phase"],["completed","total","resumable"]))return;let{completed:r,total:o,resumable:i}=e;return !B(e.phase)||r!==void 0&&!De(r)||o!==void 0&&!De(o)||r!==void 0&&o!==void 0&&r>o||i!==void 0&&typeof i!="boolean"?void 0:{...t,kind:"progress",phase:e.phase,...r===void 0?{}:{completed:r},...o===void 0?{}:{total:o},...i===void 0?{}:{resumable:i}}}case "failed":return E(e,["v","kind","runId","generation","code","recoverable"],[])&&M(e.code)&&typeof e.recoverable=="boolean"?{...t,kind:"failed",code:e.code,recoverable:e.recoverable}:void 0;default:return}}function mn(n){let e=Fe(n);if(!(e===void 0||!E(e,["v","kind","runId","generation","reason"],[])||e.v!==R||e.kind!=="stop"||typeof e.runId!="string"||!ae.test(e.runId)||!ve(e.generation)||!le.includes(e.reason)))return {v:R,kind:"stop",runId:e.runId,generation:e.generation,reason:e.reason}}function bn(n){let e=Le(n)?n:void 0;if(!(e===void 0||e.v!==R||!Go(e.fd))){if(e.role==="control"){let t=e.operations;return !E(e,["v","role","fd","operations"],[])||!Array.isArray(t)||t.length===0||new Set(t).size!==t.length||!t.every(z)?void 0:{v:1,role:"control",fd:e.fd,operations:[...t]}}if(e.role==="run")return !E(e,["v","role","fd","runId","generation"],[])||typeof e.runId!="string"||!ae.test(e.runId)||!ve(e.generation)?void 0:{v:1,role:"run",fd:e.fd,runId:e.runId,generation:e.generation}}}function gn(n){let e=n[yt];if(typeof e!="string"||q(e)>yn)return;let t;try{t=JSON.parse(e);}catch{return}return bn(t)}function qo(n){let e=bn(JSON.parse(JSON.stringify(n)));if(e===void 0)throw new TypeError("App job channel descriptor is invalid");let t=JSON.stringify(e);if(q(t)>yn)throw new TypeError("App job channel descriptor is over its bound");return Object.freeze({CREWX_APP_JOB_CHANNEL:t})}function Vo(n){return n==="schedule"?"schedule":"manual"}function Xo(n){return Je(n)}function Je(n){let e=Le(n)?n:void 0;if(e===void 0||!E(e,["handle","state","stopReason","trigger","outcome","phase","completed","total","resumable","lastHeartbeatAt","startedAt","finishedAt","errorCode","recoverable"],[]))return;let t=pn(e.handle),r=e.stopReason,o=e.outcome,i=e.phase,s=e.errorCode,a=e.recoverable;if(!(t===void 0||!He.includes(e.state)||!(r===null||le.includes(r))||r!==null&&e.state!=="stopping"||!Ve.includes(e.trigger)||!(o===null||qe.includes(o))||!(i===null||B(i))||!(e.completed===null||De(e.completed))||!(e.total===null||De(e.total))||typeof e.resumable!="boolean"||!ft(e.lastHeartbeatAt)||!gt(e.startedAt)||!ft(e.finishedAt)||!(s===null||M(s))||!(a===null||typeof a=="boolean")))return {handle:t,state:e.state,stopReason:r,trigger:e.trigger,outcome:o,phase:i,completed:e.completed,total:e.total,resumable:e.resumable,lastHeartbeatAt:e.lastHeartbeatAt,startedAt:e.startedAt,finishedAt:e.finishedAt,errorCode:s,recoverable:a}}function pn(n){if(!(!Le(n)||!E(n,["runId","generation"],[]))&&!(typeof n.runId!="string"||!ae.test(n.runId)||!ve(n.generation)))return {runId:n.runId,generation:n.generation}}function Fe(n){if(q(n)>ie)return;let e;try{e=JSON.parse(n);}catch{return}return Le(e)?e:void 0}function E(n,e,t){let r=new Set([...e,...t]);return Object.keys(n).every(o=>r.has(o))&&e.every(o=>Object.hasOwn(n,o))}function Le(n){if(n===null||typeof n!="object"||Array.isArray(n))return false;let e=Object.getPrototypeOf(n);return e===Object.prototype||e===null}function mt(n){return typeof n=="string"&&ae.test(n)}function bt(n){return Number.isSafeInteger(n)&&n>=1&&n<=At}function ve(n){return Number.isSafeInteger(n)&&n>=1&&n<=At}function Go(n){return Number.isSafeInteger(n)&&n>=ln.min&&n<=ln.max}function De(n){return Number.isSafeInteger(n)&&n>=0}function gt(n){return typeof n=="string"&&n.length>0&&n.length<=Bo}function ft(n){return n===null||gt(n)}function q(n){return new TextEncoder().encode(n).byteLength}var $o=2147483647,V=class{#e;#n;#l;#y=crypto.randomUUID();#A=new se;#o=new Map;#s=new Set;#t;#p=0;#r=false;#c=false;#a=false;#d=null;constructor(e){this.#e=e.channel,this.#n=e.open??_t,this.#l=e.replyTimeoutMs??cn;}jobsFor(e){let t=this.#e;if(t.role!=="control"||e===void 0)return;let r=t.operations,o=pe.filter(s=>e.includes(s)&&r.includes(s));if(o.length===0)return;let i=s=>{if(!o.includes(s))throw new f("APP_JOB_NOT_GRANTED",null,{outcome:"rejected"})};return Object.freeze({granted:Object.freeze(o),start:async()=>{i("start");let s=await this.#u("start",{});if(s.ok===false)return {kind:"refused",code:s.code};if(s.op!=="start")throw new f("APP_JOB_BRIDGE_INVALID",null,{outcome:"failed"});return {kind:s.outcome,job:s.job}},status:async s=>{i("status");let a=await this.#u("status",s===void 0?{}:{handle:s});if(a.ok===false)return {kind:"refused",code:a.code};if(a.op!=="status")throw new f("APP_JOB_BRIDGE_INVALID",null,{outcome:"failed"});return {kind:"status",job:a.job}},cancel:async s=>{i("cancel");let a=await this.#u("cancel",{handle:s});if(a.ok===false)return {kind:"refused",code:a.code};if(a.op!=="cancel")throw new f("APP_JOB_BRIDGE_INVALID",null,{outcome:"failed"});return {kind:"stopping",job:a.job}}})}runFor(e){let t=this.#e;if(t.role!=="run"||!e)return;try{this.#f();}catch{return}let r={v:R,runId:t.runId,generation:t.generation},o=()=>this.#d,i=s=>{this.#r||this.#c||this.#t===void 0||this.#t.write(xe({...r,...s}));};return Object.freeze({handle:Object.freeze({runId:t.runId,generation:t.generation}),get stopRequested(){return o()!==null},get stopReason(){return o()},progress:s=>{if(!B(s.phase))throw new TypeError("progress phase must be a lower snake case name");if(s.completed!==void 0&&!ht(s.completed))throw new TypeError("progress completed must be a count");if(s.total!==void 0&&!ht(s.total))throw new TypeError("progress total must be a count");if(s.completed!==void 0&&s.total!==void 0&&s.completed>s.total)throw new TypeError("progress completed cannot exceed total");if(s.resumable!==void 0&&typeof s.resumable!="boolean")throw new TypeError("progress resumable must be boolean");this.#a||i({kind:"progress",phase:s.phase,...s.completed===void 0?{}:{completed:s.completed},...s.total===void 0?{}:{total:s.total},...s.resumable===void 0?{}:{resumable:s.resumable}});},heartbeat:()=>{this.#a||i({kind:"heartbeat"});},complete:()=>{i({kind:"completed"}),this.#a=true;},fail:(s,a)=>{if(!M(s))throw new TypeError("fail code must be an upper snake case code");if(typeof a!="boolean")throw new TypeError("fail recoverable must be boolean");i({kind:"failed",code:s,recoverable:a}),this.#a=true;},onStop:s=>{let a=o();return a!==null?(s(a),()=>{}):(this.#s.add(s),()=>{this.#s.delete(s);})}})}close(){this.#i("APP_JOB_BRIDGE_CLOSED");}async drain(e=fn){if(this.#r)return;this.#c=true;let t=this.#t,r;try{if(t!==void 0){let o;try{o=t.drain();}catch{o=Promise.resolve();}await Promise.race([o.catch(()=>{}),new Promise(i=>{r=setTimeout(i,e);})]);}}finally{clearTimeout(r),this.close();}}#u(e,t){let r=this.#f(),o=this.#p+1;if(o>$o)throw new f("APP_JOB_BRIDGE_CLOSED",null,{outcome:"failed"});this.#p=o;let i=`${this.#y}.${o}`,s=xe({v:R,op:e,requestId:i,seq:o,...t});return new Promise((a,d)=>{let p=setTimeout(()=>this.#i("APP_JOB_BRIDGE_TIMEOUT"),this.#l);this.#o.set(o,{op:e,requestId:i,resolve:a,reject:d,timer:p}),r.write(s);})}#f(){if(this.#r)throw new f("APP_JOB_BRIDGE_CLOSED",null,{outcome:"failed"});if(this.#t!==void 0)return this.#t;let e;try{e=this.#n(this.#e.fd);}catch{throw new f("APP_JOB_BRIDGE_UNAVAILABLE",null,{outcome:"failed"})}return e.onData(t=>this.#m(t)),e.onEnd(()=>this.#i("APP_JOB_BRIDGE_CLOSED")),this.#t=e,e}#m(e){for(let t of this.#A.push(e)){if(this.#r)return;if(this.#e.role==="run")t.kind==="line"&&this.#g(t.line);else if(t.kind==="oversized"){this.#i("APP_JOB_BRIDGE_INVALID");return}else this.#b(t.line);}}#b(e){let t=An(e),r=t===void 0?void 0:this.#o.get(t.seq);if(t===void 0||r===void 0||r.requestId!==t.requestId||t.ok&&t.op!==r.op){this.#i("APP_JOB_BRIDGE_INVALID");return}clearTimeout(r.timer),this.#o.delete(t.seq),r.resolve(t);}#g(e){let t=this.#e;if(t.role!=="run")return;let r=mn(e);if(!(r===void 0||r.runId!==t.runId||r.generation!==t.generation)&&this.#d===null){this.#d=r.reason;for(let o of [...this.#s])try{o(r.reason);}catch{}}}#i(e){if(this.#r)return;this.#r=true;let t=[...this.#o.values()];this.#o.clear();for(let o of t)clearTimeout(o.timer),o.reject(new f(e,null,{outcome:"failed"}));this.#s.clear();let r=this.#t;this.#t=void 0,r?.close();}};function _t(n){let e=new net.Socket({fd:n,readable:true,writable:true});return e.setEncoding("utf8"),e.on("error",()=>{}),{write:t=>{e.write(`${t}
|
|
5
|
-
`);},drain:()=>new Promise(t=>{if(e.destroyed){t();return}e.write("",()=>t());}),onData:t=>{e.on("data",t);},onEnd:t=>{e.on("close",t);},close:()=>{e.destroy();}}}function
|
|
6
|
-
`;}catch(l){p("EXECUTION_FAILED",l);let b=Et(e.emptyState);try{let A=(e.sanitize??
|
|
4
|
+
`);if(o===-1)return this.#n||(this.#e+=r,q(this.#e)>ie&&(t.push({kind:"oversized"}),this.#e="",this.#n=true)),t;let i=r.slice(0,o);if(r=r.slice(o+1),this.#n){this.#n=false;continue}let s=this.#e+i;this.#e="",t.push(q(s)>ie?{kind:"oversized"}:{kind:"line",line:s});}}};function xe(n){let e=JSON.stringify(n);if(q(e)>ie)throw new TypeError("App job bridge message is over the line bound");return e}function Uo(n){let e=Fe(n);if(e===void 0||e.v!==R||!mt(e.requestId)||!bt(e.seq))return;let t={v:R,requestId:e.requestId,seq:e.seq};switch(e.op){case "start":return E(e,["v","op","requestId","seq"],[])?{...t,op:"start"}:void 0;case "status":{if(!E(e,["v","op","requestId","seq"],["handle"]))return;if(e.handle===void 0)return {...t,op:"status"};let r=pn(e.handle);return r===void 0?void 0:{...t,op:"status",handle:r}}case "cancel":{if(!E(e,["v","op","requestId","seq","handle"],[]))return;let r=pn(e.handle);return r===void 0?void 0:{...t,op:"cancel",handle:r}}default:return}}function An(n){let e=Fe(n);if(e===void 0||e.v!==R||!mt(e.requestId)||!bt(e.seq))return;let t={v:R,requestId:e.requestId,seq:e.seq};if(e.ok===false)return E(e,["v","requestId","seq","ok","code"],[])&&Xe.includes(e.code)?{...t,ok:false,code:e.code}:void 0;if(e.ok===true)switch(e.op){case "start":{if(!E(e,["v","requestId","seq","ok","op","outcome","job"],[]))return;let r=Je(e.job),o=e.outcome;return r===void 0||o!=="started"&&o!=="attached"?void 0:{...t,ok:true,op:"start",outcome:o,job:r}}case "status":{if(!E(e,["v","requestId","seq","ok","op","job"],[]))return;if(e.job===null)return {...t,ok:true,op:"status",job:null};let r=Je(e.job);return r===void 0?void 0:{...t,ok:true,op:"status",job:r}}case "cancel":{if(!E(e,["v","requestId","seq","ok","op","outcome","job"],[]))return;let r=Je(e.job);return r===void 0||e.outcome!=="stopping"?void 0:{...t,ok:true,op:"cancel",outcome:"stopping",job:r}}default:return}}function Ho(n){let e=Fe(n);if(e===void 0||e.v!==R||typeof e.runId!="string"||!ae.test(e.runId)||!ve(e.generation))return;let t={v:R,runId:e.runId,generation:e.generation};switch(e.kind){case "heartbeat":return E(e,["v","kind","runId","generation"],[])?{...t,kind:"heartbeat"}:void 0;case "completed":return E(e,["v","kind","runId","generation"],[])?{...t,kind:"completed"}:void 0;case "progress":{if(!E(e,["v","kind","runId","generation","phase"],["completed","total","resumable"]))return;let{completed:r,total:o,resumable:i}=e;return !B(e.phase)||r!==void 0&&!De(r)||o!==void 0&&!De(o)||r!==void 0&&o!==void 0&&r>o||i!==void 0&&typeof i!="boolean"?void 0:{...t,kind:"progress",phase:e.phase,...r===void 0?{}:{completed:r},...o===void 0?{}:{total:o},...i===void 0?{}:{resumable:i}}}case "failed":return E(e,["v","kind","runId","generation","code","recoverable"],[])&&M(e.code)&&typeof e.recoverable=="boolean"?{...t,kind:"failed",code:e.code,recoverable:e.recoverable}:void 0;default:return}}function mn(n){let e=Fe(n);if(!(e===void 0||!E(e,["v","kind","runId","generation","reason"],[])||e.v!==R||e.kind!=="stop"||typeof e.runId!="string"||!ae.test(e.runId)||!ve(e.generation)||!le.includes(e.reason)))return {v:R,kind:"stop",runId:e.runId,generation:e.generation,reason:e.reason}}function bn(n){let e=Le(n)?n:void 0;if(!(e===void 0||e.v!==R||!Go(e.fd))){if(e.role==="control"){let t=e.operations;return !E(e,["v","role","fd","operations"],[])||!Array.isArray(t)||t.length===0||new Set(t).size!==t.length||!t.every(z)?void 0:{v:1,role:"control",fd:e.fd,operations:[...t]}}if(e.role==="run")return !E(e,["v","role","fd","runId","generation"],[])||typeof e.runId!="string"||!ae.test(e.runId)||!ve(e.generation)?void 0:{v:1,role:"run",fd:e.fd,runId:e.runId,generation:e.generation}}}function hn(n){let e=n[yt];if(typeof e!="string"||q(e)>yn)return;let t;try{t=JSON.parse(e);}catch{return}return bn(t)}function qo(n){let e=bn(JSON.parse(JSON.stringify(n)));if(e===void 0)throw new TypeError("App job channel descriptor is invalid");let t=JSON.stringify(e);if(q(t)>yn)throw new TypeError("App job channel descriptor is over its bound");return Object.freeze({CREWX_APP_JOB_CHANNEL:t})}function Vo(n){return n==="schedule"?"schedule":"manual"}function Xo(n){return Je(n)}function Je(n){let e=Le(n)?n:void 0;if(e===void 0||!E(e,["handle","state","stopReason","trigger","outcome","phase","completed","total","resumable","lastHeartbeatAt","startedAt","finishedAt","errorCode","recoverable"],[]))return;let t=pn(e.handle),r=e.stopReason,o=e.outcome,i=e.phase,s=e.errorCode,a=e.recoverable;if(!(t===void 0||!He.includes(e.state)||!(r===null||le.includes(r))||r!==null&&e.state!=="stopping"||!Ve.includes(e.trigger)||!(o===null||qe.includes(o))||!(i===null||B(i))||!(e.completed===null||De(e.completed))||!(e.total===null||De(e.total))||typeof e.resumable!="boolean"||!ft(e.lastHeartbeatAt)||!ht(e.startedAt)||!ft(e.finishedAt)||!(s===null||M(s))||!(a===null||typeof a=="boolean")))return {handle:t,state:e.state,stopReason:r,trigger:e.trigger,outcome:o,phase:i,completed:e.completed,total:e.total,resumable:e.resumable,lastHeartbeatAt:e.lastHeartbeatAt,startedAt:e.startedAt,finishedAt:e.finishedAt,errorCode:s,recoverable:a}}function pn(n){if(!(!Le(n)||!E(n,["runId","generation"],[]))&&!(typeof n.runId!="string"||!ae.test(n.runId)||!ve(n.generation)))return {runId:n.runId,generation:n.generation}}function Fe(n){if(q(n)>ie)return;let e;try{e=JSON.parse(n);}catch{return}return Le(e)?e:void 0}function E(n,e,t){let r=new Set([...e,...t]);return Object.keys(n).every(o=>r.has(o))&&e.every(o=>Object.hasOwn(n,o))}function Le(n){if(n===null||typeof n!="object"||Array.isArray(n))return false;let e=Object.getPrototypeOf(n);return e===Object.prototype||e===null}function mt(n){return typeof n=="string"&&ae.test(n)}function bt(n){return Number.isSafeInteger(n)&&n>=1&&n<=At}function ve(n){return Number.isSafeInteger(n)&&n>=1&&n<=At}function Go(n){return Number.isSafeInteger(n)&&n>=ln.min&&n<=ln.max}function De(n){return Number.isSafeInteger(n)&&n>=0}function ht(n){return typeof n=="string"&&n.length>0&&n.length<=Bo}function ft(n){return n===null||ht(n)}function q(n){return new TextEncoder().encode(n).byteLength}var $o=2147483647,V=class{#e;#n;#l;#y=crypto.randomUUID();#A=new se;#o=new Map;#s=new Set;#t;#p=0;#r=false;#c=false;#a=false;#d=null;constructor(e){this.#e=e.channel,this.#n=e.open??_t,this.#l=e.replyTimeoutMs??cn;}jobsFor(e){let t=this.#e;if(t.role!=="control"||e===void 0)return;let r=t.operations,o=pe.filter(s=>e.includes(s)&&r.includes(s));if(o.length===0)return;let i=s=>{if(!o.includes(s))throw new c("APP_JOB_NOT_GRANTED",null,{outcome:"rejected"})};return Object.freeze({granted:Object.freeze(o),start:async()=>{i("start");let s=await this.#u("start",{});if(s.ok===false)return {kind:"refused",code:s.code};if(s.op!=="start")throw new c("APP_JOB_BRIDGE_INVALID",null,{outcome:"failed"});return {kind:s.outcome,job:s.job}},status:async s=>{i("status");let a=await this.#u("status",s===void 0?{}:{handle:s});if(a.ok===false)return {kind:"refused",code:a.code};if(a.op!=="status")throw new c("APP_JOB_BRIDGE_INVALID",null,{outcome:"failed"});return {kind:"status",job:a.job}},cancel:async s=>{i("cancel");let a=await this.#u("cancel",{handle:s});if(a.ok===false)return {kind:"refused",code:a.code};if(a.op!=="cancel")throw new c("APP_JOB_BRIDGE_INVALID",null,{outcome:"failed"});return {kind:"stopping",job:a.job}}})}runFor(e){let t=this.#e;if(t.role!=="run"||!e)return;try{this.#f();}catch{return}let r={v:R,runId:t.runId,generation:t.generation},o=()=>this.#d,i=s=>{this.#r||this.#c||this.#t===void 0||this.#t.write(xe({...r,...s}));};return Object.freeze({handle:Object.freeze({runId:t.runId,generation:t.generation}),get stopRequested(){return o()!==null},get stopReason(){return o()},progress:s=>{if(!B(s.phase))throw new TypeError("progress phase must be a lower snake case name");if(s.completed!==void 0&&!gt(s.completed))throw new TypeError("progress completed must be a count");if(s.total!==void 0&&!gt(s.total))throw new TypeError("progress total must be a count");if(s.completed!==void 0&&s.total!==void 0&&s.completed>s.total)throw new TypeError("progress completed cannot exceed total");if(s.resumable!==void 0&&typeof s.resumable!="boolean")throw new TypeError("progress resumable must be boolean");this.#a||i({kind:"progress",phase:s.phase,...s.completed===void 0?{}:{completed:s.completed},...s.total===void 0?{}:{total:s.total},...s.resumable===void 0?{}:{resumable:s.resumable}});},heartbeat:()=>{this.#a||i({kind:"heartbeat"});},complete:()=>{i({kind:"completed"}),this.#a=true;},fail:(s,a)=>{if(!M(s))throw new TypeError("fail code must be an upper snake case code");if(typeof a!="boolean")throw new TypeError("fail recoverable must be boolean");i({kind:"failed",code:s,recoverable:a}),this.#a=true;},onStop:s=>{let a=o();return a!==null?(s(a),()=>{}):(this.#s.add(s),()=>{this.#s.delete(s);})}})}close(){this.#i("APP_JOB_BRIDGE_CLOSED");}async drain(e=fn){if(this.#r)return;this.#c=true;let t=this.#t,r;try{if(t!==void 0){let o;try{o=t.drain();}catch{o=Promise.resolve();}await Promise.race([o.catch(()=>{}),new Promise(i=>{r=setTimeout(i,e);})]);}}finally{clearTimeout(r),this.close();}}#u(e,t){let r=this.#f(),o=this.#p+1;if(o>$o)throw new c("APP_JOB_BRIDGE_CLOSED",null,{outcome:"failed"});this.#p=o;let i=`${this.#y}.${o}`,s=xe({v:R,op:e,requestId:i,seq:o,...t});return new Promise((a,d)=>{let p=setTimeout(()=>this.#i("APP_JOB_BRIDGE_TIMEOUT"),this.#l);this.#o.set(o,{op:e,requestId:i,resolve:a,reject:d,timer:p}),r.write(s);})}#f(){if(this.#r)throw new c("APP_JOB_BRIDGE_CLOSED",null,{outcome:"failed"});if(this.#t!==void 0)return this.#t;let e;try{e=this.#n(this.#e.fd);}catch{throw new c("APP_JOB_BRIDGE_UNAVAILABLE",null,{outcome:"failed"})}return e.onData(t=>this.#m(t)),e.onEnd(()=>this.#i("APP_JOB_BRIDGE_CLOSED")),this.#t=e,e}#m(e){for(let t of this.#A.push(e)){if(this.#r)return;if(this.#e.role==="run")t.kind==="line"&&this.#h(t.line);else if(t.kind==="oversized"){this.#i("APP_JOB_BRIDGE_INVALID");return}else this.#b(t.line);}}#b(e){let t=An(e),r=t===void 0?void 0:this.#o.get(t.seq);if(t===void 0||r===void 0||r.requestId!==t.requestId||t.ok&&t.op!==r.op){this.#i("APP_JOB_BRIDGE_INVALID");return}clearTimeout(r.timer),this.#o.delete(t.seq),r.resolve(t);}#h(e){let t=this.#e;if(t.role!=="run")return;let r=mn(e);if(!(r===void 0||r.runId!==t.runId||r.generation!==t.generation)&&this.#d===null){this.#d=r.reason;for(let o of [...this.#s])try{o(r.reason);}catch{}}}#i(e){if(this.#r)return;this.#r=true;let t=[...this.#o.values()];this.#o.clear();for(let o of t)clearTimeout(o.timer),o.reject(new c(e,null,{outcome:"failed"}));this.#s.clear();let r=this.#t;this.#t=void 0,r?.close();}};function _t(n){let e=new net.Socket({fd:n,readable:true,writable:true});return e.setEncoding("utf8"),e.on("error",()=>{}),{write:t=>{e.write(`${t}
|
|
5
|
+
`);},drain:()=>new Promise(t=>{if(e.destroyed){t();return}e.write("",()=>t());}),onData:t=>{e.on("data",t);},onEnd:t=>{e.on("close",t);},close:()=>{e.destroy();}}}function gt(n){return Number.isSafeInteger(n)&&n>=0}var Yo=1;async function Zo(n,e,t=process.env.CREWX_WORKSPACE_ROOT??process.cwd(),r){return (await Ot(n,e,t,void 0,true,void 0,r)).response}async function Ot(n,e,t,r,o=true,i,s,a){let d=i!==void 0,p=w(e)?e:void 0,f=p?.input,y=p?.state,l=new n({state:w(y)?y:{},workspaceRoot:t,...s===void 0?{}:{context:s}}),b=w(f)?f:{},A=w(y)?y:l.emptyState(),m={},I=p!==void 0&&Object.hasOwn(p,"schedule"),P;try{let _;if(d){if(p===void 0||I)throw new c("INPUT_INVALID");let O=ut(p,i);if(lt(O))throw new c(O.code,null,{outcome:O.outcome});(({actionId:_,input:b,state:A}=O)),m=O.content;}else {let O=I&&p!==void 0?Tn(p.schedule):void 0;if(!p||Object.keys(p).length!==(I?5:4)||!["schemaVersion","actionId","input","state"].every(Rt=>Object.hasOwn(p,Rt))||p.schemaVersion!==Yo||typeof p.actionId!="string"||!w(f)||!w(y)||I&&O===void 0)throw new c("INPUT_INVALID");_=p.actionId,b=f,A=y,P=O;}let h=K(n).find(({options:O})=>O.name===_);if(h?.options.viewCall===!0)throw new c("VIEW_CALL_SCREEN_ONLY","This action can only be called through the visible App screen.");let J=h===void 0?void 0:a?.jobsFor(h.options.jobAccess),T=h===void 0?void 0:a?.runFor(h.options.job!==void 0);if(l=new n({state:A,workspaceRoot:t,...s===void 0?{}:{context:s},...P===void 0?{}:{schedule:P},...J===void 0?{}:{jobs:J},...T===void 0?{}:{jobRun:T}}),await l.validate(_,b,A),!h)throw new c("INPUT_INVALID");if(P!==void 0&&(h.options.content!==void 0||!Jn(n)))throw new c("INPUT_INVALID");let X=l[h.methodName];if(typeof X!="function")throw new c("EXECUTION_FAILED");let F=pt(h.options.content,m);if(F)throw new c(F.code,null,{outcome:F.outcome});if(h.options.job!==void 0&&T===void 0)throw new c(Ge,null,{outcome:"rejected"});let de=Object.freeze({...m.in===void 0?{}:{in:Object.freeze({text:m.in.text})},...m.out===void 0?{}:{out:Object.freeze(m.out.range===void 0?{}:{range:Object.freeze({...m.out.range})})}}),G=()=>X.call(l,b,de),C=o?await ti(G):await G();if(C!==void 0&&!w(C))throw new c("EXECUTION_FAILED");let k;if(m.out!==void 0){if(k=l.producedContent,k===void 0)throw new c("EXECUTION_FAILED","content.out was requested but setContent was never called");let O=ct(k);if(O)throw new c(O.code,null,{outcome:O.outcome})}else if(l.didSetContent)throw new c("EXECUTION_FAILED","setContent was called but the request asked for no content.out");let wn=l.didRequestSchedule;return {response:{...l.didSetState?{state:l.state}:{},...C===void 0?{}:{result:C},...wn===void 0?{}:{schedule:{enabled:wn.enabled}}},...k===void 0?{}:{answer:k}}}catch(_){let h,J=_,T=_ instanceof c?_:void 0;if(T)h={code:T.code,detail:T.detail,outcome:T.outcome};else try{h=l.mapError(_);}catch(k){h={code:"EXECUTION_FAILED",detail:null},J=k;}let X=oi(h?.code),F=X?h.code:"EXECUTION_FAILED",de=typeof h?.detail=="string"?h.detail:null,G=X?$e(h.outcome):"failed",C;try{C=l.errorState(F,de,{input:b,state:A});}catch(k){J=new AggregateError([J,k],"App error handling failed"),C=l.emptyState();}return r?.(F,J,{outcome:G,detail:de,expected:T!==void 0&&J===T}),{response:{outcome:G,errorCode:F,state:w(C)?C:l.emptyState()}}}}async function Qo(n,e={}){let t=ei(e.jobBridge);try{await ni(n,e,t);}finally{await t?.drain();}}function ei(n){if(n===null)return;if(n!==void 0)return new V(n);let e=hn(process.env);return e===void 0?void 0:new V({channel:e})}async function ni(n,e,t){let r=e.output??process.stdout,o,i;if(e.preloadedInput!==void 0)o=e.preloadedInput.value,i=e.preloadedInput.body;else {let l=ke(e.inputFd??0);l.kind==="v1"?o=l.value:l.kind==="v2"&&(o=l.header,i=l.body);}let s=i!==void 0,a=e.context??Ke(),d=false,p=(l,b,A)=>{d=true,e.onFailure?.(l,b,A);},f;try{f=await Ot(n,o,process.env.CREWX_WORKSPACE_ROOT??process.cwd(),p,e.consoleManaged!==!0,i,a,t);}catch(l){p("EXECUTION_FAILED",l),f={response:Et(e.emptyState)};}ri(f.response)&&!d&&p(f.response.errorCode,void 0,{outcome:f.response.outcome,detail:null,expected:false});let y;try{let l=(e.sanitize??wt)(f.response);y=s?Ne(l,f.answer):`${JSON.stringify(l)}
|
|
6
|
+
`;}catch(l){p("EXECUTION_FAILED",l);let b=Et(e.emptyState);try{let A=(e.sanitize??wt)(b);y=s?Ne(A):`${JSON.stringify(A)}
|
|
7
7
|
`;}catch(A){p("EXECUTION_FAILED",A),y=s?Ne(b):`${JSON.stringify(b)}
|
|
8
8
|
`;}}r.write(y);}async function ti(n){let e=["log","info","debug"],t=new Map;for(let r of e)t.set(r,console[r]),console[r]=(...o)=>process.stderr.write(`${util.format(...o)}
|
|
9
|
-
`);try{return await n()}finally{for(let r of e)console[r]=t.get(r);}}function Et(n={}){return {outcome:"failed",errorCode:"EXECUTION_FAILED",state:{...n,error:{code:"EXECUTION_FAILED",detail:null}}}}function ri(n){return (n.outcome==="failed"||n.outcome==="rejected")&&typeof n.errorCode=="string"}function oi(n){return typeof n=="string"&&/^[A-Z][A-Z0-9_]{0,127}$/u.test(n)}function
|
|
9
|
+
`);try{return await n()}finally{for(let r of e)console[r]=t.get(r);}}function Et(n={}){return {outcome:"failed",errorCode:"EXECUTION_FAILED",state:{...n,error:{code:"EXECUTION_FAILED",detail:null}}}}function ri(n){return (n.outcome==="failed"||n.outcome==="rejected")&&typeof n.errorCode=="string"}function oi(n){return typeof n=="string"&&/^[A-Z][A-Z0-9_]{0,127}$/u.test(n)}function wt(n){return n}var gn={depth:null,maxArrayLength:null,maxStringLength:null},En=class extends stream.Writable{#e="buffer";#n=[];_write(e,t,r){if(this.#e==="buffer"){this.#n.push(typeof e=="string"?e:Uint8Array.from(e)),r();return}if(this.#e==="discard"){r();return}process.stderr.write(e,r);}flushToStderr(){this.#e="stderr";for(let e of this.#n)process.stderr.write(e);this.#n=[];}discard(){this.#e="discard",this.#n=[];}};async function ai(n,e={}){let t=process.stdout,r=t.write.bind(t),o=new En,i=new console$1.Console({stdout:o,stderr:o,inspectOptions:{...gn}});globalThis.console=i;let s=false,a="-",d="-",p,f=false,y,l;try{let m=ui(e.inputFd??0);a=li(m.value),d=je(process.env.CREWX_APP_REQUEST_ID),p=new Date().toISOString();try{y=await n();}catch(_){f=!0,l=_;}let I=y?.default;if(!f&&I?.devtools?.log===!0?(Object.assign(util.inspect.defaultOptions,gn),b(p),o.flushToStderr()):o.discard(),f){A("EXECUTION_FAILED",l),_n(r,e,A);return}try{if(typeof y?.runSkillApp!="function")throw new TypeError("App module does not export runSkillApp");let _={sanitize:e.sanitize,emptyState:e.emptyState??di(I),preloadedInput:m.body===void 0?{value:m.value}:{value:m.value,body:m.body},onFailure:A,consoleManaged:!0,output:{write:r},jobBridge:e.jobBridge};await y.runSkillApp(I,_);}catch(_){A("EXECUTION_FAILED",_),_n(r,e,A);}}catch(m){A("EXECUTION_FAILED",m),_n(r,e,A);}finally{process.exitCode=0;}function b(m){s||(process.stderr.write(`[crewx-app] ${m??new Date().toISOString()} ${je(a)} req=${d}
|
|
10
10
|
`),s=true);}function A(m,I,P){b();let _=P?.expected===true&&P.detail?` ${je(P.detail)}`:"";process.stderr.write(`[crewx-app] ${P?.outcome??"failed"} ${je(m)}${_}
|
|
11
|
-
`),I!==void 0&&P?.expected!==true&&process.stderr.write(`${util.inspect(I,
|
|
11
|
+
`),I!==void 0&&P?.expected!==true&&process.stderr.write(`${util.inspect(I,gn)}
|
|
12
12
|
`);}}function di(n){if(typeof n=="function")try{let t=new n({workspaceRoot:process.cwd()}).emptyState();return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:void 0}catch{return}}function ui(n){let e=ke(n);return e.kind==="v1"?{value:e.value}:e.kind==="v2"?{value:e.header,body:e.body}:{value:void 0}}function li(n){return n!==null&&typeof n=="object"&&!Array.isArray(n)&&typeof n.actionId=="string"?n.actionId:"-"}function je(n){return typeof n!="string"||n.length===0?"-":n.replace(/[\u0000-\u001f\u007f\u2028\u2029]/gu,"_")}function _n(n,e,t){let r={code:"EXECUTION_FAILED",detail:null},i={outcome:"failed",errorCode:"EXECUTION_FAILED",state:e.emptyState!==null&&typeof e.emptyState=="object"&&!Array.isArray(e.emptyState)?{...e.emptyState,error:r}:{error:r}},s=i;try{s=(e.sanitize??pi)(i);}catch(a){t("EXECUTION_FAILED",a);}n(`${JSON.stringify(s)}
|
|
13
|
-
`);}function pi(n){return n}exports.APP_FILES_ERROR_CODES=Ln;exports.APP_FILES_LIMITS=S;exports.APP_FILES_LOCK_SUBPATH=ye;exports.APP_FILES_ROOT_ENV=st;exports.APP_JOB_BRIDGE_CHANNEL_MAX_BYTES=yn;exports.APP_JOB_BRIDGE_DRAIN_TIMEOUT_MS=fn;exports.APP_JOB_BRIDGE_ENV=yt;exports.APP_JOB_BRIDGE_ERROR_CODES=Mo;exports.APP_JOB_BRIDGE_FD=ln;exports.APP_JOB_BRIDGE_MAX_LINE_BYTES=ie;exports.APP_JOB_BRIDGE_REPLY_TIMEOUT_MS=cn;exports.APP_JOB_BRIDGE_VERSION=R;exports.APP_JOB_CAPABILITY=Cn;exports.APP_JOB_CAPABILITY_VERSION=kn;exports.APP_JOB_DEADLINE_MS=j;exports.APP_JOB_MAX_PER_APP=Lt;exports.APP_JOB_OPERATIONS=pe;exports.APP_JOB_OUTCOMES=qe;exports.APP_JOB_REFUSAL_CODES=Xe;exports.APP_JOB_RUN_REQUIRED=Ge;exports.APP_JOB_STATES=He;exports.APP_JOB_STOP_GRACE_MS=Ft;exports.APP_JOB_STOP_REASONS=le;exports.APP_JOB_TRIGGERS=Ve;exports.APP_SCHEDULE_ACTOR_KIND=Pt;exports.APP_SCHEDULE_INERT_COMMAND=Tt;exports.APP_SCHEDULE_INSTANCE_PREFIX=Be;exports.APP_SCHEDULE_INTERVALS_MINUTES=W;exports.APP_SCHEDULE_MAX_PER_APP=It;exports.APP_SCHEDULE_PERIODIC_REASONS=Sn;exports.APP_SCHEDULE_TIMEOUT_MS=v;exports.APP_TOOLS_FILE=Qt;exports.APP_TOOLS_SCHEMA_VERSION=er;exports.APP_TOOL_ENTRY=nr;exports.AppError=
|
|
13
|
+
`);}function pi(n){return n}exports.APP_FILES_ERROR_CODES=Ln;exports.APP_FILES_LIMITS=S;exports.APP_FILES_LOCK_SUBPATH=ye;exports.APP_FILES_ROOT_ENV=st;exports.APP_JOB_BRIDGE_CHANNEL_MAX_BYTES=yn;exports.APP_JOB_BRIDGE_DRAIN_TIMEOUT_MS=fn;exports.APP_JOB_BRIDGE_ENV=yt;exports.APP_JOB_BRIDGE_ERROR_CODES=Mo;exports.APP_JOB_BRIDGE_FD=ln;exports.APP_JOB_BRIDGE_MAX_LINE_BYTES=ie;exports.APP_JOB_BRIDGE_REPLY_TIMEOUT_MS=cn;exports.APP_JOB_BRIDGE_VERSION=R;exports.APP_JOB_CAPABILITY=Cn;exports.APP_JOB_CAPABILITY_VERSION=kn;exports.APP_JOB_DEADLINE_MS=j;exports.APP_JOB_MAX_PER_APP=Lt;exports.APP_JOB_OPERATIONS=pe;exports.APP_JOB_OUTCOMES=qe;exports.APP_JOB_REFUSAL_CODES=Xe;exports.APP_JOB_RUN_REQUIRED=Ge;exports.APP_JOB_STATES=He;exports.APP_JOB_STOP_GRACE_MS=Ft;exports.APP_JOB_STOP_REASONS=le;exports.APP_JOB_TRIGGERS=Ve;exports.APP_SCHEDULE_ACTOR_KIND=Pt;exports.APP_SCHEDULE_INERT_COMMAND=Tt;exports.APP_SCHEDULE_INSTANCE_PREFIX=Be;exports.APP_SCHEDULE_INTERVALS_MINUTES=W;exports.APP_SCHEDULE_MAX_PER_APP=It;exports.APP_SCHEDULE_PERIODIC_REASONS=Sn;exports.APP_SCHEDULE_TIMEOUT_MS=v;exports.APP_TOOLS_FILE=Qt;exports.APP_TOOLS_SCHEMA_VERSION=er;exports.APP_TOOL_ENTRY=nr;exports.AppError=c;exports.AppFilesError=u;exports.AppJobBridge=V;exports.AppJobLineReader=se;exports.CrewXApp=ze;exports.SCHEDULE_TRIGGERS=Ct;exports.SKILL_BACKEND_ENV_NAMES=Fn;exports.Tool=Ut;exports.acquireFileLock=Ae;exports.appFiles=_o;exports.appFilesLockKeyOf=rn;exports.appFilesRootSegmentsOf=he;exports.appJobTriggerForActor=Vo;exports.buildAppJobChannelEnvironment=qo;exports.encodeAppJobLine=xe;exports.executeAppRequest=Zo;exports.generateManifest=Ht;exports.generateToolDeclarations=Dn;exports.getToolDeclarations=K;exports.hasAppJobCapability=Mt;exports.isAppJobCode=M;exports.isAppJobDeadlineMs=We;exports.isAppJobOperation=z;exports.isAppJobPhase=B;exports.isAppScheduleCode=Rn;exports.isAppScheduleIntervalMinutes=In;exports.isAppSchedulePeriodicReason=Pn;exports.isAppScheduleTimeoutMs=Ue;exports.isSkillBackendEnv=tr;exports.normalizeAppFilesRef=Y;exports.openInheritedAppJobTransport=_t;exports.parseAppJobChannel=bn;exports.parseAppJobControlReply=An;exports.parseAppJobControlRequest=Uo;exports.parseAppJobRunPush=mn;exports.parseAppJobRunReport=Ho;exports.parseAppJobView=Xo;exports.readAppContext=Ke;exports.readAppJobChannel=hn;exports.releaseFileLock=me;exports.runAppEntry=ai;exports.runSkillApp=Qo;
|
package/dist/esm/app/index.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import {promises,realpath,realpathSync,constants,readSync}from'fs';import {join,dirname,basename,relative,sep,isAbsolute,resolve}from'path';import {promisify,format,inspect}from'util';import {execFile}from'child_process';import {randomUUID,createHash}from'crypto';import {homedir}from'os';import {Socket}from'net';import {Console}from'console';import {Writable}from'stream';var v=["text/plain","application/json"];var z=[5,15,30,60],j=Object.freeze({min:15e3,max:6e5,default:3e5}),Pt=1,Ue="schedule:",Tt="schedule",Ct="exit 78",Rn=["standby","disabled","draining","degraded"],kt=["cron","cron_manual","app_enable"],Nt=/^[A-Z][A-Z0-9_]{0,63}$/u;function In(n){return typeof n=="string"&&Nt.test(n)}var Sn=["status","everyMinutes","lastStartedAt","lastFinishedAt","lastOutcome","lastErrorCode","nextRunAt","periodic","periodicReason"],Jt=["unset","on","off"],Dt=["available","unavailable"],Be=64,xt=128;function Pn(n){return z.includes(n)}function He(n){return Number.isSafeInteger(n)&&n>=j.min&&n<=j.max}function Tn(n){return Rn.includes(n)}function Cn(n){if(!Ft(n)||Object.keys(n).length!==Sn.length||!Sn.every(r=>Object.hasOwn(n,r))||typeof n.status!="string"||!Jt.includes(n.status)||!Pn(n.everyMinutes)||!le(n.lastStartedAt,Be)||!le(n.lastFinishedAt,Be)||!le(n.lastOutcome,xt)||!le(n.nextRunAt,Be)||n.lastErrorCode!==null&&!In(n.lastErrorCode)||typeof n.periodic!="string"||!Dt.includes(n.periodic))return;let t=n.periodic;if(!(t==="available"?n.periodicReason!==null:!Tn(n.periodicReason))&&!(n.nextRunAt!==null&&(n.status!=="on"||t!=="available")))return Object.freeze({status:n.status,everyMinutes:n.everyMinutes,lastStartedAt:n.lastStartedAt,lastFinishedAt:n.lastFinishedAt,lastOutcome:n.lastOutcome,lastErrorCode:n.lastErrorCode,nextRunAt:n.nextRunAt,periodic:t,periodicReason:n.periodicReason})}function le(n,e){return n===null||typeof n=="string"&&n.length>0&&n.length<=e}function Ft(n){if(n===null||typeof n!="object"||Array.isArray(n))return false;let e=Object.getPrototypeOf(n);return e===Object.prototype||e===null}var M=Object.freeze({min:6e4,max:18e5,default:6e5}),Lt=Object.freeze({min:1e3,max:12e4,default:3e4}),vt=1,kn="crewx/appJobs",Nn=1,qe=["starting","running","stopping","finished"],Ve=["succeeded","failed","timed_out","cancelled","shutdown","interrupted"],pe=["cancelled","timed_out","shutdown"],Xe=["manual","schedule"],jt=/^[a-z][a-z0-9_]{0,63}$/u,Mt=/^[A-Z][A-Z0-9_]{0,63}$/u,ce=["start","status","cancel"],Ge=["APP_JOB_NOT_DECLARED","APP_JOB_NOT_AUTHORIZED","APP_JOB_SELF_START","APP_JOB_OWNER_INVALID","APP_JOB_DEFINITION_INVALID","APP_JOB_DEFINITION_CHANGED","APP_JOB_DEADLINE_INVALID","APP_JOB_SHUTTING_DOWN","APP_JOB_OWNER_MISMATCH","APP_JOB_STALE_HANDLE","APP_JOB_NOT_ACTIVE","APP_JOB_NOT_GRANTED"],We="APP_JOB_RUN_REQUIRED";function ze(n){return Number.isSafeInteger(n)&&n>=M.min&&n<=M.max}function B(n){return typeof n=="string"&&Mt.test(n)}function U(n){return typeof n=="string"&&jt.test(n)}function $(n){return ce.includes(n)}function Bt(n){return n?.some(({name:e,version:t})=>e===kn&&t===Nn)===true}var Jn=Symbol;Jn.metadata===void 0&&Object.defineProperty(Symbol,"metadata",{configurable:false,value:Symbol.for("Symbol.metadata")});var Ut=Jn.metadata,K=Symbol.for("crewx.app.tool-metadata"),f=class extends Error{code;detail;outcome;constructor(e,t=null,r){super(e),this.name="AppError",this.code=e,this.detail=t,this.outcome=Ke(r?.outcome);}};function Ke(n){return n==="rejected"?"rejected":"failed"}var $e=class{static devtools=process.env.CREWX_APP_DEV==="1"?Object.freeze({log:true}):void 0;currentState;stateWasSet=false;answerBody;answerRange;callContext;callSchedule;callJobs;callJobRun;scheduleDirective;workspaceRoot;constructor(e={workspaceRoot:process.cwd()}){this.currentState=e.state??{},this.workspaceRoot=e.workspaceRoot,this.callContext=e.context===void 0?void 0:zt(e.context),this.callSchedule=e.schedule===void 0?void 0:Object.freeze({...e.schedule}),this.callJobs=e.jobs,this.callJobRun=e.jobRun;}get jobs(){return this.callJobs}get jobRun(){return this.callJobRun}get schedule(){return this.callSchedule}requestSchedule(e){if(typeof e!="boolean")throw new TypeError("requestSchedule needs true or false");if(this.callSchedule===void 0)throw new f("SCHEDULE_UNSUPPORTED","this App has no schedule on this Host");let t=this.callContext?.actor;if(t==="schedule")throw new f("SCHEDULE_UNSUPPORTED","a scheduled run cannot change its own schedule",{outcome:"rejected"});if(e&&t!=="user")throw new f("SCHEDULE_ENABLE_DENIED","only the person at the screen can turn a schedule on",{outcome:"rejected"});this.scheduleDirective=Object.freeze({enabled:e});}get didRequestSchedule(){return this.scheduleDirective}get context(){if(this.callContext===void 0)throw new TypeError("this.context is only set when the Host runs the action; pass options.context when you construct the App in a test");return this.callContext}get state(){return this.currentState}get didSetState(){return this.stateWasSet}setState(e){this.currentState=e,this.stateWasSet=true;}get didSetContent(){return this.answerBody!==void 0}get producedContent(){return this.answerBody===void 0?void 0:{body:this.answerBody,...this.answerRange===void 0?{}:{range:this.answerRange}}}setContent(e,t){if(typeof e!="string"&&!(e instanceof Uint8Array))throw new TypeError("setContent needs a string or a Uint8Array");if(t!==void 0&&!Kt(t))throw new TypeError("setContent range must be { startLine, lineCount, totalLines }, three integers of at least 1");this.answerBody=typeof e=="string"?new TextEncoder().encode(e):new Uint8Array(e),this.answerRange=t===void 0?void 0:{startLine:t.startLine,lineCount:t.lineCount,totalLines:t.totalLines};}emptyState(){return {}}validate(e,t,r){}mapError(e){return {code:"EXECUTION_FAILED",detail:null}}errorState(e,t,r){return {...w(r.state)?r.state:{},error:{code:e,detail:t}}}};function Ht(n){return function(e,t){if(t.static||t.private||t.kind!=="method")throw new TypeError("@Tool can decorate public instance methods only");let r=t.metadata;if(!r)throw new TypeError("standard decorator metadata is unavailable");let o=Object.hasOwn(r,K)?r[K]:[];if(o.some(p=>p.methodName===String(t.name)))throw new TypeError(`@Tool is declared more than once for ${String(t.name)}`);let i=n.content===void 0?void 0:Vt(n.name,n.content),s=n.schedule===void 0?void 0:Xt(n);if(s!==void 0&&o.some(p=>p.options.schedule!==void 0))throw new TypeError(`@Tool ${n.name}: an App declares at most one scheduled action`);let a=n.job===void 0?void 0:Gt(n);if(a!==void 0&&o.some(p=>p.options.job!==void 0))throw new TypeError(`@Tool ${n.name}: an App declares at most one job action`);let d=n.jobAccess===void 0?void 0:Wt(n);r[K]=[...o,{methodName:String(t.name),options:Object.freeze({...n,...i===void 0?{}:{content:i},...s===void 0?{}:{schedule:s},...a===void 0?{}:{job:a},...d===void 0?{}:{jobAccess:d}})}];}}function Y(n){let e=n[Ut],t=e&&Object.hasOwn(e,K)?e[K]:[],r=new Map(t.map(i=>[i.methodName,i])),o=Object.getOwnPropertyNames(n.prototype).map(i=>r.get(i)).filter(i=>i!==void 0);if(o.length!==t.length)throw new TypeError("a @Tool method is missing from the App prototype");return o}function Dn(n){return Y(n).some(({options:e})=>e.schedule!==void 0)}function xn(n){let e=n.definition,t=Y(n),r=new Set;return t.map(({options:o})=>{if(r.has(o.name))throw new TypeError(`duplicate @Tool name: ${o.name}`);return r.add(o.name),{actionId:o.name,...o.dataInputs===void 0?{}:{dataInputs:[...o.dataInputs]},confirmation:o.confirmation??"none",capability:o.capability??"app.read",mutation:o.mutation??true,inputSchema:o.inputSchema,...o.content===void 0?{}:{content:$t(o.content)},...o.schedule===void 0?{}:{schedule:{...o.schedule}},...o.job===void 0?{}:{job:{...o.job}},...o.jobAccess===void 0?{}:{jobAccess:[...o.jobAccess]},resultProjection:o.resultProjection??{allow:[...e.stateProjection.allow]},_meta:{description:o.description}}})}function qt(n,e){if(e.length===0)throw new TypeError("backendCommand must name the skill command");let t=xn(n).map(({_meta:r,...o})=>({...o,backend:{type:"skill",command:[...e]},_meta:r}));return {...n.definition,actions:t}}function Vt(n,e){let t=i=>{throw new TypeError(`@Tool ${n}: content ${i}`)},r=(i,s,a)=>{if(!w(a))return t(`${i} must be an object`);for(let d of Object.keys(a))if(d==="mediaType"){if(!v.includes(a[d]))return t(`${i}.mediaType must be one of ${v.join(", ")}`)}else if(d===s){if(typeof a[d]!="boolean")return t(`${i}.${d} must be true or false`)}else return t(`${i} has the unknown key "${d}"`);return Object.hasOwn(a,"mediaType")?Object.freeze({...a}):t(`${i}.mediaType is required`)};if(!w(e))return t("must be an object");let o={};for(let i of Object.keys(e))if(i==="in")o[i]=r("in","required",e[i]);else if(i==="out")o[i]=r("out","range",e[i]);else return t(`has the unknown key "${i}"; use "in" and/or "out"`);return Object.keys(o).length===0?t('needs "in" and/or "out"'):Object.freeze(o)}function Xt(n){let e=r=>{throw new TypeError(`@Tool ${n.name}: schedule ${r}`)},t=n.schedule;if(!w(t))return e("must be an object");for(let r of Object.keys(t))if(r!=="everyMinutes"&&r!=="timeoutMs")return e(`has the unknown key "${r}"`);return z.includes(t.everyMinutes)?t.timeoutMs!==void 0&&!He(t.timeoutMs)?e(`timeoutMs must be an integer from ${j.min} to ${j.max}`):n.content!==void 0?e("cannot be combined with content"):n.dataInputs!==void 0?e("cannot be combined with dataInputs"):n.confirmation!==void 0&&n.confirmation!=="none"?e("cannot require a native confirmation"):Object.freeze({everyMinutes:t.everyMinutes,...t.timeoutMs===void 0?{}:{timeoutMs:t.timeoutMs}}):e(`everyMinutes must be one of ${z.join(", ")}`)}function Gt(n){let e=r=>{throw new TypeError(`@Tool ${n.name}: job ${r}`)},t=n.job;if(!w(t))return e("must be an object");for(let r of Object.keys(t))if(r!=="deadlineMs")return e(`has the unknown key "${r}"`);return t.deadlineMs!==void 0&&!ze(t.deadlineMs)?e(`deadlineMs must be an integer from ${M.min} to ${M.max}`):n.content!==void 0?e("cannot be combined with content"):n.dataInputs!==void 0?e("cannot be combined with dataInputs"):n.confirmation!==void 0&&n.confirmation!=="none"?e("cannot require a native confirmation"):n.schedule!==void 0?e("cannot be the scheduled action too"):n.jobAccess!==void 0?e("cannot also be a control action: a run does not control itself"):Object.freeze({...t.deadlineMs===void 0?{}:{deadlineMs:t.deadlineMs}})}function Wt(n){let e=r=>{throw new TypeError(`@Tool ${n.name}: jobAccess ${r}`)},t=n.jobAccess;return !Array.isArray(t)||t.length===0?e("must list at least one operation"):new Set(t).size!==t.length?e("must not repeat an operation"):t.every($)?n.job!==void 0?e("cannot be set on the job action, which runs the job and cannot control it"):n.content!==void 0?e("cannot be combined with content"):Object.freeze([...t]):e("names an unknown operation")}function zt(n){return Object.freeze({instanceId:n.instanceId,threadId:n.threadId,actor:n.actor,requestId:n.requestId,nowMs:n.nowMs})}function $t(n){let e={};for(let[t,r]of Object.entries(n))e[t]={...r};return e}function Kt(n){return w(n)&&["startLine","lineCount","totalLines"].every(e=>Number.isSafeInteger(n[e])&&n[e]>=1)}function w(n){if(n===null||typeof n!="object"||Array.isArray(n))return false;let e=Object.getPrototypeOf(n);return e===Object.prototype||e===null}var Yt=/^[A-Za-z0-9._:-]{1,128}$/u,Zt=/[\u0000-\u001f\u007f\u2028\u2029]/u,Qt=512;function Ye(n=process.env){let e=Fn(n.CREWX_APP_INSTANCE_ID),t=n.CREWX_APP_REQUEST_ID,r=n.CREWX_APP_ACTOR_KIND,o=n.CREWX_APP_NOW_MS;if(e===void 0||typeof t!="string"||!Yt.test(t)||r!=="user"&&r!=="agent"&&r!=="schedule"||typeof o!="string"||!/^\d{1,16}$/u.test(o))return;let i=Number(o);if(!Number.isSafeInteger(i))return;let s=n.CREWX_THREAD_ID===void 0?null:Fn(n.CREWX_THREAD_ID);if(s!==void 0&&!(r==="schedule"&&(s!==null||!e.startsWith(Ue))))return Object.freeze({instanceId:e,threadId:s,actor:r,requestId:t,nowMs:i})}function Fn(n){if(!(typeof n!="string"||n.length===0||Zt.test(n)))return new TextEncoder().encode(n).byteLength<=Qt?n:void 0}var er="dist/tools.json",nr=1,tr="dist/main.mjs";var Ln=["CREWX_APP_INSTANCE_ID","CREWX_THREAD_ID"];function rr(n){if(!Array.isArray(n)||n.length===0)return false;let e=new Set;for(let t of n){if(!Ln.some(r=>r===t)||e.has(t))return false;e.add(t);}return true}var vn=["INVALID_REF","FILE_NOT_FOUND","DOCUMENT_CHANGED","TOO_LARGE","IO_ERROR","FILE_BUSY"],u=class extends Error{code;constructor(e){super(e),this.name="AppFilesError",this.code=e;}};var R={textBytes:256*1024,refCodePoints:200,refSegments:3,pageSize:200},H=/^[\p{L}\p{N}][\p{L}\p{N}\p{M}_-]{0,99}$/u,x=()=>{throw new u("INVALID_REF")};function Z(n){let e=n.normalize("NFC");if([...e].length>R.refCodePoints)return;let t=e.split("/");if(t.length>R.refSegments)return;let r=t[t.length-1];return r.endsWith(".md")&&[...t.slice(0,-1),r.slice(0,-3)].every(i=>H.test(i))?e:void 0}function Q(n){return typeof n!="string"?x():Z(n)??x()}function jn(n){if(n==null||n==="")return "";if(typeof n!="string")return x();let e=n.normalize("NFC");if([...e].length>R.refCodePoints)return x();let t=(e.endsWith("/")?e.slice(0,-1):e).split("/");return t.length>R.refSegments-1||!t.every(r=>H.test(r))?x():`${t.join("/")}/`}function Mn(n){if(typeof n!="string")return x();if(Buffer.byteLength(n,"utf8")>R.textBytes)throw new u("TOO_LARGE");return n}function Bn(n){return n===null?null:typeof n=="string"&&n.length<=R.refCodePoints?n:x()}var Ae=join("locks","files"),te=12e3,{link:lr,mkdir:pr,open:cr,readFile:en,unlink:ne}=promises,fr=5,yr=50,Ar=1e3,mr=2e3,br="/bin/ps",gr={LC_ALL:"C",TZ:"UTC"},hr=100,_r=19,Er=/^[A-Za-z]{3} ([A-Za-z]{3}) +(\d{1,2}) (\d{2}):(\d{2}):(\d{2}) (\d{4})$/,Or=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],wr=promisify(execFile),Un,fe;function nn(n=process.env){if(n.CREWX_HOME){let e=resolve(n.CREWX_HOME);try{return realpathSync(e)}catch(t){if(t.code==="ENOENT")return e;throw t}}return process.platform!=="win32"&&n.XDG_CONFIG_HOME?join(n.XDG_CONFIG_HOME,"crewx"):join(homedir(),".crewx")}async function me(n){let{lockDir:e,key:t}=n,r=join(e,Sr(t)),o=Date.now()+n.waitMs,i=await Vn(e,{token:randomUUID(),pid:process.pid,startedAtMs:await Gn()}),s=new Ze;try{let a=fr;for(;;){if(await Xn(i.staged,r))return {path:r,token:i.record.token};let d=await ye(r);if(d!=="vanished"&&!(d!=="unreadable"&&await s.isDead(d)&&await Tr(e,r,d,s))){if(Date.now()>=o)throw new u("FILE_BUSY");await Dr(a),a=Math.min(a*2,yr);}}}finally{await ne(i.staged).catch(()=>{});}}async function be(n){await Qe(n.path,n.token);}function Sr(n){return createHash("sha256").update(n,"utf8").digest("hex")}async function Vn(n,e){let t=join(n,`.${e.token}.tmp`);try{await pr(n,{recursive:!0}),await Rr(t,JSON.stringify(e));}catch{throw await ne(t).catch(()=>{}),new u("IO_ERROR")}return {record:e,staged:t}}async function Rr(n,e){let t=await cr(n,"wx");try{await t.writeFile(e),await t.sync();}finally{await t.close();}}async function Xn(n,e){try{return await lr(n,e),!0}catch(t){if(t.code==="EEXIST")return false;throw new u("IO_ERROR")}}async function ye(n){let e;try{e=await en(n,"utf8");}catch(t){return t.code==="ENOENT"?"vanished":"unreadable"}try{let t=JSON.parse(e);return Ir(t)?t:"unreadable"}catch{return "unreadable"}}function Ir(n){if(typeof n!="object"||n===null||Array.isArray(n))return false;let e=n;return typeof e.token=="string"&&e.token.length>0&&typeof e.pid=="number"&&Number.isSafeInteger(e.pid)&&e.pid>0&&(e.startedAtMs===null||Number.isSafeInteger(e.startedAtMs))}async function Pr(n){try{process.kill(n.pid,0);}catch(t){return t.code==="ESRCH"}if(n.startedAtMs===null)return false;let e=await Wn(n.pid);return e!==null&&e!==n.startedAtMs}var Ze=class{constructor(e=Pr,t=Date.now){this.check=e;this.now=t;}check;now;answers=new Map;async isDead(e){let t=this.now(),r=this.answers.get(e.token);if(r!==void 0&&t-r.at<Ar)return r.dead;let o=await this.check(e);return this.answers.set(e.token,{at:t,dead:o}),o}};async function Tr(n,e,t,r){let o=`${e}.reclaim`,i=await Vn(n,{token:randomUUID(),pid:process.pid,startedAtMs:await Gn()});try{if(!await Xn(i.staged,o)){let s=await ye(o);return s!=="vanished"&&s!=="unreadable"&&await r.isDead(s)&&await Qe(o,s.token),!1}try{let s=await ye(e);return typeof s!="object"||s.token!==t.token?!1:(await ne(e).catch(()=>{}),!0)}finally{await Qe(o,i.record.token);}}finally{await ne(i.staged).catch(()=>{});}}async function Qe(n,e){let t=await ye(n);typeof t=="object"&&t.token===e&&await ne(n).catch(()=>{});}function Gn(){return (fe===void 0||fe.pid!==process.pid)&&(fe={pid:process.pid,startedAtMs:Wn(process.pid)}),fe.startedAtMs}async function Wn(n){return process.platform==="linux"&&(Un??=await promises.access("/proc/self/stat").then(()=>true,()=>false),Un)?Cr(n):Nr(n)}async function Cr(n){try{let e=await en(`/proc/${n}/stat`,"utf8"),t=e.slice(e.lastIndexOf(")")+2).split(" "),r=Number(t[_r]),o=await kr();return !Number.isSafeInteger(r)||o===void 0?null:o*1e3+r*1e3/hr}catch{return null}}async function kr(){let n=(await en("/proc/stat","utf8")).split(`
|
|
2
|
-
`).find(t=>t.startsWith("btime ")),e=Number(n?.slice(6));return Number.isSafeInteger(e)?e:void 0}async function Nr(n){try{let{stdout:e}=await wr(br,["-o","lstart=","-p",String(n)],{env:gr,encoding:"utf8",timeout:mr});return Jr(e.trim())}catch{return null}}function Jr(n){let e=Er.exec(n);if(e===null)return null;let t=Or.indexOf(e[1]);return t<0?null:Date.UTC(Number(e[6]),t,Number(e[2]),Number(e[3]),Number(e[4]),Number(e[5]))}function Dr(n){return new Promise(e=>setTimeout(e,n))}var Lr=[".git",".crewx","node_modules","apps","skills"],{lstat:vr,readFile:jr}=promises,Mr=4,Br=200,Ur=1024*1024,zn=/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/;function Hr(n){return ["docs","apps",n]}function $n(n){let e={segments:Hr(n.appId),declared:false};if(n.origin!=="not_installed"||n.source!=="workspace"&&n.source!=="bundled"||n.declared===void 0||n.declared===null)return e;let t=qr(n.declared);return t.ok?n.packageRelativePath!==void 0&&Vr(t.segments,Xr(n.packageRelativePath))?{...e,warning:"FILES_ROOT_FORBIDDEN"}:{segments:t.segments,declared:true}:{...e,warning:t.warning}}async function Kn(n){let e={appId:void 0,declared:void 0};try{let t=join(n,"manifest.json"),r=await vr(t);if(!r.isFile()||r.size>Ur)return e;let o=JSON.parse(await jr(t,"utf8"));if(!ge(o))return e;let i=o.name,s=typeof i=="string"&&zn.test(i)?i:void 0,a=o._meta,d=ge(a)?a["dev.crewx"]:void 0,p=ge(d)?d.files:void 0;return {appId:s,declared:p}}catch{return e}}function qr(n){return !ge(n)||Object.keys(n).some(e=>e!=="root")||typeof n.root!="string"?{ok:false,warning:"FILES_ROOT_INVALID"}:Zn(n.root.normalize("NFC"),Yn)}function he(n){if(n.normalize("NFC")!==n)return;let e=Zn(n,t=>Yn(t)||zn.test(t));return e.ok?e.segments:void 0}function Yn(n){return H.test(n)}function Zn(n,e){let t={ok:false,warning:"FILES_ROOT_INVALID"},r={ok:false,warning:"FILES_ROOT_FORBIDDEN"};if([...n].length>Br)return t;let o=n.split("/");return o.length>Mr||!o.every(e)?t:o.length===1||Lr.includes(o[0].toLowerCase())?r:{ok:true,segments:o}}function Vr(n,e){let t=Math.min(n.length,e.length);for(let r=0;r<t;r+=1)if(n[r].toLowerCase()!==e[r].toLowerCase())return false;return t>0}function Xr(n){return n.normalize("NFC").split("/").filter(e=>e.length>0)}function ge(n){return typeof n=="object"&&n!==null&&!Array.isArray(n)}var{lstat:Yr,mkdir:Zr,open:Qr,readdir:eo,rename:no,stat:to,unlink:tt}=promises;function re(n){return `sha256:${createHash("sha256").update(n).digest("hex")}`}function rn(n,e){return e===n||e.startsWith(n.endsWith(sep)?n:n+sep)}var Oe=class{constructor(e={},t){this.hooks=e;this.lockDir=t.lockDir,this.lockWaitMs=t.lockWaitMs??te;}hooks;lockDir;lockWaitMs;async list(e,t,r){let o=t===""?[]:t.slice(0,-1).split("/"),i=await _e(e.workspaceReal,[...e.segments,...o]);if(i.status!=="complete")return {items:[],next:null};let s=await tn(e),a=await lo(s,i.dir,t);a.sort((y,l)=>et(y.ref,l.ref));let d=r===void 0?a:a.filter(y=>et(y.ref,r)>0),p=d.slice(0,R.pageSize),c=[];for(let y of p){let l=await this.readVerified(s,y.abs);c.push({ref:y.ref,version:re(l.bytes),bytes:l.bytes.length,modifiedAt:l.stat.mtime.toISOString()});}return {items:c,next:d.length>p.length?p[p.length-1].ref:null}}async read(e,t){let r=t.split("/"),o=await _e(e.workspaceReal,[...e.segments,...r.slice(0,-1)]);if(o.status!=="complete")throw new u("FILE_NOT_FOUND");let i=await Ee(o.dir,r[r.length-1]);if(!i)throw new u("FILE_NOT_FOUND");if(!i.stat.isFile())throw new u("IO_ERROR");let{bytes:s}=await this.readVerified(await tn(e),i.abs,R.textBytes);return {ref:t,text:Ao(s),version:re(s)}}async stat(e,t){let r=t.split("/"),o=await _e(e.workspaceReal,[...e.segments,...r.slice(0,-1)]);if(o.status!=="complete")throw new u("FILE_NOT_FOUND");let i=await Ee(o.dir,r[r.length-1]);if(!i)throw new u("FILE_NOT_FOUND");if(!i.stat.isFile())throw new u("IO_ERROR");let s=await this.readVerified(await tn(e),i.abs,R.textBytes);return {ref:t,version:re(s.bytes),bytes:s.bytes.length,modifiedAt:s.stat.mtime.toISOString()}}async write(e,t,r,o){let i=t.split("/"),s=i[i.length-1],a=new Uint8Array(Buffer.from(r,"utf8"));return this.withFileLock(await io(e,t),async()=>{let d=await _e(e.workspaceReal,[...e.segments,...i.slice(0,-1)]);if(d.status==="blocked")throw new u("IO_ERROR");let p=await we(d.dir),c=d.status==="complete"?await Ee(d.dir,s):void 0;if(c&&!c.stat.isFile())throw new u("IO_ERROR");if((c?re((await this.readVerified(p.real,c.abs)).bytes):null)!==o)throw new u("DOCUMENT_CHANGED");let l=await this.createFolders(p,d.status==="missing"?d.missing:[]);await oo(l,s);let b=c?.abs??join(l.path,s);return await this.writeAtomically(l,b,s,a,c?.stat),{ref:t,version:re(a)}})}async readVerified(e,t,r){return await this.hooks.beforeOpen?.(t),ao(e,t,r)}async createFolders(e,t){let r=e;for(let o of t){let i=join(r.path,o);await this.hooks.beforeMkdir?.(i);try{await Zr(i);}catch(s){if(s.code!=="EEXIST")throw new u("IO_ERROR")}r=await uo(r,i);}return r}async writeAtomically(e,t,r,o,i){let s=join(e.path,ro(r)),a;try{await this.hooks.beforeOpen?.(s),a=await rt(s,constants.O_CREAT|constants.O_EXCL|constants.O_WRONLY),await a.writeFile(o),i!==void 0&&await a.chmod(i.mode&4095),await a.sync(),await a.close(),a=void 0,await sn(e),await no(s,t);}catch(d){throw await a?.close().catch(()=>{}),await tt(s).catch(()=>{}),d instanceof u?d:new u("IO_ERROR")}}async withFileLock(e,t){let r=await me({lockDir:this.lockDir,key:e,waitMs:this.lockWaitMs});try{return await t()}finally{await be(r);}}};function ro(n){return `.${n}.crewx-${randomUUID()}.tmp`}async function oo(n,e){let t=`.${e}.crewx-`;for(let r of await dn(n.path))r.normalize("NFC").startsWith(t)&&r.endsWith(".tmp")&&await tt(join(n.path,r)).catch(()=>{});}async function on(n){return (await so(n)).normalize("NFC").toLowerCase()}async function io(n,e){return on(join(n.workspaceReal,...n.segments,...e.split("/")))}async function so(n){let e=[],t=n;for(;;)try{return join(await ot(t),...e.reverse())}catch{let r=dirname(t);if(r===t)throw new u("IO_ERROR");e.push(basename(t)),t=r;}}async function ao(n,e,t){let r=await rt(e,constants.O_RDONLY);try{let o=await r.stat();if(!o.isFile())throw new u("IO_ERROR");if(t!==void 0&&o.size>t)throw new u("TOO_LARGE");let i=yo(await r.readFile());return await co(n,e,o),{bytes:i,stat:o}}finally{await r.close();}}async function tn(n){let e=await an(join(n.workspaceReal,...n.segments));if(!rn(n.workspaceReal,e))throw new u("INVALID_REF");return e}async function Ee(n,e){let t=(await dn(n)).filter(i=>i.normalize("NFC")===e);if(t.length>1)throw new u("IO_ERROR");let r=join(n,t[0]??e),o=await un(r);if(o){if(o.isSymbolicLink())throw new u("INVALID_REF");return {abs:r,stat:o}}}async function _e(n,e){let t=n;for(let r=0;r<e.length;r+=1){let o=await Ee(t,e[r]);if(!o)return {status:"missing",dir:t,missing:e.slice(r)};if(!o.stat.isDirectory())return {status:"blocked"};t=o.abs;}return {status:"complete",dir:t}}async function uo(n,e){await sn(n);let t=await we(e);if(dirname(t.real)!==n.real)throw new u("INVALID_REF");return t}async function lo(n,e,t){let r=[],o=s=>s===""?0:s.split("/").length-1,i=async(s,a)=>{let d=await po(n,s),p=await dn(s);await sn(d);let c=new Set;for(let y of p){let l=y.normalize("NFC");if(c.has(l))throw new u("IO_ERROR");c.add(l);let b=join(s,y),A=await un(b);if(!(!A||A.isSymbolicLink())){if(A.isDirectory())o(a)<R.refSegments-1&&H.test(l)&&await i(b,`${a}${l}/`);else if(A.isFile()){let m=Z(`${a}${l}`);m!==void 0&&r.push({ref:m,abs:b});}}}};return await i(e,t),r}function et(n,e){return n<e?-1:n>e?1:0}async function we(n){let e=await un(n);if(e?.isSymbolicLink())throw new u("INVALID_REF");if(!e?.isDirectory())throw new u("IO_ERROR");return {path:n,real:await an(n),dev:e.dev,ino:e.ino}}async function po(n,e){let t=await we(e);if(!rn(n,t.real))throw new u("INVALID_REF");return t}async function sn(n){let e=await we(n.path);if(e.real!==n.real||e.dev!==n.dev||e.ino!==n.ino)throw new u("INVALID_REF")}async function co(n,e,t){let r=await an(e);if(!rn(n,r))throw new u("INVALID_REF");let o=await fo(r);if(o.dev!==t.dev||o.ino!==t.ino)throw new u("INVALID_REF")}async function rt(n,e){try{return await Qr(n,e|constants.O_NOFOLLOW)}catch(t){throw t.code==="ELOOP"?new u("INVALID_REF"):new u("IO_ERROR")}}async function an(n){try{return await ot(n)}catch{throw new u("IO_ERROR")}}function ot(n){return new Promise((e,t)=>{realpath.native(n,(r,o)=>r?t(r):e(o));})}async function dn(n){try{return await eo(n)}catch(e){let t=e.code;if(t==="ENOENT"||t==="ENOTDIR")return [];throw new u("IO_ERROR")}}async function un(n){try{return await Yr(n)}catch(e){let t=e.code;if(t==="ENOENT"||t==="ENOTDIR")return;throw new u("IO_ERROR")}}async function fo(n){try{return await to(n)}catch{throw new u("IO_ERROR")}}function yo(n){return new Uint8Array(n.buffer,n.byteOffset,n.byteLength)}function Ao(n){try{return new TextDecoder("utf-8",{fatal:!0,ignoreBOM:!0}).decode(n)}catch{throw new u("IO_ERROR")}}var st=promisify(realpath.native),at="CREWX_APP_FILES_ROOT";function Eo(n,e={}){return {async list(t={}){let r=jn(t.prefix),o=t.after===void 0||t.after===null?void 0:Q(t.after),i=await Se(n,e);return Re(n,e).list(i,r,o)},async read(t){let r=Q(t),o=await Se(n,e);return Re(n,e).read(o,r)},async stat(t){let r=Q(t),o=await Se(n,e);return Re(n,e).stat(o,r)},async write(t,r,o){let i=Q(t),s=Mn(r),a=Bn(o),d=await Se(n,e);return Re(n,e).write(d,i,s,a)}}}async function Se(n,e){let t=await Ro(n.workspaceRoot),r=(e.env??process.env)[at]??e.filesRoot;if(r!==void 0)return {workspaceReal:t,segments:Oo(r)};let o=e.packageDir??process.cwd(),i=await Kn(o);if(i.appId===void 0)throw new u("IO_ERROR");let s=$n({appId:i.appId,origin:e.origin??"not_installed",source:e.source??"workspace",packageRelativePath:await So(t,o),declared:i.declared});return {workspaceReal:t,segments:s.segments}}function Oo(n){let e=he(n);if(e===void 0)throw new u("IO_ERROR");return e}function Re(n,e){let t=join(e.crewxHome??nn(),Ae);return new Oe({},{lockDir:t,lockWaitMs:wo(n)})}function wo(n){let e;try{e=n.context?.nowMs;}catch{e=void 0;}return typeof e!="number"||!Number.isSafeInteger(e)?te:Math.max(0,e+te-Date.now())}async function So(n,e){let t;try{t=await st(e);}catch{return}let r=relative(n,t);if(!(r===""||r===".."||r.startsWith(`..${sep}`)||isAbsolute(r)))return r.split(sep).join("/")}async function Ro(n){try{return await st(n)}catch{throw new u("IO_ERROR")}}var Ie=2,Pe=2097152;var q=2*1024*1024,Te=2e4;function ln(n){return createHash("sha256").update(n).digest("hex")}function Ce(n){if(n.byteLength===0)return 0;let e=0;for(let t of n)t===10&&(e+=1);return n[n.byteLength-1]!==10&&(e+=1),e}var To=Pe+1+q,Co=64*1024,ko=10,ke={kind:"invalid"};function No(n,e){try{let t=[],r=0;for(;;){let s=new Uint8Array(Co),a=readSync(n,s,0,s.length,null);if(a===0)break;if(r+=a,r>e)return;t.push(s.subarray(0,a));}let o=new Uint8Array(r),i=0;for(let s of t)o.set(s,i),i+=s.byteLength;return o}catch{return}}function Ne(n){return Jo(No(n,To))}function Jo(n){if(n===void 0)return ke;let e=n.indexOf(ko);if(n.byteLength<=Pe){let r=jo(Buffer.from(n.buffer,n.byteOffset,n.byteLength).toString("utf8"));if(r.ok&&!(e>=0&&F(r.value)&&r.value.schemaVersion===Ie))return {kind:"v1",value:r.value}}if(e<=0||e>Pe)return ke;let t;try{t=JSON.parse(new TextDecoder("utf-8",{fatal:!0}).decode(n.subarray(0,e)));}catch{return ke}return !F(t)||t.schemaVersion!==Ie?ke:{kind:"v2",header:t,body:n.subarray(e+1)}}var Do="actionId,content,input,schemaVersion,state",xo="bytes,lines,mediaType,sha256",Fo="mediaType,range",Lo=/^[a-f0-9]{64}$/u,vo=new TextDecoder("utf-8",{fatal:true,ignoreBOM:true});function lt(n,e){let t=d=>({code:d,outcome:"rejected"});if(ie(n)!==Do||n.schemaVersion!==Ie||typeof n.actionId!="string"||!F(n.input)||!F(n.state)||!F(n.content)||ie(n.content)!=="in,out")return {code:"INPUT_INVALID",outcome:"failed"};let r=n.content,o,i=r.in;if(i===null){if(e.byteLength!==0)return t(e.byteLength>q?"CONTENT_TOO_LARGE":"CONTENT_DIGEST_MISMATCH")}else {if(!F(i)||ie(i)!==xo||!dt(i.mediaType)||!ut(i.bytes,q)||!ut(i.lines,Te)||typeof i.sha256!="string"||!Lo.test(i.sha256)||e.byteLength!==i.bytes)return t(e.byteLength>q?"CONTENT_TOO_LARGE":"CONTENT_DIGEST_MISMATCH");if(ln(e)!==i.sha256||Ce(e)!==i.lines)return t("CONTENT_DIGEST_MISMATCH");let d;try{d=vo.decode(e);}catch{return t("CONTENT_ENCODING_INVALID")}o={mediaType:i.mediaType,text:d};}let s,a=r.out;if(a!==null){if(!F(a)||ie(a)!==Fo||!dt(a.mediaType))return t("CONTENT_SOURCE_UNSUPPORTED");let d=a.range;if(d!==null&&!Mo(d))return t("CONTENT_SOURCE_UNSUPPORTED");s={mediaType:a.mediaType,...d===null?{}:{range:{startLine:d.startLine,lineCount:d.lineCount}}};}return {actionId:n.actionId,input:n.input,state:n.state,content:{...o===void 0?{}:{in:o},...s===void 0?{}:{out:s}}}}function pt(n){return Object.hasOwn(n,"code")}function ct(n,e){let t=r=>({code:r,outcome:"rejected"});if(n?.in===void 0){if(e.in!==void 0)return t("CONTENT_SOURCE_UNSUPPORTED")}else if(e.in===void 0){if(n.in.required===true)return t("CONTENT_REQUIRED")}else if(e.in.mediaType!==n.in.mediaType)return t("CONTENT_SOURCE_UNSUPPORTED");if(n?.out===void 0){if(e.out!==void 0)return t("CONTENT_SOURCE_UNSUPPORTED")}else {if(e.out===void 0)return t("CONTENT_REQUIRED");if(e.out.mediaType!==n.out.mediaType||e.out.range!==void 0&&n.out.range!==true)return t("CONTENT_SOURCE_UNSUPPORTED")}}function Je(n,e){let{content:t,...r}=n,o=e===void 0?r:{...r,content:{bytes:e.body.byteLength,lines:Ce(e.body),sha256:ln(e.body),...e.range===void 0?{}:{range:e.range}}},i=new TextEncoder().encode(`${JSON.stringify(o)}
|
|
1
|
+
import {promises,realpath,realpathSync,constants,readSync}from'fs';import {join,dirname,basename,relative,sep,isAbsolute,resolve}from'path';import {promisify,format,inspect}from'util';import {execFile}from'child_process';import {randomUUID,createHash}from'crypto';import {homedir}from'os';import {Socket}from'net';import {Console}from'console';import {Writable}from'stream';var v=["text/plain","application/json"];var z=[5,15,30,60],j=Object.freeze({min:15e3,max:6e5,default:3e5}),Pt=1,Ue="schedule:",Tt="schedule",Ct="exit 78",Rn=["standby","disabled","draining","degraded"],kt=["cron","cron_manual","app_enable"],Nt=/^[A-Z][A-Z0-9_]{0,63}$/u;function In(n){return typeof n=="string"&&Nt.test(n)}var Sn=["status","everyMinutes","lastStartedAt","lastFinishedAt","lastOutcome","lastErrorCode","nextRunAt","periodic","periodicReason"],Jt=["unset","on","off"],Dt=["available","unavailable"],Be=64,xt=128;function Pn(n){return z.includes(n)}function He(n){return Number.isSafeInteger(n)&&n>=j.min&&n<=j.max}function Tn(n){return Rn.includes(n)}function Cn(n){if(!Ft(n)||Object.keys(n).length!==Sn.length||!Sn.every(r=>Object.hasOwn(n,r))||typeof n.status!="string"||!Jt.includes(n.status)||!Pn(n.everyMinutes)||!le(n.lastStartedAt,Be)||!le(n.lastFinishedAt,Be)||!le(n.lastOutcome,xt)||!le(n.nextRunAt,Be)||n.lastErrorCode!==null&&!In(n.lastErrorCode)||typeof n.periodic!="string"||!Dt.includes(n.periodic))return;let t=n.periodic;if(!(t==="available"?n.periodicReason!==null:!Tn(n.periodicReason))&&!(n.nextRunAt!==null&&(n.status!=="on"||t!=="available")))return Object.freeze({status:n.status,everyMinutes:n.everyMinutes,lastStartedAt:n.lastStartedAt,lastFinishedAt:n.lastFinishedAt,lastOutcome:n.lastOutcome,lastErrorCode:n.lastErrorCode,nextRunAt:n.nextRunAt,periodic:t,periodicReason:n.periodicReason})}function le(n,e){return n===null||typeof n=="string"&&n.length>0&&n.length<=e}function Ft(n){if(n===null||typeof n!="object"||Array.isArray(n))return false;let e=Object.getPrototypeOf(n);return e===Object.prototype||e===null}var M=Object.freeze({min:6e4,max:18e5,default:6e5}),Lt=Object.freeze({min:1e3,max:12e4,default:3e4}),vt=1,kn="crewx/appJobs",Nn=1,qe=["starting","running","stopping","finished"],Ve=["succeeded","failed","timed_out","cancelled","shutdown","interrupted"],pe=["cancelled","timed_out","shutdown"],Xe=["manual","schedule"],jt=/^[a-z][a-z0-9_]{0,63}$/u,Mt=/^[A-Z][A-Z0-9_]{0,63}$/u,ce=["start","status","cancel"],Ge=["APP_JOB_NOT_DECLARED","APP_JOB_NOT_AUTHORIZED","APP_JOB_SELF_START","APP_JOB_OWNER_INVALID","APP_JOB_DEFINITION_INVALID","APP_JOB_DEFINITION_CHANGED","APP_JOB_DEADLINE_INVALID","APP_JOB_SHUTTING_DOWN","APP_JOB_OWNER_MISMATCH","APP_JOB_STALE_HANDLE","APP_JOB_NOT_ACTIVE","APP_JOB_NOT_GRANTED"],We="APP_JOB_RUN_REQUIRED";function ze(n){return Number.isSafeInteger(n)&&n>=M.min&&n<=M.max}function B(n){return typeof n=="string"&&Mt.test(n)}function U(n){return typeof n=="string"&&jt.test(n)}function $(n){return ce.includes(n)}function Bt(n){return n?.some(({name:e,version:t})=>e===kn&&t===Nn)===true}var Jn=Symbol;Jn.metadata===void 0&&Object.defineProperty(Symbol,"metadata",{configurable:false,value:Symbol.for("Symbol.metadata")});var Ut=Jn.metadata,K=Symbol.for("crewx.app.tool-metadata"),c=class extends Error{code;detail;outcome;constructor(e,t=null,r){super(e),this.name="AppError",this.code=e,this.detail=t,this.outcome=Ke(r?.outcome);}};function Ke(n){return n==="rejected"?"rejected":"failed"}var $e=class{static devtools=process.env.CREWX_APP_DEV==="1"?Object.freeze({log:true}):void 0;currentState;stateWasSet=false;answerBody;answerRange;callContext;callSchedule;callJobs;callJobRun;scheduleDirective;workspaceRoot;constructor(e={workspaceRoot:process.cwd()}){this.currentState=e.state??{},this.workspaceRoot=e.workspaceRoot,this.callContext=e.context===void 0?void 0:zt(e.context),this.callSchedule=e.schedule===void 0?void 0:Object.freeze({...e.schedule}),this.callJobs=e.jobs,this.callJobRun=e.jobRun;}get jobs(){return this.callJobs}get jobRun(){return this.callJobRun}get schedule(){return this.callSchedule}requestSchedule(e){if(typeof e!="boolean")throw new TypeError("requestSchedule needs true or false");if(this.callSchedule===void 0)throw new c("SCHEDULE_UNSUPPORTED","this App has no schedule on this Host");let t=this.callContext?.actor;if(t==="schedule")throw new c("SCHEDULE_UNSUPPORTED","a scheduled run cannot change its own schedule",{outcome:"rejected"});if(e&&t!=="user")throw new c("SCHEDULE_ENABLE_DENIED","only the person at the screen can turn a schedule on",{outcome:"rejected"});this.scheduleDirective=Object.freeze({enabled:e});}get didRequestSchedule(){return this.scheduleDirective}get context(){if(this.callContext===void 0)throw new TypeError("this.context is only set when the Host runs the action; pass options.context when you construct the App in a test");return this.callContext}get state(){return this.currentState}get didSetState(){return this.stateWasSet}setState(e){this.currentState=e,this.stateWasSet=true;}get didSetContent(){return this.answerBody!==void 0}get producedContent(){return this.answerBody===void 0?void 0:{body:this.answerBody,...this.answerRange===void 0?{}:{range:this.answerRange}}}setContent(e,t){if(typeof e!="string"&&!(e instanceof Uint8Array))throw new TypeError("setContent needs a string or a Uint8Array");if(t!==void 0&&!Kt(t))throw new TypeError("setContent range must be { startLine, lineCount, totalLines }, three integers of at least 1");this.answerBody=typeof e=="string"?new TextEncoder().encode(e):new Uint8Array(e),this.answerRange=t===void 0?void 0:{startLine:t.startLine,lineCount:t.lineCount,totalLines:t.totalLines};}emptyState(){return {}}validate(e,t,r){}mapError(e){return {code:"EXECUTION_FAILED",detail:null}}errorState(e,t,r){return {...O(r.state)?r.state:{},error:{code:e,detail:t}}}};function Ht(n){return function(e,t){if(t.static||t.private||t.kind!=="method")throw new TypeError("@Tool can decorate public instance methods only");let r=t.metadata;if(!r)throw new TypeError("standard decorator metadata is unavailable");let o=Object.hasOwn(r,K)?r[K]:[];if(o.some(p=>p.methodName===String(t.name)))throw new TypeError(`@Tool is declared more than once for ${String(t.name)}`);let i=n.content===void 0?void 0:Vt(n.name,n.content);if(n.viewCall!==void 0&&(n.viewCall!==true||n.mutation!==false||n.confirmation!==void 0&&n.confirmation!=="none"||n.resultProjection===void 0||i!==void 0||n.schedule!==void 0||n.job!==void 0||n.jobAccess!==void 0))throw new TypeError(`@Tool ${n.name}: viewCall requires mutation false, confirmation none, resultProjection, and no content, job, or schedule`);let s=n.schedule===void 0?void 0:Xt(n);if(s!==void 0&&o.some(p=>p.options.schedule!==void 0))throw new TypeError(`@Tool ${n.name}: an App declares at most one scheduled action`);let a=n.job===void 0?void 0:Gt(n);if(a!==void 0&&o.some(p=>p.options.job!==void 0))throw new TypeError(`@Tool ${n.name}: an App declares at most one job action`);let d=n.jobAccess===void 0?void 0:Wt(n);r[K]=[...o,{methodName:String(t.name),options:Object.freeze({...n,...i===void 0?{}:{content:i},...s===void 0?{}:{schedule:s},...a===void 0?{}:{job:a},...d===void 0?{}:{jobAccess:d}})}];}}function Y(n){let e=n[Ut],t=e&&Object.hasOwn(e,K)?e[K]:[],r=new Map(t.map(i=>[i.methodName,i])),o=Object.getOwnPropertyNames(n.prototype).map(i=>r.get(i)).filter(i=>i!==void 0);if(o.length!==t.length)throw new TypeError("a @Tool method is missing from the App prototype");return o}function Dn(n){return Y(n).some(({options:e})=>e.schedule!==void 0)}function xn(n){let e=n.definition,t=Y(n),r=new Set;return t.map(({options:o})=>{if(r.has(o.name))throw new TypeError(`duplicate @Tool name: ${o.name}`);return r.add(o.name),{actionId:o.name,...o.dataInputs===void 0?{}:{dataInputs:[...o.dataInputs]},confirmation:o.confirmation??"none",capability:o.capability??"app.read",mutation:o.mutation??true,inputSchema:o.inputSchema,...o.viewCall===true?{viewCall:true}:{},...o.content===void 0?{}:{content:$t(o.content)},...o.schedule===void 0?{}:{schedule:{...o.schedule}},...o.job===void 0?{}:{job:{...o.job}},...o.jobAccess===void 0?{}:{jobAccess:[...o.jobAccess]},resultProjection:o.resultProjection??{allow:[...e.stateProjection.allow]},_meta:{description:o.description}}})}function qt(n,e){if(e.length===0)throw new TypeError("backendCommand must name the skill command");let t=xn(n);if(t.some(o=>o.viewCall===true))throw new TypeError("viewCall is available only to a server.ts screen App");let r=t.map(({_meta:o,...i})=>({...i,backend:{type:"skill",command:[...e]},_meta:o}));return {...n.definition,actions:r}}function Vt(n,e){let t=i=>{throw new TypeError(`@Tool ${n}: content ${i}`)},r=(i,s,a)=>{if(!O(a))return t(`${i} must be an object`);for(let d of Object.keys(a))if(d==="mediaType"){if(!v.includes(a[d]))return t(`${i}.mediaType must be one of ${v.join(", ")}`)}else if(d===s){if(typeof a[d]!="boolean")return t(`${i}.${d} must be true or false`)}else return t(`${i} has the unknown key "${d}"`);return Object.hasOwn(a,"mediaType")?Object.freeze({...a}):t(`${i}.mediaType is required`)};if(!O(e))return t("must be an object");let o={};for(let i of Object.keys(e))if(i==="in")o[i]=r("in","required",e[i]);else if(i==="out")o[i]=r("out","range",e[i]);else return t(`has the unknown key "${i}"; use "in" and/or "out"`);return Object.keys(o).length===0?t('needs "in" and/or "out"'):Object.freeze(o)}function Xt(n){let e=r=>{throw new TypeError(`@Tool ${n.name}: schedule ${r}`)},t=n.schedule;if(!O(t))return e("must be an object");for(let r of Object.keys(t))if(r!=="everyMinutes"&&r!=="timeoutMs")return e(`has the unknown key "${r}"`);return z.includes(t.everyMinutes)?t.timeoutMs!==void 0&&!He(t.timeoutMs)?e(`timeoutMs must be an integer from ${j.min} to ${j.max}`):n.content!==void 0?e("cannot be combined with content"):n.dataInputs!==void 0?e("cannot be combined with dataInputs"):n.confirmation!==void 0&&n.confirmation!=="none"?e("cannot require a native confirmation"):Object.freeze({everyMinutes:t.everyMinutes,...t.timeoutMs===void 0?{}:{timeoutMs:t.timeoutMs}}):e(`everyMinutes must be one of ${z.join(", ")}`)}function Gt(n){let e=r=>{throw new TypeError(`@Tool ${n.name}: job ${r}`)},t=n.job;if(!O(t))return e("must be an object");for(let r of Object.keys(t))if(r!=="deadlineMs")return e(`has the unknown key "${r}"`);return t.deadlineMs!==void 0&&!ze(t.deadlineMs)?e(`deadlineMs must be an integer from ${M.min} to ${M.max}`):n.content!==void 0?e("cannot be combined with content"):n.dataInputs!==void 0?e("cannot be combined with dataInputs"):n.confirmation!==void 0&&n.confirmation!=="none"?e("cannot require a native confirmation"):n.schedule!==void 0?e("cannot be the scheduled action too"):n.jobAccess!==void 0?e("cannot also be a control action: a run does not control itself"):Object.freeze({...t.deadlineMs===void 0?{}:{deadlineMs:t.deadlineMs}})}function Wt(n){let e=r=>{throw new TypeError(`@Tool ${n.name}: jobAccess ${r}`)},t=n.jobAccess;return !Array.isArray(t)||t.length===0?e("must list at least one operation"):new Set(t).size!==t.length?e("must not repeat an operation"):t.every($)?n.job!==void 0?e("cannot be set on the job action, which runs the job and cannot control it"):n.content!==void 0?e("cannot be combined with content"):Object.freeze([...t]):e("names an unknown operation")}function zt(n){return Object.freeze({instanceId:n.instanceId,threadId:n.threadId,actor:n.actor,requestId:n.requestId,nowMs:n.nowMs})}function $t(n){let e={};for(let[t,r]of Object.entries(n))e[t]={...r};return e}function Kt(n){return O(n)&&["startLine","lineCount","totalLines"].every(e=>Number.isSafeInteger(n[e])&&n[e]>=1)}function O(n){if(n===null||typeof n!="object"||Array.isArray(n))return false;let e=Object.getPrototypeOf(n);return e===Object.prototype||e===null}var Yt=/^[A-Za-z0-9._:-]{1,128}$/u,Zt=/[\u0000-\u001f\u007f\u2028\u2029]/u,Qt=512;function Ye(n=process.env){let e=Fn(n.CREWX_APP_INSTANCE_ID),t=n.CREWX_APP_REQUEST_ID,r=n.CREWX_APP_ACTOR_KIND,o=n.CREWX_APP_NOW_MS;if(e===void 0||typeof t!="string"||!Yt.test(t)||r!=="user"&&r!=="agent"&&r!=="schedule"||typeof o!="string"||!/^\d{1,16}$/u.test(o))return;let i=Number(o);if(!Number.isSafeInteger(i))return;let s=n.CREWX_THREAD_ID===void 0?null:Fn(n.CREWX_THREAD_ID);if(s!==void 0&&!(r==="schedule"&&(s!==null||!e.startsWith(Ue))))return Object.freeze({instanceId:e,threadId:s,actor:r,requestId:t,nowMs:i})}function Fn(n){if(!(typeof n!="string"||n.length===0||Zt.test(n)))return new TextEncoder().encode(n).byteLength<=Qt?n:void 0}var er="dist/tools.json",nr=1,tr="dist/main.mjs";var Ln=["CREWX_APP_INSTANCE_ID","CREWX_THREAD_ID"];function rr(n){if(!Array.isArray(n)||n.length===0)return false;let e=new Set;for(let t of n){if(!Ln.some(r=>r===t)||e.has(t))return false;e.add(t);}return true}var vn=["INVALID_REF","FILE_NOT_FOUND","DOCUMENT_CHANGED","TOO_LARGE","IO_ERROR","FILE_BUSY"],u=class extends Error{code;constructor(e){super(e),this.name="AppFilesError",this.code=e;}};var R={textBytes:256*1024,refCodePoints:200,refSegments:3,pageSize:200},H=/^[\p{L}\p{N}][\p{L}\p{N}\p{M}_-]{0,99}$/u,x=()=>{throw new u("INVALID_REF")};function Z(n){let e=n.normalize("NFC");if([...e].length>R.refCodePoints)return;let t=e.split("/");if(t.length>R.refSegments)return;let r=t[t.length-1];return r.endsWith(".md")&&[...t.slice(0,-1),r.slice(0,-3)].every(i=>H.test(i))?e:void 0}function Q(n){return typeof n!="string"?x():Z(n)??x()}function jn(n){if(n==null||n==="")return "";if(typeof n!="string")return x();let e=n.normalize("NFC");if([...e].length>R.refCodePoints)return x();let t=(e.endsWith("/")?e.slice(0,-1):e).split("/");return t.length>R.refSegments-1||!t.every(r=>H.test(r))?x():`${t.join("/")}/`}function Mn(n){if(typeof n!="string")return x();if(Buffer.byteLength(n,"utf8")>R.textBytes)throw new u("TOO_LARGE");return n}function Bn(n){return n===null?null:typeof n=="string"&&n.length<=R.refCodePoints?n:x()}var Ae=join("locks","files"),te=12e3,{link:lr,mkdir:pr,open:cr,readFile:en,unlink:ne}=promises,fr=5,yr=50,Ar=1e3,mr=2e3,br="/bin/ps",hr={LC_ALL:"C",TZ:"UTC"},gr=100,_r=19,Er=/^[A-Za-z]{3} ([A-Za-z]{3}) +(\d{1,2}) (\d{2}):(\d{2}):(\d{2}) (\d{4})$/,wr=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],Or=promisify(execFile),Un,fe;function nn(n=process.env){if(n.CREWX_HOME){let e=resolve(n.CREWX_HOME);try{return realpathSync(e)}catch(t){if(t.code==="ENOENT")return e;throw t}}return process.platform!=="win32"&&n.XDG_CONFIG_HOME?join(n.XDG_CONFIG_HOME,"crewx"):join(homedir(),".crewx")}async function me(n){let{lockDir:e,key:t}=n,r=join(e,Sr(t)),o=Date.now()+n.waitMs,i=await Vn(e,{token:randomUUID(),pid:process.pid,startedAtMs:await Gn()}),s=new Ze;try{let a=fr;for(;;){if(await Xn(i.staged,r))return {path:r,token:i.record.token};let d=await ye(r);if(d!=="vanished"&&!(d!=="unreadable"&&await s.isDead(d)&&await Tr(e,r,d,s))){if(Date.now()>=o)throw new u("FILE_BUSY");await Dr(a),a=Math.min(a*2,yr);}}}finally{await ne(i.staged).catch(()=>{});}}async function be(n){await Qe(n.path,n.token);}function Sr(n){return createHash("sha256").update(n,"utf8").digest("hex")}async function Vn(n,e){let t=join(n,`.${e.token}.tmp`);try{await pr(n,{recursive:!0}),await Rr(t,JSON.stringify(e));}catch{throw await ne(t).catch(()=>{}),new u("IO_ERROR")}return {record:e,staged:t}}async function Rr(n,e){let t=await cr(n,"wx");try{await t.writeFile(e),await t.sync();}finally{await t.close();}}async function Xn(n,e){try{return await lr(n,e),!0}catch(t){if(t.code==="EEXIST")return false;throw new u("IO_ERROR")}}async function ye(n){let e;try{e=await en(n,"utf8");}catch(t){return t.code==="ENOENT"?"vanished":"unreadable"}try{let t=JSON.parse(e);return Ir(t)?t:"unreadable"}catch{return "unreadable"}}function Ir(n){if(typeof n!="object"||n===null||Array.isArray(n))return false;let e=n;return typeof e.token=="string"&&e.token.length>0&&typeof e.pid=="number"&&Number.isSafeInteger(e.pid)&&e.pid>0&&(e.startedAtMs===null||Number.isSafeInteger(e.startedAtMs))}async function Pr(n){try{process.kill(n.pid,0);}catch(t){return t.code==="ESRCH"}if(n.startedAtMs===null)return false;let e=await Wn(n.pid);return e!==null&&e!==n.startedAtMs}var Ze=class{constructor(e=Pr,t=Date.now){this.check=e;this.now=t;}check;now;answers=new Map;async isDead(e){let t=this.now(),r=this.answers.get(e.token);if(r!==void 0&&t-r.at<Ar)return r.dead;let o=await this.check(e);return this.answers.set(e.token,{at:t,dead:o}),o}};async function Tr(n,e,t,r){let o=`${e}.reclaim`,i=await Vn(n,{token:randomUUID(),pid:process.pid,startedAtMs:await Gn()});try{if(!await Xn(i.staged,o)){let s=await ye(o);return s!=="vanished"&&s!=="unreadable"&&await r.isDead(s)&&await Qe(o,s.token),!1}try{let s=await ye(e);return typeof s!="object"||s.token!==t.token?!1:(await ne(e).catch(()=>{}),!0)}finally{await Qe(o,i.record.token);}}finally{await ne(i.staged).catch(()=>{});}}async function Qe(n,e){let t=await ye(n);typeof t=="object"&&t.token===e&&await ne(n).catch(()=>{});}function Gn(){return (fe===void 0||fe.pid!==process.pid)&&(fe={pid:process.pid,startedAtMs:Wn(process.pid)}),fe.startedAtMs}async function Wn(n){return process.platform==="linux"&&(Un??=await promises.access("/proc/self/stat").then(()=>true,()=>false),Un)?Cr(n):Nr(n)}async function Cr(n){try{let e=await en(`/proc/${n}/stat`,"utf8"),t=e.slice(e.lastIndexOf(")")+2).split(" "),r=Number(t[_r]),o=await kr();return !Number.isSafeInteger(r)||o===void 0?null:o*1e3+r*1e3/gr}catch{return null}}async function kr(){let n=(await en("/proc/stat","utf8")).split(`
|
|
2
|
+
`).find(t=>t.startsWith("btime ")),e=Number(n?.slice(6));return Number.isSafeInteger(e)?e:void 0}async function Nr(n){try{let{stdout:e}=await Or(br,["-o","lstart=","-p",String(n)],{env:hr,encoding:"utf8",timeout:mr});return Jr(e.trim())}catch{return null}}function Jr(n){let e=Er.exec(n);if(e===null)return null;let t=wr.indexOf(e[1]);return t<0?null:Date.UTC(Number(e[6]),t,Number(e[2]),Number(e[3]),Number(e[4]),Number(e[5]))}function Dr(n){return new Promise(e=>setTimeout(e,n))}var Lr=[".git",".crewx","node_modules","apps","skills"],{lstat:vr,readFile:jr}=promises,Mr=4,Br=200,Ur=1024*1024,zn=/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/;function Hr(n){return ["docs","apps",n]}function $n(n){let e={segments:Hr(n.appId),declared:false};if(n.origin!=="not_installed"||n.source!=="workspace"&&n.source!=="bundled"||n.declared===void 0||n.declared===null)return e;let t=qr(n.declared);return t.ok?n.packageRelativePath!==void 0&&Vr(t.segments,Xr(n.packageRelativePath))?{...e,warning:"FILES_ROOT_FORBIDDEN"}:{segments:t.segments,declared:true}:{...e,warning:t.warning}}async function Kn(n){let e={appId:void 0,declared:void 0};try{let t=join(n,"manifest.json"),r=await vr(t);if(!r.isFile()||r.size>Ur)return e;let o=JSON.parse(await jr(t,"utf8"));if(!he(o))return e;let i=o.name,s=typeof i=="string"&&zn.test(i)?i:void 0,a=o._meta,d=he(a)?a["dev.crewx"]:void 0,p=he(d)?d.files:void 0;return {appId:s,declared:p}}catch{return e}}function qr(n){return !he(n)||Object.keys(n).some(e=>e!=="root")||typeof n.root!="string"?{ok:false,warning:"FILES_ROOT_INVALID"}:Zn(n.root.normalize("NFC"),Yn)}function ge(n){if(n.normalize("NFC")!==n)return;let e=Zn(n,t=>Yn(t)||zn.test(t));return e.ok?e.segments:void 0}function Yn(n){return H.test(n)}function Zn(n,e){let t={ok:false,warning:"FILES_ROOT_INVALID"},r={ok:false,warning:"FILES_ROOT_FORBIDDEN"};if([...n].length>Br)return t;let o=n.split("/");return o.length>Mr||!o.every(e)?t:o.length===1||Lr.includes(o[0].toLowerCase())?r:{ok:true,segments:o}}function Vr(n,e){let t=Math.min(n.length,e.length);for(let r=0;r<t;r+=1)if(n[r].toLowerCase()!==e[r].toLowerCase())return false;return t>0}function Xr(n){return n.normalize("NFC").split("/").filter(e=>e.length>0)}function he(n){return typeof n=="object"&&n!==null&&!Array.isArray(n)}var{lstat:Yr,mkdir:Zr,open:Qr,readdir:eo,rename:no,stat:to,unlink:tt}=promises;function re(n){return `sha256:${createHash("sha256").update(n).digest("hex")}`}function rn(n,e){return e===n||e.startsWith(n.endsWith(sep)?n:n+sep)}var we=class{constructor(e={},t){this.hooks=e;this.lockDir=t.lockDir,this.lockWaitMs=t.lockWaitMs??te;}hooks;lockDir;lockWaitMs;async list(e,t,r){let o=t===""?[]:t.slice(0,-1).split("/"),i=await _e(e.workspaceReal,[...e.segments,...o]);if(i.status!=="complete")return {items:[],next:null};let s=await tn(e),a=await lo(s,i.dir,t);a.sort((y,l)=>et(y.ref,l.ref));let d=r===void 0?a:a.filter(y=>et(y.ref,r)>0),p=d.slice(0,R.pageSize),f=[];for(let y of p){let l=await this.readVerified(s,y.abs);f.push({ref:y.ref,version:re(l.bytes),bytes:l.bytes.length,modifiedAt:l.stat.mtime.toISOString()});}return {items:f,next:d.length>p.length?p[p.length-1].ref:null}}async read(e,t){let r=t.split("/"),o=await _e(e.workspaceReal,[...e.segments,...r.slice(0,-1)]);if(o.status!=="complete")throw new u("FILE_NOT_FOUND");let i=await Ee(o.dir,r[r.length-1]);if(!i)throw new u("FILE_NOT_FOUND");if(!i.stat.isFile())throw new u("IO_ERROR");let{bytes:s}=await this.readVerified(await tn(e),i.abs,R.textBytes);return {ref:t,text:Ao(s),version:re(s)}}async stat(e,t){let r=t.split("/"),o=await _e(e.workspaceReal,[...e.segments,...r.slice(0,-1)]);if(o.status!=="complete")throw new u("FILE_NOT_FOUND");let i=await Ee(o.dir,r[r.length-1]);if(!i)throw new u("FILE_NOT_FOUND");if(!i.stat.isFile())throw new u("IO_ERROR");let s=await this.readVerified(await tn(e),i.abs,R.textBytes);return {ref:t,version:re(s.bytes),bytes:s.bytes.length,modifiedAt:s.stat.mtime.toISOString()}}async write(e,t,r,o){let i=t.split("/"),s=i[i.length-1],a=new Uint8Array(Buffer.from(r,"utf8"));return this.withFileLock(await io(e,t),async()=>{let d=await _e(e.workspaceReal,[...e.segments,...i.slice(0,-1)]);if(d.status==="blocked")throw new u("IO_ERROR");let p=await Oe(d.dir),f=d.status==="complete"?await Ee(d.dir,s):void 0;if(f&&!f.stat.isFile())throw new u("IO_ERROR");if((f?re((await this.readVerified(p.real,f.abs)).bytes):null)!==o)throw new u("DOCUMENT_CHANGED");let l=await this.createFolders(p,d.status==="missing"?d.missing:[]);await oo(l,s);let b=f?.abs??join(l.path,s);return await this.writeAtomically(l,b,s,a,f?.stat),{ref:t,version:re(a)}})}async readVerified(e,t,r){return await this.hooks.beforeOpen?.(t),ao(e,t,r)}async createFolders(e,t){let r=e;for(let o of t){let i=join(r.path,o);await this.hooks.beforeMkdir?.(i);try{await Zr(i);}catch(s){if(s.code!=="EEXIST")throw new u("IO_ERROR")}r=await uo(r,i);}return r}async writeAtomically(e,t,r,o,i){let s=join(e.path,ro(r)),a;try{await this.hooks.beforeOpen?.(s),a=await rt(s,constants.O_CREAT|constants.O_EXCL|constants.O_WRONLY),await a.writeFile(o),i!==void 0&&await a.chmod(i.mode&4095),await a.sync(),await a.close(),a=void 0,await sn(e),await no(s,t);}catch(d){throw await a?.close().catch(()=>{}),await tt(s).catch(()=>{}),d instanceof u?d:new u("IO_ERROR")}}async withFileLock(e,t){let r=await me({lockDir:this.lockDir,key:e,waitMs:this.lockWaitMs});try{return await t()}finally{await be(r);}}};function ro(n){return `.${n}.crewx-${randomUUID()}.tmp`}async function oo(n,e){let t=`.${e}.crewx-`;for(let r of await dn(n.path))r.normalize("NFC").startsWith(t)&&r.endsWith(".tmp")&&await tt(join(n.path,r)).catch(()=>{});}async function on(n){return (await so(n)).normalize("NFC").toLowerCase()}async function io(n,e){return on(join(n.workspaceReal,...n.segments,...e.split("/")))}async function so(n){let e=[],t=n;for(;;)try{return join(await ot(t),...e.reverse())}catch{let r=dirname(t);if(r===t)throw new u("IO_ERROR");e.push(basename(t)),t=r;}}async function ao(n,e,t){let r=await rt(e,constants.O_RDONLY);try{let o=await r.stat();if(!o.isFile())throw new u("IO_ERROR");if(t!==void 0&&o.size>t)throw new u("TOO_LARGE");let i=yo(await r.readFile());return await co(n,e,o),{bytes:i,stat:o}}finally{await r.close();}}async function tn(n){let e=await an(join(n.workspaceReal,...n.segments));if(!rn(n.workspaceReal,e))throw new u("INVALID_REF");return e}async function Ee(n,e){let t=(await dn(n)).filter(i=>i.normalize("NFC")===e);if(t.length>1)throw new u("IO_ERROR");let r=join(n,t[0]??e),o=await un(r);if(o){if(o.isSymbolicLink())throw new u("INVALID_REF");return {abs:r,stat:o}}}async function _e(n,e){let t=n;for(let r=0;r<e.length;r+=1){let o=await Ee(t,e[r]);if(!o)return {status:"missing",dir:t,missing:e.slice(r)};if(!o.stat.isDirectory())return {status:"blocked"};t=o.abs;}return {status:"complete",dir:t}}async function uo(n,e){await sn(n);let t=await Oe(e);if(dirname(t.real)!==n.real)throw new u("INVALID_REF");return t}async function lo(n,e,t){let r=[],o=s=>s===""?0:s.split("/").length-1,i=async(s,a)=>{let d=await po(n,s),p=await dn(s);await sn(d);let f=new Set;for(let y of p){let l=y.normalize("NFC");if(f.has(l))throw new u("IO_ERROR");f.add(l);let b=join(s,y),A=await un(b);if(!(!A||A.isSymbolicLink())){if(A.isDirectory())o(a)<R.refSegments-1&&H.test(l)&&await i(b,`${a}${l}/`);else if(A.isFile()){let m=Z(`${a}${l}`);m!==void 0&&r.push({ref:m,abs:b});}}}};return await i(e,t),r}function et(n,e){return n<e?-1:n>e?1:0}async function Oe(n){let e=await un(n);if(e?.isSymbolicLink())throw new u("INVALID_REF");if(!e?.isDirectory())throw new u("IO_ERROR");return {path:n,real:await an(n),dev:e.dev,ino:e.ino}}async function po(n,e){let t=await Oe(e);if(!rn(n,t.real))throw new u("INVALID_REF");return t}async function sn(n){let e=await Oe(n.path);if(e.real!==n.real||e.dev!==n.dev||e.ino!==n.ino)throw new u("INVALID_REF")}async function co(n,e,t){let r=await an(e);if(!rn(n,r))throw new u("INVALID_REF");let o=await fo(r);if(o.dev!==t.dev||o.ino!==t.ino)throw new u("INVALID_REF")}async function rt(n,e){try{return await Qr(n,e|constants.O_NOFOLLOW)}catch(t){throw t.code==="ELOOP"?new u("INVALID_REF"):new u("IO_ERROR")}}async function an(n){try{return await ot(n)}catch{throw new u("IO_ERROR")}}function ot(n){return new Promise((e,t)=>{realpath.native(n,(r,o)=>r?t(r):e(o));})}async function dn(n){try{return await eo(n)}catch(e){let t=e.code;if(t==="ENOENT"||t==="ENOTDIR")return [];throw new u("IO_ERROR")}}async function un(n){try{return await Yr(n)}catch(e){let t=e.code;if(t==="ENOENT"||t==="ENOTDIR")return;throw new u("IO_ERROR")}}async function fo(n){try{return await to(n)}catch{throw new u("IO_ERROR")}}function yo(n){return new Uint8Array(n.buffer,n.byteOffset,n.byteLength)}function Ao(n){try{return new TextDecoder("utf-8",{fatal:!0,ignoreBOM:!0}).decode(n)}catch{throw new u("IO_ERROR")}}var st=promisify(realpath.native),at="CREWX_APP_FILES_ROOT";function Eo(n,e={}){return {async list(t={}){let r=jn(t.prefix),o=t.after===void 0||t.after===null?void 0:Q(t.after),i=await Se(n,e);return Re(n,e).list(i,r,o)},async read(t){let r=Q(t),o=await Se(n,e);return Re(n,e).read(o,r)},async stat(t){let r=Q(t),o=await Se(n,e);return Re(n,e).stat(o,r)},async write(t,r,o){let i=Q(t),s=Mn(r),a=Bn(o),d=await Se(n,e);return Re(n,e).write(d,i,s,a)}}}async function Se(n,e){let t=await Ro(n.workspaceRoot),r=(e.env??process.env)[at]??e.filesRoot;if(r!==void 0)return {workspaceReal:t,segments:wo(r)};let o=e.packageDir??process.cwd(),i=await Kn(o);if(i.appId===void 0)throw new u("IO_ERROR");let s=$n({appId:i.appId,origin:e.origin??"not_installed",source:e.source??"workspace",packageRelativePath:await So(t,o),declared:i.declared});return {workspaceReal:t,segments:s.segments}}function wo(n){let e=ge(n);if(e===void 0)throw new u("IO_ERROR");return e}function Re(n,e){let t=join(e.crewxHome??nn(),Ae);return new we({},{lockDir:t,lockWaitMs:Oo(n)})}function Oo(n){let e;try{e=n.context?.nowMs;}catch{e=void 0;}return typeof e!="number"||!Number.isSafeInteger(e)?te:Math.max(0,e+te-Date.now())}async function So(n,e){let t;try{t=await st(e);}catch{return}let r=relative(n,t);if(!(r===""||r===".."||r.startsWith(`..${sep}`)||isAbsolute(r)))return r.split(sep).join("/")}async function Ro(n){try{return await st(n)}catch{throw new u("IO_ERROR")}}var Ie=2,Pe=2097152;var q=2*1024*1024,Te=2e4;function ln(n){return createHash("sha256").update(n).digest("hex")}function Ce(n){if(n.byteLength===0)return 0;let e=0;for(let t of n)t===10&&(e+=1);return n[n.byteLength-1]!==10&&(e+=1),e}var To=Pe+1+q,Co=64*1024,ko=10,ke={kind:"invalid"};function No(n,e){try{let t=[],r=0;for(;;){let s=new Uint8Array(Co),a=readSync(n,s,0,s.length,null);if(a===0)break;if(r+=a,r>e)return;t.push(s.subarray(0,a));}let o=new Uint8Array(r),i=0;for(let s of t)o.set(s,i),i+=s.byteLength;return o}catch{return}}function Ne(n){return Jo(No(n,To))}function Jo(n){if(n===void 0)return ke;let e=n.indexOf(ko);if(n.byteLength<=Pe){let r=jo(Buffer.from(n.buffer,n.byteOffset,n.byteLength).toString("utf8"));if(r.ok&&!(e>=0&&F(r.value)&&r.value.schemaVersion===Ie))return {kind:"v1",value:r.value}}if(e<=0||e>Pe)return ke;let t;try{t=JSON.parse(new TextDecoder("utf-8",{fatal:!0}).decode(n.subarray(0,e)));}catch{return ke}return !F(t)||t.schemaVersion!==Ie?ke:{kind:"v2",header:t,body:n.subarray(e+1)}}var Do="actionId,content,input,schemaVersion,state",xo="bytes,lines,mediaType,sha256",Fo="mediaType,range",Lo=/^[a-f0-9]{64}$/u,vo=new TextDecoder("utf-8",{fatal:true,ignoreBOM:true});function lt(n,e){let t=d=>({code:d,outcome:"rejected"});if(ie(n)!==Do||n.schemaVersion!==Ie||typeof n.actionId!="string"||!F(n.input)||!F(n.state)||!F(n.content)||ie(n.content)!=="in,out")return {code:"INPUT_INVALID",outcome:"failed"};let r=n.content,o,i=r.in;if(i===null){if(e.byteLength!==0)return t(e.byteLength>q?"CONTENT_TOO_LARGE":"CONTENT_DIGEST_MISMATCH")}else {if(!F(i)||ie(i)!==xo||!dt(i.mediaType)||!ut(i.bytes,q)||!ut(i.lines,Te)||typeof i.sha256!="string"||!Lo.test(i.sha256)||e.byteLength!==i.bytes)return t(e.byteLength>q?"CONTENT_TOO_LARGE":"CONTENT_DIGEST_MISMATCH");if(ln(e)!==i.sha256||Ce(e)!==i.lines)return t("CONTENT_DIGEST_MISMATCH");let d;try{d=vo.decode(e);}catch{return t("CONTENT_ENCODING_INVALID")}o={mediaType:i.mediaType,text:d};}let s,a=r.out;if(a!==null){if(!F(a)||ie(a)!==Fo||!dt(a.mediaType))return t("CONTENT_SOURCE_UNSUPPORTED");let d=a.range;if(d!==null&&!Mo(d))return t("CONTENT_SOURCE_UNSUPPORTED");s={mediaType:a.mediaType,...d===null?{}:{range:{startLine:d.startLine,lineCount:d.lineCount}}};}return {actionId:n.actionId,input:n.input,state:n.state,content:{...o===void 0?{}:{in:o},...s===void 0?{}:{out:s}}}}function pt(n){return Object.hasOwn(n,"code")}function ct(n,e){let t=r=>({code:r,outcome:"rejected"});if(n?.in===void 0){if(e.in!==void 0)return t("CONTENT_SOURCE_UNSUPPORTED")}else if(e.in===void 0){if(n.in.required===true)return t("CONTENT_REQUIRED")}else if(e.in.mediaType!==n.in.mediaType)return t("CONTENT_SOURCE_UNSUPPORTED");if(n?.out===void 0){if(e.out!==void 0)return t("CONTENT_SOURCE_UNSUPPORTED")}else {if(e.out===void 0)return t("CONTENT_REQUIRED");if(e.out.mediaType!==n.out.mediaType||e.out.range!==void 0&&n.out.range!==true)return t("CONTENT_SOURCE_UNSUPPORTED")}}function Je(n,e){let{content:t,...r}=n,o=e===void 0?r:{...r,content:{bytes:e.body.byteLength,lines:Ce(e.body),sha256:ln(e.body),...e.range===void 0?{}:{range:e.range}}},i=new TextEncoder().encode(`${JSON.stringify(o)}
|
|
3
3
|
`);if(e===void 0)return i;let s=new Uint8Array(i.byteLength+e.body.byteLength);return s.set(i,0),s.set(e.body,i.byteLength),s}function ft(n){if(n.body.byteLength>q||Ce(n.body)>Te)return {code:"CONTENT_TOO_LARGE",outcome:"failed"}}function jo(n){try{return {ok:!0,value:JSON.parse(n)}}catch{return {ok:false}}}function ie(n){return Object.keys(n).sort().join(",")}function F(n){if(n===null||typeof n!="object"||Array.isArray(n))return false;let e=Object.getPrototypeOf(n);return e===Object.prototype||e===null}function dt(n){return typeof n=="string"&&v.includes(n)}function ut(n,e){return Number.isSafeInteger(n)&&n>=0&&n<=e}function Mo(n){return F(n)&&ie(n)==="lineCount,startLine"&&Number.isSafeInteger(n.startLine)&&n.startLine>=1&&Number.isSafeInteger(n.lineCount)&&n.lineCount>=1&&n.lineCount<=Te}var At="CREWX_APP_JOB_CHANNEL",I=1,se=4096,fn=1e4,yn=5e3,An=512,pn=Object.freeze({min:3,max:16}),Bo=["APP_JOB_BRIDGE_UNAVAILABLE","APP_JOB_BRIDGE_INVALID","APP_JOB_BRIDGE_TIMEOUT","APP_JOB_BRIDGE_CLOSED"],de=/^[A-Za-z0-9._:-]{1,128}$/u,Uo=64,mt=2147483647,ae=class{#e="";#n=false;push(e){let t=[],r=e;for(;;){let o=r.indexOf(`
|
|
4
|
-
`);if(o===-1)return this.#n||(this.#e+=r,V(this.#e)>se&&(t.push({kind:"oversized"}),this.#e="",this.#n=true)),t;let i=r.slice(0,o);if(r=r.slice(o+1),this.#n){this.#n=false;continue}let s=this.#e+i;this.#e="",t.push(V(s)>se?{kind:"oversized"}:{kind:"line",line:s});}}};function Fe(n){let e=JSON.stringify(n);if(V(e)>se)throw new TypeError("App job bridge message is over the line bound");return e}function Ho(n){let e=Le(n);if(e===void 0||e.v!==I||!bt(e.requestId)||!gt(e.seq))return;let t={v:I,requestId:e.requestId,seq:e.seq};switch(e.op){case "start":return O(e,["v","op","requestId","seq"],[])?{...t,op:"start"}:void 0;case "status":{if(!O(e,["v","op","requestId","seq"],["handle"]))return;if(e.handle===void 0)return {...t,op:"status"};let r=cn(e.handle);return r===void 0?void 0:{...t,op:"status",handle:r}}case "cancel":{if(!O(e,["v","op","requestId","seq","handle"],[]))return;let r=cn(e.handle);return r===void 0?void 0:{...t,op:"cancel",handle:r}}default:return}}function mn(n){let e=Le(n);if(e===void 0||e.v!==I||!bt(e.requestId)||!gt(e.seq))return;let t={v:I,requestId:e.requestId,seq:e.seq};if(e.ok===false)return O(e,["v","requestId","seq","ok","code"],[])&&Ge.includes(e.code)?{...t,ok:false,code:e.code}:void 0;if(e.ok===true)switch(e.op){case "start":{if(!O(e,["v","requestId","seq","ok","op","outcome","job"],[]))return;let r=De(e.job),o=e.outcome;return r===void 0||o!=="started"&&o!=="attached"?void 0:{...t,ok:true,op:"start",outcome:o,job:r}}case "status":{if(!O(e,["v","requestId","seq","ok","op","job"],[]))return;if(e.job===null)return {...t,ok:true,op:"status",job:null};let r=De(e.job);return r===void 0?void 0:{...t,ok:true,op:"status",job:r}}case "cancel":{if(!O(e,["v","requestId","seq","ok","op","outcome","job"],[]))return;let r=De(e.job);return r===void 0||e.outcome!=="stopping"?void 0:{...t,ok:true,op:"cancel",outcome:"stopping",job:r}}default:return}}function qo(n){let e=Le(n);if(e===void 0||e.v!==I||typeof e.runId!="string"||!de.test(e.runId)||!je(e.generation))return;let t={v:I,runId:e.runId,generation:e.generation};switch(e.kind){case "heartbeat":return O(e,["v","kind","runId","generation"],[])?{...t,kind:"heartbeat"}:void 0;case "completed":return O(e,["v","kind","runId","generation"],[])?{...t,kind:"completed"}:void 0;case "progress":{if(!O(e,["v","kind","runId","generation","phase"],["completed","total","resumable"]))return;let{completed:r,total:o,resumable:i}=e;return !U(e.phase)||r!==void 0&&!xe(r)||o!==void 0&&!xe(o)||r!==void 0&&o!==void 0&&r>o||i!==void 0&&typeof i!="boolean"?void 0:{...t,kind:"progress",phase:e.phase,...r===void 0?{}:{completed:r},...o===void 0?{}:{total:o},...i===void 0?{}:{resumable:i}}}case "failed":return O(e,["v","kind","runId","generation","code","recoverable"],[])&&B(e.code)&&typeof e.recoverable=="boolean"?{...t,kind:"failed",code:e.code,recoverable:e.recoverable}:void 0;default:return}}function bn(n){let e=Le(n);if(!(e===void 0||!O(e,["v","kind","runId","generation","reason"],[])||e.v!==I||e.kind!=="stop"||typeof e.runId!="string"||!de.test(e.runId)||!je(e.generation)||!pe.includes(e.reason)))return {v:I,kind:"stop",runId:e.runId,generation:e.generation,reason:e.reason}}function gn(n){let e=ve(n)?n:void 0;if(!(e===void 0||e.v!==I||!Wo(e.fd))){if(e.role==="control"){let t=e.operations;return !O(e,["v","role","fd","operations"],[])||!Array.isArray(t)||t.length===0||new Set(t).size!==t.length||!t.every($)?void 0:{v:1,role:"control",fd:e.fd,operations:[...t]}}if(e.role==="run")return !O(e,["v","role","fd","runId","generation"],[])||typeof e.runId!="string"||!de.test(e.runId)||!je(e.generation)?void 0:{v:1,role:"run",fd:e.fd,runId:e.runId,generation:e.generation}}}function hn(n){let e=n[At];if(typeof e!="string"||V(e)>An)return;let t;try{t=JSON.parse(e);}catch{return}return gn(t)}function Vo(n){let e=gn(JSON.parse(JSON.stringify(n)));if(e===void 0)throw new TypeError("App job channel descriptor is invalid");let t=JSON.stringify(e);if(V(t)>An)throw new TypeError("App job channel descriptor is over its bound");return Object.freeze({CREWX_APP_JOB_CHANNEL:t})}function Xo(n){return n==="schedule"?"schedule":"manual"}function Go(n){return De(n)}function De(n){let e=ve(n)?n:void 0;if(e===void 0||!O(e,["handle","state","stopReason","trigger","outcome","phase","completed","total","resumable","lastHeartbeatAt","startedAt","finishedAt","errorCode","recoverable"],[]))return;let t=cn(e.handle),r=e.stopReason,o=e.outcome,i=e.phase,s=e.errorCode,a=e.recoverable;if(!(t===void 0||!qe.includes(e.state)||!(r===null||pe.includes(r))||r!==null&&e.state!=="stopping"||!Xe.includes(e.trigger)||!(o===null||Ve.includes(o))||!(i===null||U(i))||!(e.completed===null||xe(e.completed))||!(e.total===null||xe(e.total))||typeof e.resumable!="boolean"||!yt(e.lastHeartbeatAt)||!ht(e.startedAt)||!yt(e.finishedAt)||!(s===null||B(s))||!(a===null||typeof a=="boolean")))return {handle:t,state:e.state,stopReason:r,trigger:e.trigger,outcome:o,phase:i,completed:e.completed,total:e.total,resumable:e.resumable,lastHeartbeatAt:e.lastHeartbeatAt,startedAt:e.startedAt,finishedAt:e.finishedAt,errorCode:s,recoverable:a}}function cn(n){if(!(!ve(n)||!O(n,["runId","generation"],[]))&&!(typeof n.runId!="string"||!de.test(n.runId)||!je(n.generation)))return {runId:n.runId,generation:n.generation}}function Le(n){if(V(n)>se)return;let e;try{e=JSON.parse(n);}catch{return}return ve(e)?e:void 0}function O(n,e,t){let r=new Set([...e,...t]);return Object.keys(n).every(o=>r.has(o))&&e.every(o=>Object.hasOwn(n,o))}function ve(n){if(n===null||typeof n!="object"||Array.isArray(n))return false;let e=Object.getPrototypeOf(n);return e===Object.prototype||e===null}function bt(n){return typeof n=="string"&&de.test(n)}function gt(n){return Number.isSafeInteger(n)&&n>=1&&n<=mt}function je(n){return Number.isSafeInteger(n)&&n>=1&&n<=mt}function Wo(n){return Number.isSafeInteger(n)&&n>=pn.min&&n<=pn.max}function xe(n){return Number.isSafeInteger(n)&&n>=0}function ht(n){return typeof n=="string"&&n.length>0&&n.length<=Uo}function yt(n){return n===null||ht(n)}function V(n){return new TextEncoder().encode(n).byteLength}var Ko=2147483647,X=class{#e;#n;#l;#y=randomUUID();#A=new ae;#o=new Map;#s=new Set;#t;#p=0;#r=false;#c=false;#a=false;#d=null;constructor(e){this.#e=e.channel,this.#n=e.open??Et,this.#l=e.replyTimeoutMs??fn;}jobsFor(e){let t=this.#e;if(t.role!=="control"||e===void 0)return;let r=t.operations,o=ce.filter(s=>e.includes(s)&&r.includes(s));if(o.length===0)return;let i=s=>{if(!o.includes(s))throw new f("APP_JOB_NOT_GRANTED",null,{outcome:"rejected"})};return Object.freeze({granted:Object.freeze(o),start:async()=>{i("start");let s=await this.#u("start",{});if(s.ok===false)return {kind:"refused",code:s.code};if(s.op!=="start")throw new f("APP_JOB_BRIDGE_INVALID",null,{outcome:"failed"});return {kind:s.outcome,job:s.job}},status:async s=>{i("status");let a=await this.#u("status",s===void 0?{}:{handle:s});if(a.ok===false)return {kind:"refused",code:a.code};if(a.op!=="status")throw new f("APP_JOB_BRIDGE_INVALID",null,{outcome:"failed"});return {kind:"status",job:a.job}},cancel:async s=>{i("cancel");let a=await this.#u("cancel",{handle:s});if(a.ok===false)return {kind:"refused",code:a.code};if(a.op!=="cancel")throw new f("APP_JOB_BRIDGE_INVALID",null,{outcome:"failed"});return {kind:"stopping",job:a.job}}})}runFor(e){let t=this.#e;if(t.role!=="run"||!e)return;try{this.#f();}catch{return}let r={v:I,runId:t.runId,generation:t.generation},o=()=>this.#d,i=s=>{this.#r||this.#c||this.#t===void 0||this.#t.write(Fe({...r,...s}));};return Object.freeze({handle:Object.freeze({runId:t.runId,generation:t.generation}),get stopRequested(){return o()!==null},get stopReason(){return o()},progress:s=>{if(!U(s.phase))throw new TypeError("progress phase must be a lower snake case name");if(s.completed!==void 0&&!_t(s.completed))throw new TypeError("progress completed must be a count");if(s.total!==void 0&&!_t(s.total))throw new TypeError("progress total must be a count");if(s.completed!==void 0&&s.total!==void 0&&s.completed>s.total)throw new TypeError("progress completed cannot exceed total");if(s.resumable!==void 0&&typeof s.resumable!="boolean")throw new TypeError("progress resumable must be boolean");this.#a||i({kind:"progress",phase:s.phase,...s.completed===void 0?{}:{completed:s.completed},...s.total===void 0?{}:{total:s.total},...s.resumable===void 0?{}:{resumable:s.resumable}});},heartbeat:()=>{this.#a||i({kind:"heartbeat"});},complete:()=>{i({kind:"completed"}),this.#a=true;},fail:(s,a)=>{if(!B(s))throw new TypeError("fail code must be an upper snake case code");if(typeof a!="boolean")throw new TypeError("fail recoverable must be boolean");i({kind:"failed",code:s,recoverable:a}),this.#a=true;},onStop:s=>{let a=o();return a!==null?(s(a),()=>{}):(this.#s.add(s),()=>{this.#s.delete(s);})}})}close(){this.#i("APP_JOB_BRIDGE_CLOSED");}async drain(e=yn){if(this.#r)return;this.#c=true;let t=this.#t,r;try{if(t!==void 0){let o;try{o=t.drain();}catch{o=Promise.resolve();}await Promise.race([o.catch(()=>{}),new Promise(i=>{r=setTimeout(i,e);})]);}}finally{clearTimeout(r),this.close();}}#u(e,t){let r=this.#f(),o=this.#p+1;if(o>Ko)throw new f("APP_JOB_BRIDGE_CLOSED",null,{outcome:"failed"});this.#p=o;let i=`${this.#y}.${o}`,s=Fe({v:I,op:e,requestId:i,seq:o,...t});return new Promise((a,d)=>{let p=setTimeout(()=>this.#i("APP_JOB_BRIDGE_TIMEOUT"),this.#l);this.#o.set(o,{op:e,requestId:i,resolve:a,reject:d,timer:p}),r.write(s);})}#f(){if(this.#r)throw new f("APP_JOB_BRIDGE_CLOSED",null,{outcome:"failed"});if(this.#t!==void 0)return this.#t;let e;try{e=this.#n(this.#e.fd);}catch{throw new f("APP_JOB_BRIDGE_UNAVAILABLE",null,{outcome:"failed"})}return e.onData(t=>this.#m(t)),e.onEnd(()=>this.#i("APP_JOB_BRIDGE_CLOSED")),this.#t=e,e}#m(e){for(let t of this.#A.push(e)){if(this.#r)return;if(this.#e.role==="run")t.kind==="line"&&this.#g(t.line);else if(t.kind==="oversized"){this.#i("APP_JOB_BRIDGE_INVALID");return}else this.#b(t.line);}}#b(e){let t=mn(e),r=t===void 0?void 0:this.#o.get(t.seq);if(t===void 0||r===void 0||r.requestId!==t.requestId||t.ok&&t.op!==r.op){this.#i("APP_JOB_BRIDGE_INVALID");return}clearTimeout(r.timer),this.#o.delete(t.seq),r.resolve(t);}#g(e){let t=this.#e;if(t.role!=="run")return;let r=bn(e);if(!(r===void 0||r.runId!==t.runId||r.generation!==t.generation)&&this.#d===null){this.#d=r.reason;for(let o of [...this.#s])try{o(r.reason);}catch{}}}#i(e){if(this.#r)return;this.#r=true;let t=[...this.#o.values()];this.#o.clear();for(let o of t)clearTimeout(o.timer),o.reject(new f(e,null,{outcome:"failed"}));this.#s.clear();let r=this.#t;this.#t=void 0,r?.close();}};function Et(n){let e=new Socket({fd:n,readable:true,writable:true});return e.setEncoding("utf8"),e.on("error",()=>{}),{write:t=>{e.write(`${t}
|
|
5
|
-
`);},drain:()=>new Promise(t=>{if(e.destroyed){t();return}e.write("",()=>t());}),onData:t=>{e.on("data",t);},onEnd:t=>{e.on("close",t);},close:()=>{e.destroy();}}}function _t(n){return Number.isSafeInteger(n)&&n>=0}var Zo=1;async function Qo(n,e,t=process.env.CREWX_WORKSPACE_ROOT??process.cwd(),r){return (await St(n,e,t,void 0,true,void 0,r)).response}async function St(n,e,t,r,o=true,i,s,a){let d=i!==void 0,p=
|
|
6
|
-
`;}catch(l){p("EXECUTION_FAILED",l);let b=
|
|
4
|
+
`);if(o===-1)return this.#n||(this.#e+=r,V(this.#e)>se&&(t.push({kind:"oversized"}),this.#e="",this.#n=true)),t;let i=r.slice(0,o);if(r=r.slice(o+1),this.#n){this.#n=false;continue}let s=this.#e+i;this.#e="",t.push(V(s)>se?{kind:"oversized"}:{kind:"line",line:s});}}};function Fe(n){let e=JSON.stringify(n);if(V(e)>se)throw new TypeError("App job bridge message is over the line bound");return e}function Ho(n){let e=Le(n);if(e===void 0||e.v!==I||!bt(e.requestId)||!ht(e.seq))return;let t={v:I,requestId:e.requestId,seq:e.seq};switch(e.op){case "start":return w(e,["v","op","requestId","seq"],[])?{...t,op:"start"}:void 0;case "status":{if(!w(e,["v","op","requestId","seq"],["handle"]))return;if(e.handle===void 0)return {...t,op:"status"};let r=cn(e.handle);return r===void 0?void 0:{...t,op:"status",handle:r}}case "cancel":{if(!w(e,["v","op","requestId","seq","handle"],[]))return;let r=cn(e.handle);return r===void 0?void 0:{...t,op:"cancel",handle:r}}default:return}}function mn(n){let e=Le(n);if(e===void 0||e.v!==I||!bt(e.requestId)||!ht(e.seq))return;let t={v:I,requestId:e.requestId,seq:e.seq};if(e.ok===false)return w(e,["v","requestId","seq","ok","code"],[])&&Ge.includes(e.code)?{...t,ok:false,code:e.code}:void 0;if(e.ok===true)switch(e.op){case "start":{if(!w(e,["v","requestId","seq","ok","op","outcome","job"],[]))return;let r=De(e.job),o=e.outcome;return r===void 0||o!=="started"&&o!=="attached"?void 0:{...t,ok:true,op:"start",outcome:o,job:r}}case "status":{if(!w(e,["v","requestId","seq","ok","op","job"],[]))return;if(e.job===null)return {...t,ok:true,op:"status",job:null};let r=De(e.job);return r===void 0?void 0:{...t,ok:true,op:"status",job:r}}case "cancel":{if(!w(e,["v","requestId","seq","ok","op","outcome","job"],[]))return;let r=De(e.job);return r===void 0||e.outcome!=="stopping"?void 0:{...t,ok:true,op:"cancel",outcome:"stopping",job:r}}default:return}}function qo(n){let e=Le(n);if(e===void 0||e.v!==I||typeof e.runId!="string"||!de.test(e.runId)||!je(e.generation))return;let t={v:I,runId:e.runId,generation:e.generation};switch(e.kind){case "heartbeat":return w(e,["v","kind","runId","generation"],[])?{...t,kind:"heartbeat"}:void 0;case "completed":return w(e,["v","kind","runId","generation"],[])?{...t,kind:"completed"}:void 0;case "progress":{if(!w(e,["v","kind","runId","generation","phase"],["completed","total","resumable"]))return;let{completed:r,total:o,resumable:i}=e;return !U(e.phase)||r!==void 0&&!xe(r)||o!==void 0&&!xe(o)||r!==void 0&&o!==void 0&&r>o||i!==void 0&&typeof i!="boolean"?void 0:{...t,kind:"progress",phase:e.phase,...r===void 0?{}:{completed:r},...o===void 0?{}:{total:o},...i===void 0?{}:{resumable:i}}}case "failed":return w(e,["v","kind","runId","generation","code","recoverable"],[])&&B(e.code)&&typeof e.recoverable=="boolean"?{...t,kind:"failed",code:e.code,recoverable:e.recoverable}:void 0;default:return}}function bn(n){let e=Le(n);if(!(e===void 0||!w(e,["v","kind","runId","generation","reason"],[])||e.v!==I||e.kind!=="stop"||typeof e.runId!="string"||!de.test(e.runId)||!je(e.generation)||!pe.includes(e.reason)))return {v:I,kind:"stop",runId:e.runId,generation:e.generation,reason:e.reason}}function hn(n){let e=ve(n)?n:void 0;if(!(e===void 0||e.v!==I||!Wo(e.fd))){if(e.role==="control"){let t=e.operations;return !w(e,["v","role","fd","operations"],[])||!Array.isArray(t)||t.length===0||new Set(t).size!==t.length||!t.every($)?void 0:{v:1,role:"control",fd:e.fd,operations:[...t]}}if(e.role==="run")return !w(e,["v","role","fd","runId","generation"],[])||typeof e.runId!="string"||!de.test(e.runId)||!je(e.generation)?void 0:{v:1,role:"run",fd:e.fd,runId:e.runId,generation:e.generation}}}function gn(n){let e=n[At];if(typeof e!="string"||V(e)>An)return;let t;try{t=JSON.parse(e);}catch{return}return hn(t)}function Vo(n){let e=hn(JSON.parse(JSON.stringify(n)));if(e===void 0)throw new TypeError("App job channel descriptor is invalid");let t=JSON.stringify(e);if(V(t)>An)throw new TypeError("App job channel descriptor is over its bound");return Object.freeze({CREWX_APP_JOB_CHANNEL:t})}function Xo(n){return n==="schedule"?"schedule":"manual"}function Go(n){return De(n)}function De(n){let e=ve(n)?n:void 0;if(e===void 0||!w(e,["handle","state","stopReason","trigger","outcome","phase","completed","total","resumable","lastHeartbeatAt","startedAt","finishedAt","errorCode","recoverable"],[]))return;let t=cn(e.handle),r=e.stopReason,o=e.outcome,i=e.phase,s=e.errorCode,a=e.recoverable;if(!(t===void 0||!qe.includes(e.state)||!(r===null||pe.includes(r))||r!==null&&e.state!=="stopping"||!Xe.includes(e.trigger)||!(o===null||Ve.includes(o))||!(i===null||U(i))||!(e.completed===null||xe(e.completed))||!(e.total===null||xe(e.total))||typeof e.resumable!="boolean"||!yt(e.lastHeartbeatAt)||!gt(e.startedAt)||!yt(e.finishedAt)||!(s===null||B(s))||!(a===null||typeof a=="boolean")))return {handle:t,state:e.state,stopReason:r,trigger:e.trigger,outcome:o,phase:i,completed:e.completed,total:e.total,resumable:e.resumable,lastHeartbeatAt:e.lastHeartbeatAt,startedAt:e.startedAt,finishedAt:e.finishedAt,errorCode:s,recoverable:a}}function cn(n){if(!(!ve(n)||!w(n,["runId","generation"],[]))&&!(typeof n.runId!="string"||!de.test(n.runId)||!je(n.generation)))return {runId:n.runId,generation:n.generation}}function Le(n){if(V(n)>se)return;let e;try{e=JSON.parse(n);}catch{return}return ve(e)?e:void 0}function w(n,e,t){let r=new Set([...e,...t]);return Object.keys(n).every(o=>r.has(o))&&e.every(o=>Object.hasOwn(n,o))}function ve(n){if(n===null||typeof n!="object"||Array.isArray(n))return false;let e=Object.getPrototypeOf(n);return e===Object.prototype||e===null}function bt(n){return typeof n=="string"&&de.test(n)}function ht(n){return Number.isSafeInteger(n)&&n>=1&&n<=mt}function je(n){return Number.isSafeInteger(n)&&n>=1&&n<=mt}function Wo(n){return Number.isSafeInteger(n)&&n>=pn.min&&n<=pn.max}function xe(n){return Number.isSafeInteger(n)&&n>=0}function gt(n){return typeof n=="string"&&n.length>0&&n.length<=Uo}function yt(n){return n===null||gt(n)}function V(n){return new TextEncoder().encode(n).byteLength}var Ko=2147483647,X=class{#e;#n;#l;#y=randomUUID();#A=new ae;#o=new Map;#s=new Set;#t;#p=0;#r=false;#c=false;#a=false;#d=null;constructor(e){this.#e=e.channel,this.#n=e.open??Et,this.#l=e.replyTimeoutMs??fn;}jobsFor(e){let t=this.#e;if(t.role!=="control"||e===void 0)return;let r=t.operations,o=ce.filter(s=>e.includes(s)&&r.includes(s));if(o.length===0)return;let i=s=>{if(!o.includes(s))throw new c("APP_JOB_NOT_GRANTED",null,{outcome:"rejected"})};return Object.freeze({granted:Object.freeze(o),start:async()=>{i("start");let s=await this.#u("start",{});if(s.ok===false)return {kind:"refused",code:s.code};if(s.op!=="start")throw new c("APP_JOB_BRIDGE_INVALID",null,{outcome:"failed"});return {kind:s.outcome,job:s.job}},status:async s=>{i("status");let a=await this.#u("status",s===void 0?{}:{handle:s});if(a.ok===false)return {kind:"refused",code:a.code};if(a.op!=="status")throw new c("APP_JOB_BRIDGE_INVALID",null,{outcome:"failed"});return {kind:"status",job:a.job}},cancel:async s=>{i("cancel");let a=await this.#u("cancel",{handle:s});if(a.ok===false)return {kind:"refused",code:a.code};if(a.op!=="cancel")throw new c("APP_JOB_BRIDGE_INVALID",null,{outcome:"failed"});return {kind:"stopping",job:a.job}}})}runFor(e){let t=this.#e;if(t.role!=="run"||!e)return;try{this.#f();}catch{return}let r={v:I,runId:t.runId,generation:t.generation},o=()=>this.#d,i=s=>{this.#r||this.#c||this.#t===void 0||this.#t.write(Fe({...r,...s}));};return Object.freeze({handle:Object.freeze({runId:t.runId,generation:t.generation}),get stopRequested(){return o()!==null},get stopReason(){return o()},progress:s=>{if(!U(s.phase))throw new TypeError("progress phase must be a lower snake case name");if(s.completed!==void 0&&!_t(s.completed))throw new TypeError("progress completed must be a count");if(s.total!==void 0&&!_t(s.total))throw new TypeError("progress total must be a count");if(s.completed!==void 0&&s.total!==void 0&&s.completed>s.total)throw new TypeError("progress completed cannot exceed total");if(s.resumable!==void 0&&typeof s.resumable!="boolean")throw new TypeError("progress resumable must be boolean");this.#a||i({kind:"progress",phase:s.phase,...s.completed===void 0?{}:{completed:s.completed},...s.total===void 0?{}:{total:s.total},...s.resumable===void 0?{}:{resumable:s.resumable}});},heartbeat:()=>{this.#a||i({kind:"heartbeat"});},complete:()=>{i({kind:"completed"}),this.#a=true;},fail:(s,a)=>{if(!B(s))throw new TypeError("fail code must be an upper snake case code");if(typeof a!="boolean")throw new TypeError("fail recoverable must be boolean");i({kind:"failed",code:s,recoverable:a}),this.#a=true;},onStop:s=>{let a=o();return a!==null?(s(a),()=>{}):(this.#s.add(s),()=>{this.#s.delete(s);})}})}close(){this.#i("APP_JOB_BRIDGE_CLOSED");}async drain(e=yn){if(this.#r)return;this.#c=true;let t=this.#t,r;try{if(t!==void 0){let o;try{o=t.drain();}catch{o=Promise.resolve();}await Promise.race([o.catch(()=>{}),new Promise(i=>{r=setTimeout(i,e);})]);}}finally{clearTimeout(r),this.close();}}#u(e,t){let r=this.#f(),o=this.#p+1;if(o>Ko)throw new c("APP_JOB_BRIDGE_CLOSED",null,{outcome:"failed"});this.#p=o;let i=`${this.#y}.${o}`,s=Fe({v:I,op:e,requestId:i,seq:o,...t});return new Promise((a,d)=>{let p=setTimeout(()=>this.#i("APP_JOB_BRIDGE_TIMEOUT"),this.#l);this.#o.set(o,{op:e,requestId:i,resolve:a,reject:d,timer:p}),r.write(s);})}#f(){if(this.#r)throw new c("APP_JOB_BRIDGE_CLOSED",null,{outcome:"failed"});if(this.#t!==void 0)return this.#t;let e;try{e=this.#n(this.#e.fd);}catch{throw new c("APP_JOB_BRIDGE_UNAVAILABLE",null,{outcome:"failed"})}return e.onData(t=>this.#m(t)),e.onEnd(()=>this.#i("APP_JOB_BRIDGE_CLOSED")),this.#t=e,e}#m(e){for(let t of this.#A.push(e)){if(this.#r)return;if(this.#e.role==="run")t.kind==="line"&&this.#h(t.line);else if(t.kind==="oversized"){this.#i("APP_JOB_BRIDGE_INVALID");return}else this.#b(t.line);}}#b(e){let t=mn(e),r=t===void 0?void 0:this.#o.get(t.seq);if(t===void 0||r===void 0||r.requestId!==t.requestId||t.ok&&t.op!==r.op){this.#i("APP_JOB_BRIDGE_INVALID");return}clearTimeout(r.timer),this.#o.delete(t.seq),r.resolve(t);}#h(e){let t=this.#e;if(t.role!=="run")return;let r=bn(e);if(!(r===void 0||r.runId!==t.runId||r.generation!==t.generation)&&this.#d===null){this.#d=r.reason;for(let o of [...this.#s])try{o(r.reason);}catch{}}}#i(e){if(this.#r)return;this.#r=true;let t=[...this.#o.values()];this.#o.clear();for(let o of t)clearTimeout(o.timer),o.reject(new c(e,null,{outcome:"failed"}));this.#s.clear();let r=this.#t;this.#t=void 0,r?.close();}};function Et(n){let e=new Socket({fd:n,readable:true,writable:true});return e.setEncoding("utf8"),e.on("error",()=>{}),{write:t=>{e.write(`${t}
|
|
5
|
+
`);},drain:()=>new Promise(t=>{if(e.destroyed){t();return}e.write("",()=>t());}),onData:t=>{e.on("data",t);},onEnd:t=>{e.on("close",t);},close:()=>{e.destroy();}}}function _t(n){return Number.isSafeInteger(n)&&n>=0}var Zo=1;async function Qo(n,e,t=process.env.CREWX_WORKSPACE_ROOT??process.cwd(),r){return (await St(n,e,t,void 0,true,void 0,r)).response}async function St(n,e,t,r,o=true,i,s,a){let d=i!==void 0,p=O(e)?e:void 0,f=p?.input,y=p?.state,l=new n({state:O(y)?y:{},workspaceRoot:t,...s===void 0?{}:{context:s}}),b=O(f)?f:{},A=O(y)?y:l.emptyState(),m={},P=p!==void 0&&Object.hasOwn(p,"schedule"),T;try{let E;if(d){if(p===void 0||P)throw new c("INPUT_INVALID");let S=lt(p,i);if(pt(S))throw new c(S.code,null,{outcome:S.outcome});(({actionId:E,input:b,state:A}=S)),m=S.content;}else {let S=P&&p!==void 0?Cn(p.schedule):void 0;if(!p||Object.keys(p).length!==(P?5:4)||!["schemaVersion","actionId","input","state"].every(It=>Object.hasOwn(p,It))||p.schemaVersion!==Zo||typeof p.actionId!="string"||!O(f)||!O(y)||P&&S===void 0)throw new c("INPUT_INVALID");E=p.actionId,b=f,A=y,T=S;}let h=Y(n).find(({options:S})=>S.name===E);if(h?.options.viewCall===!0)throw new c("VIEW_CALL_SCREEN_ONLY","This action can only be called through the visible App screen.");let D=h===void 0?void 0:a?.jobsFor(h.options.jobAccess),C=h===void 0?void 0:a?.runFor(h.options.job!==void 0);if(l=new n({state:A,workspaceRoot:t,...s===void 0?{}:{context:s},...T===void 0?{}:{schedule:T},...D===void 0?{}:{jobs:D},...C===void 0?{}:{jobRun:C}}),await l.validate(E,b,A),!h)throw new c("INPUT_INVALID");if(T!==void 0&&(h.options.content!==void 0||!Dn(n)))throw new c("INPUT_INVALID");let G=l[h.methodName];if(typeof G!="function")throw new c("EXECUTION_FAILED");let L=ct(h.options.content,m);if(L)throw new c(L.code,null,{outcome:L.outcome});if(h.options.job!==void 0&&C===void 0)throw new c(We,null,{outcome:"rejected"});let ue=Object.freeze({...m.in===void 0?{}:{in:Object.freeze({text:m.in.text})},...m.out===void 0?{}:{out:Object.freeze(m.out.range===void 0?{}:{range:Object.freeze({...m.out.range})})}}),W=()=>G.call(l,b,ue),k=o?await ri(W):await W();if(k!==void 0&&!O(k))throw new c("EXECUTION_FAILED");let N;if(m.out!==void 0){if(N=l.producedContent,N===void 0)throw new c("EXECUTION_FAILED","content.out was requested but setContent was never called");let S=ft(N);if(S)throw new c(S.code,null,{outcome:S.outcome})}else if(l.didSetContent)throw new c("EXECUTION_FAILED","setContent was called but the request asked for no content.out");let On=l.didRequestSchedule;return {response:{...l.didSetState?{state:l.state}:{},...k===void 0?{}:{result:k},...On===void 0?{}:{schedule:{enabled:On.enabled}}},...N===void 0?{}:{answer:N}}}catch(E){let h,D=E,C=E instanceof c?E:void 0;if(C)h={code:C.code,detail:C.detail,outcome:C.outcome};else try{h=l.mapError(E);}catch(N){h={code:"EXECUTION_FAILED",detail:null},D=N;}let G=ii(h?.code),L=G?h.code:"EXECUTION_FAILED",ue=typeof h?.detail=="string"?h.detail:null,W=G?Ke(h.outcome):"failed",k;try{k=l.errorState(L,ue,{input:b,state:A});}catch(N){D=new AggregateError([D,N],"App error handling failed"),k=l.emptyState();}return r?.(L,D,{outcome:W,detail:ue,expected:C!==void 0&&D===C}),{response:{outcome:W,errorCode:L,state:O(k)?k:l.emptyState()}}}}async function ei(n,e={}){let t=ni(e.jobBridge);try{await ti(n,e,t);}finally{await t?.drain();}}function ni(n){if(n===null)return;if(n!==void 0)return new X(n);let e=gn(process.env);return e===void 0?void 0:new X({channel:e})}async function ti(n,e,t){let r=e.output??process.stdout,o,i;if(e.preloadedInput!==void 0)o=e.preloadedInput.value,i=e.preloadedInput.body;else {let l=Ne(e.inputFd??0);l.kind==="v1"?o=l.value:l.kind==="v2"&&(o=l.header,i=l.body);}let s=i!==void 0,a=e.context??Ye(),d=false,p=(l,b,A)=>{d=true,e.onFailure?.(l,b,A);},f;try{f=await St(n,o,process.env.CREWX_WORKSPACE_ROOT??process.cwd(),p,e.consoleManaged!==!0,i,a,t);}catch(l){p("EXECUTION_FAILED",l),f={response:wt(e.emptyState)};}oi(f.response)&&!d&&p(f.response.errorCode,void 0,{outcome:f.response.outcome,detail:null,expected:false});let y;try{let l=(e.sanitize??Ot)(f.response);y=s?Je(l,f.answer):`${JSON.stringify(l)}
|
|
6
|
+
`;}catch(l){p("EXECUTION_FAILED",l);let b=wt(e.emptyState);try{let A=(e.sanitize??Ot)(b);y=s?Je(A):`${JSON.stringify(A)}
|
|
7
7
|
`;}catch(A){p("EXECUTION_FAILED",A),y=s?Je(b):`${JSON.stringify(b)}
|
|
8
8
|
`;}}r.write(y);}async function ri(n){let e=["log","info","debug"],t=new Map;for(let r of e)t.set(r,console[r]),console[r]=(...o)=>process.stderr.write(`${format(...o)}
|
|
9
|
-
`);try{return await n()}finally{for(let r of e)console[r]=t.get(r);}}function
|
|
9
|
+
`);try{return await n()}finally{for(let r of e)console[r]=t.get(r);}}function wt(n={}){return {outcome:"failed",errorCode:"EXECUTION_FAILED",state:{...n,error:{code:"EXECUTION_FAILED",detail:null}}}}function oi(n){return (n.outcome==="failed"||n.outcome==="rejected")&&typeof n.errorCode=="string"}function ii(n){return typeof n=="string"&&/^[A-Z][A-Z0-9_]{0,127}$/u.test(n)}function Ot(n){return n}var _n={depth:null,maxArrayLength:null,maxStringLength:null},wn=class extends Writable{#e="buffer";#n=[];_write(e,t,r){if(this.#e==="buffer"){this.#n.push(typeof e=="string"?e:Uint8Array.from(e)),r();return}if(this.#e==="discard"){r();return}process.stderr.write(e,r);}flushToStderr(){this.#e="stderr";for(let e of this.#n)process.stderr.write(e);this.#n=[];}discard(){this.#e="discard",this.#n=[];}};async function di(n,e={}){let t=process.stdout,r=t.write.bind(t),o=new wn,i=new Console({stdout:o,stderr:o,inspectOptions:{..._n}});globalThis.console=i;let s=false,a="-",d="-",p,f=false,y,l;try{let m=li(e.inputFd??0);a=pi(m.value),d=Me(process.env.CREWX_APP_REQUEST_ID),p=new Date().toISOString();try{y=await n();}catch(E){f=!0,l=E;}let P=y?.default;if(!f&&P?.devtools?.log===!0?(Object.assign(inspect.defaultOptions,_n),b(p),o.flushToStderr()):o.discard(),f){A("EXECUTION_FAILED",l),En(r,e,A);return}try{if(typeof y?.runSkillApp!="function")throw new TypeError("App module does not export runSkillApp");let E={sanitize:e.sanitize,emptyState:e.emptyState??ui(P),preloadedInput:m.body===void 0?{value:m.value}:{value:m.value,body:m.body},onFailure:A,consoleManaged:!0,output:{write:r},jobBridge:e.jobBridge};await y.runSkillApp(P,E);}catch(E){A("EXECUTION_FAILED",E),En(r,e,A);}}catch(m){A("EXECUTION_FAILED",m),En(r,e,A);}finally{process.exitCode=0;}function b(m){s||(process.stderr.write(`[crewx-app] ${m??new Date().toISOString()} ${Me(a)} req=${d}
|
|
10
10
|
`),s=true);}function A(m,P,T){b();let E=T?.expected===true&&T.detail?` ${Me(T.detail)}`:"";process.stderr.write(`[crewx-app] ${T?.outcome??"failed"} ${Me(m)}${E}
|
|
11
11
|
`),P!==void 0&&T?.expected!==true&&process.stderr.write(`${inspect(P,_n)}
|
|
12
12
|
`);}}function ui(n){if(typeof n=="function")try{let t=new n({workspaceRoot:process.cwd()}).emptyState();return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:void 0}catch{return}}function li(n){let e=Ne(n);return e.kind==="v1"?{value:e.value}:e.kind==="v2"?{value:e.header,body:e.body}:{value:void 0}}function pi(n){return n!==null&&typeof n=="object"&&!Array.isArray(n)&&typeof n.actionId=="string"?n.actionId:"-"}function Me(n){return typeof n!="string"||n.length===0?"-":n.replace(/[\u0000-\u001f\u007f\u2028\u2029]/gu,"_")}function En(n,e,t){let r={code:"EXECUTION_FAILED",detail:null},i={outcome:"failed",errorCode:"EXECUTION_FAILED",state:e.emptyState!==null&&typeof e.emptyState=="object"&&!Array.isArray(e.emptyState)?{...e.emptyState,error:r}:{error:r}},s=i;try{s=(e.sanitize??ci)(i);}catch(a){t("EXECUTION_FAILED",a);}n(`${JSON.stringify(s)}
|
|
13
|
-
`);}function ci(n){return n}export{vn as APP_FILES_ERROR_CODES,R as APP_FILES_LIMITS,Ae as APP_FILES_LOCK_SUBPATH,at as APP_FILES_ROOT_ENV,An as APP_JOB_BRIDGE_CHANNEL_MAX_BYTES,yn as APP_JOB_BRIDGE_DRAIN_TIMEOUT_MS,At as APP_JOB_BRIDGE_ENV,Bo as APP_JOB_BRIDGE_ERROR_CODES,pn as APP_JOB_BRIDGE_FD,se as APP_JOB_BRIDGE_MAX_LINE_BYTES,fn as APP_JOB_BRIDGE_REPLY_TIMEOUT_MS,I as APP_JOB_BRIDGE_VERSION,kn as APP_JOB_CAPABILITY,Nn as APP_JOB_CAPABILITY_VERSION,M as APP_JOB_DEADLINE_MS,vt as APP_JOB_MAX_PER_APP,ce as APP_JOB_OPERATIONS,Ve as APP_JOB_OUTCOMES,Ge as APP_JOB_REFUSAL_CODES,We as APP_JOB_RUN_REQUIRED,qe as APP_JOB_STATES,Lt as APP_JOB_STOP_GRACE_MS,pe as APP_JOB_STOP_REASONS,Xe as APP_JOB_TRIGGERS,Tt as APP_SCHEDULE_ACTOR_KIND,Ct as APP_SCHEDULE_INERT_COMMAND,Ue as APP_SCHEDULE_INSTANCE_PREFIX,z as APP_SCHEDULE_INTERVALS_MINUTES,Pt as APP_SCHEDULE_MAX_PER_APP,Rn as APP_SCHEDULE_PERIODIC_REASONS,j as APP_SCHEDULE_TIMEOUT_MS,er as APP_TOOLS_FILE,nr as APP_TOOLS_SCHEMA_VERSION,tr as APP_TOOL_ENTRY,
|
|
13
|
+
`);}function ci(n){return n}export{vn as APP_FILES_ERROR_CODES,R as APP_FILES_LIMITS,Ae as APP_FILES_LOCK_SUBPATH,at as APP_FILES_ROOT_ENV,An as APP_JOB_BRIDGE_CHANNEL_MAX_BYTES,yn as APP_JOB_BRIDGE_DRAIN_TIMEOUT_MS,At as APP_JOB_BRIDGE_ENV,Bo as APP_JOB_BRIDGE_ERROR_CODES,pn as APP_JOB_BRIDGE_FD,se as APP_JOB_BRIDGE_MAX_LINE_BYTES,fn as APP_JOB_BRIDGE_REPLY_TIMEOUT_MS,I as APP_JOB_BRIDGE_VERSION,kn as APP_JOB_CAPABILITY,Nn as APP_JOB_CAPABILITY_VERSION,M as APP_JOB_DEADLINE_MS,vt as APP_JOB_MAX_PER_APP,ce as APP_JOB_OPERATIONS,Ve as APP_JOB_OUTCOMES,Ge as APP_JOB_REFUSAL_CODES,We as APP_JOB_RUN_REQUIRED,qe as APP_JOB_STATES,Lt as APP_JOB_STOP_GRACE_MS,pe as APP_JOB_STOP_REASONS,Xe as APP_JOB_TRIGGERS,Tt as APP_SCHEDULE_ACTOR_KIND,Ct as APP_SCHEDULE_INERT_COMMAND,Ue as APP_SCHEDULE_INSTANCE_PREFIX,z as APP_SCHEDULE_INTERVALS_MINUTES,Pt as APP_SCHEDULE_MAX_PER_APP,Rn as APP_SCHEDULE_PERIODIC_REASONS,j as APP_SCHEDULE_TIMEOUT_MS,er as APP_TOOLS_FILE,nr as APP_TOOLS_SCHEMA_VERSION,tr as APP_TOOL_ENTRY,c as AppError,u as AppFilesError,X as AppJobBridge,ae as AppJobLineReader,$e as CrewXApp,kt as SCHEDULE_TRIGGERS,Ln as SKILL_BACKEND_ENV_NAMES,Ht as Tool,me as acquireFileLock,Eo as appFiles,on as appFilesLockKeyOf,ge as appFilesRootSegmentsOf,Xo as appJobTriggerForActor,Vo as buildAppJobChannelEnvironment,Fe as encodeAppJobLine,Qo as executeAppRequest,qt as generateManifest,xn as generateToolDeclarations,Y as getToolDeclarations,Bt as hasAppJobCapability,B as isAppJobCode,ze as isAppJobDeadlineMs,$ as isAppJobOperation,U as isAppJobPhase,In as isAppScheduleCode,Pn as isAppScheduleIntervalMinutes,Tn as isAppSchedulePeriodicReason,He as isAppScheduleTimeoutMs,rr as isSkillBackendEnv,Z as normalizeAppFilesRef,Et as openInheritedAppJobTransport,hn as parseAppJobChannel,mn as parseAppJobControlReply,Ho as parseAppJobControlRequest,bn as parseAppJobRunPush,qo as parseAppJobRunReport,Go as parseAppJobView,Ye as readAppContext,gn as readAppJobChannel,be as releaseFileLock,di as runAppEntry,ei as runSkillApp};
|