blade-code 0.10.6 → 0.10.8

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 (116) hide show
  1. package/dist/blade.js +2 -2
  2. package/dist/chunk-1w6azndv.js +1 -0
  3. package/dist/chunk-2gwaqpge.js +1 -0
  4. package/dist/chunk-2pjd4cys.js +1 -0
  5. package/dist/{chunk-xsmtpkjm.js → chunk-2thg3fq1.js} +1 -1
  6. package/dist/chunk-2zn5en0w.js +1 -0
  7. package/dist/{chunk-vvbd9fb5.js → chunk-33ave20b.js} +1 -1
  8. package/dist/chunk-3w1z6fwm.js +1 -0
  9. package/dist/chunk-43x4qbvt.js +1 -0
  10. package/dist/{chunk-kcwq1e7h.js → chunk-4h9ff923.js} +1 -1
  11. package/dist/chunk-52csdk21.js +3 -0
  12. package/dist/{chunk-frcg8gea.js → chunk-66hb7kxm.js} +2 -2
  13. package/dist/chunk-6j8wgp2s.js +2 -0
  14. package/dist/chunk-6vsszvgg.js +2 -0
  15. package/dist/chunk-7evtr0yr.js +10 -0
  16. package/dist/{chunk-yt39kfc6.js → chunk-7hbw6q6d.js} +1 -1
  17. package/dist/chunk-7zsyejr1.js +22 -0
  18. package/dist/{chunk-r083b7vn.js → chunk-8gcg2z3y.js} +16 -16
  19. package/dist/{chunk-rag8zchg.js → chunk-8gcvpmwk.js} +1 -1
  20. package/dist/{chunk-6cv4gddv.js → chunk-8gnfj89a.js} +2 -2
  21. package/dist/{chunk-76d7p64v.js → chunk-8h0yxh6y.js} +2 -2
  22. package/dist/chunk-8sfycn3y.js +194 -0
  23. package/dist/{chunk-c2rhwxyn.js → chunk-954vmnrn.js} +1 -1
  24. package/dist/chunk-a8h3fymk.js +100 -0
  25. package/dist/chunk-b5szbtmp.js +5 -0
  26. package/dist/chunk-bxm2hq0m.js +1 -0
  27. package/dist/chunk-c8da4b3d.js +1 -0
  28. package/dist/{chunk-p4j4aawd.js → chunk-cbpqcdga.js} +1 -1
  29. package/dist/{chunk-m4htdpr9.js → chunk-cf8e7e92.js} +72 -17
  30. package/dist/chunk-d0g4t8fw.js +8 -0
  31. package/dist/{chunk-b4n34hrn.js → chunk-eq2qj9ja.js} +1 -1
  32. package/dist/{chunk-7xm3vjkz.js → chunk-fj8v7pep.js} +1 -1
  33. package/dist/{chunk-bn0ge244.js → chunk-fxpq9nh6.js} +1 -1
  34. package/dist/chunk-g00wj2we.js +4 -0
  35. package/dist/{chunk-bnrce0hg.js → chunk-h28ptrrt.js} +1 -1
  36. package/dist/{chunk-gb4n3hwj.js → chunk-h421wzbm.js} +2 -2
  37. package/dist/{chunk-dcvvxsa1.js → chunk-j4tttsaz.js} +2 -2
  38. package/dist/{chunk-k0p9ecgc.js → chunk-kagpk2x5.js} +6 -6
  39. package/dist/chunk-kvnwhwx3.js +1 -0
  40. package/dist/{chunk-p196e4rq.js → chunk-m2xrx1je.js} +1 -1
  41. package/dist/chunk-nhc49pan.js +160 -0
  42. package/dist/{chunk-sf9pe2n6.js → chunk-nymm525r.js} +1 -1
  43. package/dist/{chunk-9sfmrb1j.js → chunk-nz57y1ad.js} +3 -3
  44. package/dist/{chunk-45dcfkwe.js → chunk-p2m56new.js} +2 -2
  45. package/dist/{chunk-w154jyby.js → chunk-pv9sw79c.js} +1 -1
  46. package/dist/chunk-qgp08qmz.js +6 -0
  47. package/dist/{chunk-evaht3v4.js → chunk-r7tsa2zv.js} +1 -1
  48. package/dist/{chunk-rw6gv740.js → chunk-rkvfsx8e.js} +1 -1
  49. package/dist/{chunk-v1p80wvh.js → chunk-rxqft6td.js} +2 -2
  50. package/dist/{chunk-g9n211y4.js → chunk-s9aj3p11.js} +2 -2
  51. package/dist/chunk-senkwdh6.js +2 -0
  52. package/dist/chunk-v1c58sm6.js +1 -0
  53. package/dist/{chunk-n9khyme2.js → chunk-v8pq6qmv.js} +2 -2
  54. package/dist/{chunk-1cvr3qtd.js → chunk-van4ysq6.js} +289 -305
  55. package/dist/chunk-vgp8m9fg.js +2 -0
  56. package/dist/{chunk-4y28hykg.js → chunk-vsg8f0e6.js} +1 -1
  57. package/dist/{chunk-kcs3xa8f.js → chunk-w0nscjd2.js} +2 -2
  58. package/dist/chunk-w26jhcj9.js +1 -0
  59. package/dist/{chunk-hjsm6ejs.js → chunk-wmnszjmv.js} +2 -2
  60. package/dist/chunk-x6wgh726.js +1 -0
  61. package/dist/{chunk-thvwt4kc.js → chunk-xa05phpw.js} +3 -3
  62. package/dist/{chunk-g4q26d9a.js → chunk-xmcsn7y0.js} +2 -2
  63. package/dist/{chunk-c9tzf9r5.js → chunk-y4c3wwpa.js} +1 -1
  64. package/dist/{chunk-0rp2ck29.js → chunk-yfs9tq3y.js} +2 -2
  65. package/dist/chunk-ymzcxryf.js +1 -0
  66. package/dist/{chunk-xkp4ph6v.js → chunk-zknv3d6y.js} +1 -1
  67. package/dist/chunk-zp4x2mwj.js +1 -0
  68. package/dist/chunk-zvk3g177.js +9 -0
  69. package/dist/web/assets/ChatView-Fqy97qw9.js +7 -0
  70. package/dist/web/assets/{CodeBlockHighlighter-CFW6qjnA.js → CodeBlockHighlighter-EgdsVoMQ.js} +1 -1
  71. package/dist/web/assets/{FilePreview-CR_XetY0.js → FilePreview-xicd9-Sl.js} +1 -1
  72. package/dist/web/assets/{MarkdownRenderer-CVrxJswQ.js → MarkdownRenderer-DBSjC_z3.js} +18 -18
  73. package/dist/web/assets/SettingsModal-Bkh5rMAJ.js +5 -0
  74. package/dist/web/assets/TaskSwitcher-DXcj0iJ_.js +1 -0
  75. package/dist/web/assets/{TerminalPanel-DTqvx8yB.js → TerminalPanel-DWVY-Elm.js} +1 -1
  76. package/dist/web/assets/index-Bi5ijAQP.css +1 -0
  77. package/dist/web/assets/index-CxEh32hc.js +32 -0
  78. package/dist/web/assets/{vendor-icons-D_AkWmWB.js → vendor-icons-Cv18Q6rW.js} +72 -67
  79. package/dist/web/assets/{vendor-radix-DBy9B2DN.js → vendor-radix-DXRuAJHH.js} +1 -1
  80. package/dist/web/index.html +4 -4
  81. package/package.json +3 -1
  82. package/dist/chunk-10k6egwk.js +0 -1
  83. package/dist/chunk-17xtw88g.js +0 -1
  84. package/dist/chunk-1kg9r8xp.js +0 -2
  85. package/dist/chunk-383vbwmt.js +0 -4
  86. package/dist/chunk-3kk3bk11.js +0 -1
  87. package/dist/chunk-47dsd91k.js +0 -99
  88. package/dist/chunk-4kaygjqv.js +0 -10
  89. package/dist/chunk-50fq7r0h.js +0 -22
  90. package/dist/chunk-59eje513.js +0 -1
  91. package/dist/chunk-710bvht9.js +0 -160
  92. package/dist/chunk-a9pbpgkg.js +0 -9
  93. package/dist/chunk-c8rky275.js +0 -6
  94. package/dist/chunk-j1sd03h7.js +0 -1
  95. package/dist/chunk-jqyvnmfr.js +0 -187
  96. package/dist/chunk-jrh5tzc4.js +0 -1
  97. package/dist/chunk-kj1ah6kn.js +0 -1
  98. package/dist/chunk-n34z4c47.js +0 -1
  99. package/dist/chunk-n5m2p0bq.js +0 -2
  100. package/dist/chunk-nfmsn652.js +0 -2
  101. package/dist/chunk-qvabd0vg.js +0 -1
  102. package/dist/chunk-t75wspk3.js +0 -1
  103. package/dist/chunk-vddqv6fv.js +0 -1
  104. package/dist/chunk-w4zvftrw.js +0 -5
  105. package/dist/chunk-wa7v7akz.js +0 -3
  106. package/dist/chunk-wxwqz67n.js +0 -1
  107. package/dist/chunk-x9hm3p3a.js +0 -1
  108. package/dist/chunk-xd2g4zjx.js +0 -1
  109. package/dist/web/assets/ChatView-Y-6k-ayR.js +0 -7
  110. package/dist/web/assets/McpModal-BO-85gll.js +0 -5
  111. package/dist/web/assets/SettingsModal-CW87OnxI.js +0 -1
  112. package/dist/web/assets/SkillsModal-Q8ZFPhys.js +0 -1
  113. package/dist/web/assets/TaskSwitcher-BzH-0QXr.js +0 -1
  114. package/dist/web/assets/index-B7etZcne.css +0 -1
  115. package/dist/web/assets/index-ClOgGy-I.js +0 -32
  116. package/dist/web/assets/useRequest-BvqVDnKl.js +0 -1
