@crewx/sdk 0.9.0-rc.179 → 0.9.0-rc.180
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-files/args.d.ts +12 -0
- package/dist/app/app-files/errors.d.ts +6 -0
- package/dist/app/app-files/index.d.ts +34 -0
- package/dist/app/app-files/lock.d.ts +26 -0
- package/dist/app/app-files/root.d.ts +22 -0
- package/dist/app/app-files/store.d.ts +47 -0
- package/dist/app/app-files/write.child.d.ts +1 -0
- package/dist/app/index.d.ts +2 -0
- package/dist/app/index.js +13 -12
- package/dist/app-ui/index.d.ts +17 -3
- package/dist/app-ui/index.js +1 -1
- package/dist/esm/app/index.js +13 -12
- package/dist/esm/index.js +274 -274
- package/dist/esm/plugins/index.js +108 -108
- package/dist/esm/publish/index.js +2 -2
- package/dist/esm/repository/index.js +159 -159
- package/dist/esm/skills/index.js +2 -2
- package/dist/index.js +271 -271
- package/dist/migrations/0046_acoustic_karnak.sql +49 -0
- package/dist/migrations/0047_doc_sync_connect_requests.sql +18 -0
- package/dist/migrations/meta/0046_snapshot.json +4733 -0
- package/dist/migrations/meta/0047_snapshot.json +4832 -0
- package/dist/migrations/meta/_journal.json +14 -0
- package/dist/plugins/index.js +108 -108
- package/dist/publish/index.js +2 -2
- package/dist/repository/index.d.ts +2 -0
- package/dist/repository/index.js +156 -156
- package/dist/schema/doc-sync-connect-requests.d.ts +140 -0
- package/dist/schema/doc-sync-links.d.ts +481 -0
- package/dist/schema/index.d.ts +2 -0
- package/dist/skills/index.js +2 -2
- package/dist/ui-plugin/app-manifest.d.ts +1 -1
- package/dist/ui-plugin/types.d.ts +1 -0
- package/package.json +1 -1
package/dist/esm/app/index.js
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
import {format,inspect}from'util';import {readSync}from'fs';import {randomUUID,createHash}from'crypto';import {Socket}from'net';import {Console}from'console';import {Writable}from'stream';var x=["text/plain","application/json"];var H=[5,15,30,60],k=Object.freeze({min:15e3,max:6e5,default:3e5}),En=1,be="schedule:",On="schedule",gn="exit 78",qe=["standby","disabled","draining","degraded"],Sn=["cron","cron_manual","app_enable"],Tn=/^[A-Z][A-Z0-9_]{0,63}$/u;function He(n){return typeof n=="string"&&Tn.test(n)}var Fe=["status","everyMinutes","lastStartedAt","lastFinishedAt","lastOutcome","lastErrorCode","nextRunAt","periodic","periodicReason"],Rn=["unset","on","off"],In=["available","unavailable"],Ae=64,Pn=128;function Xe(n){return H.includes(n)}function me(n){return Number.isSafeInteger(n)&&n>=k.min&&n<=k.max}function Ge(n){return qe.includes(n)}function Ve(n){if(!wn(n)||Object.keys(n).length!==Fe.length||!Fe.every(o=>Object.hasOwn(n,o))||typeof n.status!="string"||!Rn.includes(n.status)||!Xe(n.everyMinutes)||!Q(n.lastStartedAt,Ae)||!Q(n.lastFinishedAt,Ae)||!Q(n.lastOutcome,Pn)||!Q(n.nextRunAt,Ae)||n.lastErrorCode!==null&&!He(n.lastErrorCode)||typeof n.periodic!="string"||!In.includes(n.periodic))return;let t=n.periodic;if(!(t==="available"?n.periodicReason!==null:!Ge(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 Q(n,e){return n===null||typeof n=="string"&&n.length>0&&n.length<=e}function wn(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}),Cn=Object.freeze({min:1e3,max:12e4,default:3e4}),Jn=1,$e="crewx/appJobs",ze=1,_e=["starting","running","stopping","finished"],he=["succeeded","failed","timed_out","cancelled","shutdown","interrupted"],Z=["cancelled","timed_out","shutdown"],Ee=["manual","schedule"],Dn=/^[a-z][a-z0-9_]{0,63}$/u,Nn=/^[A-Z][A-Z0-9_]{0,63}$/u,ee=["start","status","cancel"],Oe=["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 Se(n){return Number.isSafeInteger(n)&&n>=j.min&&n<=j.max}function L(n){return typeof n=="string"&&Nn.test(n)}function B(n){return typeof n=="string"&&Dn.test(n)}function X(n){return ee.includes(n)}function xn(n){return n?.some(({name:e,version:t})=>e===$e&&t===ze)===true}var We=Symbol;We.metadata===void 0&&Object.defineProperty(Symbol,"metadata",{configurable:false,value:Symbol.for("Symbol.metadata")});var kn=We.metadata,G=Symbol.for("crewx.app.tool-metadata"),l=class extends Error{code;detail;outcome;constructor(e,t=null,o){super(e),this.name="AppError",this.code=e,this.detail=t,this.outcome=Re(o?.outcome);}};function Re(n){return n==="rejected"?"rejected":"failed"}var Te=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:Fn(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 l("SCHEDULE_UNSUPPORTED","this App has no schedule on this Host");let t=this.callContext?.actor;if(t==="schedule")throw new l("SCHEDULE_UNSUPPORTED","a scheduled run cannot change its own schedule",{outcome:"rejected"});if(e&&t!=="user")throw new l("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&&!Hn(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,o){}mapError(e){return {code:"EXECUTION_FAILED",detail:null}}errorState(e,t,o){return {...h(o.state)?o.state:{},error:{code:e,detail:t}}}};function jn(n){return function(e,t){if(t.static||t.private||t.kind!=="method")throw new TypeError("@Tool can decorate public instance methods only");let o=t.metadata;if(!o)throw new TypeError("standard decorator metadata is unavailable");let r=Object.hasOwn(o,G)?o[G]:[];if(r.some(u=>u.methodName===String(t.name)))throw new TypeError(`@Tool is declared more than once for ${String(t.name)}`);let s=n.content===void 0?void 0:Bn(n.name,n.content),i=n.schedule===void 0?void 0:Un(n);if(i!==void 0&&r.some(u=>u.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:vn(n);if(a!==void 0&&r.some(u=>u.options.job!==void 0))throw new TypeError(`@Tool ${n.name}: an App declares at most one job action`);let p=n.jobAccess===void 0?void 0:Mn(n);o[G]=[...r,{methodName:String(t.name),options:Object.freeze({...n,...s===void 0?{}:{content:s},...i===void 0?{}:{schedule:i},...a===void 0?{}:{job:a},...p===void 0?{}:{jobAccess:p}})}];}}function V(n){let e=n[kn],t=e&&Object.hasOwn(e,G)?e[G]:[],o=new Map(t.map(s=>[s.methodName,s])),r=Object.getOwnPropertyNames(n.prototype).map(s=>o.get(s)).filter(s=>s!==void 0);if(r.length!==t.length)throw new TypeError("a @Tool method is missing from the App prototype");return r}function Ke(n){return V(n).some(({options:e})=>e.schedule!==void 0)}function Ye(n){let e=n.definition,t=V(n),o=new Set;return t.map(({options:r})=>{if(o.has(r.name))throw new TypeError(`duplicate @Tool name: ${r.name}`);return o.add(r.name),{actionId:r.name,...r.dataInputs===void 0?{}:{dataInputs:[...r.dataInputs]},confirmation:r.confirmation??"none",capability:r.capability??"app.read",mutation:r.mutation??true,inputSchema:r.inputSchema,...r.content===void 0?{}:{content:qn(r.content)},...r.schedule===void 0?{}:{schedule:{...r.schedule}},...r.job===void 0?{}:{job:{...r.job}},...r.jobAccess===void 0?{}:{jobAccess:[...r.jobAccess]},resultProjection:r.resultProjection??{allow:[...e.stateProjection.allow]},_meta:{description:r.description}}})}function Ln(n,e){if(e.length===0)throw new TypeError("backendCommand must name the skill command");let t=Ye(n).map(({_meta:o,...r})=>({...r,backend:{type:"skill",command:[...e]},_meta:o}));return {...n.definition,actions:t}}function Bn(n,e){let t=s=>{throw new TypeError(`@Tool ${n}: content ${s}`)},o=(s,i,a)=>{if(!h(a))return t(`${s} must be an object`);for(let p of Object.keys(a))if(p==="mediaType"){if(!x.includes(a[p]))return t(`${s}.mediaType must be one of ${x.join(", ")}`)}else if(p===i){if(typeof a[p]!="boolean")return t(`${s}.${p} must be true or false`)}else return t(`${s} has the unknown key "${p}"`);return Object.hasOwn(a,"mediaType")?Object.freeze({...a}):t(`${s}.mediaType is required`)};if(!h(e))return t("must be an object");let r={};for(let s of Object.keys(e))if(s==="in")r[s]=o("in","required",e[s]);else if(s==="out")r[s]=o("out","range",e[s]);else return t(`has the unknown key "${s}"; use "in" and/or "out"`);return Object.keys(r).length===0?t('needs "in" and/or "out"'):Object.freeze(r)}function Un(n){let e=o=>{throw new TypeError(`@Tool ${n.name}: schedule ${o}`)},t=n.schedule;if(!h(t))return e("must be an object");for(let o of Object.keys(t))if(o!=="everyMinutes"&&o!=="timeoutMs")return e(`has the unknown key "${o}"`);return H.includes(t.everyMinutes)?t.timeoutMs!==void 0&&!me(t.timeoutMs)?e(`timeoutMs must be an integer from ${k.min} to ${k.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 ${H.join(", ")}`)}function vn(n){let e=o=>{throw new TypeError(`@Tool ${n.name}: job ${o}`)},t=n.job;if(!h(t))return e("must be an object");for(let o of Object.keys(t))if(o!=="deadlineMs")return e(`has the unknown key "${o}"`);return t.deadlineMs!==void 0&&!Se(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 Mn(n){let e=o=>{throw new TypeError(`@Tool ${n.name}: jobAccess ${o}`)},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(X)?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 Fn(n){return Object.freeze({instanceId:n.instanceId,threadId:n.threadId,actor:n.actor,requestId:n.requestId,nowMs:n.nowMs})}function qn(n){let e={};for(let[t,o]of Object.entries(n))e[t]={...o};return e}function Hn(n){return h(n)&&["startLine","lineCount","totalLines"].every(e=>Number.isSafeInteger(n[e])&&n[e]>=1)}function h(n){if(n===null||typeof n!="object"||Array.isArray(n))return false;let e=Object.getPrototypeOf(n);return e===Object.prototype||e===null}var Xn=/^[A-Za-z0-9._:-]{1,128}$/u,Gn=/[\u0000-\u001f\u007f\u2028\u2029]/u,Vn=512;function Ie(n=process.env){let e=Qe(n.CREWX_APP_INSTANCE_ID),t=n.CREWX_APP_REQUEST_ID,o=n.CREWX_APP_ACTOR_KIND,r=n.CREWX_APP_NOW_MS;if(e===void 0||typeof t!="string"||!Xn.test(t)||o!=="user"&&o!=="agent"&&o!=="schedule"||typeof r!="string"||!/^\d{1,16}$/u.test(r))return;let s=Number(r);if(!Number.isSafeInteger(s))return;let i=n.CREWX_THREAD_ID===void 0?null:Qe(n.CREWX_THREAD_ID);if(i!==void 0&&!(o==="schedule"&&(i!==null||!e.startsWith(be))))return Object.freeze({instanceId:e,threadId:i,actor:o,requestId:t,nowMs:s})}function Qe(n){if(!(typeof n!="string"||n.length===0||Gn.test(n)))return new TextEncoder().encode(n).byteLength<=Vn?n:void 0}var $n="dist/tools.json",zn=1,Wn="dist/main.mjs";var Ze=["CREWX_APP_INSTANCE_ID","CREWX_THREAD_ID"];function Kn(n){if(!Array.isArray(n)||n.length===0)return false;let e=new Set;for(let t of n){if(!Ze.some(o=>o===t)||e.has(t))return false;e.add(t);}return true}var ne=2,te=2097152;var U=2*1024*1024,oe=2e4;function Pe(n){return createHash("sha256").update(n).digest("hex")}function re(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 Zn=te+1+U,et=64*1024,nt=10,ie={kind:"invalid"};function tt(n,e){try{let t=[],o=0;for(;;){let i=new Uint8Array(et),a=readSync(n,i,0,i.length,null);if(a===0)break;if(o+=a,o>e)return;t.push(i.subarray(0,a));}let r=new Uint8Array(o),s=0;for(let i of t)r.set(i,s),s+=i.byteLength;return r}catch{return}}function se(n){return ot(tt(n,Zn))}function ot(n){if(n===void 0)return ie;let e=n.indexOf(nt);if(n.byteLength<=te){let o=ut(Buffer.from(n.buffer,n.byteOffset,n.byteLength).toString("utf8"));if(o.ok&&!(e>=0&&D(o.value)&&o.value.schemaVersion===ne))return {kind:"v1",value:o.value}}if(e<=0||e>te)return ie;let t;try{t=JSON.parse(new TextDecoder("utf-8",{fatal:!0}).decode(n.subarray(0,e)));}catch{return ie}return !D(t)||t.schemaVersion!==ne?ie:{kind:"v2",header:t,body:n.subarray(e+1)}}var rt="actionId,content,input,schemaVersion,state",it="bytes,lines,mediaType,sha256",st="mediaType,range",at=/^[a-f0-9]{64}$/u,dt=new TextDecoder("utf-8",{fatal:true,ignoreBOM:true});function tn(n,e){let t=p=>({code:p,outcome:"rejected"});if($(n)!==rt||n.schemaVersion!==ne||typeof n.actionId!="string"||!D(n.input)||!D(n.state)||!D(n.content)||$(n.content)!=="in,out")return {code:"INPUT_INVALID",outcome:"failed"};let o=n.content,r,s=o.in;if(s===null){if(e.byteLength!==0)return t(e.byteLength>U?"CONTENT_TOO_LARGE":"CONTENT_DIGEST_MISMATCH")}else {if(!D(s)||$(s)!==it||!en(s.mediaType)||!nn(s.bytes,U)||!nn(s.lines,oe)||typeof s.sha256!="string"||!at.test(s.sha256)||e.byteLength!==s.bytes)return t(e.byteLength>U?"CONTENT_TOO_LARGE":"CONTENT_DIGEST_MISMATCH");if(Pe(e)!==s.sha256||re(e)!==s.lines)return t("CONTENT_DIGEST_MISMATCH");let p;try{p=dt.decode(e);}catch{return t("CONTENT_ENCODING_INVALID")}r={mediaType:s.mediaType,text:p};}let i,a=o.out;if(a!==null){if(!D(a)||$(a)!==st||!en(a.mediaType))return t("CONTENT_SOURCE_UNSUPPORTED");let p=a.range;if(p!==null&&!pt(p))return t("CONTENT_SOURCE_UNSUPPORTED");i={mediaType:a.mediaType,...p===null?{}:{range:{startLine:p.startLine,lineCount:p.lineCount}}};}return {actionId:n.actionId,input:n.input,state:n.state,content:{...r===void 0?{}:{in:r},...i===void 0?{}:{out:i}}}}function on(n){return Object.hasOwn(n,"code")}function rn(n,e){let t=o=>({code:o,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 ae(n,e){let{content:t,...o}=n,r=e===void 0?o:{...o,content:{bytes:e.body.byteLength,lines:re(e.body),sha256:Pe(e.body),...e.range===void 0?{}:{range:e.range}}},s=new TextEncoder().encode(`${JSON.stringify(r)}
|
|
2
|
-
`);if(e===void 0)return s;let i=new Uint8Array(s.byteLength+e.body.byteLength);return i.set(s,0),i.set(e.body,s.byteLength),i}function sn(n){if(n.body.byteLength>U||re(n.body)>oe)return {code:"CONTENT_TOO_LARGE",outcome:"failed"}}function ut(n){try{return {ok:!0,value:JSON.parse(n)}}catch{return {ok:false}}}function $(n){return Object.keys(n).sort().join(",")}function D(n){if(n===null||typeof n!="object"||Array.isArray(n))return false;let e=Object.getPrototypeOf(n);return e===Object.prototype||e===null}function en(n){return typeof n=="string"&&x.includes(n)}function nn(n,e){return Number.isSafeInteger(n)&&n>=0&&n<=e}function pt(n){return D(n)&&$(n)==="lineCount,startLine"&&Number.isSafeInteger(n.startLine)&&n.startLine>=1&&Number.isSafeInteger(n.lineCount)&&n.lineCount>=1&&n.lineCount<=oe}var dn="CREWX_APP_JOB_CHANNEL",T=1,z=4096,Je=1e4,De=5e3,Ne=512,we=Object.freeze({min:3,max:16}),lt=["APP_JOB_BRIDGE_UNAVAILABLE","APP_JOB_BRIDGE_INVALID","APP_JOB_BRIDGE_TIMEOUT","APP_JOB_BRIDGE_CLOSED"],K=/^[A-Za-z0-9._:-]{1,128}$/u,ct=64,un=2147483647,W=class{#e="";#n=false;push(e){let t=[],o=e;for(;;){let r=o.indexOf(`
|
|
3
|
-
`);if(r===-1)return this.#n||(this.#e+=o,v(this.#e)>z&&(t.push({kind:"oversized"}),this.#e="",this.#n=true)),t;let s=o.slice(0,r);if(o=o.slice(r+1),this.#n){this.#n=false;continue}let i=this.#e+s;this.#e="",t.push(v(i)>z?{kind:"oversized"}:{kind:"line",line:i});}}};function pe(n){let e=JSON.stringify(n);if(v(e)>z)throw new TypeError("App job bridge message is over the line bound");return e}function ft(n){let e=le(n);if(e===void 0||e.v!==T||!pn(e.requestId)||!ln(e.seq))return;let t={v:T,requestId:e.requestId,seq:e.seq};switch(e.op){case "start":return _(e,["v","op","requestId","seq"],[])?{...t,op:"start"}:void 0;case "status":{if(!_(e,["v","op","requestId","seq"],["handle"]))return;if(e.handle===void 0)return {...t,op:"status"};let o=Ce(e.handle);return o===void 0?void 0:{...t,op:"status",handle:o}}case "cancel":{if(!_(e,["v","op","requestId","seq","handle"],[]))return;let o=Ce(e.handle);return o===void 0?void 0:{...t,op:"cancel",handle:o}}default:return}}function xe(n){let e=le(n);if(e===void 0||e.v!==T||!pn(e.requestId)||!ln(e.seq))return;let t={v:T,requestId:e.requestId,seq:e.seq};if(e.ok===false)return _(e,["v","requestId","seq","ok","code"],[])&&Oe.includes(e.code)?{...t,ok:false,code:e.code}:void 0;if(e.ok===true)switch(e.op){case "start":{if(!_(e,["v","requestId","seq","ok","op","outcome","job"],[]))return;let o=de(e.job),r=e.outcome;return o===void 0||r!=="started"&&r!=="attached"?void 0:{...t,ok:true,op:"start",outcome:r,job:o}}case "status":{if(!_(e,["v","requestId","seq","ok","op","job"],[]))return;if(e.job===null)return {...t,ok:true,op:"status",job:null};let o=de(e.job);return o===void 0?void 0:{...t,ok:true,op:"status",job:o}}case "cancel":{if(!_(e,["v","requestId","seq","ok","op","outcome","job"],[]))return;let o=de(e.job);return o===void 0||e.outcome!=="stopping"?void 0:{...t,ok:true,op:"cancel",outcome:"stopping",job:o}}default:return}}function yt(n){let e=le(n);if(e===void 0||e.v!==T||typeof e.runId!="string"||!K.test(e.runId)||!fe(e.generation))return;let t={v:T,runId:e.runId,generation:e.generation};switch(e.kind){case "heartbeat":return _(e,["v","kind","runId","generation"],[])?{...t,kind:"heartbeat"}:void 0;case "completed":return _(e,["v","kind","runId","generation"],[])?{...t,kind:"completed"}:void 0;case "progress":{if(!_(e,["v","kind","runId","generation","phase"],["completed","total","resumable"]))return;let{completed:o,total:r,resumable:s}=e;return !B(e.phase)||o!==void 0&&!ue(o)||r!==void 0&&!ue(r)||o!==void 0&&r!==void 0&&o>r||s!==void 0&&typeof s!="boolean"?void 0:{...t,kind:"progress",phase:e.phase,...o===void 0?{}:{completed:o},...r===void 0?{}:{total:r},...s===void 0?{}:{resumable:s}}}case "failed":return _(e,["v","kind","runId","generation","code","recoverable"],[])&&L(e.code)&&typeof e.recoverable=="boolean"?{...t,kind:"failed",code:e.code,recoverable:e.recoverable}:void 0;default:return}}function ke(n){let e=le(n);if(!(e===void 0||!_(e,["v","kind","runId","generation","reason"],[])||e.v!==T||e.kind!=="stop"||typeof e.runId!="string"||!K.test(e.runId)||!fe(e.generation)||!Z.includes(e.reason)))return {v:T,kind:"stop",runId:e.runId,generation:e.generation,reason:e.reason}}function je(n){let e=ce(n)?n:void 0;if(!(e===void 0||e.v!==T||!_t(e.fd))){if(e.role==="control"){let t=e.operations;return !_(e,["v","role","fd","operations"],[])||!Array.isArray(t)||t.length===0||new Set(t).size!==t.length||!t.every(X)?void 0:{v:1,role:"control",fd:e.fd,operations:[...t]}}if(e.role==="run")return !_(e,["v","role","fd","runId","generation"],[])||typeof e.runId!="string"||!K.test(e.runId)||!fe(e.generation)?void 0:{v:1,role:"run",fd:e.fd,runId:e.runId,generation:e.generation}}}function Le(n){let e=n[dn];if(typeof e!="string"||v(e)>Ne)return;let t;try{t=JSON.parse(e);}catch{return}return je(t)}function At(n){let e=je(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)>Ne)throw new TypeError("App job channel descriptor is over its bound");return Object.freeze({CREWX_APP_JOB_CHANNEL:t})}function bt(n){return n==="schedule"?"schedule":"manual"}function mt(n){return de(n)}function de(n){let e=ce(n)?n:void 0;if(e===void 0||!_(e,["handle","state","stopReason","trigger","outcome","phase","completed","total","resumable","lastHeartbeatAt","startedAt","finishedAt","errorCode","recoverable"],[]))return;let t=Ce(e.handle),o=e.stopReason,r=e.outcome,s=e.phase,i=e.errorCode,a=e.recoverable;if(!(t===void 0||!_e.includes(e.state)||!(o===null||Z.includes(o))||o!==null&&e.state!=="stopping"||!Ee.includes(e.trigger)||!(r===null||he.includes(r))||!(s===null||B(s))||!(e.completed===null||ue(e.completed))||!(e.total===null||ue(e.total))||typeof e.resumable!="boolean"||!an(e.lastHeartbeatAt)||!cn(e.startedAt)||!an(e.finishedAt)||!(i===null||L(i))||!(a===null||typeof a=="boolean")))return {handle:t,state:e.state,stopReason:o,trigger:e.trigger,outcome:r,phase:s,completed:e.completed,total:e.total,resumable:e.resumable,lastHeartbeatAt:e.lastHeartbeatAt,startedAt:e.startedAt,finishedAt:e.finishedAt,errorCode:i,recoverable:a}}function Ce(n){if(!(!ce(n)||!_(n,["runId","generation"],[]))&&!(typeof n.runId!="string"||!K.test(n.runId)||!fe(n.generation)))return {runId:n.runId,generation:n.generation}}function le(n){if(v(n)>z)return;let e;try{e=JSON.parse(n);}catch{return}return ce(e)?e:void 0}function _(n,e,t){let o=new Set([...e,...t]);return Object.keys(n).every(r=>o.has(r))&&e.every(r=>Object.hasOwn(n,r))}function ce(n){if(n===null||typeof n!="object"||Array.isArray(n))return false;let e=Object.getPrototypeOf(n);return e===Object.prototype||e===null}function pn(n){return typeof n=="string"&&K.test(n)}function ln(n){return Number.isSafeInteger(n)&&n>=1&&n<=un}function fe(n){return Number.isSafeInteger(n)&&n>=1&&n<=un}function _t(n){return Number.isSafeInteger(n)&&n>=we.min&&n<=we.max}function ue(n){return Number.isSafeInteger(n)&&n>=0}function cn(n){return typeof n=="string"&&n.length>0&&n.length<=ct}function an(n){return n===null||cn(n)}function v(n){return new TextEncoder().encode(n).byteLength}var Ot=2147483647,M=class{#e;#n;#p;#y=randomUUID();#A=new W;#r=new Map;#s=new Set;#t;#l=0;#o=false;#c=false;#a=false;#d=null;constructor(e){this.#e=e.channel,this.#n=e.open??yn,this.#p=e.replyTimeoutMs??Je;}jobsFor(e){let t=this.#e;if(t.role!=="control"||e===void 0)return;let o=t.operations,r=ee.filter(i=>e.includes(i)&&o.includes(i));if(r.length===0)return;let s=i=>{if(!r.includes(i))throw new l("APP_JOB_NOT_GRANTED",null,{outcome:"rejected"})};return Object.freeze({granted:Object.freeze(r),start:async()=>{s("start");let i=await this.#u("start",{});if(i.ok===false)return {kind:"refused",code:i.code};if(i.op!=="start")throw new l("APP_JOB_BRIDGE_INVALID",null,{outcome:"failed"});return {kind:i.outcome,job:i.job}},status:async i=>{s("status");let a=await this.#u("status",i===void 0?{}:{handle:i});if(a.ok===false)return {kind:"refused",code:a.code};if(a.op!=="status")throw new l("APP_JOB_BRIDGE_INVALID",null,{outcome:"failed"});return {kind:"status",job:a.job}},cancel:async i=>{s("cancel");let a=await this.#u("cancel",{handle:i});if(a.ok===false)return {kind:"refused",code:a.code};if(a.op!=="cancel")throw new l("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 o={v:T,runId:t.runId,generation:t.generation},r=()=>this.#d,s=i=>{this.#o||this.#c||this.#t===void 0||this.#t.write(pe({...o,...i}));};return Object.freeze({handle:Object.freeze({runId:t.runId,generation:t.generation}),get stopRequested(){return r()!==null},get stopReason(){return r()},progress:i=>{if(!B(i.phase))throw new TypeError("progress phase must be a lower snake case name");if(i.completed!==void 0&&!fn(i.completed))throw new TypeError("progress completed must be a count");if(i.total!==void 0&&!fn(i.total))throw new TypeError("progress total must be a count");if(i.completed!==void 0&&i.total!==void 0&&i.completed>i.total)throw new TypeError("progress completed cannot exceed total");if(i.resumable!==void 0&&typeof i.resumable!="boolean")throw new TypeError("progress resumable must be boolean");this.#a||s({kind:"progress",phase:i.phase,...i.completed===void 0?{}:{completed:i.completed},...i.total===void 0?{}:{total:i.total},...i.resumable===void 0?{}:{resumable:i.resumable}});},heartbeat:()=>{this.#a||s({kind:"heartbeat"});},complete:()=>{s({kind:"completed"}),this.#a=true;},fail:(i,a)=>{if(!L(i))throw new TypeError("fail code must be an upper snake case code");if(typeof a!="boolean")throw new TypeError("fail recoverable must be boolean");s({kind:"failed",code:i,recoverable:a}),this.#a=true;},onStop:i=>{let a=r();return a!==null?(i(a),()=>{}):(this.#s.add(i),()=>{this.#s.delete(i);})}})}close(){this.#i("APP_JOB_BRIDGE_CLOSED");}async drain(e=De){if(this.#o)return;this.#c=true;let t=this.#t,o;try{if(t!==void 0){let r;try{r=t.drain();}catch{r=Promise.resolve();}await Promise.race([r.catch(()=>{}),new Promise(s=>{o=setTimeout(s,e);})]);}}finally{clearTimeout(o),this.close();}}#u(e,t){let o=this.#f(),r=this.#l+1;if(r>Ot)throw new l("APP_JOB_BRIDGE_CLOSED",null,{outcome:"failed"});this.#l=r;let s=`${this.#y}.${r}`,i=pe({v:T,op:e,requestId:s,seq:r,...t});return new Promise((a,p)=>{let u=setTimeout(()=>this.#i("APP_JOB_BRIDGE_TIMEOUT"),this.#p);this.#r.set(r,{op:e,requestId:s,resolve:a,reject:p,timer:u}),o.write(i);})}#f(){if(this.#o)throw new l("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 l("APP_JOB_BRIDGE_UNAVAILABLE",null,{outcome:"failed"})}return e.onData(t=>this.#b(t)),e.onEnd(()=>this.#i("APP_JOB_BRIDGE_CLOSED")),this.#t=e,e}#b(e){for(let t of this.#A.push(e)){if(this.#o)return;if(this.#e.role==="run")t.kind==="line"&&this.#_(t.line);else if(t.kind==="oversized"){this.#i("APP_JOB_BRIDGE_INVALID");return}else this.#m(t.line);}}#m(e){let t=xe(e),o=t===void 0?void 0:this.#r.get(t.seq);if(t===void 0||o===void 0||o.requestId!==t.requestId||t.ok&&t.op!==o.op){this.#i("APP_JOB_BRIDGE_INVALID");return}clearTimeout(o.timer),this.#r.delete(t.seq),o.resolve(t);}#_(e){let t=this.#e;if(t.role!=="run")return;let o=ke(e);if(!(o===void 0||o.runId!==t.runId||o.generation!==t.generation)&&this.#d===null){this.#d=o.reason;for(let r of [...this.#s])try{r(o.reason);}catch{}}}#i(e){if(this.#o)return;this.#o=true;let t=[...this.#r.values()];this.#r.clear();for(let r of t)clearTimeout(r.timer),r.reject(new l(e,null,{outcome:"failed"}));this.#s.clear();let o=this.#t;this.#t=void 0,o?.close();}};function yn(n){let e=new Socket({fd:n,readable:true,writable:true});return e.setEncoding("utf8"),e.on("error",()=>{}),{write:t=>{e.write(`${t}
|
|
4
|
-
`);},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 fn(n){return Number.isSafeInteger(n)&&n>=0}var St=1;async function Tt(n,e,t=process.env.CREWX_WORKSPACE_ROOT??process.cwd(),o){return (await mn(n,e,t,void 0,true,void 0,o)).response}async function mn(n,e,t,o,r=true,s,i,a){let p=s!==void 0,u=h(e)?e:void 0,b=u?.input,m=u?.state,d=new n({state:h(m)?m:{},workspaceRoot:t,...i===void 0?{}:{context:i}}),E=h(b)?b:{},c=h(m)?m:d.emptyState(),f={},R=u!==void 0&&Object.hasOwn(u,"schedule"),I;try{let A;if(p){if(u===void 0||R)throw new l("INPUT_INVALID");let O=tn(u,s);if(on(O))throw new l(O.code,null,{outcome:O.outcome});(({actionId:A,input:E,state:c}=O)),f=O.content;}else {let O=R&&u!==void 0?Ve(u.schedule):void 0;if(!u||Object.keys(u).length!==(R?5:4)||!["schemaVersion","actionId","input","state"].every(hn=>Object.hasOwn(u,hn))||u.schemaVersion!==St||typeof u.actionId!="string"||!h(b)||!h(m)||R&&O===void 0)throw new l("INPUT_INVALID");A=u.actionId,E=b,c=m,I=O;}let y=V(n).find(({options:O})=>O.name===A),J=y===void 0?void 0:a?.jobsFor(y.options.jobAccess),P=y===void 0?void 0:a?.runFor(y.options.job!==void 0);if(d=new n({state:c,workspaceRoot:t,...i===void 0?{}:{context:i},...I===void 0?{}:{schedule:I},...J===void 0?{}:{jobs:J},...P===void 0?{}:{jobRun:P}}),await d.validate(A,E,c),!y)throw new l("INPUT_INVALID");if(I!==void 0&&(y.options.content!==void 0||!Ke(n)))throw new l("INPUT_INVALID");let F=d[y.methodName];if(typeof F!="function")throw new l("EXECUTION_FAILED");let N=rn(y.options.content,f);if(N)throw new l(N.code,null,{outcome:N.outcome});if(y.options.job!==void 0&&P===void 0)throw new l(ge,null,{outcome:"rejected"});let Y=Object.freeze({...f.in===void 0?{}:{in:Object.freeze({text:f.in.text})},...f.out===void 0?{}:{out:Object.freeze(f.out.range===void 0?{}:{range:Object.freeze({...f.out.range})})}}),q=()=>F.call(d,E,Y),w=r?await wt(q):await q();if(w!==void 0&&!h(w))throw new l("EXECUTION_FAILED");let C;if(f.out!==void 0){if(C=d.producedContent,C===void 0)throw new l("EXECUTION_FAILED","content.out was requested but setContent was never called");let O=sn(C);if(O)throw new l(O.code,null,{outcome:O.outcome})}else if(d.didSetContent)throw new l("EXECUTION_FAILED","setContent was called but the request asked for no content.out");let Me=d.didRequestSchedule;return {response:{...d.didSetState?{state:d.state}:{},...w===void 0?{}:{result:w},...Me===void 0?{}:{schedule:{enabled:Me.enabled}}},...C===void 0?{}:{answer:C}}}catch(A){let y,J=A,P=A instanceof l?A:void 0;if(P)y={code:P.code,detail:P.detail,outcome:P.outcome};else try{y=d.mapError(A);}catch(C){y={code:"EXECUTION_FAILED",detail:null},J=C;}let F=Jt(y?.code),N=F?y.code:"EXECUTION_FAILED",Y=typeof y?.detail=="string"?y.detail:null,q=F?Re(y.outcome):"failed",w;try{w=d.errorState(N,Y,{input:E,state:c});}catch(C){J=new AggregateError([J,C],"App error handling failed"),w=d.emptyState();}return o?.(N,J,{outcome:q,detail:Y,expected:P!==void 0&&J===P}),{response:{outcome:q,errorCode:N,state:h(w)?w:d.emptyState()}}}}async function Rt(n,e={}){let t=It(e.jobBridge);try{await Pt(n,e,t);}finally{await t?.drain();}}function It(n){if(n===null)return;if(n!==void 0)return new M(n);let e=Le(process.env);return e===void 0?void 0:new M({channel:e})}async function Pt(n,e,t){let o=e.output??process.stdout,r,s;if(e.preloadedInput!==void 0)r=e.preloadedInput.value,s=e.preloadedInput.body;else {let d=se(e.inputFd??0);d.kind==="v1"?r=d.value:d.kind==="v2"&&(r=d.header,s=d.body);}let i=s!==void 0,a=e.context??Ie(),p=false,u=(d,E,c)=>{p=true,e.onFailure?.(d,E,c);},b;try{b=await mn(n,r,process.env.CREWX_WORKSPACE_ROOT??process.cwd(),u,e.consoleManaged!==!0,s,a,t);}catch(d){u("EXECUTION_FAILED",d),b={response:An(e.emptyState)};}Ct(b.response)&&!p&&u(b.response.errorCode,void 0,{outcome:b.response.outcome,detail:null,expected:false});let m;try{let d=(e.sanitize??bn)(b.response);m=i?ae(d,b.answer):`${JSON.stringify(d)}
|
|
5
|
-
|
|
6
|
-
`;}catch(
|
|
7
|
-
`;}
|
|
8
|
-
|
|
9
|
-
`),
|
|
10
|
-
`),
|
|
11
|
-
`)
|
|
12
|
-
`);}function
|
|
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}),It=1,ve="schedule:",Tt="schedule",Ct="exit 78",Sn=["standby","disabled","draining","degraded"],kt=["cron","cron_manual","app_enable"],Jt=/^[A-Z][A-Z0-9_]{0,63}$/u;function Rn(n){return typeof n=="string"&&Jt.test(n)}var wn=["status","everyMinutes","lastStartedAt","lastFinishedAt","lastOutcome","lastErrorCode","nextRunAt","periodic","periodicReason"],Nt=["unset","on","off"],Dt=["available","unavailable"],Le=64,xt=128;function Pn(n){return z.includes(n)}function je(n){return Number.isSafeInteger(n)&&n>=j.min&&n<=j.max}function In(n){return Sn.includes(n)}function Tn(n){if(!Ft(n)||Object.keys(n).length!==wn.length||!wn.every(r=>Object.hasOwn(n,r))||typeof n.status!="string"||!Nt.includes(n.status)||!Pn(n.everyMinutes)||!de(n.lastStartedAt,Le)||!de(n.lastFinishedAt,Le)||!de(n.lastOutcome,xt)||!de(n.nextRunAt,Le)||n.lastErrorCode!==null&&!Rn(n.lastErrorCode)||typeof n.periodic!="string"||!Dt.includes(n.periodic))return;let t=n.periodic;if(!(t==="available"?n.periodicReason!==null:!In(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 de(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,Cn="crewx/appJobs",kn=1,Me=["starting","running","stopping","finished"],Be=["succeeded","failed","timed_out","cancelled","shutdown","interrupted"],ue=["cancelled","timed_out","shutdown"],Ue=["manual","schedule"],jt=/^[a-z][a-z0-9_]{0,63}$/u,Mt=/^[A-Z][A-Z0-9_]{0,63}$/u,le=["start","status","cancel"],He=["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"],qe="APP_JOB_RUN_REQUIRED";function Ve(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 le.includes(n)}function Bt(n){return n?.some(({name:e,version:t})=>e===Cn&&t===kn)===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=Ge(r?.outcome);}};function Ge(n){return n==="rejected"?"rejected":"failed"}var Xe=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 Nn(n){return Y(n).some(({options:e})=>e.schedule!==void 0)}function Dn(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=Dn(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&&!je(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&&!Ve(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 We(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"||!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:xn(n.CREWX_THREAD_ID);if(s!==void 0&&!(r==="schedule"&&(s!==null||!e.startsWith(ve))))return Object.freeze({instanceId:e,threadId:s,actor:r,requestId:t,nowMs:i})}function xn(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 Fn=["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(!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"],l=class extends Error{code;constructor(e){super(e),this.name="AppFilesError",this.code=e;}};var P={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 l("INVALID_REF")};function Z(n){let e=n.normalize("NFC");if([...e].length>P.refCodePoints)return;let t=e.split("/");if(t.length>P.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 pe(n){return typeof n!="string"?x():Z(n)??x()}function vn(n){if(n==null||n==="")return "";if(typeof n!="string")return x();let e=n.normalize("NFC");if([...e].length>P.refCodePoints)return x();let t=(e.endsWith("/")?e.slice(0,-1):e).split("/");return t.length>P.refSegments-1||!t.every(r=>H.test(r))?x():`${t.join("/")}/`}function jn(n){if(typeof n!="string")return x();if(Buffer.byteLength(n,"utf8")>P.textBytes)throw new l("TOO_LARGE");return n}function Mn(n){return n===null?null:typeof n=="string"&&n.length<=P.refCodePoints?n:x()}var ye=join("locks","files"),ne=12e3,{link:lr,mkdir:pr,open:cr,readFile:Ke,unlink:ee}=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),Bn,ce;function Ye(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 Ae(n){let{lockDir:e,key:t}=n,r=join(e,Sr(t)),o=Date.now()+n.waitMs,i=await qn(e,{token:randomUUID(),pid:process.pid,startedAtMs:await Xn()}),s=new ze;try{let a=fr;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 Tr(e,r,d,s))){if(Date.now()>=o)throw new l("FILE_BUSY");await Dr(a),a=Math.min(a*2,yr);}}}finally{await ee(i.staged).catch(()=>{});}}async function me(n){await $e(n.path,n.token);}function Sr(n){return createHash("sha256").update(n,"utf8").digest("hex")}async function qn(n,e){let t=join(n,`.${e.token}.tmp`);try{await pr(n,{recursive:!0}),await Rr(t,JSON.stringify(e));}catch{throw await ee(t).catch(()=>{}),new l("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 Vn(n,e){try{return await lr(n,e),!0}catch(t){if(t.code==="EEXIST")return false;throw new l("IO_ERROR")}}async function fe(n){let e;try{e=await Ke(n,"utf8");}catch(t){return t.code==="ENOENT"?"vanished":"unreadable"}try{let t=JSON.parse(e);return Pr(t)?t:"unreadable"}catch{return "unreadable"}}function Pr(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 ze=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<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 qn(n,{token: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 $e(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 $e(o,i.record.token);}}finally{await ee(i.staged).catch(()=>{});}}async function $e(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 promises.access("/proc/self/stat").then(()=>true,()=>false),Bn)?Cr(n):Jr(n)}async function Cr(n){try{let e=await Ke(`/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 Ke("/proc/stat","utf8")).split(`
|
|
2
|
+
`).find(t=>t.startsWith("btime ")),e=Number(n?.slice(6));return Number.isSafeInteger(e)?e:void 0}async function Jr(n){try{let{stdout:e}=await wr(br,["-o","lstart=","-p",String(n)],{env:gr,encoding:"utf8",timeout:mr});return Nr(e.trim())}catch{return null}}function Nr(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,Wn=/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/;function Hr(n){return ["docs","apps",n]}function zn(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 $n(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(!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 qr(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 H.test(n)}function Yn(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 be(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 he(n){return `sha256:${createHash("sha256").update(n).digest("hex")}`}function en(n,e){return e===n||e.startsWith(n.endsWith(sep)?n:n+sep)}var _e=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 Ze(e.workspaceReal,[...e.segments,...o]);if(i.status!=="complete")return {items:[],next:null};let s=await Qn(e),a=await lo(s,i.dir,t);a.sort((y,u)=>et(y.ref,u.ref));let d=r===void 0?a:a.filter(y=>et(y.ref,r)>0),p=d.slice(0,P.pageSize),c=[];for(let y of p){let u=await this.readVerified(s,y.abs);c.push({ref:y.ref,version:he(u.bytes),bytes:u.bytes.length,modifiedAt:u.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 Ze(e.workspaceReal,[...e.segments,...r.slice(0,-1)]);if(o.status!=="complete")throw new l("FILE_NOT_FOUND");let i=await Qe(o.dir,r[r.length-1]);if(!i)throw new l("FILE_NOT_FOUND");if(!i.stat.isFile())throw new l("IO_ERROR");let{bytes:s}=await this.readVerified(await Qn(e),i.abs,P.textBytes);return {ref:t,text:Ao(s),version:he(s)}}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 Ze(e.workspaceReal,[...e.segments,...i.slice(0,-1)]);if(d.status==="blocked")throw new l("IO_ERROR");let p=await Ee(d.dir),c=d.status==="complete"?await Qe(d.dir,s):void 0;if(c&&!c.stat.isFile())throw new l("IO_ERROR");if((c?he((await this.readVerified(p.real,c.abs)).bytes):null)!==o)throw new l("DOCUMENT_CHANGED");let u=await this.createFolders(p,d.status==="missing"?d.missing:[]);await oo(u,s);let b=c?.abs??join(u.path,s);return await this.writeAtomically(u,b,s,a,c?.stat),{ref:t,version:he(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 l("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 tn(e),await no(s,t);}catch(d){throw await a?.close().catch(()=>{}),await tt(s).catch(()=>{}),d instanceof l?d:new l("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 ro(n){return `.${n}.crewx-${randomUUID()}.tmp`}async function oo(n,e){let t=`.${e}.crewx-`;for(let r of await on(n.path))r.normalize("NFC").startsWith(t)&&r.endsWith(".tmp")&&await tt(join(n.path,r)).catch(()=>{});}async function nn(n){return (await so(n)).normalize("NFC").toLowerCase()}async function io(n,e){return nn(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 l("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 l("IO_ERROR");if(t!==void 0&&o.size>t)throw new l("TOO_LARGE");let i=yo(await r.readFile());return await co(n,e,o),{bytes:i,stat:o}}finally{await r.close();}}async function Qn(n){let e=await rn(join(n.workspaceReal,...n.segments));if(!en(n.workspaceReal,e))throw new l("INVALID_REF");return e}async function Qe(n,e){let t=(await on(n)).filter(i=>i.normalize("NFC")===e);if(t.length>1)throw new l("IO_ERROR");let r=join(n,t[0]??e),o=await sn(r);if(o){if(o.isSymbolicLink())throw new l("INVALID_REF");return {abs:r,stat:o}}}async function Ze(n,e){let t=n;for(let r=0;r<e.length;r+=1){let o=await Qe(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 tn(n);let t=await Ee(e);if(dirname(t.real)!==n.real)throw new l("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 on(s);await tn(d);let c=new Set;for(let y of p){let u=y.normalize("NFC");if(c.has(u))throw new l("IO_ERROR");c.add(u);let b=join(s,y),A=await sn(b);if(!(!A||A.isSymbolicLink())){if(A.isDirectory())o(a)<P.refSegments-1&&H.test(u)&&await i(b,`${a}${u}/`);else if(A.isFile()){let m=Z(`${a}${u}`);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 Ee(n){let e=await sn(n);if(e?.isSymbolicLink())throw new l("INVALID_REF");if(!e?.isDirectory())throw new l("IO_ERROR");return {path:n,real:await rn(n),dev:e.dev,ino:e.ino}}async function po(n,e){let t=await Ee(e);if(!en(n,t.real))throw new l("INVALID_REF");return t}async function tn(n){let e=await Ee(n.path);if(e.real!==n.real||e.dev!==n.dev||e.ino!==n.ino)throw new l("INVALID_REF")}async function co(n,e,t){let r=await rn(e);if(!en(n,r))throw new l("INVALID_REF");let o=await fo(r);if(o.dev!==t.dev||o.ino!==t.ino)throw new l("INVALID_REF")}async function rt(n,e){try{return await Qr(n,e|constants.O_NOFOLLOW)}catch(t){throw t.code==="ELOOP"?new l("INVALID_REF"):new l("IO_ERROR")}}async function rn(n){try{return await ot(n)}catch{throw new l("IO_ERROR")}}function ot(n){return new Promise((e,t)=>{realpath.native(n,(r,o)=>r?t(r):e(o));})}async function on(n){try{return await eo(n)}catch(e){let t=e.code;if(t==="ENOENT"||t==="ENOTDIR")return [];throw new l("IO_ERROR")}}async function sn(n){try{return await Yr(n)}catch(e){let t=e.code;if(t==="ENOENT"||t==="ENOTDIR")return;throw new l("IO_ERROR")}}async function fo(n){try{return await to(n)}catch{throw new l("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 l("IO_ERROR")}}var st=promisify(realpath.native),at="CREWX_APP_FILES_ROOT";function Eo(n,e={}){return {async list(t={}){let r=vn(t.prefix),o=t.after===void 0||t.after===null?void 0:pe(t.after),i=await an(n,e);return dn(n,e).list(i,r,o)},async read(t){let r=pe(t),o=await an(n,e);return dn(n,e).read(o,r)},async write(t,r,o){let i=pe(t),s=jn(r),a=Mn(o),d=await an(n,e);return dn(n,e).write(d,i,s,a)}}}async function an(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 $n(o);if(i.appId===void 0)throw new l("IO_ERROR");let s=zn({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=ge(n);if(e===void 0)throw new l("IO_ERROR");return e}function dn(n,e){let t=join(e.crewxHome??Ye(),ye);return new _e({},{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 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 l("IO_ERROR")}}var Oe=2,we=2097152;var q=2*1024*1024,Se=2e4;function un(n){return createHash("sha256").update(n).digest("hex")}function Re(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=we+1+q,Co=64*1024,ko=10,Pe={kind:"invalid"};function Jo(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 Ie(n){return No(Jo(n,To))}function No(n){if(n===void 0)return Pe;let e=n.indexOf(ko);if(n.byteLength<=we){let r=jo(Buffer.from(n.buffer,n.byteOffset,n.byteLength).toString("utf8"));if(r.ok&&!(e>=0&&F(r.value)&&r.value.schemaVersion===Oe))return {kind:"v1",value:r.value}}if(e<=0||e>we)return Pe;let t;try{t=JSON.parse(new TextDecoder("utf-8",{fatal:!0}).decode(n.subarray(0,e)));}catch{return Pe}return !F(t)||t.schemaVersion!==Oe?Pe:{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(re(n)!==Do||n.schemaVersion!==Oe||typeof n.actionId!="string"||!F(n.input)||!F(n.state)||!F(n.content)||re(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)||re(i)!==xo||!dt(i.mediaType)||!ut(i.bytes,q)||!ut(i.lines,Se)||typeof i.sha256!="string"||!Lo.test(i.sha256)||e.byteLength!==i.bytes)return t(e.byteLength>q?"CONTENT_TOO_LARGE":"CONTENT_DIGEST_MISMATCH");if(un(e)!==i.sha256||Re(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)||re(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 Te(n,e){let{content:t,...r}=n,o=e===void 0?r:{...r,content:{bytes:e.body.byteLength,lines:Re(e.body),sha256:un(e.body),...e.range===void 0?{}:{range:e.range}}},i=new TextEncoder().encode(`${JSON.stringify(o)}
|
|
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||Re(n.body)>Se)return {code:"CONTENT_TOO_LARGE",outcome:"failed"}}function jo(n){try{return {ok:!0,value:JSON.parse(n)}}catch{return {ok:false}}}function re(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)&&re(n)==="lineCount,startLine"&&Number.isSafeInteger(n.startLine)&&n.startLine>=1&&Number.isSafeInteger(n.lineCount)&&n.lineCount>=1&&n.lineCount<=Se}var At="CREWX_APP_JOB_CHANNEL",R=1,oe=4096,cn=1e4,fn=5e3,yn=512,ln=Object.freeze({min:3,max:16}),Bo=["APP_JOB_BRIDGE_UNAVAILABLE","APP_JOB_BRIDGE_INVALID","APP_JOB_BRIDGE_TIMEOUT","APP_JOB_BRIDGE_CLOSED"],se=/^[A-Za-z0-9._:-]{1,128}$/u,Uo=64,mt=2147483647,ie=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)>oe&&(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)>oe?{kind:"oversized"}:{kind:"line",line:s});}}};function Je(n){let e=JSON.stringify(n);if(V(e)>oe)throw new TypeError("App job bridge message is over the line bound");return e}function Ho(n){let e=Ne(n);if(e===void 0||e.v!==R||!bt(e.requestId)||!gt(e.seq))return;let t={v:R,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=pn(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=pn(e.handle);return r===void 0?void 0:{...t,op:"cancel",handle:r}}default:return}}function An(n){let e=Ne(n);if(e===void 0||e.v!==R||!bt(e.requestId)||!gt(e.seq))return;let t={v:R,requestId:e.requestId,seq:e.seq};if(e.ok===false)return O(e,["v","requestId","seq","ok","code"],[])&&He.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=Ce(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=Ce(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=Ce(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=Ne(n);if(e===void 0||e.v!==R||typeof e.runId!="string"||!se.test(e.runId)||!xe(e.generation))return;let t={v:R,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&&!ke(r)||o!==void 0&&!ke(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 mn(n){let e=Ne(n);if(!(e===void 0||!O(e,["v","kind","runId","generation","reason"],[])||e.v!==R||e.kind!=="stop"||typeof e.runId!="string"||!se.test(e.runId)||!xe(e.generation)||!ue.includes(e.reason)))return {v:R,kind:"stop",runId:e.runId,generation:e.generation,reason:e.reason}}function bn(n){let e=De(n)?n:void 0;if(!(e===void 0||e.v!==R||!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"||!se.test(e.runId)||!xe(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)>yn)return;let t;try{t=JSON.parse(e);}catch{return}return bn(t)}function Vo(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(V(t)>yn)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 Ce(n)}function Ce(n){let e=De(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=pn(e.handle),r=e.stopReason,o=e.outcome,i=e.phase,s=e.errorCode,a=e.recoverable;if(!(t===void 0||!Me.includes(e.state)||!(r===null||ue.includes(r))||r!==null&&e.state!=="stopping"||!Ue.includes(e.trigger)||!(o===null||Be.includes(o))||!(i===null||U(i))||!(e.completed===null||ke(e.completed))||!(e.total===null||ke(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 pn(n){if(!(!De(n)||!O(n,["runId","generation"],[]))&&!(typeof n.runId!="string"||!se.test(n.runId)||!xe(n.generation)))return {runId:n.runId,generation:n.generation}}function Ne(n){if(V(n)>oe)return;let e;try{e=JSON.parse(n);}catch{return}return De(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 De(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"&&se.test(n)}function gt(n){return Number.isSafeInteger(n)&&n>=1&&n<=mt}function xe(n){return Number.isSafeInteger(n)&&n>=1&&n<=mt}function Wo(n){return Number.isSafeInteger(n)&&n>=ln.min&&n<=ln.max}function ke(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 ie;#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??cn;}jobsFor(e){let t=this.#e;if(t.role!=="control"||e===void 0)return;let r=t.operations,o=le.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(Je({...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=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>Ko)throw new f("APP_JOB_BRIDGE_CLOSED",null,{outcome:"failed"});this.#p=o;let i=`${this.#y}.${o}`,s=Je({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 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=w(e)?e:void 0,c=p?.input,y=p?.state,u=new n({state:w(y)?y:{},workspaceRoot:t,...s===void 0?{}:{context:s}}),b=w(c)?c:{},A=w(y)?y:u.emptyState(),m={},I=p!==void 0&&Object.hasOwn(p,"schedule"),T;try{let E;if(d){if(p===void 0||I)throw new f("INPUT_INVALID");let S=lt(p,i);if(pt(S))throw new f(S.code,null,{outcome:S.outcome});(({actionId:E,input:b,state:A}=S)),m=S.content;}else {let S=I&&p!==void 0?Tn(p.schedule):void 0;if(!p||Object.keys(p).length!==(I?5:4)||!["schemaVersion","actionId","input","state"].every(Pt=>Object.hasOwn(p,Pt))||p.schemaVersion!==Zo||typeof p.actionId!="string"||!w(c)||!w(y)||I&&S===void 0)throw new f("INPUT_INVALID");E=p.actionId,b=c,A=y,T=S;}let _=Y(n).find(({options:S})=>S.name===E),D=_===void 0?void 0:a?.jobsFor(_.options.jobAccess),C=_===void 0?void 0:a?.runFor(_.options.job!==void 0);if(u=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 u.validate(E,b,A),!_)throw new f("INPUT_INVALID");if(T!==void 0&&(_.options.content!==void 0||!Nn(n)))throw new f("INPUT_INVALID");let G=u[_.methodName];if(typeof G!="function")throw new f("EXECUTION_FAILED");let L=ct(_.options.content,m);if(L)throw new f(L.code,null,{outcome:L.outcome});if(_.options.job!==void 0&&C===void 0)throw new f(qe,null,{outcome:"rejected"});let ae=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(u,b,ae),k=o?await ri(W):await W();if(k!==void 0&&!w(k))throw new f("EXECUTION_FAILED");let J;if(m.out!==void 0){if(J=u.producedContent,J===void 0)throw new f("EXECUTION_FAILED","content.out was requested but setContent was never called");let S=ft(J);if(S)throw new f(S.code,null,{outcome:S.outcome})}else if(u.didSetContent)throw new f("EXECUTION_FAILED","setContent was called but the request asked for no content.out");let On=u.didRequestSchedule;return {response:{...u.didSetState?{state:u.state}:{},...k===void 0?{}:{result:k},...On===void 0?{}:{schedule:{enabled:On.enabled}}},...J===void 0?{}:{answer:J}}}catch(E){let _,D=E,C=E instanceof f?E:void 0;if(C)_={code:C.code,detail:C.detail,outcome:C.outcome};else try{_=u.mapError(E);}catch(J){_={code:"EXECUTION_FAILED",detail:null},D=J;}let G=ii(_?.code),L=G?_.code:"EXECUTION_FAILED",ae=typeof _?.detail=="string"?_.detail:null,W=G?Ge(_.outcome):"failed",k;try{k=u.errorState(L,ae,{input:b,state:A});}catch(J){D=new AggregateError([D,J],"App error handling failed"),k=u.emptyState();}return r?.(L,D,{outcome:W,detail:ae,expected:C!==void 0&&D===C}),{response:{outcome:W,errorCode:L,state:w(k)?k:u.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 u=Ie(e.inputFd??0);u.kind==="v1"?o=u.value:u.kind==="v2"&&(o=u.header,i=u.body);}let s=i!==void 0,a=e.context??We(),d=false,p=(u,b,A)=>{d=true,e.onFailure?.(u,b,A);},c;try{c=await St(n,o,process.env.CREWX_WORKSPACE_ROOT??process.cwd(),p,e.consoleManaged!==!0,i,a,t);}catch(u){p("EXECUTION_FAILED",u),c={response:Ot(e.emptyState)};}oi(c.response)&&!d&&p(c.response.errorCode,void 0,{outcome:c.response.outcome,detail:null,expected:false});let y;try{let u=(e.sanitize??wt)(c.response);y=s?Te(u,c.answer):`${JSON.stringify(u)}
|
|
6
|
+
`;}catch(u){p("EXECUTION_FAILED",u);let b=Ot(e.emptyState);try{let A=(e.sanitize??wt)(b);y=s?Te(A):`${JSON.stringify(A)}
|
|
7
|
+
`;}catch(A){p("EXECUTION_FAILED",A),y=s?Te(b):`${JSON.stringify(b)}
|
|
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 Ot(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 wt(n){return n}var hn={depth:null,maxArrayLength:null,maxStringLength:null},En=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 En,i=new Console({stdout:o,stderr:o,inspectOptions:{...hn}});globalThis.console=i;let s=false,a="-",d="-",p,c=false,y,u;try{let m=li(e.inputFd??0);a=pi(m.value),d=Fe(process.env.CREWX_APP_REQUEST_ID),p=new Date().toISOString();try{y=await n();}catch(E){c=!0,u=E;}let I=y?.default;if(!c&&I?.devtools?.log===!0?(Object.assign(inspect.defaultOptions,hn),b(p),o.flushToStderr()):o.discard(),c){A("EXECUTION_FAILED",u),_n(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(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,E);}catch(E){A("EXECUTION_FAILED",E),_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()} ${Fe(a)} req=${d}
|
|
10
|
+
`),s=true);}function A(m,I,T){b();let E=T?.expected===true&&T.detail?` ${Fe(T.detail)}`:"";process.stderr.write(`[crewx-app] ${T?.outcome??"failed"} ${Fe(m)}${E}
|
|
11
|
+
`),I!==void 0&&T?.expected!==true&&process.stderr.write(`${inspect(I,hn)}
|
|
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=Ie(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 Fe(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??ci)(i);}catch(a){t("EXECUTION_FAILED",a);}n(`${JSON.stringify(s)}
|
|
13
|
+
`);}function ci(n){return n}export{Ln as APP_FILES_ERROR_CODES,P as APP_FILES_LIMITS,ye as APP_FILES_LOCK_SUBPATH,at as APP_FILES_ROOT_ENV,yn as APP_JOB_BRIDGE_CHANNEL_MAX_BYTES,fn as APP_JOB_BRIDGE_DRAIN_TIMEOUT_MS,At as APP_JOB_BRIDGE_ENV,Bo as APP_JOB_BRIDGE_ERROR_CODES,ln as APP_JOB_BRIDGE_FD,oe as APP_JOB_BRIDGE_MAX_LINE_BYTES,cn as APP_JOB_BRIDGE_REPLY_TIMEOUT_MS,R as APP_JOB_BRIDGE_VERSION,Cn as APP_JOB_CAPABILITY,kn as APP_JOB_CAPABILITY_VERSION,M as APP_JOB_DEADLINE_MS,vt as APP_JOB_MAX_PER_APP,le as APP_JOB_OPERATIONS,Be as APP_JOB_OUTCOMES,He as APP_JOB_REFUSAL_CODES,qe as APP_JOB_RUN_REQUIRED,Me as APP_JOB_STATES,Lt as APP_JOB_STOP_GRACE_MS,ue as APP_JOB_STOP_REASONS,Ue as APP_JOB_TRIGGERS,Tt as APP_SCHEDULE_ACTOR_KIND,Ct as APP_SCHEDULE_INERT_COMMAND,ve as APP_SCHEDULE_INSTANCE_PREFIX,z as APP_SCHEDULE_INTERVALS_MINUTES,It as APP_SCHEDULE_MAX_PER_APP,Sn 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,f as AppError,l as AppFilesError,X as AppJobBridge,ie as AppJobLineReader,Xe as CrewXApp,kt as SCHEDULE_TRIGGERS,Fn as SKILL_BACKEND_ENV_NAMES,Ht as Tool,Ae as acquireFileLock,Eo as appFiles,nn as appFilesLockKeyOf,ge as appFilesRootSegmentsOf,Xo as appJobTriggerForActor,Vo as buildAppJobChannelEnvironment,Je as encodeAppJobLine,Qo as executeAppRequest,qt as generateManifest,Dn as generateToolDeclarations,Y as getToolDeclarations,Bt as hasAppJobCapability,B as isAppJobCode,Ve as isAppJobDeadlineMs,$ as isAppJobOperation,U as isAppJobPhase,Rn as isAppScheduleCode,Pn as isAppScheduleIntervalMinutes,In as isAppSchedulePeriodicReason,je as isAppScheduleTimeoutMs,rr as isSkillBackendEnv,Z as normalizeAppFilesRef,Et as openInheritedAppJobTransport,bn as parseAppJobChannel,An as parseAppJobControlReply,Ho as parseAppJobControlRequest,mn as parseAppJobRunPush,qo as parseAppJobRunReport,Go as parseAppJobView,We as readAppContext,gn as readAppJobChannel,me as releaseFileLock,di as runAppEntry,ei as runSkillApp};
|