blade-code 0.10.139 → 0.10.140

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 (129) hide show
  1. package/dist/blade.js +2 -2
  2. package/dist/{chunk-6qhbdcse.js → chunk-08z32sky.js} +2 -2
  3. package/dist/{chunk-mec8yedz.js → chunk-0c2y17xy.js} +1 -1
  4. package/dist/{chunk-x3c718v5.js → chunk-0kghtvxj.js} +2 -2
  5. package/dist/{chunk-3eskgvpy.js → chunk-0sx7ak0b.js} +1 -1
  6. package/dist/{chunk-sj4gz23a.js → chunk-15fpc0qg.js} +1 -1
  7. package/dist/{chunk-mtfjwsn2.js → chunk-19zsecpx.js} +2 -2
  8. package/dist/{chunk-7pg5y3pg.js → chunk-1myft5nb.js} +1 -1
  9. package/dist/chunk-1nreg14s.js +1 -0
  10. package/dist/{chunk-z9qv0d6k.js → chunk-2d3zksr0.js} +1 -1
  11. package/dist/{chunk-sdhdn0yx.js → chunk-2ff55pvt.js} +3 -3
  12. package/dist/{chunk-65c3vjwm.js → chunk-2g8avyq6.js} +1 -1
  13. package/dist/chunk-3kvt23m3.js +1 -0
  14. package/dist/chunk-4rh40xhc.js +1 -0
  15. package/dist/chunk-4xr4hz19.js +2 -0
  16. package/dist/{chunk-zz5n2qxk.js → chunk-50m1czz9.js} +1 -1
  17. package/dist/{chunk-earhezc8.js → chunk-5cw3bevx.js} +1 -1
  18. package/dist/{chunk-9m7d3ajv.js → chunk-5jq1mrqd.js} +1 -1
  19. package/dist/chunk-61yd46c0.js +1 -0
  20. package/dist/{chunk-8py443a5.js → chunk-6zxm9pen.js} +1 -1
  21. package/dist/{chunk-25r1v5rn.js → chunk-7eepxhcp.js} +34 -34
  22. package/dist/{chunk-jy7k2dwm.js → chunk-85b3kacc.js} +2 -2
  23. package/dist/chunk-8774agqd.js +1 -0
  24. package/dist/chunk-8brb7c6j.js +6 -0
  25. package/dist/{chunk-hrcz179j.js → chunk-8fx20am1.js} +2 -2
  26. package/dist/{chunk-16648v5c.js → chunk-8vqhcx3s.js} +1 -1
  27. package/dist/{chunk-6ezffjq1.js → chunk-9ced7jf0.js} +1 -1
  28. package/dist/chunk-abpmpyqa.js +1 -0
  29. package/dist/{chunk-yvmexv2c.js → chunk-ascjys4e.js} +1 -1
  30. package/dist/chunk-bb0z7c3g.js +1 -0
  31. package/dist/{chunk-5j68055h.js → chunk-c562kd2m.js} +1 -1
  32. package/dist/{chunk-bgzj85za.js → chunk-cf3dvysj.js} +1 -1
  33. package/dist/{chunk-bq6d0v5b.js → chunk-cww9pp1q.js} +2 -2
  34. package/dist/{chunk-7j4s1nrc.js → chunk-d1qe06f0.js} +1 -1
  35. package/dist/{chunk-40pd090k.js → chunk-e6j4vzta.js} +2 -2
  36. package/dist/{chunk-3ekz3zms.js → chunk-eh901zhx.js} +2 -2
  37. package/dist/{chunk-5w8pmsqe.js → chunk-eqe3smcg.js} +2 -2
  38. package/dist/{chunk-a5hkv8er.js → chunk-es0cbtx1.js} +2 -2
  39. package/dist/{chunk-gc4kj295.js → chunk-ffkzessq.js} +1 -1
  40. package/dist/{chunk-dv2m2xe5.js → chunk-g38d2ezm.js} +1 -1
  41. package/dist/{chunk-v2fewxvw.js → chunk-g4kydkyz.js} +2 -2
  42. package/dist/{chunk-qrv72yy6.js → chunk-g5scqxq3.js} +2 -2
  43. package/dist/{chunk-8rccn1y2.js → chunk-gq727fet.js} +1 -1
  44. package/dist/{chunk-5qwpdx3n.js → chunk-hj1yrssp.js} +1 -1
  45. package/dist/{chunk-d64b7wta.js → chunk-hvmrcd84.js} +1 -1
  46. package/dist/{chunk-zx78c1an.js → chunk-kmg8ad2j.js} +1 -1
  47. package/dist/{chunk-04t21rey.js → chunk-kxwc5wrx.js} +1 -1
  48. package/dist/chunk-m9dv5177.js +10 -0
  49. package/dist/{chunk-az08pq83.js → chunk-ma1mn6hn.js} +1 -1
  50. package/dist/{chunk-t88sfhjj.js → chunk-mnk0b4nz.js} +1 -1
  51. package/dist/chunk-mwgx87vw.js +1 -0
  52. package/dist/{chunk-cefmcwyv.js → chunk-n6tvswa8.js} +2 -2
  53. package/dist/{chunk-fbrdcveb.js → chunk-n8qg68y2.js} +1 -1
  54. package/dist/chunk-ntq4h4jh.js +1 -0
  55. package/dist/{chunk-1bqatrxs.js → chunk-nxsarfy6.js} +1 -1
  56. package/dist/{chunk-ft1bdqbs.js → chunk-pg7cgvs8.js} +2 -2
  57. package/dist/{chunk-1h3736q2.js → chunk-ppmy3n74.js} +219 -218
  58. package/dist/{chunk-grx6fv9w.js → chunk-pw9axk0e.js} +2 -2
  59. package/dist/{chunk-2jq9ed09.js → chunk-pwct7cj7.js} +1 -1
  60. package/dist/{chunk-esff371k.js → chunk-q9qts6bq.js} +2 -2
  61. package/dist/chunk-r324qme7.js +1 -0
  62. package/dist/{chunk-rhwkvx96.js → chunk-r4q06wbs.js} +1 -1
  63. package/dist/chunk-ra6ksfdy.js +1 -0
  64. package/dist/{chunk-dw0mewc2.js → chunk-rrtptbzv.js} +2 -2
  65. package/dist/{chunk-jb4hmk56.js → chunk-svsgtj41.js} +2 -2
  66. package/dist/{chunk-6j5v5emj.js → chunk-tagzy876.js} +6 -6
  67. package/dist/{chunk-516adpx6.js → chunk-tecbx0ek.js} +1 -1
  68. package/dist/chunk-tnts2de5.js +1 -0
  69. package/dist/chunk-w0710yj4.js +1 -0
  70. package/dist/{chunk-npc7jt96.js → chunk-w2m4yczv.js} +1 -1
  71. package/dist/{chunk-mh3ne2sf.js → chunk-w5057h27.js} +2 -2
  72. package/dist/chunk-we13xwds.js +180 -0
  73. package/dist/{chunk-f4cn6v8t.js → chunk-xagh2qb6.js} +2 -2
  74. package/dist/{chunk-05cv54r8.js → chunk-y5bqd8gh.js} +1 -1
  75. package/dist/{chunk-awheqy52.js → chunk-zfaenqqx.js} +2 -2
  76. package/dist/chunk-zp5097qk.js +2 -0
  77. package/dist/web/assets/ChatView-BlAGPVC-.js +63 -0
  78. package/dist/web/assets/{CodeBlockHighlighter-CYhxXWvb.js → CodeBlockHighlighter-BM1MZv6w.js} +1 -1
  79. package/dist/web/assets/{FilePreview-ByTaE1GR.js → FilePreview-P77KS9tr.js} +1 -1
  80. package/dist/web/assets/{KanbanBoard-KMmGvNPc.js → KanbanBoard-B0c7sE2y.js} +1 -1
  81. package/dist/web/assets/{MarkdownRenderer-C6lKOJaG.js → MarkdownRenderer-DHa0FqU0.js} +3 -3
  82. package/dist/web/assets/{ScrollArea-Bo6cZ3PH.js → ScrollArea-C6yf2fqq.js} +1 -1
  83. package/dist/web/assets/{SessionHistorySurface-Cymc4xw0.js → SessionHistorySurface-CXYBWqlN.js} +1 -1
  84. package/dist/web/assets/{SettingsModal-D36xhHwa.js → SettingsModal-BVjVlENY.js} +1 -1
  85. package/dist/web/assets/{Sidebar-DEGQINYb.js → Sidebar-DDW9Xs6e.js} +1 -1
  86. package/dist/web/assets/{TaskSwitcher-BEISb7-8.js → TaskSwitcher-D74_5q1F.js} +1 -1
  87. package/dist/web/assets/{TerminalPanel-B7PXaRGh.js → TerminalPanel-DNEKapEi.js} +1 -1
  88. package/dist/web/assets/{archive-Dyn5Oz68.js → archive-Ao0WD7pU.js} +1 -1
  89. package/dist/web/assets/{arrow-left-mWU3P1zb.js → arrow-left-a5_iLemp.js} +1 -1
  90. package/dist/web/assets/{calendar-clock-B6b0Cb3d.js → calendar-clock-BKbdz6Cu.js} +1 -1
  91. package/dist/web/assets/{chevron-right-Cl6g5_0e.js → chevron-right-8qYRfCj4.js} +1 -1
  92. package/dist/web/assets/{chevrons-up-down-FKryGzO4.js → chevrons-up-down-BXNG4GvK.js} +1 -1
  93. package/dist/web/assets/{clock-3-CfVjvMmA.js → clock-3-DEL1ixyh.js} +1 -1
  94. package/dist/web/assets/{copy-CIYuf7du.js → copy-Bd5v-KkM.js} +1 -1
  95. package/dist/web/assets/{download-DecDFX8n.js → download-CIKvpDBW.js} +1 -1
  96. package/dist/web/assets/{external-link-DaSwvjf7.js → external-link-B33h3DQN.js} +1 -1
  97. package/dist/web/assets/{folder-DZtlKvFm.js → folder-lOczceoh.js} +1 -1
  98. package/dist/web/assets/index-hZ37pkxs.js +203 -0
  99. package/dist/web/assets/{pause-Bd-STGLc.js → pause-nnvVbgsj.js} +1 -1
  100. package/dist/web/assets/{pencil-BoTIqqxX.js → pencil-_yfoOmUq.js} +1 -1
  101. package/dist/web/assets/{play-C4ctis0t.js → play-BilJ7SDs.js} +1 -1
  102. package/dist/web/assets/{plus-D08TlGJu.js → plus-BqqpYKaK.js} +1 -1
  103. package/dist/web/assets/{session-events-DKjIMNKI.js → session-events-FPOvcMBw.js} +19 -19
  104. package/dist/web/assets/{settings-BGRhMFaU.js → settings-CmJXtYTH.js} +1 -1
  105. package/dist/web/assets/{team-CPme0l2K.js → team-Bb04o2Tb.js} +1 -1
  106. package/dist/web/assets/{teamService-CVCtTVfY.js → teamService-B5w9cpsa.js} +1 -1
  107. package/dist/web/assets/{terminal-D7GsyYki.js → terminal-DOjdChj0.js} +1 -1
  108. package/dist/web/index.html +1 -1
  109. package/package.json +1 -1
  110. package/dist/chunk-2agbk8ef.js +0 -1
  111. package/dist/chunk-2bty4510.js +0 -6
  112. package/dist/chunk-2f7nr9hh.js +0 -1
  113. package/dist/chunk-2t9vtt75.js +0 -1
  114. package/dist/chunk-3aaehgva.js +0 -1
  115. package/dist/chunk-3t5r41yh.js +0 -1
  116. package/dist/chunk-5xgyx25z.js +0 -2
  117. package/dist/chunk-gjc1hhhv.js +0 -1
  118. package/dist/chunk-gx4seq5c.js +0 -10
  119. package/dist/chunk-h2gp7smy.js +0 -1
  120. package/dist/chunk-mc2mr1kn.js +0 -2
  121. package/dist/chunk-mkckss82.js +0 -1
  122. package/dist/chunk-ntpwqfy3.js +0 -1
  123. package/dist/chunk-q82ntq7t.js +0 -1
  124. package/dist/chunk-recafw5r.js +0 -171
  125. package/dist/chunk-smjfqtws.js +0 -1
  126. package/dist/chunk-wazhd8bm.js +0 -1
  127. package/dist/chunk-wf4s1hp2.js +0 -1
  128. package/dist/web/assets/ChatView-CQnuGDqk.js +0 -63
  129. package/dist/web/assets/index-DQaqO-lw.js +0 -203