@@ -0,0 +1,8 @@
1
+ import{G as P}from"./chunk-van4ysq6.js";import{Oa as K}from"./chunk-8sfycn3y.js";import{Hb as B,ib as G,jb as N,kb as S,lb as O,mb as s}from"./chunk-a8h3fymk.js";import{Mb as j}from"./chunk-kagpk2x5.js";import{Nc as q}from"./chunk-h28ptrrt.js";import{$c as v}from"./chunk-cf8e7e92.js";import{if as z}from"./chunk-66hb7kxm.js";import R from"node:path";import{nanoid as cf}from"nanoid";import{execFile as I}from"node:child_process";import{createHash as p}from"node:crypto";import{lstat as o,readFile as ff,realpath as V}from"node:fs/promises";import A from"node:path";import{promisify as af}from"node:util";var tf=af(I),L=8388608,U=500,Y=200;async function y(n,a){try{return(await tf("git",["-c","core.pager=cat",...a],{cwd:n,encoding:"utf8",timeout:30000,maxBuffer:L+1024,env:{...process.env,GIT_CONFIG_NOSYSTEM:"1",GIT_PAGER:"cat",GIT_OPTIONAL_LOCKS:"0"}})).stdout}catch(f){let t=f instanceof Error&&f.message.includes("maxBuffer")?`Review target exceeds the ${L} byte limit`:f instanceof Error?f.message:String(f);throw Error(`Git review target failed: ${t}`)}}function Q(n,a){let f=n?.trim();if(!f||f.length>Y||f.includes("\x00")||f.includes(`
2
+ `)||f.includes("\r"))throw Error(`${a} must contain 1-${Y} characters`);return f}function W(n){return n.split("\x00").filter(Boolean)}async function _(n,a){return(await y(n,["rev-parse","--verify",`${a}^{commit}`])).trim()}async function nf(n,a,f,t,g){let w=g,c=await V(n);for(let e of a){let $=A.resolve(c,e),l=A.relative(c,$);if(!l||l.startsWith("..")||A.isAbsolute(l))throw Error(`Untracked review path escapes the workspace: ${e}`);let i=await o($);if(!i.isFile()||i.isSymbolicLink())throw Error(`Untracked review target must be a regular file: ${e}`);if(w+=i.size,w>L)throw Error(`Review target exceeds ${L} bytes`);f.update("\x00untracked\x00"),f.update(l.replaceAll(A.sep,"/")),f.update("\x00");let b=await ff($);f.update(b);let m=Math.max(1,b.toString("utf8").split(`
3
+ `).length);t.set(l.replaceAll(A.sep,"/"),[{start:1,end:m}])}}function M(n,a){let f=new Map,t,g,w,c,e=!1,$=(l,i)=>{let b=f.get(l)??[],m=b.at(-1);if(m&&i<=m.end+1)m.end=Math.max(m.end,i);else b.push({start:i,end:i});f.set(l,b)};for(let l of n.split(`
4
+ `)){if(l.startsWith("--- ")){let i=l.slice(4).split("\t")[0]?.trim();t=i&&i!=="/dev/null"?i.replace(/^a\//,"").replaceAll("\\","/"):void 0;continue}if(l.startsWith("+++ ")){let i=l.slice(4).split("\t")[0]?.trim();e=i==="/dev/null",g=e?t:i?i.replace(/^b\//,"").replaceAll("\\","/"):void 0,w=void 0,c=void 0;continue}if(l.startsWith("@@ ")){let i=/-(\d+)(?:,\d+)? \+(\d+)(?:,\d+)?/.exec(l);w=i?Math.max(1,Number(i[1])):void 0,c=i?Math.max(1,Number(i[2])):void 0;continue}if(!g||w===void 0||c===void 0)continue;if(l.startsWith("+")&&!l.startsWith("+++"))$(g,c),c++;else if(l.startsWith("-")&&!l.startsWith("---"))$(g,e?w:c),w++;else if(!l.startsWith("\\"))w++,c++}for(let l of a)if(!f.has(l))f.set(l,[{start:1,end:1}]);return f}function D(n){if(n.length>U)throw Error(`Review target exceeds the ${U} file limit`)}class d{static async resolve(n,a){let f=await V(n);await y(f,["rev-parse","--is-inside-work-tree"]);let t=await _(f,"HEAD"),g=p("sha256");g.update(`kind\x00${a.kind}\x00head\x00${t}\x00`);let w="",c=[],e,$,l,i,b=new Map;switch(a.kind){case"uncommitted":{w=await y(f,["diff","--binary","--no-ext-diff","--relative","HEAD","--","."]);let m=W(await y(f,["diff","--name-only","-z","--relative","HEAD","--","."])),h=W(await y(f,["ls-files","--others","--exclude-standard","-z","--","."]));if(c=[...new Set([...m,...h])].sort(),D(c),c.length===0)throw Error("No uncommitted changes to review");g.update(w),b=M(w,m),await nf(f,h,g,b,Buffer.byteLength(w)),l="uncommitted changes",i=["Review the uncommitted working tree against HEAD.","Use git status --short, git diff --cached, and git diff, then inspect","every relevant untracked file listed by git status."].join(" ");break}case"base":{let m=Q(a.ref,"Base ref");e=await _(f,m);let h=(await y(f,["merge-base",e,t])).trim();if(w=await y(f,["diff","--binary","--no-ext-diff","--relative",`${h}..${t}`,"--","."]),c=W(await y(f,["diff","--name-only","-z","--relative",`${h}..${t}`,"--","."])),D(c),c.length===0)throw Error(`No changes between ${m} and HEAD`);g.update(w),g.update(`\x00merge-base\x00${h}`),b=M(w,c),l=`changes against ${m}`,i=`Review changes introduced by ${h}..${t}.`;break}case"commit":{let m=Q(a.ref,"Commit ref");if($=await _(f,m),w=await y(f,["show","--format=","--binary","--no-ext-diff","--relative",$,"--","."]),c=W(await y(f,["diff-tree","--root","--no-commit-id","--name-only","-r","-z",$,"--","."])),D(c),c.length===0)throw Error(`Commit has no changes in this workspace: ${m}`);g.update(w),g.update(`\x00commit\x00${$}`),b=M(w,c),l=`commit ${m}`,i=`Review only the changes introduced by commit ${$}.`;break}}if(Buffer.byteLength(w)>L)throw Error(`Review diff exceeds ${L} bytes`);return{info:{kind:a.kind,label:l,headSha:t,...e?{baseSha:e}:{},...$?{commitSha:$}:{},digest:g.digest("hex"),fileCount:c.length},instruction:i,changedLines:b}}}var wf=131072,X=50,E=new Set;function Z(n,a){return`${R.resolve(n)}\x00${a}`}function J(n){return`/review ${n.kind}${n.kind==="uncommitted"?"":` ${n.ref?.trim()??""}`}`}function C(n,a,f,t=!1){if(typeof n!=="string")throw Error(`${a} must be a string`);let g=n.trim();if(!t&&!g||g.length>f)throw Error(`${a} exceeds its allowed length`);return g}function lf(n,a,f){if(!n||typeof n!=="object"||Array.isArray(n))throw Error("Review finding must be an object");let t=n,g=typeof t.line==="number"&&Number.isInteger(t.line)?t.line:void 0,w=t.code_location??(typeof t.file==="string"&&g!==void 0?{path:t.file,line_start:g,line_end:g}:void 0);if(!w||typeof w!=="object"||Array.isArray(w))throw Error("Review finding has no code_location");let c=w,e=C(c.path,"Finding path",1000),$=R.posix.normalize(e.replaceAll("\\","/"));if(R.posix.isAbsolute($)||$===".."||$.startsWith("../"))throw Error("Review finding path must be workspace-relative");let l=R.resolve(a,$),i=R.relative(R.resolve(a),l);if(i.startsWith("..")||R.isAbsolute(i))throw Error("Review finding path escapes the workspace");let b=typeof t.severity==="string"?t.severity.toLowerCase():"",m=b==="critical"?0:b==="high"?1:b==="medium"?2:b==="low"?3:void 0,h=t.priority??m;if(h!==0&&h!==1&&h!==2&&h!==3)throw Error("Review finding priority must be 0-3");let x=t.confidence_score??t.confidence??0.8;if(typeof x!=="number"||!Number.isFinite(x)||x<0||x>1)throw Error("Review finding confidence_score must be between 0 and 1");let{line_start:r,line_end:u}=c;if(!Number.isInteger(r)||!Number.isInteger(u)||r<1||u<r||u-r>=10)throw Error("Review finding line range is invalid");let F=f.changedLines.get($);if(!F)throw Error("Review finding path is outside the review target");if(!F.some((T)=>r<=T.end&&u>=T.start))throw Error("Review finding line range does not overlap the changed lines");let k=C(t.title??`[P${h}] ${String(t.type??"Review finding").replaceAll("-"," ").replace(/\b\w/g,(T)=>T.toUpperCase())}`,"Finding title",120);if(!k.startsWith(`[P${h}] `))throw Error("Review finding title priority does not match priority");return{title:k,body:C(t.body??t.description,"Finding body",4000),priority:h,confidenceScore:x,codeLocation:{path:$,lineStart:r,lineEnd:u}}}function mf(n,a,f){if(Buffer.byteLength(n)>wf)throw Error("Review output exceeds the 128 KiB limit");let t=n.indexOf("{"),g=n.lastIndexOf("}");if(t<0||g<=t)throw Error("Reviewer did not return a JSON object");let w;try{w=JSON.parse(n.slice(t,g+1))}catch{throw Error("Reviewer returned invalid JSON")}if(!w||typeof w!=="object"||Array.isArray(w))throw Error("Reviewer output must be an object");let c=w;if(!Array.isArray(c.findings))throw Error("Reviewer output must contain findings");if(c.findings.length>X)throw Error(`Reviewer returned more than ${X} findings`);return{overallExplanation:C(c.overall_explanation??c.summary,"Review explanation",1e4,!0),findings:c.findings.map((e)=>lf(e,a,f))}}async function H(n,a){return new j(z(n,a)).readAll()}class gf{static async start(n){let{sessionId:a,projectPath:f,runtime:t,request:g,onEvent:w}=n;if(t.sessionId!==a||R.resolve(t.workspaceRoot)!==R.resolve(f))throw Error("Review runtime does not own the requested Session");if(t.hasTurnOwner())throw Error("Cannot start a review during an active turn");await B.assertSessionWritable(a,f);let c=Z(f,a);if(E.has(c))throw Error("Session already has an active review");let e=await H(f,a);if(N(e))throw Error("Session has an interrupted review that must be recovered");let $=g.instructions?.trim();if($&&$.length>4000)throw Error("Review instructions exceed 4,000 characters");let l=await d.resolve(f,g),i=cf(16),b=q("review"),m=new Date().toISOString(),h={reviewId:i,reviewerSessionId:b,target:l.info,startedAt:m},x=new K(f);await x.saveReviewStart(a,h),await x.saveMessage(a,"user",J(g),null,{codeReview:{reviewId:i,phase:"started",targetKind:l.info.kind,targetDigest:l.info.digest}}),await B.updateSessionMetadata(a,f,{taskStatus:"running",taskStatusReason:`Reviewing ${l.info.label}`,taskPromptSummary:J(g),taskStartedAt:m,taskCompletedAt:null,taskFailure:null}),E.add(c);let r=this.execute({...n,target:l,reviewId:i,reviewerSessionId:b,instructions:$,store:x,onEvent:w}).finally(()=>{E.delete(c)});return{reviewId:i,completion:r}}static async execute(n){let{sessionId:a,projectPath:f,runtime:t,request:g,signal:w,onEvent:c,target:e,reviewId:$,reviewerSessionId:l,instructions:i,store:b}=n,m;try{let x=[e.instruction,"Bash already starts in the review workspace. Never prefix a command with cd.",`Authoritative target digest: ${e.info.digest}`,`Changed file count: ${e.info.fileCount}`,i?`Additional review instructions:
5
+ ${i}`:"","Inspect the diff and enough surrounding code to prove each finding.","Return only JSON with keys overall_explanation and findings. Each finding","must use title, body, priority, confidence_score, and code_location","(path, line_start, line_end) exactly as defined by the reviewer contract."].filter(Boolean).join(`
6
+
7
+ `),u=await new P(v,t.getAgentResources(),t.getModelResources(),t.getLspResources()).execute({prompt:x,parentSessionId:a,modelId:t.getCurrentModelId(),permissionMode:"default",reasoningEffort:t.getReasoningConfiguration().selection,serviceTier:t.getServiceTierConfiguration().selection,responseVerbosity:t.getResponseVerbosityConfiguration().selection,communicationStyle:t.getCommunicationStyleConfiguration().selection,subagentSessionId:l,workspaceRoot:f,signal:w,onEvent:c});if(!u.success)throw Error(u.error||"Review agent failed");if((u.modifiedFiles?.length??0)>0)throw Error("Read-only reviewer reported workspace modifications");let F=mf(u.message,f,e),k=!1;try{k=(await d.resolve(f,g)).info.digest!==e.info.digest}catch{k=!0}m={reviewId:$,status:k?"stale":"completed",...F,completedAt:new Date().toISOString()}}catch(x){let r=w?.aborted===!0;m={reviewId:$,status:r?"aborted":"failed",overallExplanation:r?"The code review was aborted.":"The code review could not produce a valid structured report.",findings:[],completedAt:new Date().toISOString(),error:x instanceof Error?x.message.slice(0,2000):String(x)}}await b.saveReviewCompletion(a,m);let h=G(await H(f,a)).find((x)=>x.start.reviewId===$)?.start;if(!h)throw Error(`Review start disappeared: ${$}`);return await b.saveMessage(a,"assistant",O(h,m),null,{codeReview:s(h,m)}),await B.updateSessionMetadata(a,f,{taskStatus:m.status==="completed"||m.status==="stale"?"completed":m.status==="aborted"?"cancelled":m.status==="interrupted"?"interrupted":"failed",taskStatusReason:m.status==="completed"?null:`Code review ${S(m.status)}`,taskCompletedAt:m.completedAt,taskOwnerPid:null}),m}static async recoverInterrupted(n,a,f){let t=Z(n,a);if(E.has(t))return;let g=await H(n,a),w=N(g);if(!w)return;if(f.sessionId!==a||R.resolve(f.workspaceRoot)!==R.resolve(n))throw Error("Review recovery requires the owning Session runtime");if(f.hasTurnOwner())return;let c={reviewId:w.start.reviewId,status:"interrupted",overallExplanation:"The process exited before the reviewer completed. The review was not replayed.",findings:[],completedAt:new Date().toISOString(),error:"Review interrupted by process restart"},e=new K(n);return await e.saveReviewCompletion(a,c),await e.saveMessage(a,"assistant",O(w.start,c),null,{codeReview:s(w.start,c)}),await B.updateSessionMetadata(a,n,{taskStatus:"interrupted",taskStatusReason:"Code review interrupted by process restart",taskCompletedAt:c.completedAt,taskOwnerPid:null}),c}static async list(n,a){return G(await H(n,a))}}
8
+ export{gf as r};
@@ -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 Kc,g as Lc};
2
+ export{s as Wc,g as Xc};
@@ -1,2 +1,2 @@
1
1
  var t=["auto","low","medium","high"],s=new Set(["openai-completions","openai-responses","openai-codex-responses","azure-openai-responses"]);function n(e){return/(?:^|[/.:_-])gpt-5(?:$|[/.:_-])/i.test(e.id)}function f(e){return typeof e==="string"&&t.includes(e)}function p(e){if(e.api==="openai-codex-responses"||s.has(e.api)&&n(e))return["low","medium","high"];return[]}function u(e,r){let i=p(e);if(r!=="auto"&&!i.includes(r))throw Error(`Response verbosity ${r} is not supported by ${e.name}`);if(r==="auto")return{selection:r,effective:"provider-default",supported:i};return{selection:r,effective:r,supported:i,providerValue:r}}var a=["auto","standard","fast","flex"],o=new Set(["openai-completions","openai-responses","openai-codex-responses","azure-openai-responses"]);function S(e){return typeof e==="string"&&a.includes(e)}function c(e){if(o.has(e.api))return["standard","fast","flex"];if(e.api==="anthropic-messages"&&/(?:^|-)claude-opus-4-6(?:-|$)/i.test(e.id))return["standard","fast"];return["standard"]}function l(e,r){let i=c(e);if(r!=="auto"&&!i.includes(r))throw Error(`Service tier ${r} is not supported by ${e.name}`);if(r==="auto")return{selection:r,effective:"provider-default",supported:i};if(r==="standard")return{selection:r,effective:"standard",supported:i,...o.has(e.api)?{providerValue:"default"}:{}};if(r==="fast")return{selection:r,effective:"fast",supported:i,providerValue:e.api==="anthropic-messages"?"fast":"priority"};return{selection:r,effective:"flex",supported:i,providerValue:"flex"}}
2
- export{f as Ce,p as De,u as Ee,S as Fe,c as Ge,l as He};
2
+ export{f as Se,p as Te,u as Ue,S as Ve,c as We,l as Xe};
@@ -1,3 +1,3 @@
1
- import{g as i}from"./chunk-w154jyby.js";import{we as s}from"./chunk-c9tzf9r5.js";import"./chunk-frcg8gea.js";import"./chunk-c2rhwxyn.js";import m from"node:path";var r={registry:i,currentWorkspace:s,inputCwd:()=>process.cwd(),write:console.log};function c(t,e){return m.resolve(e.inputCwd(),t)}function p(t){return t.map((e)=>{let o=e.isCurrent?"*":" ",n=e.gitBranch?` · ${e.gitBranch}`:"",d=e.available?"":" · unavailable";return`${o} ${e.name}${n}${d}
1
+ import{g as i}from"./chunk-pv9sw79c.js";import{Me as s}from"./chunk-y4c3wwpa.js";import"./chunk-66hb7kxm.js";import"./chunk-954vmnrn.js";import m from"node:path";var r={registry:i,currentWorkspace:s,inputCwd:()=>process.cwd(),write:console.log};function c(t,e){return m.resolve(e.inputCwd(),t)}function p(t){return t.map((e)=>{let o=e.isCurrent?"*":" ",n=e.gitBranch?` · ${e.gitBranch}`:"",d=e.available?"":" · unavailable";return`${o} ${e.name}${n}${d}
2
2
  ${e.path}`}).join(`
3
3
  `)}async function l(t,e=r){let o=await e.registry.list(e.currentWorkspace());return e.write(t.json?JSON.stringify(o,null,2):p(o)),o}async function u(t,e=r){let o=await e.registry.bind(c(t.path,e),e.currentWorkspace());return e.write(t.json?JSON.stringify(o,null,2):`Bound project: ${o.path}`),o}async function j(t,e=r){let o=c(t.path,e),n=await e.registry.unbind(o);return e.write(t.json?JSON.stringify({path:o,removed:n},null,2):n?`Unbound project: ${o}`:`Project was not bound: ${o}`),n}var a={type:"boolean",default:!1,describe:"Print machine-readable JSON"},P={command:"list",aliases:["ls"],describe:"List bound projects",builder:(t)=>t.option("json",a),handler:async(t)=>{await l(t)}},b={command:"add <path>",aliases:["bind"],describe:"Bind a project folder",builder:(t)=>t.positional("path",{type:"string",demandOption:!0,describe:"Absolute or relative project folder"}).option("json",a),handler:async(t)=>{await u(t)}},h={command:"remove <path>",aliases:["rm","unbind"],describe:"Unbind a project folder",builder:(t)=>t.positional("path",{type:"string",demandOption:!0,describe:"Absolute or relative project folder"}).option("json",a),handler:async(t)=>{await j(t)}},y={command:"projects",aliases:["project"],describe:"Manage project bindings shared with Blade Web",builder:(t)=>t.command(P).command(b).command(h).demandCommand(1,"Choose list, add, or remove"),handler:()=>{return}};export{j as runProjectsRemove,l as runProjectsList,u as runProjectsAdd,y as projectsCommands,p as formatProjectList};
@@ -0,0 +1,4 @@
1
+ import{$ as F,Z as y}from"./chunk-van4ysq6.js";import{Hb as Q,rb as Z,tb as x}from"./chunk-a8h3fymk.js";import{pd as $}from"./chunk-cf8e7e92.js";import{Me as K}from"./chunk-y4c3wwpa.js";async function O(){await $(K())}async function j(b){let q=b.message||b._?.[0];if(typeof q==="string"&&q.trim())return q;let z=b.stdin??process.stdin;if(!z.isTTY){let G=[];for await(let V of z)G.push(V);return Buffer.concat(G).toString("utf-8").trim()}if(b.defaultMessage!==void 0)return b.defaultMessage;throw Error("No input provided")}async function I(b){if(!y(b))return{mode:"agent",content:b};let q=await F(b,{cwd:K(),surface:"headless",workspaceRoot:K()});if(!q.success)return{mode:"output",content:`Error: ${q.error||"未知错误"}`,exitCode:1};let z=q.data;if(z?.action==="invoke_skill"){let{skillName:G,skillArgs:V}=z;return{mode:"agent",content:V?`Please use the "${G}" skill to help me with: ${V}`:`Please use the "${G}" skill.`}}if(z?.action==="invoke_custom_command"||z?.action==="invoke_plugin_command"){let G=z.processedContent;return{mode:"agent",content:`# Custom Command: /${z.commandName}
2
+
3
+ ${G}`}}return{mode:"output",content:q.content||q.message||"",exitCode:0}}import{readFile as B,stat as D}from"node:fs/promises";import H from"node:path";function L(b,q){let z;try{z=JSON.parse(b)}catch(G){throw Error(`Invalid JSON output schema from ${q}`,{cause:G})}return x(z).schema}async function P(b){if(b.jsonSchema!==void 0&&b.outputSchema!==void 0)throw Error("--json-schema cannot be combined with --output-schema");if(b.jsonSchema!==void 0)return L(b.jsonSchema,"--json-schema");if(b.outputSchema===void 0)return;let q=H.resolve(b.outputSchema),z=await D(q);if(!z.isFile())throw Error(`Output schema path is not a regular file: ${q}`);if(z.size>Z)throw Error(`Output schema exceeds ${Z} bytes: ${q}`);return L(await B(q,"utf8"),q)}function J(b){if(!(b instanceof Error))return!1;return b.message.includes("未找到会话")||b.message.includes("ENOENT")||b.message.includes("no such file")}async function N(b){try{return await Q.loadSession(b,K())}catch(q){if(J(q))return null;throw q}}async function T(b){if(b.resume===!0||b.resume==="true")throw Error("--resume without a session ID is only supported in interactive UI mode");if(typeof b.resume==="string"&&b.resume.length>0){if(b.forkSession){let G=K();return Q.forkSession(b.resume,{newSessionId:b.sessionId,sourceProjectPath:G,targetProjectPath:G})}let[q,z]=await Promise.all([Q.loadSession(b.resume),Q.findSessionMetadata(b.resume)]);return{sessionId:b.resume,messages:q,metadata:z}}if(b.continue){let q=b.forkSession?await Q.listSessions({cwd:K()}):await Q.listSessions();if(q.length>0){let z=q[0].sessionId;if(b.forkSession){let G=K();return Q.forkSession(z,{newSessionId:b.sessionId,sourceProjectPath:G,targetProjectPath:G})}return{sessionId:z,messages:await Q.loadSession(z),metadata:q[0]}}if(b.forkSession)throw Error("Cannot fork: no sessions are available to continue")}if(b.sessionId){let q=await N(b.sessionId);return{sessionId:b.sessionId,messages:q??[],...q?{metadata:await Q.findSessionMetadata(b.sessionId,K())}:{}}}return{sessionId:`${b.fallbackSessionPrefix}-${Date.now()}`,messages:[]}}
4
+ export{O as m,j as n,I as o,P as p,T as q};
@@ -1,2 +1,2 @@
1
1
  import{nanoid as q}from"nanoid";var u=/^[A-Za-z0-9][A-Za-z0-9._-]*$/;function B(j="session",m=21){if(!u.test(j))throw Error(`Invalid session ID prefix: ${j}`);return`${j}-${q(m)}`}
2
- export{B as Bc};
2
+ export{B as Nc};
@@ -1,4 +1,4 @@
1
- import{kc as W}from"./chunk-r083b7vn.js";import{nd as X}from"./chunk-thvwt4kc.js";import{qd as Q,sd as U}from"./chunk-6cv4gddv.js";import{we as V}from"./chunk-c9tzf9r5.js";function _(){if(process.stdin.isTTY&&typeof process.stdin.setRawMode==="function")try{process.stdin.setRawMode(!1)}catch{}process.stdout.write("\x1B[<u"),process.stdout.write("\x1B[>4;0m"),process.stdout.write("\x1B[?2004l"),process.stdout.write("\x1B[?1004l"),process.stdout.write("\x1B[?1l\x1B>"),process.stdout.write("\x1B[?25h"),process.stdout.write("\x1B[0m")}var A=U("Service");function $(b){switch(b){case"SIGINT":return"ctrl_c";case"esc":return"esc";case"uncaughtException":case"unhandledRejection":return"error";case"SIGTERM":case"normal":default:return"user_exit"}}class F{static instance=null;cleanupHandlers=[];isShuttingDown=!1;initialized=!1;lastSigintTime=0;SIGINT_DOUBLE_CLICK_WINDOW=3000;constructor(){}static getInstance(){if(!F.instance)F.instance=new F;return F.instance}initialize(){if(this.initialized){A.debug("[GracefulShutdown] 已初始化,跳过重复初始化");return}process.on("uncaughtException",(b)=>{this.handleFatalError("uncaughtException",b)}),process.on("unhandledRejection",(b)=>{let q=b instanceof Error?b:Error(String(b));this.handleFatalError("unhandledRejection",q)}),process.on("SIGTERM",()=>{A.info("[GracefulShutdown] 收到 SIGTERM 信号"),this.shutdown("SIGTERM",0)}),process.on("SIGINT",()=>{let b=Date.now();if(b-this.lastSigintTime<this.SIGINT_DOUBLE_CLICK_WINDOW)A.info("[GracefulShutdown] 收到第二次 SIGINT 信号,执行退出"),this.shutdown("SIGINT",0);else A.info("[GracefulShutdown] 收到第一次 SIGINT 信号,再按一次退出"),this.lastSigintTime=b,console.log(`
1
+ import{wc as W}from"./chunk-8gcg2z3y.js";import{Dd as X}from"./chunk-xa05phpw.js";import{Gd as Q,Id as U}from"./chunk-8gnfj89a.js";import{Me as V}from"./chunk-y4c3wwpa.js";function _(){if(process.stdin.isTTY&&typeof process.stdin.setRawMode==="function")try{process.stdin.setRawMode(!1)}catch{}process.stdout.write("\x1B[<u"),process.stdout.write("\x1B[>4;0m"),process.stdout.write("\x1B[?2004l"),process.stdout.write("\x1B[?1004l"),process.stdout.write("\x1B[?1l\x1B>"),process.stdout.write("\x1B[?25h"),process.stdout.write("\x1B[0m")}var A=U("Service");function $(b){switch(b){case"SIGINT":return"ctrl_c";case"esc":return"esc";case"uncaughtException":case"unhandledRejection":return"error";case"SIGTERM":case"normal":default:return"user_exit"}}class F{static instance=null;cleanupHandlers=[];isShuttingDown=!1;initialized=!1;lastSigintTime=0;SIGINT_DOUBLE_CLICK_WINDOW=3000;constructor(){}static getInstance(){if(!F.instance)F.instance=new F;return F.instance}initialize(){if(this.initialized){A.debug("[GracefulShutdown] 已初始化,跳过重复初始化");return}process.on("uncaughtException",(b)=>{this.handleFatalError("uncaughtException",b)}),process.on("unhandledRejection",(b)=>{let q=b instanceof Error?b:Error(String(b));this.handleFatalError("unhandledRejection",q)}),process.on("SIGTERM",()=>{A.info("[GracefulShutdown] 收到 SIGTERM 信号"),this.shutdown("SIGTERM",0)}),process.on("SIGINT",()=>{let b=Date.now();if(b-this.lastSigintTime<this.SIGINT_DOUBLE_CLICK_WINDOW)A.info("[GracefulShutdown] 收到第二次 SIGINT 信号,执行退出"),this.shutdown("SIGINT",0);else A.info("[GracefulShutdown] 收到第一次 SIGINT 信号,再按一次退出"),this.lastSigintTime=b,console.log(`
2
2
  再按一次 Ctrl+C 退出
3
3
  `)}),this.initialized=!0,A.debug("[GracefulShutdown] 全局错误处理器已初始化")}registerCleanup(b){return this.cleanupHandlers.push(b),A.debug(`[GracefulShutdown] 注册清理函数,当前共 ${this.cleanupHandlers.length} 个`),()=>{let q=this.cleanupHandlers.indexOf(b);if(q!==-1)this.cleanupHandlers.splice(q,1),A.debug(`[GracefulShutdown] 取消注册清理函数,剩余 ${this.cleanupHandlers.length} 个`)}}handleFatalError(b,q){if(this.isShuttingDown){console.error(`[GracefulShutdown] 退出过程中发生额外错误 (${b}):`,q);return}if(console.error(""),console.error("═".repeat(60)),console.error(`Uncaught error (${b})`),console.error("═".repeat(60)),console.error(""),console.error("错误信息:",q.message),console.error(""),q.stack)console.error("堆栈跟踪:"),console.error(q.stack);console.error(""),console.error("═".repeat(60)),console.error(""),this.shutdown(b,1)}async shutdown(b,q=0){if(this.isShuttingDown){A.debug("[GracefulShutdown] 已在退出过程中,跳过重复退出");return}this.isShuttingDown=!0,A.info(`[GracefulShutdown] 开始优雅退出 (原因: ${b})`);try{await Q()}catch(z){}try{let z=X.getInstance(),J=W(),N=J.session?.sessionId||"unknown",O=J.session?.workspaceRoot||V();if(z.isEnabled(O,N)){let Z=J.config?.config?.permissionMode||"default";await z.executeSessionEndHooks($(b),{projectDir:O,sessionId:N,permissionMode:Z})}}catch(z){console.error("[GracefulShutdown] SessionEnd hooks 执行失败:",z)}let B=5000,Y=new Promise((z,J)=>{setTimeout(()=>{J(Error(`清理超时 (${B}ms)`))},B)});try{let z=this.runCleanupHandlers();await Promise.race([z,Y])}catch(z){console.error("[GracefulShutdown] 清理过程中发生错误:",z)}finally{_(),setTimeout(()=>{process.exit(q)},100)}}async runCleanupHandlers(){let b=[...this.cleanupHandlers].reverse();for(let q of b)try{let B=q();if(B instanceof Promise)await B}catch(B){console.error("[GracefulShutdown] 清理函数执行失败:",B)}}isExiting(){return this.isShuttingDown}reset(){this.isShuttingDown=!1,this.cleanupHandlers=[],this.initialized=!1}}var K=()=>{return F.getInstance()},P=(b)=>{return K().registerCleanup(b)},L=()=>{K().initialize()},k=(b=0)=>{K().shutdown("normal",b)};
4
- export{K as Ub,P as Vb,L as Wb,k as Xb};
4
+ export{K as ec,P as fc,L as gc,k as hc};
@@ -1,4 +1,4 @@
1
- import"./chunk-yt39kfc6.js";import"./chunk-6cv4gddv.js";import{ee as J}from"./chunk-0rp2ck29.js";import"./chunk-xkp4ph6v.js";import"./chunk-1kg9r8xp.js";import{we as H}from"./chunk-c9tzf9r5.js";import"./chunk-n9khyme2.js";import"./chunk-7xm3vjkz.js";import"./chunk-nfmsn652.js";import"./chunk-kcs3xa8f.js";import"./chunk-vvbd9fb5.js";import"./chunk-frcg8gea.js";import{_e as B}from"./chunk-c2rhwxyn.js";var O={command:"doctor",describe:"Check the health of your Blade installation",builder:(D)=>D.option("rebuild-index",{type:"boolean",default:!1,describe:"Rebuild the SQLite session index from JSONL transcripts"}),handler:async(D)=>{if(D.rebuildIndex){console.log(`Rebuilding session index from JSONL transcripts...
2
- `);try{let{rebuildProjectionIndex:z}=await import("./chunk-n34z4c47.js"),{SessionService:F}=await import("./chunk-xd2g4zjx.js"),G=await z(F.projectionDeriverForSearch());if(G===null)console.log("[WARN] Session index unavailable (SQLite driver missing); reads fall back to JSONL scan.");else console.log(`[OK] Session index rebuilt: ${G} 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-7hbw6q6d.js";import"./chunk-8gnfj89a.js";import{ue as J}from"./chunk-yfs9tq3y.js";import"./chunk-zknv3d6y.js";import"./chunk-6j8wgp2s.js";import{Me as H}from"./chunk-y4c3wwpa.js";import"./chunk-v8pq6qmv.js";import"./chunk-fj8v7pep.js";import"./chunk-6vsszvgg.js";import"./chunk-w0nscjd2.js";import"./chunk-33ave20b.js";import"./chunk-66hb7kxm.js";import{of as B}from"./chunk-954vmnrn.js";var O={command:"doctor",describe:"Check the health of your Blade installation",builder:(D)=>D.option("rebuild-index",{type:"boolean",default:!1,describe:"Rebuild the SQLite session index from JSONL transcripts"}),handler:async(D)=>{if(D.rebuildIndex){console.log(`Rebuilding session index from JSONL transcripts...
2
+ `);try{let{rebuildProjectionIndex:z}=await import("./chunk-2zn5en0w.js"),{SessionService:F}=await import("./chunk-3w1z6fwm.js"),G=await z(F.projectionDeriverForSearch());if(G===null)console.log("[WARN] Session index unavailable (SQLite driver missing); reads fall back to JSONL scan.");else console.log(`[OK] Session index rebuilt: ${G} 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 J.getInstance().initialize(),console.log("[OK] Configuration: OK")}catch(z){console.log("[FAIL] Configuration: FAILED"),console.log(` Error: ${z instanceof Error?z.message:"未知错误"}`),A++}let E=process.version;if(parseInt(E.slice(1).split(".")[0])>=18)console.log(`[OK] Node.js version: ${E}`);else console.log(`[WARN] Node.js version: ${E} (recommended: v18+)`),A++;try{let z=await import("fs/promises"),F=H();await z.access(F,(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{O as doctorCommands};
@@ -1,4 +1,4 @@
1
- import{sd as o}from"./chunk-6cv4gddv.js";import{Qe as l,Se as C,Ue as y,Ye as u,Ze as n}from"./chunk-frcg8gea.js";import{_e as J}from"./chunk-c2rhwxyn.js";import{stat as i}from"node:fs/promises";import A from"node:path";import*as M from"node:path";var a=50,s=100,t=/^[A-Za-z0-9_-]+$/,e=/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,9})?(?:Z|[+-]\d{2}:\d{2})$/;function EE(_){return typeof _==="string"&&e.test(_)&&Number.isFinite(Date.parse(_))}function P(_){return typeof _==="string"&&M.isAbsolute(_)}function _E(_){return Buffer.from(JSON.stringify(_),"utf8").toString("base64url")}function RE(_){try{if(!t.test(_))throw Error("invalid");let E=Buffer.from(_,"base64url").toString("utf8");if(Buffer.from(E,"utf8").toString("base64url")!==_)throw Error("invalid");let R=JSON.parse(E);if(R.version!==1||typeof R.includeSubagents!=="boolean"||R.archived!==void 0&&typeof R.archived!=="boolean"||!(R.cwd===null||P(R.cwd))||!EE(R.lastMessageTime)||!P(R.projectPath)||!C(R.sessionId))throw Error("invalid");return{version:1,cwd:R.cwd===null?null:M.resolve(R.cwd),includeSubagents:R.includeSubagents,archived:R.archived??!1,lastMessageTime:R.lastMessageTime,projectPath:M.resolve(R.projectPath),sessionId:R.sessionId}}catch{throw Error("Invalid session cursor")}}function f(_){let E="";for(let R=0;R<_.length;R+=1)E+=_.charCodeAt(R).toString(16).padStart(4,"0");return E}function WE(_){if(!_.cursor)return;let E=RE(_.cursor);if(E.cwd!==_.cwd||E.includeSubagents!==_.includeSubagents||(E.archived??!1)!==_.archived)throw Error("Session cursor scope does not match this query");return E}function wE(_={}){let{cwd:E,cursor:R,limit:W,includeSubagents:$=!1,archived:k=!1}=_;if(E!==void 0&&!M.isAbsolute(E))throw Error("Session catalog cwd must be absolute");let H=W===void 0?a:W;if(!Number.isInteger(H)||H<1||H>s)throw Error("Session catalog limit must be an integer from 1 to 100");return{cwd:E===void 0?null:M.resolve(E),cursor:R??void 0,limit:H,includeSubagents:$,archived:k}}function $E(_,E){if(_.lastMessageTime>E.lastMessageTime)return-1;if(_.lastMessageTime<E.lastMessageTime)return 1;if(_.projectPath<E.projectPath)return-1;if(_.projectPath>E.projectPath)return 1;if(_.sessionId<E.sessionId)return-1;if(_.sessionId>E.sessionId)return 1;return 0}function xE(_,E){let R=[..._],W=WE(E);if(W)R=R.filter((H)=>$E(H,{sessionId:W.sessionId,projectPath:W.projectPath,lastMessageTime:W.lastMessageTime})>0);let $=R.slice(0,E.limit);if($.length===0||R.length<=$.length)return{sessions:$};let k=$[$.length-1];return{sessions:$,nextCursor:_E({version:1,cwd:E.cwd,includeSubagents:E.includeSubagents,archived:E.archived,lastMessageTime:k.lastMessageTime,projectPath:k.projectPath,sessionId:k.sessionId})}}function kE(_){return _.type==="message_created"||_.type==="part_created"||_.type==="part_updated"||_.type==="interaction_requested"||_.type==="interaction_responded"||_.type==="interaction_recovered"}function O(_){return _.type==="message_created"&&_.data.role==="user"&&(_.data.inboxMessageId!==void 0||_.data.parentMessageId===void 0)}function N(_,E){let R=_.find((W)=>O(W)&&W.data.messageId===E);if(!R)throw Error(`Rewind checkpoint not found: ${E}`);return{messageId:E,preview:p(_,E),createdAt:R.data.createdAt}}function p(_,E){let R=_.flatMap((W)=>{if(W.type!=="part_created"||W.data.messageId!==E)return[];if(W.data.partType==="text"){let $=W.data.payload;return typeof $.text==="string"?[$.text]:[]}if(W.data.partType==="image")return["[Image]"];return[]}).join("").trim();if(R.length<=160)return R;return`${R.slice(0,160)}...`}function S(_,E){N(_,E);let R=_.findIndex((W)=>W.type==="message_created"&&W.data.messageId===E);return _.filter((W,$)=>$<R||!kE(W))}function z(_){let E=[];for(let R of _){if(R.type!=="session_rewound"){E.push(R);continue}if(N(E,R.data.targetMessageId),R.data.mode!=="code")E=S(E,R.data.targetMessageId)}return E}function qE(_){let E=z(_);return E.filter(O).map((R)=>({messageId:R.data.messageId,preview:p(E,R.data.messageId),createdAt:R.data.createdAt})).reverse()}function fE(_,E){let R=z(_),W=N(R,E),$=R.findIndex((H)=>H.type==="message_created"&&H.data.messageId===E),k=R.slice($);return{checkpoint:W,projectedEntries:S(R,E),removedTurns:k.filter(O).length,snapshotMessageIds:k.flatMap((H)=>H.type==="part_created"&&H.data.partType==="tool_call"?[H.data.partId]:[])}}import*as x from"node:fs";import{createReadStream as HE}from"node:fs";import*as Y from"node:fs/promises";import*as I from"node:path";import{createInterface as QE}from"node:readline";var c=65536;function VE(_,E,R){let W=_.trim();if(!W)return;try{return JSON.parse(W)}catch($){throw Error(`Invalid session JSONL in ${R} at line ${E}`,{cause:$})}}function w(_,E="session transcript"){let R=_.split(`
1
+ import{Id as n}from"./chunk-8gnfj89a.js";import{ef as l,gf as C,if as L,mf as u,nf as o}from"./chunk-66hb7kxm.js";import{of as J}from"./chunk-954vmnrn.js";import{stat as i}from"node:fs/promises";import A from"node:path";import*as M from"node:path";var a=50,s=100,t=/^[A-Za-z0-9_-]+$/,e=/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,9})?(?:Z|[+-]\d{2}:\d{2})$/;function EE(_){return typeof _==="string"&&e.test(_)&&Number.isFinite(Date.parse(_))}function P(_){return typeof _==="string"&&M.isAbsolute(_)}function _E(_){return Buffer.from(JSON.stringify(_),"utf8").toString("base64url")}function RE(_){try{if(!t.test(_))throw Error("invalid");let E=Buffer.from(_,"base64url").toString("utf8");if(Buffer.from(E,"utf8").toString("base64url")!==_)throw Error("invalid");let R=JSON.parse(E);if(R.version!==1||typeof R.includeSubagents!=="boolean"||R.archived!==void 0&&typeof R.archived!=="boolean"||!(R.cwd===null||P(R.cwd))||!EE(R.lastMessageTime)||!P(R.projectPath)||!C(R.sessionId))throw Error("invalid");return{version:1,cwd:R.cwd===null?null:M.resolve(R.cwd),includeSubagents:R.includeSubagents,archived:R.archived??!1,lastMessageTime:R.lastMessageTime,projectPath:M.resolve(R.projectPath),sessionId:R.sessionId}}catch{throw Error("Invalid session cursor")}}function f(_){let E="";for(let R=0;R<_.length;R+=1)E+=_.charCodeAt(R).toString(16).padStart(4,"0");return E}function WE(_){if(!_.cursor)return;let E=RE(_.cursor);if(E.cwd!==_.cwd||E.includeSubagents!==_.includeSubagents||(E.archived??!1)!==_.archived)throw Error("Session cursor scope does not match this query");return E}function wE(_={}){let{cwd:E,cursor:R,limit:W,includeSubagents:$=!1,archived:k=!1}=_;if(E!==void 0&&!M.isAbsolute(E))throw Error("Session catalog cwd must be absolute");let H=W===void 0?a:W;if(!Number.isInteger(H)||H<1||H>s)throw Error("Session catalog limit must be an integer from 1 to 100");return{cwd:E===void 0?null:M.resolve(E),cursor:R??void 0,limit:H,includeSubagents:$,archived:k}}function $E(_,E){if(_.lastMessageTime>E.lastMessageTime)return-1;if(_.lastMessageTime<E.lastMessageTime)return 1;if(_.projectPath<E.projectPath)return-1;if(_.projectPath>E.projectPath)return 1;if(_.sessionId<E.sessionId)return-1;if(_.sessionId>E.sessionId)return 1;return 0}function xE(_,E){let R=[..._],W=WE(E);if(W)R=R.filter((H)=>$E(H,{sessionId:W.sessionId,projectPath:W.projectPath,lastMessageTime:W.lastMessageTime})>0);let $=R.slice(0,E.limit);if($.length===0||R.length<=$.length)return{sessions:$};let k=$[$.length-1];return{sessions:$,nextCursor:_E({version:1,cwd:E.cwd,includeSubagents:E.includeSubagents,archived:E.archived,lastMessageTime:k.lastMessageTime,projectPath:k.projectPath,sessionId:k.sessionId})}}function kE(_){return _.type==="message_created"||_.type==="part_created"||_.type==="part_updated"||_.type==="interaction_requested"||_.type==="interaction_responded"||_.type==="interaction_recovered"||_.type==="review_started"||_.type==="review_completed"}function O(_){return _.type==="message_created"&&_.data.role==="user"&&(_.data.inboxMessageId!==void 0||_.data.parentMessageId===void 0)}function N(_,E){let R=_.find((W)=>O(W)&&W.data.messageId===E);if(!R)throw Error(`Rewind checkpoint not found: ${E}`);return{messageId:E,preview:p(_,E),createdAt:R.data.createdAt}}function p(_,E){let R=_.flatMap((W)=>{if(W.type!=="part_created"||W.data.messageId!==E)return[];if(W.data.partType==="text"){let $=W.data.payload;return typeof $.text==="string"?[$.text]:[]}if(W.data.partType==="image")return["[Image]"];return[]}).join("").trim();if(R.length<=160)return R;return`${R.slice(0,160)}...`}function S(_,E){N(_,E);let R=_.findIndex((W)=>W.type==="message_created"&&W.data.messageId===E);return _.filter((W,$)=>$<R||!kE(W))}function z(_){let E=[];for(let R of _){if(R.type!=="session_rewound"){E.push(R);continue}if(N(E,R.data.targetMessageId),R.data.mode!=="code")E=S(E,R.data.targetMessageId)}return E}function qE(_){let E=z(_);return E.filter(O).map((R)=>({messageId:R.data.messageId,preview:p(E,R.data.messageId),createdAt:R.data.createdAt})).reverse()}function fE(_,E){let R=z(_),W=N(R,E),$=R.findIndex((H)=>H.type==="message_created"&&H.data.messageId===E),k=R.slice($);return{checkpoint:W,projectedEntries:S(R,E),removedTurns:k.filter(O).length,snapshotMessageIds:k.flatMap((H)=>H.type==="part_created"&&H.data.partType==="tool_call"?[H.data.partId]:[])}}import*as x from"node:fs";import{createReadStream as HE}from"node:fs";import*as Y from"node:fs/promises";import*as I from"node:path";import{createInterface as QE}from"node:readline";var c=65536;function VE(_,E,R){let W=_.trim();if(!W)return;try{return JSON.parse(W)}catch($){throw Error(`Invalid session JSONL in ${R} at line ${E}`,{cause:$})}}function w(_,E="session transcript"){let R=_.split(`
2
2
  `),W=!_.endsWith(`
3
3
  `),$=[];for(let[k,H]of R.entries())try{let Q=VE(H,k+1,E);if(Q){if(typeof Q.seq!=="number")Q.seq=$.length+1;$.push(Q)}}catch(Q){if(W&&k===R.length-1)break;throw Q}return $}class Z{static appendQueues=new Map;filePath;constructor(_){this.filePath=_}static maxSeq(_){let E=0;for(let R of _)if(typeof R.seq==="number"&&R.seq>E)E=R.seq;return E}static stampSeqFrom(_,E){let R=E;return _.map((W)=>{if(typeof W.seq==="number"){if(W.seq>R)R=W.seq;return W}return R+=1,{...W,seq:R}})}static stampSeq(_,E){return Z.stampSeqFrom(_,Z.maxSeq(E))}async append(_){try{let[E]=await this.appendEntries([_]);return E}catch(E){throw console.error(`[JSONLStore] 追加写入失败: ${this.filePath}`,E),E}}async appendBatch(_){try{return await this.appendEntries(_)}catch(E){throw console.error(`[JSONLStore] 批量追加写入失败: ${this.filePath}`,E),E}}async appendEntries(_){if(_.length===0)return[];return this.enqueue(async()=>{await Y.mkdir(I.dirname(this.filePath),{recursive:!0,mode:493});let E=await Y.open(this.filePath,"a+",384);try{let R=await this.repairIncompleteTail(E),W=await this.readTailSeq(E),$=Z.stampSeqFrom(_,W),k=`${$.map((H)=>JSON.stringify(H)).join(`
4
4
  `)}
@@ -81,7 +81,7 @@ CREATE VIRTUAL TABLE IF NOT EXISTS parts_fts USING fts5(
81
81
  seq UNINDEXED,
82
82
  tokenize = 'unicode61'
83
83
  );
84
- `),_.exec("PRAGMA user_version=3;")}var KE=o("Service"),B;function d(){return A.join(u(),"index.db")}async function TE(){let _=d();if(B&&B.path===_)return B.db;let E=(async()=>{let R=await m(_);if(!R)return null;try{return h(R),R}catch{return null}})();return B={path:_,db:E},E}function UE(){B=void 0}function ME(_){if(_&&typeof _==="object"){let E=_.text;if(typeof E==="string")return E}return null}function FE(_,E,R,W){_.prepare("DELETE FROM parts WHERE project_path=? AND session_id=?").run(E,R),_.prepare("DELETE FROM parts_fts WHERE project_path=? AND session_id=?").run(E,R);let $=new Map;for(let Q of W)if(Q.type==="message_created")$.set(Q.data.messageId,Q.data.role);let k=_.prepare(`INSERT OR REPLACE INTO parts
84
+ `),_.exec("PRAGMA user_version=3;")}var KE=n("Service"),B;function d(){return A.join(u(),"index.db")}async function TE(){let _=d();if(B&&B.path===_)return B.db;let E=(async()=>{let R=await m(_);if(!R)return null;try{return h(R),R}catch{return null}})();return B={path:_,db:E},E}function UE(){B=void 0}function ME(_){if(_&&typeof _==="object"){let E=_.text;if(typeof E==="string")return E}return null}function FE(_,E,R,W){_.prepare("DELETE FROM parts WHERE project_path=? AND session_id=?").run(E,R),_.prepare("DELETE FROM parts_fts WHERE project_path=? AND session_id=?").run(E,R);let $=new Map;for(let Q of W)if(Q.type==="message_created")$.set(Q.data.messageId,Q.data.role);let k=_.prepare(`INSERT OR REPLACE INTO parts
85
85
  (project_path, session_id, part_id, message_id, part_type, role, seq, timestamp, text)
86
86
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`),H=_.prepare(`INSERT INTO parts_fts (text, project_path, session_id, part_id, role, timestamp, seq)
87
87
  VALUES (?, ?, ?, ?, ?, ?, ?)`);for(let Q of W){if(Q.type!=="part_created"&&Q.type!=="part_updated")continue;if(Q.data.partType!=="text")continue;let X=ME(Q.data.payload);if(X===null)continue;let G=$.get(Q.data.messageId)??"assistant",F=Q.seq??0;if(k.run(E,R,Q.data.partId,Q.data.messageId,Q.data.partType,G,F,Q.timestamp,X),G==="user"||G==="assistant")H.run(X,E,R,Q.data.partId,G,Q.timestamp,F)}}function DE(_,E){_.prepare(`INSERT INTO sessions
@@ -100,15 +100,15 @@ CREATE VIRTUAL TABLE IF NOT EXISTS parts_fts USING fts5(
100
100
  session_sort_key=excluded.session_sort_key,
101
101
  first_message_time=excluded.first_message_time, message_count=excluded.message_count,
102
102
  has_errors=excluded.has_errors, is_subagent=excluded.is_subagent,
103
- metadata_json=excluded.metadata_json`).run(E.projectPath,E.sessionId,E.rootId,E.parentId??null,E.relationType??null,E.title??null,E.agentType??null,E.model??null,E.taskStatus,E.archivedAt??null,E.lastMessageTime,f(E.projectPath),f(E.sessionId),E.firstMessageTime,E.messageCount,E.hasErrors?1:0,E.relationType==="subagent"?1:0,JSON.stringify(E))}function r(_,E,R){for(let W of["sessions","parts","parts_fts"])_.prepare(`DELETE FROM ${W} WHERE project_path=? AND session_id=?`).run(E,R)}function v(_,E,R){r(_,E,R),_.prepare("DELETE FROM projection_state WHERE project_path=? AND session_id=?").run(E,R)}function L(_,E,R,W,$,k){_.prepare(`INSERT INTO projection_state
103
+ metadata_json=excluded.metadata_json`).run(E.projectPath,E.sessionId,E.rootId,E.parentId??null,E.relationType??null,E.title??null,E.agentType??null,E.model??null,E.taskStatus,E.archivedAt??null,E.lastMessageTime,f(E.projectPath),f(E.sessionId),E.firstMessageTime,E.messageCount,E.hasErrors?1:0,E.relationType==="subagent"?1:0,JSON.stringify(E))}function r(_,E,R){for(let W of["sessions","parts","parts_fts"])_.prepare(`DELETE FROM ${W} WHERE project_path=? AND session_id=?`).run(E,R)}function v(_,E,R){r(_,E,R),_.prepare("DELETE FROM projection_state WHERE project_path=? AND session_id=?").run(E,R)}function y(_,E,R,W,$,k){_.prepare(`INSERT INTO projection_state
104
104
  (project_path, session_id, last_seq, file_size, mtime_ms)
105
105
  VALUES (?, ?, ?, ?, ?)
106
106
  ON CONFLICT(project_path, session_id) DO UPDATE SET
107
107
  last_seq=excluded.last_seq, file_size=excluded.file_size,
108
- mtime_ms=excluded.mtime_ms`).run(E,R,W,$,k)}async function BE(_,E,R,W,$=y(R,E)){let k;try{let V=await i($);k={size:V.size,mtimeMs:V.mtimeMs}}catch{return _.transaction(()=>v(_,R,E)),!0}let H=_.prepare("SELECT last_seq, file_size, mtime_ms FROM projection_state WHERE project_path=? AND session_id=?").get(R,E);if(H&&H.file_size===k.size&&H.mtime_ms===Math.floor(k.mtimeMs))return!1;let X=await new Z($).readAll(),G=X.reduce((V,T)=>typeof T.seq==="number"&&T.seq>V?T.seq:V,0),F=z(X),K=W(X,E,R);if(X.length===0||!K)return _.transaction(()=>{r(_,R,E),L(_,R,E,G,k.size,Math.floor(k.mtimeMs))}),!0;let D=_.prepare("SELECT last_message_time FROM sessions WHERE project_path=? AND session_id=?").get(K.projectPath,K.sessionId),g=A.resolve($)===A.resolve(y(K.projectPath,K.sessionId));if(D&&!g&&typeof D.last_message_time==="string"&&D.last_message_time>K.lastMessageTime)return L(_,R,E,G,k.size,Math.floor(k.mtimeMs)),!0;return _.transaction(()=>{DE(_,K),FE(_,K.projectPath,K.sessionId,F),L(_,R,E,G,k.size,Math.floor(k.mtimeMs))}),!0}var b=new WeakMap;async function AE(_,E,R=0){let W=b.get(_)??{};if(b.set(_,W),W.inFlight)return W.inFlight;if(R>0&&W.lastCompletedAt!==void 0&&Date.now()-W.lastCompletedAt<=R)return;let $=gE(_,E);W.inFlight=$;try{await $,W.lastCompletedAt=Date.now()}finally{if(W.inFlight===$)W.inFlight=void 0}}async function gE(_,E){let{readdir:R}=await import("node:fs/promises"),W=await n(),$=new Set,H=(await Promise.all(W.map(async(V)=>{let T=l(V),U=A.join(u(),"projects",V);try{return(await R(U)).flatMap((q)=>{if(!q.endsWith(".jsonl"))return[];let j=q.slice(0,-6);if(!C(j))return[];return[{filePath:A.join(U,q),projectPath:T,sessionId:j}]})}catch{return[]}}))).flat();for(let V of H)$.add(`${V.projectPath}\x00${V.sessionId}`);let Q=_.prepare(`SELECT project_path, session_id, last_seq, file_size, mtime_ms
109
- FROM projection_state`).all(),X=new Map(Q.map((V)=>[`${V.project_path}\x00${V.session_id}`,V])),G=[],F=Math.min(128,H.length),K=0;await Promise.all(Array.from({length:F},async()=>{while(K<H.length){let V=H[K++];if(!V)continue;try{let T=await i(V.filePath),U=X.get(`${V.projectPath}\x00${V.sessionId}`);if(U&&U.file_size===T.size&&U.mtime_ms===Math.floor(T.mtimeMs))continue}catch{}G.push(V)}}));let D=Math.min(32,G.length),g=0;await Promise.all(Array.from({length:D},async()=>{while(g<G.length){let V=G[g++];if(!V)continue;try{await BE(_,V.sessionId,V.projectPath,E,V.filePath)}catch(T){if(T.code!=="ENOENT")KE.warn(`[SessionService] Skipping invalid session transcript: ${V.sessionId}`)}}}));for(let V of Q)if(!$.has(`${V.project_path}\x00${V.session_id}`))_.transaction(()=>v(_,V.project_path,V.session_id))}function nE(_,E,R){_.transaction(()=>v(_,R,E))}async function oE(_){let{rm:E}=await import("node:fs/promises");UE();let R=d();for(let k of["","-wal","-shm"])await E(`${R}${k}`,{force:!0}).catch(()=>{return});let W=await TE();if(!W)return null;return await AE(W,_),W.prepare("SELECT COUNT(*) c FROM sessions").get()?.c??0}function iE(_,E,R,W){let $=E.replace(/["*]/g," ").trim().split(/\s+/)[0];if(!$)return[];let k=`"${$}"*`,H=R?`SELECT session_id, role, timestamp, text FROM parts_fts
108
+ mtime_ms=excluded.mtime_ms`).run(E,R,W,$,k)}async function BE(_,E,R,W,$=L(R,E)){let k;try{let V=await i($);k={size:V.size,mtimeMs:V.mtimeMs}}catch{return _.transaction(()=>v(_,R,E)),!0}let H=_.prepare("SELECT last_seq, file_size, mtime_ms FROM projection_state WHERE project_path=? AND session_id=?").get(R,E);if(H&&H.file_size===k.size&&H.mtime_ms===Math.floor(k.mtimeMs))return!1;let X=await new Z($).readAll(),G=X.reduce((V,T)=>typeof T.seq==="number"&&T.seq>V?T.seq:V,0),F=z(X),K=W(X,E,R);if(X.length===0||!K)return _.transaction(()=>{r(_,R,E),y(_,R,E,G,k.size,Math.floor(k.mtimeMs))}),!0;let D=_.prepare("SELECT last_message_time FROM sessions WHERE project_path=? AND session_id=?").get(K.projectPath,K.sessionId),g=A.resolve($)===A.resolve(L(K.projectPath,K.sessionId));if(D&&!g&&typeof D.last_message_time==="string"&&D.last_message_time>K.lastMessageTime)return y(_,R,E,G,k.size,Math.floor(k.mtimeMs)),!0;return _.transaction(()=>{DE(_,K),FE(_,K.projectPath,K.sessionId,F),y(_,R,E,G,k.size,Math.floor(k.mtimeMs))}),!0}var b=new WeakMap;async function AE(_,E,R=0){let W=b.get(_)??{};if(b.set(_,W),W.inFlight)return W.inFlight;if(R>0&&W.lastCompletedAt!==void 0&&Date.now()-W.lastCompletedAt<=R)return;let $=gE(_,E);W.inFlight=$;try{await $,W.lastCompletedAt=Date.now()}finally{if(W.inFlight===$)W.inFlight=void 0}}async function gE(_,E){let{readdir:R}=await import("node:fs/promises"),W=await o(),$=new Set,H=(await Promise.all(W.map(async(V)=>{let T=l(V),U=A.join(u(),"projects",V);try{return(await R(U)).flatMap((q)=>{if(!q.endsWith(".jsonl"))return[];let j=q.slice(0,-6);if(!C(j))return[];return[{filePath:A.join(U,q),projectPath:T,sessionId:j}]})}catch{return[]}}))).flat();for(let V of H)$.add(`${V.projectPath}\x00${V.sessionId}`);let Q=_.prepare(`SELECT project_path, session_id, last_seq, file_size, mtime_ms
109
+ FROM projection_state`).all(),X=new Map(Q.map((V)=>[`${V.project_path}\x00${V.session_id}`,V])),G=[],F=Math.min(128,H.length),K=0;await Promise.all(Array.from({length:F},async()=>{while(K<H.length){let V=H[K++];if(!V)continue;try{let T=await i(V.filePath),U=X.get(`${V.projectPath}\x00${V.sessionId}`);if(U&&U.file_size===T.size&&U.mtime_ms===Math.floor(T.mtimeMs))continue}catch{}G.push(V)}}));let D=Math.min(32,G.length),g=0;await Promise.all(Array.from({length:D},async()=>{while(g<G.length){let V=G[g++];if(!V)continue;try{await BE(_,V.sessionId,V.projectPath,E,V.filePath)}catch(T){if(T.code!=="ENOENT")KE.warn(`[SessionService] Skipping invalid session transcript: ${V.sessionId}`)}}}));for(let V of Q)if(!$.has(`${V.project_path}\x00${V.session_id}`))_.transaction(()=>v(_,V.project_path,V.session_id))}function oE(_,E,R){_.transaction(()=>v(_,R,E))}async function nE(_){let{rm:E}=await import("node:fs/promises");UE();let R=d();for(let k of["","-wal","-shm"])await E(`${R}${k}`,{force:!0}).catch(()=>{return});let W=await TE();if(!W)return null;return await AE(W,_),W.prepare("SELECT COUNT(*) c FROM sessions").get()?.c??0}function iE(_,E,R,W){let $=E.replace(/["*]/g," ").trim().split(/\s+/)[0];if(!$)return[];let k=`"${$}"*`,H=R?`SELECT session_id, role, timestamp, text FROM parts_fts
110
110
  WHERE parts_fts MATCH ? AND project_path = ?
111
111
  ORDER BY timestamp DESC LIMIT ?`:`SELECT session_id, role, timestamp, text FROM parts_fts
112
112
  WHERE parts_fts MATCH ?
113
113
  ORDER BY timestamp DESC LIMIT ?`,Q=_.prepare(H);return R?Q.all(k,R,W):Q.all(k,W)}
114
- export{z as wb,qE as xb,fE as yb,w as zb,Z as Ab,f as Bb,WE as Cb,wE as Db,$E as Eb,xE as Fb,d as Gb,TE as Hb,UE as Ib,BE as Jb,AE as Kb,nE as Lb,oE as Mb,iE as Nb};
114
+ export{z as Ib,qE as Jb,fE as Kb,w as Lb,Z as Mb,f as Nb,WE as Ob,wE as Pb,$E as Qb,xE as Rb,d as Sb,TE as Tb,UE as Ub,BE as Vb,AE as Wb,oE as Xb,nE as Yb,iE as Zb};
@@ -0,0 +1 @@
1
+ import{a as y,b as A,c as C,d as D}from"./chunk-52csdk21.js";import"./chunk-rkvfsx8e.js";import"./chunk-pv9sw79c.js";import"./chunk-d0g4t8fw.js";import"./chunk-8h0yxh6y.js";import"./chunk-van4ysq6.js";import"./chunk-s9aj3p11.js";import"./chunk-8sfycn3y.js";import"./chunk-nymm525r.js";import"./chunk-a8h3fymk.js";import"./chunk-kagpk2x5.js";import"./chunk-xmcsn7y0.js";import{Bc as q}from"./chunk-8gcg2z3y.js";import"./chunk-7hbw6q6d.js";import"./chunk-h28ptrrt.js";import"./chunk-b5szbtmp.js";import"./chunk-wmnszjmv.js";import"./chunk-eq2qj9ja.js";import"./chunk-rxqft6td.js";import"./chunk-cf8e7e92.js";import"./chunk-senkwdh6.js";import"./chunk-vsg8f0e6.js";import"./chunk-4h9ff923.js";import"./chunk-xa05phpw.js";import"./chunk-cbpqcdga.js";import"./chunk-8gnfj89a.js";import"./chunk-yfs9tq3y.js";import"./chunk-zknv3d6y.js";import"./chunk-6j8wgp2s.js";import"./chunk-y4c3wwpa.js";import"./chunk-v8pq6qmv.js";import"./chunk-fj8v7pep.js";import"./chunk-6vsszvgg.js";import"./chunk-w0nscjd2.js";import"./chunk-33ave20b.js";import"./chunk-66hb7kxm.js";import"./chunk-954vmnrn.js";import H from"chalk";var R={command:"serve",describe:"Start a headless Blade server (no browser)",builder:y,handler:async(E)=>{let f=A(E);if(await q(),!process.env.BLADE_SERVER_PASSWORD)console.log(H.yellow("Warning: BLADE_SERVER_PASSWORD is not set; server is unsecured."));let b=await D.listenAsync(f);if(console.log(`Blade server listening on http://${b.hostname}:${b.port}`),f.hostname==="0.0.0.0"){let F=C();for(let G of F)console.log(` Network: http://${G}:${b.port}`)}await new Promise(()=>{}),await b.stop()}};export{R as serveCommand};
@@ -1,2 +1,2 @@
1
- import{_e as y}from"./chunk-c2rhwxyn.js";import*as j from"fs/promises";import*as $ from"path";import b from"semver";import{fileURLToPath as N}from"url";import{ProxyAgent as G,fetch as H}from"undici";function T(){return process.env.HTTPS_PROXY||process.env.HTTP_PROXY||process.env.https_proxy||process.env.http_proxy}function R(){let q=T();if(q)try{return new G(q)}catch(z){console.warn(`[proxyFetch] Invalid proxy URL: ${q}`)}return}async function K(q,z={}){let{timeout:W=30000,signal:Q,...B}=z;if(Q?.aborted)throw new DOMException("The operation was aborted.","AbortError");let J=R(),X=new AbortController,Y=!1,F=setTimeout(()=>{Y=!0,X.abort()},W),w=()=>X.abort();Q?.addEventListener("abort",w);try{let Z={method:B.method,headers:B.headers,body:B.body,signal:X.signal,dispatcher:J};return await H(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",w)}}var D="blade-code",f="https://cdn.jsdelivr.net/npm/blade-code@latest/CHANGELOG.md",M=$.join(process.env.HOME||process.env.USERPROFILE||".",".blade"),S=$.join(M,"version-cache.json"),k=3600000,L=`https://registry.npmjs.org/${D}/latest`;async function x(){try{if(process.env.BLADE_VERSION)return process.env.BLADE_VERSION;let q=N(import.meta.url),z=$.dirname(q),W=[$.join(z,"..","..","package.json"),$.join(z,"..","package.json")];for(let Q of W)try{let B=await j.readFile(Q,"utf-8"),J=JSON.parse(B);if(J.name===D&&J.version)return J.version}catch{}return"unknown"}catch{return"unknown"}}async function I(){try{let q=await j.readFile(S,"utf-8"),z=JSON.parse(q);if(Date.now()-z.checkedAt<k)return z;return{...z,checkedAt:0}}catch{return null}}async function O(q){try{await j.mkdir(M,{recursive:!0,mode:493}),await j.writeFile(S,JSON.stringify(q,null,2))}catch{}}async function P(){try{let q=await K(L,{timeout:5000,headers:{Accept:"application/json"}});if(!q.ok)return null;return(await q.json()).version||null}catch{return null}}async function v(q=!1){let z=await x(),W=f;if(z==="unknown")return{currentVersion:z,latestVersion:null,hasUpdate:!1,shouldPrompt:!1,releaseNotesUrl:W,error:"Unable to determine current version"};let Q=await I(),B=Q?.skipUntilVersion,J=null;if(!q&&Q&&Q.checkedAt>0)J=Q.latestVersion;else if(J=await P(),J)await O({latestVersion:J,checkedAt:Date.now(),skipUntilVersion:B});if(!J)return{currentVersion:z,latestVersion:null,hasUpdate:!1,shouldPrompt:!1,releaseNotesUrl:W,error:"Unable to check for updates"};let X=b.gt(J,z),Y=X;if(X&&B)Y=b.gt(J,B);return{currentVersion:z,latestVersion:J,hasUpdate:X,shouldPrompt:Y,releaseNotesUrl:W}}async function u(q){let z=await I();await O({latestVersion:z?.latestVersion||q,checkedAt:z?.checkedAt||Date.now(),skipUntilVersion:q})}function g(){return`npm install -g ${D}@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 d(){try{let q=await v();return q.shouldPrompt?q:null}catch{return null}}
1
+ import{of as y}from"./chunk-954vmnrn.js";import*as j from"fs/promises";import*as $ from"path";import b from"semver";import{fileURLToPath as N}from"url";import{ProxyAgent as G,fetch as H}from"undici";function T(){return process.env.HTTPS_PROXY||process.env.HTTP_PROXY||process.env.https_proxy||process.env.http_proxy}function R(){let q=T();if(q)try{return new G(q)}catch(z){console.warn(`[proxyFetch] Invalid proxy URL: ${q}`)}return}async function K(q,z={}){let{timeout:W=30000,signal:Q,...B}=z;if(Q?.aborted)throw new DOMException("The operation was aborted.","AbortError");let J=R(),X=new AbortController,Y=!1,F=setTimeout(()=>{Y=!0,X.abort()},W),w=()=>X.abort();Q?.addEventListener("abort",w);try{let Z={method:B.method,headers:B.headers,body:B.body,signal:X.signal,dispatcher:J};return await H(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",w)}}var D="blade-code",f="https://cdn.jsdelivr.net/npm/blade-code@latest/CHANGELOG.md",M=$.join(process.env.HOME||process.env.USERPROFILE||".",".blade"),S=$.join(M,"version-cache.json"),k=3600000,L=`https://registry.npmjs.org/${D}/latest`;async function x(){try{if(process.env.BLADE_VERSION)return process.env.BLADE_VERSION;let q=N(import.meta.url),z=$.dirname(q),W=[$.join(z,"..","..","package.json"),$.join(z,"..","package.json")];for(let Q of W)try{let B=await j.readFile(Q,"utf-8"),J=JSON.parse(B);if(J.name===D&&J.version)return J.version}catch{}return"unknown"}catch{return"unknown"}}async function I(){try{let q=await j.readFile(S,"utf-8"),z=JSON.parse(q);if(Date.now()-z.checkedAt<k)return z;return{...z,checkedAt:0}}catch{return null}}async function O(q){try{await j.mkdir(M,{recursive:!0,mode:493}),await j.writeFile(S,JSON.stringify(q,null,2))}catch{}}async function P(){try{let q=await K(L,{timeout:5000,headers:{Accept:"application/json"}});if(!q.ok)return null;return(await q.json()).version||null}catch{return null}}async function v(q=!1){let z=await x(),W=f;if(z==="unknown")return{currentVersion:z,latestVersion:null,hasUpdate:!1,shouldPrompt:!1,releaseNotesUrl:W,error:"Unable to determine current version"};let Q=await I(),B=Q?.skipUntilVersion,J=null;if(!q&&Q&&Q.checkedAt>0)J=Q.latestVersion;else if(J=await P(),J)await O({latestVersion:J,checkedAt:Date.now(),skipUntilVersion:B});if(!J)return{currentVersion:z,latestVersion:null,hasUpdate:!1,shouldPrompt:!1,releaseNotesUrl:W,error:"Unable to check for updates"};let X=b.gt(J,z),Y=X;if(X&&B)Y=b.gt(J,B);return{currentVersion:z,latestVersion:J,hasUpdate:X,shouldPrompt:Y,releaseNotesUrl:W}}async function u(q){let z=await I();await O({latestVersion:z?.latestVersion||q,checkedAt:z?.checkedAt||Date.now(),skipUntilVersion:q})}function g(){return`npm install -g ${D}@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 d(){try{let q=await v();return q.shouldPrompt?q:null}catch{return null}}
2
2
  export{v as h,u as i,g as j,C as k,d as l};