@oddington/cli 0.1.53 → 0.1.54

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/README.md +3 -2
  2. package/dist/os.js +12 -11
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -602,8 +602,9 @@ checkout, while accepting host installations whose paths contain `node_modules`.
602
602
  Routine requirement failures name missing workspace resources and local AI
603
603
  setup together before any business step starts. For example, a declared
604
604
  `dropbox/documents` with no workspace connection is reported as a missing
605
- connection, with the Dropbox connection setup command and a placeholder for your
606
- existing folder. Inspect all configured connections with
605
+ connection, with the Dropbox connection setup command and a quoted placeholder
606
+ for the existing base folder's path inside Dropbox. The routine's Dropbox paths
607
+ are relative to that folder. Inspect all configured connections with
607
608
  `os connection list --workspace <slug> --all`.
608
609
 
609
610
  Local AI supports signed-in Claude Code 2.1.259 and newer. An older unsupported
package/dist/os.js CHANGED
@@ -331,7 +331,7 @@ await globalThis[Symbol.for('oddington.private.local-routine-host')]();`,V=proce
331
331
  `,(b)=>b?k(b):U0()))}).catch(f)});let a=()=>{if(clearTimeout(m),w)clearTimeout(w);X.signal?.removeEventListener("abort",P),W.destroy(),U.destroy(),H.stdout?.destroy(),H.stderr?.destroy()},X0=()=>{for(let z0 of X.secrets??[])if(z0){if(A=A.split(z0).join("[redacted]"),S){for(let G0=Math.min(z0.length-1,A.length);G0>0;G0--)if(A.endsWith(z0.slice(0,G0))){A=`${A.slice(0,-G0)}[redacted]`;break}}}while(Buffer.byteLength(A)>10485760)A=A.slice(0,-1);return{state:q?"cancelled":!z&&L?"succeeded":"failed",...I?{contract:I}:{},...j?{definition:j}:{},output:A,truncated:S,...!q&&(z||!L)?{failure:E?"timed_out":"routine_failed"}:{},...x?{termination:x}:{}}};return H.once("error",(z0)=>{let G0=z0.code;x={exitCode:null,signal:null,...G0?{spawnError:G0}:{}},z=!0,M=!0,a(),C(X0())}),H.once("exit",(z0,G0)=>{if(x={exitCode:z0,signal:G0},M=!0,z0!==0||T)z=!0;if(V)g("SIGKILL")}),H.once("close",()=>{a(),C(X0())}),U.end(JSON.stringify({mode:X.mode,entry:_x(X.sourceDirectory,X.source.entry),input:X.input,...X.mode==="execute"?{contract:X.contract,runId:X.runId,connectionLeases:X.connectionLeases??[]}:{}})),{completion:D,async terminate(){P(),await D}}}class I6 extends Error{diagnostic;code="routine_source_unavailable";constructor(X){super(`${X.message}
332
332
  ${X.action}`);this.diagnostic=X;this.name="RoutineSourceDiagnosticError"}}function UY(X){if(X instanceof I6)return X;let J=X instanceof Error&&/^Routine deployment source unavailable: ambiguous package root (routines\/[A-Za-z0-9_./-]+)$/.exec(X.message);if(J&&!J[1].split("/").some((Q)=>Q===".."))return new I6({code:"ambiguous_package_root",message:`Imported source crosses another package root: ${J[1]}/package.json.`,action:"Move reusable source to routines/lib/ without a package.json, and import it from both routines. Shared source may use only the selected routine's declared dependencies."})}var SJ=()=>Error("Routine definition unavailable: check confined routines/*/routine.ts definitions, unique exported IDs and installed runtime dependencies.");async function cx(X,J,Q,Z,G=[]){let Y=new Map,V=RJ(X,"routines");if(await iO(X)!==X||await iO(V)!==V)throw SJ();let K=await iO(await UV0(RJ(qV0(),"os-routine-definitions-")));try{let H=0;for(let W of(await px(V)).sort()){if(W.startsWith(".")||W==="node_modules"||W==="runs")continue;if(!/^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$/.test(W))continue;let U;try{let z=`routines/${W}/routine.ts`,q=await ux(RJ(V,W));if(q.isSymbolicLink())throw SJ();if(!q.isDirectory())continue;let B;try{B=await ux(RJ(X,z))}catch(I){if(I.code==="ENOENT")continue;throw I}if(!B.isFile()||B.isSymbolicLink())throw SJ();let M=RJ(K,String(H++)),L=await OJ({root:X,gitDirectory:"",remote:"",branch:""},"definition",M,Q,z),O=await(await HY({sourceDirectory:M,source:L,workingRoot:M,mode:"inspect",definitionOnly:!0,input:void 0,environment:{PATH:process.env.PATH},maximumMilliseconds:30000,executable:Z,async accept(){},async assertCurrent(){}})).completion;if(O.state!=="succeeded"||!O.definition){if(O.output.includes("OS_ROUTINE_INSPECTION_NETWORK_DENIED"))throw new I6({code:"inspection_network_operation",message:"Routine source attempted a network operation while its definition was being inspected.",action:"Move provider or network operations into the routine run function or a step. Importing the definition must not perform business work."});throw SJ()}U={entry:z,source:L,contract:O.definition}}catch(z){let q=UY(z);if(!J)throw q??SJ();if(G.length<8)G.push({entry:`routines/${W}/routine.ts`,error:q});continue}if(J&&!J.has(U.contract.id))continue;if(Y.has(U.contract.id))throw new I6({code:"duplicate_routine_id",message:`Routine definition unavailable: more than one definition exports routine id "${U.contract.id}".`,action:"Give each defineRoutine export a unique id, then repeat the command."});Y.set(U.contract.id,U)}return Y}catch(H){throw UY(H)??SJ()}finally{for(let H of await px(K))await HV0(RJ(K,H),448);await zV0(K,{recursive:!0,force:!0})}}async function lx(X,J,Q,Z){return await cx(X,new Set(J),Q,Z)}async function T1(X,J,Q,Z){let G=[],Y=(await cx(X,new Set([J]),Q,Z,G)).get(J);if(!Y){let V=G.map((K)=>K.error?`${K.entry}: ${K.error.message}`:`${K.entry}: definition inspection failed.`);throw new I6({code:"definition_unavailable",message:`Routine definition unavailable for ${J}.${V.length?`
333
333
  ${V.join(`
334
- `)}`:""}`,action:"Check the exported defineRoutine id and the definitions listed above. No routine steps ran."})}return Y}var gH=(X)=>MV0("sha256").update(X).digest("hex"),s5=(X)=>{throw Error(`Routine deployment source unavailable: ${X}`)};async function dx(X,J,Q,Z){let G=await T1(X.root,J,Q,Z);return{...await tO(X,TJ(G.entry),G),definition:G}}async function nx(X,J){return tO(X,J)}async function sx(X,J){return tO(X,TJ(J),void 0,J)}async function tO(X,J,Q,Z=Q?.entry){if(!sX(J))s5("invalid routine directory");let G=await EJ(X.root);if(G!==X.root)s5("worktree must be canonical");let Y=new Map,V=new Map,K=0,H=async(w)=>{if(V.has(w))return;let C=X3(G,w),D=await I1(C);if(!D.isDirectory()||await EJ(C)!==C)s5(`symlink directory ${w}`);if(V.set(w,{dev:D.dev,ino:D.ino,size:D.size,mtimeMs:D.mtimeMs,ctimeMs:D.ctimeMs}),w!=="routines")await H(zY(w))},W=async(w,C=!1)=>{if(!(C?["routines/package.json","routines/bun.lock","routines/requirements.lock",`routines/${J}/package.json`].includes(w):XY(w)))s5(`ineligible path ${w}`);let D=Y.get(w);if(D)return D.bytes;await H(zY(w));let g=X3(G,w);if(await EJ(g)!==g)s5(`symlink ${w}`);let f=await I1(g);if(!f.isFile()||Y.size>=p7.files||K+f.size>p7.bytes)s5(`source limits or non-file ${w}`);let P=await BV0(g,rO.O_RDONLY|rO.O_NOFOLLOW|rO.O_NONBLOCK);try{let m=await P.stat();if(!m.isFile()||m.dev!==f.dev||m.ino!==f.ino||m.size!==f.size)s5(`changed ${w}`);let v=Buffer.alloc(m.size),a=0;while(a<v.length){let z0=await P.read(v,a,Math.min(65536,v.length-a),a);if(!z0.bytesRead)s5(`changed ${w}`);a+=z0.bytesRead}let X0=await P.stat();if(m.size!==X0.size||m.mtimeMs!==X0.mtimeMs||m.ctimeMs!==X0.ctimeMs)s5(`changed ${w}`);return Y.set(w,{bytes:v,dev:m.dev,ino:m.ino,size:m.size,mtimeMs:m.mtimeMs,ctimeMs:m.ctimeMs}),K+=v.length,v}finally{await P.close()}},U=async(w,C=!1)=>{try{await I1(X3(G,w))}catch(D){if(D.code==="ENOENT")return;throw D}return W(w,C)},z=Q?Cx(Q.contract):Z?U8({$schema:H8}):await(async()=>{let w=await W(`routines/${J}/routine.json`);if(w.length>p7.declarationBytes)s5("declaration exceeds 64 KiB");return U8(JSON.parse(w.toString("utf8")))})(),q=(await W("routines/package.json",!0)).toString("utf8"),B=(await W("routines/bun.lock",!0)).toString("utf8"),M=await U(`routines/${J}/package.json`,!0),L=M!==void 0||Object.hasOwn(JSON.parse(q),"workspaces");if(Z&&!M)s5("selected workspace manifest missing");let T=L?ZY(q,M?.toString("utf8")??s5("selected workspace manifest missing"),B,J):void 0,O=T?.dependencies??pO(q,B),I=!Z&&(!L||z.runtime.features.includes("python"))?await U("routines/requirements.lock",!0):void 0;if(I){if(!z.runtime.features.includes("python"))s5("requirements.lock requires python feature");cO(I.toString("utf8"))}let j=new Set,N=(w,C)=>{if(/[?#\\]/.test(C))s5(`unsupported import in ${w}`);let D=TV0(G,IV0(G,zY(w),C)).split(jV0).join("/");if(!XY(D))s5(`escaped or ineligible import in ${w}`);return D},A=async(w)=>{if(j.has(w))return;j.add(w);let C=await W(w);if(oO(w)===".json"){JSON.parse(C.toString("utf8"));return}if(![".ts",".mts",".cts",".js",".mjs",".cjs"].includes(oO(w)))s5(`unsupported module ${w}`);let D=dX(C.toString("utf8"),w,!1);for(let{specifier:g}of D.modules){if(OV0(g))continue;if(g.startsWith("./")||g.startsWith("../")){let f=N(w,g);if(!oO(f)){let P=[];for(let m of[".ts",".js",".json",".mts",".mjs",".cts",".cjs"])if(await U(`${f}${m}`))P.push(`${f}${m}`);if(P.length!==1)s5(`missing or ambiguous import in ${w}`);f=P[0]}await A(f)}else{if(!/^(?:@[a-z0-9_.-]+\/)?[a-z0-9][a-z0-9_.-]*(?:\/[a-zA-Z0-9_.-]+)*$/.test(g)||g.split("/").some((P)=>P==="."||P===".."))s5(`unsupported package import in ${w}`);let f=g.split("/").slice(0,g.startsWith("@")?2:1).join("/");if(f==="@oddington/sdk"?g!==f:!O.has(f))s5(`undeclared or incompatible package ${g}`)}}for(let g of D.assets)await W(N(w,g))};if(await A(Z??`routines/${J}/run.ts`),!Z&&await U(`routines/${J}/responses.ts`))await A(`routines/${J}/responses.ts`);for(let w of z.assets){let C=`routines/${J}`,D=w.split("/"),g=async(f,P)=>{let m;try{m=await I1(X3(G,f))}catch(X0){if(X0.code==="ENOENT")return;throw X0}if(m.isSymbolicLink())s5(`symlink asset ${f}`);let v=D[P];if(!v){await W(f);return}if(!m.isDirectory())return;if(!v.includes("*")){await g(`${f}/${v}`,P+1);return}if(!XY(`${f}/asset`)||await EJ(X3(G,f))!==X3(G,f))s5(`ineligible asset directory ${f}`);if(await H(f),v==="**"&&P+1<D.length)await g(f,P+1);let a=new RegExp(`^${v.replace(/[.]/g,"\\.").replace(/\*/g,".*")}$`);for(let X0 of await LV0(X3(G,f),{withFileTypes:!0})){if(X0.name==="node_modules"||X0.name==="runs"||X0.name.startsWith("."))continue;if(v!=="**"&&!a.test(X0.name))continue;let z0=`${f}/${X0.name}`;if(X0.isSymbolicLink())s5(`symlink asset ${z0}`);if(v==="**"){if(X0.isDirectory())await g(z0,P);else if(P===D.length-1)await W(z0)}else await g(z0,P+1)}};await g(C,0)}let R=new Set;for(let w of Y.keys()){let C=zY(w);while(C!=="routines")R.add(C),C=zY(C)}for(let w of R){if(L&&w===`routines/${J}`)continue;try{await I1(X3(G,w,"package.json")),s5(`ambiguous package root ${w}`)}catch(C){if(C.code!=="ENOENT")throw C}}for(let[w,C]of Y){let D=X3(G,w),g=await I1(D);if(await EJ(D)!==D||g.dev!==C.dev||g.ino!==C.ino||g.size!==C.size||g.mtimeMs!==C.mtimeMs||g.ctimeMs!==C.ctimeMs)s5(`changed during collection ${w}`)}for(let[w,C]of V){let D=X3(G,w),g=await I1(D);if(await EJ(D)!==D||g.dev!==C.dev||g.ino!==C.ino||g.mtimeMs!==C.mtimeMs||g.ctimeMs!==C.ctimeMs)s5(`directory changed during collection ${w}`)}let S=new Map([...Y].map(([w,C])=>[w,C.bytes]));if(Q){let w=new Map((Q.source.authoredFiles??Q.source.files).map((C)=>[C.path,C]));for(let[C,D]of S)if(w.get(C)?.sha256!==gH(D))s5("definition changed after inspection")}let $=new Map(S);if(T)$.set("routines/package.json",Buffer.from(T.manifest)),$.set("routines/bun.lock",Buffer.from(T.lock));let E=[...$].map(([w,C])=>({path:w,size:C.length,sha256:gH(C)})).sort((w,C)=>w.path<C.path?-1:w.path>C.path?1:0),x=await FH(G,S);return{source:{digest:gH(JSON.stringify(E)),declaration:z,files:E,provenance:x,...Q?{definition:{entry:Q.entry,contract:Q.contract}}:{}},contents:$,authoredFiles:[...S].map(([w,C])=>({path:w,size:C.length,sha256:gH(C)}))}}var J6=()=>{throw Error("Local routine source unavailable: modern routines require valid frozen workspace metadata, Bun 1.3.14, a compatible installed authoring SDK and the selected installed runtime graph. Run ordinary workspace setup before launch; launch never installs dependencies.")},tx=()=>({PATH:process.env.PATH});async function CJ(X,J=p7.bytes){if(await j1(X)!==X)return J6();let Q=await AV0(X,hH.O_RDONLY|hH.O_NOFOLLOW|hH.O_NONBLOCK);try{let Z=await Q.stat();if(!Z.isFile()||Z.size>J)return J6();let G=Buffer.alloc(Z.size+1),{bytesRead:Y}=await Q.read(G,0,G.length,0),V=await Q.stat();if(Y!==Z.size||Z.size!==V.size||Z.mtimeMs!==V.mtimeMs||Z.ctimeMs!==V.ctimeMs||await j1(X)!==X)return J6();return G.subarray(0,Y)}finally{await Q.close()}}var wJ=async(X)=>JSON.parse((await CJ(X,1048576)).toString("utf8"));async function ex(X,J){try{return await vH(j6(X,"routines",J,"package.json")),!0}catch(Q){if(Q.code==="ENOENT")return!1;throw Q}}var qY=(X)=>X.match(/@[^/]+\/[^/]+|[^/]+/g),rx=(X)=>qY(X).join("/node_modules/");async function QT(X,J,Q){let Z=await j1(J),G=EV0(X,Z).split(_H);if(G[0]===".."||!G.includes("node_modules"))return J6();let Y=await wJ(j6(Z,"package.json"));if(`${Y.name}@${Y.version}`!==Q)return J6();return{directory:Z,info:Y}}async function eO(X,J,Q,Z){let G=J;for(;;){let Y=j6(G,"node_modules",Q),V=!1;try{await vH(Y),V=!0}catch(K){if(K.code!=="ENOENT")throw K}if(V)return await QT(X,Y,Z);if(G===X)return J6();if(G=fH(G),!G.startsWith(`${X}${_H}`)&&G!==X)return J6()}}function kV0(X,J=process.env.PATH??"",Q=process.platform){let Z=Q==="win32"?CV0:SV0,G=Q==="win32"?`${X}.exe`:X;return J.split(Z.delimiter).filter(Z.isAbsolute).map((Y)=>Z.join(Y,G))}async function ox(X,J,Q=process.env.PATH){for(let Z of kV0(X,Q))try{if(Z.startsWith(`${J}${_H}`))continue;await $V0(Z,hH.X_OK);let G=await j1(Z);if(!G.startsWith(`${J}${_H}`))return G}catch{}throw new I6({code:"runtime_missing",message:`Required runtime "${X}" was not found outside this checkout.`,action:X==="bun"?`Install Bun ${v3}: npm install --global bun@${v3}. Then repeat the command.`:`Install ${X} on this computer and add it to PATH, then repeat the command.`})}async function FV0(X,J,Q,Z=!1){if(!sX(J)||await j1(X)!==X)return J6();let G=await wJ(j6(X,"routines/package.json")),Y=await wJ(j6(X,"routines",J,"package.json")),V=ZY(JSON.stringify(G),JSON.stringify(Y),(await CJ(j6(X,"routines/bun.lock"))).toString("utf8"),J);if(Y.engines?.node&&!XT.satisfies(Q,Y.engines.node))return J6();if(G.devDependencies?.["@oddington/sdk"]!==c7)return J6();let{directory:K,info:H}=await QT(X,j6(X,"routines/node_modules/@oddington/sdk"),`@oddington/sdk@${c7}`),W=typeof H.exports==="string"?H.exports:H.exports?.["."]?.import;if(H.type!=="module"||!["./index.js","./dist/index.js"].includes(W)||H.engines?.node&&!XT.satisfies(Q,H.engines.node))return J6();await CJ(j6(K,W));let U=jJ(V.lock).packages,z=new Map;for(let[L,T]of Object.entries(U).sort(([O],[I])=>qY(O).length-qY(I).length)){if(T.length===1)continue;let O=qY(L),I=O.slice(0,-1).join("/"),j=!I?j6(X,"routines"):I===Y.name?j6(X,"routines",J):z.get(I)??J6(),N=await eO(X,j,O.at(-1),T[0]);for(let A of["dependencies","optionalDependencies","peerDependencies"]){let R=(S={})=>JSON.stringify(Object.entries(S).sort(([$],[E])=>$.localeCompare(E)));if(R(N.info[A])!==R(T[2][A]))return J6()}z.set(L,N.directory)}let q=async(L,T,O)=>{for(let I of Object.keys(O)){if(I==="@oddington/sdk"){if((await eO(X,T,I,`@oddington/sdk@${c7}`)).directory!==K)return J6();continue}let j=uO(U,L,I);if(j&&(await eO(X,T,I,U[j][0])).directory!==z.get(j))return J6()}};await q(Y.name,j6(X,"routines",J),Y.dependencies??{});for(let[L,T]of z){let O=U[L][2];await q(L,T,{...O.peerDependencies,...O.dependencies,...O.optionalDependencies})}let B=await ox("bun",X),M;try{M=(await wV0(NV0)(B,["--version"],{cwd:fH(B),env:tx(),timeout:1e4,maxBuffer:4096})).stdout.trim()}catch{}if(M!==v3)throw new I6({code:"runtime_version",message:`This OS release needs Bun ${v3}; ${typeof M==="string"&&/^\d+\.\d+\.\d+$/.test(M)?`found ${M}`:"the installed Bun version could not be verified"}.`,action:`Install the required runtime: npm install --global bun@${v3}. Then repeat the command.`});if(!Z){let L=U8(await wJ(j6(X,"routines",J,"routine.json")));for(let T of L.runtime.features)for(let O of T==="python"?["python3"]:T==="documents"?["pdftotext","pdfinfo"]:["chromium"])await ox(O,X)}return{bun:B,sdk:K,sdkEntry:W,selected:Y,graph:z,projection:V}}async function Xb(X,J,Q,Z,G){try{let Y=G?TJ(G):J,V=G?"definition":J,K=G?await sx(X,G):await nx(X,J),H=jJ(Buffer.from(K.contents.get("routines/bun.lock")).toString("utf8")),W=await FV0(X.root,Y,Z,!!G);if(W.projection.lock!==Buffer.from(K.contents.get("routines/bun.lock")).toString("utf8")||JSON.stringify(W.selected)!==JSON.stringify(JSON.parse(Buffer.from(K.contents.get(`routines/${Y}/package.json`)).toString("utf8"))))return J6();let U=K.contents.size,z=[...K.contents.values()].reduce((O,I)=>O+I.length,0),q=async(O,I)=>{if(++U>p7.files||(z+=I.length)>p7.bytes)return J6();await ax(fH(j6(Q,O)),{recursive:!0,mode:448}),await ix(j6(Q,O),I,{flag:"wx",mode:384})};for(let[O,I]of K.contents)await ax(fH(j6(Q,O)),{recursive:!0,mode:448}),await ix(j6(Q,O),I,{flag:"wx",mode:384});let B=async(O,I)=>{let j=new Map,N=async(A)=>{let R=j6(O,A),S=await vH(R);if(S.isSymbolicLink()||await j1(R)!==R)return J6();if(S.isDirectory()){j.set(R,S);for(let $ of await RV0(R)){if(["node_modules",".git",".bin",".npmrc",".env"].includes($)||$.startsWith(".env."))continue;await N(A?`${A}/${$}`:$)}}else if(S.isFile()&&!A.endsWith(".node"))await q(`${I}/${A}`,await CJ(R));else return J6()};await N("");for(let[A,R]of j){let S=await vH(A);if(R.dev!==S.dev||R.ino!==S.ino||R.mtimeMs!==S.mtimeMs||R.ctimeMs!==S.ctimeMs||await j1(A)!==A)return J6()}};for(let[O,I]of Object.entries(H.packages)){if(I.length===1)continue;let j=W.graph.get(O);if(!j)return J6();await QT(X.root,j,I[0]);let N=qY(O),A=N[0]===W.selected.name&&N.length>1?`routines/${Y}/node_modules/${rx(N.slice(1).join("/"))}`:`routines/node_modules/${rx(O)}`;await B(j,A);let R=await wJ(j6(Q,A,"package.json"));if(`${R.name}@${R.version}`!==I[0])return J6()}await q("routines/node_modules/@oddington/sdk/package.json",await CJ(j6(W.sdk,"package.json")));let M=`routines/node_modules/@oddington/sdk/${W.sdkEntry.slice(2)}`;await q(M,await CJ(j6(W.sdk,W.sdkEntry)));let L=await wJ(j6(Q,"routines/node_modules/@oddington/sdk/package.json"));if(L.name!=="@oddington/sdk"||L.version!==c7)return J6();if(K.contents.has("routines/requirements.lock"))return J6();let T=await Dx(Q,V,K.contents,{bun:W.bun,environment:tx(),timeoutMs:30000,definitionEntry:G});return await q(`routines/${V}/.os-executable/identity.json`,Buffer.from(JSON.stringify({source:K.source.digest,runtime:xx(K.source.declaration),entry:T.entry,sdk:M}))),{entry:T.entry,sdk:M,provenance:K.source.provenance,authoredFiles:K.authoredFiles}}catch(Y){let V=UY(Y);if(V)throw V;throw new I6({code:"workspace_setup",message:"Routine source unavailable: check routines/package.json, the selected routine package.json, and routines/bun.lock.",action:`Use the authoring SDK required by this OS release (${c7}). From routines/, run bun install --frozen-lockfile, then repeat the command.`})}}var mH=268435456,Vb=20000,I5=()=>Error("Local routine source unavailable: use a confined routines/<name>/run.ts, a module routines/package.json with a satisfied Node engine, native TypeScript stripping and an installed SDK. The snapshot supports literal local imports/requires, checkout-local runtime packages and static new URL assets, at most 20,000 files / 256 MiB. Reachable symlinks, native addons, historical runs output, external dependencies and computed source/assets are unsupported."),kJ=(X)=>PV0("sha256").update(X).digest("hex");async function q8(X,J=process.cwd()){if(!/^[a-z0-9][a-z0-9-]{0,62}$/.test(X))throw I5();let Q=await hO(J),Z=async(K)=>(await $5(Q,K,void 0,{localObjectsOnly:!0})).toString().trim(),G=await uH(await Z(["rev-parse","--absolute-git-dir"])),Y=await Z(["config","--get","remote.origin.url"]),V=await Z(["symbolic-ref","HEAD"]);if(!/^https:\/\/github\.com\/[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+(?:\.git)?$/.test(Y)||!V.startsWith("refs/heads/"))throw Error("Local routine requires an exact installed GitHub origin and branch.");return{root:Q,gitDirectory:G,remote:Y,branch:V}}async function OJ(X,J,Q,Z={nodeVersion:process.versions.node,typescript:process.features.typescript},G){if(Z.typescript!=="strip"||!/^[a-z0-9][a-z0-9-]{0,62}$/.test(J))throw I5();let Y=await uH(X.root);if(Y!==X.root)throw I5();if(G||await ex(Y,J))try{await ZT(Q,{recursive:!0,mode:448});let O=await Xb(X,J,Q,Z.nodeVersion,G),I=[],j=async(A)=>{let R=L7(Q,A),S=await KT(R);if(S.isDirectory())for(let $ of await Kb(R))await j(A?`${A}/${$}`:$);else if(S.isFile()&&!S.isSymbolicLink()){let $=await WT(R);I.push({path:A,size:$.length,sha256:kJ($)})}else throw I5()};if(await j(""),I.sort((A,R)=>A.path.localeCompare(R.path,"en")),I.length>Vb||I.reduce((A,R)=>A+R.size,0)>mH)throw I5();let N={...O,files:I,version:`local:${kJ(JSON.stringify(I))}`};return await rX(Q,N),await Qb(Q,320),N}catch(O){throw await Zb(Q,{recursive:!0,force:!0}),O}let V=[],K=new Map,H=new Set,W=0,U=(O)=>{let I=Yb(Y,O).split(VT).join("/");if(Wb(I)||I.split("/").some((j)=>!j||j===".."||j===".git"||j===".bin")||I.startsWith("routines/")&&I.split("/").includes("runs"))throw I5();return I},z=async(O)=>{U(L7(Y,O));let I=K.get(O);if(I)return I;let j=L7(Y,O),N=L7(Q,O);if(await uH(j)!==j)throw I5();let A=await KT(j);if(A.isSymbolicLink()||!A.isFile()||O.endsWith(".node")||V.length>=Vb||A.size>mH)throw I5();let R=await Jb(j,JT.O_RDONLY|JT.O_NOFOLLOW|JT.O_NONBLOCK);try{let S=await R.stat();if(!S.isFile()||S.dev!==A.dev||S.ino!==A.ino||S.size!==A.size||W+S.size>mH)throw I5();let $=Buffer.alloc(S.size),E=0;while(E<$.length){let C=await R.read($,E,Math.min(65536,$.length-E),E);if(!C.bytesRead)throw I5();E+=C.bytesRead}let x=await R.stat();if(x.size!==S.size||x.mtimeMs!==S.mtimeMs||x.ctimeMs!==S.ctimeMs||$.length!==S.size||await uH(j)!==j)throw I5();if(W+=$.length,W>mH)throw I5();await ZT(N1(N),{recursive:!0,mode:448});let w=await Jb(N,"wx",256);try{await w.writeFile($),await w.sync()}finally{await w.close()}return V.push({path:O,sha256:kJ($),size:$.length}),K.set(O,$),$}finally{await R.close()}},q=async(O)=>{let I=U(L7(O,"package.json"));try{return JSON.parse((await z(I)).toString("utf8"))}catch(j){if(j.code==="ENOENT")return;throw j}},B=(O,I)=>{if(typeof O==="string")return I===void 0?O:O.replaceAll("*",I);if(O&&typeof O==="object"&&!Array.isArray(O)){for(let[j,N]of Object.entries(O))if(["node","import","default","node-addons"].includes(j))return B(N,I)}throw I5()},M=async(O,I,j)=>{if(DV0(O))return;if(O.startsWith("./")||O.startsWith("../")){if(/[?#]/.test(O))throw I5();return U(j?GT(I).resolve(O):YT(N1(I),O))}if(!/^(?:@[a-zA-Z0-9_.-]+\/)?[a-zA-Z0-9_.-]+(?:\/[a-zA-Z0-9_./-]+)?$/.test(O))throw I5();let N=O.split("/"),A=N.splice(0,O.startsWith("@")?2:1).join("/");if(N.some((S)=>!S||S==="."||S===".."))throw I5();let R=N1(I);while(!0){let S=L7(R,"node_modules",A),$=await q(S);if($){if(j)return U(GT(I).resolve(O));let E=N.length?`./${N.join("/")}`:".",x;if($.exports!==void 0){let w=$.exports;if(w&&typeof w==="object"&&!Array.isArray(w)&&Object.keys(w).some((D)=>D.startsWith("."))){let D=w;if(Object.hasOwn(D,E))x=B(D[E]);else{let g=Object.keys(D).filter((f)=>f.includes("*")).sort((f,P)=>P.indexOf("*")-f.indexOf("*")||P.length-f.length);for(let f of g){let[P,m]=f.split("*");if(E.startsWith(P)&&E.endsWith(m)&&E.length>=P.length+m.length){x=B(D[f],E.slice(P.length,E.length-m.length));break}}}}else if(E===".")x=B(w);if(!x?.startsWith("./"))throw I5();let C=YT(S,x);if(!C.startsWith(`${S}${VT}`)||Yb(S,C).split(VT).includes("node_modules"))throw I5();return U(C)}return U(GT(I).resolve(O))}if(R===Y)break;R=N1(R)}throw I5()},L,T=async(O)=>{if(H.has(O))return;H.add(O);let I=await z(O);if(Gb(O)===".json"){JSON.parse(I.toString("utf8"));return}if(![".ts",".mts",".cts",".js",".mjs",".cjs"].includes(Gb(O)))throw I5();let j=N1(L7(Y,O));while(!0){if(await q(j))break;if(j===Y)break;j=N1(j)}let N=dX(I.toString("utf8"),O,O===L);for(let A of N.modules){let R=await M(A.specifier,L7(Y,O),A.require);if(R)await T(R)}for(let A of N.assets){if(/[?#]/.test(A))throw I5();await z(U(YT(Y,N1(O),A)))}};try{await ZT(Q,{recursive:!0,mode:448});let O=await q(L7(Y,"routines")),I=`routines/${J}/run.ts`;if(!Ex(O,Z))throw I5();if(L=await M("@oddington/sdk",L7(Y,I),!1),!L)throw I5();await T(L),await T(I),V.sort((A,R)=>A.path.localeCompare(R.path,"en"));let j=await FH(Y,K),N={entry:I,sdk:L,files:V,version:`local:${kJ(JSON.stringify(V))}`,provenance:j};return await rX(Q,N),await Qb(Q,320),N}catch(O){throw await Zb(Q,{recursive:!0,force:!0}),O instanceof Error&&O.message.startsWith("Local routine source unavailable:")?O:I5()}}async function rX(X,J){if(J.version!==`local:${kJ(JSON.stringify(J.files))}`)throw I5();let Q=[],Z=async(Y)=>{let V=L7(X,Y),K=await KT(V);if(K.isSymbolicLink())throw I5();if(K.isDirectory())for(let H of await Kb(V))await Z(Y?`${Y}/${H}`:H);else if(K.isFile())Q.push(Y);else throw I5()};if(await Z(""),Q.length!==J.files.length)throw I5();for(let Y of J.files){if(Wb(Y.path)||Y.path.split("/").some((K)=>!K||K==="."||K==="..")||!Q.includes(Y.path))throw I5();let V=await WT(L7(X,Y.path));if(V.length!==Y.size||kJ(V)!==Y.sha256)throw I5()}let G=J.files.filter((Y)=>/^routines\/[a-z0-9-]+\/\.os-executable\/identity\.json$/.test(Y.path));if(G.length){if(G.length!==1)throw I5();let Y=JSON.parse(await WT(L7(X,G[0].path),"utf8"));if(J.entry!==Y.entry||J.sdk!==Y.sdk||Y.entry!==G[0].path.replace(/identity\.json$/,"run.mjs"))throw I5()}}function Hb(X){let J=[],Q=new Set;for(let Z=X;Z instanceof Error&&!Q.has(Z)&&J.length<4;Z=Z.cause){Q.add(Z);let G=Z.constructor.name,Y=["Error","TypeError","SyntaxError","RecordValidationError","DataOperationError","UnsafeCacheResource","IndexRuntimeCapacityError","GitCommandError"].includes(G)?G:"Error",V=Z.code;J.push({kind:Y,...["ENOENT","EACCES","EPERM","EEXIST","ENOTEMPTY","ENOTDIR","EISDIR","EMFILE","ENFILE","ENOSPC","EIO","EBUSY","ECONNRESET","ECONNREFUSED"].includes(V??"")?{code:V}:{}})}return J}import{lstat as yV0,mkdir as xV0,realpath as bV0}from"node:fs/promises";import{userInfo as gV0}from"node:os";import{dirname as Ub,isAbsolute as hV0,join as HT,resolve as vV0}from"node:path";function t8(X,J={}){if(!/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(X)||X.length>63)throw Error("Invalid local workspace");let Q=(J.homeDirectory??(()=>gV0().homedir))();if(!hV0(Q)||vV0(Q)!==Q)throw Error("Unsafe local home directory");let Z=HT(Q,".os",X);return{files:HT(Z,"files"),runs:HT(Z,"runs")}}async function M9(X,J=!1){let Q=[];for(let Z=X;Z!==Ub(Z);Z=Ub(Z))Q.unshift(Z);for(let Z of Q){if(J)await xV0(Z,{mode:448}).catch((Y)=>{if(Y.code!=="EEXIST")throw Y});let G=await yV0(Z);if(!G.isDirectory()||G.isSymbolicLink())throw Error("Unsafe local state directory")}if(await bV0(X)!==X)throw Error("Unsafe local state directory");return X}var BY=(X)=>fV0("sha256").update(X).digest("hex"),A1=(X,J)=>$5(X,J,void 0,{localObjectsOnly:!0}),e8=async(X,J)=>(await A1(X,J)).toString().trim(),Bb=67108864;async function O7(X){if((await LY(X)).isSymbolicLink())throw Error("Unsafe local Run state");let J=await lH(X,zb.O_RDONLY|(zb.O_NOFOLLOW??0));try{let Q=await J.stat();if(!Q.isFile()||Q.nlink>1)throw Error("Unsafe local Run state");if(Q.size>Bb)throw Error("Local Run state exceeds 64 MiB");let Z=Buffer.alloc(Q.size+1),G=0;while(G<Z.length){let Y=await J.read(Z,G,Z.length-G,G);if(!Y.bytesRead)break;G+=Y.bytesRead}if(G!==Q.size)throw Error("Local Run state changed while reading");return new TextDecoder("utf-8",{fatal:!0}).decode(Z.subarray(0,G))}finally{await J.close()}}async function MT(X=process.platform,J={mkdtemp:pV0,chmod:qT,rm:cH}){if(X==="win32")return{kind:"tcp",listenOptions:{host:"127.0.0.1",port:0},async release(){}};let Q=await J.mkdtemp(p6(dV0(),"os-local-")),Z=()=>J.rm(Q,{recursive:!0,force:!0});try{await J.chmod(Q,448)}catch(G){throw await Z(),G}return{kind:"socket",address:p6(Q,"transport.sock"),release:Z}}async function TY(X,J){let Q=JSON.stringify(J,null,2);if(Buffer.byteLength(Q)>Bb)throw Error("Local Run state exceeds 64 MiB");let Z=`${X}.${crypto.randomUUID()}.tmp`,G=await lH(Z,"wx",384);try{await G.writeFile(Q),await G.sync()}finally{await G.close()}if(await cV0(Z,X),process.platform==="win32")return;let Y=await lH(Mb(X),"r");try{await Y.sync()}finally{await Y.close()}}var pH=TY;async function Lb(X,J,Q){let Z=Q.createIndexOwner??tW,G=V9(structuredClone(J)),Y=Q.workspaceName,V=Q.expiresAt===void 0?1/0:Date.parse(Q.expiresAt),K=()=>{if(!(V>Date.now())||Q.authoritySignal?.aborted)throw Error("Preparation capability expired")};K();let H=await MY(X);if(await MY(await e8(H,["rev-parse","--show-toplevel"]))!==H)throw Error("Preparation requires the matched repository root");let W=await MY(await e8(H,["rev-parse","--absolute-git-dir"])),U=await e8(H,["rev-parse","--verify","HEAD^{commit}"]),z=await e8(H,["symbolic-ref","HEAD"]),q=await e8(H,["config","--get","remote.origin.url"]),B=Q.sourceBinding&&structuredClone(Q.sourceBinding),M=(o)=>o.replace(/\.git$/,"").toLowerCase();if(B&&(M(B.remote)!==M(q)||!Number.isSafeInteger(B.githubRepositoryId)||B.githubRepositoryId<=0))throw Error("Checkout does not match its verified source repository");let L=G.repositories.filter((o)=>B?o.target.githubRepositoryId===B.githubRepositoryId:o.target.remote===q&&o.target.targetRef===z),T=Q.runId!==void 0&&G.deploymentId===null&&!G.repositories.length;if(!L.length&&!T)throw Error("Checkout does not match an installed data repository");let O=await Promise.all(L.map(async(o)=>{let T0=o.published?.sourceVersion;if(!T0)throw Error("Exact published repository base unavailable");return await A1(H,["cat-file","-e",`${T0}^{commit}`]),{repository:o.target.repository,baseCommit:T0,proposedCommit:T0}}));for(let o of L){let T0=L.filter((I0)=>I0.target.githubRepositoryId===o.target.githubRepositoryId&&I0.target.targetRef===o.target.targetRef);if(new Set(T0.map((I0)=>I0.published.sourceVersion)).size!==1)throw Error("Conflicting published bases for repository aliases")}let I=t8(G.workspace,Q).runs,j=p6(I,"preparing.lock"),N=!1,A=!1,R=!1,S=!1,$=Q.runId??crypto.randomUUID(),E=p6(I,$),x=p6(E,"history.git"),w=p6(E,"preparation.json"),C,D,g=!0,f=!1,P=!1,m=Promise.resolve(),v,a=new Map,X0=QH(Q.acquireHistory??(async()=>{throw new Y0("unavailable",!0)})),z0=new Map(L.flatMap((o)=>o.published?[[o.target.repository,{...o.published}]]:[])),G0=!1,e,s,t,U0=()=>{G0=!0,X0.invalidate(),clearTimeout(e),clearTimeout(s)},k=(o)=>{if(!cK(o,G))return!1;for(let T0 of o.repositories)if(T0.published&&z0.has(T0.target.repository)&&!$1(T0.published,z0.get(T0.target.repository)))U0();return!0},b=()=>{if(t)return t;if(!g||G0)return Promise.resolve();return t=(async()=>{try{let o=V9(await Q.recheck());if(!k(o))U0()}catch(o){if(o instanceof Y0&&o.code==="access_denied")U0()}finally{if(!(V>Date.now()))U0();t=void 0}})(),t},h=()=>{if(e||!g||G0)return;e=setTimeout(()=>{e=void 0,b().finally(h)},Math.min(30000,V-Date.now())),e.unref?.()},y={format:1,id:$,state:"preparing",authority:G,checkout:{root:H,gitDirectory:W,head:U,branch:z,remote:q,...B?{githubRepositoryId:B.githubRepositoryId}:{}},repositories:O,paths:[],steps:[]},l,r=()=>l??=R1({root:t8(G.workspace,Q).files,storage:"local"},{context:Q.recheck,workspace:G.workspace,runId:$,capability:"",expiresAt:Q.expiresAt??new Date(8640000000000000).toISOString(),...Q.authoritySignal?{authorityLease:{context:G,signal:Q.authoritySignal}}:{}});try{let o=()=>A?pH(w,y):Promise.resolve(),T0=async(K0=!1)=>{if(K(),K0&&await e8(H,["rev-parse","HEAD"])!==U||await e8(H,["symbolic-ref","HEAD"])!==z||await e8(H,["config","--get","remote.origin.url"])!==q||await MY(await e8(H,["rev-parse","--show-toplevel"]))!==H||await MY(await e8(H,["rev-parse","--absolute-git-dir"]))!==W)throw Error("Checkout binding changed during preparation")},I0=async()=>{if(K(),!Q.authoritySignal){let K0=V9(await Q.recheck());if(!k(K0))throw U0(),Error("Preparation authority changed; rerun after repair")}await T0(!0)},R0=async(K0=!1)=>{if(await I0(),K0&&!R){for(let Q0 of L)if((Q.authoritativeHead?await Q.authoritativeHead(Q0.target.remote,Q0.target.targetRef):(await e8(H,["ls-remote","--exit-code","--refs","--",Q0.target.remote,Q0.target.targetRef])).split(/\s+/)[0])!==O.find((j0)=>j0.repository===Q0.target.repository).baseCommit)throw Error("Repository is not at its authoritative base; refresh it before preparing");R=!0}if(A)return;await M9(I,!0),await qT(I,448);let c=await lH(j,"wx",384).catch(()=>{throw Error(`Preparation ownership unavailable: inspect ${j}`)});N=!0;try{await c.writeFile(JSON.stringify({run:$,pid:process.pid,root:H})),await c.sync()}finally{await c.close()}if(await I0(),await UT(E,{mode:448,recursive:Q.runId!==void 0}),(await LY(E)).isSymbolicLink())throw Error("Unsafe local Run directory");A=!0,await o()},r0=async()=>{if(S)return;await UT(x),await A1(x,["init","--bare","--quiet"]);let K0=await e8(H,["rev-parse","--path-format=absolute","--git-path","objects"]);if(/[\r\n]/.test(K0))throw Error("Unsafe local object directory");await zT(p6(x,"objects/info/alternates"),`${K0}
334
+ `)}`:""}`,action:"Check the exported defineRoutine id and the definitions listed above."})}return Y}var gH=(X)=>MV0("sha256").update(X).digest("hex"),s5=(X)=>{throw Error(`Routine deployment source unavailable: ${X}`)};async function dx(X,J,Q,Z){let G=await T1(X.root,J,Q,Z);return{...await tO(X,TJ(G.entry),G),definition:G}}async function nx(X,J){return tO(X,J)}async function sx(X,J){return tO(X,TJ(J),void 0,J)}async function tO(X,J,Q,Z=Q?.entry){if(!sX(J))s5("invalid routine directory");let G=await EJ(X.root);if(G!==X.root)s5("worktree must be canonical");let Y=new Map,V=new Map,K=0,H=async(w)=>{if(V.has(w))return;let C=X3(G,w),D=await I1(C);if(!D.isDirectory()||await EJ(C)!==C)s5(`symlink directory ${w}`);if(V.set(w,{dev:D.dev,ino:D.ino,size:D.size,mtimeMs:D.mtimeMs,ctimeMs:D.ctimeMs}),w!=="routines")await H(zY(w))},W=async(w,C=!1)=>{if(!(C?["routines/package.json","routines/bun.lock","routines/requirements.lock",`routines/${J}/package.json`].includes(w):XY(w)))s5(`ineligible path ${w}`);let D=Y.get(w);if(D)return D.bytes;await H(zY(w));let g=X3(G,w);if(await EJ(g)!==g)s5(`symlink ${w}`);let f=await I1(g);if(!f.isFile()||Y.size>=p7.files||K+f.size>p7.bytes)s5(`source limits or non-file ${w}`);let P=await BV0(g,rO.O_RDONLY|rO.O_NOFOLLOW|rO.O_NONBLOCK);try{let m=await P.stat();if(!m.isFile()||m.dev!==f.dev||m.ino!==f.ino||m.size!==f.size)s5(`changed ${w}`);let v=Buffer.alloc(m.size),a=0;while(a<v.length){let z0=await P.read(v,a,Math.min(65536,v.length-a),a);if(!z0.bytesRead)s5(`changed ${w}`);a+=z0.bytesRead}let X0=await P.stat();if(m.size!==X0.size||m.mtimeMs!==X0.mtimeMs||m.ctimeMs!==X0.ctimeMs)s5(`changed ${w}`);return Y.set(w,{bytes:v,dev:m.dev,ino:m.ino,size:m.size,mtimeMs:m.mtimeMs,ctimeMs:m.ctimeMs}),K+=v.length,v}finally{await P.close()}},U=async(w,C=!1)=>{try{await I1(X3(G,w))}catch(D){if(D.code==="ENOENT")return;throw D}return W(w,C)},z=Q?Cx(Q.contract):Z?U8({$schema:H8}):await(async()=>{let w=await W(`routines/${J}/routine.json`);if(w.length>p7.declarationBytes)s5("declaration exceeds 64 KiB");return U8(JSON.parse(w.toString("utf8")))})(),q=(await W("routines/package.json",!0)).toString("utf8"),B=(await W("routines/bun.lock",!0)).toString("utf8"),M=await U(`routines/${J}/package.json`,!0),L=M!==void 0||Object.hasOwn(JSON.parse(q),"workspaces");if(Z&&!M)s5("selected workspace manifest missing");let T=L?ZY(q,M?.toString("utf8")??s5("selected workspace manifest missing"),B,J):void 0,O=T?.dependencies??pO(q,B),I=!Z&&(!L||z.runtime.features.includes("python"))?await U("routines/requirements.lock",!0):void 0;if(I){if(!z.runtime.features.includes("python"))s5("requirements.lock requires python feature");cO(I.toString("utf8"))}let j=new Set,N=(w,C)=>{if(/[?#\\]/.test(C))s5(`unsupported import in ${w}`);let D=TV0(G,IV0(G,zY(w),C)).split(jV0).join("/");if(!XY(D))s5(`escaped or ineligible import in ${w}`);return D},A=async(w)=>{if(j.has(w))return;j.add(w);let C=await W(w);if(oO(w)===".json"){JSON.parse(C.toString("utf8"));return}if(![".ts",".mts",".cts",".js",".mjs",".cjs"].includes(oO(w)))s5(`unsupported module ${w}`);let D=dX(C.toString("utf8"),w,!1);for(let{specifier:g}of D.modules){if(OV0(g))continue;if(g.startsWith("./")||g.startsWith("../")){let f=N(w,g);if(!oO(f)){let P=[];for(let m of[".ts",".js",".json",".mts",".mjs",".cts",".cjs"])if(await U(`${f}${m}`))P.push(`${f}${m}`);if(P.length!==1)s5(`missing or ambiguous import in ${w}`);f=P[0]}await A(f)}else{if(!/^(?:@[a-z0-9_.-]+\/)?[a-z0-9][a-z0-9_.-]*(?:\/[a-zA-Z0-9_.-]+)*$/.test(g)||g.split("/").some((P)=>P==="."||P===".."))s5(`unsupported package import in ${w}`);let f=g.split("/").slice(0,g.startsWith("@")?2:1).join("/");if(f==="@oddington/sdk"?g!==f:!O.has(f))s5(`undeclared or incompatible package ${g}`)}}for(let g of D.assets)await W(N(w,g))};if(await A(Z??`routines/${J}/run.ts`),!Z&&await U(`routines/${J}/responses.ts`))await A(`routines/${J}/responses.ts`);for(let w of z.assets){let C=`routines/${J}`,D=w.split("/"),g=async(f,P)=>{let m;try{m=await I1(X3(G,f))}catch(X0){if(X0.code==="ENOENT")return;throw X0}if(m.isSymbolicLink())s5(`symlink asset ${f}`);let v=D[P];if(!v){await W(f);return}if(!m.isDirectory())return;if(!v.includes("*")){await g(`${f}/${v}`,P+1);return}if(!XY(`${f}/asset`)||await EJ(X3(G,f))!==X3(G,f))s5(`ineligible asset directory ${f}`);if(await H(f),v==="**"&&P+1<D.length)await g(f,P+1);let a=new RegExp(`^${v.replace(/[.]/g,"\\.").replace(/\*/g,".*")}$`);for(let X0 of await LV0(X3(G,f),{withFileTypes:!0})){if(X0.name==="node_modules"||X0.name==="runs"||X0.name.startsWith("."))continue;if(v!=="**"&&!a.test(X0.name))continue;let z0=`${f}/${X0.name}`;if(X0.isSymbolicLink())s5(`symlink asset ${z0}`);if(v==="**"){if(X0.isDirectory())await g(z0,P);else if(P===D.length-1)await W(z0)}else await g(z0,P+1)}};await g(C,0)}let R=new Set;for(let w of Y.keys()){let C=zY(w);while(C!=="routines")R.add(C),C=zY(C)}for(let w of R){if(L&&w===`routines/${J}`)continue;try{await I1(X3(G,w,"package.json")),s5(`ambiguous package root ${w}`)}catch(C){if(C.code!=="ENOENT")throw C}}for(let[w,C]of Y){let D=X3(G,w),g=await I1(D);if(await EJ(D)!==D||g.dev!==C.dev||g.ino!==C.ino||g.size!==C.size||g.mtimeMs!==C.mtimeMs||g.ctimeMs!==C.ctimeMs)s5(`changed during collection ${w}`)}for(let[w,C]of V){let D=X3(G,w),g=await I1(D);if(await EJ(D)!==D||g.dev!==C.dev||g.ino!==C.ino||g.mtimeMs!==C.mtimeMs||g.ctimeMs!==C.ctimeMs)s5(`directory changed during collection ${w}`)}let S=new Map([...Y].map(([w,C])=>[w,C.bytes]));if(Q){let w=new Map((Q.source.authoredFiles??Q.source.files).map((C)=>[C.path,C]));for(let[C,D]of S)if(w.get(C)?.sha256!==gH(D))s5("definition changed after inspection")}let $=new Map(S);if(T)$.set("routines/package.json",Buffer.from(T.manifest)),$.set("routines/bun.lock",Buffer.from(T.lock));let E=[...$].map(([w,C])=>({path:w,size:C.length,sha256:gH(C)})).sort((w,C)=>w.path<C.path?-1:w.path>C.path?1:0),x=await FH(G,S);return{source:{digest:gH(JSON.stringify(E)),declaration:z,files:E,provenance:x,...Q?{definition:{entry:Q.entry,contract:Q.contract}}:{}},contents:$,authoredFiles:[...S].map(([w,C])=>({path:w,size:C.length,sha256:gH(C)}))}}var J6=()=>{throw Error("Local routine source unavailable: modern routines require valid frozen workspace metadata, Bun 1.3.14, a compatible installed authoring SDK and the selected installed runtime graph. Run ordinary workspace setup before launch; launch never installs dependencies.")},tx=()=>({PATH:process.env.PATH});async function CJ(X,J=p7.bytes){if(await j1(X)!==X)return J6();let Q=await AV0(X,hH.O_RDONLY|hH.O_NOFOLLOW|hH.O_NONBLOCK);try{let Z=await Q.stat();if(!Z.isFile()||Z.size>J)return J6();let G=Buffer.alloc(Z.size+1),{bytesRead:Y}=await Q.read(G,0,G.length,0),V=await Q.stat();if(Y!==Z.size||Z.size!==V.size||Z.mtimeMs!==V.mtimeMs||Z.ctimeMs!==V.ctimeMs||await j1(X)!==X)return J6();return G.subarray(0,Y)}finally{await Q.close()}}var wJ=async(X)=>JSON.parse((await CJ(X,1048576)).toString("utf8"));async function ex(X,J){try{return await vH(j6(X,"routines",J,"package.json")),!0}catch(Q){if(Q.code==="ENOENT")return!1;throw Q}}var qY=(X)=>X.match(/@[^/]+\/[^/]+|[^/]+/g),rx=(X)=>qY(X).join("/node_modules/");async function QT(X,J,Q){let Z=await j1(J),G=EV0(X,Z).split(_H);if(G[0]===".."||!G.includes("node_modules"))return J6();let Y=await wJ(j6(Z,"package.json"));if(`${Y.name}@${Y.version}`!==Q)return J6();return{directory:Z,info:Y}}async function eO(X,J,Q,Z){let G=J;for(;;){let Y=j6(G,"node_modules",Q),V=!1;try{await vH(Y),V=!0}catch(K){if(K.code!=="ENOENT")throw K}if(V)return await QT(X,Y,Z);if(G===X)return J6();if(G=fH(G),!G.startsWith(`${X}${_H}`)&&G!==X)return J6()}}function kV0(X,J=process.env.PATH??"",Q=process.platform){let Z=Q==="win32"?CV0:SV0,G=Q==="win32"?`${X}.exe`:X;return J.split(Z.delimiter).filter(Z.isAbsolute).map((Y)=>Z.join(Y,G))}async function ox(X,J,Q=process.env.PATH){for(let Z of kV0(X,Q))try{if(Z.startsWith(`${J}${_H}`))continue;await $V0(Z,hH.X_OK);let G=await j1(Z);if(!G.startsWith(`${J}${_H}`))return G}catch{}throw new I6({code:"runtime_missing",message:`Required runtime "${X}" was not found outside this checkout.`,action:X==="bun"?`Install Bun ${v3}: npm install --global bun@${v3}. Then repeat the command.`:`Install ${X} on this computer and add it to PATH, then repeat the command.`})}async function FV0(X,J,Q,Z=!1){if(!sX(J)||await j1(X)!==X)return J6();let G=await wJ(j6(X,"routines/package.json")),Y=await wJ(j6(X,"routines",J,"package.json")),V=ZY(JSON.stringify(G),JSON.stringify(Y),(await CJ(j6(X,"routines/bun.lock"))).toString("utf8"),J);if(Y.engines?.node&&!XT.satisfies(Q,Y.engines.node))return J6();if(G.devDependencies?.["@oddington/sdk"]!==c7)return J6();let{directory:K,info:H}=await QT(X,j6(X,"routines/node_modules/@oddington/sdk"),`@oddington/sdk@${c7}`),W=typeof H.exports==="string"?H.exports:H.exports?.["."]?.import;if(H.type!=="module"||!["./index.js","./dist/index.js"].includes(W)||H.engines?.node&&!XT.satisfies(Q,H.engines.node))return J6();await CJ(j6(K,W));let U=jJ(V.lock).packages,z=new Map;for(let[L,T]of Object.entries(U).sort(([O],[I])=>qY(O).length-qY(I).length)){if(T.length===1)continue;let O=qY(L),I=O.slice(0,-1).join("/"),j=!I?j6(X,"routines"):I===Y.name?j6(X,"routines",J):z.get(I)??J6(),N=await eO(X,j,O.at(-1),T[0]);for(let A of["dependencies","optionalDependencies","peerDependencies"]){let R=(S={})=>JSON.stringify(Object.entries(S).sort(([$],[E])=>$.localeCompare(E)));if(R(N.info[A])!==R(T[2][A]))return J6()}z.set(L,N.directory)}let q=async(L,T,O)=>{for(let I of Object.keys(O)){if(I==="@oddington/sdk"){if((await eO(X,T,I,`@oddington/sdk@${c7}`)).directory!==K)return J6();continue}let j=uO(U,L,I);if(j&&(await eO(X,T,I,U[j][0])).directory!==z.get(j))return J6()}};await q(Y.name,j6(X,"routines",J),Y.dependencies??{});for(let[L,T]of z){let O=U[L][2];await q(L,T,{...O.peerDependencies,...O.dependencies,...O.optionalDependencies})}let B=await ox("bun",X),M;try{M=(await wV0(NV0)(B,["--version"],{cwd:fH(B),env:tx(),timeout:1e4,maxBuffer:4096})).stdout.trim()}catch{}if(M!==v3)throw new I6({code:"runtime_version",message:`This OS release needs Bun ${v3}; ${typeof M==="string"&&/^\d+\.\d+\.\d+$/.test(M)?`found ${M}`:"the installed Bun version could not be verified"}.`,action:`Install the required runtime: npm install --global bun@${v3}. Then repeat the command.`});if(!Z){let L=U8(await wJ(j6(X,"routines",J,"routine.json")));for(let T of L.runtime.features)for(let O of T==="python"?["python3"]:T==="documents"?["pdftotext","pdfinfo"]:["chromium"])await ox(O,X)}return{bun:B,sdk:K,sdkEntry:W,selected:Y,graph:z,projection:V}}async function Xb(X,J,Q,Z,G){try{let Y=G?TJ(G):J,V=G?"definition":J,K=G?await sx(X,G):await nx(X,J),H=jJ(Buffer.from(K.contents.get("routines/bun.lock")).toString("utf8")),W=await FV0(X.root,Y,Z,!!G);if(W.projection.lock!==Buffer.from(K.contents.get("routines/bun.lock")).toString("utf8")||JSON.stringify(W.selected)!==JSON.stringify(JSON.parse(Buffer.from(K.contents.get(`routines/${Y}/package.json`)).toString("utf8"))))return J6();let U=K.contents.size,z=[...K.contents.values()].reduce((O,I)=>O+I.length,0),q=async(O,I)=>{if(++U>p7.files||(z+=I.length)>p7.bytes)return J6();await ax(fH(j6(Q,O)),{recursive:!0,mode:448}),await ix(j6(Q,O),I,{flag:"wx",mode:384})};for(let[O,I]of K.contents)await ax(fH(j6(Q,O)),{recursive:!0,mode:448}),await ix(j6(Q,O),I,{flag:"wx",mode:384});let B=async(O,I)=>{let j=new Map,N=async(A)=>{let R=j6(O,A),S=await vH(R);if(S.isSymbolicLink()||await j1(R)!==R)return J6();if(S.isDirectory()){j.set(R,S);for(let $ of await RV0(R)){if(["node_modules",".git",".bin",".npmrc",".env"].includes($)||$.startsWith(".env."))continue;await N(A?`${A}/${$}`:$)}}else if(S.isFile()&&!A.endsWith(".node"))await q(`${I}/${A}`,await CJ(R));else return J6()};await N("");for(let[A,R]of j){let S=await vH(A);if(R.dev!==S.dev||R.ino!==S.ino||R.mtimeMs!==S.mtimeMs||R.ctimeMs!==S.ctimeMs||await j1(A)!==A)return J6()}};for(let[O,I]of Object.entries(H.packages)){if(I.length===1)continue;let j=W.graph.get(O);if(!j)return J6();await QT(X.root,j,I[0]);let N=qY(O),A=N[0]===W.selected.name&&N.length>1?`routines/${Y}/node_modules/${rx(N.slice(1).join("/"))}`:`routines/node_modules/${rx(O)}`;await B(j,A);let R=await wJ(j6(Q,A,"package.json"));if(`${R.name}@${R.version}`!==I[0])return J6()}await q("routines/node_modules/@oddington/sdk/package.json",await CJ(j6(W.sdk,"package.json")));let M=`routines/node_modules/@oddington/sdk/${W.sdkEntry.slice(2)}`;await q(M,await CJ(j6(W.sdk,W.sdkEntry)));let L=await wJ(j6(Q,"routines/node_modules/@oddington/sdk/package.json"));if(L.name!=="@oddington/sdk"||L.version!==c7)return J6();if(K.contents.has("routines/requirements.lock"))return J6();let T=await Dx(Q,V,K.contents,{bun:W.bun,environment:tx(),timeoutMs:30000,definitionEntry:G});return await q(`routines/${V}/.os-executable/identity.json`,Buffer.from(JSON.stringify({source:K.source.digest,runtime:xx(K.source.declaration),entry:T.entry,sdk:M}))),{entry:T.entry,sdk:M,provenance:K.source.provenance,authoredFiles:K.authoredFiles}}catch(Y){let V=UY(Y);if(V)throw V;throw new I6({code:"workspace_setup",message:"Routine source unavailable: check routines/package.json, the selected routine package.json, and routines/bun.lock.",action:`Use the authoring SDK required by this OS release (${c7}). From routines/, run bun install --frozen-lockfile, then repeat the command.`})}}var mH=268435456,Vb=20000,I5=()=>Error("Local routine source unavailable: use a confined routines/<name>/run.ts, a module routines/package.json with a satisfied Node engine, native TypeScript stripping and an installed SDK. The snapshot supports literal local imports/requires, checkout-local runtime packages and static new URL assets, at most 20,000 files / 256 MiB. Reachable symlinks, native addons, historical runs output, external dependencies and computed source/assets are unsupported."),kJ=(X)=>PV0("sha256").update(X).digest("hex");async function q8(X,J=process.cwd()){if(!/^[a-z0-9][a-z0-9-]{0,62}$/.test(X))throw I5();let Q=await hO(J),Z=async(K)=>(await $5(Q,K,void 0,{localObjectsOnly:!0})).toString().trim(),G=await uH(await Z(["rev-parse","--absolute-git-dir"])),Y=await Z(["config","--get","remote.origin.url"]),V=await Z(["symbolic-ref","HEAD"]);if(!/^https:\/\/github\.com\/[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+(?:\.git)?$/.test(Y)||!V.startsWith("refs/heads/"))throw Error("Local routine requires an exact installed GitHub origin and branch.");return{root:Q,gitDirectory:G,remote:Y,branch:V}}async function OJ(X,J,Q,Z={nodeVersion:process.versions.node,typescript:process.features.typescript},G){if(Z.typescript!=="strip"||!/^[a-z0-9][a-z0-9-]{0,62}$/.test(J))throw I5();let Y=await uH(X.root);if(Y!==X.root)throw I5();if(G||await ex(Y,J))try{await ZT(Q,{recursive:!0,mode:448});let O=await Xb(X,J,Q,Z.nodeVersion,G),I=[],j=async(A)=>{let R=L7(Q,A),S=await KT(R);if(S.isDirectory())for(let $ of await Kb(R))await j(A?`${A}/${$}`:$);else if(S.isFile()&&!S.isSymbolicLink()){let $=await WT(R);I.push({path:A,size:$.length,sha256:kJ($)})}else throw I5()};if(await j(""),I.sort((A,R)=>A.path.localeCompare(R.path,"en")),I.length>Vb||I.reduce((A,R)=>A+R.size,0)>mH)throw I5();let N={...O,files:I,version:`local:${kJ(JSON.stringify(I))}`};return await rX(Q,N),await Qb(Q,320),N}catch(O){throw await Zb(Q,{recursive:!0,force:!0}),O}let V=[],K=new Map,H=new Set,W=0,U=(O)=>{let I=Yb(Y,O).split(VT).join("/");if(Wb(I)||I.split("/").some((j)=>!j||j===".."||j===".git"||j===".bin")||I.startsWith("routines/")&&I.split("/").includes("runs"))throw I5();return I},z=async(O)=>{U(L7(Y,O));let I=K.get(O);if(I)return I;let j=L7(Y,O),N=L7(Q,O);if(await uH(j)!==j)throw I5();let A=await KT(j);if(A.isSymbolicLink()||!A.isFile()||O.endsWith(".node")||V.length>=Vb||A.size>mH)throw I5();let R=await Jb(j,JT.O_RDONLY|JT.O_NOFOLLOW|JT.O_NONBLOCK);try{let S=await R.stat();if(!S.isFile()||S.dev!==A.dev||S.ino!==A.ino||S.size!==A.size||W+S.size>mH)throw I5();let $=Buffer.alloc(S.size),E=0;while(E<$.length){let C=await R.read($,E,Math.min(65536,$.length-E),E);if(!C.bytesRead)throw I5();E+=C.bytesRead}let x=await R.stat();if(x.size!==S.size||x.mtimeMs!==S.mtimeMs||x.ctimeMs!==S.ctimeMs||$.length!==S.size||await uH(j)!==j)throw I5();if(W+=$.length,W>mH)throw I5();await ZT(N1(N),{recursive:!0,mode:448});let w=await Jb(N,"wx",256);try{await w.writeFile($),await w.sync()}finally{await w.close()}return V.push({path:O,sha256:kJ($),size:$.length}),K.set(O,$),$}finally{await R.close()}},q=async(O)=>{let I=U(L7(O,"package.json"));try{return JSON.parse((await z(I)).toString("utf8"))}catch(j){if(j.code==="ENOENT")return;throw j}},B=(O,I)=>{if(typeof O==="string")return I===void 0?O:O.replaceAll("*",I);if(O&&typeof O==="object"&&!Array.isArray(O)){for(let[j,N]of Object.entries(O))if(["node","import","default","node-addons"].includes(j))return B(N,I)}throw I5()},M=async(O,I,j)=>{if(DV0(O))return;if(O.startsWith("./")||O.startsWith("../")){if(/[?#]/.test(O))throw I5();return U(j?GT(I).resolve(O):YT(N1(I),O))}if(!/^(?:@[a-zA-Z0-9_.-]+\/)?[a-zA-Z0-9_.-]+(?:\/[a-zA-Z0-9_./-]+)?$/.test(O))throw I5();let N=O.split("/"),A=N.splice(0,O.startsWith("@")?2:1).join("/");if(N.some((S)=>!S||S==="."||S===".."))throw I5();let R=N1(I);while(!0){let S=L7(R,"node_modules",A),$=await q(S);if($){if(j)return U(GT(I).resolve(O));let E=N.length?`./${N.join("/")}`:".",x;if($.exports!==void 0){let w=$.exports;if(w&&typeof w==="object"&&!Array.isArray(w)&&Object.keys(w).some((D)=>D.startsWith("."))){let D=w;if(Object.hasOwn(D,E))x=B(D[E]);else{let g=Object.keys(D).filter((f)=>f.includes("*")).sort((f,P)=>P.indexOf("*")-f.indexOf("*")||P.length-f.length);for(let f of g){let[P,m]=f.split("*");if(E.startsWith(P)&&E.endsWith(m)&&E.length>=P.length+m.length){x=B(D[f],E.slice(P.length,E.length-m.length));break}}}}else if(E===".")x=B(w);if(!x?.startsWith("./"))throw I5();let C=YT(S,x);if(!C.startsWith(`${S}${VT}`)||Yb(S,C).split(VT).includes("node_modules"))throw I5();return U(C)}return U(GT(I).resolve(O))}if(R===Y)break;R=N1(R)}throw I5()},L,T=async(O)=>{if(H.has(O))return;H.add(O);let I=await z(O);if(Gb(O)===".json"){JSON.parse(I.toString("utf8"));return}if(![".ts",".mts",".cts",".js",".mjs",".cjs"].includes(Gb(O)))throw I5();let j=N1(L7(Y,O));while(!0){if(await q(j))break;if(j===Y)break;j=N1(j)}let N=dX(I.toString("utf8"),O,O===L);for(let A of N.modules){let R=await M(A.specifier,L7(Y,O),A.require);if(R)await T(R)}for(let A of N.assets){if(/[?#]/.test(A))throw I5();await z(U(YT(Y,N1(O),A)))}};try{await ZT(Q,{recursive:!0,mode:448});let O=await q(L7(Y,"routines")),I=`routines/${J}/run.ts`;if(!Ex(O,Z))throw I5();if(L=await M("@oddington/sdk",L7(Y,I),!1),!L)throw I5();await T(L),await T(I),V.sort((A,R)=>A.path.localeCompare(R.path,"en"));let j=await FH(Y,K),N={entry:I,sdk:L,files:V,version:`local:${kJ(JSON.stringify(V))}`,provenance:j};return await rX(Q,N),await Qb(Q,320),N}catch(O){throw await Zb(Q,{recursive:!0,force:!0}),O instanceof Error&&O.message.startsWith("Local routine source unavailable:")?O:I5()}}async function rX(X,J){if(J.version!==`local:${kJ(JSON.stringify(J.files))}`)throw I5();let Q=[],Z=async(Y)=>{let V=L7(X,Y),K=await KT(V);if(K.isSymbolicLink())throw I5();if(K.isDirectory())for(let H of await Kb(V))await Z(Y?`${Y}/${H}`:H);else if(K.isFile())Q.push(Y);else throw I5()};if(await Z(""),Q.length!==J.files.length)throw I5();for(let Y of J.files){if(Wb(Y.path)||Y.path.split("/").some((K)=>!K||K==="."||K==="..")||!Q.includes(Y.path))throw I5();let V=await WT(L7(X,Y.path));if(V.length!==Y.size||kJ(V)!==Y.sha256)throw I5()}let G=J.files.filter((Y)=>/^routines\/[a-z0-9-]+\/\.os-executable\/identity\.json$/.test(Y.path));if(G.length){if(G.length!==1)throw I5();let Y=JSON.parse(await WT(L7(X,G[0].path),"utf8"));if(J.entry!==Y.entry||J.sdk!==Y.sdk||Y.entry!==G[0].path.replace(/identity\.json$/,"run.mjs"))throw I5()}}function Hb(X){let J=[],Q=new Set;for(let Z=X;Z instanceof Error&&!Q.has(Z)&&J.length<4;Z=Z.cause){Q.add(Z);let G=Z.constructor.name,Y=["Error","TypeError","SyntaxError","RecordValidationError","DataOperationError","UnsafeCacheResource","IndexRuntimeCapacityError","GitCommandError"].includes(G)?G:"Error",V=Z.code;J.push({kind:Y,...["ENOENT","EACCES","EPERM","EEXIST","ENOTEMPTY","ENOTDIR","EISDIR","EMFILE","ENFILE","ENOSPC","EIO","EBUSY","ECONNRESET","ECONNREFUSED"].includes(V??"")?{code:V}:{}})}return J}import{lstat as yV0,mkdir as xV0,realpath as bV0}from"node:fs/promises";import{userInfo as gV0}from"node:os";import{dirname as Ub,isAbsolute as hV0,join as HT,resolve as vV0}from"node:path";function t8(X,J={}){if(!/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(X)||X.length>63)throw Error("Invalid local workspace");let Q=(J.homeDirectory??(()=>gV0().homedir))();if(!hV0(Q)||vV0(Q)!==Q)throw Error("Unsafe local home directory");let Z=HT(Q,".os",X);return{files:HT(Z,"files"),runs:HT(Z,"runs")}}async function M9(X,J=!1){let Q=[];for(let Z=X;Z!==Ub(Z);Z=Ub(Z))Q.unshift(Z);for(let Z of Q){if(J)await xV0(Z,{mode:448}).catch((Y)=>{if(Y.code!=="EEXIST")throw Y});let G=await yV0(Z);if(!G.isDirectory()||G.isSymbolicLink())throw Error("Unsafe local state directory")}if(await bV0(X)!==X)throw Error("Unsafe local state directory");return X}var BY=(X)=>fV0("sha256").update(X).digest("hex"),A1=(X,J)=>$5(X,J,void 0,{localObjectsOnly:!0}),e8=async(X,J)=>(await A1(X,J)).toString().trim(),Bb=67108864;async function O7(X){if((await LY(X)).isSymbolicLink())throw Error("Unsafe local Run state");let J=await lH(X,zb.O_RDONLY|(zb.O_NOFOLLOW??0));try{let Q=await J.stat();if(!Q.isFile()||Q.nlink>1)throw Error("Unsafe local Run state");if(Q.size>Bb)throw Error("Local Run state exceeds 64 MiB");let Z=Buffer.alloc(Q.size+1),G=0;while(G<Z.length){let Y=await J.read(Z,G,Z.length-G,G);if(!Y.bytesRead)break;G+=Y.bytesRead}if(G!==Q.size)throw Error("Local Run state changed while reading");return new TextDecoder("utf-8",{fatal:!0}).decode(Z.subarray(0,G))}finally{await J.close()}}async function MT(X=process.platform,J={mkdtemp:pV0,chmod:qT,rm:cH}){if(X==="win32")return{kind:"tcp",listenOptions:{host:"127.0.0.1",port:0},async release(){}};let Q=await J.mkdtemp(p6(dV0(),"os-local-")),Z=()=>J.rm(Q,{recursive:!0,force:!0});try{await J.chmod(Q,448)}catch(G){throw await Z(),G}return{kind:"socket",address:p6(Q,"transport.sock"),release:Z}}async function TY(X,J){let Q=JSON.stringify(J,null,2);if(Buffer.byteLength(Q)>Bb)throw Error("Local Run state exceeds 64 MiB");let Z=`${X}.${crypto.randomUUID()}.tmp`,G=await lH(Z,"wx",384);try{await G.writeFile(Q),await G.sync()}finally{await G.close()}if(await cV0(Z,X),process.platform==="win32")return;let Y=await lH(Mb(X),"r");try{await Y.sync()}finally{await Y.close()}}var pH=TY;async function Lb(X,J,Q){let Z=Q.createIndexOwner??tW,G=V9(structuredClone(J)),Y=Q.workspaceName,V=Q.expiresAt===void 0?1/0:Date.parse(Q.expiresAt),K=()=>{if(!(V>Date.now())||Q.authoritySignal?.aborted)throw Error("Preparation capability expired")};K();let H=await MY(X);if(await MY(await e8(H,["rev-parse","--show-toplevel"]))!==H)throw Error("Preparation requires the matched repository root");let W=await MY(await e8(H,["rev-parse","--absolute-git-dir"])),U=await e8(H,["rev-parse","--verify","HEAD^{commit}"]),z=await e8(H,["symbolic-ref","HEAD"]),q=await e8(H,["config","--get","remote.origin.url"]),B=Q.sourceBinding&&structuredClone(Q.sourceBinding),M=(o)=>o.replace(/\.git$/,"").toLowerCase();if(B&&(M(B.remote)!==M(q)||!Number.isSafeInteger(B.githubRepositoryId)||B.githubRepositoryId<=0))throw Error("Checkout does not match its verified source repository");let L=G.repositories.filter((o)=>B?o.target.githubRepositoryId===B.githubRepositoryId:o.target.remote===q&&o.target.targetRef===z),T=Q.runId!==void 0&&G.deploymentId===null&&!G.repositories.length;if(!L.length&&!T)throw Error("Checkout does not match an installed data repository");let O=await Promise.all(L.map(async(o)=>{let T0=o.published?.sourceVersion;if(!T0)throw Error("Exact published repository base unavailable");return await A1(H,["cat-file","-e",`${T0}^{commit}`]),{repository:o.target.repository,baseCommit:T0,proposedCommit:T0}}));for(let o of L){let T0=L.filter((I0)=>I0.target.githubRepositoryId===o.target.githubRepositoryId&&I0.target.targetRef===o.target.targetRef);if(new Set(T0.map((I0)=>I0.published.sourceVersion)).size!==1)throw Error("Conflicting published bases for repository aliases")}let I=t8(G.workspace,Q).runs,j=p6(I,"preparing.lock"),N=!1,A=!1,R=!1,S=!1,$=Q.runId??crypto.randomUUID(),E=p6(I,$),x=p6(E,"history.git"),w=p6(E,"preparation.json"),C,D,g=!0,f=!1,P=!1,m=Promise.resolve(),v,a=new Map,X0=QH(Q.acquireHistory??(async()=>{throw new Y0("unavailable",!0)})),z0=new Map(L.flatMap((o)=>o.published?[[o.target.repository,{...o.published}]]:[])),G0=!1,e,s,t,U0=()=>{G0=!0,X0.invalidate(),clearTimeout(e),clearTimeout(s)},k=(o)=>{if(!cK(o,G))return!1;for(let T0 of o.repositories)if(T0.published&&z0.has(T0.target.repository)&&!$1(T0.published,z0.get(T0.target.repository)))U0();return!0},b=()=>{if(t)return t;if(!g||G0)return Promise.resolve();return t=(async()=>{try{let o=V9(await Q.recheck());if(!k(o))U0()}catch(o){if(o instanceof Y0&&o.code==="access_denied")U0()}finally{if(!(V>Date.now()))U0();t=void 0}})(),t},h=()=>{if(e||!g||G0)return;e=setTimeout(()=>{e=void 0,b().finally(h)},Math.min(30000,V-Date.now())),e.unref?.()},y={format:1,id:$,state:"preparing",authority:G,checkout:{root:H,gitDirectory:W,head:U,branch:z,remote:q,...B?{githubRepositoryId:B.githubRepositoryId}:{}},repositories:O,paths:[],steps:[]},l,r=()=>l??=R1({root:t8(G.workspace,Q).files,storage:"local"},{context:Q.recheck,workspace:G.workspace,runId:$,capability:"",expiresAt:Q.expiresAt??new Date(8640000000000000).toISOString(),...Q.authoritySignal?{authorityLease:{context:G,signal:Q.authoritySignal}}:{}});try{let o=()=>A?pH(w,y):Promise.resolve(),T0=async(K0=!1)=>{if(K(),K0&&await e8(H,["rev-parse","HEAD"])!==U||await e8(H,["symbolic-ref","HEAD"])!==z||await e8(H,["config","--get","remote.origin.url"])!==q||await MY(await e8(H,["rev-parse","--show-toplevel"]))!==H||await MY(await e8(H,["rev-parse","--absolute-git-dir"]))!==W)throw Error("Checkout binding changed during preparation")},I0=async()=>{if(K(),!Q.authoritySignal){let K0=V9(await Q.recheck());if(!k(K0))throw U0(),Error("Preparation authority changed; rerun after repair")}await T0(!0)},R0=async(K0=!1)=>{if(await I0(),K0&&!R){for(let Q0 of L)if((Q.authoritativeHead?await Q.authoritativeHead(Q0.target.remote,Q0.target.targetRef):(await e8(H,["ls-remote","--exit-code","--refs","--",Q0.target.remote,Q0.target.targetRef])).split(/\s+/)[0])!==O.find((j0)=>j0.repository===Q0.target.repository).baseCommit)throw Error("Repository is not at its authoritative base; refresh it before preparing");R=!0}if(A)return;await M9(I,!0),await qT(I,448);let c=await lH(j,"wx",384).catch(()=>{throw Error(`Preparation ownership unavailable: inspect ${j}`)});N=!0;try{await c.writeFile(JSON.stringify({run:$,pid:process.pid,root:H})),await c.sync()}finally{await c.close()}if(await I0(),await UT(E,{mode:448,recursive:Q.runId!==void 0}),(await LY(E)).isSymbolicLink())throw Error("Unsafe local Run directory");A=!0,await o()},r0=async()=>{if(S)return;await UT(x),await A1(x,["init","--bare","--quiet"]);let K0=await e8(H,["rev-parse","--path-format=absolute","--git-path","objects"]);if(/[\r\n]/.test(K0))throw Error("Unsafe local object directory");await zT(p6(x,"objects/info/alternates"),`${K0}
335
335
  `);for(let c of L){let Q0=O.find((J0)=>J0.repository===c.target.repository).baseCommit;await A1(x,["update-ref",c.target.targetRef,Q0])}S=!0},H0=(K0,c=!1)=>{let Q0=L.find((J0)=>J0.target.repository===K0);if(!Q0||c&&!Q0.canWrite)throw Error("Matched installed repository grant unavailable");return Q0},w0=async(K0)=>{if(lV0(K0)||K0.split("/").some((j0)=>!j0||j0==="."||j0===".."||j0===".git"))throw Error("Unsafe declared record path");let c=H;for(let j0 of K0.split("/").slice(0,-1)){c=p6(c,j0);let L0=await LY(c).catch((x0)=>{if(x0.code==="ENOENT")return;throw x0});if(L0&&(!L0.isDirectory()||L0.isSymbolicLink()))throw Error("Declared path has an unsafe parent")}let Q0=p6(H,K0),J0=await LY(Q0).catch((j0)=>{if(j0.code==="ENOENT")return;throw j0});if(!J0)return null;if(!J0.isFile()||J0.isSymbolicLink()||J0.mode&73)throw Error("Declared path is not an ordinary record");return qb(Q0)},p0=async(K0)=>{let c=y.paths.find((j0)=>j0.path===K0);if((await $5(H,["diff","--cached","--name-only","-z",U,"--",K0])).length)throw Error(`Declared path already has staged changes: ${K0}`);let J0=await w0(K0);if(c){if((J0===null?null:BY(J0))!==c.sha256)throw Error(`Prepared path was modified: ${K0}`)}else{let j0=await e8(H,["ls-tree",U,"--",K0]);if(!j0&&J0!==null)throw Error(`Declared path already exists locally: ${K0}`);if(j0){let L0=await A1(H,["cat-file","blob",`${U}:${K0}`]);if(J0===null||!J0.equals(L0)&&!J0.equals(await A1(H,["cat-file","--filters",`${U}:${K0}`])))throw Error(`Declared path already has local changes: ${K0}`)}}},h0=async(K0)=>{let c=wI(K0),Q0=H0(c.repository),J0=O.find((x0)=>x0.repository===c.repository).proposedCommit,j0=c.atCommit??J0;if(j0!==J0)await A1(H,["merge-base","--is-ancestor",j0,J0]);let L0=await BL(H,j0,Q0.target.dataRoots,c.refs,void 0,{localObjectsOnly:!0});return{commit:j0,records:c.refs.map((x0)=>{let Q5=L0.get(x0);return{ref:x0,version:Q5.version,fields:Q5.fields}})}},N5=async(K0)=>{let c=y.steps.find((Q0)=>Q0.kind==="managed-file"&&Q0.file.id===K0);if(c?.storage==="remote")throw new A0("A deferred remote File cannot be a Source before retention");if(c?.staged)return(await l.local()).get(K0);if(Q.filesConfiguration?.root&&Q.files){let Q0=await Q.files.local();if(await Q0.has(K0))return Q0.get(K0)}if(!Q.getFile)throw new A0("Source File access unavailable");return Q.getFile(K0)},u=async(K0,c)=>{let{input:Q0,requestKey:J0}=pK(K0),j0=H0(Q0.repository,!0);await R0(!0);let L0=y.steps.find((H5)=>H5.kind==="records"&&H5.requestKey===J0);if(L0?.kind==="records"){if(JSON.stringify(L0.input)!==JSON.stringify(Q0))throw Error("Changed input under a prepared request key");return{receipt:L0.receipt}}await r0();let x0,Q5=[],S5=await rF({async validateCandidates(H5){Q5=vG(H5),await dL(H5,N5)},async authorize(){return{target:j0.target,workspaceName:Y,config:{workspaceId:G.workspaceId,repository:Q0.repository,remote:x,targetRef:j0.target.targetRef,dataRoots:j0.target.dataRoots},async release(){}}},async prepare(H5){x0=H5}}).changeRecords(Q0);if(!x0)throw Error("Prepared proposal was not retained");let Z5=x0,_5=p6(E,`${Z5.id}.bundle`);await zT(_5,Buffer.from(Z5.bundle,"base64"),{flag:"wx",mode:384}),await $5(x,["fetch","--quiet","--no-tags","--",_5,"HEAD:refs/os/candidate"]);let N6=(await $5(x,["diff","--name-only","-z","--no-renames",Z5.expectedHead,Z5.proposedCommit,"--"])).toString().split("\x00").filter(Boolean),r6=new Set([...N6,...Z5.guards.paths.map(([,H5])=>H5)]);for(let H5 of r6)await p0(H5);if(await I0(),Q5.length&&Q.filesConfiguration?.root&&Q.files){let H5=await Q.files.local();for(let P5 of Q5)if(await H5.has(P5.fileId)&&!y.steps.some((D5)=>D5.kind==="managed-file"&&D5.file.id===P5.fileId))y.steps.push({kind:"managed-file",file:await H5.get(P5.fileId),storage:"local"})}y.steps.push({kind:"records",input:Q0,requestKey:J0,operation:Z5,receipt:S5.receipt,...Q5.length?{sourceFiles:Q5}:{},...c?{data:c}:{}}),await o(),await $5(H,["fetch","--quiet","--no-tags","--no-write-fetch-head","--",x,"refs/os/candidate"]);for(let H5 of r6){await p0(H5);let P5=await e8(x,["ls-tree","--name-only",Z5.proposedCommit,"--",H5]),D5=null;if(P5)D5=await $5(x,["cat-file","blob",`${Z5.proposedCommit}:${H5}`]),await UT(Mb(p6(H,H5)),{recursive:!0}),await zT(p6(H,H5),D5);else await cH(p6(H,H5),{force:!0});let y6={path:H5,sha256:D5===null?null:BY(D5)},g8=y.paths.findIndex((o6)=>o6.path===H5);if(g8<0)y.paths.push(y6);else y.paths[g8]=y6}await $5(x,["update-ref",j0.target.targetRef,Z5.proposedCommit,Z5.expectedHead]);for(let H5 of O){let P5=L.find((D5)=>D5.target.repository===H5.repository).target;if(P5.githubRepositoryId===j0.target.githubRepositoryId&&P5.targetRef===j0.target.targetRef)H5.proposedCommit=Z5.proposedCommit}return await o(),S5},i=async(K0)=>{let c=mK(K0),Q0=await cQ(H,c),J0=await sM(Q0,c.name??c.path.split("/").at(-1),c.csv);await R0();let j0=y.steps.find((Q5)=>Q5.kind==="file"&&JSON.stringify(Q5.input)===JSON.stringify(c));if(j0?.kind==="file"){if(j0.file.sha256!==J0.sha256)throw Error("Prepared file changed during the run");return j0.file}let L0=await(await r().local()).create(s7({name:J0.name,path:"Files",size:Q0.length,storage:"local",requestKey:`prepared-inbox/${$}/${crypto.randomUUID()}`,...c.csv?{csv:c.csv}:{}},d6),Q0),x0={...J0,id:L0.id};return y.steps.push({kind:"file",input:c,file:x0,managedFile:L0}),await o(),x0},M0=async(K0,c=!1)=>{let Q0=K0;if(!Q0||typeof Q0.requestKey!=="string"||!Q0.requestKey.trim()||Q0.requestKey.length>512)throw Error("Invalid publication request key");let J0=K4(Q0.item),j0=y.steps.find((x0)=>x0.kind==="publication"&&x0.requestKey===Q0.requestKey);if(j0?.kind==="publication"){if(JSON.stringify(K4(j0.item))!==JSON.stringify(J0))throw Error("Changed input under a prepared publication key");return c?{}:j0.result}if(c)return{};await R0();let L0={id:crypto.randomUUID(),...J0.kind==="ask"?{revision:1}:{}};return y.steps.push({kind:"publication",requestKey:Q0.requestKey,item:J0,result:L0}),await o(),L0},c0=async(K0)=>{let c=V1(K0),Q0=c.operation==="changes.validate"||c.operation==="changes.publish";try{if(await T0(),H0(c.repository,Q0),Q0)await I0()}catch{throw new Y0("access_denied")}let J0=H0(c.repository),j0=y.repositories.find((L0)=>L0.repository===c.repository).proposedCommit;try{if(c.operation==="history.list"||c.operation==="history.at"||c.operation==="history.changes"){if(G0||!g)throw new Y0("access_denied");if(!s&&Number.isFinite(V))s=setTimeout(U0,Math.max(0,V-Date.now())),s.unref?.();h();let Q5=y.repositories.find((Z5)=>Z5.repository===c.repository).baseCommit,t0=z0.get(c.repository);if(!t0||t0.sourceVersion!==Q5)throw new Y0("unavailable",!0);let S5=await X0.read({target:J0.target,sourceVersion:Q5,publishedVersion:t0.version},c.operation==="history.list"?{operation:"list",options:c.options??{}}:c.operation==="history.changes"?{operation:"changes",options:c.options}:{operation:"at",options:{instant:c.instant}});try{if(await T0(),H0(c.repository),!g||f||P||G0||y.state!=="preparing")throw Error()}catch{throw new Y0("access_denied")}return S5}let L0=a.get(c.repository);if(!L0||L0.sourceVersion!==j0){let Q5=await Z({target:J0.target,checkout:H,sourceVersion:j0});if(a.set(c.repository,Q5),L0)await L0.close();L0=Q5}let x0;if(c.operation==="changes.validate"||c.operation==="changes.publish"){let Q5=c.operation==="changes.publish"?`data/${$}/${c.publicationId}`:void 0,t0=y.steps.find((S5)=>S5.kind==="records"&&S5.requestKey===Q5);if(t0){if(t0.input.repository!==c.repository||!t0.data||!$1(t0.data.updates,c.updates)||!$1(t0.data.creates??[],c.creates??[])||!$1(t0.data.deletes??[],c.deletes??[]))throw new Y0("conflict",!1,"unapplied")}else{let S5=sF((await L0.validationContext()).artifact,c.updates,c.creates,c.deletes);if(await dL([...S5.creates,...S5.updates.map(({record:Z5,fields:_5})=>({ref:Z5.ref,schema:Z5.schema,fields:_5}))],N5),c.operation==="changes.publish"){try{await u({requestKey:Q5,input:{repository:c.repository,records:[...S5.creates.map((Z5)=>({ref:Z5.ref,path:Z5.path,fields:Z5.fields})),...S5.updates.map((Z5)=>({ref:Z5.record.ref,expectedVersion:Z5.record.version,set:Z5.set})),...c.deletes??[]]}},{publicationId:c.publicationId,updates:c.updates,...c.creates?{creates:c.creates}:{},...c.deletes?{deletes:c.deletes}:{}})}catch(Z5){throw P=!0,y.state="failed",await o(),Z5}t0=y.steps.find((Z5)=>Z5.kind==="records"&&Z5.requestKey===Q5)}}if(t0){if(!t0.data.result){let S5=await Z({target:J0.target,checkout:H,sourceVersion:t0.receipt.commit});try{let Z5=await S5.validationContext(),_5=new Map(Z5.artifact.collections.flatMap((P5)=>P5.records.map((D5)=>[D5.$ref,D5]))),N6=(P5)=>P5.map((D5)=>{let y6=_5.get(D5.ref);if(!y6)throw new Y0("publication_pending",!0);return{$ref:y6.$ref,$version:y6.$version}}),r6=(c.deletes??[]).map((P5)=>{if(_5.has(P5.ref))throw new Y0("publication_pending",!0);return{$ref:P5.ref,$version:P5.expectedVersion}}),H5={version:Z5.descriptor.version,deleted:r6,created:N6(c.creates??[]),updated:N6(c.updates)};if(await I0(),t0.data.result=H5,y.repositories.find((P5)=>P5.repository===c.repository).proposedCommit===t0.receipt.commit)a.set(c.repository,S5),await L0.close(),L0=S5;await o()}finally{if(a.get(c.repository)!==S5)await S5.close()}}x0=structuredClone(t0.data.result)}else x0={}}else x0=c.operation==="collections.list"?await L0.collections.list():c.operation==="collections.schema"?await L0.collections.schema(c.name):c.operation==="records.search"?await L0.records.search(c.query,c.options):c.operation==="records.read"?await L0.records.read(c.refs):await L0.records.select(c.query);try{await T0()}catch{throw new Y0("access_denied")}if(Q0)try{await I0()}catch{throw new Y0("access_denied")}return x0}catch(L0){if(L0 instanceof Y0)throw L0;if(L0 instanceof A0)throw new Y0(Q0?L0.message==="Reviewed record version is stale"?"conflict":"invalid_change":"invalid_query",!1,Q0?"unapplied":void 0,L0 instanceof uW?L0.component:void 0);if(L0 instanceof n9)throw new Y0("capacity",!0);try{console.error("Local Data owner failure:",JSON.stringify({run:$,operation:c.operation,causes:Hb(L0)}))}catch{}throw new Y0("unavailable",!0)}},n0=async(K0,c,Q0,J0)=>{if(f||P||y.state!=="preparing")throw Error("Preparation is closed or failed");if(K0==="data/query")return c0(c);if(K0==="files/request"||K0==="files/stream"){if(!Q.files)throw new _("unsupported_context",400);let j0=c,L0;if(j0.suffix==="")try{L0=s7(JSON.parse(decodeURIComponent(j0.headers["x-os-file"])),d6)}catch(o6){if(o6 instanceof _)throw o6;throw new _("invalid_input",400)}let x0=/^\/([0-9a-f-]{36})(?:\/|$)/.exec(j0.suffix)?.[1],Q5=y.steps.find((o6)=>o6.kind==="managed-file"&&o6.file.id===x0),t0=!L0&&!Q5&&x0&&!Q.files.isTransferredInput(x0)&&Q.filesConfiguration?.root&&await(await Q.files.local()).has(x0),S5=L0?(L0.storage??Q.filesConfiguration?.storage??"remote")==="remote":Q5?.storage==="remote";if(L0||Q5||t0)await R0();let Z5=S5||!!Q.runId&&(L0!==void 0||Q5?.staged===!0),_5;if(L0&&Z5&&!S5&&Q.filesConfiguration?.root){if(await LY(p6(Q.filesConfiguration.root,".oddington-files")).catch((j7)=>{if(j7.code==="ENOENT")return;throw j7})){let j7=await Q.files.local(),PY=await j7.lookup(L0.requestKey);if(PY)_5={file:PY,owner:j7}}}if(Z5)r();if(!L0&&!Q5&&!t0&&j0.method!=="GET")throw new _("unsupported_context",400);let N6=j0.suffix===`/${x0}/upload`;if(N6&&(j0.method!=="POST"||j0.bytes!==void 0||!j0.headers||Object.keys(j0.headers).length||Object.keys(j0).some((o6)=>!["suffix","method","headers"].includes(o6))))throw new _("invalid_input",400);let r6=Z5?l:Q.files,H5=Z5&&L0?{...j0,headers:{...j0.headers,"x-os-file":encodeURIComponent(JSON.stringify({...L0,storage:"local"}))}}:j0,D5=K0==="files/stream"?N6?Response.json(await(await r6.local()).get(x0)):await r6.stream(H5,Q0,J0,_5):void 0,y6=N6?{status:200,headers:{},json:await(await r6.local()).get(x0)}:D5?{status:D5.status,headers:Object.fromEntries(D5.headers),...L0&&D5.ok?{json:await D5.clone().json()}:{}}:await r6.request(H5,_5);if(y6.status!==200)return D5??y6;let g8;if(L0)g8=y6.json;else if(Q5||t0)g8=await(await r6.local()).get(x0);if(g8){let o6=y.steps.find((j7)=>j7.kind==="managed-file"&&j7.file.id===g8.id);if(o6){if(o6.file=g8,N6&&!S5)o6.upload=!0}else y.steps.push({kind:"managed-file",file:g8,storage:S5?"remote":"local",...L0?{metadata:L0}:{},...Z5?{staged:!0}:{},...N6&&!S5?{upload:!0}:{}});await o()}return D5??y6}switch(await T0(),K0){case"records/read":return h0(c);case"records/update":return u(c);case"files/add":return i(c);case"publish":return M0(c);case"check":return M0(c,!0);default:throw Error("This effect is unavailable during preparation")}},m0=(K0,c=!0)=>{let Q0=m.then(K0).catch(async(J0)=>{if(c)P=!0,y.state="failed",await o();throw J0});return m=Q0.catch(()=>{}),Q0},l6=(K0,c)=>{if(!g)return Promise.reject(Error("Preparation is closed"));let Q0=structuredClone(c);return m0(()=>n0(K0,Q0),K0!=="data/query"&&K0!=="files/request"&&K0!=="files/stream")};C=await MT(Q.platform);let B8=_V0(32).toString("hex"),T9=0,X7=new Map,I9=new Set,Q7=new Map,b8=D=mV0(async(K0,c)=>{let Q0=K0.url==="/data/query",J0=K0.url==="/ai/generate",j0=K0.url==="/files/stream",L0=K0.url==="/files/request"||K0.url==="/files/admit"||j0,x0=(Q5,t0)=>{c.writeHead(Q5,{"content-type":"application/json"}),c.end(JSON.stringify(t0))};if(K0.url==="/files/cancel"&&K0.headers.authorization===`Bearer ${B8}`){BT(K0,c,X7);return}if(K0.method!=="POST"||K0.headers.authorization!==`Bearer ${B8}`){K0.resume(),x0(403,{error:Q0||L0||J0?{code:"access_denied"}:"Private preparation context required"});return}try{if(J0&&(!g||f||P||!Q.runId||!Q.ai))throw new y0("access_denied");if(K0.url==="/files/admit"){if(!g||!Q.files)throw new _("access_denied",403);await Q.files.admit(OY(K0)),K0.resume(),c.writeHead(204),c.end();return}if(j0){if(!g)throw new _("access_denied",403);if(T9>=4)throw new _("capacity",429,!0);let _5=K0.headers["x-os-files-call"];if(typeof _5!=="string"||!G5.test(_5)||X7.has(_5))throw new _("invalid_input",400);T9++;let N6=new AbortController,r6=()=>N6.abort();X7.set(_5,N6),K0.once("aborted",r6),c.once("close",r6);let H5=setInterval(()=>{if(!c.headersSent&&!c.destroyed)c.writeProcessing()},1e4),P5=(async()=>{try{let D5=OY(K0),y6=await m0(()=>n0("files/stream",D5,uV0.toWeb(K0,{strategy:{highWaterMark:65536,size:(g8)=>g8.byteLength}}),N6.signal),!1);await IY(c,y6,N6.signal)}finally{X7.delete(_5),clearInterval(H5),T9--,K0.removeListener("aborted",r6),c.removeListener("close",r6)}})();I9.add(P5);try{await P5}finally{I9.delete(P5)}return}let Q5=Buffer.alloc(L0?25165824:2097152),t0=0;for await(let _5 of K0){if(t0+=_5.length,J0&&t0>YY)throw new y0("input_too_large");if(Q0&&t0>262144)throw new Y0("request_too_large");if(t0>(L0?24:2)*1024*1024)throw Error("Local request exceeds supported size");Q5.set(_5,t0-_5.length)}let S5;try{S5=JSON.parse(Q5.subarray(0,t0).toString())}catch{if(J0)throw new y0("invalid_input");if(Q0)throw new Y0("invalid_query");if(L0)throw new _("invalid_input",400);throw Error("Invalid local request")}if(J0){if(!g||f||P||!Q.ai||Q7.size>=1)throw new y0("access_denied");let _5=new AbortController,N6=()=>_5.abort();K0.once("aborted",N6),c.once("close",N6);let r6=async(P5,D5)=>{let y6=new v8(void 0,D5);try{let g8=await m0(()=>n0("files/stream",{suffix:`/${P5.id}`,method:"GET",headers:{}},void 0,D5),!1);if(!g8.ok)throw new y0("file_unavailable");let o6=JSON.parse(new TextDecoder().decode(await r7(g8.body,16384,y6)));if(!$1(P5,o6))throw new y0("file_unavailable");let j7=await m0(()=>n0("files/stream",{suffix:`/${P5.id}/content`,method:"GET",headers:{}},void 0,D5),!1);if(!j7.ok)throw await j7.body?.cancel(),new y0("file_unavailable");let PY=await r7(j7.body,P5.size,y6);return y6.check(),{file:o6,bytes:PY}}finally{y6.close(),await y6.settle()}},H5=Q.ai(VY(S5),_5.signal,r6);Q7.set(_5,H5);try{x0(200,await H5)}finally{Q7.delete(_5),K0.removeListener("aborted",N6),c.removeListener("close",N6)}return}let Z5=await l6(K0.url.slice(1),S5);x0(200,Z5)}catch(Q5){if(J0){let t0=Q5 instanceof y0?Q5:new y0("provider_failure");x0(t0.code==="access_denied"?403:400,{error:{code:t0.code}})}else if(L0){let t0=Q5 instanceof _?Q5:new _("unavailable",503,!0);if(c.headersSent)c.destroy();else x0(t0.status,{error:{code:t0.code}})}else if(Q0){let t0=Q5 instanceof Y0?Q5:new Y0("unavailable",!0),S5={context_unavailable:503,unauthenticated:401,access_denied:403,invalid_query:400,invalid_change:400,conflict:409,publication_pending:503,request_too_large:413,capacity:429,unavailable:503}[t0.code];x0(S5,{error:{code:t0.code,...t0.effect?{effect:t0.effect}:{},...t0.component?{component:t0.component}:{}}})}else x0(400,{error:Q5 instanceof Error?Q5.message:"Preparation failed"})}});b8.requestTimeout=0,b8.headersTimeout=30000,await new Promise((K0,c)=>{b8.once("error",c),b8.listen(C.kind==="tcp"?C.listenOptions:C.address,()=>{b8.removeListener("error",c),K0()})});let j9;if(C.kind==="tcp"){let K0=b8.address();if(!K0||typeof K0==="string"||K0.family!=="IPv4"||K0.address!=="127.0.0.1"||!Number.isInteger(K0.port)||K0.port<1||K0.port>65535)throw Error("Preparation loopback endpoint unavailable");j9=`tcp://127.0.0.1:${K0.port}`}else j9=C.address;return{id:$,directory:E,bundlePath:w,dispatch:l6,refreshHistoryAuthority:b,indexInput(K0){if(!g)return Promise.reject(Error("Preparation is closed"));return m0(async()=>{if(f||P)throw Error("Preparation is closed or failed");await T0();let c=H0(K0);return{target:structuredClone(c.target),checkout:H,sourceVersion:y.repositories.find((Q0)=>Q0.repository===K0).proposedCommit}})},environment:{OS_ROUTINE_LOCAL:"1",OS_ROUTINE_LOCAL_SOCKET:j9,OS_ROUTINE_LOCAL_TOKEN:B8,OS_INBOX_WORKING_ROOT:H},finish(K0,c){if(U0(),v)return v;g=!1;for(let Q0 of Q7.keys())Q0.abort();return v=(async()=>{try{let Q0=new Promise((J0,j0)=>b8.close((L0)=>L0?j0(L0):J0()));await m,await Promise.allSettled(Q7.values());for(let J0 of X7.values())J0.abort();if(await Promise.allSettled(I9),b8.closeAllConnections(),await Q0,f=!0,K0!==0&&!A)return{state:"failed"};if(Q.runId){if(!c||c.runId!==$)throw Error("Exact accepted Run evidence required");if(y.format=2,y.execution=structuredClone(c),!A)await R0(!1);await o()}if(!A)return P?{state:"failed"}:{state:"read-only",succeeded:K0===0};if(K0!==0||P)return y.state="failed",await o(),{state:"failed",directory:E};if(await I0(),y.execution){if(y.execution.state!=="succeeded")throw Error("Successful Run evidence required");await rX(p6(E,"source"),y.execution.source)}for(let J0 of y.paths)await p0(J0.path);if(y.steps.some((J0)=>J0.kind==="records"&&J0.data&&!J0.data.result))throw Error("Prepared Data publication has not completed its exact local index");for(let J0 of y.steps)if(J0.kind==="file"){let j0=await r().local();if(BY(await cQ(H,J0.input))!==J0.file.sha256||!$1(await j0.get(J0.managedFile.id),J0.managedFile)||BY(new Uint8Array(await(await j0.read(J0.managedFile.id)).arrayBuffer()))!==J0.file.sha256)throw Error(`Prepared file was modified: ${J0.input.path}`)}for(let J0 of y.steps)if(J0.kind==="managed-file"){let j0=await(J0.staged||J0.storage==="remote"?l:Q.files).local();if(!$1(await j0.get(J0.file.id),J0.file))throw Error("Prepared File changed")}if(y.state="complete",y.format===2)y.counts={records:y.steps.reduce((J0,j0)=>J0+(j0.kind==="records"?j0.input.records.length:0),0),files:y.steps.filter((J0)=>J0.kind==="file"||J0.kind==="managed-file").length,asks:y.steps.filter((J0)=>J0.kind==="publication"&&J0.item.kind==="ask").length,digests:y.steps.filter((J0)=>J0.kind==="publication"&&J0.item.kind==="digest").length},y.changes=y.steps.length?"ready_to_publish":"not_needed";return await pH(p6(E,"complete.json"),y),await qT(p6(E,"complete.json"),256),await pH(p6(E,"seal.json"),{sha256:BY(await qb(p6(E,"complete.json")))}),{state:"prepared",id:$,directory:E,...y.format===2?{changes:y.changes,counts:y.counts}:{}}}catch(Q0){throw y.state="failed",await o(),Q0}finally{b8.closeAllConnections();try{await Promise.all([...a.values()].map((Q0)=>Q0.close()))}finally{if(await C.release(),N)await cH(j)}}})(),v}}}catch(o){if(y.state="failed",D)D.closeAllConnections(),await new Promise((T0)=>D.close(()=>T0()));if(A)await pH(w,y).catch(()=>{});if(C)await C.release();if(N)await cH(j);throw o}}y5();y5();y5();var nV0,sV0;if(typeof __OS_BROWSER__>"u"||!__OS_BROWSER__)({request:nV0}=await import("node:http")),{Readable:sV0}=await import("node:stream");y5();async function dH(X,J,Q,Z=fetch,G=async()=>{},Y){let V=new AbortController,K=()=>V.abort(Q.reason);if(Q.addEventListener("abort",K,{once:!0}),Q.aborted)K();let H=()=>Q.removeEventListener("abort",K);try{let W=await Z(X,{...J,signal:V.signal});try{if(await G(),V.signal.aborted)throw Y?.()??new _("unavailable",503,!0)}catch(I){throw W.body?.cancel().catch(()=>{}),I}if(!W.body)return H(),W;let U=W.body,z,q=!1,B,M=async(I)=>{if(q)return;q=!0,H(),V.signal.removeEventListener("abort",L),V.abort(I);try{await(z?z.cancel(I):U.cancel(I))}catch(j){if(j!==V.signal.reason&&!(j instanceof Error&&j.name==="AbortError"))throw j}finally{z?.releaseLock()}},L=()=>{if(q)return;let I=Y?.()??V.signal.reason;M(I).catch(()=>{}),B.error(I)},T=new ReadableStream({start(I){if(B=I,V.signal.addEventListener("abort",L,{once:!0}),V.signal.aborted)L()},async pull(I){try{if(await G(),q)return;z??=U.getReader();let{done:j,value:N}=await z.read();if(await G(),q)return;if(j)q=!0,H(),V.signal.removeEventListener("abort",L),z.releaseLock(),I.close();else I.enqueue(N)}catch(j){if(q)return;I.error(Y?.()??j),await M(j).catch(()=>{})}},cancel:M},{highWaterMark:0}),O=new Response(T,{status:W.status,statusText:W.statusText,headers:W.headers});for(let I of["url","redirected","type"])Object.defineProperty(O,I,{value:W[I]});return O}catch(W){throw H(),V.abort(W),W}}y5();var iV0=16777216,Ob=8388608;var Tb=16384,rV0=131072,jY=30000;var oV0=2,tV0=0,oX=()=>new _("invalid_input",400),B9=()=>new _("unavailable",503,!0),eV0={400:["invalid_input","unsupported_context"],401:["unauthenticated"],403:["access_denied"],405:["method_not_allowed"],409:["conflict","local_only"],413:["request_too_large"],429:["capacity"],503:["integrity","unavailable"]};async function XK0(X,J,Q){if(!X)return new Uint8Array;let Z=X.getReader(),G=new Uint8Array(J),Y=0,V=()=>{Z.cancel().catch(()=>{})};if(Q?.addEventListener("abort",V,{once:!0}),Q?.aborted)V();try{for(;;){let{done:K,value:H}=await Z.read();if(Q?.aborted)throw B9();if(K)break;if(!(H instanceof Uint8Array))throw oX();if(Y+=H.byteLength,Y>J)throw new _("request_too_large",413);G.set(H,Y-H.byteLength)}}catch(K){throw V(),K}finally{Q?.removeEventListener("abort",V),Z.releaseLock()}return G.slice(0,Y)}async function QK0(X,J,Q=jY){let Z=new AbortController,G,Y,V=new Promise((K,H)=>{if(Y=()=>{Z.abort(),H(B9())},G=setTimeout(Y,Q),J?.addEventListener("abort",Y,{once:!0}),J?.aborted)Y()});try{return await Promise.race([X(Z.signal),V])}finally{clearTimeout(G),J?.removeEventListener("abort",Y)}}async function JK0(X,J=Tb){try{let Q=await XK0(X.body,J);return JSON.parse(new TextDecoder("utf-8",{fatal:!0}).decode(Q))}catch{throw B9()}}function ZK0(X){if(typeof X!=="string"||!G5.test(X))throw oX();return`/${X}`}async function GK0(X,J,Q,Z=()=>{tV0--},G){let Y=G?`${ZK0(G.file.id)}/upload/multipart`:"/multipart",V,K,H,W=0,U=[],z=new Set,q=(M,L=jY)=>QK0((T)=>{let O=M(T);return z.add(O),O.then(()=>z.delete(O),()=>z.delete(O)),O},void 0,L),B=(M)=>({method:"POST",headers:{"content-type":"application/json",...V?{"x-os-transfer":V}:{}},body:JSON.stringify(M)});try{let M=await q((j)=>Q(`${Y}/start`,B(G?.file??J),"control",j));if(!M||typeof M!=="object"||Array.isArray(M))throw B9();let L=M;if(Object.keys(L).sort().join(",")!=="partBytes,ticket"||L.partBytes!==Ob||typeof L.ticket!=="string"||!L.ticket||L.ticket.length>65536)throw B9();if(V=L.ticket,X.file instanceof ReadableStream)K=X.file.getReader();let T=Date.now(),O=async()=>{try{if(Date.now()-T>=jY)throw B9();let j=await q(()=>K.read(),Math.max(1,jY-(Date.now()-T)));if(j.value?.byteLength)T=Date.now();return j}catch(j){throw await K.cancel(j).catch(()=>{}),j}};for(let j=0,N=1;j<J.size||J.size===0&&N===1;N++){let A=Math.min(Ob,J.size-j),R;if(X.file instanceof Uint8Array)R=X.file.subarray(j,j+A).slice();else if(X.file instanceof Blob){let E=X.file.slice(j,j+A);R=new Uint8Array(await q(()=>E.arrayBuffer()))}else{R=new Uint8Array(A);let E=0;while(E<A){if(!H||W===H.byteLength){H=void 0,W=0;let w=await O();if(w.done)throw oX();if(!(w.value instanceof Uint8Array))throw oX();if(H=w.value,H.byteLength>J.size-j-E)throw oX()}let x=Math.min(A-E,H.byteLength-W);if(R.set(H.subarray(W,W+x),E),E+=x,W+=x,W===H.byteLength)H=void 0,W=0}}if(R.byteLength!==A)throw oX();if(K&&j+A===J.size){T=Date.now();for(;;){let E=await O();if(E.done)break;if(!(E.value instanceof Uint8Array)||E.value.byteLength)throw oX()}}let S=await q((E)=>Q(`${Y}/part`,{method:"POST",headers:{"content-type":"application/octet-stream","x-os-transfer":V,"x-os-part":String(N)},body:R.buffer},"control",E));R=void 0;let $=S;if(!$||typeof $!=="object"||Object.keys($).sort().join(",")!=="etag,partNumber"||$.partNumber!==N||typeof $.etag!=="string"||!$.etag||$.etag.length>256||/[\u0000-\u001f\u007f]/.test($.etag))throw B9();U.push({partNumber:N,etag:$.etag}),j+=A,T=Date.now()}if(G)for(let j of Object.keys(G.file.enrichments)){let N=await q(()=>G.enrichment(j));if(N.byteLength!==G.file.enrichments[j].size||N.byteLength>iV0)throw oX();await q((A)=>Q(`${Y}/enrichments/${encodeURIComponent(j)}`,{method:"POST",headers:{"content-type":"application/octet-stream","x-os-transfer":V},body:N.buffer.slice(N.byteOffset,N.byteOffset+N.byteLength)},"control",A))}await G?.beforeComplete();let I=B({parts:U});if(new TextEncoder().encode(I.body).byteLength>131072)throw B9();return m5(await q((j)=>Q(`${Y}/complete`,I,!0,j),jY+Math.ceil(J.size/1048576)*1000))}catch(M){if(K)await K.cancel(M).catch(()=>{});if(V)await q((L)=>Q(`${Y}/abort`,B({}),"control",L)).catch(()=>{});throw M instanceof _?M:B9()}finally{if(H=void 0,K?.releaseLock(),z.size)Promise.allSettled([...z]).then(Z);else Z()}}async function LT(X,J,Q,Z){let G,Y=new Promise((V)=>{G=V});try{return await GK0(X,J,async(V,K,H,W)=>{for(let U=0;;U++)try{let z=await Q(V,K,W),q=await JK0(z,H===!0?Tb:rV0);if(!z.ok){let B=eV0[z.status]?.find((M)=>M===q?.error?.code);throw B?new _(B,z.status,B==="capacity"||B==="unavailable"):B9()}return H===!0?m5(q):q}catch(z){let q=z instanceof _?z:B9();if(!q.retryable||U+1===oV0)throw q}},G,Z)}finally{await Y}}function Ib(X,J,Q,Z,G){return LT({file:J,size:X.size,name:X.name},{name:X.name,path:X.path,size:X.size,storage:"remote",requestKey:X.id},Z,{file:X,enrichment:Q,beforeComplete:G})}J7();t6();function NY(X){let J=X,Q=J?.operation;if(!J||Object.keys(J).filter((Y)=>Y!=="localFiles").sort().join(",")!=="operation,requestKey"||!Q||Object.keys(Q).sort().join(",")!=="bundle,diff,expectedHead,guards,id,proposedCommit,request,target"||typeof Q.id!=="string"||!/^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(Q.id)||![Q.expectedHead,Q.proposedCommit].every((Y)=>typeof Y==="string"&&/^[0-9a-f]{40}$/.test(Y))||typeof Q.diff!=="string"||typeof Q.bundle!=="string"||Q.bundle.length>22369624||!/^[A-Za-z0-9+/]+={0,2}$/.test(Q.bundle)||!Q.guards||Object.keys(Q.guards).sort().join(",")!=="paths,schemas"||![Q.guards.paths,Q.guards.schemas].every((Y)=>Array.isArray(Y)&&Y.every((V)=>Array.isArray(V)&&V.length===2&&V.every((K)=>typeof K==="string"))))throw new q5("Invalid prepared record operation");let{input:Z,requestKey:G}=pK({input:Q.request,requestKey:J.requestKey});return{requestKey:G,operation:{...structuredClone(Q),request:Z,target:$9(Q.target)},...J.localFiles===void 0?{}:{localFiles:hG(J.localFiles)}}}J7();function nH(X){return"preflight"in X?{operation:"changes.validate",captured:X.preflight}:("apply"in X)?{operation:"changes.publish",captured:X.apply}:{operation:"changes.publish",request:X}}function BT(X,J,Q){let Z=X.headers["x-os-files-call"];if(X.method!=="POST"||typeof Z!=="string"||!G5.test(Z)){J.writeHead(400),J.end();return}Q.get(Z)?.abort(),X.resume(),J.writeHead(204),J.end()}function OY(X){let J=X.headers["x-os-files-suffix"],Q=X.headers["x-os-files-method"];if(typeof J!=="string"||typeof Q!=="string")throw new _("invalid_input",400);let Z;try{Z=decodeURIComponent(J)}catch{throw new _("invalid_input",400)}let G={};for(let Y of["content-type","x-os-file","x-os-enrichment"]){let V=X.headers[Y];if(typeof V==="string")G[Y]=V}return{suffix:Z,method:Q,headers:G}}async function IY(X,J,Q){X.writeHead(J.status,Object.fromEntries(J.headers));let Z=J.body;if(!Z){X.end();return}let G=Z.getReader;Z.getReader=function(z){if(J.body!==this)throw new _("unavailable",503,!0);return G.call(this,z)};let Y;try{Y=Z.getReader()}catch(z){throw Z.getReader=G,z}let V=J.headers.get("content-length"),K=V&&/^(?:0|[1-9][0-9]*)$/.test(V)&&Number.isSafeInteger(Number(V))?Number(V):void 0,H=0,W=()=>{Y.cancel().catch(()=>{})},U=()=>{W(),X.destroy()};if(Q?.addEventListener("abort",U,{once:!0}),Q?.aborted)U();X.once("close",W),X.socket?.once("close",W);try{for(;;){let z=await Y.read();if(z.done){if(K!==void 0&&H!==K)throw new _("unavailable",503,!0);break}if(Q?.aborted||X.destroyed||X.socket?.destroyed)break;if(H+=z.value.byteLength,K!==void 0&&H>K)throw new _("unavailable",503,!0);if(await new Promise((q,B)=>{let M=()=>B(Error("Files client disconnected"));X.once("close",M),X.socket?.once("close",M),Q?.addEventListener("abort",M,{once:!0}),X.write(z.value,(L)=>{X.removeListener("close",M),X.socket?.removeListener("close",M),Q?.removeEventListener("abort",M),L?B(L):q()})}),K!==void 0&&H===K)break}X.end()}finally{Q?.removeEventListener("abort",U),X.removeListener("close",W),X.socket?.removeListener("close",W),Y.cancel().catch(()=>{}).finally(()=>{try{Y.releaseLock()}catch{}Z.getReader=G})}}function _3(X,J={}){return{root:t8(X,J).files,storage:"local"}}function R1(X,J){return jb(X,J)}function Q3(X,J){return jb(X,J)}function jb(X,J){let Q,Z="authorityLease"in J&&J.authorityLease?structuredClone(J.authorityLease.context):void 0,G,Y=0,V=()=>({"x-os-workspace":J.workspace,..."member"in J?{}:{"x-os-run":J.capability}}),K="member"in J?J.member.request:J.fetch??fetch,H=async()=>{if("member"in J){let L;try{L=await J.member.current()}catch(T){if(T instanceof _&&["unavailable","capacity"].includes(T.code))throw T;if(T instanceof Y0&&T.retryable)throw new _("unavailable",503,!0);throw new _("access_denied",403)}if(!G5.test(L.workspaceId)||!G5.test(L.creator.id)||L.creator.kind!=="member"||L.runId!==void 0||G&&!FJ(G,L))throw new _("access_denied",403);return G??=structuredClone(L),L}if(!(Date.parse(J.expiresAt)>Date.now())||J.authorityLease?.signal.aborted)throw new _("access_denied",403);if(J.authorityLease&&Z){if(Z.workspace!==J.workspace)throw new _("access_denied",403);return{workspaceId:Z.workspaceId,creator:{kind:"routine",id:Z.routineId},runId:J.runId}}let M;try{M=await J.context()}catch(L){if(L instanceof _&&(L.code==="unavailable"||L.code==="capacity"))throw L;if(L instanceof Y0&&L.retryable)throw new _("unavailable",503,!0);throw new _("access_denied",403)}if(!(Date.parse(J.expiresAt)>Date.now())||J.authorityLease?.signal.aborted||M.workspace!==J.workspace||Z&&!FJ(Z,M))throw new _("access_denied",403);return Z??=structuredClone(M),{workspaceId:M.workspaceId,creator:{kind:"routine",id:M.routineId},runId:J.runId}},W=async()=>{if(!X.root)throw new _("unsupported_context",400);return Q??=(async()=>Vj(X.root,await H(),{recheck:H,deletion:{async admit(M,L){if(await H(),"deletion"in J&&J.deletion)await J.deletion.admit(M);else try{await U(`/${M}`,void 0,!1,{method:"DELETE",signal:L})}catch(T){if(!(T instanceof _&&T.code==="local_only"))throw T}await H()},async complete(M,L,T){await U(`/${M.id}`,void 0,!1,{method:"DELETE",signal:T,...L==="local"?{headers:{"x-os-local-removal":encodeURIComponent(JSON.stringify({id:M.id,sha256:M.sha256,size:M.size,mediaType:M.mediaType}))}}:{}})}},async recoverSource(M){let L=M.request,T=(O)=>{let I=hG(O);if(I.some((j)=>j.publicationId!==M.publicationId||j.workspaceId!==M.authority.workspaceId||j.creator.kind!==M.authority.creator.kind||j.creator.id!==M.authority.creator.id||!M.fileIds.includes(j.fileId))||M.fileIds.some((j)=>!I.some((N)=>N.fileId===j)))throw new _("integrity",503);return I};if(L?.kind==="data"){let O=V1(L.body);if(O.operation!=="changes.publish"||O.publicationId!==M.publicationId)throw new _("integrity",503);await z(O,T(L.evidence))}else if(L?.kind==="prepared"){let O=NY(L.body);if(O.operation.id!==M.publicationId)throw new _("integrity",503);T(O.localFiles),await H();let I=await K(`https://${J.workspace}.oddington.ai/api/data`,{method:"POST",headers:{"content-type":"application/json",...V(),"x-os-captured-records":"1"},body:JSON.stringify(nH({apply:O})),redirect:"error",signal:AbortSignal.timeout(120000),cache:"no-store"}),j=await I.json();if(await H(),!I.ok){if([401,403].includes(I.status))throw new _("access_denied",403);if(I.status===409&&j.effect==="unapplied")throw new _("conflict",409);throw new _("unavailable",503,!0)}if(j.receipt?.commit!==O.operation.proposedCommit||j.receipt.diff!==O.operation.diff||j.receipt.repository!==O.operation.request.repository)throw new _("integrity",503)}else throw new _("integrity",503)},remote:{async authorize(M){await U(`/${M.id}/upload/check`,{file:M})},async reconcile(M){let L=await U(`/${M.id}/upload/reconcile`,{file:M});return L===null?void 0:m5(L)},async get(M){try{return m5(await U(`/${M}`))}catch(L){if(L instanceof _&&(L.code==="local_only"||L.code==="access_denied"))return;throw L}},async read(M,L){return U(`/${M}/${L===void 0?"content":`enrichments/${encodeURIComponent(L)}/content`}`,void 0,!0)},async enrich(M,L,T){let O=await U(`/${M}/enrichments`,{metadata:L,bytes:T}),I=bY(O&&typeof O==="object"?Object.fromEntries(Object.entries(O).filter(([j])=>j!=="name")):void 0);return{name:L.name,...I}},async transfer(M,L,T,O,I){return Ib(M,L,T,async(j,N,A)=>{if(await H(),I?.aborted)throw new _("unavailable",503,!0);let R=await K(`https://${J.workspace}.oddington.ai/api/files${j}`,{...N,headers:{...N.headers,...V()},signal:I?AbortSignal.any([I,A]):A,redirect:"error",cache:"no-store"});return await H(),R},O)}}}))(),Q},U=async(M,L,T=!1,O)=>{await H();let I=new AbortController,j=setTimeout(()=>I.abort(),30000),N=O?.signal?AbortSignal.any([I.signal,O.signal]):I.signal;if(N.aborted)throw clearTimeout(j),new _("unavailable",503,!0);let A,R=T?($,E)=>dH($,E,I.signal,K):K;try{A=await R(`https://${J.workspace}.oddington.ai/api/files${M}`,{method:O?.method??(L?"POST":"GET"),headers:{...V(),...O?.headers,...L?.file?{"x-os-upload":encodeURIComponent(JSON.stringify(L.file))}:{},...L?.metadata?{"x-os-enrichment":encodeURIComponent(JSON.stringify(L.metadata))}:{},...L?.bytes?{"content-type":"application/octet-stream"}:{}},...L?.bytes?{body:Uint8Array.from(L.bytes).buffer}:{},redirect:"error",cache:"no-store",signal:N})}catch($){throw $ instanceof _?$:new _("unavailable",503,!0)}finally{clearTimeout(j)}if(T&&A.ok)try{return await H(),A}catch($){throw await A.body?.cancel().catch(()=>{}),$}let S=new v8(30000,O?.signal);try{let $=await r7(A.body,16384,S);if(await H(),S.check(),O&&A.status===204&&$.length===0)return;let E=JSON.parse(new TextDecoder().decode($));if(!A.ok){let x=E?.error?.code;if(["access_denied","local_only","conflict","integrity","invalid_input","unauthenticated","capacity","unavailable"].includes(x))throw new _(x,A.status,x==="capacity"||x==="unavailable");throw new _("unavailable",503,!0)}if(O)throw new _("unavailable",503,!0);return E}finally{S.close()}},z=async(M,L=[])=>{await H();let T=await K(`https://${J.workspace}.oddington.ai/api/data`,{method:"POST",headers:{"content-type":"application/json",...V(),...L.length?{"x-os-local-files":encodeURIComponent(JSON.stringify(L))}:{}},body:JSON.stringify(M),redirect:"error",signal:AbortSignal.timeout(120000),cache:"no-store"}),O=await T.json();if(!T.ok)throw TL(T.status,O);return await H(),O},q=async(M,L,T)=>{let O=await H();if(!X.root||!M.length)return T([],async()=>{});let I=await W(),j=[];for(let N of M)if(await I.has(N.fileId))j.push(N);if(!j.length)return T([],async()=>{});return I.sourceHandoff(j,L,async(N,A)=>{return await H(),T(j.map((R)=>({...R,workspaceId:O.workspaceId,creator:O.creator,publicationId:L})),A)})},B=async(M,L=null,T,O)=>{if(Y>=d1)throw new _("capacity",429,!0);Y++;try{if("filesAccess"in J&&(J.filesAccess===null||M.method!=="GET"&&J.filesAccess!=="read-write"))throw new _("access_denied",403);if(!M||typeof M!=="object"||Object.keys(M).some((g)=>!["suffix","method","headers"].includes(g))||typeof M.suffix!=="string"||!M.headers||typeof M.headers!=="object"||Array.isArray(M.headers)||Object.entries(M.headers).some(([g,f])=>!["content-type","x-os-file","x-os-enrichment"].includes(g)||typeof f!=="string"))throw new _("invalid_input",400);let I=/^\/([^/]+)(?:\/(content|enrichments|upload)(?:\/([^/]+)\/content)?)?$/.exec(M.suffix);if(M.suffix!==""&&(!I||!G5.test(I[1])))throw new _("invalid_input",400);let j=I?.[2]==="enrichments"&&!I[3],N=I?.[2]==="upload"&&!I[3],A=M.method==="DELETE"&&!!I&&!I[2];if(I?.[2]==="upload"&&!N)throw new _("invalid_input",400);if(!A&&M.method!==(M.suffix===""||j||N?"POST":"GET"))throw new _("method_not_allowed",405);if(A){if(Object.keys(M.headers).length)throw new _("invalid_input",400);let g=new v8(30000,T);try{try{await r7(L,0,g)}catch(f){if(f instanceof _&&f.code==="request_too_large")throw new _("invalid_input",400);throw f}g.check(),await H(),g.check()}finally{g.close()}}let R;if(M.suffix===""||j){let g=M.headers[M.suffix===""?"x-os-file":"x-os-enrichment"];if(!g||g.length>eJ||M.headers["content-type"]!=="application/octet-stream")throw new _("invalid_input",400);try{R=JSON.parse(decodeURIComponent(g))}catch{throw new _("invalid_input",400)}}let S=M.suffix===""?s7(R,d6):void 0,$=j?lJ(R,h8):void 0;await H();let E=S?.storage??X.storage;if(S&&E==="remote"&&X.root){if(await WK0(HK0(X.root,".oddington-files")).catch((f)=>{if(f.code==="ENOENT")return;throw f})&&await(await W()).lookup(S.requestKey))throw new _("conflict",409)}let x="inputLocalFiles"in J?J.inputLocalFiles:void 0,w=!S&&x?.descriptors.find((g)=>g.id===I[1]);if(w){if(M.method!=="GET")throw new _("access_denied",403);let g=x.owner;if(!FJ(await g.get(w.id),w))throw new _("integrity",409);let f=I[2]?await g.read(w.id,I[3]===void 0?void 0:decodeURIComponent(I[3])):Response.json(w);return await H(),f}let C=S?E==="local"?await W():void 0:X.root&&await(await W()).has(I[1])?await W():void 0,D;if(A){if(T?.aborted)throw new _("unavailable",503,!0);if(C){if(await C.admitDeletion(I[1],T),(await C.cleanupDeletion(I[1],T)).state!=="deleted")throw new _("unavailable",503,!0)}else await U(M.suffix,void 0,!1,{method:"DELETE",signal:T});if(T?.aborted)throw new _("unavailable",503,!0);D=new Response(null,{status:204})}else if(S&&C){if(O&&!FJ(await O.owner.get(O.file.id),O.file))throw new _("integrity",503);let g=await C.create({...S,storage:"local"},L??new ReadableStream({start(f){f.close()}}),T,O?.file);if(O){for(let[f,P]of Object.entries(O.file.enrichments)){let m=new v8(30000,T);try{let v=await O.owner.read(O.file.id,f),a=await r7(v.body,P.size,m),X0=await C.enrich(g.id,{name:f,size:a.length},a);if(!FJ(X0,{name:f,...P}))throw new _("integrity",503)}finally{m.close()}}if(!FJ(await O.owner.get(O.file.id),O.file))throw new _("integrity",503)}D=Response.json(await C.get(g.id))}else if(S&&S.size>h8)D=Response.json(await LT({file:L,size:S.size,name:S.name},{...S,storage:"remote"},async(g,f,P)=>{await H();let m=await K(`https://${J.workspace}.oddington.ai/api/files${g}`,{...f,headers:{...Object.fromEntries(new Headers(f.headers)),...V()},signal:T?AbortSignal.any([T,P]):P,redirect:"error",cache:"no-store"});return await H(),m}));else if(C&&!S&&!j)if(N)D=Response.json(await C.upload(I[1],T));else if(I[2])D=await C.read(I[1],I[3]===void 0?void 0:decodeURIComponent(I[3]));else D=Response.json(await C.get(I[1]));else{let g=new v8(30000,T);try{let f=S||j?await r7(L,S?.size??$.size,g):void 0;if(f&&f.length!==(S?.size??$.size))throw new _("invalid_input",400);if(C)D=Response.json(await C.enrich(I[1],$,f));else{let P={...M.headers,...V()};if(S)P["x-os-file"]=encodeURIComponent(JSON.stringify({...S,storage:"remote"}));D=await K(`https://${J.workspace}.oddington.ai/api/files${M.suffix}`,{method:M.method,headers:P,...f?{body:f}:{},redirect:"error",signal:g.signal,cache:"no-store"})}}finally{g.close()}}return await H(),D}catch(I){throw await L?.cancel().catch(()=>{}),I}finally{Y--}};return{isTransferredInput(M){return"inputLocalFiles"in J&&J.inputLocalFiles?.descriptors.some((L)=>L.id===M)===!0},stream:B,async admit(M){if("filesAccess"in J&&J.filesAccess!=="read-write")throw new _("access_denied",403);if(M.suffix!==""||M.method!=="POST"||M.headers["content-type"]!=="application/octet-stream")throw new _("invalid_input",400);let L=M.headers["x-os-file"];if(!L||L.length>eJ)throw new _("invalid_input",400);let T;try{T=s7(JSON.parse(decodeURIComponent(L)),d6)}catch(O){if(O instanceof _)throw O;throw new _("invalid_input",400)}if(await H(),(T.storage??X.storage)==="local"&&!X.root)throw new _("unsupported_context",400)},local:W,sourceHandoff:q,async sourceEvidence(M,L){return q(M,L,async(T)=>T)},async data(M){let L=V1(M);await H();let T=z,O=[];if(X.root&&(L.operation==="changes.validate"||L.operation==="changes.publish")){let I=(L.creates??[]).map((j)=>({ref:j.ref,fields:j.fields}));if(L.updates.length){let j=await T({operation:"collections.list",repository:L.repository});for(let N=0;N<L.updates.length;N+=100){let A=L.updates.slice(N,N+100),R=j.filter(($)=>$.type==="source");if(!R.length)break;let S=await T({operation:"records.select",repository:L.repository,query:Object.fromEntries(R.map(($)=>[$.name,{$:{where:{$ref:{$in:A.map((E)=>E.ref)}},limit:100}}]))});for(let $ of R)for(let E of S[$.name]??[]){let x=A.find((w)=>w.ref===E.$ref);if(E.$version!==x.expectedVersion)throw new Y0("conflict",!1,"unapplied");I.push({ref:x.ref,fields:{...E,...x.set}})}}}O=vG(I.map((j)=>({...j,schema:{type:"source"}})))}return q(O,L.operation==="changes.publish"?L.publicationId:crypto.randomUUID(),async(I,j)=>{if(L.operation==="changes.publish"&&I.length)await j({kind:"data",body:L,evidence:I});return T(L,I)})},async request(M,L){let T=M;if(!T||typeof T!=="object"||Object.keys(T).some((R)=>!["suffix","method","headers","bytes"].includes(R))||T.bytes!==void 0&&(typeof T.bytes!=="string"||T.bytes.length>Math.ceil(h8/3)*4))throw new _("invalid_input",400);let O=Buffer.from(T.bytes??"","base64");if(T.bytes!==void 0&&O.toString("base64")!==T.bytes||O.length>h8)throw new _("invalid_input",400);let{bytes:I,...j}=T,N=await B(j,new ReadableStream({start(R){R.enqueue(O),R.close()}}),void 0,L),A=new v8(30000);try{let R=await r7(N.body,h8,A);await H(),A.check();let S=Object.fromEntries(N.headers);if(N.status===204&&R.length===0)return{status:204,headers:S};return T.suffix.endsWith("/content")&&N.ok?{status:N.status,headers:S,bytes:Buffer.from(R).toString("base64")}:{status:N.status,headers:S,json:JSON.parse(new TextDecoder().decode(R))}}catch(R){throw R instanceof _?R:new _("unavailable",503,!0)}finally{A.close()}}}}async function Nb(X){let J=await MT(),Q=YK0(32).toString("hex"),Z=new Set,G=new Map,Y=!0,V=VK0((K,H)=>{let W=(B,M)=>{H.writeHead(B,{"content-type":"application/json","cache-control":"no-store"}),H.end(JSON.stringify(M))},U=K.url==="/data/query",z=K.url==="/files/stream";if(K.url==="/files/cancel"&&K.headers.authorization===`Bearer ${Q}`){BT(K,H,G);return}if(!Y||!["/files/request","/files/stream","/files/admit","/data/query"].includes(K.url??"")||K.method!=="POST"||K.headers.authorization!==`Bearer ${Q}`){K.resume(),W(403,{error:{code:"access_denied"}});return}if(Z.size>=d1){K.resume(),W(429,{error:{code:"capacity"}});return}let q=(async()=>{try{if(K.url==="/files/admit"){await X.admit(OY(K)),K.resume(),H.writeHead(204),H.end();return}if(z){let T=K.headers["x-os-files-call"];if(typeof T!=="string"||!G5.test(T)||G.has(T))throw new _("invalid_input",400);let O=new AbortController;G.set(T,O);let I=()=>O.abort();K.once("aborted",I),H.once("close",I);let j=setInterval(()=>{if(!H.headersSent&&!H.destroyed)H.writeProcessing()},1e4);try{await IY(H,await X.stream(OY(K),KK0.toWeb(K,{strategy:{highWaterMark:65536,size:(N)=>N.byteLength}}),O.signal),O.signal)}finally{G.delete(T),clearInterval(j),K.removeListener("aborted",I),H.removeListener("close",I)}return}let B=Buffer.alloc(25165824),M=0;for await(let T of K){if(M+=T.length,M>B.length)throw new _("request_too_large",413);B.set(T,M-T.length)}let L;try{L=JSON.parse(B.subarray(0,M).toString())}catch{throw new _("invalid_input",400)}W(200,await(U?X.data(L):X.request(L)))}catch(B){if(U&&B instanceof Y0){W(B.code==="access_denied"?403:B.code==="conflict"?409:B.retryable?503:400,{error:{code:B.code,effect:B.effect}});return}let M=B instanceof _?B:new _("unavailable",503,!0);if(H.headersSent)H.destroy();else W(M.status,{error:{code:M.code}})}})();Z.add(q),q.finally(()=>Z.delete(q))});V.requestTimeout=0,V.headersTimeout=30000,V.maxConnections=d1*2;try{await new Promise((W,U)=>{V.once("error",U),V.listen(J.kind==="tcp"?J.listenOptions:J.address,()=>{V.removeListener("error",U),W()})});let K=V.address(),H=J.kind==="socket"?J.address:typeof K==="object"&&K?`tcp://127.0.0.1:${K.port}`:void 0;if(!H)throw new _("unavailable",503,!0);return{environment:{OS_FILES_SOCKET:H,OS_FILES_TOKEN:Q},async close(){Y=!1;for(let U of G.values())U.abort();let W=new Promise((U,z)=>V.close((q)=>q?z(q):U()));await Promise.all(Z),V.closeAllConnections(),await W,await J.release()}}}catch(K){throw V.closeAllConnections(),V.close(),await J.release(),K}}async function $b(X,J,Q={}){let Z=Q.request??R9,G=Q3(_3(X,Q),{workspace:X,member:{async current(){let H=new v8(30000);try{let W;try{W=await H.track(Z(X,"/api/files/context",{signal:H.signal}))}catch(U){if(U instanceof _)throw U;if(U instanceof V5&&U.kind!=="unavailable")throw new _("access_denied",403);throw new _("unavailable",503,!0)}if(!W.ok){await W.body?.cancel().catch(()=>{});let U=[401,403].includes(W.status);throw new _(U?"access_denied":W.status===429?"capacity":"unavailable",U?403:W.status===429?429:503,!U)}try{let U=await r7(W.body,4096,H,"unavailable"),z=JSON.parse(new TextDecoder("utf-8",{fatal:!0}).decode(U));if(!z||Object.keys(z).sort().join(",")!=="creator,workspaceId"||!G5.test(z.workspaceId)||!z.creator||Object.keys(z.creator).sort().join(",")!=="id,kind"||z.creator.kind!=="member"||!G5.test(z.creator.id))throw Error();return z}catch{throw new _("unavailable",503,!0)}}finally{H.close()}},request:(H,W)=>Z(X,String(H),W)}}),Y=await Nb(G),V=["OS_FILES_SOCKET","OS_FILES_TOKEN","OS_ROUTINE_LOCAL","OS_ROUTINE_LOCAL_SOCKET","OS_ROUTINE_LOCAL_TOKEN"],K=V.map((H)=>process.env[H]);for(let H of V)delete process.env[H];Object.assign(process.env,Y.environment);try{await UK0.delete(J)}finally{for(let[H,W]of V.entries()){let U=K[H];if(U===void 0)delete process.env[W];else process.env[W]=U}await Y.close()}}var tX=` os files add --workspace <slug> --path <relative-path> [--name <filename>] [--working-root <path>] [--csv <parsing-hints-json>] [--json]
336
336
  os files delete --workspace <slug> --id <file-id> --yes [--json]
337
337
 
@@ -405,12 +405,15 @@ Scopes: ${X.config.scopes.join(", ")}`}function LK0(X){if(X.length===0||X.includ
405
405
  ${X.action}`}}function yJ(X,J,Q){throw new xJ({code:X,message:J,action:Q})}var $T=()=>yJ("claude_policy","Claude has managed settings, or OS could not verify its settings policy.","Run claude doctor to inspect the policy. Ask your administrator to make the required isolated AI execution available."),mK0=/does not exist|^Error: Domain 'com\.anthropic\.claudecode' not found\.\s*$/i;async function uK0(X,J){let Q=process.platform==="darwin"?"/Library/Application Support/ClaudeCode":process.platform==="win32"?"C:\\Program Files\\ClaudeCode":"/etc/claude-code";for(let G of["managed-settings.json","managed-settings.d","managed-mcp.json"])if(await hK0(ab(Q,G)).then(()=>!0,(V)=>{if(V.code==="ENOENT")return!1;return $T()}))$T();let Z=(G,Y,V)=>new Promise((K,H)=>{let W=sb(G,Y,{env:J,shell:!1,stdio:["ignore","ignore","pipe"]}),U="",z=!1,q=()=>{z=!0,W.kill("SIGKILL")},B=setTimeout(q,5000);if(X.addEventListener("abort",q,{once:!0}),X.aborted)q();W.stderr.on("data",(M)=>{if(Buffer.byteLength(U)+M.length>4096)q();else U+=M.toString("utf8")}),W.once("error",()=>{z=!0}),W.once("close",(M)=>{if(clearTimeout(B),X.removeEventListener("abort",q),!z&&M===1&&V.test(U))K();else H(new xJ({code:"claude_policy",message:"OS could not verify the Claude managed-settings policy.",action:"Run claude doctor to inspect the settings policy, then repeat the command."}))})});if(process.platform==="darwin")await Z("/usr/bin/defaults",["read","com.anthropic.claudecode"],mK0);else if(process.platform==="win32")for(let G of["HKLM","HKCU"])await Z("reg.exe",["query",`${G}\\SOFTWARE\\Policies\\ClaudeCode`,"/v","Settings"],/unable to find the specified registry key or value/i)}var pK0=async(X,J)=>{return new Promise((Q,Z)=>{let G=sb("claude",X,{cwd:J.cwd,env:J.env,shell:!1,detached:process.platform!=="win32",stdio:["pipe","pipe","pipe"]}),Y=[],V=0,K,H=()=>{try{if(process.platform!=="win32")process.kill(-G.pid,"SIGKILL");else G.kill("SIGKILL")}catch{}},W=()=>{K??=new y0("cancelled"),H()};if(J.signal.addEventListener("abort",W,{once:!0}),G.stdout.on("data",(U)=>{if(V+=U.length,V>NT)K??=new y0("output_too_large"),H();else Y.push(Buffer.from(U))}),G.stderr.on("data",(U)=>{if((V+=U.length)>NT)K??=new y0("output_too_large"),H()}),G.stdin.on("error",()=>{K??=new y0("provider_failure"),H()}),G.once("error",()=>{K??=new y0("capability_unavailable")}),G.once("exit",H),G.once("close",(U)=>{if(H(),J.signal.removeEventListener("abort",W),K)Z(K);else try{Q({stdout:new TextDecoder("utf-8",{fatal:!0}).decode(Buffer.concat(Y)),code:U})}catch{Z(new y0("provider_failure"))}}),J.signal.aborted)W();else G.stdin.end(J.stdin)})};function cK0(X){let J={};for(let Q of["HOME","PATH","USER","LOGNAME","SHELL","TMPDIR","SystemRoot","APPDATA","LOCALAPPDATA"])if(X[Q]!==void 0)J[Q]=X[Q];return{...J,CLAUDE_CODE_MAX_RETRIES:"0",CLAUDE_CODE_MAX_OUTPUT_TOKENS:"8192",CLAUDE_CODE_DISABLE_AUTO_MEMORY:"1",CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC:"1",CLAUDE_ENABLE_BYTE_WATCHDOG:"0",CLAUDE_ENABLE_STREAM_WATCHDOG:"0",DISABLE_TELEMETRY:"1",DISABLE_ERROR_REPORTING:"1",DISABLE_NON_ESSENTIAL_MODEL_CALLS:"1"}}function bJ(X){let J=X.process??pK0,Q=cK0(X.environment??process.env);async function Z(Y,V){let K=await xK0(ab(vK0(),"os-ai-"));try{return await bK0(K,448),Y.throwIfAborted(),await V(K)}finally{await gK0(K,{recursive:!0,force:!0})}}async function G(Y=AbortSignal.timeout(1e4)){try{await Z(Y,async(V)=>{await(X.endpointPolicy??uK0)(Y,Q);let K;try{K=await J(["--version"],{cwd:V,env:Q,signal:Y,stdin:""})}catch{return yJ("claude_missing","OS could not start Claude Code on this computer.","Install Claude Code and add claude to PATH. If already installed, run claude doctor.")}let H=/\b(\d+)\.(\d+)\.(\d+)\b/.exec(K.stdout);if(K.code!==0||!H||Number(H[1])<2||Number(H[1])===2&&(Number(H[2])<1||Number(H[2])===1&&Number(H[3])<259))yJ("claude_version",`OS needs Claude Code ${_K0} or newer for unattended permission handling; ${H?`found ${H[0]}`:"the installed version could not be verified"}.`,"Run claude update, then repeat the routine command.");let W=await J(["auth","status"],{cwd:V,env:Q,signal:Y,stdin:""}),U=JSON.parse(W.stdout);if(W.code!==0||U.loggedIn!==!0)yJ("claude_not_signed_in","Claude Code is not signed in.","Run claude auth login, then repeat the routine command.");if(U.authMethod!=="claude.ai"||U.apiProvider!=="firstParty"||!["pro","max","team","enterprise"].includes(U.subscriptionType))yJ("claude_authentication","Local routine AI requires a first-party Claude subscription login.","Run claude auth status to check the login, then claude auth login to sign in with your Claude subscription.");let z=await J(["doctor"],{cwd:V,env:Q,signal:Y,stdin:""}),q=z.stdout.split(`
406
406
  `).map((B)=>B.trim()).filter((B)=>B.startsWith("Managed settings (remote):"));if(z.code!==0||q.length!==1||!/^Managed settings \(remote\): (?:not fetched — requires an Enterprise or Team subscription|no server-managed settings configured|not configured)$/i.test(q[0]))$T()})}catch(V){if(V instanceof xJ)throw V;yJ("claude_diagnostics","OS could not complete Claude Code readiness checks.","Run claude auth status and claude doctor. If either command is unsupported, run claude update, then repeat the routine command.")}}return{readiness:G,async generate(Y,V){let K=VY(Y),H=Date.now(),W=new AbortController,U=()=>W.abort();V.signal.addEventListener("abort",U,{once:!0});let z=setTimeout(U,Math.max(0,Math.min(gx,V.deadline-H)));if(V.signal.aborted||V.deadline<=H)U();let q="provider_failure",B,M,L=async()=>{if(W.signal.aborted)throw new y0("cancelled");try{await V.assertCurrent()}catch(T){throw T instanceof y0?T:new y0("access_denied")}if(W.signal.aborted)throw new y0("cancelled")};try{await L(),await G(W.signal),await L();let T=await db(K,V.readFile,W.signal,nb),O=JSON.stringify({type:"user",message:{role:"user",content:T}})+`
407
407
  `;if(Buffer.byteLength(O)>=nb)throw new y0("input_too_large");await L();let I=await Z(W.signal,(R)=>J(["-p","--input-format","stream-json","--output-format","stream-json","--verbose","--safe-mode","--tools","","--strict-mcp-config","--mcp-config",'{"mcpServers":{}}',"--disable-slash-commands","--no-chrome","--no-session-persistence","--permission-mode","dontAsk","--permission-prompts","none","--max-turns","1","--setting-sources","","--settings",'{"disableAllHooks":true}',"--system-prompt",fK0,"--model",DJ,"--effort","high"],{cwd:R,env:Q,signal:W.signal,stdin:O})),j;if(Buffer.byteLength(I.stdout)>NT)throw new y0("output_too_large");try{j=I.stdout.trim().split(`
408
- `).map((R)=>JSON.parse(R))}catch{throw new y0("provider_failure")}let N=j.filter((R)=>R.type==="result");if(N.length===1){let R={};for(let S of["input_tokens","output_tokens","cache_read_input_tokens","cache_creation_input_tokens"]){let $=N[0].usage?.[S];if(typeof $==="number"&&Number.isFinite($)&&$>=0)R[S]=$}if(Object.keys(R).length)B=R;if(typeof N[0].total_cost_usd==="number"&&Number.isFinite(N[0].total_cost_usd)&&N[0].total_cost_usd>=0)M=N[0].total_cost_usd}if(I.code!==0||N.length!==1||N[0].is_error||N[0].subtype!=="success"||j.some((R)=>R.type==="system"&&(String(R.subtype).startsWith("hook")||R.subtype==="init"&&(R.model!==DJ||!Array.isArray(R.tools)||R.tools.length||!Array.isArray(R.mcp_servers)||R.mcp_servers.length)))||j.some((R)=>R.type==="assistant"&&(R.message?.model!==DJ||R.message?.content?.some((S)=>!["text","thinking","redacted_thinking"].includes(S.type))))||!j.some((R)=>R.type==="assistant"&&R.message?.model===DJ)||Object.keys(N[0].modelUsage??{}).some((R)=>R!==DJ))throw new y0("provider_failure");let A=fx(K,N[0].result);return await L(),q="succeeded",A}catch(T){let O=W.signal.aborted&&!(T instanceof y0&&T.code==="access_denied")?new y0("cancelled"):T instanceof y0?T:new y0("provider_failure");throw q=O.code,O}finally{try{let T={kind:K.kind,runId:V.runId,...V.stepId?{stepId:V.stepId}:{},outcome:q,provider:"anthropic",model:DJ,durationMs:Date.now()-H,...B?{usage:B}:{},...M===void 0?{}:{costUsd:M}};if(Buffer.byteLength(JSON.stringify(T))>xH)throw new y0("provider_failure");if(await V.evidence(T),q==="succeeded")await L()}catch(T){throw T instanceof y0?T:new y0("provider_failure")}finally{clearTimeout(z),V.signal.removeEventListener("abort",U)}}}}}class d7 extends Error{code;constructor(X,J){super(J);this.code=X}}class M8 extends Error{issues;code="requirements_unavailable";constructor(X){super(["Routine requirements need attention:",...X.map((J)=>`
409
- - ${J.message}
410
- ${J.action}`),`
411
- No routine steps ran. Fix these requirements, then repeat the command.`].join(`
412
- `));this.issues=X;this.name="RoutineRequirementsError"}}var ib=/^[a-z0-9][a-z0-9-]{0,62}$/,lK0=["missing","disabled","disconnected","unsupported","ambiguous"];function gJ(X){if(!X||typeof X!=="object"||Array.isArray(X))return;let J=X;if(Object.keys(J).sort().join(",")!=="issues,workspace"||typeof J.workspace!=="string"||!ib.test(J.workspace)||!Array.isArray(J.issues)||!J.issues.length||J.issues.length>129)return;for(let Q of J.issues){if(!Q||typeof Q!=="object"||Array.isArray(Q)||Object.keys(Q).sort().join(",")!=="kind,name,reason"||!lK0.includes(Q.reason)||typeof Q.name!=="string")return;if(Q.kind==="connection"){if(!/^[a-z0-9][a-z0-9-]{0,62}\/[a-z0-9][a-z0-9-]{0,62}$/.test(Q.name))return}else if(Q.kind==="repository"){if(!ib.test(Q.name))return}else if(Q.kind!=="files"||Q.name!=="files")return}return J}function oH(X){let{workspace:J}=X;return X.issues.map((Q)=>{let Z=`${Q.kind}_${Q.reason}`;if(Q.kind==="connection"){let[G,Y]=Q.name.split("/"),V=Q.reason==="missing"||Q.reason==="disconnected"?G==="dropbox"?`Create or reconnect it: os connection create dropbox --workspace ${J} --name ${Y} --root <existing-folder>
413
- Replace <existing-folder> with your existing Dropbox folder.`:`Set up the connection: os connection ${["gmail","airtable"].includes(G)?`create ${G} `:""}--help (workspace ${J}, name ${Y}).`:`Inspect the workspace connections: os connection list --workspace ${J} --all`;return{code:Z,message:`Connection "${Q.name}" ${Q.reason==="missing"?"does not exist":`is ${Q.reason}`} in workspace "${J}".`,action:V}}if(Q.kind==="repository")return{code:Z,message:`Repository "${Q.name}" is ${Q.reason} in workspace "${J}".`,action:`Check the repository alias in the routine and its workspace binding. Inspect connections: os connection list --workspace ${J} --all`};return{code:Z,message:`File storage is ${Q.reason} in workspace "${J}".`,action:`Inspect File storage: os files storage inspect --workspace ${J}`}})}async function tH(X,J){let[Q,Z]=await Promise.allSettled([X(),J?.()]);if(Q.status==="rejected"&&!(Q.reason instanceof M8))throw Q.reason;if(Z.status==="rejected"&&!(Z.reason instanceof xJ))throw Z.reason;let G=[...Q.status==="rejected"?Q.reason.issues:[],...Z.status==="rejected"?[Z.reason.diagnostic]:[]];if(G.length)throw new M8(G);return Q.value}async function eH(X,J,Q,Z){let G;try{G=await(Z.request??x5)(`/api/cli/local-routines/${X}/${Z.mode}`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({remote:J.remote,branch:J.branch,access:Q}),redirect:"error",signal:AbortSignal.any([AbortSignal.timeout(20000),...Z.signal?[Z.signal]:[]])})}catch(H){if(H instanceof V5&&H.kind!=="unavailable")throw new d7("os_login_required","Your OS sign-in needs attention. Run os login, then repeat the routine command.");throw new d7("routine_start_unavailable","OS could not check the routine requirements. Check your network connection, then repeat the command.")}let Y=await L8(G,G.ok&&Z.mode==="resolve"?4194304:65536,20000),V;try{V=Y&&JSON.parse(new TextDecoder("utf-8",{fatal:!0}).decode(Y))}catch{}if(G.ok&&V)return V;let K=G.status===409&&V?.code==="requirements_unavailable"?gJ(V.requirements):void 0;if(K)throw new M8(oH(K));if(J3(V?.code))throw new F5(V.code);if(G.status===401)throw new d7("os_login_required","Your OS sign-in needs attention. Run os login, then repeat the routine command.");if([403,409].includes(G.status))throw new d7("routine_access_unavailable","OS could not confirm this routine's workspace access or configured capabilities. Run os whoami to check your account and workspace, then inspect the routine's named connections. No routine steps ran.");throw new d7("routine_start_unavailable","OS could not check the routine requirements. Repeat the command when OS is available. No routine steps ran.")}async function Xg(X,J=process.stdin){if(X===void 0)return;let Q;if(X==="-"){let Z=[],G=0;for await(let Y of J){if((G+=Y.length)>r9)throw Error("Routine input exceeds 256 KiB");Z.push(Buffer.from(Y))}Q=Buffer.concat(Z)}else{let Z=await tb(X,"r");try{let G=await Z.stat();if(!G.isFile()||G.size>r9)throw Error("Routine input must be a JSON file of at most 256 KiB");if(Q=await Z.readFile(),Q.length>r9)throw Error("Routine input exceeds 256 KiB")}finally{await Z.close()}}try{return JSON.parse(new TextDecoder("utf-8",{fatal:!0}).decode(Q))}catch{throw Error("Routine input must contain one valid JSON value")}}async function ob(X,J){let Q=`${X}.${crypto.randomUUID()}.tmp`,Z=await tb(Q,"wx",384);try{await Z.writeFile(JSON.stringify(J,null,2)),await Z.sync()}finally{await Z.close()}await eb(Q,X)}async function Qg(X,J){let Q=await q8(X,J);return(await T1(Q.root,X)).contract}class Jg extends Error{kind;diagnostics;code="routine_inspection_failed";name="LocalRoutineInspectionError";constructor(X,J){let Q=X==="timed_out"?"Routine definition inspection timed out; no Run was accepted":X==="cancelled"?"Routine definition inspection was cancelled; no Run was accepted":"Routine definition or input is invalid; no Run was accepted",Z=J.spawnError?`spawn=${J.spawnError}`:J.signal?`signal=${J.signal}`:J.exitCode!==void 0?`exit=${J.exitCode}`:"exit=unavailable";super(`${Q} (child=${J.childFailure??X}, ${Z}, output=${J.outputBytes}${J.outputTruncated?"+":""} bytes)`);this.kind=X;this.diagnostics=J}}async function XU(X,J,Q={}){let Z=Q.request??x5,G=Q.environment??process.env,Y=bJ({environment:G,process:Q.aiProcess}),V=await q8(X,Q.cwd),K=Q.definition??await T1(V.root,X,Q.sourceRuntime,Q.childExecutable);if(!K||K.contract.id!==X)throw Error("Routine definition not found");if(Q.host&&K.source.version!==Q.host.sourceVersion)throw new Y0("access_denied");let H=rH({$schema:H8,access:K.contract.access}),W=async(e,s,t=!1)=>{if(!t)await Q.host?.assertCurrent();let U0;try{U0=await Z(e,{method:"POST",body:JSON.stringify(s),headers:{"content-type":"application/json"},redirect:"error",signal:AbortSignal.timeout(20000)})}catch(b){if(b instanceof V5&&b.kind!=="unavailable")throw new Y0("access_denied");throw new Y0("unavailable",!0)}if(!U0.ok){let b=await L8(U0,65536,20000),h,y;try{let l=b&&JSON.parse(new TextDecoder("utf-8",{fatal:!0}).decode(b));if(h=l?.code,U0.status===409&&h==="requirements_unavailable")y=gJ(l.requirements)}catch{}if(y)throw new Y0("access_denied");if(J3(h))throw new F5(h);throw new Y0([401,403,409].includes(U0.status)?"access_denied":"unavailable",![401,403,409].includes(U0.status))}let k=await U0.json();if(!t&&!e.endsWith("/accept"))await Q.host?.assertCurrent();return k},U={remote:V.remote,branch:V.branch},z={...U,access:H.access},q=await tH(async()=>{await Q.host?.assertCurrent();let e=await eH(X,V,H.access,{mode:"resolve",request:Z,signal:Q.signal});return await Q.host?.assertCurrent(),u3(e)},H.access.ai===!0?()=>Y.readiness(Q.signal):void 0);if(!q.definition||!X4(q.definition.access,H.access))throw new Y0("access_denied");let B=await(Q.identity??B6)();if(Q.host&&(q.workspace!==Q.host.workspace||B.id!==Q.host.memberId))throw new Y0("access_denied");let M=crypto.randomUUID(),L=dK0(32).toString("hex"),T=t8(q.workspace,Q).runs;await M9(T,!0);let O=p3(T,M);await sK0(O,{mode:448});let I,j=!1,N,A,R=!1,S=!1,$=new AbortController,E=()=>$.abort(),x=["SIGINT","SIGTERM","SIGHUP"];for(let e of x)process.on(e,E);if(Q.signal?.addEventListener("abort",E,{once:!0}),Q.signal?.aborted)E();let w,C,D=!1,g=Date.now(),f,P={},m=async()=>{let e=p3(O,"execution.json");await ob(e,P)},v=sH(q.workspace,async(e,s)=>{if(e.routine!==X||e.starter.id!==B.id||I&&e.id!==I.runId||s.scope&&!X4(s.scope,q))throw new Y0("access_denied")},Q),a=!1,X0=!1,z0=[],G0=0;try{let{authoredFiles:e,...s}=await OJ(V,X,p3(O,"source"),Q.sourceRuntime,K.entry);if(s.version!==K.source.version)throw Error("Routine source changed before acceptance");if(Q.host&&s.version!==Q.host.sourceVersion)throw new Y0("access_denied");if(s.provenance?.branch!==U.branch)throw Error("Routine checkout changed before capture");let t=structuredClone(J);N=await HY({sourceDirectory:p3(O,"source"),source:s,workingRoot:V.root,input:t,mode:"inspect",definitionOnly:!0,environment:AT(G,{capability:"",workspace:q.workspace}),signal:$.signal,accept:async()=>{throw Error("Inspection cannot report business work")},assertCurrent:async()=>{},maximumMilliseconds:Q.inspectionMaximumMilliseconds??30000,executable:Q.childExecutable});let U0=await N.completion;if(N=void 0,U0.state!=="succeeded"||!U0.definition){let c=U0.state==="cancelled"?"cancelled":U0.failure==="timed_out"?"timed_out":"invalid_definition_or_input";throw new Jg(c,{...U0.failure?{childFailure:U0.failure}:{},...U0.termination??{},outputBytes:Buffer.byteLength(U0.output),outputTruncated:U0.truncated})}let k=U0.definition;if(!X4(k,K.contract))throw Error("Routine definition changed before acceptance");if(k.access.ai===!0)await Y.readiness($.signal);let b=_3(q.workspace,Q),h=Q3(b,{workspace:q.workspace,member:{async current(){let c=u3(await W(`/api/cli/local-routines/${X}/resolve`,z));if(!X4(c,q)||D||$.signal.aborted)throw new _("access_denied",403);return{workspaceId:q.workspaceId,creator:{kind:"member",id:B.id}}},request:(c,Q0)=>(Q.filesRequest??R9)(q.workspace,String(c),Q0)}}),y=(c,Q0)=>aH(aK0(Q.cwd??process.cwd(),c),{storage:Q0.storage??"local",path:Q0.path},h,M,$.signal);if(Q.explicitInput)t=await cb(k.input,t,k.inputDefault,Q.explicitInput.jsonPresent,Q.explicitInput.namedFiles,y);else{if(t===void 0)t=structuredClone(k.inputDefault);if(t===void 0&&(Q.interactive??process.stdin.isTTY))t=await iH(k.input,y)}y8(k.input,t);let l=L1(k.input,t),r=[],o;if(l.length&&b.root){let c=AbortSignal.any([$.signal,AbortSignal.timeout(20000)]),Q0;try{Q0=await(Q.identity??B6)({fetch:(J0,j0)=>(Q.fetch??fetch)(J0,{...j0,signal:c})})}catch(J0){if(J0 instanceof V5&&J0.kind!=="unavailable")throw new Y0("access_denied");throw new Y0("unavailable",!0)}if(Q0.id!==B.id)throw new Y0("access_denied");o=await h.local();for(let J0 of l)if(await o.has(J0.id)){if(!X4(await o.get(J0.id),J0))throw new _("integrity",409);if(await o.placement(J0.id)==="local")r.push(J0)}}for(let{file:c,storage:Q0}of GY(k.input,t,"local"))if(r.some((J0)=>J0.id===c.id)!==(Q0==="local"))throw new _("invalid_input",400);if($.signal.aborted)throw Error("Local routine cancelled before acceptance");let T0={checkout:U,contract:{input:k.input,steps:k.steps.map(({id:c})=>({id:c})),...k.result?{result:k.result}:{}},declaration:H,input:t,owner:L,scope:q,source:s,startKey:M,localFiles:r};await ob(p3(O,"pending-start.json"),{startKey:M,checkout:V,contract:k,declaration:H,input:t,scope:q,source:s});let I0;for(let c=0;c<3;c++)try{I0=await W(`/api/cli/local-routines/${X}/accept`,T0);break}catch(Q0){if(Q0 instanceof Y0&&Q0.retryable)j=!0;if(!(Q0 instanceof Y0)||!Q0.retryable||c===2)throw Q0}if(!I0)throw Error("Local acceptance unavailable");if(typeof I0.runId!=="string"||!/^[0-9a-f-]{36}$/.test(I0.runId)||I0.state!=="queued")throw Error("Invalid local acceptance");I={runId:I0.runId,state:"queued"};let R0=p3(T,I.runId);await eb(O,R0),O=R0,await rb(p3(O,"pending-start.json")),P={format:2,runId:I.runId,state:"queued",source:s,input:t,contract:k,scope:q,checkout:V,acceptedAt:I0.acceptedAt,placement:"local",trigger:{kind:"manual"},reports:z0},await m();let r0=await v.create({id:I.runId,routine:X,starter:{kind:"member",id:B.id},createdAt:String(I0.acceptedAt)},k.steps);a=!0,Q.progress?.(await r0.current());let H0=(c,Q0)=>W(`/api/cli/local-routines/runs/${I.runId}/advance`,{owner:L,action:c,...Q0===void 0?{}:{evidence:Q0}},["cancel","failed","succeeded"].includes(c)),w0=async()=>{if(await Q.host?.assertCurrent(),D||$.signal.aborted||Date.now()-g>=90000)throw new Y0("access_denied");let c=await H0("poll");if(c.state!=="running"||c.stopRequired===!0)throw D=!0,$.abort(),new Y0("access_denied");g=Date.now();let Q0=u3(await W(`/api/cli/local-routines/${X}/resolve`,z));if(!X4(q,Q0))throw D=!0,$.abort(),new Y0("access_denied")},p0;for(;;){if($.signal.aborted)return await H0("cancel"),S=!0,P.state="cancelled",await m(),await v.finish(X,I.runId,{status:"failed"}),X0=!0,{runId:I.runId,state:"cancelled",directory:O};if(p0=await H0("poll"),g=Date.now(),p0.stopRequired===!0)throw D=!0,$.abort(),new Y0("access_denied");if(p0.state==="running")break;if(p0.state!=="queued")throw Error("The accepted local Run cannot start again");await new Promise((c)=>{let Q0=()=>{clearTimeout(J0),$.signal.removeEventListener("abort",Q0),c()},J0=setTimeout(Q0,1000);$.signal.addEventListener("abort",Q0,{once:!0})})}let h0=Gg(p0,q.workspace);f=AT(G,h0,V.root),P.state="running",P.startedAt=new Date().toISOString(),await m();let N5=await v.start(X,h0.runId);Q.progress?.(N5),w=setInterval(()=>{if(C)return;C=H0("poll").then((c)=>{if(c.state!=="running"||c.stopRequired===!0)D=!0,$.abort();else g=Date.now()}).catch((c)=>{if(c instanceof Y0&&c.code==="access_denied"||Date.now()-g>=60000)D=!0,$.abort()}).finally(()=>{C=void 0})},20000);let u=`/api/cli/workspaces/${q.workspace}/routines/${X}/runs/${h0.runId}/preparation`,i=async()=>{await w0();let c=await Z(u,{headers:{"x-os-run":h0.capability},redirect:"error",signal:AbortSignal.timeout(20000)});if(!c.ok)throw new Y0([401,403].includes(c.status)?"access_denied":"unavailable",![401,403].includes(c.status));let Q0=V9(await c.json());if(Q0.routineId!==q.routineId||Q0.workspaceId!==q.workspaceId||Q0.version!==s.version||Q0.deploymentId!==null||!X4(Q0.repositories.map(({published:J0,...j0})=>j0),q.repositories))throw new Y0("access_denied");return Q0},M0=await i(),c0=R1(b,{context:i,runId:h0.runId,capability:h0.capability,filesAccess:q.definition.access.files??null,workspace:h0.workspace,expiresAt:h0.expiresAt,fetch:Q.fetch,authorityLease:{context:M0,signal:$.signal},...o?{inputLocalFiles:{owner:o,descriptors:r}}:{}}),n0,m0,l6=Date.parse(h0.expiresAt),B8=[],T9=0;P.ai=B8,A=await(Q.prepare??Lb)(V.root,M0,{workspaceName:B.workspaces.find((c)=>c.slug===q.workspace)?.name,homeDirectory:Q.homeDirectory,sourceBinding:q.definition.sourceBinding,runId:h0.runId,recheck:i,expiresAt:h0.expiresAt,authoritySignal:$.signal,files:c0,filesConfiguration:b,...k.access.ai===!0?{ai:async(c,Q0,J0)=>{if(T9+xH>10485760)throw new y0("output_too_large");let j0=n0,L0=async()=>{if(k.access.ai!==!0||D||$.signal.aborted)throw new y0("access_denied");try{await i()}catch(x0){if(x0 instanceof Y0&&x0.retryable)throw new y0("capability_unavailable");throw D=!0,$.abort(),new y0("access_denied")}if(j0!==n0||D||$.signal.aborted)throw new y0("access_denied")};try{return await Y.generate(c,{runId:h0.runId,...j0?{stepId:j0}:{},deadline:l6,signal:AbortSignal.any([Q0,$.signal]),assertCurrent:L0,readFile:J0,async evidence(x0){if(x0.outcome!=="succeeded")m0=x0.outcome;T9+=Buffer.byteLength(JSON.stringify(x0)),B8.push(x0),await m()}})}catch(x0){if(x0 instanceof y0)m0=x0.code;throw x0}}}:{},acquireHistory:(c,Q0)=>XH((J0)=>(Q.fetch??fetch)(`https://${q.workspace}.oddington.ai/api/data`,{...J0,headers:{...J0.headers,"x-os-run":h0.capability,"x-os-workspace":q.workspace}}),c,Q0),async getFile(c){if(r.some((J0)=>J0.id===c))return o.get(c);let Q0=await(Q.fetch??fetch)(`https://${q.workspace}.oddington.ai/api/files/${c}`,{headers:{"x-os-run":h0.capability,"x-os-workspace":q.workspace},redirect:"error",signal:AbortSignal.timeout(20000)});if(!Q0.ok)throw new _(Q0.status===403?"access_denied":"unavailable",Q0.status);return m5(await Q0.json())}}),Object.assign(f,A.environment);for(let c of r)if(!X4(await o.get(c.id),c))throw new _("integrity",409);if(k.access.ai===!0)await Y.readiness($.signal);Q.beforeExecution?.(h0.connections);let X7=await Zg(h0,f,async(c,Q0)=>{l6=c;let J0=[h0.capability,f.OS_ROUTINE_LOCAL_TOKEN??"",L];for(let L0 of Q0)J0.push(L0.accessToken);N=await HY({sourceDirectory:p3(O,"source"),source:s,workingRoot:V.root,input:t,mode:"execute",contract:k,runId:h0.runId,environment:f,signal:$.signal,secrets:J0,connectionLeases:Q0,connections:h0.connections,maximumMilliseconds:c-Date.now(),executable:Q.childExecutable,assertCurrent:w0,async accept(L0){if(J0.some((x0)=>x0&&JSON.stringify(L0).includes(x0)))throw Error("Routine report contains private authority");if((G0+=Buffer.byteLength(JSON.stringify(L0)))>10485760)throw Error("Routine evidence exceeds 10 MiB");if(L0.type==="step"){if(!L0.status)throw Error("Missing executable step state");if(L0.status==="running"){if(n0)throw Error("Overlapping active step");n0=L0.id}else if(n0===L0.id)n0=void 0;let x0=await v.step(X,h0.runId,{...L0,status:L0.status});Q.progress?.(x0)}z0.push(L0),await m()}});let j0=await N.completion;return N=void 0,j0},{fetch:Q.fetch}),I9=D?"failed":X7.state;P={...P,output:X7.output,outputTruncated:X7.truncated,...I9==="failed"?{failure:D?"authority_unavailable":m0??X7.failure??"routine_failed"}:{}},await m(),P={...P,state:I9,finishedAt:new Date().toISOString()};let Q7=await A.finish(I9==="succeeded"?0:1,P);R=!0;let b8=I9==="succeeded"&&Q7.state!=="failed";P={...P,state:b8?"succeeded":I9==="cancelled"?"cancelled":"failed",finishedAt:new Date().toISOString(),output:X7.output,outputTruncated:X7.truncated},await m();let j9=z0.find((c)=>c.type==="finish"),K0=await v.finish(X,h0.runId,b8&&Q7.state==="prepared"?{status:"succeeded",changes:Q7.changes,...j9?.type==="finish"&&Object.hasOwn(j9,"result")?{result:j9.result}:{}}:{status:"failed",...m0?{aiFailure:m0}:{}});return X0=!0,Q.progress?.(K0),clearInterval(w),await C,await H0(b8?"succeeded":I9==="cancelled"?"cancel":"failed",{reports:z0,outputTruncated:X7.truncated,...Q7.state==="prepared"?{changes:Q7.changes,counts:Q7.counts}:{}}),S=!0,{runId:h0.runId,state:P.state,directory:O,completion:Q7,summary:K0,...b8&&j9?.type==="finish"&&Object.hasOwn(j9,"result")?{result:j9.result}:{}}}finally{clearInterval(w),await C,await N?.terminate(),Q.signal?.removeEventListener("abort",E);for(let e of x)process.removeListener(e,E);try{if(A&&!R)await A.finish(1,{...P,state:$.signal.aborted&&!D?"cancelled":"failed",finishedAt:new Date().toISOString(),output:P.output??"",outputTruncated:P.outputTruncated??!1})}finally{if(f)for(let e of["OS_ROUTINE_RUN","OS_ROUTINE_LOCAL_TOKEN",O1])delete f[e];if(I&&!S){if(P.state=$.signal.aborted&&!D?"cancelled":"failed",P.failure=D?"authority_unavailable":"unfinished_attempt",await m(),a&&!X0)await v.finish(X,I.runId,{status:"failed"});await W(`/api/cli/local-routines/runs/${I.runId}/advance`,{owner:L,action:P.state==="cancelled"?"cancel":"failed"},!0)}if(!I&&!j)await nK0(p3(O,"source"),448).catch(()=>{}),await rb(O,{recursive:!0,force:!0})}}}import{randomUUID as Wg}from"node:crypto";import{setTimeout as Ug}from"node:timers/promises";var Yg=/^[a-z0-9][a-z0-9-]{0,62}$/,iK0=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/,c3=()=>{throw Error("Run state unavailable")},QU=(X)=>X&&typeof X==="object"&&!Array.isArray(X)?X:c3();function RT(X){if(typeof X!=="string"||X.length>40||!Number.isFinite(Date.parse(X)))return c3();return X}function Vg(X){return{...X.startedAt===void 0?{}:{startedAt:RT(X.startedAt)},...X.finishedAt===void 0?{}:{finishedAt:RT(X.finishedAt)}}}function ST(X){if(t9(X),new TextEncoder().encode(JSON.stringify(X)).byteLength>262144)return c3();return X}function ET(X,J){let Q=QU(X);if(typeof Q.id!=="string"||!Yg.test(Q.id)||J!==void 0&&Q.id!==J||typeof Q.title!=="string"||!Q.title.trim()||Q.title.length>256||!["pending","running","completed","failed","skipped"].includes(Q.status))return c3();return{id:Q.id,title:Q.title,status:Q.status,...Vg(Q),...Object.hasOwn(Q,"summary")?{summary:ST(Q.summary)}:{},...Object.hasOwn(Q,"data")?{data:ST(Q.data)}:{}}}function CT(X,J={}){let Q=QU(X);if(typeof Q.id!=="string"||!iK0.test(Q.id)||J.id!==void 0&&Q.id!==J.id||typeof Q.routine!=="string"||!Yg.test(Q.routine)||J.routine!==void 0&&Q.routine!==J.routine||Q.placement!=="remote"||!["queued","running","succeeded","failed"].includes(Q.status)||!Array.isArray(Q.steps)||Q.steps.length>64)return c3();let Z=Q.steps.map((Y)=>{let V=QU(Y);if(typeof V.detailAvailable!=="boolean"||Object.hasOwn(V,"data"))return c3();return{...ET(V),detailAvailable:V.detailAvailable}});if(new Set(Z.map((Y)=>Y.id)).size!==Z.length)return c3();let G;if(Q.failure!==void 0){let Y=QU(Q.failure);if(Q.status!=="failed"||typeof Y.message!=="string"||!Y.message||Y.message.length>512)return c3();G={message:Y.message}}if(Object.hasOwn(Q,"result")&&Q.status!=="succeeded")return c3();return{id:Q.id,routine:Q.routine,placement:"remote",status:Q.status,createdAt:RT(Q.createdAt),...Vg(Q),steps:Z,...Object.hasOwn(Q,"result")?{result:ST(Q.result)}:{},...G?{failure:G}:{}}}function Kg(X){return Object.freeze({current:X.current,step:X.step,...X.publish?{publish:X.publish}:{},async*watch(){let J;for(;;){let Q=await X.current(),Z=JSON.stringify(Q);if(Z!==J)J=Z,yield Q;if(Q.status==="succeeded"||Q.status==="failed")return;await(X.wait?.()??new Promise((G)=>setTimeout(G,100)))}}})}y5();var F1="Usage: os routine cancel <run> [--json]",GU=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/,ZU=/^[a-z0-9][a-z0-9-]{0,62}$/,rK0=["queued","running","succeeded","failed","cancelled"],oK0=["routine_failed","timed_out","resource_exhausted","authority_revoked","platform_failed"],wT={invalid_request:"OS refused the Run request.",authentication_required:"Sign in to OS with os login.",access_denied:"Run access is unavailable.",resource_unavailable:"The routine or Run is unavailable.",active_version_unavailable:"No current routine deployment is available.",start_conflict:"The start reference already names different input.",file_not_remote:"An input File is not available remotely.",input_invalid:"Input does not satisfy the deployed routine contract.",temporarily_unavailable:"OS is temporarily unavailable.",invalid_response:"OS returned an invalid Run response."};class F6 extends Error{code;retryable;prefixDenied;constructor(X,J=!1,Q=!1){super(wT[X]??wT.temporarily_unavailable);this.code=X;this.retryable=J;this.prefixDenied=Q}}var $8=()=>{throw new F6("invalid_response",!0)};function Q4(X){if(!X||typeof X!=="object"||Array.isArray(X))return $8();return X}function JU(X){if(typeof X!=="string"||X.length>40||!Number.isFinite(Date.parse(X)))return $8();return X}function hJ(X,J){if(typeof X!=="string"||X.length>J)return $8();return X.replace(/[\x00-\x1f\x7f-\x9f]/g,"")}function Hg(X,J={}){let Q=Q4(X),Z=Q4(Q.trigger),G=Q4(Q.evidence);if(typeof Q.id!=="string"||!GU.test(Q.id)||J.id&&Q.id!==J.id||typeof Q.routine!=="string"||!ZU.test(Q.routine)||J.routine&&Q.routine!==J.routine||typeof Q.version!=="string"||!GU.test(Q.version)||Q.placement!=="remote"||typeof Q.state!=="string"||!rK0.includes(Q.state)||typeof Z.kind!=="string"||!["manual","schedule","event","product"].includes(Z.kind))return $8();let Y=Object.fromEntries(["attempts","steps","effects","artifacts"].map((K)=>{let H=G[K];if(!Number.isSafeInteger(H)||H<0)return $8();return[K,H]})),V;if(Q.failure!==void 0){let K=Q4(Q.failure);if(Q.state!=="failed"||typeof K.kind!=="string"||!oK0.includes(K.kind))return $8();V={kind:K.kind,message:hJ(K.message,4096)}}if(Q.result!==void 0&&Q.state!=="succeeded")return $8();return{id:Q.id,routine:Q.routine,version:Q.version,placement:"remote",trigger:{kind:Z.kind,...Z.reference===void 0?{}:{reference:hJ(Z.reference,4096)}},state:Q.state,acceptedAt:JU(Q.acceptedAt),...Q.startedAt===void 0?{}:{startedAt:JU(Q.startedAt)},...Q.finishedAt===void 0?{}:{finishedAt:JU(Q.finishedAt)},...Q.cancellationRequestedAt===void 0?{}:{cancellationRequestedAt:JU(Q.cancellationRequestedAt)},...Q.result===void 0?{}:{result:Q.result},...V?{failure:V}:{},evidence:Y}}function kT(X){let J=X.signal?AbortSignal.any([X.signal,AbortSignal.timeout(1200000)]):AbortSignal.timeout(1200000);return{call:async(G,Y,V,K,H=17825792)=>{for(let W=0;;W++)try{J.throwIfAborted();let U=await(X.request??x5)(G,{...Y,redirect:"error",signal:AbortSignal.any([J,AbortSignal.timeout(25000)])}),z={400:"invalid_request",401:"authentication_required",403:"access_denied",404:"resource_unavailable",422:"input_invalid"};if(z[U.status]){let T=await L8(U,4096,25000),O;try{O=T&&JSON.parse(new TextDecoder("utf-8",{fatal:!0}).decode(T))?.code}catch{}if(J3(O))throw new F5(O);throw new F6(z[U.status],!1,U.status===403&&O==="source_workspace_mismatch")}let q=await L8(U,H,25000);if(!q)throw new F6("temporarily_unavailable",!0);let B;try{B=JSON.parse(new TextDecoder("utf-8",{fatal:!0}).decode(q))}catch{throw new F6("invalid_response",!0)}if(K.includes(U.status))return V(B);let M={400:["invalid_request"],401:["authentication_required"],403:["access_denied"],404:["resource_unavailable"],409:["active_version_unavailable","start_conflict","file_not_remote"],422:["input_invalid"],503:["temporarily_unavailable"]},L=Q4(B).code;if(J3(L))throw new F5(L);throw new F6(typeof L==="string"&&M[U.status]?.includes(L)?L:U.status===401?"authentication_required":U.status===403?"access_denied":"temporarily_unavailable",U.status===429||U.status>=500,U.status===403)}catch(U){if(U instanceof G7)throw new F6("access_denied");if(U instanceof V5&&U.kind!=="unavailable")throw new F6("authentication_required");if(U instanceof F5||U instanceof F6&&!U.retryable)throw U;if(W===2||J.aborted)throw new F6("temporarily_unavailable",!0);await(X.wait??((z)=>Ug(250,void 0,{signal:z})))(J)}},identity:()=>(X.identity??B6)({fetch:(G,Y)=>fetch(G,{...Y,signal:AbortSignal.any([J,AbortSignal.timeout(25000)])})})}}function tK0(X,J,Q={}){if(!ZU.test(X)||!ZU.test(J))return $8();let Z=kT(Q),G=(V,K)=>{try{return CT(V,{routine:J,id:K})}catch{return $8()}},Y=(V)=>{if(!GU.test(V))return $8();let K=`/workspaces/${X}/runs/${V}`;return Kg({current:()=>Z.call(K,{},(H)=>G(H,V),[200]),step(H){if(!ZU.test(H))return $8();return Z.call(`${K}/steps/${H}`,{},(W)=>{try{return ET(W,H)}catch{return $8()}},[200])},wait:()=>(Q.wait??((H)=>Ug(250,void 0,{signal:H})))(Q.signal??AbortSignal.timeout(1200000))})};return{handle:Y,async get(V){let K=Y(V);return await K.current(),K},list:()=>Z.call(`/workspaces/${X}/routines/${J}/runs`,{},(V)=>{if(!Array.isArray(V)||V.length>20)return $8();return V.map((K)=>G(K))},[200],356515840)}}var zg=(X,J)=>`https://api.oddington.ai/workspaces/${X}/runs/${J}`;function qg(X,J,Q,Z={}){let G=X instanceof F5||X instanceof F6?X.code:X instanceof V5&&X.kind!=="unavailable"?"authentication_required":"temporarily_unavailable",Y=!!Z.startKey&&!(X instanceof F5)&&(!(X instanceof F6)||X.retryable),V=Y?"Start acknowledgement unavailable. OS may have accepted this action; do not repeat it as a new action.":X instanceof F5?X.message:wT[G];return Q(J?JSON.stringify({...Z,error:{code:G,message:V},...Y?{uncertain:!0}:{}}):`${V}${Z.startKey?`
408
+ `).map((R)=>JSON.parse(R))}catch{throw new y0("provider_failure")}let N=j.filter((R)=>R.type==="result");if(N.length===1){let R={};for(let S of["input_tokens","output_tokens","cache_read_input_tokens","cache_creation_input_tokens"]){let $=N[0].usage?.[S];if(typeof $==="number"&&Number.isFinite($)&&$>=0)R[S]=$}if(Object.keys(R).length)B=R;if(typeof N[0].total_cost_usd==="number"&&Number.isFinite(N[0].total_cost_usd)&&N[0].total_cost_usd>=0)M=N[0].total_cost_usd}if(I.code!==0||N.length!==1||N[0].is_error||N[0].subtype!=="success"||j.some((R)=>R.type==="system"&&(String(R.subtype).startsWith("hook")||R.subtype==="init"&&(R.model!==DJ||!Array.isArray(R.tools)||R.tools.length||!Array.isArray(R.mcp_servers)||R.mcp_servers.length)))||j.some((R)=>R.type==="assistant"&&(R.message?.model!==DJ||R.message?.content?.some((S)=>!["text","thinking","redacted_thinking"].includes(S.type))))||!j.some((R)=>R.type==="assistant"&&R.message?.model===DJ)||Object.keys(N[0].modelUsage??{}).some((R)=>R!==DJ))throw new y0("provider_failure");let A=fx(K,N[0].result);return await L(),q="succeeded",A}catch(T){let O=W.signal.aborted&&!(T instanceof y0&&T.code==="access_denied")?new y0("cancelled"):T instanceof y0?T:new y0("provider_failure");throw q=O.code,O}finally{try{let T={kind:K.kind,runId:V.runId,...V.stepId?{stepId:V.stepId}:{},outcome:q,provider:"anthropic",model:DJ,durationMs:Date.now()-H,...B?{usage:B}:{},...M===void 0?{}:{costUsd:M}};if(Buffer.byteLength(JSON.stringify(T))>xH)throw new y0("provider_failure");if(await V.evidence(T),q==="succeeded")await L()}catch(T){throw T instanceof y0?T:new y0("provider_failure")}finally{clearTimeout(z),V.signal.removeEventListener("abort",U)}}}}}class d7 extends Error{code;constructor(X,J){super(J);this.code=X}}class M8 extends Error{issues;code="requirements_unavailable";constructor(X){super(X.map((J)=>`${J.message}
409
+
410
+ ${J.action}`).join(`
411
+
412
+ `));this.issues=X;this.name="RoutineRequirementsError"}}var ib=/^[a-z0-9][a-z0-9-]{0,62}$/,lK0=["missing","disabled","disconnected","unsupported","ambiguous"];function gJ(X){if(!X||typeof X!=="object"||Array.isArray(X))return;let J=X;if(Object.keys(J).sort().join(",")!=="issues,workspace"||typeof J.workspace!=="string"||!ib.test(J.workspace)||!Array.isArray(J.issues)||!J.issues.length||J.issues.length>129)return;for(let Q of J.issues){if(!Q||typeof Q!=="object"||Array.isArray(Q)||Object.keys(Q).sort().join(",")!=="kind,name,reason"||!lK0.includes(Q.reason)||typeof Q.name!=="string")return;if(Q.kind==="connection"){if(!/^[a-z0-9][a-z0-9-]{0,62}\/[a-z0-9][a-z0-9-]{0,62}$/.test(Q.name))return}else if(Q.kind==="repository"){if(!ib.test(Q.name))return}else if(Q.kind!=="files"||Q.name!=="files")return}return J}function oH(X){let{workspace:J}=X;return X.issues.map((Q)=>{let Z=`${Q.kind}_${Q.reason}`;if(Q.kind==="connection"){let[G,Y]=Q.name.split("/"),V=Q.reason==="missing"||Q.reason==="disconnected"?G==="dropbox"?`Connect Dropbox:
413
+ os connection create dropbox --workspace ${J} --name ${Y} --root "/path/to/folder"
414
+
415
+ Replace "/path/to/folder" with the base folder's path inside Dropbox.
416
+ The routine's Dropbox paths are relative to this folder.`:`Set up the connection: os connection ${["gmail","airtable"].includes(G)?`create ${G} `:""}--help (workspace ${J}, name ${Y}).`:`Inspect the workspace connections: os connection list --workspace ${J} --all`;return{code:Z,message:G==="dropbox"&&Q.reason==="missing"?`Dropbox connection "${Y}" isn't set up in workspace "${J}".`:`Connection "${Q.name}" ${Q.reason==="missing"?"does not exist":`is ${Q.reason}`} in workspace "${J}".`,action:V}}if(Q.kind==="repository")return{code:Z,message:`Repository "${Q.name}" is ${Q.reason} in workspace "${J}".`,action:`Check the repository alias in the routine and its workspace binding. Inspect connections: os connection list --workspace ${J} --all`};return{code:Z,message:`File storage is ${Q.reason} in workspace "${J}".`,action:`Inspect File storage: os files storage inspect --workspace ${J}`}})}async function tH(X,J){let[Q,Z]=await Promise.allSettled([X(),J?.()]);if(Q.status==="rejected"&&!(Q.reason instanceof M8))throw Q.reason;if(Z.status==="rejected"&&!(Z.reason instanceof xJ))throw Z.reason;let G=[...Q.status==="rejected"?Q.reason.issues:[],...Z.status==="rejected"?[Z.reason.diagnostic]:[]];if(G.length)throw new M8(G);return Q.value}async function eH(X,J,Q,Z){let G;try{G=await(Z.request??x5)(`/api/cli/local-routines/${X}/${Z.mode}`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({remote:J.remote,branch:J.branch,access:Q}),redirect:"error",signal:AbortSignal.any([AbortSignal.timeout(20000),...Z.signal?[Z.signal]:[]])})}catch(H){if(H instanceof V5&&H.kind!=="unavailable")throw new d7("os_login_required","Your OS sign-in needs attention. Run os login, then repeat the routine command.");throw new d7("routine_start_unavailable","OS could not check the routine requirements. Check your network connection, then repeat the command.")}let Y=await L8(G,G.ok&&Z.mode==="resolve"?4194304:65536,20000),V;try{V=Y&&JSON.parse(new TextDecoder("utf-8",{fatal:!0}).decode(Y))}catch{}if(G.ok&&V)return V;let K=G.status===409&&V?.code==="requirements_unavailable"?gJ(V.requirements):void 0;if(K)throw new M8(oH(K));if(J3(V?.code))throw new F5(V.code);if(G.status===401)throw new d7("os_login_required","Your OS sign-in needs attention. Run os login, then repeat the routine command.");if([403,409].includes(G.status))throw new d7("routine_access_unavailable","OS could not confirm this routine's workspace access or configured capabilities. Run os whoami to check your account and workspace, then inspect the routine's named connections.");throw new d7("routine_start_unavailable","OS could not check the routine requirements. Repeat the command when OS is available.")}async function Xg(X,J=process.stdin){if(X===void 0)return;let Q;if(X==="-"){let Z=[],G=0;for await(let Y of J){if((G+=Y.length)>r9)throw Error("Routine input exceeds 256 KiB");Z.push(Buffer.from(Y))}Q=Buffer.concat(Z)}else{let Z=await tb(X,"r");try{let G=await Z.stat();if(!G.isFile()||G.size>r9)throw Error("Routine input must be a JSON file of at most 256 KiB");if(Q=await Z.readFile(),Q.length>r9)throw Error("Routine input exceeds 256 KiB")}finally{await Z.close()}}try{return JSON.parse(new TextDecoder("utf-8",{fatal:!0}).decode(Q))}catch{throw Error("Routine input must contain one valid JSON value")}}async function ob(X,J){let Q=`${X}.${crypto.randomUUID()}.tmp`,Z=await tb(Q,"wx",384);try{await Z.writeFile(JSON.stringify(J,null,2)),await Z.sync()}finally{await Z.close()}await eb(Q,X)}async function Qg(X,J){let Q=await q8(X,J);return(await T1(Q.root,X)).contract}class Jg extends Error{kind;diagnostics;code="routine_inspection_failed";name="LocalRoutineInspectionError";constructor(X,J){let Q=X==="timed_out"?"Routine definition inspection timed out; no Run was accepted":X==="cancelled"?"Routine definition inspection was cancelled; no Run was accepted":"Routine definition or input is invalid; no Run was accepted",Z=J.spawnError?`spawn=${J.spawnError}`:J.signal?`signal=${J.signal}`:J.exitCode!==void 0?`exit=${J.exitCode}`:"exit=unavailable";super(`${Q} (child=${J.childFailure??X}, ${Z}, output=${J.outputBytes}${J.outputTruncated?"+":""} bytes)`);this.kind=X;this.diagnostics=J}}async function XU(X,J,Q={}){let Z=Q.request??x5,G=Q.environment??process.env,Y=bJ({environment:G,process:Q.aiProcess}),V=await q8(X,Q.cwd),K=Q.definition??await T1(V.root,X,Q.sourceRuntime,Q.childExecutable);if(!K||K.contract.id!==X)throw Error("Routine definition not found");if(Q.host&&K.source.version!==Q.host.sourceVersion)throw new Y0("access_denied");let H=rH({$schema:H8,access:K.contract.access}),W=async(e,s,t=!1)=>{if(!t)await Q.host?.assertCurrent();let U0;try{U0=await Z(e,{method:"POST",body:JSON.stringify(s),headers:{"content-type":"application/json"},redirect:"error",signal:AbortSignal.timeout(20000)})}catch(b){if(b instanceof V5&&b.kind!=="unavailable")throw new Y0("access_denied");throw new Y0("unavailable",!0)}if(!U0.ok){let b=await L8(U0,65536,20000),h,y;try{let l=b&&JSON.parse(new TextDecoder("utf-8",{fatal:!0}).decode(b));if(h=l?.code,U0.status===409&&h==="requirements_unavailable")y=gJ(l.requirements)}catch{}if(y)throw new Y0("access_denied");if(J3(h))throw new F5(h);throw new Y0([401,403,409].includes(U0.status)?"access_denied":"unavailable",![401,403,409].includes(U0.status))}let k=await U0.json();if(!t&&!e.endsWith("/accept"))await Q.host?.assertCurrent();return k},U={remote:V.remote,branch:V.branch},z={...U,access:H.access},q=await tH(async()=>{await Q.host?.assertCurrent();let e=await eH(X,V,H.access,{mode:"resolve",request:Z,signal:Q.signal});return await Q.host?.assertCurrent(),u3(e)},H.access.ai===!0?()=>Y.readiness(Q.signal):void 0);if(!q.definition||!X4(q.definition.access,H.access))throw new Y0("access_denied");let B=await(Q.identity??B6)();if(Q.host&&(q.workspace!==Q.host.workspace||B.id!==Q.host.memberId))throw new Y0("access_denied");let M=crypto.randomUUID(),L=dK0(32).toString("hex"),T=t8(q.workspace,Q).runs;await M9(T,!0);let O=p3(T,M);await sK0(O,{mode:448});let I,j=!1,N,A,R=!1,S=!1,$=new AbortController,E=()=>$.abort(),x=["SIGINT","SIGTERM","SIGHUP"];for(let e of x)process.on(e,E);if(Q.signal?.addEventListener("abort",E,{once:!0}),Q.signal?.aborted)E();let w,C,D=!1,g=Date.now(),f,P={},m=async()=>{let e=p3(O,"execution.json");await ob(e,P)},v=sH(q.workspace,async(e,s)=>{if(e.routine!==X||e.starter.id!==B.id||I&&e.id!==I.runId||s.scope&&!X4(s.scope,q))throw new Y0("access_denied")},Q),a=!1,X0=!1,z0=[],G0=0;try{let{authoredFiles:e,...s}=await OJ(V,X,p3(O,"source"),Q.sourceRuntime,K.entry);if(s.version!==K.source.version)throw Error("Routine source changed before acceptance");if(Q.host&&s.version!==Q.host.sourceVersion)throw new Y0("access_denied");if(s.provenance?.branch!==U.branch)throw Error("Routine checkout changed before capture");let t=structuredClone(J);N=await HY({sourceDirectory:p3(O,"source"),source:s,workingRoot:V.root,input:t,mode:"inspect",definitionOnly:!0,environment:AT(G,{capability:"",workspace:q.workspace}),signal:$.signal,accept:async()=>{throw Error("Inspection cannot report business work")},assertCurrent:async()=>{},maximumMilliseconds:Q.inspectionMaximumMilliseconds??30000,executable:Q.childExecutable});let U0=await N.completion;if(N=void 0,U0.state!=="succeeded"||!U0.definition){let c=U0.state==="cancelled"?"cancelled":U0.failure==="timed_out"?"timed_out":"invalid_definition_or_input";throw new Jg(c,{...U0.failure?{childFailure:U0.failure}:{},...U0.termination??{},outputBytes:Buffer.byteLength(U0.output),outputTruncated:U0.truncated})}let k=U0.definition;if(!X4(k,K.contract))throw Error("Routine definition changed before acceptance");if(k.access.ai===!0)await Y.readiness($.signal);let b=_3(q.workspace,Q),h=Q3(b,{workspace:q.workspace,member:{async current(){let c=u3(await W(`/api/cli/local-routines/${X}/resolve`,z));if(!X4(c,q)||D||$.signal.aborted)throw new _("access_denied",403);return{workspaceId:q.workspaceId,creator:{kind:"member",id:B.id}}},request:(c,Q0)=>(Q.filesRequest??R9)(q.workspace,String(c),Q0)}}),y=(c,Q0)=>aH(aK0(Q.cwd??process.cwd(),c),{storage:Q0.storage??"local",path:Q0.path},h,M,$.signal);if(Q.explicitInput)t=await cb(k.input,t,k.inputDefault,Q.explicitInput.jsonPresent,Q.explicitInput.namedFiles,y);else{if(t===void 0)t=structuredClone(k.inputDefault);if(t===void 0&&(Q.interactive??process.stdin.isTTY))t=await iH(k.input,y)}y8(k.input,t);let l=L1(k.input,t),r=[],o;if(l.length&&b.root){let c=AbortSignal.any([$.signal,AbortSignal.timeout(20000)]),Q0;try{Q0=await(Q.identity??B6)({fetch:(J0,j0)=>(Q.fetch??fetch)(J0,{...j0,signal:c})})}catch(J0){if(J0 instanceof V5&&J0.kind!=="unavailable")throw new Y0("access_denied");throw new Y0("unavailable",!0)}if(Q0.id!==B.id)throw new Y0("access_denied");o=await h.local();for(let J0 of l)if(await o.has(J0.id)){if(!X4(await o.get(J0.id),J0))throw new _("integrity",409);if(await o.placement(J0.id)==="local")r.push(J0)}}for(let{file:c,storage:Q0}of GY(k.input,t,"local"))if(r.some((J0)=>J0.id===c.id)!==(Q0==="local"))throw new _("invalid_input",400);if($.signal.aborted)throw Error("Local routine cancelled before acceptance");let T0={checkout:U,contract:{input:k.input,steps:k.steps.map(({id:c})=>({id:c})),...k.result?{result:k.result}:{}},declaration:H,input:t,owner:L,scope:q,source:s,startKey:M,localFiles:r};await ob(p3(O,"pending-start.json"),{startKey:M,checkout:V,contract:k,declaration:H,input:t,scope:q,source:s});let I0;for(let c=0;c<3;c++)try{I0=await W(`/api/cli/local-routines/${X}/accept`,T0);break}catch(Q0){if(Q0 instanceof Y0&&Q0.retryable)j=!0;if(!(Q0 instanceof Y0)||!Q0.retryable||c===2)throw Q0}if(!I0)throw Error("Local acceptance unavailable");if(typeof I0.runId!=="string"||!/^[0-9a-f-]{36}$/.test(I0.runId)||I0.state!=="queued")throw Error("Invalid local acceptance");I={runId:I0.runId,state:"queued"};let R0=p3(T,I.runId);await eb(O,R0),O=R0,await rb(p3(O,"pending-start.json")),P={format:2,runId:I.runId,state:"queued",source:s,input:t,contract:k,scope:q,checkout:V,acceptedAt:I0.acceptedAt,placement:"local",trigger:{kind:"manual"},reports:z0},await m();let r0=await v.create({id:I.runId,routine:X,starter:{kind:"member",id:B.id},createdAt:String(I0.acceptedAt)},k.steps);a=!0,Q.progress?.(await r0.current());let H0=(c,Q0)=>W(`/api/cli/local-routines/runs/${I.runId}/advance`,{owner:L,action:c,...Q0===void 0?{}:{evidence:Q0}},["cancel","failed","succeeded"].includes(c)),w0=async()=>{if(await Q.host?.assertCurrent(),D||$.signal.aborted||Date.now()-g>=90000)throw new Y0("access_denied");let c=await H0("poll");if(c.state!=="running"||c.stopRequired===!0)throw D=!0,$.abort(),new Y0("access_denied");g=Date.now();let Q0=u3(await W(`/api/cli/local-routines/${X}/resolve`,z));if(!X4(q,Q0))throw D=!0,$.abort(),new Y0("access_denied")},p0;for(;;){if($.signal.aborted)return await H0("cancel"),S=!0,P.state="cancelled",await m(),await v.finish(X,I.runId,{status:"failed"}),X0=!0,{runId:I.runId,state:"cancelled",directory:O};if(p0=await H0("poll"),g=Date.now(),p0.stopRequired===!0)throw D=!0,$.abort(),new Y0("access_denied");if(p0.state==="running")break;if(p0.state!=="queued")throw Error("The accepted local Run cannot start again");await new Promise((c)=>{let Q0=()=>{clearTimeout(J0),$.signal.removeEventListener("abort",Q0),c()},J0=setTimeout(Q0,1000);$.signal.addEventListener("abort",Q0,{once:!0})})}let h0=Gg(p0,q.workspace);f=AT(G,h0,V.root),P.state="running",P.startedAt=new Date().toISOString(),await m();let N5=await v.start(X,h0.runId);Q.progress?.(N5),w=setInterval(()=>{if(C)return;C=H0("poll").then((c)=>{if(c.state!=="running"||c.stopRequired===!0)D=!0,$.abort();else g=Date.now()}).catch((c)=>{if(c instanceof Y0&&c.code==="access_denied"||Date.now()-g>=60000)D=!0,$.abort()}).finally(()=>{C=void 0})},20000);let u=`/api/cli/workspaces/${q.workspace}/routines/${X}/runs/${h0.runId}/preparation`,i=async()=>{await w0();let c=await Z(u,{headers:{"x-os-run":h0.capability},redirect:"error",signal:AbortSignal.timeout(20000)});if(!c.ok)throw new Y0([401,403].includes(c.status)?"access_denied":"unavailable",![401,403].includes(c.status));let Q0=V9(await c.json());if(Q0.routineId!==q.routineId||Q0.workspaceId!==q.workspaceId||Q0.version!==s.version||Q0.deploymentId!==null||!X4(Q0.repositories.map(({published:J0,...j0})=>j0),q.repositories))throw new Y0("access_denied");return Q0},M0=await i(),c0=R1(b,{context:i,runId:h0.runId,capability:h0.capability,filesAccess:q.definition.access.files??null,workspace:h0.workspace,expiresAt:h0.expiresAt,fetch:Q.fetch,authorityLease:{context:M0,signal:$.signal},...o?{inputLocalFiles:{owner:o,descriptors:r}}:{}}),n0,m0,l6=Date.parse(h0.expiresAt),B8=[],T9=0;P.ai=B8,A=await(Q.prepare??Lb)(V.root,M0,{workspaceName:B.workspaces.find((c)=>c.slug===q.workspace)?.name,homeDirectory:Q.homeDirectory,sourceBinding:q.definition.sourceBinding,runId:h0.runId,recheck:i,expiresAt:h0.expiresAt,authoritySignal:$.signal,files:c0,filesConfiguration:b,...k.access.ai===!0?{ai:async(c,Q0,J0)=>{if(T9+xH>10485760)throw new y0("output_too_large");let j0=n0,L0=async()=>{if(k.access.ai!==!0||D||$.signal.aborted)throw new y0("access_denied");try{await i()}catch(x0){if(x0 instanceof Y0&&x0.retryable)throw new y0("capability_unavailable");throw D=!0,$.abort(),new y0("access_denied")}if(j0!==n0||D||$.signal.aborted)throw new y0("access_denied")};try{return await Y.generate(c,{runId:h0.runId,...j0?{stepId:j0}:{},deadline:l6,signal:AbortSignal.any([Q0,$.signal]),assertCurrent:L0,readFile:J0,async evidence(x0){if(x0.outcome!=="succeeded")m0=x0.outcome;T9+=Buffer.byteLength(JSON.stringify(x0)),B8.push(x0),await m()}})}catch(x0){if(x0 instanceof y0)m0=x0.code;throw x0}}}:{},acquireHistory:(c,Q0)=>XH((J0)=>(Q.fetch??fetch)(`https://${q.workspace}.oddington.ai/api/data`,{...J0,headers:{...J0.headers,"x-os-run":h0.capability,"x-os-workspace":q.workspace}}),c,Q0),async getFile(c){if(r.some((J0)=>J0.id===c))return o.get(c);let Q0=await(Q.fetch??fetch)(`https://${q.workspace}.oddington.ai/api/files/${c}`,{headers:{"x-os-run":h0.capability,"x-os-workspace":q.workspace},redirect:"error",signal:AbortSignal.timeout(20000)});if(!Q0.ok)throw new _(Q0.status===403?"access_denied":"unavailable",Q0.status);return m5(await Q0.json())}}),Object.assign(f,A.environment);for(let c of r)if(!X4(await o.get(c.id),c))throw new _("integrity",409);if(k.access.ai===!0)await Y.readiness($.signal);Q.beforeExecution?.(h0.connections);let X7=await Zg(h0,f,async(c,Q0)=>{l6=c;let J0=[h0.capability,f.OS_ROUTINE_LOCAL_TOKEN??"",L];for(let L0 of Q0)J0.push(L0.accessToken);N=await HY({sourceDirectory:p3(O,"source"),source:s,workingRoot:V.root,input:t,mode:"execute",contract:k,runId:h0.runId,environment:f,signal:$.signal,secrets:J0,connectionLeases:Q0,connections:h0.connections,maximumMilliseconds:c-Date.now(),executable:Q.childExecutable,assertCurrent:w0,async accept(L0){if(J0.some((x0)=>x0&&JSON.stringify(L0).includes(x0)))throw Error("Routine report contains private authority");if((G0+=Buffer.byteLength(JSON.stringify(L0)))>10485760)throw Error("Routine evidence exceeds 10 MiB");if(L0.type==="step"){if(!L0.status)throw Error("Missing executable step state");if(L0.status==="running"){if(n0)throw Error("Overlapping active step");n0=L0.id}else if(n0===L0.id)n0=void 0;let x0=await v.step(X,h0.runId,{...L0,status:L0.status});Q.progress?.(x0)}z0.push(L0),await m()}});let j0=await N.completion;return N=void 0,j0},{fetch:Q.fetch}),I9=D?"failed":X7.state;P={...P,output:X7.output,outputTruncated:X7.truncated,...I9==="failed"?{failure:D?"authority_unavailable":m0??X7.failure??"routine_failed"}:{}},await m(),P={...P,state:I9,finishedAt:new Date().toISOString()};let Q7=await A.finish(I9==="succeeded"?0:1,P);R=!0;let b8=I9==="succeeded"&&Q7.state!=="failed";P={...P,state:b8?"succeeded":I9==="cancelled"?"cancelled":"failed",finishedAt:new Date().toISOString(),output:X7.output,outputTruncated:X7.truncated},await m();let j9=z0.find((c)=>c.type==="finish"),K0=await v.finish(X,h0.runId,b8&&Q7.state==="prepared"?{status:"succeeded",changes:Q7.changes,...j9?.type==="finish"&&Object.hasOwn(j9,"result")?{result:j9.result}:{}}:{status:"failed",...m0?{aiFailure:m0}:{}});return X0=!0,Q.progress?.(K0),clearInterval(w),await C,await H0(b8?"succeeded":I9==="cancelled"?"cancel":"failed",{reports:z0,outputTruncated:X7.truncated,...Q7.state==="prepared"?{changes:Q7.changes,counts:Q7.counts}:{}}),S=!0,{runId:h0.runId,state:P.state,directory:O,completion:Q7,summary:K0,...b8&&j9?.type==="finish"&&Object.hasOwn(j9,"result")?{result:j9.result}:{}}}finally{clearInterval(w),await C,await N?.terminate(),Q.signal?.removeEventListener("abort",E);for(let e of x)process.removeListener(e,E);try{if(A&&!R)await A.finish(1,{...P,state:$.signal.aborted&&!D?"cancelled":"failed",finishedAt:new Date().toISOString(),output:P.output??"",outputTruncated:P.outputTruncated??!1})}finally{if(f)for(let e of["OS_ROUTINE_RUN","OS_ROUTINE_LOCAL_TOKEN",O1])delete f[e];if(I&&!S){if(P.state=$.signal.aborted&&!D?"cancelled":"failed",P.failure=D?"authority_unavailable":"unfinished_attempt",await m(),a&&!X0)await v.finish(X,I.runId,{status:"failed"});await W(`/api/cli/local-routines/runs/${I.runId}/advance`,{owner:L,action:P.state==="cancelled"?"cancel":"failed"},!0)}if(!I&&!j)await nK0(p3(O,"source"),448).catch(()=>{}),await rb(O,{recursive:!0,force:!0})}}}import{randomUUID as Wg}from"node:crypto";import{setTimeout as Ug}from"node:timers/promises";var Yg=/^[a-z0-9][a-z0-9-]{0,62}$/,iK0=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/,c3=()=>{throw Error("Run state unavailable")},QU=(X)=>X&&typeof X==="object"&&!Array.isArray(X)?X:c3();function RT(X){if(typeof X!=="string"||X.length>40||!Number.isFinite(Date.parse(X)))return c3();return X}function Vg(X){return{...X.startedAt===void 0?{}:{startedAt:RT(X.startedAt)},...X.finishedAt===void 0?{}:{finishedAt:RT(X.finishedAt)}}}function ST(X){if(t9(X),new TextEncoder().encode(JSON.stringify(X)).byteLength>262144)return c3();return X}function ET(X,J){let Q=QU(X);if(typeof Q.id!=="string"||!Yg.test(Q.id)||J!==void 0&&Q.id!==J||typeof Q.title!=="string"||!Q.title.trim()||Q.title.length>256||!["pending","running","completed","failed","skipped"].includes(Q.status))return c3();return{id:Q.id,title:Q.title,status:Q.status,...Vg(Q),...Object.hasOwn(Q,"summary")?{summary:ST(Q.summary)}:{},...Object.hasOwn(Q,"data")?{data:ST(Q.data)}:{}}}function CT(X,J={}){let Q=QU(X);if(typeof Q.id!=="string"||!iK0.test(Q.id)||J.id!==void 0&&Q.id!==J.id||typeof Q.routine!=="string"||!Yg.test(Q.routine)||J.routine!==void 0&&Q.routine!==J.routine||Q.placement!=="remote"||!["queued","running","succeeded","failed"].includes(Q.status)||!Array.isArray(Q.steps)||Q.steps.length>64)return c3();let Z=Q.steps.map((Y)=>{let V=QU(Y);if(typeof V.detailAvailable!=="boolean"||Object.hasOwn(V,"data"))return c3();return{...ET(V),detailAvailable:V.detailAvailable}});if(new Set(Z.map((Y)=>Y.id)).size!==Z.length)return c3();let G;if(Q.failure!==void 0){let Y=QU(Q.failure);if(Q.status!=="failed"||typeof Y.message!=="string"||!Y.message||Y.message.length>512)return c3();G={message:Y.message}}if(Object.hasOwn(Q,"result")&&Q.status!=="succeeded")return c3();return{id:Q.id,routine:Q.routine,placement:"remote",status:Q.status,createdAt:RT(Q.createdAt),...Vg(Q),steps:Z,...Object.hasOwn(Q,"result")?{result:ST(Q.result)}:{},...G?{failure:G}:{}}}function Kg(X){return Object.freeze({current:X.current,step:X.step,...X.publish?{publish:X.publish}:{},async*watch(){let J;for(;;){let Q=await X.current(),Z=JSON.stringify(Q);if(Z!==J)J=Z,yield Q;if(Q.status==="succeeded"||Q.status==="failed")return;await(X.wait?.()??new Promise((G)=>setTimeout(G,100)))}}})}y5();var F1="Usage: os routine cancel <run> [--json]",GU=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/,ZU=/^[a-z0-9][a-z0-9-]{0,62}$/,rK0=["queued","running","succeeded","failed","cancelled"],oK0=["routine_failed","timed_out","resource_exhausted","authority_revoked","platform_failed"],wT={invalid_request:"OS refused the Run request.",authentication_required:"Sign in to OS with os login.",access_denied:"Run access is unavailable.",resource_unavailable:"The routine or Run is unavailable.",active_version_unavailable:"No current routine deployment is available.",start_conflict:"The start reference already names different input.",file_not_remote:"An input File is not available remotely.",input_invalid:"Input does not satisfy the deployed routine contract.",temporarily_unavailable:"OS is temporarily unavailable.",invalid_response:"OS returned an invalid Run response."};class F6 extends Error{code;retryable;prefixDenied;constructor(X,J=!1,Q=!1){super(wT[X]??wT.temporarily_unavailable);this.code=X;this.retryable=J;this.prefixDenied=Q}}var $8=()=>{throw new F6("invalid_response",!0)};function Q4(X){if(!X||typeof X!=="object"||Array.isArray(X))return $8();return X}function JU(X){if(typeof X!=="string"||X.length>40||!Number.isFinite(Date.parse(X)))return $8();return X}function hJ(X,J){if(typeof X!=="string"||X.length>J)return $8();return X.replace(/[\x00-\x1f\x7f-\x9f]/g,"")}function Hg(X,J={}){let Q=Q4(X),Z=Q4(Q.trigger),G=Q4(Q.evidence);if(typeof Q.id!=="string"||!GU.test(Q.id)||J.id&&Q.id!==J.id||typeof Q.routine!=="string"||!ZU.test(Q.routine)||J.routine&&Q.routine!==J.routine||typeof Q.version!=="string"||!GU.test(Q.version)||Q.placement!=="remote"||typeof Q.state!=="string"||!rK0.includes(Q.state)||typeof Z.kind!=="string"||!["manual","schedule","event","product"].includes(Z.kind))return $8();let Y=Object.fromEntries(["attempts","steps","effects","artifacts"].map((K)=>{let H=G[K];if(!Number.isSafeInteger(H)||H<0)return $8();return[K,H]})),V;if(Q.failure!==void 0){let K=Q4(Q.failure);if(Q.state!=="failed"||typeof K.kind!=="string"||!oK0.includes(K.kind))return $8();V={kind:K.kind,message:hJ(K.message,4096)}}if(Q.result!==void 0&&Q.state!=="succeeded")return $8();return{id:Q.id,routine:Q.routine,version:Q.version,placement:"remote",trigger:{kind:Z.kind,...Z.reference===void 0?{}:{reference:hJ(Z.reference,4096)}},state:Q.state,acceptedAt:JU(Q.acceptedAt),...Q.startedAt===void 0?{}:{startedAt:JU(Q.startedAt)},...Q.finishedAt===void 0?{}:{finishedAt:JU(Q.finishedAt)},...Q.cancellationRequestedAt===void 0?{}:{cancellationRequestedAt:JU(Q.cancellationRequestedAt)},...Q.result===void 0?{}:{result:Q.result},...V?{failure:V}:{},evidence:Y}}function kT(X){let J=X.signal?AbortSignal.any([X.signal,AbortSignal.timeout(1200000)]):AbortSignal.timeout(1200000);return{call:async(G,Y,V,K,H=17825792)=>{for(let W=0;;W++)try{J.throwIfAborted();let U=await(X.request??x5)(G,{...Y,redirect:"error",signal:AbortSignal.any([J,AbortSignal.timeout(25000)])}),z={400:"invalid_request",401:"authentication_required",403:"access_denied",404:"resource_unavailable",422:"input_invalid"};if(z[U.status]){let T=await L8(U,4096,25000),O;try{O=T&&JSON.parse(new TextDecoder("utf-8",{fatal:!0}).decode(T))?.code}catch{}if(J3(O))throw new F5(O);throw new F6(z[U.status],!1,U.status===403&&O==="source_workspace_mismatch")}let q=await L8(U,H,25000);if(!q)throw new F6("temporarily_unavailable",!0);let B;try{B=JSON.parse(new TextDecoder("utf-8",{fatal:!0}).decode(q))}catch{throw new F6("invalid_response",!0)}if(K.includes(U.status))return V(B);let M={400:["invalid_request"],401:["authentication_required"],403:["access_denied"],404:["resource_unavailable"],409:["active_version_unavailable","start_conflict","file_not_remote"],422:["input_invalid"],503:["temporarily_unavailable"]},L=Q4(B).code;if(J3(L))throw new F5(L);throw new F6(typeof L==="string"&&M[U.status]?.includes(L)?L:U.status===401?"authentication_required":U.status===403?"access_denied":"temporarily_unavailable",U.status===429||U.status>=500,U.status===403)}catch(U){if(U instanceof G7)throw new F6("access_denied");if(U instanceof V5&&U.kind!=="unavailable")throw new F6("authentication_required");if(U instanceof F5||U instanceof F6&&!U.retryable)throw U;if(W===2||J.aborted)throw new F6("temporarily_unavailable",!0);await(X.wait??((z)=>Ug(250,void 0,{signal:z})))(J)}},identity:()=>(X.identity??B6)({fetch:(G,Y)=>fetch(G,{...Y,signal:AbortSignal.any([J,AbortSignal.timeout(25000)])})})}}function tK0(X,J,Q={}){if(!ZU.test(X)||!ZU.test(J))return $8();let Z=kT(Q),G=(V,K)=>{try{return CT(V,{routine:J,id:K})}catch{return $8()}},Y=(V)=>{if(!GU.test(V))return $8();let K=`/workspaces/${X}/runs/${V}`;return Kg({current:()=>Z.call(K,{},(H)=>G(H,V),[200]),step(H){if(!ZU.test(H))return $8();return Z.call(`${K}/steps/${H}`,{},(W)=>{try{return ET(W,H)}catch{return $8()}},[200])},wait:()=>(Q.wait??((H)=>Ug(250,void 0,{signal:H})))(Q.signal??AbortSignal.timeout(1200000))})};return{handle:Y,async get(V){let K=Y(V);return await K.current(),K},list:()=>Z.call(`/workspaces/${X}/routines/${J}/runs`,{},(V)=>{if(!Array.isArray(V)||V.length>20)return $8();return V.map((K)=>G(K))},[200],356515840)}}var zg=(X,J)=>`https://api.oddington.ai/workspaces/${X}/runs/${J}`;function qg(X,J,Q,Z={}){let G=X instanceof F5||X instanceof F6?X.code:X instanceof V5&&X.kind!=="unavailable"?"authentication_required":"temporarily_unavailable",Y=!!Z.startKey&&!(X instanceof F5)&&(!(X instanceof F6)||X.retryable),V=Y?"Start acknowledgement unavailable. OS may have accepted this action; do not repeat it as a new action.":X instanceof F5?X.message:wT[G];return Q(J?JSON.stringify({...Z,error:{code:G,message:V},...Y?{uncertain:!0}:{}}):`${V}${Z.startKey?`
414
417
  Start reference: ${Z.startKey}`:""}${Z.runId?`
415
418
  Run: ${Z.runId}`:""}`),1}async function Mg(X,J,Q,Z={}){let G=Z.report??console.log,Y=kT(Z),V,K,H;try{let W;try{W=await(Z.checkout??q8)(X,Z.cwd)}catch{throw new F5("invalid_source")}let U=await Y.identity(),z=new Map;V=await m3(X,W,U,async(j,N)=>{try{let A=await Y.call(j,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(N)},Q4,[200]);if(typeof A.workspace==="string"&&typeof A.workspaceId==="string")z.set(A.workspace,A.workspaceId);return A}catch(A){if(A instanceof F6&&A.prefixDenied)return null;throw A}});let q=await Y.call(`/workspaces/${V}/routines/${X}/describe`,{},(j)=>{let N=Q4(j),A=Q4(N.input),{default:R,...S}=A;if(N.id!==X)return $8();try{let $=W3({routine:X,input:S,steps:[{id:"inspect"}]});if(Object.hasOwn(A,"default"))y8($.input,R);return{input:$.input,hasDefault:Object.hasOwn(A,"default")}}catch{return $8()}},[200],524288);if(yH(q.input))throw new F6("file_not_remote");let B=await J();if(B===void 0&&!q.hasDefault&&(Z.interactive??process.stdin.isTTY)){let j=Q3({root:void 0,storage:"remote"},{workspace:V,member:{async current(){let A;try{A=await Y.identity()}catch(S){if(S instanceof V5&&S.kind==="unavailable")throw new _("unavailable",503,!0);throw new _("access_denied",403)}let R=A.workspaces.filter((S)=>S.slug===V);if(A.id!==U.id||R.length!==1)throw new F6("access_denied");return{workspaceId:z.get(V),creator:{kind:"member",id:A.id}}},request:(A,R)=>(Z.filesRequest??R9)(V,String(A),R)}}),N=Wg();B=await iH(q.input,(A,R)=>aH(A,{storage:R.storage??"remote",path:R.path},j,N,Z.signal),Z.question)}if(B!==void 0)try{y8(q.input,B)}catch{throw new F6("input_invalid")}K=Wg();let M=JSON.stringify({startKey:K,input:B}),L=await Y.call(`/workspaces/${V}/routines/${X}/runs`,{method:"POST",headers:{"content-type":"application/json"},body:M},(j)=>{try{return CT(j,{routine:X})}catch{return $8()}},[200,201]);H=L.id,K=void 0;let T=L,O=(j)=>{if(!Q)for(let N of j.steps)G(`${hJ(N.title,256)}: ${N.status}${N.summary===void 0?"":` ${hJ(JSON.stringify(N.summary),262144)}`}`)};if(O(L),L.status!=="succeeded"&&L.status!=="failed")for await(let j of tK0(V,X,Z).handle(L.id).watch())T=j,O(j);let I={...T,workspace:V,url:zg(V,L.id)};if(Q)G(JSON.stringify(I));else{if(G(`Run ${T.status}.
416
419
  Run: ${L.id}
@@ -435,9 +438,7 @@ Deployment: ${z.id}
435
438
  Version: ${z.version}`:""}${N.accessDifference?`
436
439
  Access difference: ${JSON.stringify(N.accessDifference)}`:""}`),1}finally{for(let j of H)process.removeListener(j,K);J.signal?.removeEventListener("abort",K)}}function LW0(X){let J=X.access;return[X.phase==="active"&&X.active?"Active":`Deployment ${X.phase}`,`Routine: ${X.routine}`,`Version: ${X.version}`,`Deployment: ${X.id}`,`Source: ${X.source.files} files, ${X.source.bytes} bytes; SHA-256 ${X.sourceDigest}`,...X.source.provenance?[`Git: ${X.source.provenance.branch?`${X.source.provenance.branch}; `:""}${X.source.provenance.commit??"no HEAD"}${X.source.provenance.dirty?" (eligible uncommitted changes)":" (eligible source unchanged)"}`]:[],`Runtime: ${X.runtime.resources}, ${X.runtime.maxDuration}; features: ${X.runtime.features.join(", ")||"none"}`,`Access: ${[...Object.entries(J.repositories).map(([Q,Z])=>`repository ${Q} (${Z})`),...J.connections.map((Q)=>`connection ${Q}`),...J.ai===!0?["AI"]:[],...J.files?[`Files (${J.files})`]:[],...J.publish.map((Q)=>`publish ${Q}`)].join(", ")||"none"}`,...X.failure?[`Failure: ${X.failure}`]:[]].join(`
437
440
  `)}var SY=`Usage: os routine check <canonical-routine-id> [--json]
438
- Check local requirements without running business steps or creating a Run.`;async function OW0(X,J={}){try{let Q=await(J.checkout??q8)(X,J.cwd),Z=await(J.discover??T1)(Q.root,X,J.sourceRuntime,J.childExecutable);if(Z.contract.id!==X)throw Error("Definition mismatch");let G=rH({$schema:H8,access:Z.contract.access}),Y=J.ai??bJ({environment:J.environment}),V=await tH(async()=>{let K=await eH(X,Q,G.access,{mode:"check",request:J.request,signal:J.signal});if(!K||Object.keys(K).sort().join(",")!=="checked,routine,workspace"||K.checked!==!0||K.routine!==X||typeof K.workspace!=="string"||!/^[a-z0-9][a-z0-9-]{0,62}$/.test(K.workspace))throw new d7("routine_start_unavailable","OS returned an invalid routine check result. Repeat the check when OS is available.");return K},G.access.ai===!0?()=>Y.readiness(J.signal):void 0);return{routine:X,status:"ready",workspace:V.workspace,stepsRan:!1}}catch(Q){let Z=Q instanceof M8||Q instanceof d7||Q instanceof F5||Q instanceof I6;return{routine:X,status:"blocked",stepsRan:!1,error:{code:Z?Q.code:"routine_check_unavailable",message:Z?Q.message:"Routine check could not inspect the source. Check the worktree origin, routine definition and installed dependencies.",...Q instanceof M8?{issues:Q.issues}:Q instanceof I6?{issues:[Q.diagnostic]}:{}}}}}async function Cg(X,J={}){let Q=J.report??console.log;if(X.length===2&&X[0]==="check"&&["--help","-h"].includes(X[1]))return Q(SY),0;if(X[0]!=="check"||!/^[a-z0-9][a-z0-9-]{0,62}$/.test(X[1]??"")||X.length>3||X.length===3&&X[2]!=="--json")throw Error(SY);let Z=await OW0(X[1],J);return Q(X[2]==="--json"?JSON.stringify(Z):Z.status==="ready"?`Routine "${Z.routine}" is ready to run locally in workspace "${Z.workspace}".
439
- No routine steps ran. No business changes were made.`:`${Z.error.message}
440
- No routine steps ran. No business changes were made.`),Z.status==="ready"?0:1}import{execFile as eW0}from"node:child_process";import{isDeepStrictEqual as nT}from"node:util";import{spawn as AW0}from"node:child_process";import{readFile as mT,readdir as RW0,realpath as s3,rename as SW0,stat as EY,writeFile as EW0,unlink as CW0}from"node:fs/promises";import{randomUUID as wW0}from"node:crypto";import{basename as Pg,dirname as KU,extname as kW0,isAbsolute as yg,join as n3,relative as fT,sep as _T}from"node:path";import{lstat as TW0,mkdir as IW0,mkdtemp as jW0,rename as hT,rm as kg,writeFile as vT}from"node:fs/promises";import{join as d3,relative as NW0,sep as $W0}from"node:path";function wg(X){return{id:X.id,...X.title===void 0?{}:{title:X.title},input:{...X.input,...Object.hasOwn(X,"inputDefault")?{default:X.inputDefault}:{}},connections:(X.access.connections??[]).map((J)=>{let[Q,Z]=J.split("/");return{id:J,provider:Q,name:Z}}),steps:X.steps.map(({id:J,title:Q})=>({id:J,title:Q}))}}async function Fg(X){X.prepared=void 0;let J=X.declaration.routines.length?await lx(X.worktreeRoot,X.declaration.routines):new Map,Q=X.declaration.routines.map((U)=>{let z=J.get(U);if(!z)throw Error("Declared routine definition unavailable");return z}),Z={routines:Q.map(({contract:U})=>wg(U))},Y=`// Generated by os app build. Do not edit.
441
+ Check local requirements without running business steps or creating a Run.`;async function OW0(X,J={}){try{let Q=await(J.checkout??q8)(X,J.cwd),Z=await(J.discover??T1)(Q.root,X,J.sourceRuntime,J.childExecutable);if(Z.contract.id!==X)throw Error("Definition mismatch");let G=rH({$schema:H8,access:Z.contract.access}),Y=J.ai??bJ({environment:J.environment}),V=await tH(async()=>{let K=await eH(X,Q,G.access,{mode:"check",request:J.request,signal:J.signal});if(!K||Object.keys(K).sort().join(",")!=="checked,routine,workspace"||K.checked!==!0||K.routine!==X||typeof K.workspace!=="string"||!/^[a-z0-9][a-z0-9-]{0,62}$/.test(K.workspace))throw new d7("routine_start_unavailable","OS returned an invalid routine check result. Repeat the check when OS is available.");return K},G.access.ai===!0?()=>Y.readiness(J.signal):void 0);return{routine:X,status:"ready",workspace:V.workspace,stepsRan:!1}}catch(Q){let Z=Q instanceof M8||Q instanceof d7||Q instanceof F5||Q instanceof I6;return{routine:X,status:"blocked",stepsRan:!1,error:{code:Z?Q.code:"routine_check_unavailable",message:Z?Q.message:"Routine check could not inspect the source. Check the worktree origin, routine definition and installed dependencies.",...Q instanceof M8?{issues:Q.issues}:Q instanceof I6?{issues:[Q.diagnostic]}:{}}}}}async function Cg(X,J={}){let Q=J.report??console.log;if(X.length===2&&X[0]==="check"&&["--help","-h"].includes(X[1]))return Q(SY),0;if(X[0]!=="check"||!/^[a-z0-9][a-z0-9-]{0,62}$/.test(X[1]??"")||X.length>3||X.length===3&&X[2]!=="--json")throw Error(SY);let Z=await OW0(X[1],J);return Q(X[2]==="--json"?JSON.stringify(Z):Z.status==="ready"?`Routine "${Z.routine}" is ready to run locally in workspace "${Z.workspace}".`:Z.error.message),Z.status==="ready"?0:1}import{execFile as eW0}from"node:child_process";import{isDeepStrictEqual as nT}from"node:util";import{spawn as AW0}from"node:child_process";import{readFile as mT,readdir as RW0,realpath as s3,rename as SW0,stat as EY,writeFile as EW0,unlink as CW0}from"node:fs/promises";import{randomUUID as wW0}from"node:crypto";import{basename as Pg,dirname as KU,extname as kW0,isAbsolute as yg,join as n3,relative as fT,sep as _T}from"node:path";import{lstat as TW0,mkdir as IW0,mkdtemp as jW0,rename as hT,rm as kg,writeFile as vT}from"node:fs/promises";import{join as d3,relative as NW0,sep as $W0}from"node:path";function wg(X){return{id:X.id,...X.title===void 0?{}:{title:X.title},input:{...X.input,...Object.hasOwn(X,"inputDefault")?{default:X.inputDefault}:{}},connections:(X.access.connections??[]).map((J)=>{let[Q,Z]=J.split("/");return{id:J,provider:Q,name:Z}}),steps:X.steps.map(({id:J,title:Q})=>({id:J,title:Q}))}}async function Fg(X){X.prepared=void 0;let J=X.declaration.routines.length?await lx(X.worktreeRoot,X.declaration.routines):new Map,Q=X.declaration.routines.map((U)=>{let z=J.get(U);if(!z)throw Error("Declared routine definition unavailable");return z}),Z={routines:Q.map(({contract:U})=>wg(U))},Y=`// Generated by os app build. Do not edit.
441
442
  import type { RoutineAppBinding } from '@oddington/sdk';
442
443
  declare module '@oddington/sdk' {
443
444
  interface AppRoutineTypes {
@@ -449,7 +450,7 @@ export {};
449
450
  `,V=d3(X.appDirectory,".os-generation-lock");await IW0(V,{mode:448});let K,H,W=d3(X.appDirectory,".os");try{K=await jW0(d3(X.appDirectory,".os-generation-")),await vT(d3(K,"app.d.ts"),Y,{flag:"wx",mode:384}),await vT(d3(K,"app-descriptor.json"),`${JSON.stringify(Z,null,2)}
450
451
  `,{flag:"wx",mode:384}),await vT(d3(K,".gitignore"),`*
451
452
  `,{flag:"wx",mode:384});let U;try{U=await TW0(W)}catch(z){if(z.code!=="ENOENT")throw z}if(U){if(!U.isDirectory()||U.isSymbolicLink())throw Error("Generated app directory must be confined");H=d3(V,"previous"),await hT(W,H)}try{await hT(K,W),K=void 0}catch(z){if(H)await hT(H,W),H=void 0;throw z}return X.prepared={descriptor:Z,definitions:new Map(Q.map((z)=>[z.contract.id,z]))},Z}finally{if(K)await kg(K,{recursive:!0,force:!0});await kg(V,{recursive:!0,force:!0})}}var uT="Prepare the app’s documented build dependencies and package.json build script, then retry os app launch. The app build must succeed.",FW0="Check the app’s declared interface output: a confined public bundle with index.html is required.",PW0={".html":"text/html; charset=utf-8",".js":"text/javascript; charset=utf-8",".mjs":"text/javascript; charset=utf-8",".css":"text/css; charset=utf-8",".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".webp":"image/webp",".avif":"image/avif",".svg":"image/svg+xml",".ico":"image/x-icon",".woff":"font/woff",".woff2":"font/woff2",".ttf":"font/ttf",".otf":"font/otf",".webmanifest":"application/manifest+json"};function _J(X,J){let Q=fT(X,J);return Q.length>0&&!yg(Q)&&Q!==".."&&!Q.startsWith(`..${_T}`)}async function DW0(X,J={platform:process.platform,execPath:process.execPath,npmExecPath:process.env.npm_execpath}){if(J.platform!=="win32")return{executable:"npm",args:["run","build"]};let Q=await s3(J.execPath),Z=[J.npmExecPath,n3(KU(Q),"node_modules/npm/bin/npm-cli.js")];for(let G of Z)try{if(!G||!yg(G))continue;let Y=await s3(G);if(Pg(Y)!=="npm-cli.js"||Pg(KU(Y))!=="bin")continue;let V=KU(KU(Y));if(V===X||_J(X,V))continue;let K=await s3(n3(V,"package.json"));if(!_J(V,K)||!(await EY(Y)).isFile())continue;let H=JSON.parse(await mT(K,"utf8"));if(!H||typeof H!=="object"||!("name"in H)||H.name!=="npm"||!("bin"in H)||!H.bin||typeof H.bin!=="object"||!("npm"in H.bin)||H.bin.npm!=="bin/npm-cli.js")continue;return{executable:Q,args:[Y,"run","build"]}}catch{}throw Error(uT)}async function yW0(X){let J=X.appDirectory;try{let Q=await s3(n3(J,"package.json"));if(!_J(J,Q)||!(await EY(Q)).isFile())throw Error();let Z=JSON.parse(await mT(Q,"utf8"));if(!Z||typeof Z!=="object"||!("scripts"in Z)||!Z.scripts||typeof Z.scripts!=="object"||!("build"in Z.scripts)||typeof Z.scripts.build!=="string"||!Z.scripts.build.trim())throw Error();let G=await DW0(X.worktreeRoot);await new Promise((Y,V)=>{let K=AW0(G.executable,G.args,{cwd:J,stdio:"ignore",shell:!1});K.once("error",V),K.once("exit",(H)=>H===0?Y():V(Error()))})}catch{throw Error(uT)}}function WU(X){let J=X.split("/");if(J.some((Q)=>Q.startsWith(".")||/[\u0000-\u0020\u007f?#\\%]/.test(Q))||J[0]==="_os"||J[0]==="api"||J.some((Q)=>Q==="node_modules"||Q==="src"||Q==="source")||/(?:^|\/)(?:package(?:-lock)?|(?:.*\.)?config|(?:ts|js)config)(?:\.|$)/i.test(X))return!1;return!0}function Dg(X){return WU(X)?PW0[kW0(X)]:void 0}async function xg(X){let J=X.appDirectory;try{if(await s3(J)!==J)throw Error()}catch{throw Error(uT)}let Q=await Fg(X),Z=X.prepared;X.prepared=void 0,await yW0(X);try{if(await s3(J)!==J)throw Error();let G=await s3(n3(J,"dist"));if(!_J(J,G)||!WU(fT(J,G).split(_T).join("/"))||!(await EY(G)).isDirectory())throw Error();let Y=await s3(n3(G,"index.html"));if(!_J(G,Y)||!(await EY(Y)).isFile())throw Error();let V=`globalThis[Symbol.for('oddington.app.descriptor')]=${JSON.stringify(Q)};
452
- `,K='<script src="/os-app-descriptor.js"></script>',H=await mT(Y,"utf8");for(let[z,q]of[[n3(G,"os-app-descriptor.js"),V],[n3(G,"index.html"),`${K}${H.replaceAll(K,"")}`]]){let B=n3(G,`.os-build-${wW0()}`);try{await EW0(B,q,{flag:"wx",mode:384}),await SW0(B,z)}finally{await CW0(B).catch((M)=>{if(M.code!=="ENOENT")throw M})}}let W=[];async function U(z,q,B){for(let M of(await RW0(z)).sort()){let L=n3(z,M),T=await s3(L);if(!_J(G,T))throw Error();let O=await EY(T),I=q?`${q}/${M}`:M,j=fT(G,T).split(_T).join("/");if(!WU(I)||!WU(j))continue;if(O.isDirectory()){if(B.includes(T))throw Error();await U(T,I,[...B,T])}else if(O.isFile()){let N=Dg(I);if(N&&Dg(j))W.push({pathname:I==="index.html"?"/":`/${I}`,relativePath:I,contentType:N})}}}if(await U(G,"",[G]),!W.some((z)=>z.pathname==="/"))throw Error();return X.prepared=Z,{assetRoot:G,assets:W}}catch{throw Error(FW0)}}import{constants as lT}from"node:fs";import{open as pW0,realpath as mg,stat as ug}from"node:fs/promises";import{createServer as cW0}from"node:http";import{isAbsolute as pg,relative as lW0,resolve as dW0,sep as nW0}from"node:path";import{createHash as xW0,randomBytes as mJ,timingSafeEqual as bW0}from"node:crypto";var gW0=60000,bg=600000,hW0=20000;class j5 extends Error{constructor(){super("Local app session is unavailable");this.name="AppSessionDenied"}}class HU extends j5{}class v5 extends Error{constructor(){super("Local app renewal is temporarily unavailable")}}function gg(X){let J=X.now??Date.now,Q=X.schedule??((v,a)=>{let X0=setTimeout(v,a);return X0.unref?.(),()=>clearTimeout(X0)}),Z=X.origin,G=X.authority,Y={appId:G.appId,memberId:G.memberId,workspace:G.workspace},V=X.verifyAuthority;if(!vW0(Z)||Object.values(Y).some((v)=>typeof v!=="string"||!v.trim())||typeof V!=="function"||!Number.isFinite(G.expiresAt)||G.expiresAt<=J())throw new j5;let K=mJ(32).toString("base64url"),H=uJ(K),W=Math.min(J()+gW0,G.expiresAt),U=mJ(32).toString("base64url"),z=new WeakMap,q=new Set,B=new Set,M=G.expiresAt,L=0,T,O,I=!1,j=!1,N=0,A=0,R,S=Q(()=>{if(!T)w()},Math.max(0,W-J()));function $(){if(j)return;j=!0,A++,R?.abort(),S?.(),I=!0,T=void 0,O=void 0,q.clear(),w(),B.clear(),X.onInvalidate?.()}function E(){return{...Y,sessionId:U,expiresAt:L}}function x(v){if(j)throw new j5;if(L===v)return;if(L&&J()>=L)w();L=v,S?.(),S=Q(()=>{if(L===v)w()},Math.max(0,L-J()));for(let a of q)a(L)}function w(){A++;for(let v of B)v()}function C(v){return!!v&&v.appId===Y.appId&&v.memberId===Y.memberId&&v.workspace===Y.workspace&&Number.isFinite(v.expiresAt)&&v.expiresAt>J()}async function D(){let v=N;try{let a=await V();if(v===N){if(a&&Number.isFinite(a.expiresAt)&&a.expiresAt<=J()&&a.appId===Y.appId&&a.memberId===Y.memberId&&a.workspace===Y.workspace)throw M=Math.min(M,a.expiresAt),x(Math.min(L,M)),new v5;if(!C(a))throw new j5;M=Math.min(M,a.expiresAt)}}catch(a){if(v===N){if(!(a instanceof v5))$();throw new j5}}if(j||J()>=M)throw new j5}function g(){if(j||!T)throw new j5;if(J()>=L||J()>=M)throw w(),new j5}function f(v){if(g(),v.origin!==Z||!pT(v.credential,T))throw new j5}function P(v){if(g(),z.get(v)!==A)f(v)}async function m(v){return P(v),z.set(v,A),await D(),x(Math.min(L,M)),P(v),E()}return{bootstrap:K,async exchange(v){if(!T&&J()>=W)throw $(),new j5;if(j||I||v.origin!==Z||!pT(v.bootstrap,H))throw new j5;if(I=!0,await D(),j||J()>=W)throw $(),new j5;let a=mJ(32).toString("base64url"),X0=mJ(32).toString("base64url");return T=uJ(a),O=uJ(X0),N++,x(Math.min(J()+bg,M)),{credential:a,renewalCredential:X0,context:E()}},authorize:m,assertCurrent:P,onDeadlineChange(v){return q.add(v),()=>{q.delete(v)}},onAccessUnavailable(v){return B.add(v),()=>{B.delete(v)}},async renew(v){if(j||!O)throw new j5;if(v.origin!==Z)throw new j5;if(!pT(v.credential,O)||R)throw new HU;let a=new AbortController;R=a;let X0=N,z0=Q(()=>a.abort(),hW0);try{let G0=await new Promise((t,U0)=>{let k=()=>U0(new v5);a.signal.addEventListener("abort",k,{once:!0}),Promise.resolve().then(()=>X.renewAuthority?.(a.signal)??null).then(t,U0).finally(()=>a.signal.removeEventListener("abort",k))});if(a.signal.aborted||X0!==N||j)throw new j5;if(G0&&G0.appId===Y.appId&&G0.memberId===Y.memberId&&G0.workspace===Y.workspace&&Number.isFinite(G0.expiresAt)&&G0.expiresAt<=J())throw new v5;if(!C(G0))throw new j5;let e=mJ(32).toString("base64url"),s=mJ(32).toString("base64url");return M=G0.expiresAt,T=uJ(e),O=uJ(s),N++,x(Math.min(J()+bg,M)),{credential:e,renewalCredential:s,context:E()}}catch(G0){if(G0 instanceof v5&&!j&&X0===N)throw new v5;if(X0===N)$();throw new j5}finally{if(z0(),R===a)R=void 0}},async verifyCurrent(){if(!T||j||J()>=L){if(!j)w();throw new j5}if(await D(),x(Math.min(L,M)),j||J()>=L)throw new j5;return E()},async signOut(v){f(v),await D(),f(v),$()},stop:$}}function uJ(X){return xW0("sha256").update(X).digest()}function pT(X,J){return typeof X==="string"&&bW0(uJ(X),J)}function vW0(X){try{let J=new URL(X);return J.protocol==="http:"&&J.hostname==="127.0.0.1"&&Boolean(J.port)&&J.port!=="0"&&J.origin===X}catch{return!1}}import{isDeepStrictEqual as fW0}from"node:util";import{join as _W0}from"node:path";class CY extends Error{reason;constructor(X){super(X);this.reason=X}}function hg(X){let{checkout:J,session:Q,runtime:Z}=X,G={...structuredClone(J.declaration),repositories:new Set(J.declaration.repositories)},Y=structuredClone(J.prepared?.descriptor.routines??[]),V=!1,K=new Set,H=new Set,W=new Set,U=($)=>{throw new CY($)},z=()=>{for(let $ of K)$.abort();for(let $ of W)$.destroy()},q=Q.onAccessUnavailable(z),B=()=>{V=!0,z()},M=()=>{if(!fW0(G,{...J.declaration,repositories:new Set(J.declaration.repositories)}))Q.stop(),U("authority_unavailable")},L=($)=>{if(V)U("authority_unavailable");if(Q.assertCurrent($),M(),V)U("authority_unavailable")},T=($,E)=>({status:200,value:E,isCurrent(){try{return L($),!0}catch{return!1}}}),O=async($,E=!1)=>{if(V)U("authority_unavailable");let x=await Q.authorize($);if(E)await Z?.assertRetainedAccess?.();if(Q.assertCurrent($),E)M();if(V)U("authority_unavailable");return x};async function I($,E,x=!1,w){let C=w??await O($,!0);return sH(C.workspace,async(D,g)=>{if(D.routine!==E||D.starter.kind!=="member"||D.starter.id!==C.memberId)U("authority_unavailable");if(!x){L($);return}await O($,!0);let f=Z??U("authority_unavailable"),P=Object.keys(g).length?g:JSON.parse(await O7(_W0(t8(C.workspace,f.execution).runs,D.id,"execution.json")));await f.authorize(E,P),await O($,!0)},Z?.execution)}async function j($,E){await O($);let x=Y.find((D)=>D.id===E);if(!x)U("execution_unavailable");let w={...structuredClone(x),connections:x.connections.map((D)=>({...D,available:!1})),readiness:{state:"unavailable",reason:"capability_unavailable",message:"Routine capability unavailable."}},C=await Sx(J,E);if(await O($),!C)w.readiness={state:"unavailable",reason:"definition_invalid",message:"Prepare the current routine definition before starting."};try{let D=await Z?.connections(E);if(w.connections=w.connections.map((g)=>({...g,available:D?.[g.id]===!0})),C&&Z){if(await Z.authorize(E),J.prepared?.definitions.get(E)?.contract.access.ai===!0)await bJ({environment:Z.execution?.environment}).readiness();w.readiness={state:"ready",placement:"local"}}}catch{}return await O($),w}async function N($,E,x){let w=await O($);if(!Z||K.size>=4)U("execution_unavailable");let C=new AbortController;K.add(C);let D=!1;try{if((await j($,E)).readiness.state!=="ready")U("execution_unavailable");let g=J.prepared.definitions.get(E);try{y8(g.contract.input,x===void 0?g.contract.inputDefault:x)}catch{U("invalid_input")}await O($);let f=g.source.version,P=!1,v=await new Promise((a,X0)=>{let z0=(Z.execute??XU)(E,x,{...Z.execution,cwd:J.worktreeRoot,signal:C.signal,interactive:!1,definition:g,host:{workspace:w.workspace,memberId:w.memberId,sourceVersion:f,async assertCurrent(){if(await O($),V||C.signal.aborted)U("authority_unavailable")}},progress(G0){if(!P)P=!0,a(G0)}});D=!0,H.add(z0),z0.then((G0)=>{if(!P)G0.summary?a(G0.summary):X0(new CY("execution_unavailable"))},X0).finally(()=>{H.delete(z0),K.delete(C)})}).catch((a)=>{if(a instanceof CY||a instanceof V5||a instanceof v5)throw a;return U("execution_unavailable")});return await O($),v}finally{if(!D)K.delete(C)}}async function A($,E,x){let w=E.match(/^\/_os\/app\/routines\/([a-z0-9]+(?:-[a-z0-9]+)*)\/(describe|runs)(?:\/([0-9a-f-]+)(?:\/(publish|steps)\/?([a-z0-9-]+)?)?)?$/);if(!w)return null;let[,C,D,g,f,P]=w,m=D==="runs"&&$.method==="GET";try{if(m)M();if(!J.declaration.routines.includes(C))return{status:404,value:{error:"execution_unavailable"}};if($.url?.includes("?"))U("invalid_input");let v=await O(x,m);if(D==="describe"&&!g&&$.method==="GET")return R($),{status:200,value:await j(x,C)};if(D!=="runs")U("invalid_input");if(!g&&$.method==="POST"){let G0=await S($);return{status:200,value:await N(x,C,G0)}}R($);let a=await I(x,C,f==="publish",m?v:void 0);if(!g&&$.method==="GET"){let G0=await a.list(C,v.memberId);return T(x,G0)}if(!g)U("invalid_input");let X0=await a.get(C,g);if(f==="publish"&&!P&&$.method==="POST"){let G0=await X0.current();if(G0.status!=="succeeded"||!G0.publication)U("invalid_input");if(G0.publication.state!=="not_needed"){let e=Z?.publicationRequest??Z?.execution?.request;if(!e)U("execution_unavailable");let s=(Z.publish??PT)(J.worktreeRoot,g,{...Z.execution,report(){},request:async(t,U0)=>{if(t===`/api/cli/local-routines/runs/${g}/publication`&&U0?.method==="DELETE")return e(t,U0);return await X0.current(),await e(t,U0)}});H.add(s);try{await s}catch{await X0.current()}finally{H.delete(s)}}return{status:200,value:await X0.current()}}if($.method!=="GET")U("invalid_input");let z0=f==="steps"&&P?await X0.step(P):!f?await X0.current():U("invalid_input");return T(x,z0)}catch(v){if(v instanceof V5&&v.kind==="unavailable"||v instanceof v5)return{status:503,value:{error:"execution_unavailable"}};let a=v instanceof CY?v.reason:"authority_unavailable";return{status:a==="invalid_input"?400:a==="execution_unavailable"?503:403,value:{error:a}}}}function R($){if($.headers["transfer-encoding"]!==void 0||$.headers["content-length"]!==void 0&&$.headers["content-length"]!=="0")U("invalid_input")}async function S($){let E=0,x=[];W.add($);try{for await(let w of $){let C=Buffer.from(w);if((E+=C.length)>262176)U("invalid_input");x.push(C)}try{let w=JSON.parse(new TextDecoder("utf-8",{fatal:!0}).decode(Buffer.concat(x)));if(!w||typeof w!=="object"||Array.isArray(w)||!["","input"].includes(Object.keys(w).join(",")))U("invalid_input");return w.input}catch{return U("invalid_input")}}finally{W.delete($)}}return{handle:A,invalidate:B,async stop(){B(),q(),await Promise.allSettled([...H])}}}f7();function vg(X){let J=new AbortController,Q=new Map,Z=new Set,G=new Map,Y=new Map,V=X.session.onAccessUnavailable(z),K=!1,H=!1,W=X.session.onDeadlineChange((I)=>{if(K||I<=(X.now??Date.now)())return;H=!1,L()}),U=(I)=>{let j=I.then((N)=>N.close(),()=>{});Z.add(j),j.then(()=>Z.delete(j),()=>{})};function z(){H=!0,J.abort(),J=new AbortController;for(let I of Q.values())U(I.owner);Q.clear();for(let I of Y.values())I.invalidate();Y.clear()}function q(){K=!0,z(),J.abort(),V(),W()}function B(I){G.set(I,(G.get(I)??0)+1);let j=Q.get(I);if(Q.delete(I),j)U(j.owner);Y.get(I)?.invalidate(),Y.delete(I)}function M(I){if(K||H)return;let j=X.binding(I);if(!j)return;let N=Z7(j,I);if(!X.verifyBinding(N))return;let A=Q.get(I);if(A&&o3(A.binding,N)&&t3(A.binding,N))return;B(I);let R=J,S=G.get(I),$=()=>!R.signal.aborted&&S===G.get(I)&&X.verifyBinding(N),E=Promise.resolve().then(()=>{if(!$())throw new j5;return(X.openIndex??tW)({target:{...N.target,dataRoots:[...N.target.dataRoots]},checkout:X.checkout.worktreeRoot,sourceVersion:N.sourceVersion})}),x=E.then(async(w)=>{if(!$())throw new j5;if(await w.collections.list(),!$())throw new j5;return w});Q.set(I,{binding:N,owner:E,ready:x}),x.catch(()=>{U(E)})}function L(){for(let I of X.checkout.declaration.repositories)M(I)}async function T(){q(),await Promise.all(Z)}async function O(I,j){let N=J;try{if(I.method!=="POST")return{status:405,value:{error:{code:"invalid_query"}}};if(I.url!=="/_os/app/data"||I.headers["content-type"]!=="application/json")throw new Y0("invalid_query");if(await X.session.authorize(j),N.signal.aborted)throw new j5;let A=V1(await mW0(I,N.signal));if(await X.session.authorize(j),!X.checkout.declaration.repositories.includes(A.repository))throw new Y0("access_denied");if(A.operation==="changes.validate"||A.operation==="changes.publish")throw new Y0("invalid_change",!1,"unapplied");let R;try{let C=X.binding(A.repository);if(!C)throw Error();R=Z7(C,A.repository)}catch{throw new Y0("access_denied")}let S=G.get(A.repository)??0,$=()=>{if(X.session.assertCurrent(j),N.signal.aborted||S!==(G.get(A.repository)??0)||!X.verifyBinding(R))throw new j5};if($(),A.operation==="history.list"||A.operation==="history.at"||A.operation==="history.changes"){let C=Y.get(A.repository);if(!C)C=QH(X.acquireHistory??(async()=>{throw new Y0("unavailable",!0)})),Y.set(A.repository,C);let D=await C.read(R,A.operation==="history.list"?{operation:"list",options:A.options??{}}:A.operation==="history.changes"?{operation:"changes",options:A.options}:{operation:"at",options:{instant:A.instant}});return await X.session.authorize(j),$(),{status:200,value:D,isCurrent:()=>{try{return $(),!0}catch{return!1}}}}let E=Q.get(A.repository);if(!E||!o3(E.binding,R)||!t3(E.binding,R))throw new Y0("unavailable",!0);let x=await E.ready;$();let w=A.operation==="collections.list"?await x.collections.list():A.operation==="collections.schema"?await x.collections.schema(A.name):A.operation==="records.search"?await x.records.search(A.query,A.options):A.operation==="records.read"?await x.records.read(A.refs):await x.records.select(A.query);return await X.session.authorize(j),$(),{status:200,value:w,isCurrent:()=>{try{return $(),!0}catch{return!1}}}}catch(A){let R=N.signal.aborted||A instanceof j5?new Y0("access_denied"):A instanceof Y0?A:A instanceof A0?new Y0("invalid_query"):A instanceof n9?new Y0("capacity",!0):new Y0("unavailable",!0);return{status:R.code==="access_denied"?403:R.code==="request_too_large"?413:R.code==="capacity"?429:R.code==="unavailable"?503:400,value:{error:{code:R.code,...R.retryable?{retryable:!0}:{},...R.effect?{effect:R.effect}:{}}}}}}return{handle:O,installRepository:M,installCurrentRepositories:L,invalidate:q,invalidateRepository:B,stop:T}}function mW0(X,J){return new Promise((Q,Z)=>{let G=[],Y=0,V=()=>{clearTimeout(W),J.removeEventListener("abort",H),X.removeListener("data",U),X.removeListener("end",z),X.removeListener("error",K),X.removeListener("aborted",H)},K=(q)=>{V(),X.resume(),Z(q)},H=()=>K(new j5),W=setTimeout(()=>K(new Y0("invalid_query")),5000),U=(q)=>{if(Y+=q.length,Y>LL)K(new Y0("request_too_large"));else G.push(q)},z=()=>{V();try{Q(JSON.parse(new TextDecoder("utf-8",{fatal:!0}).decode(Buffer.concat(G))))}catch{Z(new Y0("invalid_query"))}};if(X.on("data",U).once("end",z).once("error",K).once("aborted",H),J.addEventListener("abort",H,{once:!0}),J.aborted)H()})}function wY(X){let J=X.now??Date.now,Q=X.schedule??((R,S)=>{let $=setTimeout(R,S);return $.unref?.(),()=>clearTimeout($)}),Z={...X.authority},G=[...X.bindings.keys()],Y=new Map([...X.bindings].map(([R,S])=>[R,Z7(S,R)])),V=new Map(Y),K=new Set,H=new Set,W=!1,U=!1,z,q,B,M=0,L;function T(){if(W)return;W=!0,M++,z?.(),B?.abort(),Y.clear();for(let R of K)R()}function O(){return W||J()>=Z.expiresAt?null:{...Z}}function I(R,S){Y.delete(R);for(let $ of K)$(R);if(!W&&S){Y.set(R,S);for(let $ of H)$(R)}}function j(){if(!O())return Promise.resolve();if(L)return L.then(()=>{},()=>{});if(q)return q;B=new AbortController;let R=B,S=M,$=()=>S===M&&!R.signal.aborted&&!!O(),E=Q(()=>R.abort(),20000);R.signal.addEventListener("abort",E,{once:!0});let x=(D)=>new Promise((g)=>{let f=(m)=>{R.signal.removeEventListener("abort",P),g(m)},P=()=>f({kind:"unavailable"});if(R.signal.addEventListener("abort",P,{once:!0}),R.signal.aborted)P();D.then(f,()=>f({kind:"unavailable"}))}),w=async()=>{let D=await x(Promise.resolve().then(()=>X.observeAuthority(R.signal)));if($()&&(D.kind==="denied"||D.kind==="invalid"||D.kind==="authorized"&&(D.value.appId!==Z.appId||D.value.memberId!==Z.memberId||D.value.workspace!==Z.workspace||!Number.isFinite(D.value.expiresAt))))T();return D},C=async(D)=>{let g=await x(Promise.resolve().then(()=>X.observeRepositoryBinding(D,R.signal)));if($()){if(g.kind==="denied"||g.kind==="invalid")T();if(g.kind==="authorized")try{let f=Z7(g.value,D),P=Y.get(D);if(!t3(V.get(D),f))T();else if(P&&!o3(P,f))I(D)}catch{return T(),[D,{kind:"invalid"}]}}return[D,g]};return q=(async()=>{let[D,g]=await Promise.all([w(),Promise.all(G.map(C))]);if(!$())return;if(D.kind!=="authorized"||g.some(([,f])=>f.kind!=="authorized"))return;Z.expiresAt=Math.min(Z.expiresAt,D.value.expiresAt);for(let[f,P]of g){if(P.kind!=="authorized")continue;let m;try{m=Z7(P.value,f)}catch{T();return}let v=Y.get(f);if(!v||!o3(v,m)||!t3(v,m))I(f,m)}})().finally(()=>{if(E(),R.signal.removeEventListener("abort",E),B===R)B=void 0;if(S===M)q=void 0}),q}function N(){if(!O())return;let R=M;j().finally(()=>{if(!W&&R===M)z=Q(N,30000)})}function A(R){if(W||L||R.aborted||!X.renewAuthority)return Promise.resolve(null);M++,B?.abort(),q=void 0;let S=M,$=new AbortController;B=$;let E=()=>$.abort();R.addEventListener("abort",E,{once:!0});let x=Q(E,20000);return $.signal.addEventListener("abort",x,{once:!0}),L=(async()=>{try{let w=await new Promise((g,f)=>{let P=()=>f(new v5);if($.signal.addEventListener("abort",P,{once:!0}),$.signal.aborted)P();Promise.resolve().then(()=>X.renewAuthority($.signal)).then(g,f).finally(()=>$.signal.removeEventListener("abort",P))});if(W||S!==M||$.signal.aborted)throw Error();let C=w.authority;if(C.appId!==Z.appId||C.memberId!==Z.memberId||C.workspace!==Z.workspace||!Number.isFinite(C.expiresAt)||w.bindings.size!==G.length)throw Error();let D=new Map;for(let g of G){let f=Z7(w.bindings.get(g),g),P=V.get(g);if(!t3(P,f))throw Error();D.set(g,f)}if(C.expiresAt<=J())throw new v5;w.install(),Z.expiresAt=C.expiresAt;for(let[g,f]of D){let P=Y.get(g);if(!P||!o3(P,f))I(g,f)}return O()}catch(w){if(w instanceof v5&&S===M&&!W)throw new v5;if(S===M)T();return null}finally{if(x(),$.signal.removeEventListener("abort",x),R.removeEventListener("abort",E),B===$)B=void 0;if(L=void 0,U&&!W&&S===M)z?.(),z=Q(N,30000)}})(),L}return{current:O,retained(){return W?null:{...Z}},binding(R){if(!O())return null;let S=Y.get(R);return S?Z7(S,R):null},matches(R){if(!O())return!1;let S=Y.get(R.target.repository);return!!S&&o3(S,R)&&t3(S,R)},subscribe(R){return K.add(R),()=>K.delete(R)},onBindingInstalled(R){return H.add(R),()=>H.delete(R)},start(){if(U||!O())return;U=!0,z=Q(N,30000)},refresh:j,renew:A,stop:T}}import{isDeepStrictEqual as cT}from"node:util";function fg(X){let J=new Set,Q=!1,Z=()=>{Q=!0;for(let Y of J)Y.abort()};async function G(Y,V){let K=new AbortController,H=setTimeout(()=>K.abort(),30000);H.unref?.(),J.add(K);let W=()=>{if(Q)throw new j5;if(X.session.assertCurrent(V),Q)throw new j5;if(X.binding&&!cT(X.binding.declaration,X.checkout.declaration))throw new j5;if(K.signal.aborted)throw new i5(503,"unavailable")};try{let U=await X.session.authorize(V);if(W(),Y.method!=="POST"||Y.url!=="/_os/app/inbox"||Y.headers["content-type"]!=="application/json")throw new i5(400,"invalid_input");let z=0,q=[],B=()=>Y.destroy();K.signal.addEventListener("abort",B,{once:!0});try{for await(let O of Y){let I=Buffer.from(O);if(z+=I.length,z>FU)throw new i5(400,"invalid_input");q.push(I)}}finally{K.signal.removeEventListener("abort",B)}let M;try{M=f1(JSON.parse(new TextDecoder("utf-8",{fatal:!0}).decode(Buffer.concat(q))))}catch{throw new i5(400,"invalid_input")}if(W(),!nY(M.operation))throw new i5(403,"access_denied");let L=X.binding;if(!L||!X.request)throw new i5(503,"unavailable");if(L.appId!==U.appId||L.workspace!==U.workspace||L.memberId!==U.memberId||!cT(L.declaration,X.checkout.declaration))throw new i5(401,"authority_unavailable");if(M.operation==="questions.list"&&M.input.routines.some((O)=>!L.routines.includes(O)))throw new i5(403,"access_denied");W();let T=_1(M.operation,await X.request(M.operation,M.input,K.signal));if(W(),M.operation==="questions.list"&&T.questions.some((O)=>!M.input.routines.includes(O.routine)||O.inboxUrl!==`https://${L.workspace}.oddington.ai/inbox/${O.itemId}`))throw new i5(503,"unavailable");return{status:200,value:T,isCurrent:()=>{try{return X.session.assertCurrent(V),!Q&&cT(L.declaration,X.checkout.declaration)}catch{return!1}}}}catch(U){try{W()}catch(q){U=q instanceof i5?q:new i5(401,"authority_unavailable")}let z=U instanceof i5?U:new i5(503,"unavailable");return{status:z.status,value:{error:z.reason}}}finally{clearTimeout(H),J.delete(K)}}return{handle:G,invalidate:Z}}y5();import{Readable as uW0}from"node:stream";function _g(X){let J=new Set,Q=!1,Z=()=>{for(let V of J)V.abort()};X.session.onAccessUnavailable(Z);let G=()=>{Q=!0,Z()};async function Y(V,K,H){let W=new AbortController,U=()=>W.abort(),z=()=>{if(X.session.assertCurrent(H),Q)throw new _("access_denied",403);if(W.signal.aborted)throw new _("unavailable",503,!0)};try{let q=await X.session.authorize(H);if(z(),J.size>=d1)throw new _("capacity",429,!0);if(J.add(W),V.once("aborted",U),K.once("close",U),V.setTimeout(30000,U),!X.transport)throw new _("unavailable",503,!0);let B=V.url.slice(14);if(B.includes("?")||B.includes("#"))throw new _("invalid_input",400);let M={};for(let j of["content-type","x-os-file","x-os-enrichment"]){let N=V.headers[j];if(typeof N==="string")M[j]=N}let L=Q3(_3(q.workspace,X.state),{workspace:q.workspace,member:{async current(){z();let j=await X.transport.current(W.signal);if(z(),j.creator.kind!=="member"||j.creator.id!==q.memberId)throw new _("access_denied",403);return j},async request(j,N){z();let A=N?.signal?AbortSignal.any([W.signal,N.signal]):W.signal,R=await X.transport.request(j,{...N,signal:A});try{return z(),R}catch(S){throw R.body?.cancel().catch(()=>{}),S}}}}),T=uW0.toWeb(V,{strategy:{highWaterMark:65536,size:(j)=>j.byteLength}}),O=await L.stream({suffix:B,method:V.method??"",headers:M},T,W.signal);try{z()}catch(j){throw O.body?.cancel().catch(()=>{}),j}let I=new Headers;for(let j of["content-type","content-length"]){let N=O.headers.get(j);if(N!==null)I.set(j,N)}await IY(K,new Response(O.body,{status:O.status,headers:I}),W.signal)}catch(q){let B="unavailable",M=503;try{if(X.session.assertCurrent(H),Q)throw Error()}catch{B="access_denied",M=403}if(M!==403&&q instanceof _)B=q.code,M=q.status;if(K.headersSent)K.destroy();else K.writeHead(M,{"content-type":"application/json"}),K.end(JSON.stringify({error:{code:B}}))}finally{W.abort(),J.delete(W),V.removeListener("aborted",U),K.removeListener("close",U),V.setTimeout(0),V.resume()}}return{handle:Y,invalidate:G}}var dT="/_os/app/bootstrap",sW0="/_os/app/context",aW0="/_os/app/sign-out",cg="/_os/app/renew",iW0=4096;async function lg(X){let J=await oW0(X.assetRoot,X.assets),Q=new Map,Z=X.authority;if(!X.lifecycle)try{for(let I of X.checkout?.declaration.repositories??[]){let j=await X.repositoryBinding?.(I);if(j)Q.set(I,j)}let O=await X.verifyAuthority?.();if(!O||O.appId!==X.authority.appId||O.memberId!==X.authority.memberId||O.workspace!==X.authority.workspace||!Number.isFinite(O.expiresAt)||O.expiresAt<=(X.now??Date.now)())throw Error();Z={...Z,expiresAt:Math.min(Z.expiresAt,O.expiresAt)}}catch{throw Error("Local app host could not start")}let G=X.lifecycle??wY({authority:Z,bindings:Q,now:X.now,observeAuthority:async()=>{let O=await X.verifyAuthority?.();return O?{kind:"authorized",value:O}:{kind:"denied"}},observeRepositoryBinding:async(O)=>{let I=await X.repositoryBinding?.(O);return I?{kind:"authorized",value:I}:{kind:"denied"}},renewAuthority:X.renewAuthority?async(O)=>{let I=await X.renewAuthority(O);if(!I)throw Error();let j=new Map;for(let N of Q.keys()){let A=await X.repositoryBinding?.(N);if(!A)throw Error();j.set(N,A)}return{authority:I,bindings:j,install(){}}}:void 0}),Y,V,K,H,W,U="",z=!1,q=cW0((O,I)=>{M(O,I).catch(()=>Z6(I,403,{error:"Local app request denied"}))}),B=new Set;q.on("connection",(O)=>{B.add(O),O.once("close",()=>B.delete(O))}),q.requestTimeout=0,q.headersTimeout=5000,q.on("clientError",(O,I)=>I.destroy());async function M(O,I){if(I.setHeader("Cache-Control","no-store"),I.setHeader("Referrer-Policy","no-referrer"),I.setHeader("X-Content-Type-Options","nosniff"),I.setHeader("Content-Security-Policy","frame-ancestors 'none'"),z||!Y||O.headers.host!==U.slice(7))return Z6(I,403,{error:"Local app request denied"});let j=dg(O.url??"");if(!j)return Z6(I,400,{error:"Invalid local app request"});let N=O.method;if(j!=="/_os/app/files"&&!j.startsWith("/_os/app/files/")&&!O.complete){let R=setTimeout(()=>O.destroy(),5000);R.unref?.();let S=()=>clearTimeout(R);O.once("end",S),O.once("close",S)}if(N!=="GET"&&N!=="HEAD"||O.headers.origin!==void 0){if(O.headers.origin!==U)return Z6(I,403,{error:"Local app request denied"})}if(j===dT&&N==="GET"){I.setHeader("Content-Security-Policy","default-src 'none'; script-src 'unsafe-inline'; connect-src 'self'; base-uri 'none'; frame-ancestors 'none'"),I.writeHead(200,{"Content-Type":"text/html; charset=utf-8"}),I.end(tW0);return}if(j===dT&&N==="POST"){let R=await rW0(O);return Z6(I,200,await Y.exchange({origin:U,bootstrap:R}))}if(j===sW0&&N==="GET")return Z6(I,200,await Y.authorize({origin:U,credential:D1(O)}));if(j===cg&&N==="POST"){if(O.url!==cg||O.headers["transfer-encoding"]!==void 0||O.headers["content-length"]!==void 0&&O.headers["content-length"]!=="0")return Z6(I,400,{error:"Invalid local app request"});try{return Z6(I,200,await Y.renew({origin:U,credential:D1(O)}))}catch(R){if(R instanceof HU)return Z6(I,403,{error:"renewal_conflict"});if(R instanceof v5)return Z6(I,503,{error:"renewal_unavailable"});throw R}}if(j===aW0&&N==="POST"){await Y.signOut({origin:U,credential:D1(O)});try{await Promise.all([V?.stop(),K?.stop()])}catch{return Z6(I,503,{error:"execution_unavailable"})}return Z6(I,200,{signedOut:!0})}if(j==="/_os/app/data"){if(!K)return Z6(I,503,{error:{code:"unavailable",retryable:!0}});let R=await K.handle(O,{origin:U,credential:D1(O)});if(R.isCurrent?.()===!1)return Z6(I,403,{error:{code:"access_denied"}});return Z6(I,R.status,R.value)}if(j==="/_os/app/files"||j.startsWith("/_os/app/files/")){if(!W)return Z6(I,503,{error:{code:"unavailable"}});await W.handle(O,I,{origin:U,credential:D1(O)});return}if(j==="/_os/app/inbox"){if(!H)return Z6(I,503,{error:"unavailable"});let R=await H.handle(O,{origin:U,credential:D1(O)});if(R.isCurrent?.()===!1)return Z6(I,401,{error:"authority_unavailable"});return Z6(I,R.status,R.value)}if(j.startsWith("/_os/app/routines/")){let R=await V?.handle(O,j,{origin:U,credential:D1(O)});if(R?.isCurrent?.()===!1)return Z6(I,403,{error:"authority_unavailable"});if(R)return Z6(I,R.status,R.value)}if(j==="/_os"||j.startsWith("/_os/")||j==="/api"||j.startsWith("/api/"))return Z6(I,404,{error:"Local app operation unavailable"});let A=J.get(j);if(!A)return Z6(I,404,{error:"Local app asset unavailable"});if(N!=="GET"&&N!=="HEAD")return Z6(I,405,{error:"Local app request denied"});I.writeHead(200,{"Content-Type":A.contentType,"Content-Length":A.bytes.length}),I.end(N==="HEAD"?void 0:A.bytes)}let L;function T(){if(z=!0,G.stop(),Y?.stop(),H?.invalidate(),W?.invalidate(),L)return L;let O=new Promise((I)=>{q.close(()=>I()),q.closeAllConnections();for(let j of B)j.destroy()});return L??=Promise.all([O,V?.stop(),K?.stop()]).then(()=>{}),L.catch(()=>{L=void 0}),L}try{await new Promise((I,j)=>{q.once("error",j),q.listen(0,"127.0.0.1",()=>{q.removeListener("error",j),I()})});let O=q.address();if(!O||typeof O==="string")throw Error("Invalid app listener");if(U=`http://127.0.0.1:${O.port}`,Y=gg({origin:U,authority:Z,verifyAuthority:async()=>G.retained(),now:X.now,schedule:X.schedule,renewAuthority:(I)=>G.renew(I),onInvalidate:()=>{G.stop(),V?.invalidate(),K?.invalidate(),H?.invalidate(),W?.invalidate()}}),W=_g({session:Y,transport:X.filesTransport,state:X.filesState}),X.checkout&&X.checkout.declaration.name===X.authority.appId)V=hg({checkout:X.checkout,session:Y,runtime:X.routineRuntime}),K=vg({checkout:X.checkout,session:Y,now:X.now,binding:(I)=>G.binding(I),verifyBinding:(I)=>G.matches(I),openIndex:X.openDataIndex,acquireHistory:X.acquireHistory}),H=fg({checkout:X.checkout,session:Y,binding:X.questionBinding,request:X.questionRequest});return G.subscribe((I)=>{if(I===void 0)Y?.stop();else K?.invalidateRepository(I)}),G.onBindingInstalled((I)=>K?.installRepository(I)),K?.installCurrentRepositories(),G.start(),{origin:U,launchUrl:`${U}${dT}#${Y.bootstrap}`,stop:T,refreshAuthority:G.refresh}}catch{throw await T(),Error("Local app host could not start")}}function dg(X){if(!X.startsWith("/")||X.startsWith("//")||/[#\\]/.test(X))return null;try{decodeURIComponent(X);let J=decodeURIComponent(X.split("?")[0]);if(/[\u0000-\u0020\u007f?#\\%]/.test(J)||J.split("/").some((Q)=>Q==="."||Q===".."))return null;return J}catch{return null}}function D1(X){let J=X.headers.authorization;return typeof J==="string"&&/^Bearer [A-Za-z0-9_-]+$/.test(J)?J.slice(7):""}async function rW0(X){if(X.headers["content-type"]!=="application/json")throw Error("Invalid request");let J=0,Q=[];for await(let G of X){let Y=Buffer.from(G);if(J+=Y.length,J>iW0)throw Error("Invalid request");Q.push(Y)}let Z=JSON.parse(Buffer.concat(Q).toString("utf8"));if(!Z||typeof Z!=="object"||Array.isArray(Z)||Object.keys(Z).length!==1||!("bootstrap"in Z)||typeof Z.bootstrap!=="string")throw Error("Invalid request");return Z.bootstrap}function Z6(X,J,Q){if(X.destroyed||X.writableEnded)return;X.writeHead(J,{"Content-Type":"application/json; charset=utf-8"}),X.end(JSON.stringify(Q))}async function oW0(X,J){try{let Q=await mg(X);if(!(await ug(Q)).isDirectory())throw Error("Invalid root");let Z=new Map;for(let G of J){if(dg(G.pathname)!==G.pathname||Z.has(G.pathname)||G.pathname==="/_os"||G.pathname.startsWith("/_os/")||G.pathname==="/api"||G.pathname.startsWith("/api/")||pg(G.relativePath)||!G.contentType||/[\r\n]/.test(G.contentType))throw Error("Invalid asset");let Y=await mg(dW0(Q,G.relativePath)),V=lW0(Q,Y);if(!V||V===".."||V.startsWith(`..${nW0}`)||pg(V))throw Error("Invalid asset");let K=await ug(Y);if(!K.isFile())throw Error("Invalid asset");let H=await pW0(Y,lT.O_RDONLY|lT.O_NOFOLLOW|lT.O_NONBLOCK);try{let W=await H.stat();if(!W.isFile()||W.dev!==K.dev||W.ino!==K.ino)throw Error("Invalid asset");Z.set(G.pathname,{bytes:await H.readFile(),contentType:G.contentType})}finally{await H.close()}}if(!Z.has("/"))throw Error("Missing interface entry");return Z}catch{throw Error("Local app assets unavailable")}}var tW0=`<!doctype html><meta name="referrer" content="no-referrer"><script>
453
+ `,K='<script src="./os-app-descriptor.js"></script>',H=await mT(Y,"utf8");for(let[z,q]of[[n3(G,"os-app-descriptor.js"),V],[n3(G,"index.html"),`${K}${H.replaceAll(K,"")}`]]){let B=n3(G,`.os-build-${wW0()}`);try{await EW0(B,q,{flag:"wx",mode:384}),await SW0(B,z)}finally{await CW0(B).catch((M)=>{if(M.code!=="ENOENT")throw M})}}let W=[];async function U(z,q,B){for(let M of(await RW0(z)).sort()){let L=n3(z,M),T=await s3(L);if(!_J(G,T))throw Error();let O=await EY(T),I=q?`${q}/${M}`:M,j=fT(G,T).split(_T).join("/");if(!WU(I)||!WU(j))continue;if(O.isDirectory()){if(B.includes(T))throw Error();await U(T,I,[...B,T])}else if(O.isFile()){let N=Dg(I);if(N&&Dg(j))W.push({pathname:I==="index.html"?"/":`/${I}`,relativePath:I,contentType:N})}}}if(await U(G,"",[G]),!W.some((z)=>z.pathname==="/"))throw Error();return X.prepared=Z,{assetRoot:G,assets:W}}catch{throw Error(FW0)}}import{constants as lT}from"node:fs";import{open as pW0,realpath as mg,stat as ug}from"node:fs/promises";import{createServer as cW0}from"node:http";import{isAbsolute as pg,relative as lW0,resolve as dW0,sep as nW0}from"node:path";import{createHash as xW0,randomBytes as mJ,timingSafeEqual as bW0}from"node:crypto";var gW0=60000,bg=600000,hW0=20000;class j5 extends Error{constructor(){super("Local app session is unavailable");this.name="AppSessionDenied"}}class HU extends j5{}class v5 extends Error{constructor(){super("Local app renewal is temporarily unavailable")}}function gg(X){let J=X.now??Date.now,Q=X.schedule??((v,a)=>{let X0=setTimeout(v,a);return X0.unref?.(),()=>clearTimeout(X0)}),Z=X.origin,G=X.authority,Y={appId:G.appId,memberId:G.memberId,workspace:G.workspace},V=X.verifyAuthority;if(!vW0(Z)||Object.values(Y).some((v)=>typeof v!=="string"||!v.trim())||typeof V!=="function"||!Number.isFinite(G.expiresAt)||G.expiresAt<=J())throw new j5;let K=mJ(32).toString("base64url"),H=uJ(K),W=Math.min(J()+gW0,G.expiresAt),U=mJ(32).toString("base64url"),z=new WeakMap,q=new Set,B=new Set,M=G.expiresAt,L=0,T,O,I=!1,j=!1,N=0,A=0,R,S=Q(()=>{if(!T)w()},Math.max(0,W-J()));function $(){if(j)return;j=!0,A++,R?.abort(),S?.(),I=!0,T=void 0,O=void 0,q.clear(),w(),B.clear(),X.onInvalidate?.()}function E(){return{...Y,sessionId:U,expiresAt:L}}function x(v){if(j)throw new j5;if(L===v)return;if(L&&J()>=L)w();L=v,S?.(),S=Q(()=>{if(L===v)w()},Math.max(0,L-J()));for(let a of q)a(L)}function w(){A++;for(let v of B)v()}function C(v){return!!v&&v.appId===Y.appId&&v.memberId===Y.memberId&&v.workspace===Y.workspace&&Number.isFinite(v.expiresAt)&&v.expiresAt>J()}async function D(){let v=N;try{let a=await V();if(v===N){if(a&&Number.isFinite(a.expiresAt)&&a.expiresAt<=J()&&a.appId===Y.appId&&a.memberId===Y.memberId&&a.workspace===Y.workspace)throw M=Math.min(M,a.expiresAt),x(Math.min(L,M)),new v5;if(!C(a))throw new j5;M=Math.min(M,a.expiresAt)}}catch(a){if(v===N){if(!(a instanceof v5))$();throw new j5}}if(j||J()>=M)throw new j5}function g(){if(j||!T)throw new j5;if(J()>=L||J()>=M)throw w(),new j5}function f(v){if(g(),v.origin!==Z||!pT(v.credential,T))throw new j5}function P(v){if(g(),z.get(v)!==A)f(v)}async function m(v){return P(v),z.set(v,A),await D(),x(Math.min(L,M)),P(v),E()}return{bootstrap:K,async exchange(v){if(!T&&J()>=W)throw $(),new j5;if(j||I||v.origin!==Z||!pT(v.bootstrap,H))throw new j5;if(I=!0,await D(),j||J()>=W)throw $(),new j5;let a=mJ(32).toString("base64url"),X0=mJ(32).toString("base64url");return T=uJ(a),O=uJ(X0),N++,x(Math.min(J()+bg,M)),{credential:a,renewalCredential:X0,context:E()}},authorize:m,assertCurrent:P,onDeadlineChange(v){return q.add(v),()=>{q.delete(v)}},onAccessUnavailable(v){return B.add(v),()=>{B.delete(v)}},async renew(v){if(j||!O)throw new j5;if(v.origin!==Z)throw new j5;if(!pT(v.credential,O)||R)throw new HU;let a=new AbortController;R=a;let X0=N,z0=Q(()=>a.abort(),hW0);try{let G0=await new Promise((t,U0)=>{let k=()=>U0(new v5);a.signal.addEventListener("abort",k,{once:!0}),Promise.resolve().then(()=>X.renewAuthority?.(a.signal)??null).then(t,U0).finally(()=>a.signal.removeEventListener("abort",k))});if(a.signal.aborted||X0!==N||j)throw new j5;if(G0&&G0.appId===Y.appId&&G0.memberId===Y.memberId&&G0.workspace===Y.workspace&&Number.isFinite(G0.expiresAt)&&G0.expiresAt<=J())throw new v5;if(!C(G0))throw new j5;let e=mJ(32).toString("base64url"),s=mJ(32).toString("base64url");return M=G0.expiresAt,T=uJ(e),O=uJ(s),N++,x(Math.min(J()+bg,M)),{credential:e,renewalCredential:s,context:E()}}catch(G0){if(G0 instanceof v5&&!j&&X0===N)throw new v5;if(X0===N)$();throw new j5}finally{if(z0(),R===a)R=void 0}},async verifyCurrent(){if(!T||j||J()>=L){if(!j)w();throw new j5}if(await D(),x(Math.min(L,M)),j||J()>=L)throw new j5;return E()},async signOut(v){f(v),await D(),f(v),$()},stop:$}}function uJ(X){return xW0("sha256").update(X).digest()}function pT(X,J){return typeof X==="string"&&bW0(uJ(X),J)}function vW0(X){try{let J=new URL(X);return J.protocol==="http:"&&J.hostname==="127.0.0.1"&&Boolean(J.port)&&J.port!=="0"&&J.origin===X}catch{return!1}}import{isDeepStrictEqual as fW0}from"node:util";import{join as _W0}from"node:path";class CY extends Error{reason;constructor(X){super(X);this.reason=X}}function hg(X){let{checkout:J,session:Q,runtime:Z}=X,G={...structuredClone(J.declaration),repositories:new Set(J.declaration.repositories)},Y=structuredClone(J.prepared?.descriptor.routines??[]),V=!1,K=new Set,H=new Set,W=new Set,U=($)=>{throw new CY($)},z=()=>{for(let $ of K)$.abort();for(let $ of W)$.destroy()},q=Q.onAccessUnavailable(z),B=()=>{V=!0,z()},M=()=>{if(!fW0(G,{...J.declaration,repositories:new Set(J.declaration.repositories)}))Q.stop(),U("authority_unavailable")},L=($)=>{if(V)U("authority_unavailable");if(Q.assertCurrent($),M(),V)U("authority_unavailable")},T=($,E)=>({status:200,value:E,isCurrent(){try{return L($),!0}catch{return!1}}}),O=async($,E=!1)=>{if(V)U("authority_unavailable");let x=await Q.authorize($);if(E)await Z?.assertRetainedAccess?.();if(Q.assertCurrent($),E)M();if(V)U("authority_unavailable");return x};async function I($,E,x=!1,w){let C=w??await O($,!0);return sH(C.workspace,async(D,g)=>{if(D.routine!==E||D.starter.kind!=="member"||D.starter.id!==C.memberId)U("authority_unavailable");if(!x){L($);return}await O($,!0);let f=Z??U("authority_unavailable"),P=Object.keys(g).length?g:JSON.parse(await O7(_W0(t8(C.workspace,f.execution).runs,D.id,"execution.json")));await f.authorize(E,P),await O($,!0)},Z?.execution)}async function j($,E){await O($);let x=Y.find((D)=>D.id===E);if(!x)U("execution_unavailable");let w={...structuredClone(x),connections:x.connections.map((D)=>({...D,available:!1})),readiness:{state:"unavailable",reason:"capability_unavailable",message:"Routine capability unavailable."}},C=await Sx(J,E);if(await O($),!C)w.readiness={state:"unavailable",reason:"definition_invalid",message:"Prepare the current routine definition before starting."};try{let D=await Z?.connections(E);if(w.connections=w.connections.map((g)=>({...g,available:D?.[g.id]===!0})),C&&Z){if(await Z.authorize(E),J.prepared?.definitions.get(E)?.contract.access.ai===!0)await bJ({environment:Z.execution?.environment}).readiness();w.readiness={state:"ready",placement:"local"}}}catch{}return await O($),w}async function N($,E,x){let w=await O($);if(!Z||K.size>=4)U("execution_unavailable");let C=new AbortController;K.add(C);let D=!1;try{if((await j($,E)).readiness.state!=="ready")U("execution_unavailable");let g=J.prepared.definitions.get(E);try{y8(g.contract.input,x===void 0?g.contract.inputDefault:x)}catch{U("invalid_input")}await O($);let f=g.source.version,P=!1,v=await new Promise((a,X0)=>{let z0=(Z.execute??XU)(E,x,{...Z.execution,cwd:J.worktreeRoot,signal:C.signal,interactive:!1,definition:g,host:{workspace:w.workspace,memberId:w.memberId,sourceVersion:f,async assertCurrent(){if(await O($),V||C.signal.aborted)U("authority_unavailable")}},progress(G0){if(!P)P=!0,a(G0)}});D=!0,H.add(z0),z0.then((G0)=>{if(!P)G0.summary?a(G0.summary):X0(new CY("execution_unavailable"))},X0).finally(()=>{H.delete(z0),K.delete(C)})}).catch((a)=>{if(a instanceof CY||a instanceof V5||a instanceof v5)throw a;return U("execution_unavailable")});return await O($),v}finally{if(!D)K.delete(C)}}async function A($,E,x){let w=E.match(/^\/_os\/app\/routines\/([a-z0-9]+(?:-[a-z0-9]+)*)\/(describe|runs)(?:\/([0-9a-f-]+)(?:\/(publish|steps)\/?([a-z0-9-]+)?)?)?$/);if(!w)return null;let[,C,D,g,f,P]=w,m=D==="runs"&&$.method==="GET";try{if(m)M();if(!J.declaration.routines.includes(C))return{status:404,value:{error:"execution_unavailable"}};if($.url?.includes("?"))U("invalid_input");let v=await O(x,m);if(D==="describe"&&!g&&$.method==="GET")return R($),{status:200,value:await j(x,C)};if(D!=="runs")U("invalid_input");if(!g&&$.method==="POST"){let G0=await S($);return{status:200,value:await N(x,C,G0)}}R($);let a=await I(x,C,f==="publish",m?v:void 0);if(!g&&$.method==="GET"){let G0=await a.list(C,v.memberId);return T(x,G0)}if(!g)U("invalid_input");let X0=await a.get(C,g);if(f==="publish"&&!P&&$.method==="POST"){let G0=await X0.current();if(G0.status!=="succeeded"||!G0.publication)U("invalid_input");if(G0.publication.state!=="not_needed"){let e=Z?.publicationRequest??Z?.execution?.request;if(!e)U("execution_unavailable");let s=(Z.publish??PT)(J.worktreeRoot,g,{...Z.execution,report(){},request:async(t,U0)=>{if(t===`/api/cli/local-routines/runs/${g}/publication`&&U0?.method==="DELETE")return e(t,U0);return await X0.current(),await e(t,U0)}});H.add(s);try{await s}catch{await X0.current()}finally{H.delete(s)}}return{status:200,value:await X0.current()}}if($.method!=="GET")U("invalid_input");let z0=f==="steps"&&P?await X0.step(P):!f?await X0.current():U("invalid_input");return T(x,z0)}catch(v){if(v instanceof V5&&v.kind==="unavailable"||v instanceof v5)return{status:503,value:{error:"execution_unavailable"}};let a=v instanceof CY?v.reason:"authority_unavailable";return{status:a==="invalid_input"?400:a==="execution_unavailable"?503:403,value:{error:a}}}}function R($){if($.headers["transfer-encoding"]!==void 0||$.headers["content-length"]!==void 0&&$.headers["content-length"]!=="0")U("invalid_input")}async function S($){let E=0,x=[];W.add($);try{for await(let w of $){let C=Buffer.from(w);if((E+=C.length)>262176)U("invalid_input");x.push(C)}try{let w=JSON.parse(new TextDecoder("utf-8",{fatal:!0}).decode(Buffer.concat(x)));if(!w||typeof w!=="object"||Array.isArray(w)||!["","input"].includes(Object.keys(w).join(",")))U("invalid_input");return w.input}catch{return U("invalid_input")}}finally{W.delete($)}}return{handle:A,invalidate:B,async stop(){B(),q(),await Promise.allSettled([...H])}}}f7();function vg(X){let J=new AbortController,Q=new Map,Z=new Set,G=new Map,Y=new Map,V=X.session.onAccessUnavailable(z),K=!1,H=!1,W=X.session.onDeadlineChange((I)=>{if(K||I<=(X.now??Date.now)())return;H=!1,L()}),U=(I)=>{let j=I.then((N)=>N.close(),()=>{});Z.add(j),j.then(()=>Z.delete(j),()=>{})};function z(){H=!0,J.abort(),J=new AbortController;for(let I of Q.values())U(I.owner);Q.clear();for(let I of Y.values())I.invalidate();Y.clear()}function q(){K=!0,z(),J.abort(),V(),W()}function B(I){G.set(I,(G.get(I)??0)+1);let j=Q.get(I);if(Q.delete(I),j)U(j.owner);Y.get(I)?.invalidate(),Y.delete(I)}function M(I){if(K||H)return;let j=X.binding(I);if(!j)return;let N=Z7(j,I);if(!X.verifyBinding(N))return;let A=Q.get(I);if(A&&o3(A.binding,N)&&t3(A.binding,N))return;B(I);let R=J,S=G.get(I),$=()=>!R.signal.aborted&&S===G.get(I)&&X.verifyBinding(N),E=Promise.resolve().then(()=>{if(!$())throw new j5;return(X.openIndex??tW)({target:{...N.target,dataRoots:[...N.target.dataRoots]},checkout:X.checkout.worktreeRoot,sourceVersion:N.sourceVersion})}),x=E.then(async(w)=>{if(!$())throw new j5;if(await w.collections.list(),!$())throw new j5;return w});Q.set(I,{binding:N,owner:E,ready:x}),x.catch(()=>{U(E)})}function L(){for(let I of X.checkout.declaration.repositories)M(I)}async function T(){q(),await Promise.all(Z)}async function O(I,j){let N=J;try{if(I.method!=="POST")return{status:405,value:{error:{code:"invalid_query"}}};if(I.url!=="/_os/app/data"||I.headers["content-type"]!=="application/json")throw new Y0("invalid_query");if(await X.session.authorize(j),N.signal.aborted)throw new j5;let A=V1(await mW0(I,N.signal));if(await X.session.authorize(j),!X.checkout.declaration.repositories.includes(A.repository))throw new Y0("access_denied");if(A.operation==="changes.validate"||A.operation==="changes.publish")throw new Y0("invalid_change",!1,"unapplied");let R;try{let C=X.binding(A.repository);if(!C)throw Error();R=Z7(C,A.repository)}catch{throw new Y0("access_denied")}let S=G.get(A.repository)??0,$=()=>{if(X.session.assertCurrent(j),N.signal.aborted||S!==(G.get(A.repository)??0)||!X.verifyBinding(R))throw new j5};if($(),A.operation==="history.list"||A.operation==="history.at"||A.operation==="history.changes"){let C=Y.get(A.repository);if(!C)C=QH(X.acquireHistory??(async()=>{throw new Y0("unavailable",!0)})),Y.set(A.repository,C);let D=await C.read(R,A.operation==="history.list"?{operation:"list",options:A.options??{}}:A.operation==="history.changes"?{operation:"changes",options:A.options}:{operation:"at",options:{instant:A.instant}});return await X.session.authorize(j),$(),{status:200,value:D,isCurrent:()=>{try{return $(),!0}catch{return!1}}}}let E=Q.get(A.repository);if(!E||!o3(E.binding,R)||!t3(E.binding,R))throw new Y0("unavailable",!0);let x=await E.ready;$();let w=A.operation==="collections.list"?await x.collections.list():A.operation==="collections.schema"?await x.collections.schema(A.name):A.operation==="records.search"?await x.records.search(A.query,A.options):A.operation==="records.read"?await x.records.read(A.refs):await x.records.select(A.query);return await X.session.authorize(j),$(),{status:200,value:w,isCurrent:()=>{try{return $(),!0}catch{return!1}}}}catch(A){let R=N.signal.aborted||A instanceof j5?new Y0("access_denied"):A instanceof Y0?A:A instanceof A0?new Y0("invalid_query"):A instanceof n9?new Y0("capacity",!0):new Y0("unavailable",!0);return{status:R.code==="access_denied"?403:R.code==="request_too_large"?413:R.code==="capacity"?429:R.code==="unavailable"?503:400,value:{error:{code:R.code,...R.retryable?{retryable:!0}:{},...R.effect?{effect:R.effect}:{}}}}}}return{handle:O,installRepository:M,installCurrentRepositories:L,invalidate:q,invalidateRepository:B,stop:T}}function mW0(X,J){return new Promise((Q,Z)=>{let G=[],Y=0,V=()=>{clearTimeout(W),J.removeEventListener("abort",H),X.removeListener("data",U),X.removeListener("end",z),X.removeListener("error",K),X.removeListener("aborted",H)},K=(q)=>{V(),X.resume(),Z(q)},H=()=>K(new j5),W=setTimeout(()=>K(new Y0("invalid_query")),5000),U=(q)=>{if(Y+=q.length,Y>LL)K(new Y0("request_too_large"));else G.push(q)},z=()=>{V();try{Q(JSON.parse(new TextDecoder("utf-8",{fatal:!0}).decode(Buffer.concat(G))))}catch{Z(new Y0("invalid_query"))}};if(X.on("data",U).once("end",z).once("error",K).once("aborted",H),J.addEventListener("abort",H,{once:!0}),J.aborted)H()})}function wY(X){let J=X.now??Date.now,Q=X.schedule??((R,S)=>{let $=setTimeout(R,S);return $.unref?.(),()=>clearTimeout($)}),Z={...X.authority},G=[...X.bindings.keys()],Y=new Map([...X.bindings].map(([R,S])=>[R,Z7(S,R)])),V=new Map(Y),K=new Set,H=new Set,W=!1,U=!1,z,q,B,M=0,L;function T(){if(W)return;W=!0,M++,z?.(),B?.abort(),Y.clear();for(let R of K)R()}function O(){return W||J()>=Z.expiresAt?null:{...Z}}function I(R,S){Y.delete(R);for(let $ of K)$(R);if(!W&&S){Y.set(R,S);for(let $ of H)$(R)}}function j(){if(!O())return Promise.resolve();if(L)return L.then(()=>{},()=>{});if(q)return q;B=new AbortController;let R=B,S=M,$=()=>S===M&&!R.signal.aborted&&!!O(),E=Q(()=>R.abort(),20000);R.signal.addEventListener("abort",E,{once:!0});let x=(D)=>new Promise((g)=>{let f=(m)=>{R.signal.removeEventListener("abort",P),g(m)},P=()=>f({kind:"unavailable"});if(R.signal.addEventListener("abort",P,{once:!0}),R.signal.aborted)P();D.then(f,()=>f({kind:"unavailable"}))}),w=async()=>{let D=await x(Promise.resolve().then(()=>X.observeAuthority(R.signal)));if($()&&(D.kind==="denied"||D.kind==="invalid"||D.kind==="authorized"&&(D.value.appId!==Z.appId||D.value.memberId!==Z.memberId||D.value.workspace!==Z.workspace||!Number.isFinite(D.value.expiresAt))))T();return D},C=async(D)=>{let g=await x(Promise.resolve().then(()=>X.observeRepositoryBinding(D,R.signal)));if($()){if(g.kind==="denied"||g.kind==="invalid")T();if(g.kind==="authorized")try{let f=Z7(g.value,D),P=Y.get(D);if(!t3(V.get(D),f))T();else if(P&&!o3(P,f))I(D)}catch{return T(),[D,{kind:"invalid"}]}}return[D,g]};return q=(async()=>{let[D,g]=await Promise.all([w(),Promise.all(G.map(C))]);if(!$())return;if(D.kind!=="authorized"||g.some(([,f])=>f.kind!=="authorized"))return;Z.expiresAt=Math.min(Z.expiresAt,D.value.expiresAt);for(let[f,P]of g){if(P.kind!=="authorized")continue;let m;try{m=Z7(P.value,f)}catch{T();return}let v=Y.get(f);if(!v||!o3(v,m)||!t3(v,m))I(f,m)}})().finally(()=>{if(E(),R.signal.removeEventListener("abort",E),B===R)B=void 0;if(S===M)q=void 0}),q}function N(){if(!O())return;let R=M;j().finally(()=>{if(!W&&R===M)z=Q(N,30000)})}function A(R){if(W||L||R.aborted||!X.renewAuthority)return Promise.resolve(null);M++,B?.abort(),q=void 0;let S=M,$=new AbortController;B=$;let E=()=>$.abort();R.addEventListener("abort",E,{once:!0});let x=Q(E,20000);return $.signal.addEventListener("abort",x,{once:!0}),L=(async()=>{try{let w=await new Promise((g,f)=>{let P=()=>f(new v5);if($.signal.addEventListener("abort",P,{once:!0}),$.signal.aborted)P();Promise.resolve().then(()=>X.renewAuthority($.signal)).then(g,f).finally(()=>$.signal.removeEventListener("abort",P))});if(W||S!==M||$.signal.aborted)throw Error();let C=w.authority;if(C.appId!==Z.appId||C.memberId!==Z.memberId||C.workspace!==Z.workspace||!Number.isFinite(C.expiresAt)||w.bindings.size!==G.length)throw Error();let D=new Map;for(let g of G){let f=Z7(w.bindings.get(g),g),P=V.get(g);if(!t3(P,f))throw Error();D.set(g,f)}if(C.expiresAt<=J())throw new v5;w.install(),Z.expiresAt=C.expiresAt;for(let[g,f]of D){let P=Y.get(g);if(!P||!o3(P,f))I(g,f)}return O()}catch(w){if(w instanceof v5&&S===M&&!W)throw new v5;if(S===M)T();return null}finally{if(x(),$.signal.removeEventListener("abort",x),R.removeEventListener("abort",E),B===$)B=void 0;if(L=void 0,U&&!W&&S===M)z?.(),z=Q(N,30000)}})(),L}return{current:O,retained(){return W?null:{...Z}},binding(R){if(!O())return null;let S=Y.get(R);return S?Z7(S,R):null},matches(R){if(!O())return!1;let S=Y.get(R.target.repository);return!!S&&o3(S,R)&&t3(S,R)},subscribe(R){return K.add(R),()=>K.delete(R)},onBindingInstalled(R){return H.add(R),()=>H.delete(R)},start(){if(U||!O())return;U=!0,z=Q(N,30000)},refresh:j,renew:A,stop:T}}import{isDeepStrictEqual as cT}from"node:util";function fg(X){let J=new Set,Q=!1,Z=()=>{Q=!0;for(let Y of J)Y.abort()};async function G(Y,V){let K=new AbortController,H=setTimeout(()=>K.abort(),30000);H.unref?.(),J.add(K);let W=()=>{if(Q)throw new j5;if(X.session.assertCurrent(V),Q)throw new j5;if(X.binding&&!cT(X.binding.declaration,X.checkout.declaration))throw new j5;if(K.signal.aborted)throw new i5(503,"unavailable")};try{let U=await X.session.authorize(V);if(W(),Y.method!=="POST"||Y.url!=="/_os/app/inbox"||Y.headers["content-type"]!=="application/json")throw new i5(400,"invalid_input");let z=0,q=[],B=()=>Y.destroy();K.signal.addEventListener("abort",B,{once:!0});try{for await(let O of Y){let I=Buffer.from(O);if(z+=I.length,z>FU)throw new i5(400,"invalid_input");q.push(I)}}finally{K.signal.removeEventListener("abort",B)}let M;try{M=f1(JSON.parse(new TextDecoder("utf-8",{fatal:!0}).decode(Buffer.concat(q))))}catch{throw new i5(400,"invalid_input")}if(W(),!nY(M.operation))throw new i5(403,"access_denied");let L=X.binding;if(!L||!X.request)throw new i5(503,"unavailable");if(L.appId!==U.appId||L.workspace!==U.workspace||L.memberId!==U.memberId||!cT(L.declaration,X.checkout.declaration))throw new i5(401,"authority_unavailable");if(M.operation==="questions.list"&&M.input.routines.some((O)=>!L.routines.includes(O)))throw new i5(403,"access_denied");W();let T=_1(M.operation,await X.request(M.operation,M.input,K.signal));if(W(),M.operation==="questions.list"&&T.questions.some((O)=>!M.input.routines.includes(O.routine)||O.inboxUrl!==`https://${L.workspace}.oddington.ai/inbox/${O.itemId}`))throw new i5(503,"unavailable");return{status:200,value:T,isCurrent:()=>{try{return X.session.assertCurrent(V),!Q&&cT(L.declaration,X.checkout.declaration)}catch{return!1}}}}catch(U){try{W()}catch(q){U=q instanceof i5?q:new i5(401,"authority_unavailable")}let z=U instanceof i5?U:new i5(503,"unavailable");return{status:z.status,value:{error:z.reason}}}finally{clearTimeout(H),J.delete(K)}}return{handle:G,invalidate:Z}}y5();import{Readable as uW0}from"node:stream";function _g(X){let J=new Set,Q=!1,Z=()=>{for(let V of J)V.abort()};X.session.onAccessUnavailable(Z);let G=()=>{Q=!0,Z()};async function Y(V,K,H){let W=new AbortController,U=()=>W.abort(),z=()=>{if(X.session.assertCurrent(H),Q)throw new _("access_denied",403);if(W.signal.aborted)throw new _("unavailable",503,!0)};try{let q=await X.session.authorize(H);if(z(),J.size>=d1)throw new _("capacity",429,!0);if(J.add(W),V.once("aborted",U),K.once("close",U),V.setTimeout(30000,U),!X.transport)throw new _("unavailable",503,!0);let B=V.url.slice(14);if(B.includes("?")||B.includes("#"))throw new _("invalid_input",400);let M={};for(let j of["content-type","x-os-file","x-os-enrichment"]){let N=V.headers[j];if(typeof N==="string")M[j]=N}let L=Q3(_3(q.workspace,X.state),{workspace:q.workspace,member:{async current(){z();let j=await X.transport.current(W.signal);if(z(),j.creator.kind!=="member"||j.creator.id!==q.memberId)throw new _("access_denied",403);return j},async request(j,N){z();let A=N?.signal?AbortSignal.any([W.signal,N.signal]):W.signal,R=await X.transport.request(j,{...N,signal:A});try{return z(),R}catch(S){throw R.body?.cancel().catch(()=>{}),S}}}}),T=uW0.toWeb(V,{strategy:{highWaterMark:65536,size:(j)=>j.byteLength}}),O=await L.stream({suffix:B,method:V.method??"",headers:M},T,W.signal);try{z()}catch(j){throw O.body?.cancel().catch(()=>{}),j}let I=new Headers;for(let j of["content-type","content-length"]){let N=O.headers.get(j);if(N!==null)I.set(j,N)}await IY(K,new Response(O.body,{status:O.status,headers:I}),W.signal)}catch(q){let B="unavailable",M=503;try{if(X.session.assertCurrent(H),Q)throw Error()}catch{B="access_denied",M=403}if(M!==403&&q instanceof _)B=q.code,M=q.status;if(K.headersSent)K.destroy();else K.writeHead(M,{"content-type":"application/json"}),K.end(JSON.stringify({error:{code:B}}))}finally{W.abort(),J.delete(W),V.removeListener("aborted",U),K.removeListener("close",U),V.setTimeout(0),V.resume()}}return{handle:Y,invalidate:G}}var dT="/_os/app/bootstrap",sW0="/_os/app/context",aW0="/_os/app/sign-out",cg="/_os/app/renew",iW0=4096;async function lg(X){let J=await oW0(X.assetRoot,X.assets),Q=new Map,Z=X.authority;if(!X.lifecycle)try{for(let I of X.checkout?.declaration.repositories??[]){let j=await X.repositoryBinding?.(I);if(j)Q.set(I,j)}let O=await X.verifyAuthority?.();if(!O||O.appId!==X.authority.appId||O.memberId!==X.authority.memberId||O.workspace!==X.authority.workspace||!Number.isFinite(O.expiresAt)||O.expiresAt<=(X.now??Date.now)())throw Error();Z={...Z,expiresAt:Math.min(Z.expiresAt,O.expiresAt)}}catch{throw Error("Local app host could not start")}let G=X.lifecycle??wY({authority:Z,bindings:Q,now:X.now,observeAuthority:async()=>{let O=await X.verifyAuthority?.();return O?{kind:"authorized",value:O}:{kind:"denied"}},observeRepositoryBinding:async(O)=>{let I=await X.repositoryBinding?.(O);return I?{kind:"authorized",value:I}:{kind:"denied"}},renewAuthority:X.renewAuthority?async(O)=>{let I=await X.renewAuthority(O);if(!I)throw Error();let j=new Map;for(let N of Q.keys()){let A=await X.repositoryBinding?.(N);if(!A)throw Error();j.set(N,A)}return{authority:I,bindings:j,install(){}}}:void 0}),Y,V,K,H,W,U="",z=!1,q=cW0((O,I)=>{M(O,I).catch(()=>Z6(I,403,{error:"Local app request denied"}))}),B=new Set;q.on("connection",(O)=>{B.add(O),O.once("close",()=>B.delete(O))}),q.requestTimeout=0,q.headersTimeout=5000,q.on("clientError",(O,I)=>I.destroy());async function M(O,I){if(I.setHeader("Cache-Control","no-store"),I.setHeader("Referrer-Policy","no-referrer"),I.setHeader("X-Content-Type-Options","nosniff"),I.setHeader("Content-Security-Policy","frame-ancestors 'none'"),z||!Y||O.headers.host!==U.slice(7))return Z6(I,403,{error:"Local app request denied"});let j=dg(O.url??"");if(!j)return Z6(I,400,{error:"Invalid local app request"});let N=O.method;if(j!=="/_os/app/files"&&!j.startsWith("/_os/app/files/")&&!O.complete){let R=setTimeout(()=>O.destroy(),5000);R.unref?.();let S=()=>clearTimeout(R);O.once("end",S),O.once("close",S)}if(N!=="GET"&&N!=="HEAD"||O.headers.origin!==void 0){if(O.headers.origin!==U)return Z6(I,403,{error:"Local app request denied"})}if(j===dT&&N==="GET"){I.setHeader("Content-Security-Policy","default-src 'none'; script-src 'unsafe-inline'; connect-src 'self'; base-uri 'none'; frame-ancestors 'none'"),I.writeHead(200,{"Content-Type":"text/html; charset=utf-8"}),I.end(tW0);return}if(j===dT&&N==="POST"){let R=await rW0(O);return Z6(I,200,await Y.exchange({origin:U,bootstrap:R}))}if(j===sW0&&N==="GET")return Z6(I,200,await Y.authorize({origin:U,credential:D1(O)}));if(j===cg&&N==="POST"){if(O.url!==cg||O.headers["transfer-encoding"]!==void 0||O.headers["content-length"]!==void 0&&O.headers["content-length"]!=="0")return Z6(I,400,{error:"Invalid local app request"});try{return Z6(I,200,await Y.renew({origin:U,credential:D1(O)}))}catch(R){if(R instanceof HU)return Z6(I,403,{error:"renewal_conflict"});if(R instanceof v5)return Z6(I,503,{error:"renewal_unavailable"});throw R}}if(j===aW0&&N==="POST"){await Y.signOut({origin:U,credential:D1(O)});try{await Promise.all([V?.stop(),K?.stop()])}catch{return Z6(I,503,{error:"execution_unavailable"})}return Z6(I,200,{signedOut:!0})}if(j==="/_os/app/data"){if(!K)return Z6(I,503,{error:{code:"unavailable",retryable:!0}});let R=await K.handle(O,{origin:U,credential:D1(O)});if(R.isCurrent?.()===!1)return Z6(I,403,{error:{code:"access_denied"}});return Z6(I,R.status,R.value)}if(j==="/_os/app/files"||j.startsWith("/_os/app/files/")){if(!W)return Z6(I,503,{error:{code:"unavailable"}});await W.handle(O,I,{origin:U,credential:D1(O)});return}if(j==="/_os/app/inbox"){if(!H)return Z6(I,503,{error:"unavailable"});let R=await H.handle(O,{origin:U,credential:D1(O)});if(R.isCurrent?.()===!1)return Z6(I,401,{error:"authority_unavailable"});return Z6(I,R.status,R.value)}if(j.startsWith("/_os/app/routines/")){let R=await V?.handle(O,j,{origin:U,credential:D1(O)});if(R?.isCurrent?.()===!1)return Z6(I,403,{error:"authority_unavailable"});if(R)return Z6(I,R.status,R.value)}if(j==="/_os"||j.startsWith("/_os/")||j==="/api"||j.startsWith("/api/"))return Z6(I,404,{error:"Local app operation unavailable"});let A=J.get(j);if(!A)return Z6(I,404,{error:"Local app asset unavailable"});if(N!=="GET"&&N!=="HEAD")return Z6(I,405,{error:"Local app request denied"});I.writeHead(200,{"Content-Type":A.contentType,"Content-Length":A.bytes.length}),I.end(N==="HEAD"?void 0:A.bytes)}let L;function T(){if(z=!0,G.stop(),Y?.stop(),H?.invalidate(),W?.invalidate(),L)return L;let O=new Promise((I)=>{q.close(()=>I()),q.closeAllConnections();for(let j of B)j.destroy()});return L??=Promise.all([O,V?.stop(),K?.stop()]).then(()=>{}),L.catch(()=>{L=void 0}),L}try{await new Promise((I,j)=>{q.once("error",j),q.listen(0,"127.0.0.1",()=>{q.removeListener("error",j),I()})});let O=q.address();if(!O||typeof O==="string")throw Error("Invalid app listener");if(U=`http://127.0.0.1:${O.port}`,Y=gg({origin:U,authority:Z,verifyAuthority:async()=>G.retained(),now:X.now,schedule:X.schedule,renewAuthority:(I)=>G.renew(I),onInvalidate:()=>{G.stop(),V?.invalidate(),K?.invalidate(),H?.invalidate(),W?.invalidate()}}),W=_g({session:Y,transport:X.filesTransport,state:X.filesState}),X.checkout&&X.checkout.declaration.name===X.authority.appId)V=hg({checkout:X.checkout,session:Y,runtime:X.routineRuntime}),K=vg({checkout:X.checkout,session:Y,now:X.now,binding:(I)=>G.binding(I),verifyBinding:(I)=>G.matches(I),openIndex:X.openDataIndex,acquireHistory:X.acquireHistory}),H=fg({checkout:X.checkout,session:Y,binding:X.questionBinding,request:X.questionRequest});return G.subscribe((I)=>{if(I===void 0)Y?.stop();else K?.invalidateRepository(I)}),G.onBindingInstalled((I)=>K?.installRepository(I)),K?.installCurrentRepositories(),G.start(),{origin:U,launchUrl:`${U}${dT}#${Y.bootstrap}`,stop:T,refreshAuthority:G.refresh}}catch{throw await T(),Error("Local app host could not start")}}function dg(X){if(!X.startsWith("/")||X.startsWith("//")||/[#\\]/.test(X))return null;try{decodeURIComponent(X);let J=decodeURIComponent(X.split("?")[0]);if(/[\u0000-\u0020\u007f?#\\%]/.test(J)||J.split("/").some((Q)=>Q==="."||Q===".."))return null;return J}catch{return null}}function D1(X){let J=X.headers.authorization;return typeof J==="string"&&/^Bearer [A-Za-z0-9_-]+$/.test(J)?J.slice(7):""}async function rW0(X){if(X.headers["content-type"]!=="application/json")throw Error("Invalid request");let J=0,Q=[];for await(let G of X){let Y=Buffer.from(G);if(J+=Y.length,J>iW0)throw Error("Invalid request");Q.push(Y)}let Z=JSON.parse(Buffer.concat(Q).toString("utf8"));if(!Z||typeof Z!=="object"||Array.isArray(Z)||Object.keys(Z).length!==1||!("bootstrap"in Z)||typeof Z.bootstrap!=="string")throw Error("Invalid request");return Z.bootstrap}function Z6(X,J,Q){if(X.destroyed||X.writableEnded)return;X.writeHead(J,{"Content-Type":"application/json; charset=utf-8"}),X.end(JSON.stringify(Q))}async function oW0(X,J){try{let Q=await mg(X);if(!(await ug(Q)).isDirectory())throw Error("Invalid root");let Z=new Map;for(let G of J){if(dg(G.pathname)!==G.pathname||Z.has(G.pathname)||G.pathname==="/_os"||G.pathname.startsWith("/_os/")||G.pathname==="/api"||G.pathname.startsWith("/api/")||pg(G.relativePath)||!G.contentType||/[\r\n]/.test(G.contentType))throw Error("Invalid asset");let Y=await mg(dW0(Q,G.relativePath)),V=lW0(Q,Y);if(!V||V===".."||V.startsWith(`..${nW0}`)||pg(V))throw Error("Invalid asset");let K=await ug(Y);if(!K.isFile())throw Error("Invalid asset");let H=await pW0(Y,lT.O_RDONLY|lT.O_NOFOLLOW|lT.O_NONBLOCK);try{let W=await H.stat();if(!W.isFile()||W.dev!==K.dev||W.ino!==K.ino)throw Error("Invalid asset");Z.set(G.pathname,{bytes:await H.readFile(),contentType:G.contentType})}finally{await H.close()}}if(!Z.has("/"))throw Error("Missing interface entry");return Z}catch{throw Error("Local app assets unavailable")}}var tW0=`<!doctype html><meta name="referrer" content="no-referrer"><script>
453
454
  (async () => {
454
455
  const bootstrap = location.hash.slice(1);
455
456
  history.replaceState(null, '', location.pathname);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oddington/cli",
3
- "version": "0.1.53",
3
+ "version": "0.1.54",
4
4
  "description": "OS command-line client",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "type": "module",