@robota-sdk/agent-session 3.1.1 → 3.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +44 -0
- package/dist/index.cjs +1 -1
- package/dist/index.js +1 -1
- package/dist/node.cjs +11 -11
- package/dist/node.d.cts +4 -17
- package/dist/node.d.cts.map +1 -1
- package/dist/node.d.ts +4 -17
- package/dist/node.d.ts.map +1 -1
- package/dist/node.js +9 -9
- package/dist/node.js.map +1 -1
- package/dist/{session-claims-BQGdD3Fe.cjs → session-claims-CVHnnUhA.cjs} +1 -1
- package/dist/{session-claims-D-Azmxq6.js → session-claims-DB4Q00_J.js} +2 -2
- package/dist/{session-claims-D-Azmxq6.js.map → session-claims-DB4Q00_J.js.map} +1 -1
- package/package.json +6 -6
package/dist/node.js
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import{a as e,b as t,c as n,g as r,i,m as a,n as o,r as s,s as c,u as l}from"./session-claims-D-Azmxq6.js";import{ArtifactCorruptError as u,ArtifactLockedError as d,SEALED_ARTIFACT_MAGIC as f,SEALED_ARTIFACT_MAX_OVERHEAD_BYTES as p,createLogger as ee,isArtifactCorruptError as te,isArtifactLockedError as m,isCurrentSealedArtifactBytes as h,isCurrentSealedArtifactLine as ne,isSealedArtifactBytes as g,isSealedArtifactLine as _}from"@robota-sdk/agent-core";import{appendFileSync as re,closeSync as v,constants as y,existsSync as ie,fchmodSync as ae,fstatSync as b,fsyncSync as x,linkSync as oe,lstatSync as S,openSync as C,readFileSync as se,readSync as ce,readdirSync as w,realpathSync as le,renameSync as ue,rmSync as de,rmdirSync as fe,unlinkSync as T,writeFileSync as pe,writeSync as me}from"node:fs";import{basename as he,dirname as E,extname as ge,isAbsolute as _e,join as D,relative as ve,resolve as O,win32 as ye}from"node:path";import*as k from"koffi";import{closeSync as be,existsSync as xe,fstatSync as Se,openSync as Ce,readFileSync as we,readSync as Te,readdirSync as Ee,unlinkSync as De}from"fs";import{join as Oe,resolve as A,sep as ke}from"path";import{OWNER_ONLY_FILE_MODE as j,PROCESS_OWNER_RECORD_NAME as Ae,createProcessMarkers as je,createProcessScopedDirectory as Me,ensureOwnerOnlyDirectory as M,removeDirectoryOnProcessExit as Ne,stageOwnerOnlyFile as Pe,sweepStaleProcessScopedDirectories as Fe,tightenExistingFile as Ie,writeOwnerOnlyFile as Le}from"@robota-sdk/agent-core/node";import{Buffer as N}from"node:buffer";import{createHash as Re,randomBytes as P}from"node:crypto";import{StableFileAuthorityError as ze,createStableRootedFileReader as Be}from"@robota-sdk/agent-file-authority";let F;const Ve=[];function He(){if(F!==void 0)return F;let e=k.load(`kernel32.dll`);Ve.push(e);let t=k.pointer(`RobotaSessionOperationGuardHandle`,k.opaque()),n=k.struct(`RobotaSessionOperationGuardAttributes`,{FileAttributes:`uint32_t`,ReparseTag:`uint32_t`}),r=k.struct(`RobotaSessionOperationGuardStandard`,{AllocationSize:`int64_t`,EndOfFile:`int64_t`,NumberOfLinks:`uint32_t`,DeletePending:`uint8_t`,Directory:`uint8_t`});return F={open:e.func(`CreateFileW`,t,[k.pointer(`char16_t`),`uint32_t`,`uint32_t`,`void *`,`uint32_t`,`uint32_t`,t]),close:e.func(`CloseHandle`,`bool`,[t]),lastError:e.func(`GetLastError`,`uint32_t`,[]),attributes:e.func(`GetFileInformationByHandleEx`,`bool`,[t,`int32_t`,k.out(k.pointer(n)),`uint32_t`]),attributeType:n,standard:e.func(`GetFileInformationByHandleEx`,`bool`,[t,`int32_t`,k.out(k.pointer(r)),`uint32_t`]),standardType:r},F}function Ue(e){let t=He(),n=t.open(e,3221225472,0,null,4,2097280,null);if(n===null||BigInt.asIntN(64,n)===-1n){let e=t.lastError();if(e===32)return;throw Error(`Could not acquire a process operation lock (Windows error ${e}).`)}try{let e={},r={};if(!t.attributes(n,9,e,k.sizeof(t.attributeType))||!t.standard(n,1,r,k.sizeof(t.standardType))||(e.FileAttributes??0)&1024||r.Directory!==0||r.NumberOfLinks!==1)throw Error(`The process operation lock is not a unique regular file.`);let i=!1;return Object.freeze({release:()=>{if(!i&&(i=!0,!t.close(n)))throw Error(`Could not release a process operation lock.`)}})}catch(e){throw t.close(n),e}}const We=/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/u;let Ge;const Ke=[];function qe(){if(Ge===void 0){let e=k.load(process.platform===`darwin`?`/usr/lib/libSystem.B.dylib`:`libc.so.6`);Ke.push(e),Ge=e.func(`int flock(int fd, int operation)`)}return Ge}function Je(e){let t=C(e,y.O_RDWR|y.O_CREAT|(y.O_NOFOLLOW??0),384);try{let n=b(t,{bigint:!0}),r=S(e,{bigint:!0});if(!n.isFile()||n.nlink!==1n||n.dev!==r.dev||n.ino!==r.ino)throw Error(`The process operation lock is not a unique regular file.`);ae(t,384);let i=qe();if(i(t,6)!==0){let e=k.errno();if(e===k.os.errno.EAGAIN||e===k.os.errno.EWOULDBLOCK){v(t);return}throw Error(`Could not acquire a process operation lock (errno ${e}).`)}let a=!1;return Object.freeze({release:()=>{if(!a){a=!0;try{i(t,8)}finally{v(t)}}}})}catch(e){throw v(t),e}}function Ye(e){let t=O(e);return Object.freeze({tryAcquire:e=>{if(!We.test(e))throw Error(`A process operation lock name must be one safe path component.`);let n=D(t,`${e}.guard`);if(process.platform===`win32`)return Ue(n);if(process.platform===`darwin`||process.platform===`linux`)return Je(n);throw Error(`Process operation locking is unsupported on this platform.`)}})}const Xe=`the sealed session file does not open for this session: it is damaged or sealed with other keys`,Ze=/^[0-9a-f]{64}$/;function Qe(e){return typeof e==`string`&&Ze.test(e)}function I(e){return Re(`sha256`).update(e).digest(`hex`)}function $e(e,t){return N.from(e.buffer,e.byteOffset,e.byteLength).equals(t)}function L(e){return{kind:`session-record`,id:e}}function R(e){return N.from(e.buffer,e.byteOffset,e.byteLength).toString(`utf8`)}function et(e){return JSON.stringify({schemaVersion:2,record:e},null,2)}function tt(e,t){let n=et(e),r=N.from(n,`utf8`);return{stored:t===void 0?r:t.sealBytes(r,L(e.id)),text:n}}function nt(e,t,n){if(!g(t))return`plain`;if(!h(t))return`newer-format`;let r;try{r=n.openBytes(t,L(e))}catch(e){if(m(e))throw e;return`does-not-open`}return r.fill(0),`sealed`}function rt(e,t,n){return n.sealBytes(t,L(e))}function it(e){let n;try{n=JSON.parse(e)}catch{return{status:`corrupt`,issues:[{path:``,message:`the session file is not JSON`}]}}let r=t(n);return r.status===`valid`?{status:`valid`,record:r.record}:r.status===`unsupported`?{status:`unsupported`,schemaVersion:r.schemaVersion,...r.cwd===void 0?{}:{cwd:r.cwd}}:{status:`corrupt`,issues:r.issues,...r.cwd===void 0?{}:{cwd:r.cwd}}}function z(e,t){let n=it(t);return n.status!==`valid`||n.record.id===e?n:{status:`corrupt`,issues:[{path:`id`,message:`the record belongs to another session id`}]}}function at(e,t){return z(e,R(t)).status===`valid`}function ot(e){return e===void 0?{kind:`absent`}:g(e)?{kind:`sealed`,bytes:e}:{kind:`plain`,bytes:e}}function B(e){return e.kind===`sealed`||e.kind===`plain`?e.bytes:void 0}var st=class{#e=new Map;#t=new Set;#n=new Set;#r;constructor(e=()=>!1){this.#r=e}get size(){return this.#t.size}state(e){return this.#e.get(e)}hold(e,t){this.#i(e).held=t,this.#t.delete(e),this.#t.add(e);for(let e of this.#t){if(this.#t.size<=32)break;this.#e.get(e)?.held?.kind===`pinned`||this.#r(e)||this.dropHeld(e)}}holdHandoff(e,t){this.#i(e).handoff=t,this.#n.delete(e),this.#n.add(e);for(let e of this.#n){if(this.#n.size<=8)break;this.dropHandoff(e)}}dropHeld(e){this.#t.delete(e),this.#a(e,e=>delete e.held)}dropHandoff(e){this.#n.delete(e),this.#a(e,e=>delete e.handoff)}taint(e){this.#i(e).tainted=!0}untaint(e){this.#a(e,e=>e.tainted=!1)}setPending(e,t){this.#i(e).pendingDigest=t}clearPending(e){this.#a(e,e=>delete e.pendingDigest)}pending(){let e=[];for(let[t,n]of this.#e)n.pendingDigest!==void 0&&e.push([t,n.pendingDigest]);return e}forget(e){this.#t.delete(e),this.#n.delete(e),this.#a(e,e=>{delete e.held,delete e.handoff,delete e.pendingDigest})}#i(e){let t=this.#e.get(e);return t===void 0&&(t={tainted:!1},this.#e.set(e,t)),t}#a(e,t){let n=this.#e.get(e);n!==void 0&&(t(n),n.held===void 0&&n.handoff===void 0&&n.pendingDigest===void 0&&!n.tainted&&this.#e.delete(e))}};const ct=`rsh2.`,lt={owner:!0,unverified:!1},ut=/^[A-Za-z0-9_-]+$/,dt=new TextDecoder(`utf-8`,{fatal:!0});function ft(e,t,n){return`${ct}${n?`owner`:`unverified`}.${e}.${N.from(t,`utf8`).toString(`base64url`)}`}function pt(e){if(typeof e!=`string`||!e.startsWith(ct))return;let[t,n,r,...i]=e.slice(5).split(`.`);if(t!==`owner`&&t!==`unverified`||i.length>0||n===void 0||r===void 0||!Qe(n)||!ut.test(r))return;let a=N.from(r,`base64url`);if(a.toString(`base64url`)===r)try{return{digest:n,text:dt.decode(a),owner:lt[t]}}catch{return}}const mt=`robota-authorship/v1 `,V=N.from(mt,`ascii`),ht=/^[A-Za-z0-9_-]+$/;function gt(e,t){let n=N.from(e.buffer,e.byteOffset,e.byteLength).toString(`base64url`);return N.concat([N.from(`${mt}${n}\n`,`ascii`),t])}function _t(e){let t=N.from(e.buffer,e.byteOffset,e.byteLength);if(t.length<V.length||!t.subarray(0,V.length).equals(V))return{envelope:e,tag:void 0};let n=t.indexOf(10,V.length);if(n<0)return{envelope:e,tag:`malformed`};let r=t.subarray(V.length,n).toString(`latin1`),i=e.subarray(n+1);if(!ht.test(r))return{envelope:i,tag:`malformed`};let a=N.from(r,`base64url`);return a.length!==32||a.toString(`base64url`)!==r?{envelope:i,tag:`malformed`}:{envelope:i,tag:a}}const vt={probe:{writer:!1,takes:!1,holds:!1,taints:!0},hold:{writer:!0,takes:!0,holds:!0,taints:!0},list:{writer:!1,takes:!1,holds:!1,taints:!1},held:{writer:!0,takes:!0,holds:!1,taints:!0},export:{writer:!0,takes:!1,holds:!1,taints:!0},claim:{writer:!0,takes:!0,holds:!0,taints:!0},save:{writer:!0,takes:!1,holds:!1,taints:!1}},yt=Object.freeze({status:`locked`,reason:`no-keys`}),bt=Object.freeze({status:`locked`,reason:`changed`}),xt=Object.freeze({status:`locked`}),St=Object.freeze({status:`missing`});function H(e,t,n,r){return{status:`valid`,record:e.record,authorship:t?`verified`:`unverified`,...n===void 0?{}:{digest:n},...r?{diverged:!0}:{}}}function U(e,t,n){let r;try{r=e.openBytes(n,L(t))}catch(e){return m(e)?e.reason===`no-keys`?{kind:`no-keys`}:{kind:`locked`}:{kind:`does-not-open`}}try{let{envelope:n,tag:i}=_t(r),a=!1;if(i instanceof Uint8Array&&e.verifyAuthorship!==void 0)try{a=e.verifyAuthorship(n,i,L(t))===!0}catch{a=!1}return{kind:`text`,text:R(n),verified:a}}finally{r.fill(0)}}function Ct(e,t,n){let r,i=!1;if(!g(t))r=R(t);else{if(!h(t))return{status:`unsupported`,schemaVersion:void 0};let a=U(n,e,t);if(a.kind===`locked`)return xt;if(a.kind===`no-keys`)return yt;if(a.kind===`does-not-open`)return{status:`corrupt`,issues:[{path:``,message:Xe}]};r=a.text,i=a.verified}let a=z(e,r);return a.status===`valid`?H(a,i,I(t),!1):a}var wt=class{#e;#t;#n;#r;#i;#a;constructor(e,t,n,r,i){this.#e=e,this.#t=t,this.#n=n,this.#r=r,this.#i=i,e.tagAuthorship!==void 0&&e.onUnlock!==void 0&&(this.#a=()=>this.#g(),e.onUnlock(this.#a))}read(e,t,n,r,i){let a=this.guarded(e,t,i);if(a!==void 0)return a;if(t.kind===`absent`){let t=r();return t.status===`valid`?this.#l(e,t,`unverified`,void 0,i,!1):t}let o=B(t);return o===void 0?n:this.decode(e,o,i)}decode(e,t,n){let r,i=!1;if(!g(t))r=R(t);else{if(!h(t))return{status:`unsupported`,schemaVersion:void 0};let n=U(this.#e,e,t);if(n.kind===`locked`)return xt;if(n.kind===`no-keys`)return yt;if(n.kind===`does-not-open`)return{status:`corrupt`,issues:[{path:``,message:Xe}]};r=n.text,i=n.verified}let a=z(e,r);if(a.status!==`valid`)return a;let o=I(t),s=this.#n.state(e),c=i||this.#s(s,s?.held,o)?`owner`:`unverified`;return vt[n].holds&&this.#n.hold(e,{digest:o,text:r,kind:c}),this.#l(e,a,c,o,n,!1)}claimRead(e,t,n,r,i){let a=this.#n.state(e)?.held,o=B(n);return!t&&a!==void 0&&o!==void 0&&I(o)===a.digest?this.#c(e,a,`claim`,!1):this.read(e,n,r,i,`claim`)}beforeClaim(e,t,n){if(this.#n.state(e)?.held?.kind===`pinned`&&!n)throw this.#r.refusal(e,`has_writer`);t&&(this.#n.dropHeld(e),this.#n.dropHandoff(e))}guarded(e,t,n){let r=this.#n.state(e),i=this.#o(e,r),a=i?void 0:r?.handoff;if(!i&&a===void 0)return;let o=vt[n],s=B(t),c=s===void 0?void 0:I(s);if(a!==void 0)return o.takes&&this.#n.dropHandoff(e),s===void 0||c!==a.digest?bt:(o.takes&&this.#n.hold(e,a),this.#c(e,a,n,!1));let l=r?.held;if(l!==void 0&&c===l.digest)return this.#c(e,l,n,!1);let u=!1;if(l?.kind!==`pinned`&&t.kind===`sealed`&&h(t.bytes)){let r=U(this.#e,e,t.bytes);if(r.kind===`text`&&r.verified&&c!==void 0){let t=z(e,r.text);if(t.status===`valid`)return n!==`save`&&this.#n.hold(e,{digest:c,text:r.text,kind:`owner`}),H(t,!0,c,!1)}u=r.kind===`locked`}return t.kind===`absent`?l===void 0?St:this.#c(e,l,n,!0):o.writer||l===void 0?u?xt:bt:this.#c(e,l,n,!0)}assertReplaceable(t,n){let r=this.guarded(t,n,`save`);if(r!==void 0){if(r.status!==`locked`)return;throw new e(t,r.reason===`changed`?`changed`:`locked`)}switch(n.kind){case`absent`:case`plain`:return;case`unreadable`:case`oversized`:throw new e(t,`unreadable`);case`sealed`:break}let i=n.bytes;if(!h(i))throw new e(t,`newer-format`);let a=this.#n.state(t)?.held;if(a!==void 0&&a.digest===I(i))return;let o=U(this.#e,t,i);if(o.kind!==`text`)throw new e(t,a===void 0?o.kind===`locked`||o.kind===`no-keys`?o.kind:`does-not-open`:`changed`)}prepare(e,t,n){let r=N.from(t,`utf8`),i=this.#d(e,n),a=r,o=!1;if(i===`owner`){let t=this.#f(e,r);t===`locked`?o=n.handoff!==!0:t!==void 0&&(a=gt(t,r))}try{return{stored:this.#e.sealBytes(a,L(e)),text:t,heldAs:i,tagPending:o}}finally{a!==r&&a.fill(0)}}wrote(e,t,n){let r=this.#n.state(e)?.held,i=t.heldAs===`pinned`&&r?.kind===`pinned`&&r.vouched,a={digest:I(t.stored),text:t.text,kind:t.heldAs,...i===!0?{vouched:i}:{}};n&&!this.#r.has(e)&&t.heldAs!==`pinned`?(this.#n.dropHeld(e),this.#n.holdHandoff(e,a)):(this.#n.dropHandoff(e),this.#n.hold(e,a)),t.tagPending?this.#n.setPending(e,a.digest):this.#n.clearPending(e)}wroteIfPresent(e,t,n,r){n.kind===`sealed`&&$e(n.bytes,t.stored)&&this.wrote(e,t,r)}held(e,t){let n=this.guarded(e,t,`held`);if(n!==void 0)return n;let r=this.#n.state(e)?.held;if(r===void 0)return;let i=B(t);return i===void 0||I(i)!==r.digest?bt:this.#c(e,r,`held`,!1)}exportHeld(e,t,n){if(t.kind!==`sealed`||!h(t.bytes))return;let r=I(t.bytes),i=(e,t)=>ft(r,e,t===`owner`),a=this.#n.state(e);if(this.#o(e,a)){if(n.handoffOnly===!0)return;let a=this.guarded(e,t,`export`),o=this.#n.state(e)?.held;return a?.status!==`valid`||a.diverged===!0||o?.digest!==r?void 0:i(o.text,a.authorship===`verified`?`owner`:`unverified`)}let o=a?.handoff;if(o!==void 0)return n.keep!==!0&&this.#n.dropHandoff(e),o.digest===r?(this.#u(e,o.kind,`export`),i(o.text,o.kind)):void 0;if(n.handoffOnly===!0)return;let s=U(this.#e,e,t.bytes);if(s.kind!==`text`||z(e,s.text).status!==`valid`)return;let c=s.verified||this.#s(a,a?.held,r)?`owner`:`unverified`;return this.#u(e,c,`export`),i(s.text,c)}importHeld(e,t){let n=pt(t);if(n===void 0)throw TypeError(`The held record is not a token this build issues.`);if(z(e,n.text).status!==`valid`)throw TypeError(`The held record is not a valid record of this session.`);this.#r.assertUnclaimed(e),this.#n.dropHandoff(e),this.#n.hold(e,{digest:n.digest,text:n.text,kind:`pinned`,...n.owner?{vouched:!0}:{}})}adopt(e,t){if(!Qe(t))return`changed`;let n=this.#n.state(e),r=this.#t.current(e),i=B(r),a=i===void 0?void 0:I(i),o=n?.held;if(o!==void 0&&o.digest===t&&o.kind!==`pinned`)return this.#n.hold(e,{...o,kind:`owner`}),this.#n.untaint(e),a===t&&this.#m(e,t,o.text,!0)===`pending`?`pending`:`adopted`;if(i===void 0||a!==t||this.#e.tagAuthorship===void 0)return`changed`;let s=this.#p(e,r,i);if(s===`locked`)return this.#n.untaint(e),this.#n.setPending(e,t),`pending`;if(s===void 0||z(e,s).status!==`valid`)return`changed`;let c=this.#m(e,t,s,!1);return c!==`changed`&&this.#n.untaint(e),c}heldDigest(e){return this.#n.state(e)?.held?.digest}forget(e){this.#n.forget(e)}onUnlock(e){return this.#e.onUnlock?.(e)??(()=>void 0)}#o(e,t){return this.#r.has(e)||t?.held?.kind===`pinned`}#s(e,t,n){return e?.pendingDigest===n||t?.kind===`owner`&&t.digest===n}#c(e,t,n,r){let i=z(e,t.text);if(i.status!==`valid`)return i;if(t.kind===`pinned`)return H(i,t.vouched===!0,t.digest,r);let a=this.#s(this.#n.state(e),t,t.digest)?`owner`:`unverified`;return this.#l(e,i,a,t.digest,n,r)}#l(e,t,n,r,i,a){return this.#u(e,n,i),H(t,n===`owner`,r,a)}#u(e,t,n){t!==`owner`&&vt[n].taints&&!this.#o(e,this.#n.state(e))&&this.#n.taint(e)}#d(e,t){let n=this.#n.state(e),r=n?.held??n?.handoff;return r?.kind===`pinned`?`pinned`:t.provenance===`unverified`||!this.#r.has(e)&&n?.tainted===!0?`unverified`:r===void 0?t.provenance===`owner`?`owner`:`unverified`:r.kind}#f(e,t){if(this.#e.tagAuthorship!==void 0)try{return this.#e.tagAuthorship(t,L(e))}catch(e){if(m(e))return`locked`;throw e}}#p(e,t,n){if(t.kind!==`sealed`)return R(n);if(!h(n))return;let r=U(this.#e,e,n);return r.kind===`locked`?`locked`:r.kind===`text`?r.text:void 0}#m(e,t,n,r){let i=N.from(n,`utf8`),a=this.#f(e,i);return a===`locked`?(this.#n.setPending(e,t),`pending`):a===void 0||this.#h(e,i,n,a,t,r)?`adopted`:`changed`}#h(e,t,n,r,i,a){let o=gt(r,t),s;try{s=this.#e.sealBytes(o,L(e))}finally{o.fill(0)}let c=B(this.#t.current(e));if(c===void 0||I(c)!==i)return!1;let l={stored:s,text:n,heldAs:`owner`,tagPending:!1};try{this.#t.replace(e,s)}catch(t){throw a&&this.wroteIfPresent(e,l,this.#t.current(e),!1),t}return this.#n.clearPending(e),a&&this.wrote(e,l,!1),!0}#g(){for(let[e,t]of this.#n.pending()){this.#n.clearPending(e);try{this.#i(e,()=>this.#_(e,t))}catch{}}}#_(e,t){let n=this.#t.current(e),r=B(n);if(r===void 0||I(r)!==t)return;let i=this.#n.state(e)?.held,a=i?.digest===t,o=a?i.text:this.#p(e,n,r);if(o===void 0||o===`locked`||z(e,o).status!==`valid`)return;let s=N.from(o,`utf8`),c=this.#f(e,s);c instanceof Uint8Array&&this.#h(e,s,o,c,t,a)}};function Tt(e){let t=e;if(typeof t?.acquire!=`function`||typeof t.takeOver!=`function`||typeof t.endLease!=`function`||typeof t.inspect!=`function`)throw TypeError(`A session store holds a writer marker for every id it writes: build it with the markers of its claims directory.`)}function W(e){if(typeof e!=`object`||!e)throw TypeError(`Session store options must be an object, such as { sealing }.`);return G(e.sealing),e.sealing}function G(e){if(e===`plain`)return;let t=typeof e==`object`&&e?e.sealer:void 0;if(!(typeof t==`object`&&t&&typeof t.sealBytes==`function`&&typeof t.openBytes==`function`))throw TypeError(`A session store states how it seals: { sealer }, or 'plain'.`)}var Et=class{#e;#t;#n;#r;#i;authorship;constructor(e,t,n,r={}){if(G(e),Tt(n),this.#e=e===`plain`?void 0:e.sealer,this.#t=t,this.#n=n,this.#r=new o(r.releaseCommand===void 0?{}:{releaseCommand:r.releaseCommand},{pid:process.pid,windows:process.platform===`win32`}),this.#e===void 0){this.#i=void 0,this.authorship=void 0;return}let i=new wt(this.#e,t,new st(e=>this.#r.has(e)),this.#r,(e,t)=>this.#l(e,t));this.#i=i,this.authorship=Object.freeze({adopt:(e,t)=>{a(e);let n=this.#l(e,()=>i.adopt(e,t));return n===`has_writer`?`has_writer`:n},heldDigest:e=>(a(e),i.heldDigest(e)),onUnlock:e=>i.onUnlock(e)})}get seals(){return this.#e!==void 0}load(e,t={}){return this.#u(e,t.hold===!0?`hold`:`probe`)}listed(e){return this.#u(e,`list`)}claim(e,t={}){this.#r.assertUnclaimed(e);let n=t.fresh===!0;this.#i?.beforeClaim(e,n,t.lease!==void 0);let r=t.copy===!0?void 0:this.#o(e,t.lease),i=()=>this.#r.open(e,n,r,()=>{let{file:t,unreadable:r}=this.#t.load(e);return this.#i===void 0?this.#d(e,t,r):this.#i.claimRead(e,n,t,r,()=>this.#p(e))});if(r===void 0)return i();try{return this.#c(e,r,i)}catch(e){throw r.release(),e}}lend(e){this.#r.assertUnclaimed(e);let t=P(32).toString(`hex`),n=Re(`sha256`).update(t,`utf8`).digest(`hex`),r=this.#n.acquire(e,{leaseDigest:n});if(r.status!==`acquired`)throw this.#r.refusal(e,`has_writer`,{holder:i(r.holder)});let a=this.#r.lend(e,()=>{let t=this.#n.inspect(e);return t.status===`held`?t.holder:void 0}),o=!1;return Object.freeze({nonce:t,end:()=>{if(!o){o=!0;try{this.#n.endLease(e,n)}finally{a()}}}})}hasWriter(e){if(this.#r.has(e)||this.#r.isLent(e))return!0;let t=this.#n.inspect(e);return t.status===`held`&&t.holder.liveness!==`gone`}save(e,t={}){let n=e.id,r=this.#r.markerForSave(n,t.claim);if(r!==void 0){this.#c(n,r,()=>this.#a(e,t));return}this.#s(n,()=>this.#a(e,t))}delete(e,t){this.#r.markerForSave(e,void 0),this.#s(e,()=>{this.forget(e),t()})}#a(e,t){let n=e.id,r=this.#t.current(n),i=this.#i;if(i===void 0){this.#f(n,r),this.#t.replace(n,tt(e,void 0).stored);return}i.assertReplaceable(n,r);let a=i.prepare(n,et(e),t),o=t.handoff===!0;try{this.#t.replace(n,a.stored)}catch(e){throw i.wroteIfPresent(n,a,this.#m(n),o),e}i.wrote(n,a,o)}loadHeld(e){return this.#i?.held(e,this.#t.current(e))}exportHeld(e,t={}){return this.#i?.exportHeld(e,this.#t.current(e),t)}importHeld(e,t){if(this.#i===void 0)throw TypeError(`A store that seals nothing does not take a held record: it would write it in plaintext.`);this.#i.importHeld(e,t)}forget(e){this.#i?.forget(e)}#o(e,t){if(t===void 0){let t=this.#n.acquire(e);if(t.status===`acquired`)return t.handle;throw this.#r.refusal(e,`has_writer`,{holder:i(t.holder)})}let n=this.#n.takeOver(e,t);if(n.status===`acquired`)return n.handle;throw n.status===`absent`?this.#r.refusal(e,`released`,{lease:!0}):this.#r.refusal(e,`has_writer`,{holder:i(n.holder)})}#s(e,t){let n=this.#n.acquire(e);if(n.status!==`acquired`)throw this.#r.refusal(e,`has_writer`,{holder:i(n.holder)});try{return this.#c(e,n.handle,t)}finally{n.handle.release()}}#c(e,t,n){let r=t.withGuard(n);if(r.status===`ran`)return r.value;throw this.#r.refusal(e,r.status===`lost`?`released`:`has_writer`)}#l(e,t){try{let n=this.#r.markerForWrite(e);if(n!==void 0)return this.#c(e,n,t)}catch(e){if(s(e))return`has_writer`;throw e}let n=this.#n.acquire(e);if(n.status!==`acquired`)return`has_writer`;try{return this.#c(e,n.handle,t)}catch(e){if(s(e))return`has_writer`;throw e}finally{n.handle.release()}}#u(e,t){let{file:n,unreadable:r}=this.#t.load(e);return this.#i===void 0?this.#d(e,n,r):this.#i.read(e,n,r,()=>this.#p(e),t)}#d(e,t,n){if(t.kind===`absent`)return this.#p(e);let r=B(t);return r===void 0?n:g(r)?h(r)?yt:{status:`unsupported`,schemaVersion:void 0}:z(e,R(r))}#f(t,n){switch(n.kind){case`absent`:case`plain`:case`oversized`:return;case`unreadable`:throw new e(t,`unreadable`);case`sealed`:throw new e(t,h(n.bytes)?`no-keys`:`newer-format`)}}#p(e){return this.#t.rebuild?.(e)??St}#m(e){try{return this.#t.current(e)}catch{return{kind:`unreadable`}}}};function Dt(e){return typeof e==`object`&&e?e.code:void 0}function Ot(e){let t=Dt(e);return typeof t==`string`&&/^E[A-Z0-9]+$/.test(t)?`could not read the session file (${t})`:`could not read the session file`}function kt(e,t){let n=Buffer.alloc(Math.max(Se(e).size,t.length));t.copy(n,0);let r=t.length;for(;r<n.length;){let t=Te(e,n,r,n.length-r,r);if(t===0)break;r+=t}return n.subarray(0,r)}const At=Object.freeze({status:`missing`}),K=`claims`;function jt(e){let t=0,n=0;for(let{outcome:r}of e)r.status===`locked`&&(r.reason===`no-keys`?n+=1:t+=1);return n===0?{locked:t}:{locked:t,noKeys:n}}function Mt(e,t){let n=e=>e.outcome.status===`valid`?new Date(e.outcome.record.updatedAt).getTime():0;return n(t)-n(e)}var Nt=class{baseDir;ownedRoot;records;constructor(e,t){let n=W(t);this.records=new Et(n,{load:e=>this.loadFile(e),current:e=>this.readExisting(this.filePath(e)),replace:(e,t)=>{this.ensureDir(),Le(this.filePath(e),t)}},je(Oe(A(e),K),{operationLock:Ye(Oe(A(e),K))}),t.releaseCommand===void 0?{}:{releaseCommand:t.releaseCommand}),this.baseDir=e,this.ownedRoot=t.ownedRoot;let r=this.records.authorship;r!==void 0&&(this.authorship=r)}claim(e,t){return this.filePath(e),this.records.claim(e,t)}lend(e){return this.filePath(e),this.records.lend(e)}hasWriter(e){return this.filePath(e),this.records.hasWriter(e)}ensureDir(){M(this.baseDir,this.ownedRoot===void 0?{}:{withinRoot:this.ownedRoot})}filePath(e){a(e);let t=A(this.baseDir),n=A(t,`${e}.json`);if(!n.startsWith(t+ke))throw Error(`Invalid session id: ${JSON.stringify(e)} resolves outside the session store.`);return n}save(e,t={}){this.ensureDir(),this.filePath(e.id),this.records.save(e,t)}readExisting(e){let t;try{t=Ce(e,`r`)}catch(e){return Dt(e)===`ENOENT`?{kind:`absent`}:{kind:`unreadable`}}try{let e=Buffer.alloc(f.length),n=Te(t,e,0,e.length,0);return g(e.subarray(0,n))?{kind:`sealed`,bytes:kt(t,e)}:this.records.seals?{kind:`plain`,bytes:kt(t,e.subarray(0,n))}:{kind:`plain`}}catch{return{kind:`unreadable`}}finally{be(t)}}load(e,t={}){return this.filePath(e),this.records.load(e,t)}loadFile(e){let t=this.filePath(e),n;try{n=we(t)}catch(e){return Dt(e)===`ENOENT`?{file:{kind:`absent`},unreadable:At}:{file:{kind:`unreadable`},unreadable:{status:`corrupt`,issues:[{path:``,message:Ot(e)}]}}}try{Ie(t)}catch{}return{file:ot(n),unreadable:At}}loadHeld(e){return this.filePath(e),this.records.loadHeld(e)}exportHeld(e,t){return this.filePath(e),this.records.exportHeld(e,t)}importHeld(e,t){this.filePath(e),this.records.importHeld(e,t)}list(){return this.scan().entries}scan(){let e=this.readAll();return{entries:e.filter(e=>e.outcome.status!==`locked`).sort(Mt),...jt(e)}}readAll(){return xe(this.baseDir)?Ee(this.baseDir).filter(e=>e.endsWith(`.json`)).map(e=>e.slice(0,-5)).map(e=>({id:e,outcome:this.outcomeForListedId(e)})):[]}outcomeForListedId(e){return r(e)?this.records.listed(e):{status:`corrupt`,issues:[{path:``,message:`the file name is not a usable session id`}]}}delete(e){let t=this.filePath(e);this.records.delete(e,()=>{xe(t)&&De(t)})}};const Pt=Object.freeze({kind:`does-not-open`}),Ft=Object.freeze({kind:`newer-format`}),It=Object.freeze({kind:`locked`,reason:`no-keys`}),Lt=/^R(?:S(?:L[0-9]?)?)?$/;function Rt(e){return G(e),e===`plain`?void 0:e.sealer}function zt(e){return e.reason===`no-keys`?`no-keys`:`locked`}var q=class{#e;#t;constructor(e,t){this.#e=Rt(e),this.#t=t}encode(e,t){return this.#e===void 0?e:`
|
|
1
|
+
import{a as e,b as t,c as n,g as r,i,m as a,n as o,r as s,s as c,u as l}from"./session-claims-DB4Q00_J.js";import{ArtifactCorruptError as u,ArtifactLockedError as d,SEALED_ARTIFACT_MAGIC as f,SEALED_ARTIFACT_MAX_OVERHEAD_BYTES as p,createLogger as m,isArtifactCorruptError as ee,isArtifactLockedError as h,isCurrentSealedArtifactBytes as g,isCurrentSealedArtifactLine as te,isSealedArtifactBytes as _,isSealedArtifactLine as v}from"@robota-sdk/agent-core";import{createProcessOperationLock as ne,createProcessOperationLock as re}from"@robota-sdk/agent-node-lock";import{closeSync as ie,existsSync as ae,fstatSync as oe,openSync as se,readFileSync as ce,readSync as le,readdirSync as ue,unlinkSync as de}from"fs";import{join as fe,resolve as y,sep as pe}from"path";import{OWNER_ONLY_FILE_MODE as b,PROCESS_OWNER_RECORD_NAME as me,createProcessMarkers as he,createProcessScopedDirectory as ge,ensureOwnerOnlyDirectory as x,removeDirectoryOnProcessExit as _e,stageOwnerOnlyFile as ve,sweepStaleProcessScopedDirectories as ye,tightenExistingFile as S,writeOwnerOnlyFile as be}from"@robota-sdk/agent-core/node";import{Buffer as C}from"node:buffer";import{createHash as xe,randomBytes as w}from"node:crypto";import{appendFileSync as Se,closeSync as T,constants as E,existsSync as Ce,fstatSync as D,fsyncSync as O,linkSync as we,lstatSync as k,openSync as A,readFileSync as Te,readSync as Ee,readdirSync as De,realpathSync as Oe,renameSync as ke,rmSync as Ae,rmdirSync as je,unlinkSync as j,writeFileSync as Me,writeSync as Ne}from"node:fs";import{basename as Pe,dirname as M,extname as Fe,isAbsolute as Ie,join as N,relative as Le,resolve as Re,win32 as ze}from"node:path";import{StableFileAuthorityError as Be,createStableRootedFileReader as Ve}from"@robota-sdk/agent-file-authority";const He=`the sealed session file does not open for this session: it is damaged or sealed with other keys`,Ue=/^[0-9a-f]{64}$/;function We(e){return typeof e==`string`&&Ue.test(e)}function P(e){return xe(`sha256`).update(e).digest(`hex`)}function Ge(e,t){return C.from(e.buffer,e.byteOffset,e.byteLength).equals(t)}function F(e){return{kind:`session-record`,id:e}}function I(e){return C.from(e.buffer,e.byteOffset,e.byteLength).toString(`utf8`)}function Ke(e){return JSON.stringify({schemaVersion:2,record:e},null,2)}function qe(e,t){let n=Ke(e),r=C.from(n,`utf8`);return{stored:t===void 0?r:t.sealBytes(r,F(e.id)),text:n}}function Je(e,t,n){if(!_(t))return`plain`;if(!g(t))return`newer-format`;let r;try{r=n.openBytes(t,F(e))}catch(e){if(h(e))throw e;return`does-not-open`}return r.fill(0),`sealed`}function Ye(e,t,n){return n.sealBytes(t,F(e))}function Xe(e){let n;try{n=JSON.parse(e)}catch{return{status:`corrupt`,issues:[{path:``,message:`the session file is not JSON`}]}}let r=t(n);return r.status===`valid`?{status:`valid`,record:r.record}:r.status===`unsupported`?{status:`unsupported`,schemaVersion:r.schemaVersion,...r.cwd===void 0?{}:{cwd:r.cwd}}:{status:`corrupt`,issues:r.issues,...r.cwd===void 0?{}:{cwd:r.cwd}}}function L(e,t){let n=Xe(t);return n.status!==`valid`||n.record.id===e?n:{status:`corrupt`,issues:[{path:`id`,message:`the record belongs to another session id`}]}}function Ze(e,t){return L(e,I(t)).status===`valid`}function Qe(e){return e===void 0?{kind:`absent`}:_(e)?{kind:`sealed`,bytes:e}:{kind:`plain`,bytes:e}}function R(e){return e.kind===`sealed`||e.kind===`plain`?e.bytes:void 0}var $e=class{#e=new Map;#t=new Set;#n=new Set;#r;constructor(e=()=>!1){this.#r=e}get size(){return this.#t.size}state(e){return this.#e.get(e)}hold(e,t){this.#i(e).held=t,this.#t.delete(e),this.#t.add(e);for(let e of this.#t){if(this.#t.size<=32)break;this.#e.get(e)?.held?.kind===`pinned`||this.#r(e)||this.dropHeld(e)}}holdHandoff(e,t){this.#i(e).handoff=t,this.#n.delete(e),this.#n.add(e);for(let e of this.#n){if(this.#n.size<=8)break;this.dropHandoff(e)}}dropHeld(e){this.#t.delete(e),this.#a(e,e=>delete e.held)}dropHandoff(e){this.#n.delete(e),this.#a(e,e=>delete e.handoff)}taint(e){this.#i(e).tainted=!0}untaint(e){this.#a(e,e=>e.tainted=!1)}setPending(e,t){this.#i(e).pendingDigest=t}clearPending(e){this.#a(e,e=>delete e.pendingDigest)}pending(){let e=[];for(let[t,n]of this.#e)n.pendingDigest!==void 0&&e.push([t,n.pendingDigest]);return e}forget(e){this.#t.delete(e),this.#n.delete(e),this.#a(e,e=>{delete e.held,delete e.handoff,delete e.pendingDigest})}#i(e){let t=this.#e.get(e);return t===void 0&&(t={tainted:!1},this.#e.set(e,t)),t}#a(e,t){let n=this.#e.get(e);n!==void 0&&(t(n),n.held===void 0&&n.handoff===void 0&&n.pendingDigest===void 0&&!n.tainted&&this.#e.delete(e))}};const et=`rsh2.`,tt={owner:!0,unverified:!1},nt=/^[A-Za-z0-9_-]+$/,rt=new TextDecoder(`utf-8`,{fatal:!0});function it(e,t,n){return`${et}${n?`owner`:`unverified`}.${e}.${C.from(t,`utf8`).toString(`base64url`)}`}function at(e){if(typeof e!=`string`||!e.startsWith(et))return;let[t,n,r,...i]=e.slice(5).split(`.`);if(t!==`owner`&&t!==`unverified`||i.length>0||n===void 0||r===void 0||!We(n)||!nt.test(r))return;let a=C.from(r,`base64url`);if(a.toString(`base64url`)===r)try{return{digest:n,text:rt.decode(a),owner:tt[t]}}catch{return}}const ot=`robota-authorship/v1 `,z=C.from(ot,`ascii`),st=/^[A-Za-z0-9_-]+$/;function ct(e,t){let n=C.from(e.buffer,e.byteOffset,e.byteLength).toString(`base64url`);return C.concat([C.from(`${ot}${n}\n`,`ascii`),t])}function lt(e){let t=C.from(e.buffer,e.byteOffset,e.byteLength);if(t.length<z.length||!t.subarray(0,z.length).equals(z))return{envelope:e,tag:void 0};let n=t.indexOf(10,z.length);if(n<0)return{envelope:e,tag:`malformed`};let r=t.subarray(z.length,n).toString(`latin1`),i=e.subarray(n+1);if(!st.test(r))return{envelope:i,tag:`malformed`};let a=C.from(r,`base64url`);return a.length!==32||a.toString(`base64url`)!==r?{envelope:i,tag:`malformed`}:{envelope:i,tag:a}}const ut={probe:{writer:!1,takes:!1,holds:!1,taints:!0},hold:{writer:!0,takes:!0,holds:!0,taints:!0},list:{writer:!1,takes:!1,holds:!1,taints:!1},held:{writer:!0,takes:!0,holds:!1,taints:!0},export:{writer:!0,takes:!1,holds:!1,taints:!0},claim:{writer:!0,takes:!0,holds:!0,taints:!0},save:{writer:!0,takes:!1,holds:!1,taints:!1}},dt=Object.freeze({status:`locked`,reason:`no-keys`}),ft=Object.freeze({status:`locked`,reason:`changed`}),pt=Object.freeze({status:`locked`}),mt=Object.freeze({status:`missing`});function B(e,t,n,r){return{status:`valid`,record:e.record,authorship:t?`verified`:`unverified`,...n===void 0?{}:{digest:n},...r?{diverged:!0}:{}}}function V(e,t,n){let r;try{r=e.openBytes(n,F(t))}catch(e){return h(e)?e.reason===`no-keys`?{kind:`no-keys`}:{kind:`locked`}:{kind:`does-not-open`}}try{let{envelope:n,tag:i}=lt(r),a=!1;if(i instanceof Uint8Array&&e.verifyAuthorship!==void 0)try{a=e.verifyAuthorship(n,i,F(t))===!0}catch{a=!1}return{kind:`text`,text:I(n),verified:a}}finally{r.fill(0)}}function ht(e,t,n){let r,i=!1;if(!_(t))r=I(t);else{if(!g(t))return{status:`unsupported`,schemaVersion:void 0};let a=V(n,e,t);if(a.kind===`locked`)return pt;if(a.kind===`no-keys`)return dt;if(a.kind===`does-not-open`)return{status:`corrupt`,issues:[{path:``,message:He}]};r=a.text,i=a.verified}let a=L(e,r);return a.status===`valid`?B(a,i,P(t),!1):a}var gt=class{#e;#t;#n;#r;#i;#a;constructor(e,t,n,r,i){this.#e=e,this.#t=t,this.#n=n,this.#r=r,this.#i=i,e.tagAuthorship!==void 0&&e.onUnlock!==void 0&&(this.#a=()=>this.#g(),e.onUnlock(this.#a))}read(e,t,n,r,i){let a=this.guarded(e,t,i);if(a!==void 0)return a;if(t.kind===`absent`){let t=r();return t.status===`valid`?this.#l(e,t,`unverified`,void 0,i,!1):t}let o=R(t);return o===void 0?n:this.decode(e,o,i)}decode(e,t,n){let r,i=!1;if(!_(t))r=I(t);else{if(!g(t))return{status:`unsupported`,schemaVersion:void 0};let n=V(this.#e,e,t);if(n.kind===`locked`)return pt;if(n.kind===`no-keys`)return dt;if(n.kind===`does-not-open`)return{status:`corrupt`,issues:[{path:``,message:He}]};r=n.text,i=n.verified}let a=L(e,r);if(a.status!==`valid`)return a;let o=P(t),s=this.#n.state(e),c=i||this.#s(s,s?.held,o)?`owner`:`unverified`;return ut[n].holds&&this.#n.hold(e,{digest:o,text:r,kind:c}),this.#l(e,a,c,o,n,!1)}claimRead(e,t,n,r,i){let a=this.#n.state(e)?.held,o=R(n);return!t&&a!==void 0&&o!==void 0&&P(o)===a.digest?this.#c(e,a,`claim`,!1):this.read(e,n,r,i,`claim`)}beforeClaim(e,t,n){if(this.#n.state(e)?.held?.kind===`pinned`&&!n)throw this.#r.refusal(e,`has_writer`);t&&(this.#n.dropHeld(e),this.#n.dropHandoff(e))}guarded(e,t,n){let r=this.#n.state(e),i=this.#o(e,r),a=i?void 0:r?.handoff;if(!i&&a===void 0)return;let o=ut[n],s=R(t),c=s===void 0?void 0:P(s);if(a!==void 0)return o.takes&&this.#n.dropHandoff(e),s===void 0||c!==a.digest?ft:(o.takes&&this.#n.hold(e,a),this.#c(e,a,n,!1));let l=r?.held;if(l!==void 0&&c===l.digest)return this.#c(e,l,n,!1);let u=!1;if(l?.kind!==`pinned`&&t.kind===`sealed`&&g(t.bytes)){let r=V(this.#e,e,t.bytes);if(r.kind===`text`&&r.verified&&c!==void 0){let t=L(e,r.text);if(t.status===`valid`)return n!==`save`&&this.#n.hold(e,{digest:c,text:r.text,kind:`owner`}),B(t,!0,c,!1)}u=r.kind===`locked`}return t.kind===`absent`?l===void 0?mt:this.#c(e,l,n,!0):o.writer||l===void 0?u?pt:ft:this.#c(e,l,n,!0)}assertReplaceable(t,n){let r=this.guarded(t,n,`save`);if(r!==void 0){if(r.status!==`locked`)return;throw new e(t,r.reason===`changed`?`changed`:`locked`)}switch(n.kind){case`absent`:case`plain`:return;case`unreadable`:case`oversized`:throw new e(t,`unreadable`);case`sealed`:break}let i=n.bytes;if(!g(i))throw new e(t,`newer-format`);let a=this.#n.state(t)?.held;if(a!==void 0&&a.digest===P(i))return;let o=V(this.#e,t,i);if(o.kind!==`text`)throw new e(t,a===void 0?o.kind===`locked`||o.kind===`no-keys`?o.kind:`does-not-open`:`changed`)}prepare(e,t,n){let r=C.from(t,`utf8`),i=this.#d(e,n),a=r,o=!1;if(i===`owner`){let t=this.#f(e,r);t===`locked`?o=n.handoff!==!0:t!==void 0&&(a=ct(t,r))}try{return{stored:this.#e.sealBytes(a,F(e)),text:t,heldAs:i,tagPending:o}}finally{a!==r&&a.fill(0)}}wrote(e,t,n){let r=this.#n.state(e)?.held,i=t.heldAs===`pinned`&&r?.kind===`pinned`&&r.vouched,a={digest:P(t.stored),text:t.text,kind:t.heldAs,...i===!0?{vouched:i}:{}};n&&!this.#r.has(e)&&t.heldAs!==`pinned`?(this.#n.dropHeld(e),this.#n.holdHandoff(e,a)):(this.#n.dropHandoff(e),this.#n.hold(e,a)),t.tagPending?this.#n.setPending(e,a.digest):this.#n.clearPending(e)}wroteIfPresent(e,t,n,r){n.kind===`sealed`&&Ge(n.bytes,t.stored)&&this.wrote(e,t,r)}held(e,t){let n=this.guarded(e,t,`held`);if(n!==void 0)return n;let r=this.#n.state(e)?.held;if(r===void 0)return;let i=R(t);return i===void 0||P(i)!==r.digest?ft:this.#c(e,r,`held`,!1)}exportHeld(e,t,n){if(t.kind!==`sealed`||!g(t.bytes))return;let r=P(t.bytes),i=(e,t)=>it(r,e,t===`owner`),a=this.#n.state(e);if(this.#o(e,a)){if(n.handoffOnly===!0)return;let a=this.guarded(e,t,`export`),o=this.#n.state(e)?.held;return a?.status!==`valid`||a.diverged===!0||o?.digest!==r?void 0:i(o.text,a.authorship===`verified`?`owner`:`unverified`)}let o=a?.handoff;if(o!==void 0)return n.keep!==!0&&this.#n.dropHandoff(e),o.digest===r?(this.#u(e,o.kind,`export`),i(o.text,o.kind)):void 0;if(n.handoffOnly===!0)return;let s=V(this.#e,e,t.bytes);if(s.kind!==`text`||L(e,s.text).status!==`valid`)return;let c=s.verified||this.#s(a,a?.held,r)?`owner`:`unverified`;return this.#u(e,c,`export`),i(s.text,c)}importHeld(e,t){let n=at(t);if(n===void 0)throw TypeError(`The held record is not a token this build issues.`);if(L(e,n.text).status!==`valid`)throw TypeError(`The held record is not a valid record of this session.`);this.#r.assertUnclaimed(e),this.#n.dropHandoff(e),this.#n.hold(e,{digest:n.digest,text:n.text,kind:`pinned`,...n.owner?{vouched:!0}:{}})}adopt(e,t){if(!We(t))return`changed`;let n=this.#n.state(e),r=this.#t.current(e),i=R(r),a=i===void 0?void 0:P(i),o=n?.held;if(o!==void 0&&o.digest===t&&o.kind!==`pinned`)return this.#n.hold(e,{...o,kind:`owner`}),this.#n.untaint(e),a===t&&this.#m(e,t,o.text,!0)===`pending`?`pending`:`adopted`;if(i===void 0||a!==t||this.#e.tagAuthorship===void 0)return`changed`;let s=this.#p(e,r,i);if(s===`locked`)return this.#n.untaint(e),this.#n.setPending(e,t),`pending`;if(s===void 0||L(e,s).status!==`valid`)return`changed`;let c=this.#m(e,t,s,!1);return c!==`changed`&&this.#n.untaint(e),c}heldDigest(e){return this.#n.state(e)?.held?.digest}forget(e){this.#n.forget(e)}discardHeld(e){this.#n.dropHeld(e)}onUnlock(e){return this.#e.onUnlock?.(e)??(()=>void 0)}#o(e,t){return this.#r.has(e)||t?.held?.kind===`pinned`}#s(e,t,n){return e?.pendingDigest===n||t?.kind===`owner`&&t.digest===n}#c(e,t,n,r){let i=L(e,t.text);if(i.status!==`valid`)return i;if(t.kind===`pinned`)return B(i,t.vouched===!0,t.digest,r);let a=this.#s(this.#n.state(e),t,t.digest)?`owner`:`unverified`;return this.#l(e,i,a,t.digest,n,r)}#l(e,t,n,r,i,a){return this.#u(e,n,i),B(t,n===`owner`,r,a)}#u(e,t,n){t!==`owner`&&ut[n].taints&&!this.#o(e,this.#n.state(e))&&this.#n.taint(e)}#d(e,t){let n=this.#n.state(e),r=n?.held??n?.handoff;return r?.kind===`pinned`?`pinned`:t.provenance===`unverified`||!this.#r.has(e)&&n?.tainted===!0?`unverified`:r===void 0?t.provenance===`owner`?`owner`:`unverified`:r.kind}#f(e,t){if(this.#e.tagAuthorship!==void 0)try{return this.#e.tagAuthorship(t,F(e))}catch(e){if(h(e))return`locked`;throw e}}#p(e,t,n){if(t.kind!==`sealed`)return I(n);if(!g(n))return;let r=V(this.#e,e,n);return r.kind===`locked`?`locked`:r.kind===`text`?r.text:void 0}#m(e,t,n,r){let i=C.from(n,`utf8`),a=this.#f(e,i);return a===`locked`?(this.#n.setPending(e,t),`pending`):a===void 0||this.#h(e,i,n,a,t,r)?`adopted`:`changed`}#h(e,t,n,r,i,a){let o=ct(r,t),s;try{s=this.#e.sealBytes(o,F(e))}finally{o.fill(0)}let c=R(this.#t.current(e));if(c===void 0||P(c)!==i)return!1;let l={stored:s,text:n,heldAs:`owner`,tagPending:!1};try{this.#t.replace(e,s)}catch(t){throw a&&this.wroteIfPresent(e,l,this.#t.current(e),!1),t}return this.#n.clearPending(e),a&&this.wrote(e,l,!1),!0}#g(){for(let[e,t]of this.#n.pending()){this.#n.clearPending(e);try{this.#i(e,()=>this.#_(e,t))}catch{}}}#_(e,t){let n=this.#t.current(e),r=R(n);if(r===void 0||P(r)!==t)return;let i=this.#n.state(e)?.held,a=i?.digest===t,o=a?i.text:this.#p(e,n,r);if(o===void 0||o===`locked`||L(e,o).status!==`valid`)return;let s=C.from(o,`utf8`),c=this.#f(e,s);c instanceof Uint8Array&&this.#h(e,s,o,c,t,a)}};function _t(e){let t=e;if(typeof t?.acquire!=`function`||typeof t.takeOver!=`function`||typeof t.endLease!=`function`||typeof t.inspect!=`function`)throw TypeError(`A session store holds a writer marker for every id it writes: build it with the markers of its claims directory.`)}function H(e){if(typeof e!=`object`||!e)throw TypeError(`Session store options must be an object, such as { sealing }.`);return U(e.sealing),e.sealing}function U(e){if(e===`plain`)return;let t=typeof e==`object`&&e?e.sealer:void 0;if(!(typeof t==`object`&&t&&typeof t.sealBytes==`function`&&typeof t.openBytes==`function`))throw TypeError(`A session store states how it seals: { sealer }, or 'plain'.`)}var vt=class{#e;#t;#n;#r;#i;authorship;constructor(e,t,n,r={}){if(U(e),_t(n),this.#e=e===`plain`?void 0:e.sealer,this.#t=t,this.#n=n,this.#r=new o(r.releaseCommand===void 0?{}:{releaseCommand:r.releaseCommand},{pid:process.pid,windows:process.platform===`win32`}),this.#e===void 0){this.#i=void 0,this.authorship=void 0;return}let i=new gt(this.#e,t,new $e(e=>this.#r.has(e)),this.#r,(e,t)=>this.#l(e,t));this.#i=i,this.authorship=Object.freeze({adopt:(e,t)=>{a(e);let n=this.#l(e,()=>i.adopt(e,t));return n===`has_writer`?`has_writer`:n},heldDigest:e=>(a(e),i.heldDigest(e)),onUnlock:e=>i.onUnlock(e)})}get seals(){return this.#e!==void 0}load(e,t={}){return this.#u(e,t.hold===!0?`hold`:`probe`)}listed(e){return this.#u(e,`list`)}claim(e,t={}){this.#r.assertUnclaimed(e);let n=t.fresh===!0;this.#i?.beforeClaim(e,n,t.lease!==void 0);let r=t.copy===!0?void 0:this.#o(e,t.lease),i=()=>this.#r.open(e,n,r,()=>{let{file:t,unreadable:r}=this.#t.load(e);return this.#i===void 0?this.#d(e,t,r):this.#i.claimRead(e,n,t,r,()=>this.#p(e))},()=>this.#i?.discardHeld(e));if(r===void 0)return i();try{return this.#c(e,r,i)}catch(e){throw r.release(),e}}lend(e){this.#r.assertUnclaimed(e);let t=w(32).toString(`hex`),n=xe(`sha256`).update(t,`utf8`).digest(`hex`),r=this.#n.acquire(e,{leaseDigest:n});if(r.status!==`acquired`)throw this.#r.refusal(e,`has_writer`,{holder:i(r.holder)});let a=this.#r.lend(e,()=>{let t=this.#n.inspect(e);return t.status===`held`?t.holder:void 0}),o=!1;return Object.freeze({nonce:t,end:()=>{if(!o){o=!0;try{this.#n.endLease(e,n)}finally{a()}}}})}hasWriter(e){if(this.#r.has(e)||this.#r.isLent(e))return!0;let t=this.#n.inspect(e);return t.status===`held`&&t.holder.liveness!==`gone`}save(e,t={}){let n=e.id,r=this.#r.markerForSave(n,t.claim);if(r!==void 0){this.#c(n,r,()=>this.#a(e,t));return}this.#s(n,()=>this.#a(e,t))}delete(e,t){this.#r.markerForSave(e,void 0),this.#s(e,()=>{this.forget(e),t()})}#a(e,t){let n=e.id,r=this.#t.current(n),i=this.#i;if(i===void 0){this.#f(n,r),this.#t.replace(n,qe(e,void 0).stored);return}i.assertReplaceable(n,r);let a=i.prepare(n,Ke(e),t),o=t.handoff===!0;try{this.#t.replace(n,a.stored)}catch(e){throw i.wroteIfPresent(n,a,this.#m(n),o),e}i.wrote(n,a,o)}loadHeld(e){return this.#i?.held(e,this.#t.current(e))}exportHeld(e,t={}){return this.#i?.exportHeld(e,this.#t.current(e),t)}importHeld(e,t){if(this.#i===void 0)throw TypeError(`A store that seals nothing does not take a held record: it would write it in plaintext.`);this.#i.importHeld(e,t)}forget(e){this.#i?.forget(e)}#o(e,t){if(t===void 0){let t=this.#n.acquire(e);if(t.status===`acquired`)return t.handle;throw this.#r.refusal(e,`has_writer`,{holder:i(t.holder)})}let n=this.#n.takeOver(e,t);if(n.status===`acquired`)return n.handle;throw n.status===`absent`?this.#r.refusal(e,`released`,{lease:!0}):this.#r.refusal(e,`has_writer`,{holder:i(n.holder)})}#s(e,t){let n=this.#n.acquire(e);if(n.status!==`acquired`)throw this.#r.refusal(e,`has_writer`,{holder:i(n.holder)});try{return this.#c(e,n.handle,t)}finally{n.handle.release()}}#c(e,t,n){let r=t.withGuard(n);if(r.status===`ran`)return r.value;throw this.#r.refusal(e,r.status===`lost`?`released`:`has_writer`)}#l(e,t){try{let n=this.#r.markerForWrite(e);if(n!==void 0)return this.#c(e,n,t)}catch(e){if(s(e))return`has_writer`;throw e}let n=this.#n.acquire(e);if(n.status!==`acquired`)return`has_writer`;try{return this.#c(e,n.handle,t)}catch(e){if(s(e))return`has_writer`;throw e}finally{n.handle.release()}}#u(e,t){let{file:n,unreadable:r}=this.#t.load(e);return this.#i===void 0?this.#d(e,n,r):this.#i.read(e,n,r,()=>this.#p(e),t)}#d(e,t,n){if(t.kind===`absent`)return this.#p(e);let r=R(t);return r===void 0?n:_(r)?g(r)?dt:{status:`unsupported`,schemaVersion:void 0}:L(e,I(r))}#f(t,n){switch(n.kind){case`absent`:case`plain`:case`oversized`:return;case`unreadable`:throw new e(t,`unreadable`);case`sealed`:throw new e(t,g(n.bytes)?`no-keys`:`newer-format`)}}#p(e){return this.#t.rebuild?.(e)??mt}#m(e){try{return this.#t.current(e)}catch{return{kind:`unreadable`}}}};function yt(e){return typeof e==`object`&&e?e.code:void 0}function bt(e){let t=yt(e);return typeof t==`string`&&/^E[A-Z0-9]+$/.test(t)?`could not read the session file (${t})`:`could not read the session file`}function xt(e,t){let n=Buffer.alloc(Math.max(oe(e).size,t.length));t.copy(n,0);let r=t.length;for(;r<n.length;){let t=le(e,n,r,n.length-r,r);if(t===0)break;r+=t}return n.subarray(0,r)}const St=Object.freeze({status:`missing`}),W=`claims`;function Ct(e){let t=0,n=0;for(let{outcome:r}of e)r.status===`locked`&&(r.reason===`no-keys`?n+=1:t+=1);return n===0?{locked:t}:{locked:t,noKeys:n}}function wt(e,t){let n=e=>e.outcome.status===`valid`?new Date(e.outcome.record.updatedAt).getTime():0;return n(t)-n(e)}var Tt=class{supportsClaimDiscard=!0;baseDir;ownedRoot;records;constructor(e,t){let n=H(t);this.records=new vt(n,{load:e=>this.loadFile(e),current:e=>this.readExisting(this.filePath(e)),replace:(e,t)=>{this.ensureDir(),be(this.filePath(e),t)}},he(fe(y(e),W),{operationLock:re(fe(y(e),W))}),t.releaseCommand===void 0?{}:{releaseCommand:t.releaseCommand}),this.baseDir=e,this.ownedRoot=t.ownedRoot;let r=this.records.authorship;r!==void 0&&(this.authorship=r)}claim(e,t){return this.filePath(e),this.records.claim(e,t)}lend(e){return this.filePath(e),this.records.lend(e)}hasWriter(e){return this.filePath(e),this.records.hasWriter(e)}ensureDir(){x(this.baseDir,this.ownedRoot===void 0?{}:{withinRoot:this.ownedRoot})}filePath(e){a(e);let t=y(this.baseDir),n=y(t,`${e}.json`);if(!n.startsWith(t+pe))throw Error(`Invalid session id: ${JSON.stringify(e)} resolves outside the session store.`);return n}save(e,t={}){this.ensureDir(),this.filePath(e.id),this.records.save(e,t)}saveRestoreTransaction(e,t){if(!t?.claim)throw TypeError(`A live session claim is required for restore commit.`);try{return this.save(e,t),{status:`committed`}}catch(e){return{status:`unknown`,error:e}}}readExisting(e){let t;try{t=se(e,`r`)}catch(e){return yt(e)===`ENOENT`?{kind:`absent`}:{kind:`unreadable`}}try{let e=Buffer.alloc(f.length),n=le(t,e,0,e.length,0);return _(e.subarray(0,n))?{kind:`sealed`,bytes:xt(t,e)}:this.records.seals?{kind:`plain`,bytes:xt(t,e.subarray(0,n))}:{kind:`plain`}}catch{return{kind:`unreadable`}}finally{ie(t)}}load(e,t={}){return this.filePath(e),this.records.load(e,t)}loadFile(e){let t=this.filePath(e),n;try{n=ce(t)}catch(e){return yt(e)===`ENOENT`?{file:{kind:`absent`},unreadable:St}:{file:{kind:`unreadable`},unreadable:{status:`corrupt`,issues:[{path:``,message:bt(e)}]}}}try{S(t)}catch{}return{file:Qe(n),unreadable:St}}loadHeld(e){return this.filePath(e),this.records.loadHeld(e)}exportHeld(e,t){return this.filePath(e),this.records.exportHeld(e,t)}importHeld(e,t){this.filePath(e),this.records.importHeld(e,t)}list(){return this.scan().entries}scan(){let e=this.readAll();return{entries:e.filter(e=>e.outcome.status!==`locked`).sort(wt),...Ct(e)}}readAll(){return ae(this.baseDir)?ue(this.baseDir).filter(e=>e.endsWith(`.json`)).map(e=>e.slice(0,-5)).map(e=>({id:e,outcome:this.outcomeForListedId(e)})):[]}outcomeForListedId(e){return r(e)?this.records.listed(e):{status:`corrupt`,issues:[{path:``,message:`the file name is not a usable session id`}]}}delete(e){let t=this.filePath(e);this.records.delete(e,()=>{ae(t)&&de(t)})}};const Et=Object.freeze({kind:`does-not-open`}),Dt=Object.freeze({kind:`newer-format`}),Ot=Object.freeze({kind:`locked`,reason:`no-keys`}),kt=/^R(?:S(?:L[0-9]?)?)?$/;function At(e){return U(e),e===`plain`?void 0:e.sealer}function jt(e){return e.reason===`no-keys`?`no-keys`:`locked`}var G=class{#e;#t;constructor(e,t){this.#e=At(e),this.#t=t}encode(e,t){return this.#e===void 0?e:`
|
|
2
2
|
${this.#e.sealLine(e,{kind:this.#t,id:t})}
|
|
3
|
-
`}decode(e,t){try{return this.#n(e,t)}catch{return
|
|
4
|
-
`).filter(e=>e.length>0)}}};function
|
|
5
|
-
`),n=t[t.length-1];return n.length>0&&(
|
|
3
|
+
`}decode(e,t){try{return this.#n(e,t)}catch{return Et}}openText(e,t){let n=K(e),r=e=>this.#n(e,t);return Mt((function*(){for(let e of n)yield r(e)})())}#n(e,t){if(!v(e))return{kind:`lines`,lines:[e]};if(!te(e))return Dt;if(this.#e===void 0)return Ot;let n;try{n=this.#e.openLine(e,{kind:this.#t,id:t})}catch(e){if(h(e))return{kind:`locked`,reason:jt(e)};if(ee(e))return Et;throw e}return{kind:`lines`,lines:n.split(`
|
|
4
|
+
`).filter(e=>e.length>0)}}};function K(e){let t=e.split(`
|
|
5
|
+
`),n=t[t.length-1];return n.length>0&&(v(n)||kt.test(n))&&t.pop(),t}function Mt(e){let t=[],r=0;for(let i of e)switch(r+=1,i.kind){case`lines`:t.push(i.lines.join(`
|
|
6
6
|
`));break;case`locked`:throw new d(i.reason);case`does-not-open`:throw new u;case`newer-format`:throw new n(`UNSUPPORTED_VERSION`,[{path:`line ${r}`,message:`the line is sealed in a framing version this build does not open`}])}return t.join(`
|
|
7
|
-
`)}function
|
|
7
|
+
`)}function q(e,t,n){return e===`PAYLOAD_UNREADABLE`?new c(e,`External payload is sealed and does not open here: ${t}.`,{relativePath:t}):new c(e,`External payload exceeds the remaining byte budget of ${n}.`,{relativePath:t,expected:n})}var Nt=class{#e;#t=new Map;constructor(e){this.#e=At(e)}place(e,t,n,r){let i=l(e,t,n);if(this.#e===void 0)return r({relativePath:i.relativePath,data:n,contentAddressed:!0}),i;let a=this.#t.get(e)??new Map,o=a.get(t);if(o!==void 0)return{...i,relativePath:o};let s=`${e}.payloads/${w(16).toString(`base64url`)}.sealed`,c=Buffer.from(n,`utf8`),u;try{u=this.#e.sealBytes(c,{kind:`session-log-payload`,id:e})}finally{c.fill(0)}return r({relativePath:s,data:u,contentAddressed:!1}),a.set(t,s),this.#t.set(e,a),{...i,relativePath:s}}rawBudget(e){return this.#e===void 0?e:Math.min(e+p,2**53-1)}open(e,t,n,r){if(this.#e===void 0)return e;if(!_(e)){if(e.byteLength>t)throw q(`MAX_TOTAL_BYTES_EXCEEDED`,r,t);return e}if(!g(e)||n===void 0)throw q(`PAYLOAD_UNREADABLE`,r,t);let i;try{i=this.#e.openBytes(e,{kind:`session-log-payload`,id:n})}catch(e){throw h(e)?new d(jt(e)):ee(e)?q(`PAYLOAD_UNREADABLE`,r,t):e}if(i.byteLength>t)throw i.fill(0),q(`MAX_TOTAL_BYTES_EXCEEDED`,r,t);return i}};function Pt(e){return{kind:`session-log-payload`,id:e}}function Ft(e,t,n){if(!_(e))return`plain`;if(!g(e))return`newer-format`;let r;try{r=n.openBytes(e,Pt(t))}catch(e){if(h(e))throw e;return`does-not-open`}return r.fill(0),`sealed`}function It(e,t,n){return n.sealBytes(e,Pt(t))}function Lt(e){return e.endsWith(`\r`)?e.slice(0,-1):e}var Rt=class{ownerId;sealedLines=0;carriedLines=0;#e;constructor(e,t){this.ownerId=t,this.#e=new G({sealer:e},`session-log-line`)}rewrite(e,t,n){for(let r of e){let e=Lt(r);if(e.length===0)continue;if(v(e)){t.write(`${n?`
|
|
8
8
|
`:``}${e}
|
|
9
9
|
`),this.carriedLines+=1;continue}let i=this.#e.encode(`${e}
|
|
10
|
-
`,this.ownerId);t.write(n?i:i.slice(1)),this.sealedLines+=1}}};function Jt(e){return J(e).filter(e=>{let t=Kt(e);return t.length>0&&!_(t)}).length}function Yt(e,t,n){let r=new qt(n,t),i=[];return r.rewrite(J(e),{write:e=>i.push(e)},!1),{text:i.join(``),sealedLines:r.sealedLines,carriedLines:r.carriedLines}}const Xt=ee(`NodeSessionLogSink`);var Zt=class{logDirectory;externalPayloadSink=this;enabled;lines;payloads;constructor(e,t){this.logDirectory=e;let n=W(t);this.lines=new q(n,`session-log-line`),this.payloads=new Ht(n);try{M(e),this.enabled=!0}catch(t){this.enabled=!1,Xt.warn(`session log directory could not be created — session logging is disabled`,{logDirectory:e,error:t instanceof Error?t.message:String(t)})}}append(e,t){if(a(e),!this.enabled)return;let n=D(this.logDirectory,`${e}.jsonl`),r=this.lines.encode(t,e);Ie(n),re(n,r,{mode:j})}writeJson(e,t,n){return this.payloads.place(e,t,n,t=>this.writePayload(e,t))}writePayload(e,t){if(!this.enabled)return;M(D(this.logDirectory,`${e}.payloads`));let n=D(this.logDirectory,t.relativePath);try{pe(n,t.data,{...typeof t.data==`string`?{encoding:`utf8`}:{},mode:j,flag:`wx`})}catch(e){if(!t.contentAddressed||e.code!==`EEXIST`)throw e;Ie(n)}}};function Qt(e){if(e.trim().length===0||e.includes(`\0`)||_e(e)||ye.isAbsolute(e))throw en(e);let t=e.split(/[\\/]+/u);if(t.some(e=>e===`.`||e===`..`))throw en(e);return t}function $t(e){if(!Number.isFinite(e)||!Number.isSafeInteger(e)||e<0)throw new c(`INVALID_LIMIT`,`External-payload maxBytes must be a finite, non-negative safe integer.`,{actual:String(e)})}function en(e,t){return new c(`OUTSIDE_ROOT`,`External payload path escapes its base directory or contains a link: ${e}.`,{relativePath:e},t)}function tn(e,t,n){return e.code===`INVALID_PATH`||e.code===`UNSAFE_ENTRY`?en(t,e):e.code===`UNSUPPORTED_BACKEND`?new c(`STABLE_PAYLOAD_READ_UNAVAILABLE`,`Stable root-relative external-payload reads are unavailable on this host.`,{relativePath:t},e):e.code===`OVER_BUDGET`?new c(`MAX_TOTAL_BYTES_EXCEEDED`,`External payload exceeds the remaining byte budget of ${n}.`,{relativePath:t,expected:n},e):new c(`PAYLOAD_UNREADABLE`,`External payload could not be read: ${t}.`,{relativePath:t},e)}function nn(e){let t=e.length===2?e[0]:void 0;if(!(t===void 0||!t.endsWith(`.payloads`)))return t.slice(0,-9)||void 0}var rn=class{baseDirectory;payloads;ownerId;constructor(e,t){if(e.trim().length===0)throw Error(`External-payload base directory must not be empty.`);this.baseDirectory=O(e),this.payloads=new Ht(W(t)),this.ownerId=t.ownerId}readBytes(e,t){$t(t);let n=Qt(e),r=this.readStored(e,n,t);if(r!==void 0)return this.payloads.open(r,t,this.ownerId??nn(n),e)}readStored(e,t,n){try{let e=Be(this.baseDirectory);try{return e.readBytes(t,this.payloads.rawBudget(n))}finally{e.close()}}catch(t){throw t instanceof c?t:t instanceof ze?tn(t,e,n):new c(`PAYLOAD_UNREADABLE`,`External payload could not be read: ${e}.`,{relativePath:e},t)}}},an=class{logFile;externalPayloadSource;lines;ownerId;constructor(e,t){if(this.logFile=e,e.trim().length===0)throw Error(`Session log-file path must not be empty.`);let n=W(t);this.lines=new q(n,`session-log-line`),this.ownerId=he(e,ge(e)),this.externalPayloadSource=new rn(E(e),{sealing:n,ownerId:this.ownerId})}readText(){if(ie(this.logFile))return this.lines.openText(se(this.logFile,`utf8`),this.ownerId)}readStoredLines(){if(ie(this.logFile))return J(se(this.logFile,`utf8`)).map(e=>this.lines.decode(e,this.ownerId))}};function on(e){return e?.code}function Y(e){let t;try{t=S(e)}catch(e){if(on(e)===`ENOENT`)return{status:`missing`};throw e}if(!t.isFile())return{status:`refused`,reason:`not-a-regular-file`};let n;try{n=C(e,y.O_RDONLY|(y.O_NOFOLLOW??0))}catch(e){if(on(e)===`ENOENT`)return{status:`missing`};if(on(e)===`ELOOP`)return{status:`refused`,reason:`not-a-regular-file`};throw e}let r=b(n),i=r.isFile()&&r.ino===t.ino&&r.dev===t.dev;return!i||r.nlink>1?(v(n),{status:`refused`,reason:i?`hard-linked`:`not-a-regular-file`}):{status:`open`,descriptor:n}}function sn(e,t,n){let r=Buffer.alloc(Math.max(0,n-t)),i=0;for(;i<r.length;){let n=ce(e,r,i,r.length-i,t+i);if(n===0)break;i+=n}return r.subarray(0,i)}function X(e){return sn(e,0,b(e).size)}function*cn(e){let t=0;for(;t<e.length;){let n=e.indexOf(10,t),r=n===-1?e.length:n;yield e.toString(`utf8`,t,r),t=r+1}}function ln(e,t){let n=Buffer.from(t,`utf8`),r=0;for(;r<n.length;)r+=me(e,n,r,n.length-r)}var un=class{descriptor;#e=[];#t=0;constructor(e){this.descriptor=e}write(e){this.#e.push(e),this.#t+=e.length,this.#t>=1048576&&this.flush()}flush(){this.#e.length!==0&&(ln(this.descriptor,this.#e.join(``)),this.#e=[],this.#t=0)}};function dn(e){let t;try{t=C(e,y.O_RDONLY),x(t)}catch{}finally{t!==void 0&&v(t)}}function fn(e){try{T(e)}catch{}}function pn(e){let t=Y(e);if(t.status!==`open`)return 0;try{return J(X(t.descriptor).toString(`utf8`)).filter(e=>e.length>0&&!_(e)).length}finally{v(t.descriptor)}}async function mn(e,t,n,r,i){let a=0;for(;;){let o=b(e).size;if(o>t.read){let i=sn(e,t.read,o),s=i.lastIndexOf(10);if(s!==-1){n.rewrite(cn(i.subarray(0,s+1)),r,!0),r.flush(),t.read+=s+1,a=0;continue}}if(a>=2)break;a+=1,await i()}let o=b(e).size,s=sn(e,t.read,o).toString(`utf8`);if(s.length===0)return!1;let c=J(s);return n.rewrite(c,r,!0),r.flush(),t.read=o,c.length===0}function hn(e,t){let n;try{n=S(e)}catch(e){if(on(e)===`ENOENT`)return`removed`;throw e}let r=b(t);return n.isFile()&&n.ino===r.ino&&n.dev===r.dev?`same`:`replaced`}function gn(){return new Promise(e=>setTimeout(e,20))}async function _n(e,t,n={}){let r=Y(e);if(r.status!==`open`)return r;let i=r.descriptor,a=E(e),o=D(a,`.${he(e)}.${process.pid}.${P(6).toString(`hex`)}.tmp`),s,c=!1;try{let r=X(i),l=r.lastIndexOf(10)+1;M(a,n.ownedRoot===void 0?{}:{withinRoot:n.ownedRoot}),s=C(o,y.O_WRONLY|y.O_CREAT|y.O_EXCL|y.O_APPEND|(y.O_NOFOLLOW??0),j);let u=new un(s);t.rewrite(cn(r.subarray(0,l)),u,!1),u.flush(),x(s),n.beforeCommit?.();let d=hn(e,i);if(d!==`same`)return{status:d};ue(o,e),c=!0,dn(a);let f={read:l},p=!1,ee;try{p=await mn(i,f,t,u,n.pause??gn)}catch(e){ee={unreadBytes:Math.max(0,b(i).size-f.read),reason:e instanceof Error?e.name:`unknown`}}return x(s),{status:`rewritten`,droppedTail:p,plainLinesAfter:pn(e),...ee===void 0?{}:{catchUpFailed:ee}}}finally{s!==void 0&&v(s),v(i),c||fn(o)}}const vn=/^.+\.(\d{1,10})\.tmp$/u,yn=/^\..+\.(\d{1,10})\.[0-9a-f]{12}\.tmp$/u;function bn(e){let t=(yn.exec(e)??vn.exec(e))?.[1];return t===void 0?void 0:Number(t)}function xn(e,t,n){let r,i;try{let t=S(e);if(!t.isDirectory())return 0;r=Math.max(t.mtimeMs,n??-1/0),i=w(e)}catch{return 0}let a=0;for(let n of i){let i=bn(n);if(i===void 0||i===process.pid)continue;let o=D(e,n);try{let e=S(o);if(!e.isFile()||r-e.mtimeMs<=3e5)continue;t&&T(o),a+=1}catch{}}return a}function Z(e){let t;try{t=C(e,y.O_RDONLY|(y.O_NOFOLLOW??0))}catch(e){if(e.code===`ENOENT`)return;throw e}try{let e=b(t);return e.isFile()?{bytes:X(t),links:e.nlink}:void 0}finally{v(t)}}const Sn=e=>Re(`sha256`).update(e).digest(`hex`);var Cn=class extends Error{constructor(){super(`The file changed while its replacement was staged.`),this.name=`FileChangedError`}};function wn(e,t,n=(e,t)=>(t(),!0)){let r=[],i=[],a=0;try{e((e,t,n)=>{r.push({path:e,file:Pe(e,n),digest:Sn(t)})});for(let{path:e,file:o,digest:s}of r)try{n(e,()=>o.commit(()=>{t?.();let n=Z(e);if(n===void 0||n.links>1||Sn(n.bytes)!==s)throw new Cn}))?a+=1:i.push(e)}catch(t){if(!(t instanceof Cn))throw t;i.push(e)}}finally{for(let{file:e}of r)e.discard()}return{replaced:a,changed:i}}const Tn=`.jsonl`,En=`.payloads`,Dn=`.tmp`;function On(e){let t=new Map,n;try{n=w(e)}catch(e){if(e.code===`ENOENT`)return t;throw e}for(let r of n.sort())try{let n=S(D(e,r));t.set(r,n.isFile()?`file`:n.isDirectory()?`directory`:`other`)}catch(e){if(e.code!==`ENOENT`)throw e}return t}function kn(e,t){let n=new Map;for(let[i,a]of On(e)){let o=i.endsWith(Tn),s=i.endsWith(En);if(!o&&!s)continue;let c=i.slice(0,-(o?Tn:En).length);if((o?a!==`file`:a!==`directory`)||!r(c)){t.refused.push(D(e,i));continue}let l=n.get(c)??{log:!1,payloads:!1};o?l.log=!0:l.payloads=!0,n.set(c,l)}return n}function An(e,t,n,r){let i=new Set,a=wn(a=>{for(let[o,s]of On(e)){if(o.endsWith(Dn))continue;i.add(o);let c=D(e,o);if(s!==`file`){r.refused.push(c);continue}let l=Z(c);if(l===void 0)continue;let u=Wt(l.bytes,t,n.sealer);if(u===`sealed`?r.alreadySealed+=1:u!==`plain`&&r.unopenable.push(c),u===`plain`){if(l.links>1){r.refused.push(c);continue}if(!n.apply){r.payloads+=1;continue}a(c,l.bytes,Gt(l.bytes,t,n.sealer))}}},n.beforeCommit);return r.payloads+=a.replaced,r.changed.push(...a.changed),r.staleTemporaries+=xn(e,n.apply&&n.sweepTemporaries===!0,n.migrationStartedAt),i}function jn(e,t,n,r){let i=[];for(let[a,o]of On(e)){if(n.has(a)||a.endsWith(Dn)||o!==`file`)continue;let s=Z(D(e,a));s!==void 0&&Wt(s.bytes,t,r)===`plain`&&i.push(D(e,a))}return i}function Mn(e){let t=Y(e);if(t.status===`missing`)return`missing`;if(t.status===`refused`)return`refused`;try{return Jt(X(t.descriptor).toString(`utf8`))}finally{v(t.descriptor)}}async function Nn(e,t,n,r){let i=Mn(e);if(i===`missing`)return;if(i===`refused`){r.refused.push(e);return}if(i===0){r.alreadySealed+=1;return}let a=n.apply?await _n(e,new qt(n.sealer,t),{...n.ownedRoot===void 0?{}:{ownedRoot:n.ownedRoot},...n.beforeCommit===void 0?{}:{beforeCommit:n.beforeCommit},...n.pause===void 0?{}:{pause:n.pause}}):void 0;a?.status!==`missing`&&a?.status!==`removed`&&(r.logs+=1,r.lines+=i,a!==void 0&&(a.status===`refused`?r.refused.push(e):a.status===`replaced`?r.changed.push(e):a.status===`rewritten`&&(a.plainLinesAfter>0&&r.changed.push(e),a.catchUpFailed!==void 0&&r.catchUpFailed.push({path:e,...a.catchUpFailed}))))}async function Pn(e,t){let n={logs:0,lines:0,payloads:0,alreadySealed:0,unopenable:[],refused:[],changed:[],catchUpFailed:[],staleTemporaries:0};try{if(!S(e).isDirectory())return n.refused.push(e),n}catch(e){if(e.code===`ENOENT`)return n;throw e}for(let[r,i]of kn(e,n)){let a=D(e,`${r}${En}`),o=i.payloads?An(a,r,t,n):new Set;i.log&&await Nn(D(e,`${r}${Tn}`),r,t,n),t.apply&&i.payloads&&n.changed.push(...jn(a,r,o,t.sealer))}return n.staleTemporaries+=xn(e,t.apply&&t.sweepTemporaries===!0,t.migrationStartedAt),n}function Fn(e){let t=[],n=[],r;try{if(!S(e).isDirectory())return{files:t,refused:[e]};r=w(e)}catch(e){if(e.code===`ENOENT`)return{files:t,refused:n};throw e}for(let i of r.sort())if(i.endsWith(`.json`))try{(S(D(e,i)).isFile()?t:n).push(i)}catch(e){if(e.code!==`ENOENT`)throw e}return{files:t,refused:n.map(t=>D(e,t))}}function In(e,t){let{files:n,refused:i}=Fn(e),a={sealed:0,alreadySealed:0,unopenable:[],unsafeNames:[],refused:i,changed:[],held:[],staleTemporaries:0,sealedRecords:[]},o=je(D(e,K),{operationLock:Ye(D(e,K))}),s=[],c=wn(i=>{for(let c of n){let n=D(e,c),l=c.slice(0,-5);if(!r(l)){a.unsafeNames.push(n);continue}let u=o.inspect(l);if(u.status===`held`&&u.holder.liveness!==`gone`){a.held.push(l);continue}let d=Z(n);if(d===void 0)continue;let f=nt(l,d.bytes,t.sealer);if(f===`sealed`?a.alreadySealed+=1:f!==`plain`&&a.unopenable.push(n),f!==`plain`)continue;if(d.links>1){a.refused.push(n);continue}if(!t.apply){a.sealed+=1;continue}let p=rt(l,d.bytes,t.sealer);at(l,d.bytes)&&s.push({path:n,id:l,digest:I(p)}),i(n,d.bytes,p)}},t.beforeCommit,(e,t)=>{let n=he(e).slice(0,-5),r=o.acquire(n);if(r.status!==`acquired`)return a.held.push(n),!1;try{return r.handle.withGuard(t).status===`ran`?!0:(a.held.push(n),!1)}finally{r.handle.release()}});a.sealed+=c.replaced,a.changed.push(...c.changed);for(let{path:e,id:t,digest:n}of s)c.changed.includes(e)||a.sealedRecords.push({id:t,digest:n});return a.staleTemporaries=xn(e,t.apply&&t.sweepTemporaries===!0,t.migrationStartedAt),a}function Ln(e,t){let n=new Set;for(let i of Fn(e).files){let a=i.slice(0,-5);if(!r(a))continue;let o=Z(D(e,i));if(o===void 0)continue;let s=Ct(a,o.bytes,t.sealer),c=s.status===`valid`?s.record.cwd:s.status===`corrupt`||s.status===`unsupported`?s.cwd:void 0;typeof c==`string`&&c.length>0&&n.add(c)}return[...n]}const Rn=/^tool-result:([A-Za-z0-9_-]{22,64})$/u,zn=`agent-tool-results-`,Bn=8*1024*1024,Vn=y.O_WRONLY|y.O_CREAT|y.O_EXCL|(y.O_NOFOLLOW??0);var Q=class extends Error{code;constructor(e){super(`Tool result spill failed (${e})`),this.code=e,this.name=`ToolResultSpillError`}};function Hn(e){return Fe(e,zn)}const Un=Bn+p;function Wn(e){return{kind:`tool-result-spill`,id:e}}var Gn=class{directory;retentionMs;now;onCleanupFailure;sealer;entries=new Map;opened;expiryTimer;cancelExitRemoval;closed=!1;constructor(e){let t=e?.parentDirectory;if(typeof t!=`string`||t.length===0||(this.retentionMs=e.retentionMs??36e5,this.now=e.now??Date.now,this.onCleanupFailure=e.onCleanupFailure,!Number.isSafeInteger(this.retentionMs)||this.retentionMs<=0))throw new Q(`invalid-options`);let n;try{n=W(e)}catch{throw new Q(`invalid-options`)}this.sealer=n===`plain`?void 0:n.sealer;try{let e=S(t);if(!e.isDirectory()||e.isSymbolicLink())throw Error(`unsafe parent`);this.directory=Me(t,zn,{prepareParent:!1}),this.assertRoot()}catch{throw new Q(`unsafe-root`)}this.cancelExitRemoval=Ne(this.directory)}assertRoot(){try{let e=S(this.directory);if(!e.isDirectory()||e.isSymbolicLink())throw Error(`unsafe directory`);if(process.platform!==`win32`&&e.mode&63)throw Error(`directory is not owner-only`)}catch{throw new Q(`unsafe-root`)}}scheduleExpiry(e=1){if(this.expiryTimer!==void 0&&clearTimeout(this.expiryTimer),this.expiryTimer=void 0,this.closed||this.entries.size===0)return;let t=1/0;for(let e of this.entries.values())e.expiresAt<t&&(t=e.expiresAt);let n=Math.min(2147483647,Math.max(e,t-this.now()));this.expiryTimer=setTimeout(()=>{this.expiryTimer=void 0,this.cleanupExpired().catch(()=>{try{this.onCleanupFailure?this.onCleanupFailure(`cleanup-failed`):process.emitWarning(`Tool result spill expiry cleanup failed (cleanup-failed)`)}catch{process.emitWarning(`Tool result spill expiry cleanup failed (cleanup-failed)`)}this.scheduleExpiry(6e4)})},n),this.expiryTimer.unref?.()}async write(e){if(this.closed)throw new Q(`closed`);if(await this.cleanupExpired(),this.assertRoot(),Buffer.byteLength(e,`utf8`)>Bn)throw new Q(`write-failed`);let t=P(18).toString(`base64url`),n=`${P(18).toString(`base64url`)}.partial`,r=`${t}${this.sealer===void 0?`.txt`:`.sealed`}`,i=D(this.directory,n),a=D(this.directory,r),o;try{o=this.storedForm(e,t)}catch{throw new Q(`write-failed`)}let s,c=!1;try{s=C(i,Vn,384),pe(s,o,`utf8`),x(s),v(s),s=void 0,oe(i,a),c=!0,T(i);let e=`tool-result:${t}`;return this.entries.set(e,{fileName:r,token:t,expiresAt:this.now()+this.retentionMs}),this.scheduleExpiry(),{reference:e}}catch{let e=!1;if(s!==void 0)try{v(s)}catch{e=!0}try{T(i)}catch(t){t.code!==`ENOENT`&&(e=!0)}if(c)try{T(a)}catch{e=!0}throw new Q(e?`cleanup-failed`:`write-failed`)}}async read(e){if(this.closed)throw new Q(`closed`);if(!Rn.test(e))throw new Q(`invalid-reference`);let t=this.entries.get(e);if(!t)throw new Q(`missing`);if(this.now()>=t.expiresAt)throw this.removeEntry(e,t),this.scheduleExpiry(),new Q(`expired`);if(this.opened?.reference===e)return this.opened.content;this.assertRoot();try{let n=new rn(this.directory,{sealing:`plain`}).readBytes(t.fileName,this.sealer===void 0?Bn:Un);if(n===void 0)throw new Q(`missing`);if(this.sealer===void 0)return Buffer.from(n).toString(`utf8`);let r=this.openStored(this.sealer,n,t.token);return this.opened={reference:e,content:r},r}catch(e){throw e instanceof Q?e:new Q(`read-failed`)}}storedForm(e,t){if(this.sealer===void 0)return e;let n=Buffer.from(e,`utf8`);try{return this.sealer.sealBytes(n,Wn(t))}finally{n.fill(0)}}openStored(e,t,n){let r=e.openBytes(t,Wn(n));try{if(r.byteLength>Bn)throw new Q(`read-failed`);return Buffer.from(r.buffer,r.byteOffset,r.byteLength).toString(`utf8`)}finally{r.fill(0)}}removeEntry(e,t){this.assertRoot(),this.opened?.reference===e&&(this.opened=void 0);try{T(D(this.directory,t.fileName))}catch(e){if(e.code!==`ENOENT`)throw new Q(`cleanup-failed`)}this.entries.delete(e)}async cleanupExpired(){if(this.closed)throw new Q(`closed`);for(let[e,t]of this.entries)this.now()>=t.expiresAt&&this.removeEntry(e,t);this.scheduleExpiry()}async shutdown(){if(!this.closed){this.expiryTimer!==void 0&&clearTimeout(this.expiryTimer),this.expiryTimer=void 0,this.opened=void 0;for(let[e,t]of this.entries)this.removeEntry(e,t);this.assertRoot();try{if(w(this.directory).filter(e=>e!==Ae).length!==0)throw Error(`unexpected files`);de(D(this.directory,Ae),{force:!0}),fe(this.directory),this.closed=!0,this.cancelExitRemoval?.()}catch{throw new Q(`cleanup-failed`)}}}};const Kn=64*1024,$=`user`;function qn(e){if(typeof e!=`object`||!e||Array.isArray(e))return!1;let t=e;return typeof t.at==`string`&&typeof t.sessionId==`string`&&typeof t.project==`string`&&typeof t.text==`string`}function Jn(e){if(e.trim().length===0)return;let t;try{t=JSON.parse(e)}catch{return}if(qn(t))return{at:t.at,sessionId:t.sessionId,project:t.project,text:t.text}}function Yn(e,t){let n=[],r=0,i=0,a=0;for(let o of e){if(o.length===0)continue;let e=t.decode(o,$);if(e.kind===`locked`){e.reason===`no-keys`?a+=1:i+=1;continue}if(e.kind!==`lines`){r+=1;continue}for(let t=e.lines.length-1;t>=0;--t){let i=Jn(e.lines[t]);i===void 0?r+=1:n.push(i)}}return i+a===0?{entries:n,skippedLines:r}:{entries:n,skippedLines:r,unreadable:{locked:i,noKeys:a}}}function Xn(e){return e.code===`ENOENT`}var Zn=class{path;blockBytes;ownedRoot;lines;constructor(e,t){this.path=e,this.lines=new q(W(t),`prompt-history-line`),this.blockBytes=t.blockBytes??65536,this.ownedRoot=t.ownedRoot}append(e){let t=this.lines.encode(`${JSON.stringify(e)}\n`,$);M(E(this.path),this.ownedRoot===void 0?{}:{withinRoot:this.ownedRoot}),Ie(this.path),re(this.path,t,{mode:j})}async*read(e){let t;try{t=C(this.path,y.O_RDONLY|(y.O_NOFOLLOW??0))}catch(e){if(e instanceof Error&&Xn(e))return;throw e}try{let n=b(t).size,r=Buffer.alloc(0),i=!0;for(;n>0&&!e.signal.aborted;){let e=Math.min(this.blockBytes,n);n-=e;let a=Buffer.alloc(e),o=ce(t,a,0,e,n),s=Buffer.concat([a.subarray(0,o),r]),c=n===0?-1:s.indexOf(10);r=c===-1&&n>0?s:s.subarray(0,c+1);let l=n===0?s:c===-1?Buffer.alloc(0):s.subarray(c+1);if(n>0&&c===-1)continue;let u=l.toString(`utf8`),d=(i?J(u):u.split(`
|
|
11
|
-
`)).reverse();i=!1,yield
|
|
12
|
-
`),this.counts.carriedOver+=1;continue}
|
|
13
|
-
`,$);t.write(n?e:e.slice(1)),this.counts.entries+=1}}}};function
|
|
10
|
+
`,this.ownerId);t.write(n?i:i.slice(1)),this.sealedLines+=1}}};function zt(e){return K(e).filter(e=>{let t=Lt(e);return t.length>0&&!v(t)}).length}function Bt(e,t,n){let r=new Rt(n,t),i=[];return r.rewrite(K(e),{write:e=>i.push(e)},!1),{text:i.join(``),sealedLines:r.sealedLines,carriedLines:r.carriedLines}}const Vt=m(`NodeSessionLogSink`);var Ht=class{logDirectory;externalPayloadSink=this;enabled;lines;payloads;constructor(e,t){this.logDirectory=e;let n=H(t);this.lines=new G(n,`session-log-line`),this.payloads=new Nt(n);try{x(e),this.enabled=!0}catch(t){this.enabled=!1,Vt.warn(`session log directory could not be created — session logging is disabled`,{logDirectory:e,error:t instanceof Error?t.message:String(t)})}}append(e,t){if(a(e),!this.enabled)return;let n=N(this.logDirectory,`${e}.jsonl`),r=this.lines.encode(t,e);S(n),Se(n,r,{mode:b})}writeJson(e,t,n){return this.payloads.place(e,t,n,t=>this.writePayload(e,t))}writePayload(e,t){if(!this.enabled)return;x(N(this.logDirectory,`${e}.payloads`));let n=N(this.logDirectory,t.relativePath);try{Me(n,t.data,{...typeof t.data==`string`?{encoding:`utf8`}:{},mode:b,flag:`wx`})}catch(e){if(!t.contentAddressed||e.code!==`EEXIST`)throw e;S(n)}}};function Ut(e){if(e.trim().length===0||e.includes(`\0`)||Ie(e)||ze.isAbsolute(e))throw Gt(e);let t=e.split(/[\\/]+/u);if(t.some(e=>e===`.`||e===`..`))throw Gt(e);return t}function Wt(e){if(!Number.isFinite(e)||!Number.isSafeInteger(e)||e<0)throw new c(`INVALID_LIMIT`,`External-payload maxBytes must be a finite, non-negative safe integer.`,{actual:String(e)})}function Gt(e,t){return new c(`OUTSIDE_ROOT`,`External payload path escapes its base directory or contains a link: ${e}.`,{relativePath:e},t)}function Kt(e,t,n){return e.code===`INVALID_PATH`||e.code===`UNSAFE_ENTRY`?Gt(t,e):e.code===`UNSUPPORTED_BACKEND`?new c(`STABLE_PAYLOAD_READ_UNAVAILABLE`,`Stable root-relative external-payload reads are unavailable on this host.`,{relativePath:t},e):e.code===`OVER_BUDGET`?new c(`MAX_TOTAL_BYTES_EXCEEDED`,`External payload exceeds the remaining byte budget of ${n}.`,{relativePath:t,expected:n},e):new c(`PAYLOAD_UNREADABLE`,`External payload could not be read: ${t}.`,{relativePath:t},e)}function qt(e){let t=e.length===2?e[0]:void 0;if(!(t===void 0||!t.endsWith(`.payloads`)))return t.slice(0,-9)||void 0}var Jt=class{baseDirectory;payloads;ownerId;constructor(e,t){if(e.trim().length===0)throw Error(`External-payload base directory must not be empty.`);this.baseDirectory=Re(e),this.payloads=new Nt(H(t)),this.ownerId=t.ownerId}readBytes(e,t){Wt(t);let n=Ut(e),r=this.readStored(e,n,t);if(r!==void 0)return this.payloads.open(r,t,this.ownerId??qt(n),e)}readStored(e,t,n){try{let e=Ve(this.baseDirectory);try{return e.readBytes(t,this.payloads.rawBudget(n))}finally{e.close()}}catch(t){throw t instanceof c?t:t instanceof Be?Kt(t,e,n):new c(`PAYLOAD_UNREADABLE`,`External payload could not be read: ${e}.`,{relativePath:e},t)}}},Yt=class{logFile;externalPayloadSource;lines;ownerId;constructor(e,t){if(this.logFile=e,e.trim().length===0)throw Error(`Session log-file path must not be empty.`);let n=H(t);this.lines=new G(n,`session-log-line`),this.ownerId=Pe(e,Fe(e)),this.externalPayloadSource=new Jt(M(e),{sealing:n,ownerId:this.ownerId})}readText(){if(Ce(this.logFile))return this.lines.openText(Te(this.logFile,`utf8`),this.ownerId)}readStoredLines(){if(Ce(this.logFile))return K(Te(this.logFile,`utf8`)).map(e=>this.lines.decode(e,this.ownerId))}};function J(e){return e?.code}function Y(e){let t;try{t=k(e)}catch(e){if(J(e)===`ENOENT`)return{status:`missing`};throw e}if(!t.isFile())return{status:`refused`,reason:`not-a-regular-file`};let n;try{n=A(e,E.O_RDONLY|(E.O_NOFOLLOW??0))}catch(e){if(J(e)===`ENOENT`)return{status:`missing`};if(J(e)===`ELOOP`)return{status:`refused`,reason:`not-a-regular-file`};throw e}let r=D(n),i=r.isFile()&&r.ino===t.ino&&r.dev===t.dev;return!i||r.nlink>1?(T(n),{status:`refused`,reason:i?`hard-linked`:`not-a-regular-file`}):{status:`open`,descriptor:n}}function Xt(e,t,n){let r=Buffer.alloc(Math.max(0,n-t)),i=0;for(;i<r.length;){let n=Ee(e,r,i,r.length-i,t+i);if(n===0)break;i+=n}return r.subarray(0,i)}function X(e){return Xt(e,0,D(e).size)}function*Zt(e){let t=0;for(;t<e.length;){let n=e.indexOf(10,t),r=n===-1?e.length:n;yield e.toString(`utf8`,t,r),t=r+1}}function Qt(e,t){let n=Buffer.from(t,`utf8`),r=0;for(;r<n.length;)r+=Ne(e,n,r,n.length-r)}var $t=class{descriptor;#e=[];#t=0;constructor(e){this.descriptor=e}write(e){this.#e.push(e),this.#t+=e.length,this.#t>=1048576&&this.flush()}flush(){this.#e.length!==0&&(Qt(this.descriptor,this.#e.join(``)),this.#e=[],this.#t=0)}};function en(e){let t;try{t=A(e,E.O_RDONLY),O(t)}catch{}finally{t!==void 0&&T(t)}}function tn(e){try{j(e)}catch{}}function nn(e){let t=Y(e);if(t.status!==`open`)return 0;try{return K(X(t.descriptor).toString(`utf8`)).filter(e=>e.length>0&&!v(e)).length}finally{T(t.descriptor)}}async function rn(e,t,n,r,i){let a=0;for(;;){let o=D(e).size;if(o>t.read){let i=Xt(e,t.read,o),s=i.lastIndexOf(10);if(s!==-1){n.rewrite(Zt(i.subarray(0,s+1)),r,!0),r.flush(),t.read+=s+1,a=0;continue}}if(a>=2)break;a+=1,await i()}let o=D(e).size,s=Xt(e,t.read,o).toString(`utf8`);if(s.length===0)return!1;let c=K(s);return n.rewrite(c,r,!0),r.flush(),t.read=o,c.length===0}function an(e,t){let n;try{n=k(e)}catch(e){if(J(e)===`ENOENT`)return`removed`;throw e}let r=D(t);return n.isFile()&&n.ino===r.ino&&n.dev===r.dev?`same`:`replaced`}function on(){return new Promise(e=>setTimeout(e,20))}async function sn(e,t,n={}){let r=Y(e);if(r.status!==`open`)return r;let i=r.descriptor,a=M(e),o=N(a,`.${Pe(e)}.${process.pid}.${w(6).toString(`hex`)}.tmp`),s,c=!1;try{let r=X(i),l=r.lastIndexOf(10)+1;x(a,n.ownedRoot===void 0?{}:{withinRoot:n.ownedRoot}),s=A(o,E.O_WRONLY|E.O_CREAT|E.O_EXCL|E.O_APPEND|(E.O_NOFOLLOW??0),b);let u=new $t(s);t.rewrite(Zt(r.subarray(0,l)),u,!1),u.flush(),O(s),n.beforeCommit?.();let d=an(e,i);if(d!==`same`)return{status:d};ke(o,e),c=!0,en(a);let f={read:l},p=!1,m;try{p=await rn(i,f,t,u,n.pause??on)}catch(e){m={unreadBytes:Math.max(0,D(i).size-f.read),reason:e instanceof Error?e.name:`unknown`}}return O(s),{status:`rewritten`,droppedTail:p,plainLinesAfter:nn(e),...m===void 0?{}:{catchUpFailed:m}}}finally{s!==void 0&&T(s),T(i),c||tn(o)}}const cn=/^.+\.(\d{1,10})\.tmp$/u,ln=/^\..+\.(\d{1,10})\.[0-9a-f]{12}\.tmp$/u;function un(e){let t=(ln.exec(e)??cn.exec(e))?.[1];return t===void 0?void 0:Number(t)}function dn(e,t,n){let r,i;try{let t=k(e);if(!t.isDirectory())return 0;r=Math.max(t.mtimeMs,n??-1/0),i=De(e)}catch{return 0}let a=0;for(let n of i){let i=un(n);if(i===void 0||i===process.pid)continue;let o=N(e,n);try{let e=k(o);if(!e.isFile()||r-e.mtimeMs<=3e5)continue;t&&j(o),a+=1}catch{}}return a}function Z(e){let t;try{t=A(e,E.O_RDONLY|(E.O_NOFOLLOW??0))}catch(e){if(e.code===`ENOENT`)return;throw e}try{let e=D(t);return e.isFile()?{bytes:X(t),links:e.nlink}:void 0}finally{T(t)}}const fn=e=>xe(`sha256`).update(e).digest(`hex`);var pn=class extends Error{constructor(){super(`The file changed while its replacement was staged.`),this.name=`FileChangedError`}};function mn(e,t,n=(e,t)=>(t(),!0)){let r=[],i=[],a=0;try{e((e,t,n)=>{r.push({path:e,file:ve(e,n),digest:fn(t)})});for(let{path:e,file:o,digest:s}of r)try{n(e,()=>o.commit(()=>{t?.();let n=Z(e);if(n===void 0||n.links>1||fn(n.bytes)!==s)throw new pn}))?a+=1:i.push(e)}catch(t){if(!(t instanceof pn))throw t;i.push(e)}}finally{for(let{file:e}of r)e.discard()}return{replaced:a,changed:i}}const hn=`.jsonl`,gn=`.payloads`,_n=`.tmp`;function vn(e){let t=new Map,n;try{n=De(e)}catch(e){if(e.code===`ENOENT`)return t;throw e}for(let r of n.sort())try{let n=k(N(e,r));t.set(r,n.isFile()?`file`:n.isDirectory()?`directory`:`other`)}catch(e){if(e.code!==`ENOENT`)throw e}return t}function yn(e,t){let n=new Map;for(let[i,a]of vn(e)){let o=i.endsWith(hn),s=i.endsWith(gn);if(!o&&!s)continue;let c=i.slice(0,-(o?hn:gn).length);if((o?a!==`file`:a!==`directory`)||!r(c)){t.refused.push(N(e,i));continue}let l=n.get(c)??{log:!1,payloads:!1};o?l.log=!0:l.payloads=!0,n.set(c,l)}return n}function bn(e,t,n,r){let i=new Set,a=mn(a=>{for(let[o,s]of vn(e)){if(o.endsWith(_n))continue;i.add(o);let c=N(e,o);if(s!==`file`){r.refused.push(c);continue}let l=Z(c);if(l===void 0)continue;let u=Ft(l.bytes,t,n.sealer);if(u===`sealed`?r.alreadySealed+=1:u!==`plain`&&r.unopenable.push(c),u===`plain`){if(l.links>1){r.refused.push(c);continue}if(!n.apply){r.payloads+=1;continue}a(c,l.bytes,It(l.bytes,t,n.sealer))}}},n.beforeCommit);return r.payloads+=a.replaced,r.changed.push(...a.changed),r.staleTemporaries+=dn(e,n.apply&&n.sweepTemporaries===!0,n.migrationStartedAt),i}function xn(e,t,n,r){let i=[];for(let[a,o]of vn(e)){if(n.has(a)||a.endsWith(_n)||o!==`file`)continue;let s=Z(N(e,a));s!==void 0&&Ft(s.bytes,t,r)===`plain`&&i.push(N(e,a))}return i}function Sn(e){let t=Y(e);if(t.status===`missing`)return`missing`;if(t.status===`refused`)return`refused`;try{return zt(X(t.descriptor).toString(`utf8`))}finally{T(t.descriptor)}}async function Cn(e,t,n,r){let i=Sn(e);if(i===`missing`)return;if(i===`refused`){r.refused.push(e);return}if(i===0){r.alreadySealed+=1;return}let a=n.apply?await sn(e,new Rt(n.sealer,t),{...n.ownedRoot===void 0?{}:{ownedRoot:n.ownedRoot},...n.beforeCommit===void 0?{}:{beforeCommit:n.beforeCommit},...n.pause===void 0?{}:{pause:n.pause}}):void 0;a?.status!==`missing`&&a?.status!==`removed`&&(r.logs+=1,r.lines+=i,a!==void 0&&(a.status===`refused`?r.refused.push(e):a.status===`replaced`?r.changed.push(e):a.status===`rewritten`&&(a.plainLinesAfter>0&&r.changed.push(e),a.catchUpFailed!==void 0&&r.catchUpFailed.push({path:e,...a.catchUpFailed}))))}async function wn(e,t){let n={logs:0,lines:0,payloads:0,alreadySealed:0,unopenable:[],refused:[],changed:[],catchUpFailed:[],staleTemporaries:0};try{if(!k(e).isDirectory())return n.refused.push(e),n}catch(e){if(e.code===`ENOENT`)return n;throw e}for(let[r,i]of yn(e,n)){let a=N(e,`${r}${gn}`),o=i.payloads?bn(a,r,t,n):new Set;i.log&&await Cn(N(e,`${r}${hn}`),r,t,n),t.apply&&i.payloads&&n.changed.push(...xn(a,r,o,t.sealer))}return n.staleTemporaries+=dn(e,t.apply&&t.sweepTemporaries===!0,t.migrationStartedAt),n}function Tn(e){let t=[],n=[],r;try{if(!k(e).isDirectory())return{files:t,refused:[e]};r=De(e)}catch(e){if(e.code===`ENOENT`)return{files:t,refused:n};throw e}for(let i of r.sort())if(i.endsWith(`.json`))try{(k(N(e,i)).isFile()?t:n).push(i)}catch(e){if(e.code!==`ENOENT`)throw e}return{files:t,refused:n.map(t=>N(e,t))}}function En(e,t){let{files:n,refused:i}=Tn(e),a={sealed:0,alreadySealed:0,unopenable:[],unsafeNames:[],refused:i,changed:[],held:[],staleTemporaries:0,sealedRecords:[]},o=he(N(e,W),{operationLock:re(N(e,W))}),s=[],c=mn(i=>{for(let c of n){let n=N(e,c),l=c.slice(0,-5);if(!r(l)){a.unsafeNames.push(n);continue}let u=o.inspect(l);if(u.status===`held`&&u.holder.liveness!==`gone`){a.held.push(l);continue}let d=Z(n);if(d===void 0)continue;let f=Je(l,d.bytes,t.sealer);if(f===`sealed`?a.alreadySealed+=1:f!==`plain`&&a.unopenable.push(n),f!==`plain`)continue;if(d.links>1){a.refused.push(n);continue}if(!t.apply){a.sealed+=1;continue}let p=Ye(l,d.bytes,t.sealer);Ze(l,d.bytes)&&s.push({path:n,id:l,digest:P(p)}),i(n,d.bytes,p)}},t.beforeCommit,(e,t)=>{let n=Pe(e).slice(0,-5),r=o.acquire(n);if(r.status!==`acquired`)return a.held.push(n),!1;try{return r.handle.withGuard(t).status===`ran`?!0:(a.held.push(n),!1)}finally{r.handle.release()}});a.sealed+=c.replaced,a.changed.push(...c.changed);for(let{path:e,id:t,digest:n}of s)c.changed.includes(e)||a.sealedRecords.push({id:t,digest:n});return a.staleTemporaries=dn(e,t.apply&&t.sweepTemporaries===!0,t.migrationStartedAt),a}function Dn(e,t){let n=new Set;for(let i of Tn(e).files){let a=i.slice(0,-5);if(!r(a))continue;let o=Z(N(e,i));if(o===void 0)continue;let s=ht(a,o.bytes,t.sealer),c=s.status===`valid`?s.record.cwd:s.status===`corrupt`||s.status===`unsupported`?s.cwd:void 0;typeof c==`string`&&c.length>0&&n.add(c)}return[...n]}const On=/^tool-result:([A-Za-z0-9_-]{22,64})$/u,kn=`agent-tool-results-`,An=8*1024*1024,jn=E.O_WRONLY|E.O_CREAT|E.O_EXCL|(E.O_NOFOLLOW??0);var Q=class extends Error{code;constructor(e){super(`Tool result spill failed (${e})`),this.code=e,this.name=`ToolResultSpillError`}};function Mn(e){return ye(e,kn)}const Nn=An+p;function Pn(e){return{kind:`tool-result-spill`,id:e}}var Fn=class{directory;retentionMs;now;onCleanupFailure;sealer;entries=new Map;opened;expiryTimer;cancelExitRemoval;closed=!1;constructor(e){let t=e?.parentDirectory;if(typeof t!=`string`||t.length===0||(this.retentionMs=e.retentionMs??36e5,this.now=e.now??Date.now,this.onCleanupFailure=e.onCleanupFailure,!Number.isSafeInteger(this.retentionMs)||this.retentionMs<=0))throw new Q(`invalid-options`);let n;try{n=H(e)}catch{throw new Q(`invalid-options`)}this.sealer=n===`plain`?void 0:n.sealer;try{let e=k(t);if(!e.isDirectory()||e.isSymbolicLink())throw Error(`unsafe parent`);this.directory=ge(t,kn,{prepareParent:!1}),this.assertRoot()}catch{throw new Q(`unsafe-root`)}this.cancelExitRemoval=_e(this.directory)}assertRoot(){try{let e=k(this.directory);if(!e.isDirectory()||e.isSymbolicLink())throw Error(`unsafe directory`);if(process.platform!==`win32`&&e.mode&63)throw Error(`directory is not owner-only`)}catch{throw new Q(`unsafe-root`)}}scheduleExpiry(e=1){if(this.expiryTimer!==void 0&&clearTimeout(this.expiryTimer),this.expiryTimer=void 0,this.closed||this.entries.size===0)return;let t=1/0;for(let e of this.entries.values())e.expiresAt<t&&(t=e.expiresAt);let n=Math.min(2147483647,Math.max(e,t-this.now()));this.expiryTimer=setTimeout(()=>{this.expiryTimer=void 0,this.cleanupExpired().catch(()=>{try{this.onCleanupFailure?this.onCleanupFailure(`cleanup-failed`):process.emitWarning(`Tool result spill expiry cleanup failed (cleanup-failed)`)}catch{process.emitWarning(`Tool result spill expiry cleanup failed (cleanup-failed)`)}this.scheduleExpiry(6e4)})},n),this.expiryTimer.unref?.()}async write(e){if(this.closed)throw new Q(`closed`);if(await this.cleanupExpired(),this.assertRoot(),Buffer.byteLength(e,`utf8`)>An)throw new Q(`write-failed`);let t=w(18).toString(`base64url`),n=`${w(18).toString(`base64url`)}.partial`,r=`${t}${this.sealer===void 0?`.txt`:`.sealed`}`,i=N(this.directory,n),a=N(this.directory,r),o;try{o=this.storedForm(e,t)}catch{throw new Q(`write-failed`)}let s,c=!1;try{s=A(i,jn,384),Me(s,o,`utf8`),O(s),T(s),s=void 0,we(i,a),c=!0,j(i);let e=`tool-result:${t}`;return this.entries.set(e,{fileName:r,token:t,expiresAt:this.now()+this.retentionMs}),this.scheduleExpiry(),{reference:e}}catch{let e=!1;if(s!==void 0)try{T(s)}catch{e=!0}try{j(i)}catch(t){t.code!==`ENOENT`&&(e=!0)}if(c)try{j(a)}catch{e=!0}throw new Q(e?`cleanup-failed`:`write-failed`)}}async read(e){if(this.closed)throw new Q(`closed`);if(!On.test(e))throw new Q(`invalid-reference`);let t=this.entries.get(e);if(!t)throw new Q(`missing`);if(this.now()>=t.expiresAt)throw this.removeEntry(e,t),this.scheduleExpiry(),new Q(`expired`);if(this.opened?.reference===e)return this.opened.content;this.assertRoot();try{let n=new Jt(this.directory,{sealing:`plain`}).readBytes(t.fileName,this.sealer===void 0?An:Nn);if(n===void 0)throw new Q(`missing`);if(this.sealer===void 0)return Buffer.from(n).toString(`utf8`);let r=this.openStored(this.sealer,n,t.token);return this.opened={reference:e,content:r},r}catch(e){throw e instanceof Q?e:new Q(`read-failed`)}}storedForm(e,t){if(this.sealer===void 0)return e;let n=Buffer.from(e,`utf8`);try{return this.sealer.sealBytes(n,Pn(t))}finally{n.fill(0)}}openStored(e,t,n){let r=e.openBytes(t,Pn(n));try{if(r.byteLength>An)throw new Q(`read-failed`);return Buffer.from(r.buffer,r.byteOffset,r.byteLength).toString(`utf8`)}finally{r.fill(0)}}removeEntry(e,t){this.assertRoot(),this.opened?.reference===e&&(this.opened=void 0);try{j(N(this.directory,t.fileName))}catch(e){if(e.code!==`ENOENT`)throw new Q(`cleanup-failed`)}this.entries.delete(e)}async cleanupExpired(){if(this.closed)throw new Q(`closed`);for(let[e,t]of this.entries)this.now()>=t.expiresAt&&this.removeEntry(e,t);this.scheduleExpiry()}async shutdown(){if(!this.closed){this.expiryTimer!==void 0&&clearTimeout(this.expiryTimer),this.expiryTimer=void 0,this.opened=void 0;for(let[e,t]of this.entries)this.removeEntry(e,t);this.assertRoot();try{if(De(this.directory).filter(e=>e!==me).length!==0)throw Error(`unexpected files`);Ae(N(this.directory,me),{force:!0}),je(this.directory),this.closed=!0,this.cancelExitRemoval?.()}catch{throw new Q(`cleanup-failed`)}}}};const In=64*1024,$=`user`;function Ln(e){if(typeof e!=`object`||!e||Array.isArray(e))return!1;let t=e;return typeof t.at==`string`&&typeof t.sessionId==`string`&&typeof t.project==`string`&&typeof t.text==`string`}function Rn(e){if(e.trim().length===0)return;let t;try{t=JSON.parse(e)}catch{return}if(Ln(t))return{at:t.at,sessionId:t.sessionId,project:t.project,text:t.text}}function zn(e,t){let n=[],r=0,i=0,a=0;for(let o of e){if(o.length===0)continue;let e=t.decode(o,$);if(e.kind===`locked`){e.reason===`no-keys`?a+=1:i+=1;continue}if(e.kind!==`lines`){r+=1;continue}for(let t=e.lines.length-1;t>=0;--t){let i=Rn(e.lines[t]);i===void 0?r+=1:n.push(i)}}return i+a===0?{entries:n,skippedLines:r}:{entries:n,skippedLines:r,unreadable:{locked:i,noKeys:a}}}function Bn(e){return e.code===`ENOENT`}var Vn=class{path;blockBytes;ownedRoot;lines;constructor(e,t){this.path=e,this.lines=new G(H(t),`prompt-history-line`),this.blockBytes=t.blockBytes??65536,this.ownedRoot=t.ownedRoot}append(e){let t=this.lines.encode(`${JSON.stringify(e)}\n`,$);x(M(this.path),this.ownedRoot===void 0?{}:{withinRoot:this.ownedRoot}),S(this.path),Se(this.path,t,{mode:b})}async*read(e){let t;try{t=A(this.path,E.O_RDONLY|(E.O_NOFOLLOW??0))}catch(e){if(e instanceof Error&&Bn(e))return;throw e}try{let n=D(t).size,r=Buffer.alloc(0),i=!0;for(;n>0&&!e.signal.aborted;){let e=Math.min(this.blockBytes,n);n-=e;let a=Buffer.alloc(e),o=Ee(t,a,0,e,n),s=Buffer.concat([a.subarray(0,o),r]),c=n===0?-1:s.indexOf(10);r=c===-1&&n>0?s:s.subarray(0,c+1);let l=n===0?s:c===-1?Buffer.alloc(0):s.subarray(c+1);if(n>0&&c===-1)continue;let u=l.toString(`utf8`),d=(i?K(u):u.split(`
|
|
11
|
+
`)).reverse();i=!1,yield zn(d,this.lines)}}finally{T(t)}}},Hn=class{counts={entries:0,fromPlain:0,carriedOver:0};#e;constructor(e){this.#e=new G({sealer:e},`prompt-history-line`)}rewrite(e,t,n){for(let r of e){if(r.length===0)continue;let e=this.#e.decode(r,$);if(e.kind===`locked`)throw new d(e.reason);if(e.kind!==`lines`){t.write(`${r}
|
|
12
|
+
`),this.counts.carriedOver+=1;continue}v(r)||(this.counts.fromPlain+=e.lines.length);for(let r of e.lines){let e=this.#e.encode(`${r}
|
|
13
|
+
`,$);t.write(n?e:e.slice(1)),this.counts.entries+=1}}}};function Un(e,t){let n=Y(e);if(n.status!==`open`)return n;let r=new G({sealer:t.sealer},`prompt-history-line`),i=0,a=0,o=0;try{for(let e of K(X(n.descriptor).toString(`utf8`))){if(e.length===0)continue;let t=r.decode(e,$);if(t.kind===`locked`)throw new d(t.reason);t.kind===`lines`?v(e)?a+=1:i+=1:o+=1}}finally{T(n.descriptor)}return{status:`present`,plainLines:i,sealedLines:a,unreadableLines:o}}function Wn(e,t){let n=Y(e);if(n.status!==`open`)return[];let r=new G({sealer:t.sealer},`prompt-history-line`),i=new Set;try{for(let e of K(X(n.descriptor).toString(`utf8`))){if(e.length===0)continue;let t=r.decode(e,$);if(t.kind===`locked`)throw new d(t.reason);if(t.kind===`lines`)for(let e of t.lines){let t=Rn(e);t!==void 0&&t.project.length>0&&i.add(t.project)}}}finally{T(n.descriptor)}return[...i]}async function Gn(e,t){let n=new Hn(t.sealer),r=0,i=await sn(e,n,{...t.ownedRoot===void 0?{}:{ownedRoot:t.ownedRoot},...t.pause===void 0?{}:{pause:t.pause},beforeCommit:()=>{r=n.counts.entries,t.beforeCommit?.()}});return i.status===`rewritten`?{status:`compacted`,...n.counts,caughtUp:n.counts.entries-r,droppedTail:i.droppedTail,plainLinesAfter:i.plainLinesAfter,...i.catchUpFailed===void 0?{}:{catchUpFailed:i.catchUpFailed}}:i}function Kn(e){let t=e,n=[];for(;;)try{let e=Oe(t);return n.length===0?e:Re(e,...n.reverse())}catch{let r=M(t);if(r===t)return e;n.push(t.slice(r.length).replace(/^[\\/]/,``)),t=r}}function qn(e,t){let n=Le(e,t);return n===``||!n.startsWith(`..`)&&!Ie(n)}function Jn(e){return(t,n)=>{let r=Kn(e),i=Kn(Re(t??r,n));return qn(r,i)?i:void 0}}function Yn(e){typeof process>`u`||typeof process.on!=`function`||process.on(`exit`,e)}export{In as DEFAULT_PROMPT_HISTORY_BLOCK_BYTES,Jt as NodeExternalPayloadSource,Vn as NodePromptHistoryFile,Ht as NodeSessionLogSink,Yt as NodeSessionLogSource,Tt as NodeSessionStore,Fn as NodeToolResultSpillStore,W as SESSION_CLAIMS_DIRECTORY,G as StoredLines,Nt as StoredPayloads,vt as StoredSessionRecords,Q as ToolResultSpillError,U as assertSessionSealing,Qe as classifyStoredSessionBytes,Gn as compactPromptHistoryFile,zt as countPlainSessionLogLines,Jn as createNodeWorkspacePathResolver,ne as createProcessOperationLock,Un as inspectPromptHistoryFile,Ze as isPlainSessionRecordOf,En as migrateNodeSessionStore,wn as migrateSessionLogDirectory,Rn as parsePromptHistoryLine,Wn as readPromptHistoryProjects,Dn as readSessionStoreWorkingDirectories,Yn as registerProcessExitFlush,Bt as sealSessionLogText,It as sealStoredPayloadBytes,Ye as sealStoredSessionBytes,H as sessionSealingOf,K as splitStoredLines,Ft as storedPayloadMigrationState,Je as storedSessionMigrationState,Mn as sweepStaleToolResultSpillDirectories};
|
|
14
14
|
//# sourceMappingURL=node.js.map
|