@@ -1,4 +1,4 @@
1
- import"./chunk-v508x7cg.js";import{Ji as Q}from"./chunk-40pd090k.js";import"./chunk-npc7jt96.js";import"./chunk-mc2mr1kn.js";import{Vi as L}from"./chunk-dv2m2xe5.js";import"./chunk-fbrdcveb.js";import"./chunk-ft1bdqbs.js";import"./chunk-jb4hmk56.js";import"./chunk-65c3vjwm.js";import"./chunk-mtfjwsn2.js";import"./chunk-jy7k2dwm.js";import"./chunk-earhezc8.js";import"./chunk-t88sfhjj.js";import{Ek as F}from"./chunk-516adpx6.js";var K=[22,19,0];function T(G){let A=/^v?(\d+)\.(\d+)\.(\d+)/.exec(G);if(!A)return!1;let H=A.slice(1).map(Number);for(let z=0;z<K.length;z++){let B=H[z]??0,J=K[z];if(B!==J)return B>J}return!0}var X={command:"doctor",describe:"Check the health of your Blade installation",builder:(G)=>G.option("rebuild-index",{type:"boolean",default:!1,describe:"Rebuild the SQLite session index from JSONL transcripts"}),handler:async(G)=>{if(G.rebuildIndex){console.log(`Rebuilding session index from JSONL transcripts...
2
- `);try{let{rebuildProjectionIndex:z}=await import("./chunk-8py443a5.js"),{SessionService:B}=await import("./chunk-2agbk8ef.js"),J=await z(B.projectionDeriverForSearch());if(J===null)console.log("[WARN] Session index unavailable (SQLite driver missing); reads fall back to JSONL scan.");else console.log(`[OK] Session index rebuilt: ${J} session(s) indexed.`)}catch(z){console.log("[FAIL] Session index rebuild failed"),console.log(` Error: ${z instanceof Error?z.message:"未知错误"}`),process.exit(1)}return}console.log(`Running Blade health check...
1
+ import"./chunk-v508x7cg.js";import{Mi as Q}from"./chunk-e6j4vzta.js";import"./chunk-w2m4yczv.js";import"./chunk-zp5097qk.js";import{Yi as L}from"./chunk-g38d2ezm.js";import"./chunk-n8qg68y2.js";import"./chunk-pg7cgvs8.js";import"./chunk-svsgtj41.js";import"./chunk-2g8avyq6.js";import"./chunk-19zsecpx.js";import"./chunk-85b3kacc.js";import"./chunk-5cw3bevx.js";import"./chunk-mnk0b4nz.js";import{Hk as F}from"./chunk-tecbx0ek.js";var K=[22,19,0];function T(G){let A=/^v?(\d+)\.(\d+)\.(\d+)/.exec(G);if(!A)return!1;let H=A.slice(1).map(Number);for(let z=0;z<K.length;z++){let B=H[z]??0,J=K[z];if(B!==J)return B>J}return!0}var X={command:"doctor",describe:"Check the health of your Blade installation",builder:(G)=>G.option("rebuild-index",{type:"boolean",default:!1,describe:"Rebuild the SQLite session index from JSONL transcripts"}),handler:async(G)=>{if(G.rebuildIndex){console.log(`Rebuilding session index from JSONL transcripts...
2
+ `);try{let{rebuildProjectionIndex:z}=await import("./chunk-6zxm9pen.js"),{SessionService:B}=await import("./chunk-mwgx87vw.js"),J=await z(B.projectionDeriverForSearch());if(J===null)console.log("[WARN] Session index unavailable (SQLite driver missing); reads fall back to JSONL scan.");else console.log(`[OK] Session index rebuilt: ${J} session(s) indexed.`)}catch(z){console.log("[FAIL] Session index rebuild failed"),console.log(` Error: ${z instanceof Error?z.message:"未知错误"}`),process.exit(1)}return}console.log(`Running Blade health check...
3
3
  `);let A=0;try{await Q.getInstance().initialize(),console.log("[OK] Configuration: OK")}catch(z){console.log("[FAIL] Configuration: FAILED"),console.log(` Error: ${z instanceof Error?z.message:"未知错误"}`),A++}let H=process.version;if(T(H))console.log(`[OK] Node.js version: ${H}`);else console.log(`[WARN] Node.js version: ${H} (required: >=22.19.0)`),A++;try{let z=await import("fs/promises"),B=L();await z.access(B,(await import("fs")).constants.R_OK|(await import("fs")).constants.W_OK),console.log("[OK] File system permissions: OK")}catch(z){console.log("[FAIL] File system permissions: FAILED"),console.log(" Error: Cannot read/write in current directory"),A++}try{await import("ink"),console.log("[OK] Dependencies: OK")}catch(z){console.log("[FAIL] Dependencies: FAILED"),console.log(" Error: Missing required dependencies"),A++}if(console.log(`
4
4
  Health Check Summary:`),A===0)console.log("All checks passed! Blade is ready to use.");else console.log(`Warning: Found ${A} issue(s). Please resolve them for optimal performance.`),process.exit(1)}};export{T as isSupportedNodeVersion,X as doctorCommands};
@@ -1 +1 @@
1
- import"./chunk-516adpx6.js";var d={command:"install [target]",describe:"Install Blade native build. Use [target] to specify version (stable, latest, or specific version)",builder:(b)=>{return b.positional("target",{describe:"Version to install",type:"string",default:"stable",choices:["stable","latest"]}).option("force",{type:"boolean",describe:"Force reinstall",default:!1}).example([["$0 install","Install stable version"],["$0 install latest","Install latest version"],["$0 install --force","Force reinstall stable version"]])},handler:async(b)=>{console.log(`Installing Blade ${b.target}...`);try{if(b.force)console.log("Force reinstall enabled");console.log("Downloading..."),console.log("Installing..."),console.log("Installation completed successfully")}catch(c){console.error(`Error: Installation failed: ${c instanceof Error?c.message:"未知错误"}`),process.exit(1)}}};export{d as installCommands};
1
+ import"./chunk-tecbx0ek.js";var d={command:"install [target]",describe:"Install Blade native build. Use [target] to specify version (stable, latest, or specific version)",builder:(b)=>{return b.positional("target",{describe:"Version to install",type:"string",default:"stable",choices:["stable","latest"]}).option("force",{type:"boolean",describe:"Force reinstall",default:!1}).example([["$0 install","Install stable version"],["$0 install latest","Install latest version"],["$0 install --force","Force reinstall stable version"]])},handler:async(b)=>{console.log(`Installing Blade ${b.target}...`);try{if(b.force)console.log("Force reinstall enabled");console.log("Downloading..."),console.log("Installing..."),console.log("Installation completed successfully")}catch(c){console.error(`Error: Installation failed: ${c instanceof Error?c.message:"未知错误"}`),process.exit(1)}}};export{d as installCommands};
@@ -1,2 +1,2 @@
1
- import{si as H,ti as I}from"./chunk-40pd090k.js";import{Mutex as J}from"async-mutex";class B extends Error{limit;resource="resident_runtimes";retryable=!0;constructor(b){super("Session runtime capacity is full");this.limit=b;this.name="SessionRuntimeCapacityError"}}class D extends Error{constructor(){super("Session runtime residency is closed");this.name="SessionRuntimeResidencyClosedError"}}class A extends Error{constructor(b){super(`Session runtime residency already owns key: ${b}`);this.name="SessionRuntimeResidencyConflictError"}}class K{maxResident;idleMs;now;residents=new Map;reservations=new Map;operations=new J;nextGeneration=1;closed=!1;constructor(b){if(!H(b.maxResident))throw Error("Invalid max resident Session Runtime limit");if(!I(b.idleMs))throw Error("Invalid Session Runtime idle timeout");this.maxResident=b.maxResident,this.idleMs=b.idleMs,this.now=b.now??Date.now}acquire(b){let j=this.residents.get(b);if(!j||j.poisoned)return;return j.pins++,j.lastUsedAt=this.now(),this.createLease(j)}owns(b,j){let q=this.residents.get(b);return Boolean(q&&(j===void 0||q.value===j))}async reserve(b,j){if(!b.trim())throw Error("Session runtime residency key must not be blank");return this.operations.runExclusive(async()=>{if(this.closed)throw new D;if(this.residents.has(b)||this.reservations.has(b))throw new A(b);while(this.retainedCount()>=this.maxResident){if(!j.allowEviction)throw new B(this.maxResident);let z=this.oldestEvictableWebResident();if(!z)throw new B(this.maxResident);await this.disposeResident(z,!0)}let q={generation:this.allocateGeneration(),surface:j.surface};return this.reservations.set(b,q),this.createReservation(b,q)})}async remove(b,j){return this.operations.runExclusive(async()=>{let q=this.residents.get(b);if(!q||j!==void 0&&q.value!==j)return!1;if(q.pins>0)return!1;return await this.disposeResident(q,!0),!0})}async forget(b,j){return this.operations.runExclusive(async()=>{let q=this.residents.get(b);if(!q||j!==void 0&&q.value!==j||q.pins>0)return!1;return this.residents.delete(b),!0})}async sweepIdle(){return this.operations.runExclusive(async()=>{if(this.closed)return 0;let b=0;while(!0){let j=this.oldestIdleWebResident();if(!j)return b;await this.disposeResident(j,!0),b++}})}async disposeAll(){await this.operations.runExclusive(async()=>{this.closed=!0,this.reservations.clear();let b;for(let j of[...this.residents.values()])try{await this.disposeResident(j,!1)}catch(q){b??=q}if(this.residents.clear(),b!==void 0)throw b})}getStats(){let b=0;for(let j of this.residents.values())if(j.pins>0)b++;return{resident:this.residents.size,reserved:this.reservations.size,pinned:b,maxResident:this.maxResident}}retainedCount(){return this.residents.size+this.reservations.size}allocateGeneration(){let b=this.nextGeneration;return this.nextGeneration=this.nextGeneration===Number.MAX_SAFE_INTEGER?1:this.nextGeneration+1,b}createReservation(b,j){let q=!1;return{commit:(z)=>{if(q)throw new A(b);if(z.key!==b||z.surface!==j.surface||this.reservations.get(b)!==j||this.closed)throw this.reservations.delete(b),q=!0,this.closed?new D:new A(b);this.reservations.delete(b);let G={...z,generation:j.generation,pins:1,lastUsedAt:this.now(),poisoned:!1};return this.residents.set(b,G),q=!0,this.createLease(G)},cancel:()=>{if(q)return;if(this.reservations.get(b)===j)this.reservations.delete(b);q=!0}}}createLease(b){let j=!1;return{value:b.value,release:()=>{if(j)return;j=!0;let q=this.residents.get(b.key);if(q!==b||q.generation!==b.generation)return;q.pins=Math.max(0,q.pins-1),q.lastUsedAt=this.now()}}}oldestEvictableWebResident(){return this.sortedWebResidents().find((b)=>this.canEvict(b))}oldestIdleWebResident(){let b=this.now();return this.sortedWebResidents().find((j)=>b-j.lastUsedAt>=this.idleMs&&this.canEvict(j))}sortedWebResidents(){return[...this.residents.values()].filter((b)=>b.surface==="web").sort((b,j)=>b.lastUsedAt-j.lastUsedAt||b.generation-j.generation)}canEvict(b){if(b.pins>0||b.poisoned)return!1;try{return b.canEvict()}catch{return!1}}async disposeResident(b,j){if(this.residents.get(b.key)!==b)return;this.residents.delete(b.key);try{await b.dispose()}catch(q){if(j&&!this.closed&&!this.residents.has(b.key))b.lastUsedAt=this.now(),b.poisoned=!0,this.residents.set(b.key,b);throw q}}}
1
+ import{vi as H,wi as I}from"./chunk-e6j4vzta.js";import{Mutex as J}from"async-mutex";class B extends Error{limit;resource="resident_runtimes";retryable=!0;constructor(b){super("Session runtime capacity is full");this.limit=b;this.name="SessionRuntimeCapacityError"}}class D extends Error{constructor(){super("Session runtime residency is closed");this.name="SessionRuntimeResidencyClosedError"}}class A extends Error{constructor(b){super(`Session runtime residency already owns key: ${b}`);this.name="SessionRuntimeResidencyConflictError"}}class K{maxResident;idleMs;now;residents=new Map;reservations=new Map;operations=new J;nextGeneration=1;closed=!1;constructor(b){if(!H(b.maxResident))throw Error("Invalid max resident Session Runtime limit");if(!I(b.idleMs))throw Error("Invalid Session Runtime idle timeout");this.maxResident=b.maxResident,this.idleMs=b.idleMs,this.now=b.now??Date.now}acquire(b){let j=this.residents.get(b);if(!j||j.poisoned)return;return j.pins++,j.lastUsedAt=this.now(),this.createLease(j)}owns(b,j){let q=this.residents.get(b);return Boolean(q&&(j===void 0||q.value===j))}async reserve(b,j){if(!b.trim())throw Error("Session runtime residency key must not be blank");return this.operations.runExclusive(async()=>{if(this.closed)throw new D;if(this.residents.has(b)||this.reservations.has(b))throw new A(b);while(this.retainedCount()>=this.maxResident){if(!j.allowEviction)throw new B(this.maxResident);let z=this.oldestEvictableWebResident();if(!z)throw new B(this.maxResident);await this.disposeResident(z,!0)}let q={generation:this.allocateGeneration(),surface:j.surface};return this.reservations.set(b,q),this.createReservation(b,q)})}async remove(b,j){return this.operations.runExclusive(async()=>{let q=this.residents.get(b);if(!q||j!==void 0&&q.value!==j)return!1;if(q.pins>0)return!1;return await this.disposeResident(q,!0),!0})}async forget(b,j){return this.operations.runExclusive(async()=>{let q=this.residents.get(b);if(!q||j!==void 0&&q.value!==j||q.pins>0)return!1;return this.residents.delete(b),!0})}async sweepIdle(){return this.operations.runExclusive(async()=>{if(this.closed)return 0;let b=0;while(!0){let j=this.oldestIdleWebResident();if(!j)return b;await this.disposeResident(j,!0),b++}})}async disposeAll(){await this.operations.runExclusive(async()=>{this.closed=!0,this.reservations.clear();let b;for(let j of[...this.residents.values()])try{await this.disposeResident(j,!1)}catch(q){b??=q}if(this.residents.clear(),b!==void 0)throw b})}getStats(){let b=0;for(let j of this.residents.values())if(j.pins>0)b++;return{resident:this.residents.size,reserved:this.reservations.size,pinned:b,maxResident:this.maxResident}}retainedCount(){return this.residents.size+this.reservations.size}allocateGeneration(){let b=this.nextGeneration;return this.nextGeneration=this.nextGeneration===Number.MAX_SAFE_INTEGER?1:this.nextGeneration+1,b}createReservation(b,j){let q=!1;return{commit:(z)=>{if(q)throw new A(b);if(z.key!==b||z.surface!==j.surface||this.reservations.get(b)!==j||this.closed)throw this.reservations.delete(b),q=!0,this.closed?new D:new A(b);this.reservations.delete(b);let G={...z,generation:j.generation,pins:1,lastUsedAt:this.now(),poisoned:!1};return this.residents.set(b,G),q=!0,this.createLease(G)},cancel:()=>{if(q)return;if(this.reservations.get(b)===j)this.reservations.delete(b);q=!0}}}createLease(b){let j=!1;return{value:b.value,release:()=>{if(j)return;j=!0;let q=this.residents.get(b.key);if(q!==b||q.generation!==b.generation)return;q.pins=Math.max(0,q.pins-1),q.lastUsedAt=this.now()}}}oldestEvictableWebResident(){return this.sortedWebResidents().find((b)=>this.canEvict(b))}oldestIdleWebResident(){let b=this.now();return this.sortedWebResidents().find((j)=>b-j.lastUsedAt>=this.idleMs&&this.canEvict(j))}sortedWebResidents(){return[...this.residents.values()].filter((b)=>b.surface==="web").sort((b,j)=>b.lastUsedAt-j.lastUsedAt||b.generation-j.generation)}canEvict(b){if(b.pins>0||b.poisoned)return!1;try{return b.canEvict()}catch{return!1}}async disposeResident(b,j){if(this.residents.get(b.key)!==b)return;this.residents.delete(b.key);try{await b.dispose()}catch(q){if(j&&!this.closed&&!this.residents.has(b.key))b.lastUsedAt=this.now(),b.poisoned=!0,this.residents.set(b.key,b);throw q}}}
2
2
  export{B as v,K as w};
@@ -1,2 +1,2 @@
1
1
  import{clampThinkingLevel as t,getSupportedThinkingLevels as i}from"@earendil-works/pi-ai";var f=["auto","off","minimal","low","medium","high","xhigh","max"];function s(e){return typeof e==="string"&&f.includes(e)}function g(e,o){let n=i(e);if(o!=="auto"&&!n.includes(o))throw Error(`Reasoning effort ${o} is not supported by ${e.name}`);return{selection:o,effective:o==="auto"?t(e,"high"):o,supported:n}}
2
- export{s as pg,g as qg};
2
+ export{s as sg,g as tg};
@@ -1,2 +1,2 @@
1
1
  var q;((h)=>{h.ReadOnly="readonly";h.Write="write";h.Execute="execute"})(q||={});function w(b){return b!==void 0&&typeof b.pattern==="string"&&typeof b.search_path==="string"}function z(b){return b!==void 0&&b.kind==="edit"&&typeof b.matches_found==="number"}var j=Symbol("blade.tool-result-model-images");function B(b,c){return Object.defineProperty(b,j,{value:c,enumerable:!1,configurable:!1,writable:!1}),b}function v(b){return b[j]}function C(b,c){let f=b.success?v(b):void 0;return f&&f.length>0?[{type:"text",text:c},...f]:c}function F(b){return b==="readonly"}
2
- export{q as ce,w as de,z as ee,B as fe,C as ge,F as he};
2
+ export{q as fe,w as ge,z as he,B as ie,C as je,F as ke};
@@ -1,2 +1,2 @@
1
- import{Pj as S}from"./chunk-mtfjwsn2.js";import{Ek as f}from"./chunk-516adpx6.js";import*as $ from"fs/promises";import*as K from"path";import j from"semver";import{ProxyAgent as H,fetch as I}from"undici";function R(){return process.env.HTTPS_PROXY||process.env.HTTP_PROXY||process.env.https_proxy||process.env.http_proxy}function N(){let q=R();if(q)try{return new H(q)}catch(z){console.warn(`[proxyFetch] Invalid proxy URL: ${q}`)}return}async function M(q,z={}){let{timeout:W=30000,signal:Q,...B}=z;if(Q?.aborted)throw new DOMException("The operation was aborted.","AbortError");let J=N(),X=new AbortController,Y=!1,F=setTimeout(()=>{Y=!0,X.abort()},W),b=()=>X.abort();Q?.addEventListener("abort",b);try{let Z={method:B.method,headers:B.headers,body:B.body,signal:X.signal,dispatcher:J};return await I(q.toString(),Z)}catch(Z){if(Z instanceof Error&&Z.name==="AbortError"){if(Y)throw Error(`Request timeout after ${W}ms`);throw Z}throw Z}finally{clearTimeout(F),Q?.removeEventListener("abort",b)}}var w="blade-code",y="https://cdn.jsdelivr.net/npm/blade-code@latest/CHANGELOG.md",G=K.join(process.env.HOME||process.env.USERPROFILE||".",".blade"),O=K.join(G,"version-cache.json"),P=3600000,k=`https://registry.npmjs.org/${w}/latest`;async function L(){try{if(process.env.BLADE_VERSION)return process.env.BLADE_VERSION;return S()}catch{return"unknown"}}async function T(){try{let q=await $.readFile(O,"utf-8"),z=JSON.parse(q);if(Date.now()-z.checkedAt<P)return z;return{...z,checkedAt:0}}catch{return null}}async function D(q){try{await $.mkdir(G,{recursive:!0,mode:493}),await $.writeFile(O,JSON.stringify(q,null,2))}catch{}}async function x(){try{let q=await M(k,{timeout:5000,headers:{Accept:"application/json"}});if(!q.ok)return null;return(await q.json()).version||null}catch{return null}}async function _(q=!1){let z=await L(),W=y;if(z==="unknown")return{currentVersion:z,latestVersion:null,hasUpdate:!1,shouldPrompt:!1,releaseNotesUrl:W,error:"Unable to determine current version"};let Q=await T(),B=Q?.skipUntilVersion,J=null;if(!q&&Q?.latestVersion&&Q.checkedAt>0)J=Q.latestVersion;else if(J=await x(),J)await D({latestVersion:J,checkedAt:Date.now(),skipUntilVersion:B});else if(Q?.latestVersion)await D({checkedAt:0,skipUntilVersion:B});if(!J||!j.valid(J))return{currentVersion:z,latestVersion:null,hasUpdate:!1,shouldPrompt:!1,releaseNotesUrl:W,error:"Unable to check for updates"};if(j.lt(J,z))J=z,await D({latestVersion:J,checkedAt:Date.now(),skipUntilVersion:B});let X=j.gt(J,z),Y=X;if(X&&B)Y=j.gt(J,B);return{currentVersion:z,latestVersion:J,hasUpdate:X,shouldPrompt:Y,releaseNotesUrl:W}}async function u(q){let z=await T();await D({latestVersion:z?.latestVersion??q,checkedAt:z?.checkedAt||Date.now(),skipUntilVersion:q})}function g(){return`npm install -g ${w}@latest --registry https://registry.npmjs.org`}async function C(){let{spawn:q}=await import("child_process");return new Promise((z)=>{let W=g(),Q=q(W,{stdio:"inherit",shell:!0});Q.on("close",(B)=>{if(B===0)z({success:!0,message:"Upgrade successful! Please restart blade."});else z({success:!1,message:`Upgrade failed (exit code: ${B})`})}),Q.on("error",(B)=>{z({success:!1,message:`Upgrade failed: ${B.message}`})})})}async function V(){try{let q=await _();return q.shouldPrompt?q:null}catch{return null}}
1
+ import{Sj as S}from"./chunk-19zsecpx.js";import{Hk as f}from"./chunk-tecbx0ek.js";import*as $ from"fs/promises";import*as K from"path";import j from"semver";import{ProxyAgent as H,fetch as I}from"undici";function R(){return process.env.HTTPS_PROXY||process.env.HTTP_PROXY||process.env.https_proxy||process.env.http_proxy}function N(){let q=R();if(q)try{return new H(q)}catch(z){console.warn(`[proxyFetch] Invalid proxy URL: ${q}`)}return}async function M(q,z={}){let{timeout:W=30000,signal:Q,...B}=z;if(Q?.aborted)throw new DOMException("The operation was aborted.","AbortError");let J=N(),X=new AbortController,Y=!1,F=setTimeout(()=>{Y=!0,X.abort()},W),b=()=>X.abort();Q?.addEventListener("abort",b);try{let Z={method:B.method,headers:B.headers,body:B.body,signal:X.signal,dispatcher:J};return await I(q.toString(),Z)}catch(Z){if(Z instanceof Error&&Z.name==="AbortError"){if(Y)throw Error(`Request timeout after ${W}ms`);throw Z}throw Z}finally{clearTimeout(F),Q?.removeEventListener("abort",b)}}var w="blade-code",y="https://cdn.jsdelivr.net/npm/blade-code@latest/CHANGELOG.md",G=K.join(process.env.HOME||process.env.USERPROFILE||".",".blade"),O=K.join(G,"version-cache.json"),P=3600000,k=`https://registry.npmjs.org/${w}/latest`;async function L(){try{if(process.env.BLADE_VERSION)return process.env.BLADE_VERSION;return S()}catch{return"unknown"}}async function T(){try{let q=await $.readFile(O,"utf-8"),z=JSON.parse(q);if(Date.now()-z.checkedAt<P)return z;return{...z,checkedAt:0}}catch{return null}}async function D(q){try{await $.mkdir(G,{recursive:!0,mode:493}),await $.writeFile(O,JSON.stringify(q,null,2))}catch{}}async function x(){try{let q=await M(k,{timeout:5000,headers:{Accept:"application/json"}});if(!q.ok)return null;return(await q.json()).version||null}catch{return null}}async function _(q=!1){let z=await L(),W=y;if(z==="unknown")return{currentVersion:z,latestVersion:null,hasUpdate:!1,shouldPrompt:!1,releaseNotesUrl:W,error:"Unable to determine current version"};let Q=await T(),B=Q?.skipUntilVersion,J=null;if(!q&&Q?.latestVersion&&Q.checkedAt>0)J=Q.latestVersion;else if(J=await x(),J)await D({latestVersion:J,checkedAt:Date.now(),skipUntilVersion:B});else if(Q?.latestVersion)await D({checkedAt:0,skipUntilVersion:B});if(!J||!j.valid(J))return{currentVersion:z,latestVersion:null,hasUpdate:!1,shouldPrompt:!1,releaseNotesUrl:W,error:"Unable to check for updates"};if(j.lt(J,z))J=z,await D({latestVersion:J,checkedAt:Date.now(),skipUntilVersion:B});let X=j.gt(J,z),Y=X;if(X&&B)Y=j.gt(J,B);return{currentVersion:z,latestVersion:J,hasUpdate:X,shouldPrompt:Y,releaseNotesUrl:W}}async function u(q){let z=await T();await D({latestVersion:z?.latestVersion??q,checkedAt:z?.checkedAt||Date.now(),skipUntilVersion:q})}function g(){return`npm install -g ${w}@latest --registry https://registry.npmjs.org`}async function C(){let{spawn:q}=await import("child_process");return new Promise((z)=>{let W=g(),Q=q(W,{stdio:"inherit",shell:!0});Q.on("close",(B)=>{if(B===0)z({success:!0,message:"Upgrade successful! Please restart blade."});else z({success:!1,message:`Upgrade failed (exit code: ${B})`})}),Q.on("error",(B)=>{z({success:!1,message:`Upgrade failed: ${B.message}`})})})}async function V(){try{let q=await _();return q.shouldPrompt?q:null}catch{return null}}
2
2
  export{_ as k,u as l,g as m,C as n,V as o};
@@ -0,0 +1,10 @@
1
+ import{a as T,b as W,c as X,d as Y}from"./chunk-tagzy876.js";import"./chunk-50m1czz9.js";import"./chunk-5jq1mrqd.js";import"./chunk-hj1yrssp.js";import"./chunk-cf3dvysj.js";import"./chunk-15fpc0qg.js";import"./chunk-ppmy3n74.js";import"./chunk-8vqhcx3s.js";import"./chunk-pwct7cj7.js";import"./chunk-4xr4hz19.js";import"./chunk-we13xwds.js";import"./chunk-0sx7ak0b.js";import"./chunk-n6tvswa8.js";import"./chunk-kmg8ad2j.js";import"./chunk-es0cbtx1.js";import"./chunk-zfaenqqx.js";import{vf as R}from"./chunk-eh901zhx.js";import"./chunk-08z32sky.js";import{Rf as Q}from"./chunk-0kghtvxj.js";import"./chunk-v508x7cg.js";import"./chunk-c562kd2m.js";import"./chunk-pw9axk0e.js";import"./chunk-cww9pp1q.js";import"./chunk-8fx20am1.js";import"./chunk-hvmrcd84.js";import"./chunk-eqe3smcg.js";import"./chunk-xagh2qb6.js";import"./chunk-ascjys4e.js";import"./chunk-r4q06wbs.js";import"./chunk-ma1mn6hn.js";import"./chunk-2ff55pvt.js";import"./chunk-nxsarfy6.js";import"./chunk-e6j4vzta.js";import"./chunk-w2m4yczv.js";import"./chunk-zp5097qk.js";import"./chunk-g38d2ezm.js";import"./chunk-n8qg68y2.js";import"./chunk-pg7cgvs8.js";import"./chunk-svsgtj41.js";import"./chunk-2g8avyq6.js";import{Sj as M}from"./chunk-19zsecpx.js";import"./chunk-85b3kacc.js";import"./chunk-5cw3bevx.js";import"./chunk-mnk0b4nz.js";import"./chunk-tecbx0ek.js";import m from"chalk";import K from"open";var A=`
2
+ ____ _ _
3
+ | __ )| | __ _ __| | ___
4
+ | _ \\| |/ _\` |/ _\` |/ _ \\
5
+ | |_) | | (_| | (_| | __/
6
+ |____/|_|\\__,_|\\__,_|\\___|
7
+ `,C={command:"web",describe:"Start Blade server and open web interface",builder:T,handler:async(Z)=>{let H=W(Z);if(await Q(),!process.env.BLADE_SERVER_PASSWORD)console.log(m.yellow("[WARN] BLADE_SERVER_PASSWORD is not set; server is unsecured.")),console.log(m.gray(` Set this environment variable to enable Basic Auth.
8
+ `));let F=await Y.listenAsync(H);if(console.log(m.cyan(A)),console.log(m.gray(` v${M()}
9
+ `)),H.hostname==="0.0.0.0"){let q=`http://localhost:${F.port}`;console.log(m.blue.bold(" Local access: "),m.white(q));let x=X();for(let z of x)console.log(m.blue.bold(" Network access: "),m.white(`http://${z}:${F.port}`));K(q).catch(()=>{})}else{let q=F.url.toString();console.log(m.blue.bold(" Web interface: "),m.white(q)),K(q).catch(()=>{})}console.log(""),console.log(m.gray(` Press Ctrl+C to stop the server.
10
+ `));let J,$=new Promise((q)=>{J=q}),b=R(async()=>{await F.stop(),J()});try{await $}finally{b(),await F.stop()}}};export{C as webCommand};
@@ -1,2 +1,2 @@
1
1
  function v(b){switch(b){case"default":case"ignore":case void 0:return"default";case"acceptEdits":return"autoEdit";case"dontAsk":case"bypassPermissions":return"yolo";case"plan":return"plan";default:return"default"}}
2
- export{v as oh};
2
+ export{v as rh};
@@ -1,2 +1,2 @@
1
1
  import*as z from"node:os";import*as x from"node:path";function F(){return process.env.BLADE_STORAGE_ROOT||x.join(z.homedir(),".blade")}import{AsyncLocalStorage as Lq}from"node:async_hooks";import{createHash as Vq}from"node:crypto";import{lstat as L,mkdir as Cq,readdir as bq,realpath as N}from"node:fs/promises";import Z from"node:path";import{createHash as Gq}from"node:crypto";var E=new WeakSet,j=new WeakSet,Jq={"not-absolute":"ACP remote file path must be absolute","style-mismatch":"ACP remote file path does not match the expected style","drive-relative":"ACP remote file path cannot be drive-relative","root-relative":"ACP remote file path cannot be root-relative","unc-not-supported":"ACP remote file path must be absolute; UNC paths are not supported","device-namespace-not-supported":"ACP remote file path device namespaces are not supported","trailing-dot-or-space":"ACP remote file path components cannot end with a dot or space","alternate-data-stream":"ACP remote file path alternate data streams are not supported","reserved-device-name":"ACP remote file path reserved device names are not supported","short-name-alias":"ACP remote file path short-name aliases are not supported","invalid-character":"ACP remote file path contains characters that are not supported"},Oq=new Set(["CON","PRN","AUX","NUL","CONIN$","CONOUT$","COM1","COM2","COM3","COM4","COM5","COM6","COM7","COM8","COM9","LPT1","LPT2","LPT3","LPT4","LPT5","LPT6","LPT7","LPT8","LPT9","COM¹","COM²","COM³","LPT¹","LPT²","LPT³"]);class _ extends Error{reason;style;name="AcpRemotePathError";code="acp_remote_path_invalid";constructor(q,G){super(Jq[q]);this.reason=q;this.style=G;Object.setPrototypeOf(this,new.target.prototype)}toJSON(){return{name:this.name,code:this.code,reason:this.reason,style:this.style,message:this.message}}}class V extends Error{name="AcpRemotePathIdentityError";code="acp_remote_path_identity_invalid";constructor(){super("ACP remote path identity is invalid");Object.setPrototypeOf(this,new.target.prototype)}}function Qq(q){if(!E.has(q))throw new V}function Uq(q){if(!j.has(q))throw new V;if(Qq(q.workspace),q.style!==q.workspace.style)throw new V}function gq(q){Uq(q);let G=Object.freeze({style:q.style,workspace:q.workspace});return j.add(G),G}function Rq(q){let G=C(q),J=Object.freeze({style:G.style,workspace:G});return j.add(J),J}function C(q,G){let J=W(q,G);if(J.kind==="error")throw new _(J.reason,J.style);let O=J.style==="win32"?Yq(q):Xq(q);return k(J.style,O)}function Sq(q,G){let J=C(q),O=J.style==="win32"?Fq(J.wirePath,G):_q(J.wirePath,G);return k(J.style,O)}function W(q,G){if(R(q))return{kind:"error",reason:"device-namespace-not-supported",style:"win32"};if(g(q))return{kind:"error",reason:"unc-not-supported",style:G==="posix"?"posix":"win32"};if(S(q))return{kind:"error",reason:"unc-not-supported",style:"win32"};if(P(q)){if(G==="posix")return{kind:"error",reason:"style-mismatch",style:"posix"};return{kind:"absolute",style:"win32"}}if(Mq(q))return{kind:"error",reason:"drive-relative",style:"win32"};if(q.startsWith("\\"))return{kind:"error",reason:"root-relative",style:"win32"};if(q.startsWith("/")){if(G==="win32")return{kind:"error",reason:"style-mismatch",style:"win32"};return{kind:"absolute",style:"posix"}}return{kind:"error",reason:"not-absolute",style:"unknown"}}function k(q,G){let J=q==="win32"?G.toUpperCase():G,O=Object.freeze({style:q,wirePath:G,exactIdentity:I("acp-remote-exact-path",q,G),collisionIdentity:I("acp-remote-collision-path",q,J)});return E.add(O),O}function I(q,G,J){return`${q}:${Gq("sha256").update(`${G}\x00${J}`).digest("hex")}`}function Xq(q){let G=q.split("/"),J=[];for(let O of G.slice(1)){if(O.length===0||O===".")continue;if(O===".."){if(J.length>0)J.pop();continue}A(O),J.push(O)}return J.length===0?"/":`/${J.join("/")}`}function Yq(q){let G=q[0].toUpperCase(),J=Bq(q),O=[],Q="";for(let U of q.slice(2)){if(m(U)){if(Q.length>0)v(O,Q),Q="";continue}Q+=U}if(Q.length>0)v(O,Q);if(J&&O.length>0)throw new _("trailing-dot-or-space","win32");if(O.length===0)return`${G}:\\`;return`${G}:\\${O.join("\\")}`}function Zq(q,G){let J=q==="/"?[]:q.slice(1).split("/"),O=[...J];for(let Q of G.split("/")){if(Q.length===0||Q===".")continue;if(Q===".."){if(O.length===J.length)throw new _("not-absolute","posix");O.pop();continue}A(Q),O.push(Q)}return O.length===0?"/":`/${O.join("/")}`}function _q(q,G){if(R(G))throw new _("device-namespace-not-supported","win32");if(g(G))throw new _("unc-not-supported","posix");if(S(G))throw new _("unc-not-supported","win32");if(P(G)||G.startsWith("/"))throw new _("style-mismatch","posix");return Zq(q,G)}function $q(q,G){let J=q.indexOf("\\"),O=J===q.length-1?[]:q.slice(J+1).split("\\"),Q=[...O],U="";for(let K of G){if(m(K)){if(U.length>0)y(O.length,Q,U),U="";continue}U+=K}if(U.length>0)y(O.length,Q,U);let $=q.slice(0,J+1);if(Q.length===0)return $;return`${$}${Q.join("\\")}`}function Fq(q,G){let J=W(G,"win32");if(J.kind==="absolute")throw new _("style-mismatch","win32");if(J.reason!=="not-absolute")throw new _(J.reason,J.style);return $q(q,G)}function y(q,G,J){if(J===".")return;if(J===".."){if(G.length===q)throw new _("not-absolute","win32");G.pop();return}f(J),G.push(J)}function v(q,G){if(G===".")return;if(G===".."){if(q.length>0)q.pop();return}f(G),q.push(G)}function A(q){if(q.includes("\x00"))throw new _("invalid-character","posix")}function f(q){let G=Hq(q),J=Kq(G);if(J!==void 0&&Oq.has(J.toUpperCase()))throw new _("reserved-device-name","win32");if(G!==q)throw new _("trailing-dot-or-space","win32");if(q.includes(":"))throw new _("alternate-data-stream","win32");if(/~\d/u.test(q))throw new _("short-name-alias","win32");for(let O of q){let Q=O.codePointAt(0);if(Q===void 0||Q===0||Q>=1&&Q<=31||'<>"|?*'.includes(O))throw new _("invalid-character","win32")}}function Hq(q){let G=q.length;while(G>0){let J=q[G-1];if(J!=="."&&J!==" ")break;G-=1}return q.slice(0,G)}function Kq(q){if(q.length===0)return;let G=q.indexOf(".");return G===-1?q:q.slice(0,G)}function g(q){return q.startsWith("//")||q.startsWith("/\\")}function R(q){return/^([\\/]){2}[?.][\\/]/u.test(q)}function S(q){return/^[\\/]{2}/u.test(q)}function P(q){return/^[A-Za-z]:[\\/]/u.test(q)}function Mq(q){return/^[A-Za-z]:(?![\\/])/u.test(q)}function m(q){return q==="\\"||q==="/"}function Bq(q){if(q.length<=3)return!1;let G=q[q.length-1];return G==="\\"||G==="/"}var H="acp-remote-workspaces",d=/^[a-f0-9]{64}$/,b=new Map,h=new Lq,Nq;class X extends Error{name="AcpRemoteWorkspaceStateError";code="acp_remote_workspace_state_invalid";constructor(q){super(`ACP remote workspace durable state is invalid (${q})`);Object.setPrototypeOf(this,new.target.prototype)}}function iq(q){return{version:1,kind:"acp-remote",style:q.style,wirePath:q.workspace.wirePath,exactIdentity:q.workspace.exactIdentity,collisionIdentity:q.workspace.collisionIdentity}}function Tq(q){if(!q||typeof q!=="object"||Array.isArray(q))throw new X("descriptor-shape");let G=q;if(G.version!==1)throw new X("descriptor-version");if(G.kind!=="acp-remote")throw new X("descriptor-kind");if(G.style!=="posix"&&G.style!=="win32")throw new X("descriptor-style");if(typeof G.wirePath!=="string"||typeof G.exactIdentity!=="string"||typeof G.collisionIdentity!=="string")throw new X("descriptor-shape");let J;try{J=C(G.wirePath,G.style)}catch{throw new X("descriptor-wire-path")}if(J.exactIdentity!==G.exactIdentity||J.collisionIdentity!==G.collisionIdentity)throw new X("descriptor-identity");return{version:1,kind:"acp-remote",style:G.style,wirePath:J.wirePath,exactIdentity:J.exactIdentity,collisionIdentity:J.collisionIdentity}}function cq(q,G=F()){if(typeof q!=="string"||!/^acp-remote-collision-path:[a-f0-9]{64}$/.test(q))throw new X("descriptor-collision-identity");let J=Z.resolve(G),O=Vq("sha256").update(`acp-remote-host-state\x00${q}`).digest("hex");return Z.join(J,H,O)}async function sq(q){let G=Z.resolve(F());await jq(q,G)}async function rq(q,G){let J=Z.resolve(F());return s(q,J,G)}async function oq(q,G){let J=String(q);if(Z.dirname(G)!==J)throw new X("state-file-path");let O=await L(G);if(O.isSymbolicLink()||!O.isFile())throw new X("state-file-type");if(typeof process.getuid==="function"&&O.uid!==process.getuid())throw new X("state-file-owner");let Q=typeof O.mode==="bigint"?Number(O.mode&BigInt(511)):O.mode&511;if(process.platform!=="win32"&&Q!==384)throw new X("state-file-mode");await M(G,J,Z.basename(G))}async function aq(q,G,J){let O=String(q);if(Z.dirname(G)!==O)throw new X("state-file-path");let[Q,U]=await Promise.all([J.stat({bigint:!0}),L(G,{bigint:!0})]);if(U.isSymbolicLink()||!U.isFile()||!Q.isFile()||U.dev!==Q.dev||U.ino!==Q.ino)throw new X("state-file-replaced");if(typeof process.getuid==="function"&&(Number(U.uid)!==process.getuid()||Number(Q.uid)!==process.getuid()))throw new X("state-file-owner");let $=Number(U.mode&BigInt(511)),K=Number(Q.mode&BigInt(511));if(process.platform!=="win32"&&($!==384||K!==384))throw new X("state-file-mode");await M(G,O,Z.basename(G))}function tq(q,G,J,O){let Q=q[0];if(Q?.type!=="session_created"||Q.sessionId!==G||Q.data.sessionId!==G||Q.cwd!==J||Q.projectPath!==J)throw new X("remote-session-identity");if(O){let U=Tq(Q.data.remoteWorkspace);if(U.version!==O.version||U.kind!==O.kind||U.style!==O.style||U.wirePath!==O.wirePath||U.exactIdentity!==O.exactIdentity||U.collisionIdentity!==O.collisionIdentity)throw new X("remote-session-workspace")}for(let U of q)if(U.sessionId!==G||U.cwd!==J||U.projectPath!==J)throw new X("remote-session-event-identity");return Q}function n(q){return d.test(q)}async function p(q=F()){let G=Z.resolve(q);return u(`${G}\x00${H}`,async()=>{let J=Z.join(G,H),O;try{O=await c(G,(U)=>bq(U,{withFileTypes:!0}))}catch(U){if(U.code==="ENOENT")return[];throw U}await Nq?.();let Q=[];for(let U of O){if(!n(U.name))continue;let $=Z.join(J,U.name);try{let K=await s($,G,async(qq)=>qq);Q.push(K)}catch(K){if(K.code==="ENOENT")throw new X("protected-root-missing");throw K}}return Q.sort((U,$)=>U.localeCompare($))})}function i(q,G){if(typeof q!=="string"||!Z.isAbsolute(q))throw new X("protected-root-shape");let J=Z.resolve(q);if(J!==q)throw new X("protected-root-shape");let O=Z.relative(G,J),Q=`${H}${Z.sep}`;if(O===""||O===H||!O.startsWith(Q)||O.includes(`${Z.sep}..`)||O.startsWith(`..${Z.sep}`)||Z.isAbsolute(O))throw new X("protected-root-shape");let U=O.split(Z.sep);if(U.length!==2||U[0]!==H)throw new X("protected-root-shape");if(!d.test(U[1]??""))throw new X("protected-root-digest");return{storageRoot:G,digest:U[1]}}async function c(q,G){await r(q,q);let J=Z.join(q,H);try{await D(J,q),await M(J,q,H)}catch(O){if(O.code==="ENOENT")throw O;throw O}return G(J)}async function jq(q,G){await u(q,async()=>{let J=i(q,G);if(J.storageRoot!==G)throw new X("storage-root-mismatch");await r(J.storageRoot,G);let O=Z.join(J.storageRoot,H);await l(O,J.storageRoot),await M(O,G,H);let Q=Z.join(O,J.digest);await l(Q,O),await M(Q,O,J.digest)})}async function s(q,G,J){return u(q,async()=>{let O=i(q,G);if(O.storageRoot!==G)throw new X("storage-root-mismatch");let Q=Z.join(O.storageRoot,H);await c(G,async($)=>{if($!==Q)throw new X("protected-root-shape")});let U=Z.join(Q,O.digest);return await D(U,Q),await M(U,Q,O.digest),J(U)})}async function l(q,G){try{let J=await L(q);o(J,q)}catch(J){if(J.code!=="ENOENT")throw J;await Cq(q,{recursive:!1,mode:448})}await D(q,G)}async function D(q,G){let J=await L(q);o(J,q),await M(q,G,Z.basename(q))}async function r(q,G){let J=await L(q);Dq(J,q),await uq(q,G)}function Dq(q,G){a(q,G);let J=t(q);if(process.platform!=="win32"&&((J&448)!==448||(J&18)!==0))throw new X("protected-root-mode")}function o(q,G){a(q,G);let J=t(q);if(process.platform!=="win32"&&J!==448)throw new X("protected-root-mode")}function a(q,G){if(q.isSymbolicLink()||!q.isDirectory())throw new X("protected-root-symlink");if(typeof process.getuid==="function"&&q.uid!==process.getuid())throw new X("protected-root-owner");if(G.includes(`..${Z.sep}`))throw new X("protected-root-shape")}function t(q){return typeof q.mode==="bigint"?Number(q.mode&BigInt(511)):q.mode&511}async function M(q,G,J){let O=await N(q),Q=await N(G),U=Z.join(Q,J);if(O!==U)throw new X("protected-root-realpath")}async function uq(q,G){let J=await N(q),O=await N(G);if(J!==O)throw new X("protected-root-realpath")}async function u(q,G){let J=h.getStore();if(J?.has(q))throw new X("state-root-reentry");let O=b.get(q)??Promise.resolve(),Q=new Set(J??[]);Q.add(q);let U=O.catch(()=>{return}).then(()=>h.run(Q,G)),$=U.then(()=>{return},()=>{return});b.set(q,$);try{return await U}finally{if(b.get(q)===$)b.delete(q)}}import{execSync as wq}from"node:child_process";import{createHash as zq}from"node:crypto";import{realpathSync as xq}from"node:fs";import{readdir as Iq}from"node:fs/promises";import*as Y from"node:path";function yq(q){return Y.resolve(q).replace(/[/\\]/g,"-").replace(/:/g,"_")}function vq(q){let G=q.replace(/_/g,":");if(G.startsWith("-"))G="/"+G.slice(1);return G.replace(/-/g,"/")}function Eq(q){let G=yq(q);return Y.join(F(),"projects",G)}function e(q){let G=Y.resolve(q),J=[];while(!0)try{return Y.resolve(xq.native(G),...J.reverse())}catch(O){let Q=O.code;if(Q!=="ENOENT"&&Q!=="ENOTDIR")throw O;let U=Y.dirname(G);if(U===G)return Y.resolve(q);J.push(Y.basename(G)),G=U}}function XG(q,G="projectPath"){if(!Y.isAbsolute(q))throw Error(`${G} must be absolute`);let J=Y.resolve(q),O=e(J),Q=Y.join(e(F()),"acp-remote-workspaces"),U=Y.relative(Q,O),$=U.split(Y.sep)[0];if(U===""||U!==".."&&!Y.isAbsolute(U)&&!U.startsWith(`..${Y.sep}`)&&$!==void 0&&/^[a-f0-9]{64}$/i.test($))throw Error(`${G} must reference a local workspace`);return J}function w(q){return Eq(q)}function T(q){return String(q)}function Wq(q){return typeof q==="string"&&q!=="."&&q!==".."&&/^[A-Za-z0-9_-][A-Za-z0-9._-]{0,199}$/.test(q)}function B(q){if(!Wq(q))throw Error(`Invalid session ID: ${q}`)}function YG(q,G){return B(G),Y.join(w(q),`${G}.jsonl`)}function ZG(q,G){return B(G),Y.join(T(q),`${G}.jsonl`)}function _G(q,G){return B(G),Y.join(w(q),`${G}.inbox.json`)}function $G(q,G){return B(G),Y.join(T(q),`${G}.inbox.json`)}function FG(q,G){return B(G),Y.join(w(q),`${G}.goal.json`)}function HG(q,G){return B(G),Y.join(T(q),`${G}.goal.json`)}function KG(q,G){B(G);let J=zq("sha256").update(G).digest("hex");return Y.join(T(q),`.session-lease-${J}.lock`)}function MG(q){try{return wq("git rev-parse --abbrev-ref HEAD",{cwd:q,encoding:"utf-8",stdio:["ignore","pipe","ignore"]}).trim()||void 0}catch{return}}async function kq(){try{let q=Y.join(F(),"projects");return(await Iq(q,{withFileTypes:!0})).filter((J)=>J.isDirectory()).map((J)=>J.name)}catch{return[]}}async function BG(){let q=Y.resolve(F()),G=await kq().then((O)=>O.map((Q)=>({storagePath:Y.join(q,"projects",Q),projectPath:vq(Q),kind:"local"}))).catch(()=>[]),J=await p().then((O)=>O.map((Q)=>({storagePath:String(Q),projectPath:String(Q),kind:"acp-remote"})));return[...G,...J]}
2
- export{F as Zj,_ as _j,Qq as $j,Uq as ak,gq as bk,Rq as ck,C as dk,Sq as ek,X as fk,iq as gk,Tq as hk,cq as ik,sq as jk,rq as kk,oq as lk,aq as mk,tq as nk,p as ok,vq as pk,Eq as qk,XG as rk,Wq as sk,B as tk,YG as uk,ZG as vk,_G as wk,$G as xk,FG as yk,HG as zk,KG as Ak,MG as Bk,kq as Ck,BG as Dk};
2
+ export{F as ak,_ as bk,Qq as ck,Uq as dk,gq as ek,Rq as fk,C as gk,Sq as hk,X as ik,iq as jk,Tq as kk,cq as lk,sq as mk,rq as nk,oq as ok,aq as pk,tq as qk,p as rk,vq as sk,Eq as tk,XG as uk,Wq as vk,B as wk,YG as xk,ZG as yk,_G as zk,$G as Ak,FG as Bk,HG as Ck,KG as Dk,MG as Ek,kq as Fk,BG as Gk};
@@ -0,0 +1 @@
1
+ import{$d as b,_d as a,ae as c,be as d,ce as e,de as f,ee as g}from"./chunk-n6tvswa8.js";import"./chunk-kmg8ad2j.js";import"./chunk-es0cbtx1.js";import"./chunk-zfaenqqx.js";import"./chunk-hvmrcd84.js";import"./chunk-r4q06wbs.js";import"./chunk-nxsarfy6.js";import"./chunk-zp5097qk.js";import"./chunk-g38d2ezm.js";import"./chunk-pg7cgvs8.js";import"./chunk-2g8avyq6.js";import"./chunk-19zsecpx.js";import"./chunk-mnk0b4nz.js";import"./chunk-tecbx0ek.js";export{b as __setSessionSnapshotIOForTesting,c as __resetSessionSnapshotIOForTesting,g as SessionService,d as SessionMissingCreationError,e as SessionArchivedError,f as SessionArchiveConflictError,a as STALE_EMPTY_SESSION_AGE_MS};
@@ -1,4 +1,4 @@
1
- import{Ge as r2,He as C0,Oe as l_,Qe as N1,Se as o2,Te as a2,Ue as q1,Ve as t2,ie as h2,je as e,ke as l2,le as Z1,me as c2,ne as m,oe as G1,pe as p2,qe as n2,re as V1,se as L1,te as d2,ue as H1,ve as A0,we as U1,xe as B1,ze as i2}from"./chunk-a5hkv8er.js";import{pg as i_}from"./chunk-d64b7wta.js";import{jh as r_}from"./chunk-rhwkvx96.js";import{Ni as P2,Oi as u2,Pi as w_,Qi as Q0,Ri as R_}from"./chunk-mc2mr1kn.js";import{Vi as f1}from"./chunk-dv2m2xe5.js";import{vj as B0}from"./chunk-ft1bdqbs.js";import{Ij as n_,Lj as d_}from"./chunk-65c3vjwm.js";import{Pj as __}from"./chunk-mtfjwsn2.js";import{Ak as b1,Bk as q_,Zj as h,hk as o,ik as p,jk as I2,kk as n,lk as d,mk as m2,nk as K0,ok as Y1,pk as v2,qk as K_,rk as M0,sk as h_,tk as A,uk as P,vk as S,wk as E1,xk as F1,yk as M_,zk as z1}from"./chunk-t88sfhjj.js";import{readdir as k_,readFile as G_,rm as b_,stat as E0}from"node:fs/promises";import*as N from"node:path";import{nanoid as I}from"nanoid";import{createHash as z4,randomUUID as D4}from"node:crypto";import*as $_ from"node:fs/promises";import*as W0 from"node:path";function cX(_){return Object.freeze({kind:"local",root:_})}function pX(_,X){let $=o(X);if(p($.collisionIdentity)!==_)throw Error("ACP remote workspace durable state is invalid");return Object.freeze({kind:"acp-remote",root:_,descriptor:$})}function nX(_,X){return _.kind==="acp-remote"?`${_.kind}\x00${_.root}\x00${_.descriptor.exactIdentity}\x00${X}`:`${_.kind}\x00${_.root}\x00${X}`}async function U_(_,X){if(_.kind==="local")return X(K_(_.root));return n(_.root,($)=>X(String($),$))}async function dX(_,X,$){return U_(_,(W,J)=>$(J?{storageRoot:W,transcriptPath:S(J,X),inboxPath:F1(J,X),goalPath:z1(J,X),remoteScope:J}:{storageRoot:W,transcriptPath:P(_.root,X),inboxPath:E1(_.root,X),goalPath:M_(_.root,X)}))}import{execFileSync as C4}from"node:child_process";import{createHash as K4}from"node:crypto";import{readFileSync as M4}from"node:fs";var A4=/^[a-f0-9]{64}$/;function D1(_){if(!_||typeof _!=="object")return!1;let X=_;return(X.platform==="linux"||X.platform==="darwin"||X.platform==="win32")&&typeof X.fingerprint==="string"&&A4.test(X.fingerprint)}var R1={readFile:(_)=>M4(_,"utf8"),execFile:(_,X)=>C4(_,X,{encoding:"utf8",timeout:_==="powershell.exe"?3000:2000,windowsHide:!0})},E4=(_)=>{try{return process.kill(_,0),!0}catch(X){return X instanceof Error&&"code"in X&&X.code==="EPERM"}};function x0(_,X){return{platform:_,fingerprint:K4("sha256").update(`${_}\x00${X}`).digest("hex")}}function F4(_,X){let $=X.readFile(`/proc/${_}/stat`).trim(),W=$.lastIndexOf(")");if(W<0)throw Error("Invalid /proc process stat");let O=$.slice(W+2).split(/\s+/)[19];if(!O||!/^\d+$/.test(O))throw Error("Missing process start ticks");return O}function X0(_,X=process.platform,$=R1){if(!Number.isInteger(_)||_<=1)return;try{if(X==="linux")return x0(X,F4(_,$));if(X==="darwin"){let W=$.execFile("ps",["-o","lstart=","-p",String(_)]).trim();return W?x0(X,W):void 0}if(X==="win32"){let W=`(Get-CimInstance Win32_Process -Filter "ProcessId = ${_}").CreationDate.ToUniversalTime().ToString('O')`,J=$.execFile("powershell.exe",["-NoProfile","-NonInteractive","-Command",W]).trim();return J?x0(X,J):void 0}}catch{return}return}function w1(_,X){return X0(_,X.platform)?.fingerprint===X.fingerprint}function tX(_,X,$=R1,W=E4){if(!Number.isInteger(_)||_<=1)return!1;let J=X0(_,X.platform,$);if(J)return J.fingerprint===X.fingerprint;return!W(_)}var j1=1;function R4(_,X){let $=z4("sha256").update(X).digest("hex");return W0.join(K_(_),".locks",`${$}.lock`)}function $0(_,X){return _ instanceof Error&&"code"in _&&_.code===X}async function k0(_){try{let X=JSON.parse(await $_.readFile(_,"utf8"));if(X.version!==j1||typeof X.sessionId!=="string"||typeof X.ownerId!=="string"||!Number.isInteger(X.pid)||(X.pid??0)<=0||X.processIdentity!==void 0&&!D1(X.processIdentity)||typeof X.acquiredAt!=="string")return;return X}catch{return}}async function x1(_){let X=await k0(_);if(X)return X;return await new Promise(($)=>setTimeout($,10)),k0(_)}function w4(_){try{return process.kill(_,0),!0}catch(X){return $0(X,"EPERM")}}async function k1(_,X){let $;try{return $=await $_.open(_,"wx",384),await $.writeFile(`${JSON.stringify(X)}
1
+ import{Ae as B1,Ce as i2,Je as r2,Ke as C0,Re as l_,Te as N1,Ve as o2,We as a2,Xe as q1,Ye as t2,le as h2,me as e,ne as l2,oe as Z1,pe as c2,qe as m,re as G1,se as p2,te as n2,ue as V1,ve as L1,we as d2,xe as H1,ye as A0,ze as U1}from"./chunk-es0cbtx1.js";import{sg as i_}from"./chunk-hvmrcd84.js";import{mh as r_}from"./chunk-r4q06wbs.js";import{Qi as P2,Ri as u2,Si as w_,Ti as Q0,Ui as R_}from"./chunk-zp5097qk.js";import{Yi as f1}from"./chunk-g38d2ezm.js";import{yj as B0}from"./chunk-pg7cgvs8.js";import{Lj as n_,Oj as d_}from"./chunk-2g8avyq6.js";import{Sj as __}from"./chunk-19zsecpx.js";import{Ak as F1,Bk as M_,Ck as z1,Dk as b1,Ek as q_,ak as h,kk as o,lk as p,mk as I2,nk as n,ok as d,pk as m2,qk as K0,rk as Y1,sk as v2,tk as K_,uk as M0,vk as h_,wk as A,xk as P,yk as S,zk as E1}from"./chunk-mnk0b4nz.js";import{readdir as k_,readFile as G_,rm as b_,stat as E0}from"node:fs/promises";import*as N from"node:path";import{nanoid as I}from"nanoid";import{createHash as z4,randomUUID as D4}from"node:crypto";import*as $_ from"node:fs/promises";import*as W0 from"node:path";function cX(_){return Object.freeze({kind:"local",root:_})}function pX(_,X){let $=o(X);if(p($.collisionIdentity)!==_)throw Error("ACP remote workspace durable state is invalid");return Object.freeze({kind:"acp-remote",root:_,descriptor:$})}function nX(_,X){return _.kind==="acp-remote"?`${_.kind}\x00${_.root}\x00${_.descriptor.exactIdentity}\x00${X}`:`${_.kind}\x00${_.root}\x00${X}`}async function U_(_,X){if(_.kind==="local")return X(K_(_.root));return n(_.root,($)=>X(String($),$))}async function dX(_,X,$){return U_(_,(W,J)=>$(J?{storageRoot:W,transcriptPath:S(J,X),inboxPath:F1(J,X),goalPath:z1(J,X),remoteScope:J}:{storageRoot:W,transcriptPath:P(_.root,X),inboxPath:E1(_.root,X),goalPath:M_(_.root,X)}))}import{execFileSync as C4}from"node:child_process";import{createHash as K4}from"node:crypto";import{readFileSync as M4}from"node:fs";var A4=/^[a-f0-9]{64}$/;function D1(_){if(!_||typeof _!=="object")return!1;let X=_;return(X.platform==="linux"||X.platform==="darwin"||X.platform==="win32")&&typeof X.fingerprint==="string"&&A4.test(X.fingerprint)}var R1={readFile:(_)=>M4(_,"utf8"),execFile:(_,X)=>C4(_,X,{encoding:"utf8",timeout:_==="powershell.exe"?3000:2000,windowsHide:!0})},E4=(_)=>{try{return process.kill(_,0),!0}catch(X){return X instanceof Error&&"code"in X&&X.code==="EPERM"}};function x0(_,X){return{platform:_,fingerprint:K4("sha256").update(`${_}\x00${X}`).digest("hex")}}function F4(_,X){let $=X.readFile(`/proc/${_}/stat`).trim(),W=$.lastIndexOf(")");if(W<0)throw Error("Invalid /proc process stat");let O=$.slice(W+2).split(/\s+/)[19];if(!O||!/^\d+$/.test(O))throw Error("Missing process start ticks");return O}function X0(_,X=process.platform,$=R1){if(!Number.isInteger(_)||_<=1)return;try{if(X==="linux")return x0(X,F4(_,$));if(X==="darwin"){let W=$.execFile("ps",["-o","lstart=","-p",String(_)]).trim();return W?x0(X,W):void 0}if(X==="win32"){let W=`(Get-CimInstance Win32_Process -Filter "ProcessId = ${_}").CreationDate.ToUniversalTime().ToString('O')`,J=$.execFile("powershell.exe",["-NoProfile","-NonInteractive","-Command",W]).trim();return J?x0(X,J):void 0}}catch{return}return}function w1(_,X){return X0(_,X.platform)?.fingerprint===X.fingerprint}function tX(_,X,$=R1,W=E4){if(!Number.isInteger(_)||_<=1)return!1;let J=X0(_,X.platform,$);if(J)return J.fingerprint===X.fingerprint;return!W(_)}var j1=1;function R4(_,X){let $=z4("sha256").update(X).digest("hex");return W0.join(K_(_),".locks",`${$}.lock`)}function $0(_,X){return _ instanceof Error&&"code"in _&&_.code===X}async function k0(_){try{let X=JSON.parse(await $_.readFile(_,"utf8"));if(X.version!==j1||typeof X.sessionId!=="string"||typeof X.ownerId!=="string"||!Number.isInteger(X.pid)||(X.pid??0)<=0||X.processIdentity!==void 0&&!D1(X.processIdentity)||typeof X.acquiredAt!=="string")return;return X}catch{return}}async function x1(_){let X=await k0(_);if(X)return X;return await new Promise(($)=>setTimeout($,10)),k0(_)}function w4(_){try{return process.kill(_,0),!0}catch(X){return $0(X,"EPERM")}}async function k1(_,X){let $;try{return $=await $_.open(_,"wx",384),await $.writeFile(`${JSON.stringify(X)}
2
2
  `,"utf8"),!0}catch(W){if($0(W,"EEXIST"))return!1;if($)await $_.unlink(_).catch(()=>{return});throw W}finally{await $?.close().catch(()=>{return})}}class B_ extends Error{code="BLADE_SESSION_IN_USE";constructor(_){super(_?`Session is already active in another Blade process (PID ${_}). Stop that process or choose a different session.`:"Session is already active in another Blade process. Stop that process or choose a different session.");this.name="SessionInUseError"}}class u{filePath;record;stateStorage;released=!1;constructor(_,X,$){this.filePath=_;this.record=X;this.stateStorage=$}static async acquireForStorage(_,X){if(X.kind==="local")return u.acquire(_,X.root);return U_(X,($,W)=>{if(!W||$!==X.root)throw Error("ACP remote session lease scope is invalid");return u.acquireRemote(_,W,X)})}static async acquire(_,X=f1()){return u.acquireAtPath(_,R4(X,_))}static async acquireRemote(_,X,$){let W=b1(X,_);try{await d(X,W)}catch(O){if(O.code!=="ENOENT")throw O}let J=await u.acquireAtPath(_,W);try{return await d(X,W),new u(W,J.record,$)}catch(O){throw await J.release(),O}}static async acquireAtPath(_,X){let $={version:j1,sessionId:_,ownerId:D4(),pid:process.pid,processIdentity:X0(process.pid),acquiredAt:new Date().toISOString()};if(await $_.mkdir(W0.dirname(X),{recursive:!0,mode:448}),await k1(X,$))return new u(X,$);let W=await x1(X);if(W&&w4(W.pid)&&(!W.processIdentity||w1(W.pid,W.processIdentity)))throw new B_(W.pid);if(await $_.unlink(X).catch((J)=>{if(!$0(J,"ENOENT"))throw J}),await k1(X,$))return new u(X,$);throw new B_((await x1(X))?.pid)}async release(){if(this.released)return;let _=async()=>{if((await k0(this.filePath))?.ownerId!==this.record.ownerId)return;await $_.unlink(this.filePath).catch(($)=>{if(!$0($,"ENOENT"))throw $})};if(this.stateStorage?.kind==="acp-remote")await U_(this.stateStorage,_);else await _();this.released=!0}}import{createHash as O0}from"node:crypto";import{constants as A_,promises as W_}from"node:fs";import Z_ from"node:path";import{Mutex as x4}from"async-mutex";var y1=128,g1=67108864,k4=24576,S1=65536,f0=1,h1=/^[a-f0-9]{64}$/,b4=/^[a-f0-9]{64}\.txt$/,l1=64,f4=new Set(["EBUSY","EAGAIN","EMFILE","ENFILE"]),Y0=`
3
3
 
4
4
  ...[middle omitted; read the private prompt artifact for the complete request]...
@@ -91,4 +91,4 @@ ${[...X_,...Y_].join(`
91
91
  s.project_sort_key ASC,
92
92
  s.session_sort_key ASC
93
93
  LIMIT ?`).all(...J,_.limit+1),Q=await Promise.all(O.map(async(Z)=>{let V=JSON.parse(Z.metadata_json);if(V.remoteWorkspace)throw Error("Local projection contains remote session metadata");if(Z.archive_root_id&&Z.effective_archived_at)return this.reconcileInterruptedTask({...V,archivedAt:Z.effective_archived_at,archivedBySessionId:Z.archive_root_id});let{archivedAt:H,archivedBySessionId:G,...L}=V;return this.reconcileInterruptedTask(L)})),Y=U1(Q,_);return{sessions:Y.sessions.map((Z)=>this.toPublicMetadata(Z)),nextCursor:Y.nextCursor}}catch{return null}}static async listRemoteSessionPageFromProjection(_){n2(_);try{let X=await this.scanRemoteStoredSessionsFromProjection(_,0);if(!X)return null;let $=B1(this.toRemoteCatalogEntries(X).sort(A0),_);return{sessions:$.sessions.map((W)=>this.toPublicMetadata(W)),nextCursor:$.nextCursor}}catch(X){throw z(X)}}static async listSessions(_={}){let X=V1(_),$=d2(_),W=await this.scanStoredSessions(X.cwd??void 0,X.includeSubagents,0,X.archived,$),J=new Set;return W.sort(H1).flatMap((O)=>{let Q=`${O.projectPath}\x00${O.sessionId}`;if(J.has(Q))return[];return J.add(Q),[this.toPublicMetadata(O)]})}static async listRemoteSessions(_={}){let X=L1(_.descriptor!==void 0?{..._,descriptor:j2(_.descriptor)}:_),$=await this.scanRemoteStoredSessions(X,0),W=new Set;return this.toRemoteCatalogEntries($).sort(A0).flatMap((J)=>{let O=`${J.projectPath}\x00${J.sessionId}`;if(W.has(O))return[];return W.add(O),[this.toPublicMetadata(J)]})}static async collectStaleEmptySessions(_={}){let X=_.now??Date.now(),$=_.olderThanMs??gX;if(!Number.isFinite($)||$<0)throw Error("Stale empty session age must be a non-negative number");let W=_.projectPath?[{storagePath:K_(this.resolveCatalogWorkspace(_.projectPath)),projectPath:this.resolveCatalogWorkspace(_.projectPath)}]:await this.listAllProjectStorageDirectories(),J=0;for(let O of W){let Q;try{Q=await k_(O.storagePath)}catch(Y){if(Y.code==="ENOENT")continue;throw Y}for(let Y of Q){if(!Y.endsWith(".jsonl"))continue;let Z=Y.slice(0,-6);if(!h_(Z))continue;let V=N.join(O.storagePath,Y);try{let G=await E0(V);if(X-G.mtimeMs<$)continue;if(await Promise.all([E0(N.join(O.storagePath,`${Z}.inbox.json`)).then(()=>!0).catch(()=>!1),E0(M_(O.projectPath,Z)).then(()=>!0).catch(()=>!1)]).then((U)=>U.some(Boolean)))continue}catch(G){if(G.code==="ENOENT")continue;throw G}let H;try{H=await u.acquire(Z,O.projectPath)}catch(G){if(G instanceof B_)continue;throw G}try{if(!await new m(V).deleteValidated((L)=>L.length===1&&L[0]?.type==="session_created"&&L[0].data.relationType!=="subagent"))continue;J++,await b_(N.join(O.storagePath,`${Z}.inbox.json`),{force:!0}),await b_(M_(O.projectPath,Z),{force:!0}),await this.removeFromProjection(Z,O.projectPath)}catch(G){u_.warn(`[SessionService] Skipping stale empty session cleanup: ${Z}`,G)}finally{await H.release()}}}return J}static async findSessionMetadata(_,X){if(A(_),X!==void 0){let W=this.resolveCatalogWorkspace(X),J=this.getSessionFilePath(W,_);try{let O=await this.readStoredSessionMetadata(J,_,W);if(O.projectPath!==W)return;if(!O.parentId||O.archivedAt)return this.toPublicMetadata(Q1([O],null)[0]??O);let Q=await this.scanStoredSessions(W,!0,0,null);return this.toPublicMetadata(Q.find((Y)=>Y.sessionId===_)??O)}catch(O){if(O.code==="ENOENT")return;throw O}}let $=(await this.scanStoredSessions(void 0,!0,0,null)).filter((W)=>W.sessionId===_);if($.length===0)return;if($.length>1)throw Error(`Ambiguous session ID: ${_}`);return this.toPublicMetadata($[0])}static async loadSession(_,X){try{if(X){let W=this.resolveCatalogWorkspace(X),J=this.getSessionFilePath(W,_);try{return await this.loadSessionFromFile(J,_,W)}catch(O){if(O.code==="ENOENT")throw Error(`未找到会话: ${_}`);throw O}}let $=(await this.scanStoredSessions(void 0,!0,0,null)).find((W)=>W.sessionId===_);if(!$)throw Error(`未找到会话: ${_}`);return await this.loadSessionFromFile($.filePath,_)}catch($){throw u_.error(`[SessionService] 加载会话失败 (${_}):`,$),$}}static async loadSessionModelContext(_,X){try{if(X){let W=this.resolveCatalogWorkspace(X),J=this.getSessionFilePath(W,_);try{return await this.loadSessionModelContextFromFile(J,_,W)}catch(O){if(O.code==="ENOENT")throw Error(`未找到会话: ${_}`);throw O}}let $=(await this.scanStoredSessions(void 0,!0,0,null)).find((W)=>W.sessionId===_);if(!$)throw Error(`未找到会话: ${_}`);return await this.loadSessionModelContextFromFile($.filePath,_)}catch($){throw u_.error(`[SessionService] 加载模型上下文失败 (${_}):`,$),$}}static async loadRemoteSession(_,X,$){let W=await this.readValidatedRemoteSessionSnapshot(_,X,$);return this.convertJSONLToMessages(W)}static async loadRemoteSessionModelContext(_,X,$){let W=await this.readValidatedRemoteSessionSnapshot(_,X,$);return this.convertJSONLToModelContext(W)}static async readValidatedLocalSurfaceSnapshot(_,X,$){A(_);let W=this.resolveCatalogWorkspace(X),J=P(W,_),O=await this.readStableSessionSnapshot(J,_,3,$);this.validateSessionWorkspace(O,_,W);let Q=this.projectMetadataFromEntries(O,_,W,J);if(Q.remoteWorkspace)throw new R;return{entries:O,summary:N1(Q)}}static async readValidatedRemoteSurfaceSnapshot(_,X){let $=await this.readValidatedRemoteSessionSnapshot(_.sessionId,_.hostStateRoot,_.descriptor,X);return n(_.hostStateRoot,async(W)=>{X?.throwIfAborted();let J=S(W,_.sessionId),O=y(this.projectMetadataFromEntries($,_.sessionId,_.hostStateRoot,J),_.descriptor);return{entries:$,summary:N1(O,_.workspaceRef)}})}static async listValidatedRemoteSurfaceCandidates(_){let X=[];for(let $ of await Y1())_?.throwIfAborted(),await n(String($),async(W)=>{for(let J of await k_(String(W))){if(_?.throwIfAborted(),!J.endsWith(".jsonl"))continue;let O=J.slice(0,-6);if(!h_(O))continue;let Q=S(W,O);await d(W,Q);let Y=await this.readStableSessionSnapshot(Q,O,3,_),Z=y(this.projectMetadataFromEntries(Y,O,String(W),Q)),V=await h2(W,Z.remoteWorkspace);_?.throwIfAborted(),X.push({descriptor:Z.remoteWorkspace,hostStateRoot:String(W),sessionId:O,workspaceRef:V})}});return X}static async listValidatedLocalSurfaceCandidates(_){let X=new Map;for(let $ of await this.listAllProjectStorageDirectories()){_?.throwIfAborted();let W;try{W=await k_($.storagePath)}catch(J){if(J.code==="ENOENT")continue;throw J}for(let J of W){if(_?.throwIfAborted(),!J.endsWith(".jsonl"))continue;let O=J.slice(0,-6);if(!h_(O))continue;let Q=N.join($.storagePath,J);try{let Y=await this.readStableSessionSnapshot(Q,O,3,_),Z=this.getSessionCreatedEntry(Y,O);if(Z.data.sessionId!==O||!N.isAbsolute(Z.cwd)||Object.hasOwn(Z.data,"remoteWorkspace"))continue;let V;try{V=M0(Z.cwd)}catch{continue}if(P(V,O)!==Q)continue;X.set(`${V}\x00${O}`,{projectPath:V,sessionId:O})}catch(Y){if(_?.aborted)throw Y;if(Y.code==="ENOENT")continue;if(Y instanceof R)throw Y}}}return[...X.values()]}static async exportSessionMarkdown(_,X,$={}){A(_);let W=this.resolveCatalogWorkspace(X),J=P(W,_),O;try{O=await this.readStableSessionSnapshot(J,_)}catch(Z){throw this.sanitizeStoredSessionError(Z,_)}let Q=this.projectMetadataFromEntries(O,_,W,J);if(Q.projectPath!==W)throw Error(`Session export workspace mismatch: ${_}`);let Y=Q.archivedAt;if(!Y&&Q.parentId)Y=(await this.findArchivedAncestor(Q.parentId,W))?.archivedAt;return N2(O,{...Q,archivedAt:Y},$)}static async listRewindCheckpoints(_,X){A(_);let $=this.resolveCatalogWorkspace(X),W=P($,_),J=await this.readStableSessionSnapshot(W,_);this.validateSessionWorkspace(J,_,$);let O=new N0({sessionId:_,workspaceRoot:$});await O.initialize();let Q=l2(J),Y=[];for(let Z of Q){let V=Z1(J,Z.messageId),H=await O.previewRewind(V.snapshotMessageIds);Y.push({...Z,fileCount:H.files.length})}return Y}static async rewindSession(_,X,$){A(_);let W=this.resolveCatalogWorkspace(X);await this.assertSessionWritable(_,W);let J=P(W,_),O=new m(J),Q;try{await O.appendValidatedAsync(async(Y)=>{this.validateSessionWorkspace(Y,_,W);let Z=Z1(Y,$.targetMessageId),V=new N0({sessionId:_,workspaceRoot:W});await V.initialize();let H=await V.previewRewind(Z.snapshotMessageIds),G=$.mode==="conversation"?await V.commitSnapshots(Z.snapshotMessageIds):await V.rewindSnapshots(Z.snapshotMessageIds),L=new Date().toISOString(),U={id:I(),sessionId:_,timestamp:L,type:"session_rewound",cwd:W,gitBranch:q_(W),version:__(),data:{rewindId:I(),targetMessageId:$.targetMessageId,mode:$.mode,restoredFiles:$.mode==="conversation"?[]:G.files,createdAt:L}},B=e([...Y,U]);return Q={checkpoint:{...Z.checkpoint,fileCount:H.files.length},mode:$.mode,removedTurns:Z.removedTurns,restoredFiles:U.data.restoredFiles,messages:this.convertJSONLToMessages(B)},U})}catch(Y){throw this.sanitizeStoredSessionError(Y,_)}if(!Q)throw Error(`Session rewind did not produce a result: ${_}`);for(let Y of Q.restoredFiles)N_.getInstance().clearFileRecord(Y);return Q}static async forkSession(_,X){A(_);let $=X.newSessionId??`fork-${Date.now()}-${I(8)}`;A($);let W=X.remote;if(W)return this.forkRemoteSession(_,$,X.sourceProjectPath,X.targetProjectPath,W.expectedDescriptor);let J=this.resolveForkWorkspace(X.sourceProjectPath),O=this.resolveForkWorkspace(X.targetProjectPath);if(J!==O)throw Error("Session forks must stay in the source workspace");let Q=P(J,_),Y=await this.readStableSessionSnapshot(Q,_),Z=this.getSessionCreatedEntry(Y,_);if(Z.data.sessionId!==_)throw Error("Fork source session_created.data.sessionId must match the requested session ID");if(!N.isAbsolute(Z.cwd)||N.resolve(Z.cwd)!==J)throw Error("Fork source session_created.cwd must resolve to the requested source workspace");let V=this.projectMetadataFromEntries(Y,_,J,Q);if(V.archivedAt)throw new t(_,_);if(V.parentId){let K=await this.findArchivedAncestor(V.parentId,J);if(K)throw new t(_,K.sessionId)}let H=e(Y),G=new Date().toISOString(),L=Z.data.rootId||_,U=q_(O),B=__(),{status:k,taskStatus:v,taskStatusReason:w,taskFailure:X_,taskStartedAt:Y_,taskCompletedAt:l,taskOwnerPid:c,taskPromptSummary:D,taskPriority:x,taskKind:b,taskDueAt:T,taskDispatch:V_,taskModelId:f,taskRetriedFrom:g,taskDelivery:L_,taskIsolation:j_,taskSourceProjectPath:o_,taskWorktree:R0,taskDiffStat:w0,taskQueuePosition:a_,taskQueueDepth:t_,taskConcurrencyLimit:s_,pendingInteraction:y_,...j}=Z.data,e_={id:I(),sessionId:$,timestamp:G,type:"session_created",cwd:O,gitBranch:U,version:B,data:{...j,sessionId:$,rootId:L,parentId:_,relationType:"fork",taskStatus:"completed",taskCompletedAt:G,taskIsolation:"local",taskSourceProjectPath:O,createdAt:G,updatedAt:G}},g_=H.filter((K)=>K.type!=="session_created"&&K.type!=="token_budget_handoff_recorded"&&K.type!=="inbox_acknowledged"&&K.type!=="interaction_requested"&&K.type!=="interaction_responded"&&K.type!=="interaction_recovered"&&K.type!=="review_started"&&K.type!=="review_completed").map((K)=>{let r={...K,id:I(),sessionId:$,cwd:O,gitBranch:U,version:B};if(K.type==="session_updated"){let{status:E,taskStatus:D_,taskStatusReason:X4,taskFailure:$4,taskStartedAt:W4,taskCompletedAt:O4,taskOwnerPid:J4,taskPromptSummary:Q4,taskPriority:Y4,taskKind:Z4,taskDueAt:G4,taskDispatch:V4,taskModelId:L4,taskRetriedFrom:H4,taskDelivery:U4,taskIsolation:B4,taskSourceProjectPath:N4,taskWorktree:q4,taskDiffStat:A1,taskQueuePosition:mX,taskQueueDepth:vX,taskConcurrencyLimit:PX,pendingInteraction:uX,...T4}=K.data;return{...r,type:"session_updated",data:{...T4,sessionId:$,rootId:L,parentId:_,relationType:"fork"}}}if(K.type==="message_created"){let{inboxMessageId:E,...D_}=K.data;return{...r,type:"message_created",data:D_}}return r}),T_={id:I(),sessionId:$,timestamp:G,type:"session_updated",cwd:O,gitBranch:U,version:B,data:{sessionId:$,rootId:L,parentId:_,relationType:"fork",taskStatus:"completed",taskStatusReason:null,taskFailure:null,taskStartedAt:null,taskCompletedAt:G,taskOwnerPid:null,taskIsolation:"local",taskSourceProjectPath:O,taskWorktree:null,taskDiffStat:null,taskDelivery:null,taskQueuePosition:null,taskQueueDepth:null,taskConcurrencyLimit:null,updatedAt:G}},C_=[e_,...g_,T_],H_=P(O,$),S_=!1;try{await new m(H_).createExclusive(C_),S_=!0;let K=g0(H.flatMap((r)=>r.type==="message_created"?[r.data.metadata]:[]));if(K.length>0){let r=new O_(J,_,{storageRoot:h()}),E=new O_(O,$,{storageRoot:h()});await r.copyReferencedTo(K,E)}}catch(K){if(S_)await new m(H_).delete().catch(()=>{return}),await new O_(O,$,{storageRoot:h()}).removeAll().catch(()=>{return});if(K.code==="EEXIST")throw Error(`Fork session already exists: ${$}`,{cause:K});throw K}let _0=this.projectMetadataFromEntries(C_,$,O,H_);return{sessionId:$,parentSessionId:_,projectPath:O,messages:this.convertJSONLToMessages(C_),metadata:this.toPublicMetadata(_0)}}static async forkRemoteSession(_,X,$,W,J){let O;try{O=o(J)}catch(Y){throw z(Y)}let Q=p(O.collisionIdentity);if($!==Q||W!==Q)throw new R;return n(Q,async(Y)=>{let Z=S(Y,_);try{await d(Y,Z)}catch(g){throw z(g)}let V;try{V=await this.readStableSessionSnapshot(Z,_)}catch(g){throw f2(g)}let H=K0(V,_,Q),G=y(this.projectMetadataFromEntries(V,_,Q,Z),O);if(G.archivedAt)throw new t(_,_);if(G.parentId){let g=await this.findRemoteArchivedAncestor(G.parentId,Y,G.remoteWorkspace);if(g)throw new t(_,g.sessionId)}let L=e(V),U=new Date().toISOString(),B=__(),k=G.rootId||_,v=this.buildForkChildEntries({sourceEntries:L,sourceCreated:H,sourceSessionId:_,targetSessionId:X,targetProjectPath:Q,rootId:k,version:B,now:U,remoteDescriptor:G.remoteWorkspace}),w=S(Y,X),X_=!1;try{await new m(w).createExclusive(v),X_=!0,await d(Y,w);let g=g0(L.flatMap((L_)=>L_.type==="message_created"?[L_.data.metadata]:[]));if(g.length>0){let L_=new O_(Q,_,{storageRoot:Q}),j_=new O_(Q,X,{storageRoot:Q});await L_.copyReferencedTo(g,j_)}}catch(g){if(X_)await new m(w).delete().catch(()=>{return}),await new O_(Q,X,{storageRoot:Q}).removeAll().catch(()=>{return});if(g.code==="EEXIST")throw Error(`Fork session already exists: ${X}`,{cause:g});throw z(g)}let Y_=y(this.projectMetadataFromEntries(v,X,Q,w),G.remoteWorkspace),{gitBranch:l,taskIsolation:c,taskSourceProjectPath:D,taskWorktreePath:x,taskWorktreeBranch:b,taskBaseCommit:T,taskDiffStat:V_,...f}=this.toPublicMetadata(Y_);return{sessionId:X,parentSessionId:_,projectPath:Q,messages:this.convertJSONLToMessages(v),metadata:f}})}static async findRemoteArchivedAncestor(_,X,$){let W=new Set,J=_;while(J){if(W.has(J))throw new R;W.add(J),A(J);let O=S(X,J);try{await d(X,O)}catch(Z){if(Z.code==="ENOENT")return;throw z(Z)}let Q;try{Q=await this.readStableSessionSnapshot(O,J)}catch(Z){throw f2(Z)}K0(Q,J,String(X));let Y=y(this.projectMetadataFromEntries(Q,J,String(X),O));if(!f_(Y.remoteWorkspace,$))return;if(Y.archivedAt)return{sessionId:Y.sessionId,archivedAt:Y.archivedAt};J=Y.parentId}return}static buildForkChildEntries(_){let{sourceEntries:X,sourceCreated:$,sourceSessionId:W,targetSessionId:J,targetProjectPath:O,rootId:Q,version:Y,now:Z,remoteDescriptor:V}=_,{status:H,taskStatus:G,taskStatusReason:L,taskFailure:U,taskStartedAt:B,taskCompletedAt:k,taskOwnerPid:v,taskPromptSummary:w,taskPriority:X_,taskKind:Y_,taskDueAt:l,taskDispatch:c,taskModelId:D,taskRetriedFrom:x,taskDelivery:b,taskIsolation:T,taskSourceProjectPath:V_,taskWorktree:f,taskDiffStat:g,taskQueuePosition:L_,taskQueueDepth:j_,taskConcurrencyLimit:o_,pendingInteraction:R0,remoteWorkspace:w0,...a_}=$.data,t_={id:I(),sessionId:J,projectPath:O,timestamp:Z,type:"session_created",cwd:O,version:Y,data:{...a_,sessionId:J,rootId:Q,parentId:W,relationType:"fork",taskStatus:"completed",taskCompletedAt:Z,remoteWorkspace:V,createdAt:Z,updatedAt:Z}},s_=X.filter((j)=>j.type!=="session_created"&&j.type!=="token_budget_handoff_recorded"&&j.type!=="inbox_acknowledged"&&j.type!=="interaction_requested"&&j.type!=="interaction_responded"&&j.type!=="interaction_recovered"&&j.type!=="review_started"&&j.type!=="review_completed").map((j)=>{let{gitBranch:e_,...g_}=j,T_={...g_,id:I(),sessionId:J,projectPath:O,cwd:O,version:Y};if(j.type==="session_updated"){let{status:C_,taskStatus:H_,taskStatusReason:S_,taskFailure:_0,taskStartedAt:K,taskCompletedAt:r,taskOwnerPid:E,taskPromptSummary:D_,taskPriority:X4,taskKind:$4,taskDueAt:W4,taskDispatch:O4,taskModelId:J4,taskRetriedFrom:Q4,taskDelivery:Y4,taskIsolation:Z4,taskSourceProjectPath:G4,taskWorktree:V4,taskDiffStat:L4,taskQueuePosition:H4,taskQueueDepth:U4,taskConcurrencyLimit:B4,pendingInteraction:N4,remoteWorkspace:q4,...A1}=j.data;return{...T_,type:"session_updated",data:{...A1,sessionId:J,rootId:Q,parentId:W,relationType:"fork"}}}if(j.type==="message_created"){let{inboxMessageId:C_,...H_}=j.data;return{...T_,type:"message_created",data:H_}}return T_}),y_={id:I(),sessionId:J,projectPath:O,timestamp:Z,type:"session_updated",cwd:O,version:Y,data:{sessionId:J,rootId:Q,parentId:W,relationType:"fork",taskStatus:"completed",taskStatusReason:null,taskFailure:null,taskStartedAt:null,taskCompletedAt:Z,taskOwnerPid:null,taskDelivery:null,taskQueuePosition:null,taskQueueDepth:null,taskConcurrencyLimit:null,updatedAt:Z}};return[t_,...s_,y_]}static async deleteSession(_,X){if(A(_),X){if(!N.isAbsolute(X))throw Error("Session catalog cwd must be absolute");let W=N.resolve(X),J=this.getSessionFilePath(W,_),O=new m(J),Q;try{Q=await O.deleteValidated((Y)=>{return this.projectMetadataFromEntries(Y,_,W,J).projectPath===W})}catch(Y){if(!this.isCorruptSessionJSONLError(Y))throw Y;Q=await O.delete()}if(!Q)return 0;return await b_(N.join(N.dirname(J),`${_}.inbox.json`),{force:!0}),await b_(M_(W,_),{force:!0}),await new O_(W,_,{storageRoot:h()}).removeAll(),await P0(W,_,h()),await this.removeFromProjection(_,W),1}let $=(await this.scanStoredSessions(void 0,!0)).filter((W)=>W.sessionId===_);if($.length===0)return 0;return await Promise.all($.map(async(W)=>{await new m(W.filePath).delete(),await b_(N.join(N.dirname(W.filePath),`${W.sessionId}.inbox.json`),{force:!0}),await b_(M_(W.projectPath,W.sessionId),{force:!0}),await new O_(W.projectPath,W.sessionId,{storageRoot:h()}).removeAll(),await P0(W.projectPath,W.sessionId,h()),await this.removeFromProjection(W.sessionId,W.projectPath)})),$.length}static async removeFromProjection(_,X){try{let $=await l_();if($)t2($,_,X)}catch{}}static validateTaskMetadataUpdate(_,X){if(_.taskPromptSummary!==void 0&&_.taskPromptSummary!==null&&(!_.taskPromptSummary.trim()||_.taskPromptSummary.length>1000))throw Error("Session task prompt summary must contain 1-1000 characters");if(_.taskPriority!==void 0&&_.taskPriority!==null&&!z0.has(_.taskPriority))throw Error("Invalid session task priority");if(_.taskKind!==void 0&&_.taskKind!==null&&!D0.has(_.taskKind))throw Error("Invalid session task kind");if(_.taskDueAt!==void 0&&_.taskDueAt!==null&&!Number.isFinite(Date.parse(_.taskDueAt)))throw Error("Invalid session task due date");if(_.taskFailure!==void 0&&_.taskFailure!==null&&!o0(_.taskFailure))throw Error("Invalid session task failure");if(_.taskDispatch!==void 0&&_.taskDispatch!==null&&!k2(_.taskDispatch))throw Error("Invalid durable task dispatch");if(_.taskModelId!==void 0&&_.taskModelId!==null&&(!_.taskModelId.trim()||_.taskModelId.length>500))throw Error("Invalid session task model ID");if(_.selectedModelId!==void 0&&_.selectedModelId!==null&&(!_.selectedModelId.trim()||_.selectedModelId.length>500))throw Error("Invalid selected session model ID");if(_.permissionMode!==void 0&&_.permissionMode!==null&&!F0(_.permissionMode))throw Error("Invalid session permission mode");if(_.reasoningEffort!==void 0&&_.reasoningEffort!==null&&!i_(_.reasoningEffort))throw Error("Invalid session reasoning effort");if(_.serviceTier!==void 0&&_.serviceTier!==null&&!d_(_.serviceTier))throw Error("Invalid session service tier");if(_.responseVerbosity!==void 0&&_.responseVerbosity!==null&&!n_(_.responseVerbosity))throw Error("Invalid session response verbosity");if(_.communicationStyle!==void 0&&_.communicationStyle!==null&&!r_(_.communicationStyle))throw Error("Invalid session communication style");if(_.communicationStyleDigest!==void 0&&_.communicationStyleDigest!==null&&!/^[a-f0-9]{64}$/.test(_.communicationStyleDigest))throw Error("Invalid session communication style digest");if(_.projectInstructionsDigest!==void 0&&_.projectInstructionsDigest!==null&&!/^[a-f0-9]{64}$/.test(_.projectInstructionsDigest))throw Error("Invalid session project instructions digest");if(_.taskRetriedFrom!==void 0&&_.taskRetriedFrom!==null&&!b2(_.taskRetriedFrom))throw Error("Invalid session task retry source");if(_.taskDelivery!==void 0&&_.taskDelivery!==null&&!w2(_.taskDelivery))throw Error("Invalid session task delivery");if(_.taskIsolation!==void 0&&_.taskIsolation!==null&&!T1.has(_.taskIsolation))throw Error(`Invalid session task isolation: ${String(_.taskIsolation)}`);if(_.taskSourceProjectPath!==void 0&&_.taskSourceProjectPath!==null&&!N.isAbsolute(_.taskSourceProjectPath))throw Error("Session task source project path must be absolute");if(_.taskWorktree!==void 0&&_.taskWorktree!==null){let $=R2(_.taskWorktree);if(!$||$.sessionId!==X||![$.repositoryRoot,$.originalWorkspaceRoot,$.worktreeRoot,$.workspaceRoot].every((W)=>N.isAbsolute(W)))throw Error("Invalid session task worktree metadata")}if(_.taskDiffStat!==void 0&&_.taskDiffStat!==null&&!x2(_.taskDiffStat))throw Error("Invalid session task diff stat");if(_.taskQueuePosition!==void 0&&_.taskQueuePosition!==null&&(!Number.isInteger(_.taskQueuePosition)||_.taskQueuePosition<1))throw Error("Invalid session task queue position");if(_.taskQueueDepth!==void 0&&_.taskQueueDepth!==null&&(!Number.isInteger(_.taskQueueDepth)||_.taskQueueDepth<0))throw Error("Invalid session task queue depth");if(_.taskConcurrencyLimit!==void 0&&_.taskConcurrencyLimit!==null&&(!Number.isInteger(_.taskConcurrencyLimit)||_.taskConcurrencyLimit<1))throw Error("Invalid session task concurrency limit");if(typeof _.taskQueuePosition==="number"&&typeof _.taskQueueDepth==="number"&&_.taskQueuePosition>_.taskQueueDepth)throw Error("Session task queue position exceeds queue depth")}static async createSessionMetadata(_,X,$={}){A(_),q.validateTaskMetadataUpdate($,_);let W=q.resolveCatalogWorkspace(X);if($.taskWorktree&&N.resolve($.taskWorktree.workspaceRoot)!==W)throw Error("Session task worktree must match the catalog workspace");let J=new Date().toISOString(),O={id:I(),sessionId:_,timestamp:J,type:"session_created",cwd:W,gitBranch:q_(W),version:__(),data:{sessionId:_,rootId:_,...$.title!==void 0?{title:$.title}:{},taskStatus:$.taskStatus??"queued",...$.taskPromptSummary!==void 0?{taskPromptSummary:$.taskPromptSummary}:{},...$.taskPriority!==void 0?{taskPriority:$.taskPriority}:{},...$.taskKind!==void 0?{taskKind:$.taskKind}:{},...typeof $.taskDueAt==="string"?{taskDueAt:new Date($.taskDueAt).toISOString()}:{},...$.taskDispatch!==void 0?{taskDispatch:$.taskDispatch}:{},...$.taskModelId!==void 0?{taskModelId:$.taskModelId}:{},...$.taskRetriedFrom!==void 0?{taskRetriedFrom:$.taskRetriedFrom}:{},...$.taskIsolation!==void 0?{taskIsolation:$.taskIsolation}:{},...$.taskSourceProjectPath!==void 0?{taskSourceProjectPath:$.taskSourceProjectPath}:{},...$.taskWorktree!==void 0?{taskWorktree:$.taskWorktree}:{},...$.selectedModelId!==void 0?{selectedModelId:$.selectedModelId}:{},...$.permissionMode!==void 0?{permissionMode:$.permissionMode}:{},...$.reasoningEffort!==void 0?{reasoningEffort:$.reasoningEffort}:{},...$.serviceTier!==void 0?{serviceTier:$.serviceTier}:{},...$.responseVerbosity!==void 0?{responseVerbosity:$.responseVerbosity}:{},...$.communicationStyle!==void 0?{communicationStyle:$.communicationStyle}:{},...$.communicationStyleDigest!==void 0?{communicationStyleDigest:$.communicationStyleDigest}:{},...$.projectInstructionsDigest!==void 0?{projectInstructionsDigest:$.projectInstructionsDigest}:{},createdAt:J,updatedAt:J}},Q=q.getSessionFilePath(W,_);return await new m(Q).createExclusive([O]),q.toPublicMetadata(q.projectMetadataFromEntries([O],_,W,Q))}static async createRemoteSessionMetadata(_,X,$,W={}){A(_),q.validateTaskMetadataUpdate(W,_);let J;try{J=o($)}catch(Y){throw z(Y)}if(p(J.collisionIdentity)!==X)throw new R;await I2(X);let Q=new Date().toISOString();return n(X,async(Y)=>{let Z=S(Y,_),V={id:I(),sessionId:_,projectPath:X,timestamp:Q,type:"session_created",cwd:X,version:__(),data:{sessionId:_,rootId:_,remoteWorkspace:J,...W.title!==void 0?{title:W.title}:{},taskStatus:W.taskStatus??"queued",...W.taskPromptSummary!==void 0?{taskPromptSummary:W.taskPromptSummary}:{},...W.taskPriority!==void 0?{taskPriority:W.taskPriority}:{},...W.taskKind!==void 0?{taskKind:W.taskKind}:{},...typeof W.taskDueAt==="string"?{taskDueAt:new Date(W.taskDueAt).toISOString()}:{},...W.taskModelId!==void 0?{taskModelId:W.taskModelId}:{},...W.selectedModelId!==void 0?{selectedModelId:W.selectedModelId}:{},...W.permissionMode!==void 0?{permissionMode:W.permissionMode}:{},...W.reasoningEffort!==void 0?{reasoningEffort:W.reasoningEffort}:{},...W.serviceTier!==void 0?{serviceTier:W.serviceTier}:{},...W.responseVerbosity!==void 0?{responseVerbosity:W.responseVerbosity}:{},...W.communicationStyle!==void 0?{communicationStyle:W.communicationStyle}:{},...W.communicationStyleDigest!==void 0?{communicationStyleDigest:W.communicationStyleDigest}:{},...W.projectInstructionsDigest!==void 0?{projectInstructionsDigest:W.projectInstructionsDigest}:{},createdAt:Q,updatedAt:Q}};try{await new m(Z).createExclusive([V])}catch(H){if(H.code!=="EEXIST")throw H;return this.assertRemoteSessionWritableInScope(_,X,J,Y)}return q.toPublicMetadata(q.projectMetadataFromEntries([V],_,X,Z))})}static async assertSessionWritable(_,X){let $=await this.findSessionMetadata(_,X);if(!$)throw Error(`Session not found: ${_}`);if($.archivedAt)throw new t(_,$.archivedBySessionId??_);return $}static async assertRemoteSessionWritable(_,X,$){A(_);let W;try{W=o($)}catch(O){throw z(O)}if(p(W.collisionIdentity)!==X)throw new R;return n(X,async(O)=>{return this.assertRemoteSessionWritableInScope(_,X,W,O)})}static async findArchivedAncestor(_,X){let $=new Set,W=_;while(W){if($.has(W))throw Error("Session lineage contains a cycle");$.add(W),A(W);let J=P(X,W),O;try{O=await G_(J,"utf8")}catch(Y){if(Y.code==="ENOENT")return;throw Y}let Q=this.projectMetadataFromEntries(this.parseStoredSession(O,W),W,X,J);if(Q.projectPath!==X)throw Error("Session lineage escapes the requested workspace");if(Q.archivedAt)return{sessionId:Q.sessionId,archivedAt:Q.archivedAt};W=Q.parentId}return}static async listSessionArchiveMembers(_,X){A(_);let $=this.resolveCatalogWorkspace(X),W=await this.scanStoredSessions($,!0,0,null);if(!W.some((Q)=>Q.sessionId===_))throw Error(`Session not found: ${_}`);let J=new Set([_]),O=!0;while(O){O=!1;for(let Q of W)if(Q.parentId&&J.has(Q.parentId)&&!J.has(Q.sessionId))J.add(Q.sessionId),O=!0}return W.filter((Q)=>J.has(Q.sessionId)).sort((Q,Y)=>Q.sessionId.localeCompare(Y.sessionId)).map((Q)=>this.toPublicMetadata(Q))}static async archiveSession(_,X){A(_);let $=this.resolveCatalogWorkspace(X),W=await this.findSessionMetadata(_,$);if(!W)throw Error(`Session not found: ${_}`);if(W.archivedAt)return W;let J=await this.listSessionArchiveMembers(_,$),O=J.find((Y)=>Y.taskStatus==="queued"||Y.taskStatus==="running");if(O)throw new Q_(`Stop session ${O.sessionId} before archiving this session tree`);let Q=[];try{for(let H of J)Q.push(await u.acquire(H.sessionId,$));let Y=P($,_),Z=new m(Y),V=[];return await Z.appendValidated((H)=>{let G=this.projectMetadataFromEntries(H,_,$,Y);if(G.archivedAt)throw new Q_(`Session archive state changed concurrently: ${_}`);if(G.taskStatus==="queued"||G.taskStatus==="running")throw new Q_(`Stop session ${_} before archiving it`);let L=new Date().toISOString(),U={id:I(),sessionId:_,timestamp:L,type:"session_updated",cwd:$,gitBranch:q_($),version:__(),data:{sessionId:_,archivedAt:L,updatedAt:L}};return V=[...H,U],U}),this.toPublicMetadata({...this.projectMetadataFromEntries(V,_,$,Y),archivedBySessionId:_})}catch(Y){if(Y instanceof Q_)throw Y;if(Y instanceof B_)throw new Q_(Y.message);throw this.sanitizeStoredSessionError(Y,_)}finally{for(let Y of Q.reverse())await Y.release()}}static async unarchiveSession(_,X){A(_);let $=this.resolveCatalogWorkspace(X),W=await this.findSessionMetadata(_,$);if(!W)throw Error(`Session not found: ${_}`);if(!W.archivedAt)return W;if(W.archivedBySessionId&&W.archivedBySessionId!==_)throw new Q_(`Unarchive ancestor ${W.archivedBySessionId} to restore session ${_}`);let J;try{J=await u.acquire(_,$);let O=P($,_),Q=new m(O),Y=[];return await Q.appendValidated((Z)=>{if(!this.projectMetadataFromEntries(Z,_,$,O).archivedAt)throw new Q_(`Session archive state changed concurrently: ${_}`);let H=new Date().toISOString(),G={id:I(),sessionId:_,timestamp:H,type:"session_updated",cwd:$,gitBranch:q_($),version:__(),data:{sessionId:_,archivedAt:null,updatedAt:H}};return Y=[...Z,G],G}),this.toPublicMetadata(this.projectMetadataFromEntries(Y,_,$,O))}catch(O){if(O instanceof Q_)throw O;if(O instanceof B_)throw new Q_(O.message);throw this.sanitizeStoredSessionError(O,_)}finally{await J?.release()}}static async updateSessionMetadata(_,X,$){if(A(_),q.validateTaskMetadataUpdate($,_),$.taskStatus!==void 0&&!O1.has($.taskStatus))throw Error(`Invalid session task status: ${String($.taskStatus)}`);if($.taskOwnerPid!==void 0&&$.taskOwnerPid!==null&&(!Number.isInteger($.taskOwnerPid)||$.taskOwnerPid<=0))throw Error("Session task owner PID must be a positive integer");let W=q.resolveCatalogWorkspace(X);if($.taskWorktree&&N.resolve($.taskWorktree.workspaceRoot)!==W)throw Error("Session task worktree must match the catalog workspace");let J=q.getSessionFilePath(W,_),O=new m(J),Q=[];try{await O.appendValidatedAsync(async(Y)=>{let Z=q.getSessionCreatedEntry(Y,_);if(Z.data.sessionId!==_)throw Error(`Session metadata creation record sessionId mismatch: ${_}`);if(!N.isAbsolute(Z.cwd)||N.resolve(Z.cwd)!==W)throw Error(`Session metadata creation record cwd mismatch: ${_}`);let V=q.projectMetadataFromEntries(Y,_,W,J);if(V.archivedAt)throw new t(_,_);if(V.parentId){let L=await q.findArchivedAncestor(V.parentId,W);if(L)throw new t(_,L.sessionId)}let H=new Date().toISOString(),G={id:I(),sessionId:_,timestamp:H,type:"session_updated",cwd:W,gitBranch:q_(W),version:__(),data:{sessionId:_,...$.title!==void 0?{title:$.title}:{},...$.taskStatus!==void 0?{taskStatus:$.taskStatus}:{},...$.taskStatusReason!==void 0?{taskStatusReason:$.taskStatusReason}:{},...$.taskFailure!==void 0?{taskFailure:$.taskFailure}:{},...$.taskStartedAt!==void 0?{taskStartedAt:$.taskStartedAt}:{},...$.taskCompletedAt!==void 0?{taskCompletedAt:$.taskCompletedAt}:{},...$.taskOwnerPid!==void 0?{taskOwnerPid:$.taskOwnerPid}:{},...$.taskPromptSummary!==void 0?{taskPromptSummary:$.taskPromptSummary}:{},...$.taskPriority!==void 0?{taskPriority:$.taskPriority}:{},...$.taskKind!==void 0?{taskKind:$.taskKind}:{},...$.taskDueAt!==void 0?{taskDueAt:$.taskDueAt===null?null:new Date($.taskDueAt).toISOString()}:{},...$.taskDispatch!==void 0?{taskDispatch:$.taskDispatch}:{},...$.taskModelId!==void 0?{taskModelId:$.taskModelId}:{},...$.taskRetriedFrom!==void 0?{taskRetriedFrom:$.taskRetriedFrom}:{},...$.taskDelivery!==void 0?{taskDelivery:$.taskDelivery}:{},...$.taskIsolation!==void 0?{taskIsolation:$.taskIsolation}:{},...$.taskSourceProjectPath!==void 0?{taskSourceProjectPath:$.taskSourceProjectPath}:{},...$.taskWorktree!==void 0?{taskWorktree:$.taskWorktree}:{},...$.taskDiffStat!==void 0?{taskDiffStat:$.taskDiffStat}:{},...$.taskQueuePosition!==void 0?{taskQueuePosition:$.taskQueuePosition}:{},...$.taskQueueDepth!==void 0?{taskQueueDepth:$.taskQueueDepth}:{},...$.taskConcurrencyLimit!==void 0?{taskConcurrencyLimit:$.taskConcurrencyLimit}:{},...$.selectedModelId!==void 0?{selectedModelId:$.selectedModelId}:{},...$.permissionMode!==void 0?{permissionMode:$.permissionMode}:{},...$.reasoningEffort!==void 0?{reasoningEffort:$.reasoningEffort}:{},...$.serviceTier!==void 0?{serviceTier:$.serviceTier}:{},...$.responseVerbosity!==void 0?{responseVerbosity:$.responseVerbosity}:{},...$.communicationStyle!==void 0?{communicationStyle:$.communicationStyle}:{},...$.communicationStyleDigest!==void 0?{communicationStyleDigest:$.communicationStyleDigest}:{},...$.projectInstructionsDigest!==void 0?{projectInstructionsDigest:$.projectInstructionsDigest}:{},updatedAt:H}};return Q=[...Y,G],G})}catch(Y){throw q.sanitizeStoredSessionError(Y,_)}return q.toPublicMetadata(q.projectMetadataFromEntries(Q,_,W,J))}static async updateRemoteSessionMetadata(_,X,$,W){if(A(_),q.validateTaskMetadataUpdate(W,_),W.taskStatus!==void 0&&!O1.has(W.taskStatus))throw Error(`Invalid session task status: ${String(W.taskStatus)}`);if(W.taskOwnerPid!==void 0&&W.taskOwnerPid!==null&&(!Number.isInteger(W.taskOwnerPid)||W.taskOwnerPid<=0))throw Error("Session task owner PID must be a positive integer");let J;try{if(J=o($),p(J.collisionIdentity)!==X)throw new R}catch(O){throw z(O)}try{return await n(X,async(O)=>{let Q=S(O,_);await d(O,Q);let Y=new m(Q),Z=[];return await Y.appendValidatedAsync(async(V)=>{let H=y(q.projectMetadataFromEntries(V,_,X,Q),J);if(H.archivedAt)throw new t(_,_);if(H.parentId){let U=await q.findRemoteArchivedAncestor(H.parentId,O,H.remoteWorkspace);if(U)throw new t(_,U.sessionId)}let G=new Date().toISOString(),L={id:I(),sessionId:_,projectPath:X,timestamp:G,type:"session_updated",cwd:X,version:__(),data:{sessionId:_,...W.title!==void 0?{title:W.title}:{},...W.taskStatus!==void 0?{taskStatus:W.taskStatus}:{},...W.taskStatusReason!==void 0?{taskStatusReason:W.taskStatusReason}:{},...W.taskFailure!==void 0?{taskFailure:W.taskFailure}:{},...W.taskStartedAt!==void 0?{taskStartedAt:W.taskStartedAt}:{},...W.taskCompletedAt!==void 0?{taskCompletedAt:W.taskCompletedAt}:{},...W.taskOwnerPid!==void 0?{taskOwnerPid:W.taskOwnerPid}:{},...W.taskPromptSummary!==void 0?{taskPromptSummary:W.taskPromptSummary}:{},...W.taskPriority!==void 0?{taskPriority:W.taskPriority}:{},...W.taskKind!==void 0?{taskKind:W.taskKind}:{},...W.taskDueAt!==void 0?{taskDueAt:W.taskDueAt===null?null:new Date(W.taskDueAt).toISOString()}:{},...W.taskModelId!==void 0?{taskModelId:W.taskModelId}:{},...W.taskQueuePosition!==void 0?{taskQueuePosition:W.taskQueuePosition}:{},...W.taskQueueDepth!==void 0?{taskQueueDepth:W.taskQueueDepth}:{},...W.taskConcurrencyLimit!==void 0?{taskConcurrencyLimit:W.taskConcurrencyLimit}:{},...W.selectedModelId!==void 0?{selectedModelId:W.selectedModelId}:{},...W.permissionMode!==void 0?{permissionMode:W.permissionMode}:{},...W.reasoningEffort!==void 0?{reasoningEffort:W.reasoningEffort}:{},...W.serviceTier!==void 0?{serviceTier:W.serviceTier}:{},...W.responseVerbosity!==void 0?{responseVerbosity:W.responseVerbosity}:{},...W.communicationStyle!==void 0?{communicationStyle:W.communicationStyle}:{},...W.communicationStyleDigest!==void 0?{communicationStyleDigest:W.communicationStyleDigest}:{},...W.projectInstructionsDigest!==void 0?{projectInstructionsDigest:W.projectInstructionsDigest}:{},updatedAt:G}};return Z=[...V,L],L},{noFollow:!0,validateHandle:(V)=>m2(O,Q,V)}),q.toPublicMetadata(y(q.projectMetadataFromEntries(Z,_,X,Q),J))})}catch(O){if(O instanceof p_||O instanceof t)throw O;throw z(O)}}static async setSessionPermissionMode(_,X,$){if(A(_),!F0($))throw Error("Invalid session permission mode");let W=q.resolveCatalogWorkspace(X),J=await q.findSessionMetadata(_,W);if(J?.permissionMode===$)return J;if(J)return q.updateSessionMetadata(_,W,{permissionMode:$});try{return await q.createSessionMetadata(_,W,{taskStatus:"completed",permissionMode:$})}catch(O){if(O.code!=="EEXIST")throw O;return q.updateSessionMetadata(_,W,{permissionMode:$})}}static async findSessionTaskWorktree(_,X){A(_);let $=q.resolveCatalogWorkspace(X),W=q.getSessionFilePath($,_);try{return(await q.readStoredSessionMetadata(W,_,$)).taskWorktree}catch(J){if(J.code==="ENOENT")return;throw q.sanitizeStoredSessionError(J,_)}}static async findSessionTaskDispatch(_,X){A(_);let $=q.resolveCatalogWorkspace(X),W=q.getSessionFilePath($,_);try{return(await q.readStoredSessionMetadata(W,_,$)).taskDispatch}catch(J){if(J.code==="ENOENT")return;throw q.sanitizeStoredSessionError(J,_)}}static async loadSessionFromFile(_,X,$){let W=await G_(_,"utf-8"),J=this.parseStoredSession(W,X);if($!==void 0){if(this.projectMetadataFromEntries(J,X,$,_).projectPath!==$)throw Error(`未找到会话: ${X}`)}return this.convertJSONLToMessages(J)}static async loadSessionModelContextFromFile(_,X,$){let W=await G_(_,"utf-8"),J=this.parseStoredSession(W,X);if($!==void 0){if(this.projectMetadataFromEntries(J,X,$,_).projectPath!==$)throw Error(`未找到会话: ${X}`)}return this.convertJSONLToModelContext(J)}static convertJSONLToModelContext(_){let X=e(_),$=-1,W;for(let O=0;O<X.length;O++){let Q=X[O];if(Q?.type!=="part_created"||Q.data.partType!=="summary")continue;let Y=Q.data.payload;if($=O,W=V0(Y.replacementMessages),!W)W=[{role:"user",content:Y.text??"",metadata:Q.data.payload}]}if($<0||!W)return this.convertJSONLToMessages(X,{includeTokenBudgetHandoffs:!0});let J=this.convertJSONLToMessages(X.slice($+1),{includeTokenBudgetHandoffs:!0});return[...W,...J]}static convertJSONLToMessages(_,X={}){let $=[],W=new Map,J=new Map,O=new Map,Q=new Map,Y=new Map,Z=e(_),V=X.includeTokenBudgetHandoffs?O2(Z):{kind:"none"},H=new Set;for(let G of Z){if(G.type==="token_budget_handoff_recorded"){if(V.kind==="valid"&&V.event.id===G.id){let L=J2(G);if(L)$.push(L)}continue}if(G.type==="message_created"){let L=G.data.metadata&&typeof G.data.metadata==="object"&&!Array.isArray(G.data.metadata)?G.data.metadata:void 0,U=L?.codeReview&&typeof L.codeReview==="object"&&!Array.isArray(L.codeReview)?L.codeReview:void 0;if(U?.phase==="completed"&&typeof U.reviewId==="string")H.add(U.reviewId);let B=G.data.role==="assistant"&&G.data.parentMessageId?O.get(G.data.parentMessageId):void 0,k=B??{role:G.data.role,content:"",...G.data.metadata||G.data.inboxMessageId?{metadata:{...G.data.metadata&&typeof G.data.metadata==="object"&&!Array.isArray(G.data.metadata)?G.data.metadata:{},...G.data.inboxMessageId?{inboxMessageId:G.data.inboxMessageId}:{}}}:{}};if(W.set(G.data.messageId,k),J.set(G.data.messageId,[]),!B)$.push(k)}if(G.type==="part_created"){if(G.data.partType==="reasoning"){let L=W.get(G.data.messageId);if(L){let U=G.data.payload;L.reasoningContent=(L.reasoningContent??"")+(U.text??"")}}if(G.data.partType==="text"){let L=W.get(G.data.messageId);if(L){let U=G.data.payload,B=J.get(G.data.messageId);if(B)B.push({type:"text",text:U.text??""}),L.content=S2(B);else L.content=U.text??""}}if(G.data.partType==="image"){let L=W.get(G.data.messageId);if(L){let U=G.data.payload,B=J.get(G.data.messageId);if(B&&U.dataUrl)B.push({type:"image_url",image_url:{url:U.dataUrl}}),L.content=S2(B)}}if(G.data.partType==="tool_call"){let L=W.get(G.data.messageId);if(L?.role!=="assistant"){if(L=O.get(G.data.messageId),!L)L={role:"assistant",content:"",tool_calls:[]},O.set(G.data.messageId,L),$.push(L)}if(L.role==="assistant"){let U=G.data.payload,B=U.toolCallId??G.data.partId;Q.set(G.data.partId,B),Y.set(B,L),L.tool_calls??=[],L.tool_calls.push({id:B,type:"function",function:{name:U.toolName??"unknown",arguments:JSON.stringify(U.input??{})}})}}if(G.data.partType==="tool_result"){let L=G.data.payload,U=L2(L),B=U.error?`Error: ${U.error.message}`:typeof U.llmContent==="string"?U.llmContent:JSON.stringify(U.llmContent),k=L;$.push({role:"tool",content:B,tool_call_id:Q.get(G.data.messageId)??L.toolCallId,name:L.toolName,metadata:k})}if(G.data.partType==="summary"){let L=G.data.payload,U=G.data.payload;$.push({role:"system",content:L.text??"",metadata:U})}if(G.data.partType==="subtask_ref"){let L=W.get(G.data.messageId)??Y.get(G.data.messageId);if(L){let U=G.data.payload,B=L.metadata??{};L.metadata={...B,subtaskRef:U}}}}}for(let G of L0(Z)){if(G.completion===void 0||H.has(G.start.reviewId))continue;$.push({role:"assistant",content:e1(G.start,G.completion),metadata:{codeReview:{..._2(G.start,G.completion),synthetic:!0}}})}return $}static projectionDeriver(){return(_,X,$,W,J)=>{try{let O=J??P($,X),Q=this.projectMetadataFromEntries(_,X,$,O);if(W==="acp-remote")return y(Q);return Q}catch(O){if(W==="acp-remote")throw z(O);return null}}}static projectionDeriverForSearch(){return this.projectionDeriver()}static async scanStoredSessionsFromProjection(_,X,$=0,W=!1,J={}){try{let O=await l_();if(!O)return null;await q1(O,this.projectionDeriver(),$);let Q=[];Q.push("source_kind = 'local'");let Y=[];if(_!==void 0)Q.push("project_path=?"),Y.push(_);bX(J,"",Q,Y);let Z=Q.length>0?` WHERE ${Q.join(" AND ")}`:"",V=O.prepare(`SELECT metadata_json, is_subagent FROM sessions${Z}`).all(...Y),H=[];for(let L of V){if(!X&&L.is_subagent===1)continue;try{let U=JSON.parse(L.metadata_json);if(U.remoteWorkspace)continue;if(_!==void 0&&U.projectPath!==_)continue;H.push(U)}catch{}}let G=await Promise.all(H.map((L)=>this.reconcileInterruptedTask(L)));return Q1(G.filter((L)=>s2(L,J)),W)}catch{return null}}static async scanStoredSessions(_,X=!1,$=0,W=!1,J={}){let O=_?N.resolve(_):void 0,Q=await this.scanStoredSessionsFromProjection(O,X,0,W,J);if(Q)return Q;let Y=O?[{storagePath:K_(O),projectPath:O}]:await this.listAllProjectStorageDirectories(),Z=[];for(let V of Y){let H;try{H=await k_(V.storagePath)}catch(G){if(G.code==="ENOENT")continue;throw G}for(let G of H){if(!G.endsWith(".jsonl"))continue;let L=G.slice(0,-6),U=N.join(V.storagePath,G);try{let B=await this.readLocalCatalogSessionMetadata(U,L,V.projectPath);if(!B)continue;if(O!==void 0&&B.projectPath!==O){u_.warn(`[SessionService] Skipping out-of-scope session transcript: ${L}`);continue}if(!X&&B.relationType==="subagent")continue;if(!fX(B,J))continue;Z.push(await this.reconcileInterruptedTask(B))}catch(B){let k=B.code;if(k==="ENOENT")continue;if(k)throw B;if(B instanceof R)throw B;u_.warn(`[SessionService] Skipping invalid session transcript: ${L}`)}}}return Q1(Z,W)}static async listAllProjectStorageDirectories(){let _=N.join(h(),"projects"),X;try{X=await k_(_,{withFileTypes:!0,encoding:"utf8"})}catch($){if($.code==="ENOENT")return[];throw $}return X.filter(($)=>$.isDirectory()).map(($)=>({storagePath:N.join(_,$.name),projectPath:v2($.name)}))}static async listRemoteSessionScopes(_){if(_.descriptor){let $=p(_.descriptor.collisionIdentity);try{return await n($,async()=>[{hostStateRoot:$,descriptor:_.descriptor}])}catch(W){if(W.code==="ENOENT")return[];throw z(W)}}return(await Y1()).map(($)=>({hostStateRoot:String($)}))}static async scanRemoteStoredSessions(_,X=0){let $=await this.scanRemoteStoredSessionsFromProjection(_,X);if($)return $;let W=await this.listRemoteSessionScopes(_),J=[];for(let O of W)await n(O.hostStateRoot,async(Q)=>{let Y;try{Y=await k_(String(Q))}catch(Z){if(Z.code==="ENOENT")return;throw z(Z)}for(let Z of Y){if(!Z.endsWith(".jsonl"))continue;let V=Z.slice(0,-6);if(!h_(V))continue;let H=S(Q,V),G;try{G=await this.readRemoteStoredSessionMetadata(H,V,O.hostStateRoot,Q,_.descriptor)}catch(L){if(L.code==="ENOENT")continue;if(L instanceof Error&&L.message)throw z(L);throw L}if(!G)continue;if(!_.includeSubagents&&G.relationType==="subagent")continue;J.push(G)}});return g2(J,_.archived)}static async scanRemoteStoredSessionsFromProjection(_,X=0){try{let $=await l_();if(!$)return null;if(_.descriptor)await o2($,this.projectionDeriver(),p(_.descriptor.collisionIdentity));else await a2($,this.projectionDeriver());let W=["source_kind = 'acp-remote'"],J=[];if(_.descriptor)W.push("project_path=?"),J.push(p(_.descriptor.collisionIdentity));let O=W.length>0?` WHERE ${W.join(" AND ")}`:"",Q=$.prepare(`SELECT metadata_json, is_subagent FROM sessions${O}`).all(...J),Y=[];for(let G of Q){if(!_.includeSubagents&&G.is_subagent===1)continue;let L=y(JSON.parse(G.metadata_json),void 0);if(_.descriptor&&!f_(L.remoteWorkspace,_.descriptor))continue;Y.push(L)}let Z=_.descriptor,V=Z?Y.filter((G)=>f_(G.remoteWorkspace,Z)):Y,H=await Promise.all(V.map((G)=>this.reconcileInterruptedTask(G,"acp-remote")));return g2(H.map((G)=>y(G)),_.archived)}catch($){throw z($)}}static toRemoteCatalogEntries(_){return _.flatMap((X)=>{if(!X.remoteWorkspace)return[];return[{...X,workspaceIdentity:X.remoteWorkspace.exactIdentity}]})}static async readStoredSessionMetadata(_,X,$,W="local",J){if(W==="acp-remote"){if(!J||String(J)!==$)throw new R;let Q=S(J,X);if(_!==Q)throw new R}let O=await this.readStoredSessionMetadataWithoutReconciliation(_,X,$);if(W==="acp-remote")y(O);return this.reconcileInterruptedTask(O,W,J)}static async readStoredSessionMetadataWithoutReconciliation(_,X,$){let W=await G_(_,"utf-8"),J=this.parseStoredSession(W,X);return this.projectMetadataFromEntries(J,X,$,_)}static async readLocalCatalogSessionMetadata(_,X,$){let W=await G_(_,"utf-8"),J=this.parseStoredSession(W,X),O=this.getSessionCreatedEntry(J,X);if(Object.hasOwn(O.data,"remoteWorkspace")){try{o(O.data.remoteWorkspace)}catch(Q){throw z(Q)}return}return this.projectMetadataFromEntries(J,X,$,_)}static async readRemoteStoredSessionMetadata(_,X,$,W,J){if(String(W)!==$||_!==S(W,X))throw new R;await d(W,_);let O=await G_(_,"utf-8"),Q=this.parseStoredSession(O,X);this.validateSessionWorkspace(Q,X,$);let Y=y(this.projectMetadataFromEntries(Q,X,$,_));if(J&&!f_(Y.remoteWorkspace,J))return;return y(await this.reconcileInterruptedTask(Y,"acp-remote",W),Y.remoteWorkspace)}static async reconcileInterruptedTask(_,X="local",$){let W=_.taskOwnerPid;if(_.taskStatus!=="running"||W===void 0||D2(W))return _;if(X==="acp-remote"){if($)return this.reconcileInterruptedTaskInScope(_,W,$);return n(_.projectPath,async(J)=>this.reconcileInterruptedTaskInScope(_,W,J))}return this.reconcileInterruptedTaskInScope(_,W)}static async reconcileInterruptedTaskInScope(_,X,$){let W=$?y(_).remoteWorkspace:void 0;if($){let Y=S($,_.sessionId);if(_.projectPath!==String($)||_.filePath!==Y)throw new R;await d($,_.filePath)}let J;try{J=$?await u.acquireRemote(_.sessionId,$):await u.acquire(_.sessionId,_.projectPath)}catch(Y){if(!(Y instanceof B_))throw Y;let Z=await G_(_.filePath,"utf-8"),V=this.projectMetadataFromEntries(this.parseStoredSession(Z,_.sessionId),_.sessionId,_.projectPath,_.filePath);return W?y(V,W):V}let O=new m(_.filePath),Q;try{try{await O.appendValidated((Z)=>{let V=this.projectMetadataFromEntries(Z,_.sessionId,_.projectPath,_.filePath);if(W)y(V,W);if(V.taskStatus!=="running"||V.taskOwnerPid!==X||D2(X))throw new C1;let H=new Date().toISOString(),G={id:I(),sessionId:_.sessionId,timestamp:H,type:"session_updated",cwd:_.projectPath,...$?{projectPath:_.projectPath}:{},...$?{}:{gitBranch:q_(_.projectPath)},version:__(),data:{sessionId:_.sessionId,taskStatus:"interrupted",taskStatusReason:"Task owner process exited before completion",taskCompletedAt:H,taskOwnerPid:null,taskQueuePosition:null,taskQueueDepth:null,updatedAt:H}};return Q=[...Z,G],G})}catch(Z){if(!(Z instanceof C1))throw Z}if(!Q){let Z=await G_(_.filePath,"utf-8");Q=this.parseStoredSession(Z,_.sessionId)}let Y=this.projectMetadataFromEntries(Q,_.sessionId,_.projectPath,_.filePath);return W?y(Y,W):Y}finally{await J.release()}}static projectMetadataFromEntries(_,X,$,W){if(_.length===0)throw Error(`Empty session transcript: ${X}`);let J=this.getSessionCreatedEntry(_,X);if(Object.hasOwn(J.data,"remoteWorkspace"))this.validateRemoteSessionCreationRecord(_,J,X,$);let O=_.reduce((E,D_)=>D_.type==="session_updated"?{...E,...D_.data}:E,{...J.data}),Q=e(_),Y=s1(t1(Q)),V=L0(Q).at(-1),H=Q.findLastIndex((E)=>E.type==="review_started"&&E.data.reviewId===V?.start.reviewId||E.type==="review_completed"&&E.data.reviewId===V?.start.reviewId),G=Q.findLastIndex((E)=>(E.type==="session_created"||E.type==="session_updated")&&Object.hasOwn(E.data,"taskStatus")),L=V!==void 0&&H>G,U=L?V.completion===void 0?"running":V.completion.status==="completed"||V.completion.status==="stale"?"completed":V.completion.status==="aborted"?"cancelled":V.completion.status==="interrupted"?"interrupted":"failed":void 0,B=Q.filter((E)=>E.type==="message_created"&&["user","assistant"].includes(E.data.role)).length,k=Q.some((E)=>E.type==="part_created"&&E.data.partType==="tool_result"&&typeof E.data.payload.error==="string"),v=O1.has(O.taskStatus)?O.taskStatus:void 0,w=U??v??(k?"failed":"completed"),X_=typeof O.taskOwnerPid==="number"&&Number.isInteger(O.taskOwnerPid)&&O.taskOwnerPid>0?O.taskOwnerPid:void 0,Y_=T1.has(O.taskIsolation)?O.taskIsolation:void 0,l=typeof O.taskSourceProjectPath==="string"&&N.isAbsolute(O.taskSourceProjectPath)?N.resolve(O.taskSourceProjectPath):void 0,c=J.cwd;if(c!==void 0&&!N.isAbsolute(c))throw Error(`Session catalog cwd must be absolute: ${X}`);let D=c===void 0?$:N.resolve(c),x=this.parseRemoteWorkspaceFromCreated(J,X,D),b=R2(O.taskWorktree),T=b?.sessionId===X&&N.resolve(b.workspaceRoot)===D?b:void 0,V_=x2(O.taskDiffStat),f=k2(O.taskDispatch),g=z0.has(O.taskPriority)?O.taskPriority:f?.taskPriority,L_=D0.has(O.taskKind)?O.taskKind:f?.taskKind,j_=typeof O.taskDueAt==="string"&&Number.isFinite(Date.parse(O.taskDueAt))?new Date(O.taskDueAt).toISOString():f?.taskDueAt,o_=typeof O.taskModelId==="string"&&O.taskModelId.trim()?O.taskModelId:f?.modelId,R0=typeof O.selectedModelId==="string"&&O.selectedModelId.trim()?O.selectedModelId:o_,w0=F0(O.permissionMode)?O.permissionMode:f?.permissionMode,a_=i_(O.reasoningEffort)?O.reasoningEffort:f?.reasoningEffort,t_=d_(O.serviceTier)?O.serviceTier:f?.serviceTier,s_=n_(O.responseVerbosity)?O.responseVerbosity:f?.responseVerbosity,y_=r_(O.communicationStyle)?O.communicationStyle:f?.communicationStyle,j=Object.hasOwn(O,"communicationStyleDigest")?typeof O.communicationStyleDigest==="string"&&/^[a-f0-9]{64}$/.test(O.communicationStyleDigest)?O.communicationStyleDigest:void 0:y_===f?.communicationStyle?f?.communicationStyleDigest:void 0,e_=Object.hasOwn(O,"projectInstructionsDigest")?typeof O.projectInstructionsDigest==="string"&&/^[a-f0-9]{64}$/.test(O.projectInstructionsDigest)?O.projectInstructionsDigest:void 0:f?.projectInstructionsDigest,g_=M1(O.archivedAt)?O.archivedAt:void 0,T_=b2(O.taskRetriedFrom),C_=w2(O.taskDelivery),H_=typeof O.taskQueuePosition==="number"&&Number.isInteger(O.taskQueuePosition)&&O.taskQueuePosition>0?O.taskQueuePosition:void 0,S_=typeof O.taskQueueDepth==="number"&&Number.isInteger(O.taskQueueDepth)&&O.taskQueueDepth>=0?O.taskQueueDepth:void 0,_0=typeof O.taskConcurrencyLimit==="number"&&Number.isInteger(O.taskConcurrencyLimit)&&O.taskConcurrencyLimit>0?O.taskConcurrencyLimit:void 0,K=L?V?.completion?V.completion.status==="completed"?void 0:`Code review ${h0(V.completion.status)}`:`Reviewing ${V?.start.target.label??"changes"}`:void 0,r=L?w==="failed"&&K?r0(K):void 0:o0(O.taskFailure)?O.taskFailure:w==="failed"&&typeof O.taskStatusReason==="string"?r0(O.taskStatusReason):void 0;return{sessionId:X,projectPath:D,remoteWorkspace:x,...J.gitBranch!==void 0?{gitBranch:J.gitBranch}:{},rootId:O.rootId||X,parentId:O.parentId,relationType:O.relationType,resumedFrom:O.resumedFrom,rootAgentId:O.rootAgentId,resumeDepth:O.resumeDepth,title:O.title,agentType:O.agentType,model:O.model,selectedModelId:R0,permissionMode:w0,reasoningEffort:a_,serviceTier:t_,responseVerbosity:s_,communicationStyle:y_,communicationStyleDigest:j,projectInstructionsDigest:e_,pendingInteraction:Y,taskStatus:w,taskStatusReason:r?.message??K??(typeof O.taskStatusReason==="string"?O.taskStatusReason:void 0),taskFailure:r,taskStartedAt:L?V?.start.startedAt:typeof O.taskStartedAt==="string"?O.taskStartedAt:void 0,taskCompletedAt:L?V?.completion?.completedAt:typeof O.taskCompletedAt==="string"?O.taskCompletedAt:void 0,taskPromptSummary:L?V?SX(V.start.target):"/review uncommitted":typeof O.taskPromptSummary==="string"?O.taskPromptSummary:void 0,taskPriority:g,taskKind:L_,taskDueAt:j_,taskModelId:o_,taskRetryAvailable:f!==void 0,taskRetriedFrom:T_,taskDelivery:C_,taskIsolation:Y_,taskSourceProjectPath:l,taskWorktreePath:T?.worktreeRoot,taskWorktreeBranch:T?.branch,taskBaseCommit:T?.baseCommit,taskDiffStat:V_,taskQueuePosition:H_,taskQueueDepth:S_,taskConcurrencyLimit:_0,archivedAt:g_,taskOwnerPid:L?void 0:X_,taskWorktree:T,taskDispatch:f,messageCount:B,firstMessageTime:_[0].timestamp,lastMessageTime:_.at(-1).timestamp,hasErrors:k||w==="failed",filePath:W}}static parseRemoteWorkspaceFromCreated(_,X,$){if(!Object.hasOwn(_.data,"remoteWorkspace"))return;let W;try{W=o(_.data.remoteWorkspace)}catch(O){throw z(O)}if(p(W.collisionIdentity)!==$)throw new R;return W}static async assertRemoteSessionWritableInScope(_,X,$,W){let J=S(W,_),O;try{await d(W,J),O=await this.readStableSessionSnapshot(J,_)}catch(Y){throw z(Y)}let Q;try{Q=this.projectMetadataFromEntries(O,_,X,J)}catch(Y){throw z(Y)}if(Q.archivedAt)throw new t(_,Q.archivedBySessionId??_);if(!Q.remoteWorkspace)throw new R;if(!f_(Q.remoteWorkspace,$))throw new p_;return this.toPublicMetadata(Q)}static async readValidatedRemoteSessionSnapshot(_,X,$,W){W?.throwIfAborted();let J;try{if(A(_),J=o($),p(J.collisionIdentity)!==X)throw new R}catch(O){throw z(O)}try{return await n(X,async(O)=>{W?.throwIfAborted();let Q=S(O,_);await d(O,Q);let Y=await this.readStableSessionSnapshot(Q,_,3,W),Z=this.projectMetadataFromEntries(Y,_,X,Q);return y(Z,J),Y})}catch(O){if(W?.aborted)throw O;if(O instanceof p_)throw O;throw z(O)}}static toPublicMetadata(_){let{filePath:X,taskOwnerPid:$,taskWorktree:W,taskDispatch:J,...O}=_;return O}static getSessionFilePath(_,X){return P(_,X)}static getSessionCreatedEntry(_,X){let $=_.find((W)=>W.type==="session_created");if(!$)throw new _4(X);return $}static validateRemoteSessionCreationRecord(_,X,$,W){if(K0(_,$,W)!==X)throw new R}static resolveCatalogWorkspace(_){if(!N.isAbsolute(_))throw Error("Session catalog cwd must be absolute");return M0(_)}static validateSessionWorkspace(_,X,$){let W=this.getSessionCreatedEntry(_,X);if(W.data.sessionId!==X)throw Error(`Session creation record sessionId mismatch: ${X}`);if(!N.isAbsolute(W.cwd)||N.resolve(W.cwd)!==$)throw Error(`Session creation record cwd mismatch: ${X}`)}static resolveForkWorkspace(_){if(!N.isAbsolute(_))throw Error("Fork workspace paths must be absolute");return M0(_)}static parseStoredSession(_,X){return c2(_,`session ${X}`)}static isCorruptSessionJSONLError(_){return _ instanceof Error&&_.message.startsWith("Invalid session JSONL ")}static sanitizeStoredSessionError(_,X){if(!this.isCorruptSessionJSONLError(_)||!(_ instanceof Error))return _;let $=_.message.match(/ at line (\d+)$/)?.[1];return Error(`Invalid session JSONL in session ${X}${$?` at line ${$}`:""}`,{cause:_.cause})}static async readStableSessionSnapshot(_,X,$=3,W){for(let J=0;J<$;J+=1){W?.throwIfAborted();let O=await c_.stat(_,W),Q=await c_.readFile(_,W),Y=this.parseStoredSession(Q,X),Z=await c_.stat(_,W);if(W?.throwIfAborted(),O.size===Z.size&&O.mtimeNs===Z.mtimeNs&&O.dev===Z.dev&&O.ino===Z.ino)return Y}throw new K1}}function S2(_){if(_.length===1&&_[0]?.type==="text")return _[0].text;return[..._]}
94
- export{cX as rc,pX as sc,nX as tc,U_ as uc,dX as vc,m0 as wc,a0 as xc,D1 as yc,X0 as zc,w1 as Ac,tX as Bc,B_ as Cc,u as Dc,k4 as Ec,S1 as Fc,O_ as Gc,M$ as Hc,A$ as Ic,E$ as Jc,F$ as Kc,z$ as Lc,D$ as Mc,R$ as Nc,w$ as Oc,x$ as Pc,k$ as Qc,b$ as Rc,f$ as Sc,j$ as Tc,y$ as Uc,g$ as Vc,S$ as Wc,I$ as Xc,m$ as Yc,v$ as Zc,P$ as _c,u$ as $c,h$ as ad,l$ as bd,c$ as cd,p$ as dd,n$ as ed,d$ as fd,i$ as gd,r$ as hd,o$ as id,a$ as jd,t$ as kd,n1 as ld,h4 as md,P0 as nd,r1 as od,WW as pd,OW as qd,t1 as rd,YW as sd,L0 as td,GW as ud,h0 as vd,e1 as wd,_2 as xd,HW as yd,UW as zd,BW as Ad,e4 as Bd,O2 as Cd,J2 as Dd,_X as Ed,NW as Fd,x_ as Gd,r0 as Hd,o0 as Id,N_ as Jd,N0 as Kd,bW as Ld,fW as Md,jW as Nd,yW as Od,L2 as Pd,gW as Qd,uW as Rd,F2 as Sd,q2 as Td,pW as Ud,z2 as Vd,nW as Wd,gX as Xd,zO as Yd,DO as Zd,_4 as _d,t as $d,Q_ as ae,q as be};
94
+ export{cX as uc,pX as vc,nX as wc,U_ as xc,dX as yc,m0 as zc,a0 as Ac,D1 as Bc,X0 as Cc,w1 as Dc,tX as Ec,B_ as Fc,u as Gc,k4 as Hc,S1 as Ic,O_ as Jc,M$ as Kc,A$ as Lc,E$ as Mc,F$ as Nc,z$ as Oc,D$ as Pc,R$ as Qc,w$ as Rc,x$ as Sc,k$ as Tc,b$ as Uc,f$ as Vc,j$ as Wc,y$ as Xc,g$ as Yc,S$ as Zc,I$ as _c,m$ as $c,v$ as ad,P$ as bd,u$ as cd,h$ as dd,l$ as ed,c$ as fd,p$ as gd,n$ as hd,d$ as id,i$ as jd,r$ as kd,o$ as ld,a$ as md,t$ as nd,n1 as od,h4 as pd,P0 as qd,r1 as rd,WW as sd,OW as td,t1 as ud,YW as vd,L0 as wd,GW as xd,h0 as yd,e1 as zd,_2 as Ad,HW as Bd,UW as Cd,BW as Dd,e4 as Ed,O2 as Fd,J2 as Gd,_X as Hd,NW as Id,x_ as Jd,r0 as Kd,o0 as Ld,N_ as Md,N0 as Nd,bW as Od,fW as Pd,jW as Qd,yW as Rd,L2 as Sd,gW as Td,uW as Ud,F2 as Vd,q2 as Wd,pW as Xd,z2 as Yd,nW as Zd,gX as _d,zO as $d,DO as ae,_4 as be,t as ce,Q_ as de,q as ee};
@@ -1,2 +1,2 @@
1
1
  var I=600000,r=30000,t=3600000,o=12,O=15000,P=60000;function R(_){return _===0||typeof _==="number"&&Number.isSafeInteger(_)&&_>=30000&&_<=3600000}var C=1e4,M=1000,p=300000;function E(_){return _===0||typeof _==="number"&&Number.isSafeInteger(_)&&_>=1000&&_<=300000}var T=1,s=16,n=Number.MAX_SAFE_INTEGER,D=180000,m=1000,x=600000,S=134217728,U=65536,V=134217728;function A(_){return typeof _==="number"&&Number.isSafeInteger(_)&&_>=1&&_<=16}function w(_){return typeof _==="number"&&Number.isSafeInteger(_)&&_>=1&&_<=n}function z(_){return _===0||typeof _==="number"&&Number.isSafeInteger(_)&&_>=1000&&_<=600000}function F(_){return typeof _==="number"&&Number.isSafeInteger(_)&&_>=65536&&_<=134217728}
2
- export{I as Wi,r as Xi,t as Yi,o as Zi,O as _i,P as $i,R as aj,C as bj,M as cj,p as dj,E as ej,T as fj,s as gj,n as hj,D as ij,m as jj,x as kj,S as lj,U as mj,V as nj,A as oj,w as pj,z as qj,F as rj};
2
+ export{I as Zi,r as _i,t as $i,o as aj,O as bj,P as cj,R as dj,C as ej,M as fj,p as gj,E as hj,T as ij,s as jj,n as kj,D as lj,m as mj,x as nj,S as oj,U as pj,V as qj,A as rj,w as sj,z as tj,F as uj};
@@ -0,0 +1 @@
1
+ import{qf as a,rf as b,sf as c}from"./chunk-w5057h27.js";import"./chunk-g4kydkyz.js";import"./chunk-0kghtvxj.js";import"./chunk-v508x7cg.js";import"./chunk-c562kd2m.js";import"./chunk-ma1mn6hn.js";import"./chunk-e6j4vzta.js";import"./chunk-w2m4yczv.js";import"./chunk-zp5097qk.js";import"./chunk-g38d2ezm.js";import"./chunk-n8qg68y2.js";import"./chunk-pg7cgvs8.js";import"./chunk-svsgtj41.js";import"./chunk-2g8avyq6.js";import"./chunk-19zsecpx.js";import"./chunk-85b3kacc.js";import"./chunk-5cw3bevx.js";import"./chunk-mnk0b4nz.js";import"./chunk-tecbx0ek.js";export{a as validatePermissions,c as validateOutput,b as loadConfiguration};
@@ -1,2 +1,2 @@
1
1
  import{spawn as I}from"node:child_process";var X=500;function x(j){return new Promise((q)=>setTimeout(q,j))}function Z(j){return j&&typeof j==="object"&&"code"in j?String(j.code):void 0}function L(j){return j()||j()}function G(j,q=process.platform,y=process.kill.bind(process)){if(q==="win32"||!Number.isInteger(j)||j<=1||j===process.pid)return!1;try{return y(-j,0),!0}catch(z){let B=Z(z);if(B==="ESRCH")return!1;if(B==="EPERM")return!0;throw z}}function N(j,q){return new Promise((y)=>{let z=["/PID",String(j),"/T"];if(q)z.push("/F");let B=I("taskkill",z,{stdio:"ignore",windowsHide:!0}),K=!1,J=(H)=>{if(K)return;K=!0,y(H)};B.once("error",()=>J(!1)),B.once("close",(H)=>J(H===0))})}async function F(j,q={}){if(!Number.isInteger(j)||j<=1||j===process.pid)return{success:!1,alreadyExited:!1,forced:!1};let y=q.platform??process.platform,z=q.gracePeriodMs??X,B=q.killProcess??process.kill.bind(process),K=q.taskkill??N,J=q.wait??x,H=q.validatePidOwnership??(()=>!0);if(!L(H))return{success:!1,alreadyExited:!1,forced:!1};if(y==="win32"){let V=await K(j,!1);if(await J(z),!H())return{success:V,alreadyExited:!1,forced:!1};let Y=await K(j,!0);return{success:V||Y,alreadyExited:!V&&!Y,forced:Y}}let Q=(V,Y)=>{try{return B(V,Y)}catch(D){return Z(D)==="ESRCH"}},W=Q(-j,"SIGTERM")||Q(j,"SIGTERM");if(await J(z),!H())return{success:W,alreadyExited:!1,forced:!1};let $=Q(-j,"SIGKILL")||Q(j,"SIGKILL");return{success:W||$,alreadyExited:!1,forced:$}}async function R(j,q={}){if(!Number.isInteger(j)||j<=1||j===process.pid)return{success:!1,alreadyExited:!1,forced:!1};if((q.platform??process.platform)==="win32")return{success:!1,alreadyExited:!1,forced:!1};let z=q.gracePeriodMs??X,B=q.killProcess??process.kill.bind(process),K=q.wait??x,J=q.validatePidOwnership??(()=>!0);if(!J())return{success:!1,alreadyExited:!1,forced:!1};let H=($)=>{try{return B(-j,$),"sent"}catch(V){return Z(V)==="ESRCH"?"missing":"failed"}},Q=H("SIGTERM");if(Q==="missing")return{success:!0,alreadyExited:!0,forced:!1};if(Q==="failed")return{success:!1,alreadyExited:!1,forced:!1};if(await K(z),!J())return{success:!1,alreadyExited:!1,forced:!1};let W=H("SIGKILL");return{success:W!=="failed",alreadyExited:W==="missing",forced:W==="sent"}}class b{child;state="owned";terminationPromise;terminationResult;platform;gracePeriodMs;killProcess;taskkill;wait;constructor(j,q={}){this.child=j;if(this.platform=q.platform??process.platform,this.gracePeriodMs=q.gracePeriodMs??X,this.killProcess=q.killProcess??process.kill.bind(process),this.taskkill=q.taskkill??N,this.wait=q.wait??x,q.releaseOnExit!==!1){let y=()=>{if(this.state==="owned")this.state="released"};j.once("close",y),j.once("error",y)}}release(){if(this.state==="owned")this.state="released"}terminate(){if(this.terminationPromise)return this.terminationPromise;if(this.terminationResult)return Promise.resolve(this.terminationResult);if(this.state==="released")return this.terminationResult={success:!0,alreadyExited:!0,forced:!1},Promise.resolve(this.terminationResult);return this.state="terminating",this.terminationPromise=this.terminateOwnedTree().then((j)=>{return this.state="released",this.terminationResult=j,j}),this.terminationPromise}async terminateOwnedTree(){let j=this.child.pid;if(!j)return{success:!1,alreadyExited:!0,forced:!1};if(this.platform==="win32"){let z=await this.taskkill(j,!1);await this.wait(this.gracePeriodMs);let B=await this.taskkill(j,!0);if(!z&&!B)return{success:this.signalDirectChild("SIGKILL"),alreadyExited:!1,forced:!0};return{success:!0,alreadyExited:!1,forced:!0}}let q=this.signalPosixTree(j,"SIGTERM");await this.wait(this.gracePeriodMs);let y=this.signalPosixTree(j,"SIGKILL");return{success:q||y,alreadyExited:!1,forced:y}}signalPosixTree(j,q){if(j<=1||j===process.pid)return this.signalDirectChild(q);try{return this.killProcess(-j,q)}catch(y){if(Z(y)==="ESRCH")return!0;return this.signalDirectChild(q)}}signalDirectChild(j){try{return this.child.kill(j)}catch(q){return Z(q)==="ESRCH"}}}function v(j,q,y={},z={}){let B=I(j,q,{...y,detached:process.platform==="win32"?y.detached:!0,windowsHide:y.windowsHide??!0});return{child:B,processTree:new b(B,z)}}
2
- export{G as sh,F as th,R as uh,v as vh};
2
+ export{G as vh,F as wh,R as xh,v as yh};
@@ -1,3 +1,3 @@
1
- import{Zj as K}from"./chunk-t88sfhjj.js";import{appendFileSync as Y,existsSync as Z,mkdirSync as _,readdirSync as f,statSync as M,unlinkSync as p}from"node:fs";import x from"node:path";var E;((T)=>{T[T.DEBUG=0]="DEBUG";T[T.INFO=1]="INFO";T[T.WARN=2]="WARN";T[T.ERROR=3]="ERROR"})(E||={});var t=null,G=null,H=!1;function S(n){if(t!==n)t=n}async function b(){}function z(){if(H)return G;H=!0;try{let n=x.join(K(),"logs");if(!Z(n))_(n,{recursive:!0,mode:493});if(M(n).uid===0&&process.getuid&&process.getuid()!==0)return console.error(""),console.error("[FAIL] 权限错误:~/.blade/logs 目录属于 root 用户"),console.error(""),console.error("这通常是因为您曾经使用 sudo 运行过 blade。"),console.error(""),console.error("解决方法:"),console.error(" sudo chown -R $USER:$USER ~/.blade/"),console.error(""),console.error("然后重新运行 blade(不要使用 sudo)"),console.error(""),null;return B(n,30),G=n,n}catch(n){return console.error("[Logger] 无法创建日志目录:",n),null}}function B(n,u){try{let c=f(n),w=Date.now(),T=u*24*60*60*1000;for(let $ of c){if(!$.startsWith("blade-")||!$.endsWith(".log")&&!$.endsWith(".jsonl"))continue;let m=x.join(n,$);try{let q=M(m);if(w-q.mtimeMs>T)p(m)}catch(q){}}}catch(c){}}function J(){let n=z();if(!n)return null;let u=t||"default";return x.join(n,`blade-${u}.jsonl`)}function U(n,u,c){let w=J();if(!w)return;try{let T={timestamp:new Date().toISOString(),level:E[u],category:n,message:c};Y(w,JSON.stringify(T)+`
1
+ import{ak as K}from"./chunk-mnk0b4nz.js";import{appendFileSync as Y,existsSync as Z,mkdirSync as _,readdirSync as f,statSync as M,unlinkSync as p}from"node:fs";import x from"node:path";var E;((T)=>{T[T.DEBUG=0]="DEBUG";T[T.INFO=1]="INFO";T[T.WARN=2]="WARN";T[T.ERROR=3]="ERROR"})(E||={});var t=null,G=null,H=!1;function S(n){if(t!==n)t=n}async function b(){}function z(){if(H)return G;H=!0;try{let n=x.join(K(),"logs");if(!Z(n))_(n,{recursive:!0,mode:493});if(M(n).uid===0&&process.getuid&&process.getuid()!==0)return console.error(""),console.error("[FAIL] 权限错误:~/.blade/logs 目录属于 root 用户"),console.error(""),console.error("这通常是因为您曾经使用 sudo 运行过 blade。"),console.error(""),console.error("解决方法:"),console.error(" sudo chown -R $USER:$USER ~/.blade/"),console.error(""),console.error("然后重新运行 blade(不要使用 sudo)"),console.error(""),null;return B(n,30),G=n,n}catch(n){return console.error("[Logger] 无法创建日志目录:",n),null}}function B(n,u){try{let c=f(n),w=Date.now(),T=u*24*60*60*1000;for(let $ of c){if(!$.startsWith("blade-")||!$.endsWith(".log")&&!$.endsWith(".jsonl"))continue;let m=x.join(n,$);try{let q=M(m);if(w-q.mtimeMs>T)p(m)}catch(q){}}}catch(c){}}function J(){let n=z();if(!n)return null;let u=t||"default";return x.join(n,`blade-${u}.jsonl`)}function U(n,u,c){let w=J();if(!w)return;try{let T={timestamp:new Date().toISOString(),level:E[u],category:n,message:c};Y(w,JSON.stringify(T)+`
2
2
  `)}catch(T){}}class k{static globalDebugConfig=null;enabled;minLevel;category;constructor(n={}){if(n.enabled!==void 0)this.enabled=n.enabled;else if(k.globalDebugConfig!==null)this.enabled=Boolean(k.globalDebugConfig);else this.enabled=!1;this.minLevel=n.minLevel??0,this.category=n.category??"General"}static setGlobalDebug(n){k.globalDebugConfig=n}static clearGlobalDebug(){k.globalDebugConfig=null}setEnabled(n){this.enabled=n}parseDebugFilter(n){if(!n)return{enabled:!1};if(n===!0||n==="true"||n==="1")return{enabled:!0};let u=String(n).trim();if(!u)return{enabled:!0};if(u.startsWith("!"))return{enabled:!0,filter:{mode:"exclude",categories:u.split(",").map((T)=>T.trim().replace(/^!/,"")).filter(Boolean)}};return{enabled:!0,filter:{mode:"include",categories:u.split(",").map((w)=>w.trim()).filter(Boolean)}}}shouldLogCategory(n){if(!n)return!0;let u=this.category.toLowerCase();if(n.mode==="include")return n.categories.some((c)=>u.includes(c.toLowerCase()));return!n.categories.some((c)=>u.includes(c.toLowerCase()))}shouldLogToConsole(n){if(k.globalDebugConfig!==null){let{enabled:u,filter:c}=this.parseDebugFilter(k.globalDebugConfig);if(!u)return!1;if(n<this.minLevel)return!1;return this.shouldLogCategory(c)}return this.enabled&&n>=this.minLevel}log(n,...u){let c=u.map((w)=>typeof w==="object"?JSON.stringify(w):String(w)).join(" ");if(U(this.category,n,c),this.shouldLogToConsole(n)){let w=E[n],T=`[${this.category}] [${w}]`;console.error(T,...u)}}debug(...n){this.log(0,...n)}info(...n){this.log(1,...n)}warn(...n){this.log(2,...n)}error(...n){this.log(3,...n)}}function h(n,u){return new k({...u,category:n})}var s=new k({category:"General"});import F from"typebox/schema";import R from"typebox/value";class A extends Error{issues;constructor(n){super(n.map((u)=>{return`${u.path.length>0?u.path.join("."):"root"}: ${u.message}`}).join("; "));this.issues=n;this.name="SchemaValidationError"}}function O(n){if(!n)return[];return n.split("/").slice(1).map((u)=>u.replace(/~1/g,"/").replace(/~0/g,"~")).map((u)=>/^(0|[1-9]\d*)$/.test(u)?Number(u):u)}function P(n,u){let c=n;for(let w of u){if(c===null||typeof c!=="object")return;c=c[w]}return c}function Q(n,u){let[,c]=F.Errors(n,u);return c.map((w)=>{let T=O(w.instancePath);return{code:w.keyword,path:T,message:w.message,value:P(u,T)}})}function j(n,u){let c=R.Default(n,R.Clone(u)),w=Q(n,c);if(w.length>0)return{success:!1,error:new A(w)};let T=R.Clean(n,c),$=Q(n,T);if($.length>0)return{success:!1,error:new A($)};return{success:!0,data:T}}function W(n,u){let c=j(n,u);if(!c.success)throw c.error;return c.data}import X from"typebox";function i(n){return Object.defineProperties(n,{parse:{value:(u)=>W(n,u),enumerable:!1},safeParse:{value:(u)=>j(n,u),enumerable:!1}}),n}function a(n,u){return X.Optional({...n,default:u})}function L(n,u={}){return X.Unsafe({type:"string",enum:[...n],...u})}
3
- export{S as sj,b as tj,k as uj,h as vj,s as wj,j as xj,W as yj,X as zj,i as Aj,a as Bj,L as Cj};
3
+ export{S as vj,b as wj,k as xj,h as yj,s as zj,j as Aj,W as Bj,X as Cj,i as Dj,a as Ej,L as Fj};